QROrder.aspx 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741
  1. <%@ Page Language="C#" MasterPageFile="~/MasterPage/ErpView.master" AutoEventWireup="true" CodeFile="QROrder.aspx.cs" Inherits="EDelivery_QROrder" %>
  2. <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server">
  3. <script type="text/javascript" src="../js/jcPrinterSdk_api_third.js"></script>
  4. <script type="text/javascript" src="../js/jquery.qrcode.min.js"></script>
  5. <script>
  6. //查询按钮
  7. function searchFn() {
  8. var form = new mini.Form("#ctl00_f_all");
  9. var data = form.getData(true, false);
  10. var s = data;
  11. //var s = mini.encode(data);
  12. //alert(s);
  13. //form.setIsValid(false);
  14. //console.log("565656565", data);
  15. grid.load({
  16. ctid: s.tid, shopname: s.shop, buyer_nick: s.ww, orderState: s.state, order_area: s.order_area, address: s.address,
  17. placedate1: s.placedate1, placedate2: s.placedate2, seller_memo: s.memo, supplier: s.supplier, unusualcon: s.unusualcon
  18. });
  19. }
  20. //清除查询内容
  21. function clearFn() {
  22. //$("#ctl00_f_all").find("input").val("");
  23. var form = new mini.Form("#ctl00_f_all");
  24. form.clear();
  25. }
  26. function copyImage(ctid, text) {
  27. document.getElementById("qrcodeImage").innerHTML = '';
  28. const qrcodeImage = $('#qrcodeImage').qrcode({ width: 200, height: 200, text: utf16to8(ctid) });
  29. const canvas = qrcodeImage.find("canvas").get(0);
  30. //二维码宽高
  31. let qrcodewidth = 200;
  32. let qrcodeheight = 200;
  33. //canvas宽高
  34. let canvaswidth = qrcodewidth;
  35. let canvasheight = qrcodeheight;
  36. //logo宽高
  37. let logowidth = 100;
  38. let logoheight = 100;
  39. //文字描述位置
  40. let textleft = 0;
  41. let texttop = qrcodeheight + 20;
  42. //logo位置
  43. let logoleft = (qrcodewidth - logowidth) / 2;
  44. let logotop = (qrcodeheight - logoheight) / 2;
  45. let img = new Image();
  46. img.src = canvas.toDataURL("image/png");
  47. img.onload = function () {
  48. canvas.width = canvaswidth;
  49. canvas.height = canvasheight;
  50. let ctx = canvas.getContext("2d");
  51. let height_number = 2;
  52. let line = "";
  53. for (var n = 0; n < text.length; n++) {
  54. var testLine = line + text[n] + ' ';
  55. var metrics = ctx.measureText(testLine);
  56. var testWidth = metrics.width;
  57. if (testWidth > canvaswidth && n > 0) {
  58. line = text[n] + ' ';
  59. height_number += 1;
  60. } else {
  61. line = testLine;
  62. }
  63. }
  64. canvas.height = canvasheight + (height_number) * 22;
  65. ctx.fillStyle = "#ffffff";
  66. ctx.fillRect(0, 0, canvas.width, canvas.height);
  67. ctx.fillStyle = '#000000';
  68. ctx.font = 'bold ' + 12 + 'px Arial';
  69. //文字描述
  70. wrapText(ctx, text, textleft, texttop, canvaswidth, 20);
  71. //绘制二维码
  72. ctx.drawImage(img, 0, 0);
  73. downloadFile(canvas.toDataURL("image/png"), ctid + ".png")
  74. }
  75. }
  76. function wrapText(context, text, x, y, maxWidth, lineHeight) {
  77. var line = '';
  78. for (var n = 0; n < text.length; n++) {
  79. var testLine = line + text[n] + ' ';
  80. var metrics = context.measureText(testLine);
  81. var testWidth = metrics.width;
  82. if (testWidth > maxWidth && n > 0) {
  83. context.fillText(line, x, y);
  84. line = text[n] + ' ';
  85. y += lineHeight;
  86. }
  87. else {
  88. line = testLine;
  89. }
  90. }
  91. context.fillText(line, x, y);
  92. }
  93. function utf16to8(str) {
  94. var out, i, len, c;
  95. out = "";
  96. len = str.length;
  97. for (i = 0; i < len; i++) {
  98. c = str.charCodeAt(i);
  99. if ((c >= 0x0001) && (c <= 0x007F)) {
  100. out += str.charAt(i);
  101. } else if (c > 0x07FF) {
  102. out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
  103. out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F));
  104. out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
  105. } else {
  106. out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F));
  107. out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
  108. }
  109. }
  110. return out;
  111. }
  112. function downloadFile(content, fileName) {
  113. var base64ToBlob = function (code) {
  114. let parts = code.split(';base64,');
  115. let contentType = parts[0].split(':')[1];
  116. let raw = window.atob(parts[1]);
  117. let rawLength = raw.length;
  118. let uInt8Array = new Uint8Array(rawLength);
  119. for (let i = 0; i < rawLength; ++i) {
  120. uInt8Array[i] = raw.charCodeAt(i);
  121. }
  122. return new Blob([uInt8Array], { type: contentType });
  123. };
  124. let aLink = document.createElement('a');
  125. let blob = base64ToBlob(content);
  126. new Blob([content]);
  127. aLink.download = fileName;
  128. aLink.href = URL.createObjectURL(blob);
  129. aLink.click();
  130. aLink.remove()
  131. };
  132. function qrCodeFn() {
  133. let rows = grid.getSelecteds();
  134. for (let rec of rows) {
  135. copyImage(rec.ctid, rec.seller_memo)
  136. }
  137. }
  138. function actionRenderer(e) {
  139. let record = e.record;
  140. let html = "";
  141. html += getGridBtn("dis", "下载二维码", "copyImage('" + record.ctid + "','" + record.seller_memo + "')");
  142. return html;
  143. }
  144. /**
  145. ** 打印机服务
  146. **/
  147. let isPrinterConnected = false;
  148. let isDrawing = false;
  149. //SDK初始化参数
  150. const init_data = {
  151. initSdkParam: {
  152. "fontDir": "",
  153. }
  154. };
  155. const jsonObj = {
  156. "printerImageProcessingInfo": {
  157. "printQuantity": 1,
  158. }
  159. };
  160. //所有打印机
  161. let allUsbPrinters;
  162. window.onload = function () {
  163. const service_status = document.querySelector('.service_status');
  164. let isConnected = false;
  165. const usb_connect_status = document.querySelector('.usb_printer_connect_status');
  166. let isSupported = true;
  167. //连接打印服务
  168. getInstance(() => {
  169. isConnected = true;
  170. console.log('打印服务连接成功');
  171. }, () => {
  172. isSupported = false;
  173. console.log('当前浏览器不支持打印服务');
  174. }, () => {
  175. isConnected = false;
  176. console.log('打印服务连接断开');
  177. }, () => {
  178. isPrinterConnected = false;
  179. });
  180. setInterval(() => {
  181. if (isConnected) {
  182. service_status.textContent = '打印服务状态:已连接';
  183. } else if (!isSupported) {
  184. service_status.textContent = '打印服务状态:不支持';
  185. } else {
  186. service_status.textContent = '打印服务状态:未连接';
  187. }
  188. }, 500);
  189. setInterval(() => {
  190. if (!isPrinterConnected) {
  191. usb_connect_status.textContent = '打印机连接状态:未连接';
  192. }
  193. }, 500);
  194. }
  195. //更新打印机列表
  196. function getUsbPrinters() {
  197. console.log('开始获取打印机');
  198. getAllPrinters(function (error, data) {
  199. if (error) {
  200. return alert(error.message);
  201. }
  202. try {
  203. const { errorCode, info } = JSON.parse(JSON.stringify(data)).resultAck;
  204. if (errorCode === 0) {
  205. allUsbPrinters = JSON.parse(info);
  206. const allPrintersName = Object.keys(allUsbPrinters);
  207. const select = document.getElementById("usb_printers");
  208. let selectSize = select.options.length;
  209. console.log("selectSize", selectSize);
  210. console.log("select", select);
  211. if (allPrintersName.length > 0 && selectSize > 0) {
  212. while (select.firstChild) {
  213. select.removeChild(select.firstChild);
  214. }
  215. }
  216. allPrintersName.forEach((name) => {
  217. const option = document.createElement('option');
  218. option.value = name;
  219. option.text = name;
  220. select.appendChild(option);
  221. });
  222. selectOnLineUsbPrinter()
  223. } else {
  224. console.log('无打印机在线');
  225. const select = document.getElementById("usb_printers");
  226. select.innerHTML = "";
  227. const option = document.createElement('option')
  228. option.value = '请选择USB打印机';
  229. option.text = '请选择USB打印机';
  230. select.appendChild(option);
  231. return alert('无打印机在线');
  232. }
  233. } catch (err) {
  234. console.log(err);
  235. }
  236. });
  237. }
  238. //选择在线打印机
  239. function selectOnLineUsbPrinter() {
  240. isPrinterConnected = false;
  241. if (allUsbPrinters) {
  242. const usb_connect_status = document.querySelector('.usb_printer_connect_status');
  243. const select = document.getElementById("usb_printers");
  244. const allPrintersName = Object.keys(allUsbPrinters);
  245. const allPrintersValue = Object.values(allUsbPrinters);
  246. selectPrinter(allPrintersName[select.selectedIndex], parseInt(allPrintersValue[select.selectedIndex]), function (error, data) {
  247. if (error) {
  248. console.log('连接失败')
  249. usb_connect_status.textContent = '打印机连接状态:未连接';
  250. return alert(error.message);
  251. }
  252. const { errorCode } = JSON.parse(JSON.stringify(data)).resultAck;
  253. if (errorCode === 0) {
  254. console.log('连接成功')
  255. isPrinterConnected = true;
  256. usb_connect_status.textContent = '打印机连接状态:USB打印机已连接';
  257. init()
  258. } else {
  259. console.log('连接失败')
  260. usb_connect_status.textContent = '打印机连接状态:未连接';
  261. alert('连接失败');
  262. }
  263. })
  264. } else {
  265. console.log('未选择打印机')
  266. alert('未选择打印机');
  267. }
  268. }
  269. //初始化SDK
  270. function init() {
  271. let status = document.querySelector('.init_status')
  272. initSdk(init_data.initSdkParam, function (error, data) {
  273. if (error) {
  274. return alert(error.message);
  275. }
  276. const { errorCode, info } = JSON.parse(JSON.stringify(data)).resultAck;
  277. if (errorCode === 0) {
  278. console.log('初始化成功');
  279. status.textContent = "SDK初始化状态:已初始化"
  280. } else {
  281. console.log('初始化失败');
  282. status.textContent = "SDK初始化状态:未初始化"
  283. return alert(info);
  284. }
  285. });
  286. }
  287. function waybillFn() {
  288. let ids = []
  289. let rows = grid.getSelecteds();
  290. let html = ``;
  291. for (let rec of rows) {
  292. ids.push(rec.ctid)
  293. html += `<span class="${rec.ctid}" style="margin-right:10px">${rec.ctid}</span>`
  294. }
  295. mini.get("delivery_win").show()
  296. let parentElement = document.getElementById('print_value'); // 获取父元素
  297. let print_tids = document.getElementById('print_tids'); // 获取父元素
  298. parentElement.innerHTML = '';
  299. parentElement.innerHTML = html;
  300. print_tids.value = ids.join(",")
  301. }
  302. function printResult() {
  303. let offsetX = 0;
  304. let offsetY = 0;
  305. let width = 30;
  306. let height = 40;
  307. let rotate = 90;
  308. let marginX = 2.0;
  309. let marginY = 2.0;
  310. let contentWidth = height - marginX * 2;
  311. let qrCodeHeight = width - marginY * 2;
  312. let qrCodeWidth = width - marginY * 2;
  313. let fontSize = 3.2;
  314. let print_tids = document.getElementById('print_tids'); // 获取父元素
  315. let ids = print_tids.value;
  316. ids = ids.split(",");
  317. //组合打印数据
  318. let combinationPrintData = {
  319. InitDrawingBoardParam: {
  320. "width": width,
  321. "height": height,
  322. "rotate": rotate,
  323. "path": "ZT001.ttf",
  324. "verticalShift": 0,
  325. "HorizontalShift": 0
  326. },
  327. "elements": [
  328. {
  329. type: 'qrCode',
  330. json: {
  331. "x": marginX + offsetX,
  332. "y": marginY + offsetY,
  333. "height": qrCodeHeight,
  334. "width": qrCodeWidth,
  335. "value": '12345678',
  336. "codeType": 31,
  337. "rotate": 0
  338. }
  339. }, {
  340. type: 'text',
  341. json: {
  342. "x": marginY + offsetY,
  343. "y": marginX * 2 + qrCodeWidth + offsetX,
  344. "height": contentWidth - qrCodeWidth - marginX,
  345. "width": qrCodeHeight,
  346. "value": "姓名:武汉精臣\n年龄:11\n类型:血液检测",
  347. "fontFamily": "宋体",
  348. "rotate": 0,
  349. "fontSize": fontSize,
  350. "textAlignHorizonral": 0,
  351. "textAlignVertical": 1,
  352. "letterSpacing": 0.0,
  353. "lineSpacing": 1.0,
  354. "lineMode": 6,
  355. "fontStyle": [true, false, false, false],
  356. }
  357. },
  358. ]
  359. };
  360. let print_info = [];
  361. for (let i = 0; i < ids.length; i++) {
  362. let item = ids[i];
  363. combinationPrintData.elements[0].json.value = item;
  364. combinationPrintData.elements[1].json.value = item;
  365. print_info.push($.extend(true, {}, combinationPrintData));
  366. }
  367. batchPrintJob(print_info)
  368. }
  369. function startPrintJobTest(content) {
  370. let contentArr = [];
  371. contentArr.push(content);
  372. batchPrintJob(contentArr);
  373. }
  374. function batchPrintJob(list) {
  375. const self = this
  376. if (list == null || list.length === 0) {
  377. return;
  378. }
  379. //打印份数
  380. var printQuantity = jsonObj.printerImageProcessingInfo.printQuantity
  381. let density = 3;
  382. let labelType = 1;
  383. let printMode = 1;
  384. let selectDensity = 2
  385. //总打印份数,表示所有页面的打印份数之和。例如,如果你有3页需要打印,第一页打印3份,第二页打印2份,第三页打印5份,那么count的值应为10(3+2+5)。
  386. startJob(density, labelType, printMode, list.length * printQuantity, function (error, data) {
  387. if (error) {
  388. return alert(error.message);
  389. }
  390. const { errorCode, info } = JSON.parse(JSON.stringify(data)).resultAck;
  391. if (errorCode !== 0) {
  392. return alert(info);
  393. }
  394. // 提交打印任务
  395. self.printTag(list, 0, false);
  396. });
  397. }
  398. function printTag(list, x, isPreview) {
  399. //是否正在绘制状态修改,开始绘制
  400. isDrawing = true;
  401. //设置画布尺寸
  402. InitDrawingBoard(list[x].InitDrawingBoardParam, function (error, data) {
  403. if (error) {
  404. return alert(error.message);
  405. }
  406. const { errorCode, info } = JSON.parse(JSON.stringify(data)).resultAck;
  407. if (errorCode !== 0) {
  408. return alert(info);
  409. }
  410. // 元素控件绘制
  411. printItem(list, x, list[x].elements, 0, isPreview);
  412. });
  413. }
  414. function printItem(list, x, item, i, isPreview) {
  415. console.log(item, 'item');
  416. if (i < item.length) {
  417. switch (item[i].type) {
  418. case 'text':
  419. console.log(item[i].json);
  420. //绘制文本
  421. DrawLableText(item[i].json, function (error, data) {
  422. if (error) {
  423. return alert(error.message);
  424. }
  425. const { errorCode, info } = JSON.parse(JSON.stringify(data)).resultAck;
  426. if (errorCode !== 0) {
  427. return alert(info);
  428. }
  429. i++;
  430. printItem(list, x, item, i, isPreview);
  431. });
  432. break;
  433. case 'qrCode':
  434. //绘制二维码
  435. DrawLableQrCode(item[i].json, function (error, data) {
  436. if (error) {
  437. return alert(error.message);
  438. }
  439. const { errorCode, info } = JSON.parse(JSON.stringify(data)).resultAck;
  440. if (errorCode !== 0) {
  441. return alert(info);
  442. }
  443. i++;
  444. printItem(list, x, item, i, isPreview);
  445. });
  446. break;
  447. case 'barCode':
  448. //绘制一维码
  449. DrawLableBarCode(item[i].json, function (error, data) {
  450. if (error) {
  451. return alert(error.message);
  452. }
  453. const { errorCode, info } = JSON.parse(JSON.stringify(data)).resultAck;
  454. if (errorCode !== 0) {
  455. return alert(info);
  456. }
  457. i++;
  458. printItem(list, x, item, i, isPreview);
  459. });
  460. break;
  461. case 'line':
  462. //绘制线条
  463. DrawLableLine(item[i].json, function (error, data) {
  464. if (error) {
  465. return alert(error.message);
  466. }
  467. const { errorCode, info } = JSON.parse(JSON.stringify(data)).resultAck;
  468. if (errorCode !== 0) {
  469. return alert(info);
  470. }
  471. i++;
  472. printItem(list, x, item, i, isPreview);
  473. });
  474. break;
  475. case 'graph':
  476. //绘制边框
  477. DrawLableGraph(item[i].json, function (error, data) {
  478. if (error) {
  479. return alert(error.message);
  480. }
  481. const { errorCode, info } = JSON.parse(JSON.stringify(data)).resultAck;
  482. if (errorCode !== 0) {
  483. return alert(info);
  484. }
  485. i++;
  486. printItem(list, x, item, i, isPreview);
  487. });
  488. break;
  489. case 'image':
  490. //绘制边框
  491. DrawLableImage(item[i].json, function (error, data) {
  492. if (error) {
  493. return alert(error.message);
  494. }
  495. const { errorCode, info } = JSON.parse(JSON.stringify(data)).resultAck;
  496. if (errorCode !== 0) {
  497. return alert(info);
  498. }
  499. i++;
  500. printItem(list, x, item, i, isPreview);
  501. });
  502. break;
  503. }
  504. } else { //遍历完成,开始打印
  505. // let index = Object.assign(x);
  506. // var jsonObj = {
  507. // "printerImageProcessingInfo": {
  508. // "width": width,
  509. // "height": height,
  510. // "margin": [0,0,0,0],
  511. // "printQuantity":1,
  512. // "epc":"1234"
  513. // }
  514. // };
  515. console.log('是否预览' + isPreview);
  516. if (isPreview) {
  517. //B32和T8等300点机型倍率填12,其他机器填8,默认值8
  518. generateImagePreviewImage(8, function (error, data) {
  519. if (error) {
  520. return alert(error.message);
  521. }
  522. const { errorCode, info } = JSON.parse(JSON.stringify(data)).resultAck;
  523. if (errorCode !== 0) {
  524. return alert(info);
  525. }
  526. const imageData = "data:image/jpeg;base64," + JSON.parse(info).ImageData;
  527. const img = new Image();
  528. img.src = imageData;
  529. img.id = 'preview';
  530. document.body.appendChild(img);
  531. // var bg = document.querySelector('.preview_bg');
  532. // bg.style.background ='url("./img/supermarket_retail.png")';
  533. // bg.style.backgroundSize = 'cover';
  534. // console.log(bg);
  535. // const img = document.createElement('img');
  536. // img.src = "./img/supermarket_retail.png";
  537. // bg.appendChild(img);
  538. });
  539. return;
  540. }
  541. //是否正在绘制状态修改,绘制完成
  542. isDrawing = false;
  543. // var jsonObj ={"printerImageProcessingInfo": {"printQuantity": 1,}}; printQuantity属性用于指定当前页的打印份数。
  544. // 例如,如果你需要打印3页,第一页打印3份,第二页打印2份,第三页打印5份,那么在3次提交数据时,printerImageProcessingInfo中的printQuantity值分别应为3,2,5。
  545. commitJob(null, JSON.stringify(jsonObj), function (error, data) {
  546. if (error) {
  547. return alert(error.message);
  548. }
  549. const { errorCode, info, printQuantity, onPrintPageCompleted } = JSON.parse(JSON.stringify(data)).resultAck;
  550. const resultInfo = "commitJob ok";
  551. //异常导致打印终止
  552. if (errorCode !== 0) {
  553. return alert(info);
  554. }
  555. //回调与传参定义相反,考虑接入较多客户暂不修改为一致
  556. //var jsonObj = { "printerImageProcessingInfo": {"printQuantity":2,}}; 提交任务的打印份数
  557. //printQuantity 回调打印页数的进度(一次commitJob提交为1页,内容可以不一样)
  558. //onPrintPageCompleted 回调打印份数的进度(一个commit的内容打印多张,内容一样)
  559. //回调页码为数据总长度且回调打印份数数据等于当前页需要打印的份数数据时,结束打印任务
  560. if (printQuantity === list.length && onPrintPageCompleted === jsonObj.printerImageProcessingInfo.printQuantity) {
  561. //结束打印任务
  562. endJob(function (error, data) {
  563. if (error) {
  564. alert(error.message);
  565. } else {
  566. const arrParse = JSON.parse(JSON.stringify(data));
  567. if (String(arrParse.resultAck.info).indexOf("endJob ok") > -1) {
  568. }
  569. }
  570. });
  571. return;
  572. }
  573. //当前页数据提交完成,但是未完所有页数据提交,且未进行绘制,继续发送下一页数据
  574. if (String(info).indexOf(resultInfo) > -1 && x < list.length - 1 && !isDrawing) {
  575. //数据提交成功,数据下标+1
  576. console.log("发送下一页打印数据: ")
  577. x++;
  578. printTag(list, x);
  579. }
  580. });
  581. }
  582. }
  583. </script>
  584. </asp:Content>
  585. <asp:Content ID="Content2" ContentPlaceHolderID="btn" runat="Server">
  586. <div class="print_init">
  587. <h3>打印机初始化<span style="font-weight: bold; color: red;">(必须执行完才能进行预览打印)</span>:</h3>
  588. <div class="content" style="display: flex">
  589. <div class="service">
  590. <p class="service_status status">打印服务状态:未连接</p>
  591. </div>
  592. <div class="select_usb" style="display: flex; align-items: cent">
  593. <div class="select_printer status">
  594. <label>
  595. 请选择USB连接的打印机:<select id="usb_printers" name="printers">
  596. <option>请选择USB连接的打印机</option>
  597. </select></label>
  598. </div>
  599. <button class="getPrinters" onclick="getUsbPrinters()" type="button">更新USB打印机列表</button>
  600. </div>
  601. <div class="connect_usb" style="display: flex; align-items: cent">
  602. <p class="usb_printer_connect_status status">打印机连接状态:未连接</p>
  603. <button class="connect_printer" onclick="selectOnLineUsbPrinter()" type="button">连接USB打印机</button>
  604. </div>
  605. <div class="init">
  606. <div class="init_content" style="display: flex; align-items: center">
  607. <p class="init_status status">SDK初始化状态:未初始化</p>
  608. <button class="init_sdk status" onclick="init()" type="button">初始化SDK</button>
  609. </div>
  610. </div>
  611. </div>
  612. </div>
  613. <table style="width: 100%;">
  614. <tr>
  615. <td style="width: 80%;">
  616. <a class="mini-button mini-button-primary" style="padding: 2px 5px 2px 5px;" iconcls="icon-print" onclick="waybillFn()">打印</a>
  617. <a class="mini-button mini-button-primary" style="padding: 2px 5px 2px 5px;" iconcls="icon-print" onclick="qrCodeFn()">二维码</a>
  618. <div id="qrcodeImage" style="display: none"></div>
  619. </td>
  620. </tr>
  621. </table>
  622. </asp:Content>
  623. <asp:Content ID="Content4" ContentPlaceHolderID="content" runat="Server">
  624. <div class="mini-fit">
  625. <div id="m_grid" class="mini-datagrid" style="width: 98%; height: 100%;" contextmenu="#gridMenu" showemptytext="true" emptytext="暂无记录" url="../handler/sync.ashx?t=get_erp_waitdeliverylist">
  626. <div property="columns">
  627. <div type="indexcolumn" width="20"></div>
  628. <div type="checkcolumn" width="20"></div>
  629. <div name="orderid" width="110" align="center" headeralign="center" renderer="orderIdRenderer">订单编号</div>
  630. <div name="orderptime" width="80" align="center" headeralign="center" renderer="orderPTimeRenderer">付款时间</div>
  631. <div field="IsSF" width="50" align="center" headeralign="center" renderer="SFRenderer">是否顺丰</div>
  632. <div field="seller_memo" width="200" align="center" headeralign="center" renderer="memoRenderer">备注</div>
  633. <div field="OtherMemo" id="id_othermemo" runat="server" visible="false" width="80" align="center" headeralign="center">额外备注</div>
  634. <div field="FinishPlaceTime" width="60" dateformat="yyyy-MM-dd HH:mm" align="center" headeralign="center">下单时间</div>
  635. <div field="" width="60" align="center" headeralign="center" renderer="preDeliveryTime">预计发货</div>
  636. <div field="CheckMemo" width="50" align="center" headeralign="center">查单备注</div>
  637. <div name="address" width="80" align="center" headeralign="center" renderer="addressRenderer">收货地址</div>
  638. <div name="orderscus" width="60" align="center" headeralign="center" renderer="orderCusRenderer">供应商</div>
  639. <div field="AfterSaleMethod" width="80" align="center" headeralign="center">售后方案</div>
  640. <div field="UnusualCon" width="50" align="center" headeralign="center">异常解释</div>
  641. <div name="orderstatus" width="50" align="center" headeralign="center" renderer="orderStatusRenderer">状态</div>
  642. <div name="action" width="50" align="center" headeralign="center" renderer="actionRenderer">#</div>
  643. </div>
  644. </div>
  645. </div>
  646. <div id="delivery_win" class="mini-window" title="打印二维码" style="width: 550px; height: 350px; position: relative; display: none">
  647. <input id="print_tids" type="hidden" />
  648. <div id="print_value"></div>
  649. <div class="win_btn" style="text-align: center; margin-top: 20px">
  650. <a class="mini-button" iconcls="icon-ok" onclick="printResult">打印</a>
  651. </div>
  652. </div>
  653. </asp:Content>