deliver.js 59 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952
  1. define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'editable'], function ($, undefined, Backend, Table, Form,undefined) {
  2. var Controller = {
  3. index: function () {
  4. // $('#lager').on('click', function () {
  5. // const iframe = document.querySelector('#iframe1 iframe');
  6. // if (iframe) {
  7. // iframe.src = iframe.src; // 强制 reload iframe
  8. // }
  9. // });
  10. $('#apply').on('click', function () {
  11. const iframe = document.querySelector('#iframe2 iframe');
  12. if (iframe) {
  13. iframe.src = iframe.src; // 强制 reload iframe
  14. }
  15. });
  16. $('#dispatch').on('click', function () {
  17. const iframe = document.querySelector('#iframe3 iframe');
  18. if (iframe) {
  19. iframe.src = iframe.src; // 强制 reload iframe
  20. }
  21. });
  22. // $('#lager').click(function () {
  23. // $('#iframe1').contentWindow.location.reload('lager.html');
  24. // });
  25. Controller.api.bindevent();
  26. },
  27. // lager: function () {
  28. // // 初始化表格参数配置
  29. // Table.api.init({
  30. // extend: {
  31. // index_url: 'deliver/lager', // 替换为你的后端接口地址
  32. // }
  33. // });
  34. //
  35. // var table = $("#table");
  36. //
  37. // // 初始化表格
  38. // table.bootstrapTable({
  39. // url: $.fn.bootstrapTable.defaults.extend.index_url,
  40. // toolbar: '#toolbar', // 工具栏选择器(如果有)
  41. // pk: 'id', // 主键字段
  42. // sortName: 'id', // 默认排序字段
  43. //
  44. // pagination: true, // 启用分页
  45. // sidePagination: 'server', // 服务器端分页
  46. // pageSize: 10, // 每页数量
  47. // pageList: [10, 25, 50, 100], // 可选页数
  48. // search: false, // 是否启用搜索
  49. // commonSearch: true, // 是否启用 FastAdmin 搜索栏
  50. // queryParams: function (params) {
  51. // return {
  52. // offset: params.offset,
  53. // limit: params.limit,
  54. // filter: JSON.stringify(params.filter), // 搜索条件
  55. // op: JSON.stringify(params.op) // 搜索操作符
  56. // };
  57. // },
  58. //
  59. // columns: [
  60. // {field: 'bach', title: '工单号'},
  61. // {field: 'tray_num', title: '托盘号'},
  62. // {field: 'matter_name', title: '物料名称'},
  63. // {field: 'bach', title: '批次号'},
  64. // {field: 'total_boxes', title: '每托箱数'},
  65. // {field: 'tray_num', title: '每层箱数'},
  66. // {field: 'box_num', title: '每托层数'},
  67. // {field: 'pallet_height', title: '每托高度'},
  68. // {field: 'larger_num', title: '总箱数'},
  69. // {field: 'manufacture_date', title: '生产日期'},
  70. // {field: 'code', title: '大件编码'},
  71. // // 添加更多字段...
  72. // ]
  73. // });
  74. //
  75. // // 绑定事件
  76. // Table.api.bindevent(table);
  77. // },
  78. lager: function () {
  79. // 初始化表格参数配置
  80. Table.api.init();
  81. this.table.first();
  82. this.table.second();
  83. Controller.api.bindevent();
  84. },
  85. table:{
  86. first:function (){
  87. var table = $("#table");
  88. // 初始化表格
  89. table.bootstrapTable({
  90. url: 'deliver/lager', // 请求的 URL
  91. pk: 'id', // 主键字段
  92. height: 700, // 表格的高度
  93. sortName: 'id', // 默认排序字段
  94. sortOrder: 'desc', // 默认排序顺序
  95. pageSize: 50, // 每页显示 10 条数据
  96. pageList: [10, 25, 50, 100,'ALL'], // 分页条数选择器
  97. searchFormVisible: true, // 是否显示搜索框
  98. onClickRow:function(row, $element, field)
  99. {
  100. // 点击行事件
  101. $("#myTabContent1 .form-commonsearch input[name='large_id']").val(row.id);
  102. $("#myTabContent1 .btn-refresh").trigger("click");
  103. },
  104. search: false, // 禁用默认搜索框
  105. showToggle: false, // 隐藏切换按钮
  106. showColumns: false, // 隐藏列选择按钮
  107. showExport: false, // 隐藏导出按钮
  108. columns: [
  109. [
  110. {checkbox: true},
  111. {field: 'id', title: 'ID', visible:false,operate: false},
  112. {field: 'bach', title: __('批次号'),operate: "LIKE"},
  113. {field: 'order_ddbh', title: __('销售订单号'),operate: "LIKE"},
  114. {field: 'l_flow', title: __('托盘号'), operate: false},
  115. {field: 'cpbm', title: __('成品编码'), operate: false},
  116. {field: 'matter_name', title: __('成品名称'), operate: 'LIKE',searchList: $.getJSON("deliver/matterName")},
  117. {field: 'total_boxes', title: "每托箱数", operate: false},
  118. {field: 'tray_num', title: "每层箱数", operate: false},
  119. {field: 'box_num', title: "每托层数", operate: false},
  120. {field: 'pallet_height', title: "每托高度", operate: false},
  121. {
  122. field: 'pallet_size',
  123. title: '托盘规格',
  124. operate: false,
  125. width: 120,
  126. formatter: function (value, row, index) {
  127. return row.pallet_length + ' * ' + row.pallet_width;
  128. }
  129. },
  130. // {field: 'small_num', title: "托盘数", operate: false},
  131. {field: 'larger_num', title: "总箱数", operate: false},
  132. {field: 'num', title: "本次打包数", operate: false},
  133. {field: 'small_num', title: "每箱数量", operate: false},
  134. {field: 'danwei', title: "单位", operate: false},
  135. {field: 'manufacture_date', title: '生产日期', operate: 'RANGE', addclass: 'datetimerange',datetimeFormat:'YYYY-MM-DD', formatter: Table.api.formatter.datetime},
  136. {field: 'code', title: __('大件编码'), operate: false},
  137. // {field: 'small_num', title: __('小件数'),operate: false},
  138. ]
  139. ]
  140. });
  141. // 监听复选框点击事件
  142. $('#table').on('check.bs.table uncheck.bs.table check-all.bs.table uncheck-all.bs.table', function(e, rows) {
  143. var selectedData = table.bootstrapTable('getSelections'); // 获取选中的数据
  144. // 计算选中的大件数量和小件数量
  145. // 大件数量(选中的行数)
  146. let largeItemCount = 0;
  147. let smallItemCount = 0;
  148. selectedData.forEach(row => {
  149. largeItemCount += Number(row.total_boxes) || 0;
  150. smallItemCount += Number(row.total_boxes * row.small_num) || 0;
  151. });
  152. $('p span').eq(1).text(largeItemCount);
  153. $('p span').eq(3).text(smallItemCount);
  154. // var largeItemCount = selectedData.length;
  155. // var largeItemCount = selectedData.reduce(function(total, row) {
  156. // return total + (row.total_boxes || 0);
  157. // }, 0);
  158. //
  159. // var smallItemCount = selectedData.reduce(function(total, row) {
  160. // return total + (row.small_num || 0);
  161. // }, 0);
  162. //
  163. // // 更新页面上的提示信息
  164. // $('p span').eq(1).text(largeItemCount); // 更新大件数量
  165. // $('p span').eq(3).text(smallItemCount); // 更新小件数量
  166. });
  167. //导出发货按钮
  168. $('.btn-print').on('click',function () {
  169. var ids = Table.api.selectedids(table);
  170. if (ids.length === 0){
  171. alert('至少选择一个大件');
  172. }
  173. var lager = ids.toString();
  174. // window.location.href = 'print?lager_id='+lager;
  175. Fast.api.ajax({
  176. url:'deliver/print',
  177. data:{lager_id:lager},
  178. },function (data,res) {
  179. if (res.code == 1){
  180. window.location.href = '/'+res.data;
  181. table.bootstrapTable('refresh');
  182. }
  183. return false;
  184. },function (data,res) {
  185. if (res.code == 0){
  186. layer.confirm(res.msg);
  187. }
  188. return false;
  189. })
  190. })
  191. // 为表格绑定事件
  192. Table.api.bindevent(table);
  193. //去掉时间区间记忆
  194. table.on('post-body.bs.table',function (e,settings,json,xhr) {
  195. $('.datetimerange').each(function () {
  196. $(this).attr('autocomplete','off');
  197. })
  198. });
  199. }, second:function(){
  200. //小件列表
  201. var smallTable = $('#small_table');
  202. smallTable.bootstrapTable({
  203. url:'deliver/smallList',
  204. height: 600,
  205. toolbar: '#toolbar1',
  206. search:false,
  207. // commonSearch:false,
  208. showToggle:false,
  209. showColumns:false,
  210. showExport:false,
  211. columns: [
  212. [
  213. {field: 'large_id',title: __('大件id'),operate: 'LIKE',visible:false},
  214. {field: 'code', title: __('小件标签代码'),operate: false},
  215. {field: 'l_flow', title: __('当前序号'),operate: false},
  216. {field: 'print_num', title: __('打印次数'),operate: false},
  217. {field: 'status', title: __('状态'),searchList: {"0":'正常',"1":'已删除'},operate: false,formatter: Table.api.formatter.status},
  218. ]
  219. ]
  220. });
  221. // 为表格绑定事件
  222. Table.api.bindevent(smallTable);
  223. }
  224. },
  225. apply: function () {
  226. // 初始化表格参数配置
  227. Table.api.init({
  228. extend: {
  229. index_url: 'deliver/apply' + location.search,
  230. goods_url: 'deliver/goods',
  231. del_url: 'deliver/apply_del',
  232. table: 'deliver',
  233. update_url: 'deliver/apply_update'
  234. }
  235. });
  236. var table = $("#table2");
  237. var detailTable = $("#table-detail");
  238. // 初始化主表格
  239. table.bootstrapTable({
  240. url: $.fn.bootstrapTable.defaults.extend.index_url,
  241. pk: 'id',
  242. // height: 300,
  243. sortName: 'id',
  244. searchFormVisible: true,
  245. search: false,
  246. showToggle: false,
  247. showColumns: false,
  248. showExport: false,
  249. fixedColumns: false,
  250. onClickRow: function(row, $element) {
  251. // 移除之前选中的行样式
  252. table.find('tr.selected').removeClass('selected');
  253. // 添加当前选中行样式
  254. $element.addClass('selected');
  255. // 加载明细数据
  256. detailTable.bootstrapTable('refresh', {
  257. url: 'deliver/bachids?bach_ids=' + encodeURIComponent(row.bach_ids)
  258. });
  259. },
  260. onEditableSave: function (field, row, oldValue, $el) {
  261. // Send AJAX request to save the changes
  262. $.ajax({
  263. url: $.fn.bootstrapTable.defaults.extend.update_url,
  264. type: 'POST',
  265. data: {
  266. id: row.id,
  267. field: field,
  268. value: row[field]
  269. },
  270. success: function (data) {
  271. if (data.code !== 1) {
  272. // If update fails, revert the change
  273. $el.bootstrapTable('updateCell', {
  274. index: row._index,
  275. field: field,
  276. value: oldValue
  277. });
  278. Toastr.error(data.msg || '更新失败');
  279. } else {
  280. Toastr.success('更新成功');
  281. }
  282. },
  283. error: function () {
  284. // On error, revert the change
  285. $el.bootstrapTable('updateCell', {
  286. index: row._index,
  287. field: field,
  288. value: oldValue
  289. });
  290. Toastr.error('网络错误,更新失败');
  291. }
  292. });
  293. },
  294. columns: [
  295. [
  296. // {checkbox: true},
  297. {field: 'id', title: __('Id'), visible: false, operate: false},
  298. {field: 'bach_ids', title: '单据编号', operate: false},
  299. {field: 'total_quantity', title: '总发货数量', operate: false},
  300. {field: 'total_boxes', title: '总箱数', operate: false},
  301. {field: 'total_pallets', title: '总托盘数', operate: false},
  302. {field: 'product_count', title: '产品数量', operate: false},
  303. {field: 'sys_rq', title: '日期', operate: false},
  304. {field: 'created_at', title: '操作时间', operate: false},
  305. {
  306. field: 'operate',
  307. title: '操作',
  308. align: 'center',
  309. formatter: function(value, row, index) {
  310. return '<a href="javascript:;" class="btn-goods btn btn-xs btn-success" data-id="' + row.id + '"><i class="glyphicon glyphicon-export"></i> 发货</a>';
  311. }
  312. }
  313. ]
  314. ]
  315. });
  316. // 发货按钮事件
  317. table.on('click', '.btn-goods', function(e) {
  318. e.stopPropagation();
  319. var id = $(this).data('id');
  320. Fast.api.open('deliver/goods?ids=' + id, '发货信息', {area: ["60%", "60%"]});
  321. });
  322. // 初始化明细表格
  323. detailTable.bootstrapTable({
  324. pk: 'id',
  325. sortName: 'id',
  326. search: false,
  327. pagination: true, // 开启分页
  328. pageSize: 50, // 设置每页显示数量,设为大于总数据量即可显示全部
  329. pageList: [10, 25, 50, 100],// 可选的每页显示数量
  330. height: 400,
  331. // sidePagination: 'server',
  332. // pageSize: 10,
  333. toolbar: '#toolbar-detail',
  334. onEditableSave: function (field, row, oldValue, $el) {
  335. $.ajax({
  336. url: $.fn.bootstrapTable.defaults.extend.update_url,
  337. type: 'POST',
  338. data: {
  339. id: row.id,
  340. field: field,
  341. value: row[field]
  342. },
  343. success: function (data) {
  344. if (data.code !== 1) {
  345. $el.bootstrapTable('updateCell', {
  346. index: row._index,
  347. field: field,
  348. value: oldValue
  349. });
  350. Toastr.error(data.msg || '更新失败');
  351. } else {
  352. Toastr.success('更新成功');
  353. }
  354. },
  355. error: function () {
  356. $el.bootstrapTable('updateCell', {
  357. index: row._index,
  358. field: field,
  359. value: oldValue
  360. });
  361. Toastr.error('网络错误,更新失败');
  362. }
  363. });
  364. },
  365. columns: [
  366. [
  367. // {checkbox: true},
  368. {field: 'id', title: __('Id'), visible: false, operate: false},
  369. {field: 'pallet', title: '序号', operate: false},
  370. {field: 'pallet_sequence', title: '托盘序号', operate: false,
  371. editable: {
  372. type: 'text',
  373. title: '托盘序号'
  374. },
  375. formatter: function(value, row, index) {
  376. return value ? value : '无';
  377. }
  378. },
  379. {field: 'order_ddbh', title: '销售订单号', operate: false},
  380. {field: 'matter_no', title: '工单编号', operate: false},
  381. {field: 'cpbm', title: '成品编码', operate: false},
  382. {field: 'matter_name', title: '产品名称', operate: 'LIKE', searchList: $.getJSON("deliver/matterName")},
  383. {field: 'num', title: '本次发货数量', operate: false},
  384. {field: 'small_num', title: '每一箱数量', operate: false,
  385. editable: {
  386. type: 'number',
  387. title: '每一箱数量',
  388. validate: function (v) {
  389. if (!v) return '不能为空';
  390. if (isNaN(v)) return '必须为数字';
  391. }
  392. }
  393. },
  394. {field: 'total_boxes', title: '每箱托数', operate: false},
  395. {field: 'tray_num', title: '每层箱数', operate: false,
  396. editable: {
  397. type: 'number',
  398. title: '每层箱数',
  399. validate: function (v) {
  400. if (!v) return '不能为空';
  401. if (isNaN(v)) return '必须为数字';
  402. }
  403. }
  404. },
  405. {field: 'box_num', title: '每托层数', operate: false,
  406. editable: {
  407. type: 'number',
  408. title: '每托层数',
  409. validate: function (v) {
  410. if (!v) return '不能为空';
  411. if (isNaN(v)) return '必须为数字';
  412. }
  413. }
  414. },
  415. {
  416. field: 'pallet_height',
  417. title: '每托高度',
  418. operate: false,
  419. editable: {
  420. type: 'text',
  421. title: '每托高度',
  422. validate: function (v) {
  423. if (!v) return '不能为空';
  424. if (isNaN(v)) return '必须为数字';
  425. }
  426. }
  427. },
  428. {
  429. field: 'pallet_length',
  430. title: '托盘长',
  431. operate: false,
  432. editable: {
  433. type: 'text',
  434. title: '托盘长度',
  435. validate: function (v) {
  436. if (!v) return '不能为空';
  437. if (isNaN(v)) return '必须为数字';
  438. }
  439. }
  440. },
  441. {
  442. field: 'pallet_width',
  443. title: '托盘宽',
  444. operate: false,
  445. editable: {
  446. type: 'text',
  447. title: '托盘宽度',
  448. validate: function (v) {
  449. if (!v) return '不能为空';
  450. if (isNaN(v)) return '必须为数字';
  451. }
  452. }
  453. },
  454. {field: 'large_num', title: '托盘数', operate: false},
  455. {field: 'larger_num', title: '总箱数', operate: false},
  456. {field: 'remark', title: '备注', operate: false,
  457. editable: {
  458. type: 'text',
  459. title: '备注'
  460. },
  461. formatter: function(value, row, index) {
  462. return value ? value : '无';
  463. }
  464. }
  465. ]
  466. ],
  467. });
  468. // 绑定事件
  469. Table.api.bindevent(table);
  470. Table.api.bindevent(detailTable);
  471. // 去掉时间区间输入记忆
  472. table.on('post-body.bs.table', function (e, settings, json, xhr) {
  473. $('.datetimerange').each(function () {
  474. $(this).attr('autocomplete', 'off');
  475. });
  476. });
  477. Controller.api.bindevent();
  478. },
  479. goods: function () {
  480. $('#apply_btn').click(function () {
  481. var ids = $('#goods_id').val();
  482. var order_number = $('#c-order_number').val();
  483. if (order_number == null || order_number === ''){
  484. layer.confirm('订单号不能为空');
  485. }
  486. var deliveryman = $('#c-deliveryman').val();
  487. if (deliveryman == null || deliveryman === ''){
  488. layer.confirm('司机名称不能为空');
  489. }
  490. var shr_phone = $('#c-shr_phone').val();
  491. if (shr_phone == null || shr_phone === ''){
  492. layer.confirm('手机号不能为空');
  493. }
  494. var plate_number = $('#c-plate_number').val();
  495. if (plate_number == null || plate_number === ''){
  496. layer.confirm('车牌号不能为空');
  497. }
  498. var note = $('#c-note').val();
  499. Fast.api.ajax({
  500. url:'deliver/apply_add',
  501. data:{
  502. ids:ids,
  503. order_number:order_number,
  504. deliveryman:deliveryman,
  505. shr_phone:shr_phone,
  506. plate_number:plate_number,
  507. note:note,
  508. }
  509. },function (data,res) {
  510. parent.Toastr.success("成功");
  511. Fast.api.close();
  512. window.parent.location.reload();
  513. return false;
  514. },function (data) {
  515. parent.Toastr.error('失败');
  516. Fast.api.close();
  517. window.parent.location.reload();
  518. return false;
  519. })
  520. });
  521. Controller.api.bindevent();
  522. },
  523. dispatch: function () {
  524. // 初始化表格参数配置
  525. Table.api.init({
  526. extend: {
  527. index_url: 'deliver/dispatch' + location.search,
  528. del_url:'deliver/dispatch_del',
  529. table:'deliver'
  530. }
  531. });
  532. var table = $("#table3");
  533. // 初始化表格
  534. table.bootstrapTable({
  535. url: $.fn.bootstrapTable.defaults.extend.index_url,
  536. pk: 'id',
  537. height:400,
  538. sortName: 'id',
  539. searchFormVisible:true,
  540. showToggle:false,
  541. showColumns:false,
  542. showExport:false,
  543. fixedColumns: true,
  544. fixedRightNumber: 1,
  545. columns: [
  546. [
  547. {checkbox: true},
  548. {field: 'id', title: __('Id'), operate: 'LIKE',visible:false,operate: false},
  549. {field: 'shdh', title: '收货单号', operate: 'LIKE', operate: false},
  550. {field: 'order_number', title: '订单号', operate: 'LIKE'},
  551. {field: 'deliveryman', title: '司机', operate: 'LIKE', operate: false},
  552. {field: 'plate_number', title: '车牌号', operate: 'LIKE', operate: false},
  553. {field: 'supplier_name', title: '供应商名称', operate: 'LIKE'},
  554. {field: 'create_time', title: '发货时间', operate: 'RANGE', addclass: 'datetimerange', formatter: Table.api.formatter.datetime},
  555. {field: 'buttons',
  556. width: "120px",
  557. title: __('发货单打印'),
  558. operate: false,
  559. table: table,
  560. events: Table.api.events.operate,
  561. buttons: [
  562. {
  563. name: 'ajax',
  564. text: __('点击打印'),
  565. title: __('点击打印'),
  566. classname: 'btn btn-xs btn-success btn-magic btn-ajax',
  567. icon: 'fa fa-magic',
  568. url: 'deliver/printqrcode/id/{ids}',
  569. success: function (data, res) {
  570. if (res.code === 1) {
  571. const arr = res.data.data;
  572. console.log(res);
  573. let totalTray = 0;
  574. let totalBox = 0;
  575. // 产品名称聚合:{ 名称: { qty: 数量, unit: 单位 } }
  576. const productMap = {};
  577. // 单位分类统计
  578. let totalTao = 0;
  579. let totalZhang = 0;
  580. let totalGe = 0;
  581. // 累加托盘数、箱数
  582. for (let i = 0; i < arr.length; i++) {
  583. const item = arr[i];
  584. totalTray += parseInt(item.large_num || 0);
  585. totalBox += parseInt(item.larger_num || 0);
  586. const name = item.matter_name;
  587. const unit = item.danwei;
  588. const qty = parseInt(item.num || 0);
  589. if (!productMap[name]) {
  590. productMap[name] = { qty: 0, unit: unit };
  591. }
  592. productMap[name].qty += qty;
  593. // 单位分类汇总
  594. if (unit === '套') {
  595. totalTao += qty;
  596. } else if (unit === '张') {
  597. totalZhang += qty;
  598. } else if (unit === '个') {
  599. totalGe += qty;
  600. }
  601. }
  602. const productNames = Object.keys(productMap);
  603. const productQuantities = productNames.map(name => productMap[name].qty);
  604. const manualBoxes = productQuantities.reduce((a, b) => a + b, 0);
  605. const paperCards = 0; // 按你的业务逻辑这里可自定义
  606. let html = `
  607. <div style="width: 1100px; height: 100px; position: relative;">
  608. <div style="float: left">
  609. <div style="width: 1000px; font-size: 28px; font-weight: bold; text-align: center; line-height: 50px;">${res.data.supplier_name}</div>
  610. <div style="width: 1000px; font-size: 24px; text-align: center; line-height: 50px;">送货单</div>
  611. </div>
  612. <div id="qrcode" style="position: absolute; right: 100px; top: -5px; width: 105px; height: 105px;">
  613. <img src="${res.data.qrcode_add}" style="width: 105px; height: 105px;" id="qrcode_image"/>
  614. </div>
  615. </div>
  616. <table style="margin-bottom: 10px; width: 1186px; font-weight: 500; border-collapse: collapse;">
  617. <tr>
  618. <td colspan="6" style="border: none;">客户名称:河南中烟工业有限责任公司黄金叶生产制造中心</td>
  619. <td colspan="4" style="border: none;">送货单号:<span id="shdh">${res.data.shdh}</span></td>
  620. </tr>
  621. <tr>
  622. <td colspan="6" style="border: none;">送货地址:河南省郑州市经开区第三大街9号</td>
  623. <td colspan="4" style="border: none;">送货日期:<span id="shrq_date">${res.data.shrq_date}</span></td>
  624. </tr>
  625. </table>
  626. <div style="width: 1070px; font-size: 20px; text-align: center; border: 1px solid black; border-bottom: none;">
  627. ${res.data.order_ddbh || ''}${res.data.note || ''}
  628. </div>
  629. <table style="width: 1070px; border-collapse: collapse; table-layout: fixed; font-size: 16px; text-align: center; margin-top: 0;">
  630. <tr style="font-weight: bold;">
  631. <th style="border: 1px solid black;text-align: center;">托盘序号</th>
  632. <th style="border: 1px solid black;text-align: center; width: 360px;">产品名称</th>
  633. <th style="border: 1px solid black;text-align: center;">每箱个数</th>
  634. <th style="border: 1px solid black;text-align: center;">每托箱数</th>
  635. <th style="border: 1px solid black;text-align: center;">每层箱数</th>
  636. <th style="border: 1px solid black;text-align: center;">每托层数</th>
  637. <th style="border: 1px solid black;text-align: center;">每托高度</th>
  638. <th style="border: 1px solid black;text-align: center;">托盘规格</th>
  639. <th style="border: 1px solid black;text-align: center;">托盘数</th>
  640. <th style="border: 1px solid black;text-align: center;">总箱数</th>
  641. </tr>`;
  642. for (let i = 0; i < arr.length; i++) {
  643. html += `
  644. <tr>
  645. <td style="border: 1px solid black;">第${arr[i].pallet}托</td>
  646. <td style="border: 1px solid black;">${arr[i].matter_name}</td>
  647. <td style="border: 1px solid black;">${arr[i].small_num}</td>
  648. <td style="border: 1px solid black;">${arr[i].total_boxes}</td>
  649. <td style="border: 1px solid black;">${arr[i].tray_num}</td>
  650. <td style="border: 1px solid black;">${arr[i].box_num}</td>
  651. <td style="border: 1px solid black;">${arr[i].pallet_height}</td>
  652. <td style="border: 1px solid black;">${arr[i].pallet_length} * ${arr[i].pallet_width}</td>
  653. <td style="border: 1px solid black;">${arr[i].large_num}</td>
  654. <td style="border: 1px solid black;">${arr[i].larger_num}</td>
  655. </tr>`;
  656. }
  657. const fillCount = 15 - arr.length;
  658. for (let i = 0; i < fillCount; i++) {
  659. html += `
  660. <tr>
  661. <td style="border: 1px solid black;">&nbsp;</td>
  662. <td style="border: 1px solid black;"></td>
  663. <td style="border: 1px solid black;"></td>
  664. <td style="border: 1px solid black;"></td>
  665. <td style="border: 1px solid black;"></td>
  666. <td style="border: 1px solid black;"></td>
  667. <td style="border: 1px solid black;"></td>
  668. <td style="border: 1px solid black;"></td>
  669. <td style="border: 1px solid black;"></td>
  670. <td style="border: 1px solid black;"></td>
  671. </tr>`;
  672. }
  673. html += `
  674. <tr style="font-weight: bold;">
  675. <td style="border: 1px solid black;">合计:</td>
  676. <td style="border: 1px solid black;"></td>
  677. <td style="border: 1px solid black;"></td>
  678. <td style="border: 1px solid black;"></td>
  679. <td style="border: 1px solid black;"></td>
  680. <td style="border: 1px solid black;"></td>
  681. <td style="border: 1px solid black;"></td>
  682. <td style="border: 1px solid black;"></td>
  683. <td style="border: 1px solid black;">${totalTray}</td>
  684. <td style="border: 1px solid black;">${totalBox}</td>
  685. </tr>
  686. </table>
  687. <table style="margin-top: 20px; width: 1070px; border-collapse: collapse; font-size: 18px;">
  688. <tr>
  689. <td colspan="${productNames.length + 2}" style="border: 1px solid black; text-align: left;">
  690. 总共出货:${totalBox} 箱 = ${totalTray} 托(手工盒子:${totalTao} 套,纸质卡片:${totalZhang} 张,${totalGe} 个)
  691. </td>
  692. </tr>
  693. <tr>
  694. <td style="border: 1px solid black; text-align: center;">产品名称</td>
  695. ${productNames.map(name => `<td style="border: 1px solid black; text-align: center;">${name}</td>`).join('')}
  696. <td style="border: 1px solid black; text-align: center;">合计</td>
  697. </tr>
  698. <tr>
  699. <td style="border: 1px solid black; text-align: center;">出货数量</td>
  700. ${productNames.map(name => `<td style="border: 1px solid black; text-align: center;">${productMap[name].qty}</td>`).join('')}
  701. <td style="border: 1px solid black; text-align: center;">${manualBoxes}</td>
  702. </tr>
  703. </table>
  704. <div style="margin-top: 20px; font-size: 14px; font-weight: bold; border: 1px solid black; padding: 10px; text-align: left; width: 1070px;">
  705. 共 ${totalTray} 托
  706. <br/>
  707. 备注:
  708. <br/>(1) 用唛头笔写上托盘序号,托盘唛头打印贴在每托盘上面,打托的时候混托注意摆放和高度,另外不要漏掉了。
  709. <br/>(2) 每托烟盒中间放瓦楞,最上面盖个木板,缠绕膜缠结实,护角护好,打打包带,井子形打包
  710. <br/>(3) 配托后,请提供具体托盘高度及托盘重量。
  711. </div>`;
  712. $("#printcode").html(html);
  713. var ee = $('#qrcode_image').attr('src', res.data.qrcode_add);
  714. ee.on('load', function () {
  715. var printHTML = document.querySelector('#printcode').innerHTML;
  716. window.document.body.innerHTML = printHTML;
  717. window.print();
  718. window.location.reload();
  719. });
  720. }
  721. return false;
  722. },
  723. error: function (data, ret) {
  724. return false;
  725. }
  726. },
  727. ],
  728. formatter: Table.api.formatter.buttons
  729. },
  730. {field: 'status', title: '状态', operate: 'LIKE',searchList: {"0":'已发货',"1":'已删除'}, formatter: Table.api.formatter.status},
  731. {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
  732. ]
  733. ],
  734. });
  735. // 为表格绑定事件
  736. Table.api.bindevent(table);
  737. //去掉时间区间输入记忆
  738. table.on('post-body.bs.table',function (e,settings,json,xhr) {
  739. $('.datetimerange').each(function () {
  740. $(this).attr('autocomplete','off');
  741. })
  742. });
  743. Controller.api.bindevent();
  744. },
  745. receive: function () {
  746. // 初始化表格参数配置
  747. Table.api.init({
  748. extend: {
  749. index_url: 'deliver/receive' + location.search,
  750. del_url:'deliver/receive_del',
  751. table:'deliver'
  752. }
  753. });
  754. var table = $("#table");
  755. // 初始化表格
  756. table.bootstrapTable({
  757. url: $.fn.bootstrapTable.defaults.extend.index_url,
  758. pk: 'id',
  759. height:500,
  760. sortName: 'id',
  761. searchFormVisible:true,
  762. showToggle:false,
  763. showColumns:false,
  764. showExport:false,
  765. fixedColumns: true,
  766. fixedRightNumber: 1,
  767. columns: [
  768. [
  769. {checkbox: true},
  770. {field: 'id', title: __('Id'),visible:false,operate: false},
  771. {field: 'shdh', title: '送货单号', operate: false},
  772. {field: 'order_number', title: '订单号', operate: 'LIKE'},
  773. {field: 'deliveryman', title: '司机', operate: false},
  774. {field: 'plate_number', title: '车牌号', operate: false},
  775. {field: 'supplier_name', title: '供应商名称', operate: 'LIKE'},
  776. {field: 'create_time', title: '发货时间', operate: 'RANGE', addclass: 'datetimerange', formatter: Table.api.formatter.datetime},
  777. {field: 'buttons', operate: false,
  778. width: "120px",
  779. title: __('发货单打印'),
  780. table: table,
  781. events: Table.api.events.operate,
  782. buttons: [
  783. {
  784. name: 'ajax',
  785. text: __('点击打印'),
  786. title: __('点击打印'),
  787. classname: 'btn btn-xs btn-success btn-magic btn-ajax',
  788. icon: 'fa fa-magic',
  789. url: 'deliver/printqrcode/id/{ids}',
  790. // confirm: '确认发送',
  791. success: function (data,res) {
  792. if (res.code === 1){
  793. var arr = res.data.data;
  794. var note='';
  795. var html = '<div style="width: 1100px;height: 100px;position: relative;">\n' +
  796. ' <div style="float: left">\n' +
  797. ' <div style="width: 1000px;font-weight: 400;font-size: 28px;text-align: center;line-height: 50px;" class="company">'+res.data.supplier_name+'</div>\n' +
  798. ' <div style="width: 1000px;font-weight: 400;font-size: 24px;text-align: center;line-height: 50px;">送货单</div>\n' +
  799. ' </div>\n' +
  800. ' <div id="qrcode" style="display:inline-block;width: 105px;height: 105px;position: absolute;right: 100px;top: -5px;">\n' +
  801. ' <img src="" style="width: 105px;height: 105px;" id="qrcode_image"/>\n' +
  802. ' </div>\n' +
  803. ' </div>\n' +
  804. ' <table class="tg1" style="margin-top: 3px;border-collapse:collapse;border-spacing:0;font-weight:500;width:1186px">\n' +
  805. ' <tr class="info">\n' +
  806. ' <td colspan="6" style="border:none">客户名称:河南中烟工业有限责任公司黄金叶生产制造中心</td>\n' +
  807. ' <td colspan="4" style="border:none">送货单号:<span style="font-size: 16px;" id="shdh">'+res.data.shdh+'</span></td>\n' +
  808. ' </tr>\n' +
  809. ' <tr class="info">\n' +
  810. ' <td colspan="6" style="border:none">送货地址:河南省郑州市经开区第三大街9号</td>\n' +
  811. ' <td colspan="4" style="border:none">送货日期:<span style="font-size: 16px;" id="shrq_date">'+res.data.shrq_date+'</span></td>\n' +
  812. ' </tr>\n' +
  813. ' </table>\n' +
  814. ' <br>\n' +
  815. ' <table class="tg1" style="table-layout:fixed;width: 1186px;border-collapse:collapse;border-spacing:0;font-weight:500; position: relative;" id="table">'+
  816. ' <tr><th class="tg-s6z2" style="font-family:Arial, sans-serif;font-size:20px;text-align:center;font-weight:500;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;">物料名称</th>' +
  817. ' <th class="tg-s6z2" style="font-family:Arial, sans-serif;font-size:20px;text-align:center;font-weight:500;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;">生产批号</th>' +
  818. ' <th class="tg-s6z2" style="font-family:Arial, sans-serif;font-size:20px;text-align:center;font-weight:500;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;">大件</th>' +
  819. ' <th class="tg-s6z2" style="font-family:Arial, sans-serif;font-size:20px;text-align:center;font-weight:500;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;">小件</th>' +
  820. ' <th class="tg-s6z2" style="font-family:Arial, sans-serif;font-size:20px;text-align:center;font-weight:500;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;">单位</th>' +
  821. ' <th class="tg-s6z2" style="font-family:Arial, sans-serif;font-size:20px;text-align:center;font-weight:500;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;">实发数量</th>' +
  822. ' <th class="tg-s6z2" style="font-family:Arial, sans-serif;font-size:20px;text-align:center;font-weight:500;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;">备注</th>' +
  823. ' <th id="explain" rowspan="'+(res.data.count+1)+'" width="7%" style="border: none"><span style="writing-mode: tb-rl;height: 300px;font-size:16px;text-align: center;">' +
  824. ' 蓝联(回):业务 黄联(回):运输 '+'<br>'+'白联:存根 红联:财务 绿联:客户</span></th></tr>';
  825. for (var i=0;i < arr.length;i++){
  826. html+= '<tr><td class="tg-031e" style="font-family:Arial, sans-serif;font-size:18px;text-align:center;border-style:solid;border-width:1px;overflow:hidden;word-break:break-all;border-color:black;">'+arr[i].matter_name+'</td>';
  827. html+= '<td class="tg-031e" style="font-family:Arial, sans-serif;font-size:18px;text-align:center;border-style:solid;border-width:1px;overflow:hidden;word-break:break-all;border-color:black;">'+(arr[i].bach_num?arr[i].bach_num:'')+'</td>';
  828. html+= '<td class="tg-031e" style="font-family:Arial, sans-serif;font-size:18px;text-align:center;border-style:solid;border-width:1px;overflow:hidden;word-break:break-all;border-color:black;">'+arr[i].large_num+'</td>';
  829. html+= '<td class="tg-031e" style="font-family:Arial, sans-serif;font-size:18px;text-align:center;border-style:solid;border-width:1px;overflow:hidden;word-break:break-all;border-color:black;">'+arr[i].small_num+'</td>';
  830. if(arr[i].mater_type==1){
  831. html+= '<td class="tg-031e" style="font-family:Arial, sans-serif;font-size:18px;text-align:center;border-style:solid;border-width:1px;overflow:hidden;word-break:break-all;border-color:black;">万张</td>';
  832. html+='<td class="tg-031e" style="font-family:Arial, sans-serif;font-size:18px;text-align:center;border-style:solid;border-width:1px;overflow:hidden;word-break:break-all;border-color:black;">'+arr[i].l_num+'</td>';
  833. html+='<td class="tg-031e" style="font-family:Arial, sans-serif;font-size:18px;text-align:center;border-style:solid;border-width:1px;overflow:hidden;word-break:break-all;border-color:black;">'+arr[i].small_num+'件*'+parseInt(arr[i].num)+'张'+'</td>';
  834. }else if (arr[i].mater_type==2){
  835. html+= '<td class="tg-031e" style="font-family:Arial, sans-serif;font-size:18px;text-align:center;border-style:solid;border-width:1px;overflow:hidden;word-break:break-all;border-color:black;">kg</td>';
  836. html+='<td class="tg-031e" style="font-family:Arial, sans-serif;font-size:18px;text-align:center;border-style:solid;border-width:1px;overflow:hidden;word-break:break-all;border-color:black;">'+arr[i].l_weight +'</td>';
  837. html+='<td class="tg-031e" style="font-family:Arial, sans-serif;font-size:18px;text-align:center;border-style:solid;border-width:1px;overflow:hidden;word-break:break-all;border-color:black;">'+arr[i].small_num+'件*'+parseFloat(arr[i].num)/1000+'kg'+'</td>';
  838. }else if (arr[i].mater_type==3){
  839. html+= '<td class="tg-031e" style="font-family:Arial, sans-serif;font-size:18px;text-align:center;border-style:solid;border-width:1px;overflow:hidden;word-break:break-all;border-color:black;">万支</td>';
  840. html+='<td class="tg-031e" style="font-family:Arial, sans-serif;font-size:18px;text-align:center;border-style:solid;border-width:1px;overflow:hidden;word-break:break-all;border-color:black;">'+parseFloat(arr[i].num)*parseFloat(arr[i].small_num)/10000+'</td>';
  841. html+='<td class="tg-031e" style="font-family:Arial, sans-serif;font-size:18px;text-align:center;border-style:solid;border-width:1px;overflow:hidden;word-break:break-all;border-color:black;">'+arr[i].small_num+'件*'+parseInt(arr[i].num)+'支'+'</td>';
  842. }
  843. }
  844. html+= '<tr><td class="tg-031e" style="font-family:Arial, sans-serif;font-size:18px;text-align:center;border-style:solid;border-width:1px;overflow:hidden;word-break:break-all;border-color:black;">送货单备注</td>' +
  845. ' <td colspan="6" class="tg-031e" style="font-family:Arial, sans-serif;font-size:18px;text-align:center;border-style:solid;border-width:1px;overflow:hidden;word-break:break-all;border-color:black;">'+res.data.note+'</td></tr>'+
  846. ' </table>\n' +
  847. ' <table class="tg2" style="margin-top: 3px;border-collapse:collapse;border-spacing:0;font-weight:500;width:1086px;font-size: 16px;">\n' +
  848. ' <tr class="footer">\n' +
  849. ' <td colspan="3">发货单位:<span class="company">'+res.data.supplier_name+'</span></td>\n' +
  850. ' <td colspan="3">司机/司机电话:<span id="deliveryman">'+res.data.deliveryman+'&nbsp;&nbsp;'+res.data.shr_phone+'</span></td>\n' +
  851. ' <td colspan="3">车牌号:<span id="carid">'+res.data.plate_number+'</span></td>\n' +
  852. ' </tr>\n' +
  853. ' <tr class="footer">\n' +
  854. ' <td colspan="7">发货单位地址:<span id="address">'+res.data.address+'</span></td>\n' +
  855. ' <td colspan="3">收货单位(签名、盖章)</td>\n' +
  856. ' </tr>\n' +
  857. ' </table>'
  858. $("#printcode").html(html)
  859. var ee = $('#qrcode_image').attr('src',res.data.qrcode_add);
  860. // 将打印的区域赋值,进行打印
  861. ee.on('load',function () {
  862. var printHTML = document.querySelector('#printcode').innerHTML;
  863. window.document.body.innerHTML = printHTML;
  864. window.print();
  865. window.location.reload(); // 打印完成后重新加载页面
  866. })
  867. }
  868. return false;
  869. },
  870. error: function (data, ret) {
  871. return false;
  872. }
  873. },
  874. ],
  875. formatter: Table.api.formatter.buttons
  876. },
  877. {field: 'status', title: '状态', operate: 'LIKE',searchList: {"0":'未收货',"2":'已收货'},defaultValue:'1', formatter: Table.api.formatter.status},
  878. {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
  879. ]
  880. ],
  881. });
  882. $('#receive').click(function (){
  883. var shdh = $('#shdh').val();
  884. if (shdh!=''){
  885. $.get('deliver/receive_add',{'shdh':shdh},function (res){
  886. if (res.code==1){
  887. //修改成功
  888. //1. 提示
  889. Toastr.success(res.msg)
  890. //2. 刷新页面
  891. table.bootstrapTable('refresh');
  892. }else{
  893. Toastr.error(res.msg)
  894. }
  895. })
  896. }
  897. })
  898. // 为表格绑定事件
  899. Table.api.bindevent(table);
  900. Controller.api.bindevent();
  901. },
  902. api: {
  903. bindevent: function () {
  904. Form.api.bindevent($("form[role=form]"));
  905. }
  906. }
  907. };
  908. return Controller;
  909. });