deliver.js 74 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362
  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. Table.api.init({
  227. extend: {
  228. index_url: 'deliver/apply',
  229. goods_url: 'deliver/goods',
  230. del_url: 'deliver/apply_del',
  231. update_url: 'deliver/apply_update',
  232. add_pallet_url: 'deliver/applydsit_add',
  233. table: 'deliver'
  234. }
  235. });
  236. var table = $("#table2");
  237. var detailTable = $("#table-detail");
  238. // 加载日期菜单后初始化表格
  239. Controller.loadDateMenu(function () {
  240. Controller.initTables(table, detailTable);
  241. });
  242. },
  243. // 初始化两个表格
  244. initTables: function (table, detailTable) {
  245. // 主表
  246. table.bootstrapTable({
  247. url: $.fn.bootstrapTable.defaults.extend.index_url,
  248. queryParams: function (params) {
  249. return Object.assign(params, Controller.currentQuery);
  250. },
  251. pk: 'id',
  252. sortName: 'id',
  253. toolbar: '#toolbar1',
  254. height: 350,
  255. pagination: true,
  256. pageSize: 15,
  257. pageList: [10, 15, 25, 50],
  258. searchFormVisible: true,
  259. search: false,
  260. showToggle: false,
  261. showColumns: false,
  262. showExport: false,
  263. fixedColumns: true,
  264. fixedRightNumber: 1,
  265. columns: [[
  266. {field: 'id', title: __('Id'), visible: false},
  267. {field: 'bach_ids', title: '单据编号'},
  268. {field: 'total_quantity', title: '总发货数量'},
  269. {field: 'total_boxes', title: '总箱数'},
  270. {field: 'total_pallets', title: '总托盘数'},
  271. {field: 'product_count', title: '产品数量'},
  272. {field: 'sys_rq', title: '日期'},
  273. {field: 'created_at', title: '操作时间'},
  274. {
  275. field: 'operate',
  276. title: '操作',
  277. align: 'center',
  278. formatter: function (value, row) {
  279. return '<a href="javascript:;" class="btn-goods btn btn-xs btn-success" data-id="' + row.id + '"><i class="glyphicon glyphicon-export"></i> 发货</a> ' +
  280. '<a href="javascript:;" class="btn-delete btn btn-xs btn-danger" data-id="' + row.id + '" data-bach-ids="' + row.bach_ids + '"><i class="glyphicon glyphicon-trash"></i> 删除</a>';
  281. },
  282. events: {
  283. 'click .btn-delete': function (e, value, row, index) {
  284. e.stopPropagation(); // 阻止事件冒泡
  285. layer.confirm('确定要删除这条记录吗?', {
  286. btn: ['确定', '取消']
  287. }, function () {
  288. // 调用删除接口
  289. $.ajax({
  290. url: 'deliver/bachdelids',
  291. type: 'post',
  292. data: {bach_ids: row.bach_ids},
  293. success: function (data) {
  294. if (data.code === 1) {
  295. layer.msg('删除成功', {icon: 1});
  296. // 添加延迟刷新,确保后端数据已更新
  297. setTimeout(function() {
  298. // 确保使用正确的表格实例引用
  299. if (window.table && typeof window.table.bootstrapTable === 'function') {
  300. window.table.bootstrapTable('refresh');
  301. } else if (window.parent && window.parent.table && typeof window.parent.table.bootstrapTable === 'function') {
  302. window.parent.table.bootstrapTable('refresh');
  303. }
  304. }, 500);
  305. } else {
  306. layer.msg(data.msg || '删除失败', {icon: 2});
  307. }
  308. },
  309. error: function () {
  310. layer.msg('网络错误,请稍后重试', {icon: 2});
  311. }
  312. });
  313. });
  314. }
  315. }
  316. }
  317. ]],
  318. // 行点击事件处理
  319. onClickRow: function (row, $element) {
  320. Controller.selectedBachId = row.bach_ids;
  321. detailTable.bootstrapTable('refresh', {
  322. url: 'deliver/bachids?bach_ids=' + encodeURIComponent(row.bach_ids)
  323. });
  324. },
  325. onEditableSave: Controller.saveEditable
  326. });
  327. // 明细表
  328. detailTable.bootstrapTable({
  329. sortName: 'id',
  330. toolbar: '#toolbar2',
  331. search: false,
  332. pagination: false,
  333. height: 350,
  334. columns: [[
  335. {field: 'id', title: __('Id'), visible: false},
  336. {field: 'order_ddbh', title: '销售订单号'},
  337. {field: 'matter_no', title: '工单编号'},
  338. {field: 'cpbm', title: '成品编码'},
  339. {
  340. field: 'pallet_range',
  341. title: '托盘序号',
  342. editable: {type: 'text', title: '托盘序号'},
  343. formatter: value => value || '无'
  344. },
  345. {
  346. field: 'matter_name',
  347. title: '产品名称',
  348. operate: 'LIKE',
  349. searchList: $.getJSON("deliver/matterName")
  350. },
  351. {field: 'actual_quantity', title: '汇总'},
  352. {field: 'small_num', title: '个数/箱'},
  353. {field: 'tray_count', title: '每托箱数'},
  354. {field: 'tray_num', title: '每层箱数'},
  355. {field: 'box_num', title: '每托层数'},
  356. {field: 'layer_height', title: '每托高度'},
  357. {field: 'pallet_length', title: '托盘长'},
  358. {field: 'pallet_width', title: '托盘宽'},
  359. {field: 'pallet_count', title: '托盘数'},
  360. {field: 'total_boxes', title: '总箱数'},
  361. {
  362. field: 'remark',
  363. title: '备注',
  364. editable: {type: 'text', title: '备注'},
  365. formatter: value => value || '无'
  366. }
  367. ]],
  368. onEditableSave: Controller.saveEditable
  369. });
  370. // 发货按钮点击事件
  371. table.on('click', '.btn-goods', function (e) {
  372. e.stopPropagation();
  373. var id = $(this).data('id');
  374. Fast.api.open('deliver/goods?ids=' + id, '发货信息', {area: ["65%", "70%"]});
  375. });
  376. Table.api.bindevent(table);
  377. Table.api.bindevent(detailTable);
  378. table.on('post-body.bs.table', function () {
  379. $('.datetimerange').attr('autocomplete', 'off');
  380. });
  381. Controller.api.bindevent();
  382. // 绑定新增按钮逻辑
  383. Controller.bindAddPalletBtn();
  384. },
  385. // 可编辑保存逻辑
  386. saveEditable: function (field, row, oldValue, $el) {
  387. $.ajax({
  388. url: $.fn.bootstrapTable.defaults.extend.update_url,
  389. type: 'POST',
  390. data: {
  391. id: row.id,
  392. field: field,
  393. value: row[field]
  394. },
  395. success: function (data) {
  396. if (data.code !== 1) {
  397. $el.bootstrapTable('updateCell', {
  398. index: row._index,
  399. field: field,
  400. value: oldValue
  401. });
  402. Toastr.error(data.msg || '更新失败');
  403. } else {
  404. Toastr.success('更新成功');
  405. }
  406. },
  407. error: function () {
  408. $el.bootstrapTable('updateCell', {
  409. index: row._index,
  410. field: field,
  411. value: oldValue
  412. });
  413. Toastr.error('网络错误,更新失败');
  414. }
  415. });
  416. },
  417. // 加载日期导航菜单
  418. loadDateMenu: function (callback) {
  419. $.get("deliver/applydsit_list", function (res) {
  420. const data = res.data || {};
  421. const $nav = $("#date-nav").empty();
  422. // 添加"全部日期"选项
  423. const allDateItem = $('<li>').addClass('nav-item day-item');
  424. const allDateLink = $('<a>').attr('href', 'javascript:;').addClass('nav-link active').attr('data-date', 'all');
  425. allDateItem.append(allDateLink);
  426. $nav.append(allDateItem);
  427. const years = Object.keys(data).sort((a, b) => b - a);
  428. years.forEach(year => {
  429. const yearId = `year-${year}`;
  430. const yearNode = $('<li>').addClass('nav-item has-children collapsed').attr('id', yearId);
  431. const yearLink = $('<a>').attr('href', 'javascript:;').addClass('nav-link').attr('data-year', year).text(`${year}年`);
  432. const yearChildren = $('<ul>').addClass('children');
  433. yearNode.append(yearLink);
  434. yearNode.append(yearChildren);
  435. // 获取唯一的月份数组并按月份降序排序
  436. const months = Object.keys(data[year]).map(month => {
  437. return {
  438. full: month,
  439. num: parseInt(month.split('-')[1])
  440. };
  441. }).sort((a, b) => b.num - a.num);
  442. // 去重处理
  443. const uniqueMonths = [];
  444. const monthNums = new Set();
  445. months.forEach(month => {
  446. if (!monthNums.has(month.num)) {
  447. monthNums.add(month.num);
  448. uniqueMonths.push(month);
  449. }
  450. });
  451. uniqueMonths.forEach(month => {
  452. const monthId = `month-${month.full}`;
  453. const monthNode = $('<li>').addClass('nav-item has-children collapsed').attr('id', monthId);
  454. const monthLink = $('<a>').attr('href', 'javascript:;').addClass('nav-link').attr('data-month', month.full).text(`${month.num}月`);
  455. const monthChildren = $('<ul>').addClass('children');
  456. monthNode.append(monthLink);
  457. monthNode.append(monthChildren);
  458. // 获取并排序日期
  459. const days = data[year][month.full].sort((a, b) => {
  460. // 按日期降序排序
  461. return parseInt(b) - parseInt(a);
  462. });
  463. days.forEach(day => {
  464. const dayNode = $('<li>').addClass('nav-item day-item');
  465. const dayLink = $('<a>').attr('href', 'javascript:;').addClass('nav-link').attr('data-date', `${year}-${day}`).text(`${day}日`);
  466. dayNode.append(dayLink);
  467. monthChildren.append(dayNode);
  468. });
  469. yearChildren.append(monthNode);
  470. });
  471. $nav.append(yearNode);
  472. });
  473. Controller.bindDateMenuClick();
  474. if (typeof callback === "function") {
  475. callback();
  476. }
  477. }).fail(function(xhr, status, error) {
  478. console.error("加载日期导航菜单失败:", error);
  479. layer.msg("加载日期导航菜单失败,请稍后重试", {icon: 5});
  480. });
  481. },
  482. // 菜单点击绑定逻辑(支持展开/收起、刷新主表)
  483. bindDateMenuClick: function () {
  484. // 菜单项点击
  485. $(document).off("click", "#date-nav .nav-link").on("click", "#date-nav .nav-link", function (e) {
  486. e.stopPropagation();
  487. const $link = $(this);
  488. const $item = $link.closest(".nav-item");
  489. const year = $link.data("year");
  490. const month = $link.data("month");
  491. const date = $link.data("date");
  492. // 如果是有子节点的项(年/月),则只展开/收起,不执行查询
  493. if ($item.hasClass("has-children")) {
  494. $item.toggleClass("expanded");
  495. return;
  496. }
  497. // 高亮当前激活项
  498. $("#date-nav .nav-link").removeClass("active");
  499. $link.addClass("active");
  500. // 构造筛选条件
  501. Controller.currentQuery = {};
  502. if (date !== undefined) {
  503. if (date !== "all") {
  504. Controller.currentQuery.date = date;
  505. }
  506. } else if (month) {
  507. Controller.currentQuery.month = month;
  508. } else if (year) {
  509. Controller.currentQuery.year = year;
  510. }
  511. // 刷新主表
  512. const table = $("#table2");
  513. if (table.length > 0) {
  514. table.bootstrapTable("refresh");
  515. } else {
  516. console.warn("表格元素 #table2 未找到");
  517. }
  518. });
  519. $("#sidebarToggle").off("click").on("click", function () {
  520. $("#date-sidebar").toggleClass("collapsed");
  521. $(this).find("i").toggleClass("fa-chevron-left fa-chevron-right");
  522. });
  523. },
  524. // ========== 新增按钮弹窗绑定 ==========
  525. bindAddPalletBtn: function () {
  526. $(document).on('click', '#addPalletBtn', function () {
  527. const bach_ids = Controller.selectedBachId;
  528. console.log("选中单据编号:", bach_ids);
  529. if (!bach_ids) {
  530. Layer.msg('请先点击主表选择一条记录(单据编号)', { icon: 2 });
  531. return;
  532. }
  533. Layer.open({
  534. type: 1,
  535. title: '批量新增托盘信息',
  536. area: ['90%', '70%'],
  537. btn: ['提交', '取消'],
  538. content: `
  539. <form id="bulk-add-form" style="padding:10px;">
  540. <input type="hidden" name="bach_ids" value="${bach_ids}">
  541. <table class="table table-bordered table-sm table-striped" style="width: 100%;">
  542. <thead>
  543. <tr>
  544. <th>托盘号</th>
  545. <th>产品名称</th>
  546. <th>备注</th>
  547. <th>数量</th>
  548. <th>单位</th>
  549. <th>操作</th>
  550. </tr>
  551. </thead>
  552. <tbody id="pallet-tbody">
  553. <tr>
  554. <td><input type="text" name="pallet_no[]" class="form-control" required></td>
  555. <td><input type="text" name="product_name[]" class="form-control" required></td>
  556. <td><input type="text" name="remark[]" class="form-control"></td>
  557. <td><input type="number" name="quantity[]" class="form-control" required></td>
  558. <td>
  559. <select name="unit[]" class="form-control">
  560. <option value="套" selected>套</option>
  561. <option value="张">张</option>
  562. <option value="个">个</option>
  563. <option value="托">托</option>
  564. <option value="卷">卷</option>
  565. </select>
  566. </td>
  567. <td>
  568. <a href="javascript:;" class="btn btn-danger btn-sm remove-row">
  569. <i class="fa fa-trash"></i>
  570. </a>
  571. </td>
  572. </tr>
  573. </tbody>
  574. </table>
  575. <button type="button" class="btn btn-success btn-sm" id="addRowBtn">
  576. <i class="fa fa-plus"></i> 添加一行
  577. </button>
  578. </form>
  579. `,
  580. success: function () {
  581. // 添加新行
  582. $('#addRowBtn').on('click', function () {
  583. const html = `
  584. <tr>
  585. <td><input type="text" name="pallet_no[]" class="form-control" required></td>
  586. <td><input type="text" name="product_name[]" class="form-control" required></td>
  587. <td><input type="text" name="remark[]" class="form-control"></td>
  588. <td><input type="number" name="quantity[]" class="form-control" required></td>
  589. <td>
  590. <select name="unit[]" class="form-control">
  591. <option value="套" selected>套</option>
  592. <option value="张">张</option>
  593. <option value="个">个</option>
  594. <option value="托">托</option>
  595. <option value="卷">卷</option>
  596. </select>
  597. </td>
  598. <td>
  599. <a href="javascript:;" class="btn btn-danger btn-sm remove-row">
  600. <i class="fa fa-trash"></i>
  601. </a>
  602. </td>
  603. </tr>`;
  604. $('#pallet-tbody').append(html);
  605. });
  606. // 删除单行
  607. $(document).off('click', '.remove-row').on('click', '.remove-row', function () {
  608. $(this).closest('tr').remove();
  609. });
  610. },
  611. yes: function (index) {
  612. const data = $('#bulk-add-form').serialize();
  613. $.post($.fn.bootstrapTable.defaults.extend.add_pallet_url, data, function (res) {
  614. if (res.code === 1) {
  615. Layer.msg('添加成功');
  616. $('#table-detail').bootstrapTable('refresh');
  617. Layer.close(index);
  618. } else {
  619. Layer.msg(res.msg || '提交失败');
  620. }
  621. }, 'json');
  622. }
  623. });
  624. });
  625. Controller.api.bindevent();
  626. },
  627. goods: function () {
  628. $('#apply_btn').click(function (e) {
  629. var ids = $('#goods_id').val();
  630. var order_number = $('#c-order_number').val();
  631. var deliveryman = $('#c-deliveryman').val();
  632. var shr_phone = $('#c-shr_phone').val();
  633. var plate_number = $('#c-plate_number').val();
  634. var note = $('#c-note').val();
  635. Fast.api.ajax({
  636. url:'deliver/apply_add',
  637. data:{
  638. ids:ids,
  639. order_number:order_number,
  640. deliveryman:deliveryman,
  641. shr_phone:shr_phone,
  642. plate_number:plate_number,
  643. note:note,
  644. }
  645. },function (data,res) {
  646. parent.Toastr.success("成功");
  647. Fast.api.close();
  648. window.parent.location.reload();
  649. return false;
  650. },function (data) {
  651. parent.Toastr.error('失败');
  652. Fast.api.close();
  653. window.parent.location.reload();
  654. return false;
  655. })
  656. });
  657. $('#Replication').click(function (e) {
  658. // 阻止默认行为,防止表单提交或页面刷新
  659. e.preventDefault();
  660. e.stopPropagation();
  661. Fast.api.ajax({
  662. url: 'deliver/ReplicationList',
  663. type: 'get',
  664. data: {}
  665. }, function (data, ret) {
  666. console.log('调用成功:', data);
  667. $('#c-order_number').val(data.order_number || '');
  668. $('#c-deliveryman').val(data.deliveryman || '');
  669. $('#c-shr_phone').val(data.shr_phone || '');
  670. $('#c-plate_number').val(data.plate_number || '');
  671. $('#c-note').val(data.note || '');
  672. parent.Toastr.success('发货信息已成功复制');
  673. return false;
  674. }, function (data) {
  675. console.log('调用失败:', data);
  676. parent.Toastr.error('复制发货信息失败');
  677. return false;
  678. });
  679. return false;
  680. });
  681. Controller.api.bindevent();
  682. },
  683. dispatch: function () {
  684. Table.api.init({
  685. extend: {
  686. index_url: 'deliver/dispatch' + location.search,
  687. del_url:'deliver/dispatch_del',
  688. table:'deliver'
  689. }
  690. });
  691. var table = $("#table3");
  692. // 加载日期导航数据
  693. this.loadDateNavigation();
  694. // 初始化表格
  695. table.bootstrapTable({
  696. url: $.fn.bootstrapTable.defaults.extend.index_url,
  697. pk: 'id',
  698. height:600,
  699. sortName: 'id',
  700. searchFormVisible:true,
  701. showToggle:false,
  702. showColumns:false,
  703. showExport:false,
  704. fixedColumns: true,
  705. fixedRightNumber: 1,
  706. columns: [
  707. [
  708. {checkbox: true},
  709. {field: 'id', title: __('Id'), operate: 'LIKE',visible:false,operate: false},
  710. {field: 'shdh', title: '收货单号', operate: 'LIKE', operate: false},
  711. {field: 'order_number', title: '订单号', operate: 'LIKE'},
  712. {field: 'deliveryman', title: '司机', operate: 'LIKE', operate: false},
  713. {field: 'plate_number', title: '车牌号', operate: 'LIKE', operate: false},
  714. {field: 'supplier_name', title: '供应商名称', operate: 'LIKE'},
  715. {field: 'create_time', title: '发货时间', operate: 'RANGE', addclass: 'datetimerange', formatter: Table.api.formatter.datetime},
  716. {field: 'buttons',
  717. width: "120px",
  718. title: __('发货单打印'),
  719. operate: false,
  720. table: table,
  721. events: Table.api.events.operate,
  722. buttons: [
  723. {
  724. name: 'ajax',
  725. text: __('点击打印'),
  726. title: __('点击打印'),
  727. classname: 'btn btn-xs btn-success btn-magic btn-ajax',
  728. icon: 'fa fa-magic',
  729. url: 'deliver/printqrcode/id/{ids}',
  730. success: function (data, res) {
  731. if (res.code === 1) {
  732. const arr = res.data.data;
  733. console.log(res);
  734. let totalTray = 0;
  735. let totalBox = 0;
  736. const productMap = {};
  737. let totalTao = 0;
  738. let totalZhang = 0;
  739. const unitQuantities = {}; // 使用对象存储不同单位的数量
  740. // 首先从summary.products中初始化productMap,包含备注信息
  741. if (res.data.summary && res.data.summary.products) {
  742. Object.keys(res.data.summary.products).forEach(productName => {
  743. const productInfo = res.data.summary.products[productName];
  744. if (!productMap[productName]) {
  745. productMap[productName] = {
  746. qty: 0,
  747. unit: productInfo.unit || '个',
  748. remark: productInfo.remark || ''
  749. };
  750. }
  751. });
  752. }
  753. for (let i = 0; i < arr.length; i++) {
  754. const item = arr[i];
  755. totalTray += parseInt(item.large_num || 0);
  756. totalBox += parseInt(item.larger_num || 0);
  757. const name = item.matter_name;
  758. const unit = item.danwei;
  759. const qty = parseInt(item.num || 0);
  760. if (!productMap[name]) {
  761. productMap[name] = { qty: 0, unit: unit, remark: '' };
  762. }
  763. productMap[name].qty += qty;
  764. if (unit === '套') {
  765. totalTao += qty;
  766. } else if (unit === '张') {
  767. totalZhang += qty;
  768. } else {
  769. // 存储其他单位的数量
  770. if (!unitQuantities[unit]) {
  771. unitQuantities[unit] = 0;
  772. }
  773. unitQuantities[unit] += qty;
  774. }
  775. }
  776. const productNames = Object.keys(productMap);
  777. const productQuantities = productNames.map(name => productMap[name].qty);
  778. const manualBoxes = productQuantities.reduce((a, b) => a + b, 0);
  779. // Group items by pallet and sort by pallet number
  780. const palletGroups = {};
  781. arr.forEach(item => {
  782. if (!palletGroups[item.pallet]) {
  783. palletGroups[item.pallet] = [];
  784. }
  785. palletGroups[item.pallet].push(item);
  786. });
  787. // Sort pallet numbers in ascending order
  788. const sortedPalletNumbers = Object.keys(palletGroups).sort((a, b) => {
  789. // Extract numeric parts from pallet numbers (handling cases like "1-28")
  790. const numA = parseInt(a.toString().split('-')[0]);
  791. const numB = parseInt(b.toString().split('-')[0]);
  792. return numA - numB;
  793. });
  794. let html = `
  795. <div style="width: 1100px; height: 100px; position: relative;">
  796. <div style="float: left">
  797. <div style="width: 1000px; font-size: 28px; font-weight: bold; text-align: center; line-height: 50px;">${res.data.supplier_name}</div>
  798. <div style="width: 1000px; font-size: 24px; text-align: center; line-height: 50px;">送货单</div>
  799. </div>
  800. <div id="qrcode" style="position: absolute; right: 100px; top: -5px; width: 105px; height: 105px;">
  801. <img src="${res.data.qrcode_add}" style="width: 105px; height: 105px;" id="qrcode_image"/>
  802. </div>
  803. </div>
  804. <table style="margin-bottom: 10px; width: 1070px; font-weight: 500; border-collapse: collapse;">
  805. <tr>
  806. <td colspan="6" style="border: none;">客户名称:亚美尼亚SPS</td>
  807. <td colspan="4" style="border: none;">送货单号:<span id="shdh">${res.data.shdh}</span></td>
  808. </tr>
  809. <tr>
  810. <td colspan="6" style="border: none;">送货地址:亚美尼亚</td>
  811. <td colspan="4" style="border: none;">送货日期:<span id="shrq_date">${res.data.shrq_date}</span></td>
  812. </tr>
  813. </table>
  814. <div style="width: 1070px; font-size: 20px; text-align: center; border: 1px solid black; border-bottom: none;">
  815. ${res.data.order_ddbh || ''}${res.data.note || ''}
  816. </div>
  817. <table style="width: 1070px; border-collapse: collapse; font-size: 16px; text-align: center; margin-top: 0;">
  818. <colgroup>
  819. <col style="width: 80px"> <!-- 托盘序号 -->
  820. <col style="width: 200px"> <!-- 产品名称 -->
  821. <col style="width: 70px"> <!-- 每箱个数 -->
  822. <col style="width: 70px"> <!-- 每托箱数 -->
  823. <col style="width: 70px"> <!-- 每层箱数 -->
  824. <col style="width: 70px"> <!-- 每托层数 -->
  825. <col style="width: 70px"> <!-- 每托高度 -->
  826. <col style="width: 120px"> <!-- 托盘规格 -->
  827. <col style="width: 70px"> <!-- 托盘数 -->
  828. <col style="width: 70px"> <!-- 总箱数 -->
  829. </colgroup>
  830. <tr style="font-weight: bold;">
  831. <th style="border: 1px solid black;">托盘序号</th>
  832. <th style="border: 1px solid black;">产品名称</th>
  833. <th style="border: 1px solid black;">每箱个数</th>
  834. <th style="border: 1px solid black;">每托箱数</th>
  835. <th style="border: 1px solid black;">每层箱数</th>
  836. <th style="border: 1px solid black;">每托层数</th>
  837. <th style="border: 1px solid black;">每托高度</th>
  838. <th style="border: 1px solid black;">托盘规格</th>
  839. <th style="border: 1px solid black;">托盘数</th>
  840. <th style="border: 1px solid black;">总箱数</th>
  841. </tr>`;
  842. // Process pallet groups in sorted order
  843. sortedPalletNumbers.forEach(palletKey => {
  844. const items = palletGroups[palletKey];
  845. const rowCount = items.length;
  846. items.forEach((item, index) => {
  847. html += `<tr>`;
  848. // Only add pallet number for first row in group
  849. if (index === 0) {
  850. html += `<td style="border: 1px solid black;" rowspan="${rowCount}">第${palletKey}托</td>`;
  851. }
  852. // Handle product name with potential line breaks
  853. const productName = item.matter_name.replace(/([^\u4e00-\u9fa5])([^\u4e00-\u9fa5])/g, '$1$2<wbr>');
  854. html += `
  855. <td style="border: 1px solid black; text-align: left; padding: 0 5px;">${productName}</td>
  856. <td style="border: 1px solid black;">${item.small_num}</td>
  857. <td style="border: 1px solid black;">${item.total_boxes}</td>
  858. <td style="border: 1px solid black;">${item.tray_num}</td>
  859. <td style="border: 1px solid black;">${item.box_num}</td>
  860. <td style="border: 1px solid black;">${item.pallet_height}</td>
  861. <td style="border: 1px solid black;">${item.pallet_length} * ${item.pallet_width}</td>
  862. <td style="border: 1px solid black;">${item.large_num}</td>
  863. <td style="border: 1px solid black;">${item.larger_num}</td>
  864. </tr>`;
  865. });
  866. });
  867. const fillCount = 15 - arr.length;
  868. for (let i = 0; i < fillCount; i++) {
  869. html += `
  870. <tr>
  871. <td style="border: 1px solid black;">&nbsp;</td>
  872. <td style="border: 1px solid black;"></td>
  873. <td style="border: 1px solid black;"></td>
  874. <td style="border: 1px solid black;"></td>
  875. <td style="border: 1px solid black;"></td>
  876. <td style="border: 1px solid black;"></td>
  877. <td style="border: 1px solid black;"></td>
  878. <td style="border: 1px solid black;"></td>
  879. <td style="border: 1px solid black;"></td>
  880. <td style="border: 1px solid black;"></td>
  881. </tr>`;
  882. }
  883. html += `
  884. <tr style="font-weight: bold;">
  885. <td style="border: 1px solid black;">合计:</td>
  886. <td colspan="7" style="border: 1px solid black;"></td>
  887. <td style="border: 1px solid black;">${totalTray}</td>
  888. <td style="border: 1px solid black;">${totalBox}</td>
  889. </tr>
  890. </table>
  891. <table style="margin-top: 20px; width: 1070px; border-collapse: collapse; font-size: 18px;">
  892. <tr>
  893. <td colspan="${productNames.length + 2}" style="border: 1px solid black; text-align: left;">
  894. 总共出货:${totalBox} 箱 = ${totalTray} 托(
  895. 手工盒子:${totalTao} 套
  896. 纸质卡片:${totalZhang} 张
  897. ${unitQuantities['个'] || 0} 个
  898. ${unitQuantities['托'] || 0} 托
  899. ${unitQuantities['卷'] || 0} 卷
  900. </td>
  901. </tr>
  902. <tr>
  903. <td style="border: 1px solid black; text-align: center; width: 120px;">产品名称</td>
  904. ${productNames.map(name => `<td style="border: 1px solid black; text-align: center; width: 120px;">${name}</td>`).join('')}
  905. <td style="border: 1px solid black; text-align: center; width: 120px;">合计</td>
  906. </tr>
  907. <tr>
  908. <td style="border: 1px solid black; text-align: center;">出货数量</td>
  909. ${productNames.map(name => `<td style="border: 1px solid black; text-align: center;">${productMap[name].qty}</td>`).join('')}
  910. <td style="border: 1px solid black; text-align: center;">${manualBoxes}</td>
  911. </tr>
  912. <tr>
  913. <td style="border: 1px solid black; text-align: center;">备注</td>
  914. ${productNames.map(name => {
  915. // 处理备注去重:按分号分割,去重后重新拼接
  916. let remark = productMap[name].remark || '';
  917. if (remark) {
  918. // 分割备注并去重
  919. const uniqueRemarks = [...new Set(remark.split(';').map(item => item.trim()).filter(Boolean))];
  920. remark = uniqueRemarks.join('; ');
  921. }
  922. return `<td style="border: 1px solid black; text-align: center;">${remark || ' '}</td>`;
  923. }).join('')}
  924. <td style="border: 1px solid black;"></td>
  925. </tr>
  926. </table>
  927. <div style="margin-top: 20px; font-size: 14px; font-weight: bold; border: 1px solid black; padding: 10px; text-align: left; width: 1070px;">
  928. 共 ${totalTray} 托
  929. <br/>
  930. 备注:
  931. <br/>(1) 用唛头笔写上托盘序号,托盘唛头打印贴在每托盘上面,打托的时候混托注意摆放和高度,另外不要漏掉了。
  932. <br/>(2) 每托烟盒中间放瓦楞,最上面盖个木板,缠绕膜缠结实,护角护好,打打包带,井子形打包
  933. <br/>(3) 配托后,请提供具体托盘高度及托盘重量。
  934. </div>`;
  935. $("#printcode").html(html);
  936. var ee = $('#qrcode_image').attr('src', res.data.qrcode_add);
  937. ee.on('load', function () {
  938. var printHTML = document.querySelector('#printcode').innerHTML;
  939. window.document.body.innerHTML = printHTML;
  940. window.print();
  941. window.location.reload();
  942. });
  943. }
  944. return false;
  945. },
  946. error: function (data, ret) {
  947. return false;
  948. }
  949. },
  950. ],
  951. formatter: Table.api.formatter.buttons
  952. },
  953. {field: 'status', title: '状态', operate: 'LIKE',searchList: {"0":'已发货',"1":'已删除'}, formatter: Table.api.formatter.status},
  954. {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
  955. ]
  956. ],
  957. });
  958. // 为表格绑定事件
  959. Table.api.bindevent(table);
  960. //去掉时间区间输入记忆
  961. table.on('post-body.bs.table',function (e,settings,json,xhr) {
  962. $('.datetimerange').each(function () {
  963. $(this).attr('autocomplete','off');
  964. })
  965. });
  966. Controller.api.bindevent();
  967. },
  968. // 加载日期导航数据
  969. loadDateNavigation: function(callback) {
  970. var self = this; // 保存当前上下文
  971. $.get("deliver/dispatch_list", function(res) {
  972. const data = res.data || {};
  973. const $nav = $("#date-nav").empty();
  974. const years = Object.keys(data).sort((a, b) => b - a);
  975. years.forEach(year => {
  976. const yearId = `year-${year}`;
  977. const yearNode = $('<li>').addClass('nav-item has-children collapsed').attr('id', yearId);
  978. const yearLink = $('<a>').attr('href', 'javascript:;').addClass('nav-link').attr('data-year', year).text(`${year}年`);
  979. const yearChildren = $('<ul>').addClass('children');
  980. yearNode.append(yearLink);
  981. yearNode.append(yearChildren);
  982. // 获取唯一的月份数组并按月份降序排序
  983. const months = Object.keys(data[year]).map(month => {
  984. return {
  985. full: month,
  986. num: parseInt(month.split('-')[1])
  987. };
  988. }).sort((a, b) => b.num - a.num);
  989. // 去重处理
  990. const uniqueMonths = [];
  991. const monthNums = new Set();
  992. months.forEach(month => {
  993. if (!monthNums.has(month.num)) {
  994. monthNums.add(month.num);
  995. uniqueMonths.push(month);
  996. }
  997. });
  998. uniqueMonths.forEach(month => {
  999. const monthId = `month-${month.full}`;
  1000. const monthNode = $('<li>').addClass('nav-item has-children collapsed').attr('id', monthId);
  1001. const monthLink = $('<a>').attr('href', 'javascript:;').addClass('nav-link').attr('data-month', month.full).text(`${month.num}月`);
  1002. const monthChildren = $('<ul>').addClass('children');
  1003. monthNode.append(monthLink);
  1004. monthNode.append(monthChildren);
  1005. // 获取并排序日期
  1006. const days = data[year][month.full].sort((a, b) => {
  1007. // 按日期降序排序
  1008. return parseInt(b) - parseInt(a);
  1009. });
  1010. days.forEach(day => {
  1011. const dayNode = $('<li>').addClass('nav-item day-item');
  1012. const dayLink = $('<a>').attr('href', 'javascript:;').addClass('nav-link').attr('data-date', `${year}-${day}`).text(`${day}日`);
  1013. dayNode.append(dayLink);
  1014. monthChildren.append(dayNode);
  1015. });
  1016. yearChildren.append(monthNode);
  1017. });
  1018. $nav.append(yearNode);
  1019. });
  1020. // 绑定日期菜单点击事件
  1021. self.bindDateNavigationEvents();
  1022. if (typeof callback === "function") {
  1023. callback();
  1024. }
  1025. }).fail(function(xhr, status, error) {
  1026. console.error("加载日期导航失败:", error);
  1027. layer.msg("加载日期导航失败,请稍后重试", {icon: 5});
  1028. });
  1029. },
  1030. // 绑定日期导航事件
  1031. bindDateNavigationEvents: function() {
  1032. var self = this; // 保存当前上下文
  1033. var $dateNav = $('#date-nav');
  1034. // 菜单项点击事件
  1035. $dateNav.off('click').on('click', '.nav-link', function(e) {
  1036. e.stopPropagation();
  1037. e.preventDefault();
  1038. const $link = $(this);
  1039. const $item = $link.closest('.nav-item');
  1040. // 如果是可展开项,则只展开/收起
  1041. if ($item.hasClass('has-children')) {
  1042. $item.toggleClass('expanded');
  1043. return false;
  1044. }
  1045. // 高亮当前选中项
  1046. $dateNav.find('.nav-link').removeClass('active');
  1047. $link.addClass('active');
  1048. // 获取日期值
  1049. const date = $link.data('date');
  1050. console.log("Selected date:", date); // 调试输出
  1051. if (date) {
  1052. self.loadTableByDate(date);
  1053. }
  1054. });
  1055. // 侧边栏切换按钮
  1056. $('#sidebarToggle').off('click').on('click', function() {
  1057. $('#date-sidebar').toggleClass('collapsed');
  1058. $(this).find('i').toggleClass('fa-chevron-left fa-chevron-right');
  1059. });
  1060. },
  1061. // 根据日期加载表格数据
  1062. loadTableByDate: function(date) {
  1063. console.log("Loading table for date:", date); // 调试输出
  1064. // 如果是"全部日期",则清除日期参数
  1065. var params = {};
  1066. if (date && date !== 'all') {
  1067. params.date = date;
  1068. }
  1069. // 刷新表格数据
  1070. var table = $('#table3');
  1071. var options = table.bootstrapTable('getOptions');
  1072. options.pageNumber = 1; // 重置到第一页
  1073. options.queryParams = function(p) {
  1074. return $.extend({}, p, params);
  1075. };
  1076. table.bootstrapTable('refresh', {url: 'deliver/dispatch?' + $.param(params)});
  1077. },
  1078. receive: function () {
  1079. // 初始化表格参数配置
  1080. Table.api.init({
  1081. extend: {
  1082. index_url: 'deliver/receive' + location.search,
  1083. del_url:'deliver/receive_del',
  1084. table:'deliver'
  1085. }
  1086. });
  1087. var table = $("#table");
  1088. // 初始化表格
  1089. table.bootstrapTable({
  1090. url: $.fn.bootstrapTable.defaults.extend.index_url,
  1091. pk: 'id',
  1092. height:500,
  1093. sortName: 'id',
  1094. searchFormVisible:true,
  1095. showToggle:false,
  1096. showColumns:false,
  1097. showExport:false,
  1098. fixedColumns: true,
  1099. fixedRightNumber: 1,
  1100. columns: [
  1101. [
  1102. {checkbox: true},
  1103. {field: 'id', title: __('Id'),visible:false,operate: false},
  1104. {field: 'shdh', title: '送货单号', operate: false},
  1105. {field: 'order_number', title: '订单号', operate: 'LIKE'},
  1106. {field: 'deliveryman', title: '司机', operate: false},
  1107. {field: 'plate_number', title: '车牌号', operate: false},
  1108. {field: 'supplier_name', title: '供应商名称', operate: 'LIKE'},
  1109. {field: 'create_time', title: '发货时间', operate: 'RANGE', addclass: 'datetimerange', formatter: Table.api.formatter.datetime},
  1110. {field: 'buttons', operate: false,
  1111. width: "120px",
  1112. title: __('发货单打印'),
  1113. table: table,
  1114. events: Table.api.events.operate,
  1115. buttons: [
  1116. {
  1117. name: 'ajax',
  1118. text: __('点击打印'),
  1119. title: __('点击打印'),
  1120. classname: 'btn btn-xs btn-success btn-magic btn-ajax',
  1121. icon: 'fa fa-magic',
  1122. url: 'deliver/printqrcode/id/{ids}',
  1123. // confirm: '确认发送',
  1124. success: function (data,res) {
  1125. if (res.code === 1){
  1126. var arr = res.data.data;
  1127. var note='';
  1128. var html = '<div style="width: 1100px;height: 100px;position: relative;">\n' +
  1129. ' <div style="float: left">\n' +
  1130. ' <div style="width: 1000px;font-weight: 400;font-size: 28px;text-align: center;line-height: 50px;" class="company">'+res.data.supplier_name+'</div>\n' +
  1131. ' <div style="width: 1000px;font-weight: 400;font-size: 24px;text-align: center;line-height: 50px;">送货单</div>\n' +
  1132. ' </div>\n' +
  1133. ' <div id="qrcode" style="display:inline-block;width: 105px;height: 105px;position: absolute;right: 100px;top: -5px;">\n' +
  1134. ' <img src="" style="width: 105px;height: 105px;" id="qrcode_image"/>\n' +
  1135. ' </div>\n' +
  1136. ' </div>\n' +
  1137. ' <table class="tg1" style="margin-top: 3px;border-collapse:collapse;border-spacing:0;font-weight:500;width:1186px">\n' +
  1138. ' <tr class="info">\n' +
  1139. ' <td colspan="6" style="border:none">客户名称:河南中烟工业有限责任公司黄金叶生产制造中心</td>\n' +
  1140. ' <td colspan="4" style="border:none">送货单号:<span style="font-size: 16px;" id="shdh">'+res.data.shdh+'</span></td>\n' +
  1141. ' </tr>\n' +
  1142. ' <tr class="info">\n' +
  1143. ' <td colspan="6" style="border:none">送货地址:河南省郑州市经开区第三大街9号</td>\n' +
  1144. ' <td colspan="4" style="border:none">送货日期:<span style="font-size: 16px;" id="shrq_date">'+res.data.shrq_date+'</span></td>\n' +
  1145. ' </tr>\n' +
  1146. ' </table>\n' +
  1147. ' <br>\n' +
  1148. ' <table class="tg1" style="table-layout:fixed;width: 1186px;border-collapse:collapse;border-spacing:0;font-weight:500; position: relative;" id="table">'+
  1149. ' <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>' +
  1150. ' <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>' +
  1151. ' <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>' +
  1152. ' <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>' +
  1153. ' <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>' +
  1154. ' <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>' +
  1155. ' <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>' +
  1156. ' <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;">' +
  1157. ' 蓝联(回):业务 黄联(回):运输 '+'<br>'+'白联:存根 红联:财务 绿联:客户</span></th></tr>';
  1158. for (var i=0;i < arr.length;i++){
  1159. 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>';
  1160. 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>';
  1161. 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>';
  1162. 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>';
  1163. if(arr[i].mater_type==1){
  1164. 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>';
  1165. 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>';
  1166. 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>';
  1167. }else if (arr[i].mater_type==2){
  1168. 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>';
  1169. 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>';
  1170. 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>';
  1171. }else if (arr[i].mater_type==3){
  1172. 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>';
  1173. 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>';
  1174. 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>';
  1175. }
  1176. }
  1177. 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>' +
  1178. ' <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>'+
  1179. ' </table>\n' +
  1180. ' <table class="tg2" style="margin-top: 3px;border-collapse:collapse;border-spacing:0;font-weight:500;width:1086px;font-size: 16px;">\n' +
  1181. ' <tr class="footer">\n' +
  1182. ' <td colspan="3">发货单位:<span class="company">'+res.data.supplier_name+'</span></td>\n' +
  1183. ' <td colspan="3">司机/司机电话:<span id="deliveryman">'+res.data.deliveryman+'&nbsp;&nbsp;'+res.data.shr_phone+'</span></td>\n' +
  1184. ' <td colspan="3">车牌号:<span id="carid">'+res.data.plate_number+'</span></td>\n' +
  1185. ' </tr>\n' +
  1186. ' <tr class="footer">\n' +
  1187. ' <td colspan="7">发货单位地址:<span id="address">'+res.data.address+'</span></td>\n' +
  1188. ' <td colspan="3">收货单位(签名、盖章)</td>\n' +
  1189. ' </tr>\n' +
  1190. ' </table>'
  1191. $("#printcode").html(html)
  1192. var ee = $('#qrcode_image').attr('src',res.data.qrcode_add);
  1193. // 将打印的区域赋值,进行打印
  1194. ee.on('load',function () {
  1195. var printHTML = document.querySelector('#printcode').innerHTML;
  1196. window.document.body.innerHTML = printHTML;
  1197. window.print();
  1198. window.location.reload(); // 打印完成后重新加载页面
  1199. })
  1200. }
  1201. return false;
  1202. },
  1203. error: function (data, ret) {
  1204. return false;
  1205. }
  1206. },
  1207. ],
  1208. formatter: Table.api.formatter.buttons
  1209. },
  1210. {field: 'status', title: '状态', operate: 'LIKE',searchList: {"0":'未收货',"2":'已收货'},defaultValue:'1', formatter: Table.api.formatter.status},
  1211. {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
  1212. ]
  1213. ],
  1214. });
  1215. $('#receive').click(function (){
  1216. var shdh = $('#shdh').val();
  1217. if (shdh!=''){
  1218. $.get('deliver/receive_add',{'shdh':shdh},function (res){
  1219. if (res.code==1){
  1220. //修改成功
  1221. //1. 提示
  1222. Toastr.success(res.msg)
  1223. //2. 刷新页面
  1224. table.bootstrapTable('refresh');
  1225. }else{
  1226. Toastr.error(res.msg)
  1227. }
  1228. })
  1229. }
  1230. })
  1231. // 为表格绑定事件
  1232. Table.api.bindevent(table);
  1233. Controller.api.bindevent();
  1234. },
  1235. api: {
  1236. bindevent: function () {
  1237. Form.api.bindevent($("form[role=form]"));
  1238. }
  1239. }
  1240. };
  1241. return Controller;
  1242. });