measure_work.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. 'use strict';
  2. /**
  3. *
  4. *
  5. * @author Mai
  6. * @date 2018/6/21
  7. * @version
  8. */
  9. // 向后端请求中间计量号
  10. function getNewMeasureCode() {
  11. postData('/measure/newCode', null, function (code) {
  12. if (code !== '') {
  13. $('#mj-code').val(code);
  14. }
  15. });
  16. }
  17. // 新增计量范围
  18. function addMeasurePos(pid) {
  19. postData('/measure/pos', {
  20. mid: $('#measures').val(),
  21. operate: 'add',
  22. pid: pid,
  23. }, function (data) {
  24. const tr = [];
  25. tr.push('<tr id="' + data.pid +'">');
  26. tr.push('<td>' + data.code + '</td>');
  27. tr.push('<td>' + data.name + '</td>');
  28. tr.push('<td><a href="javascript: void(0)" class="text-danger" onclick="removeMeasurePos(' + data.pid + ')">移除</a></td>');
  29. tr.push('</tr>');
  30. $('#measurePosList').append(tr.join(''));
  31. })
  32. }
  33. // 移除计量范围
  34. function removeMeasurePos(pid) {
  35. postData('/measure/pos', {
  36. mid: $('#measures').val(),
  37. operate: 'remove',
  38. pid: pid,
  39. }, function (data) {
  40. $('tr[id='+ pid +']', '#measurePosList').remove();
  41. })
  42. }
  43. $(document).ready(() => {
  44. autoFlashHeight();
  45. // 新增中间计量 modal显示
  46. $('#add-mj').on('show.bs.modal', function() {
  47. getNewMeasureCode();
  48. if ($('#measures')[0].options.length === 0) {
  49. $('#addCancel').hide();
  50. } else {
  51. $('#addCancel').show();
  52. }
  53. });
  54. // 新增中间计量--刷新编号
  55. $('#autoCode').click(getNewMeasureCode);
  56. // 添加中间计量 确定
  57. $('#addOk').click(function () {
  58. const data = {
  59. code: $('#mj-code').val(),
  60. date: $('#mj-date').val(),
  61. };
  62. postData('/measure/list/add', data, function (rst) {
  63. $('#mj-code').removeClass('is-invalid');
  64. $('#mj-add').modal('hide');
  65. }, function () {
  66. $('#mj-code').addClass('is-invalid');
  67. $('#mj-Hint').show();
  68. });
  69. });
  70. const billsTree = createNewPathTree('measure', {
  71. id: 'ledger_id',
  72. pid: 'ledger_pid',
  73. order: 'order',
  74. level: 'level',
  75. rootId: -1,
  76. keys: ['id', 'tender_id', 'ledger_id'],
  77. });
  78. let billsSpread;
  79. // 获取中间计量详细数据
  80. function getMeasureDetail(mid) {
  81. postData('/measure/detail', { mid: mid }, function(data) {
  82. // 计量范围
  83. const posHtml = [];
  84. for (const p of data.pos) {
  85. const tr = [];
  86. tr.push('<tr id="' + p.pid +'">');
  87. tr.push('<td>' + p.code + '</td>');
  88. tr.push('<td>' + p.name + '</td>');
  89. tr.push('<td><a href="javascript: void(0)" class="text-danger" onclick="removeMeasurePos(' + p.pid + ')">移除</a></td>');
  90. tr.push('</tr>');
  91. posHtml.push(tr.join(''));
  92. }
  93. $('#measurePosList').html(posHtml.join(''));
  94. // 计量清单
  95. billsTree.loadDatas(data.billsTree);
  96. treeCalc.calculateAll(billsTree, ['total_price', 'deal_totalprice', 'qc_totalprice']);
  97. if (!billsSpread) {
  98. billsSpread = SpreadJsObj.createNewSpread($('#billsSpread')[0]);
  99. const sheet = billsSpread.getActiveSheet();
  100. SpreadJsObj.initSheet(sheet, measureSpreadSetting);
  101. SpreadJsObj.loadSheetData(sheet, 'tree', billsTree);
  102. /**
  103. * 父项不可编辑
  104. * sender - {type: 'EditStarting'}
  105. * args - {sheet, sheetName, row, col, cancel}
  106. */
  107. sheet.bind(spreadNS.Events.EditStarting, function (sender, args) {
  108. const sheet = args.sheet;
  109. if (sheet.zh_tree) {
  110. const node = sheet.zh_tree.nodes[args.row];
  111. args.cancel = node ? !node.is_leaf : true;
  112. } else {
  113. args.cancel = true;
  114. }
  115. });
  116. /**
  117. * 最底层清单编辑后,提交
  118. * sender - {type: 'EditEnding'}
  119. * args - {sheet, sheetName, row, col, editor, editingText cancel}
  120. */
  121. sheet.bind(spreadNS.Events.EditEnding, function (sender, args) {
  122. const sheet = args.sheet;
  123. if (sheet.zh_tree || sheet.zh_setting) {
  124. const node = sheet.zh_tree.nodes[args.row];
  125. const col = sheet.zh_setting.cols[args.col];
  126. if (node && node.is_leaf) {
  127. const updateData = {
  128. mid: $('#measures').val(),
  129. bid: node.ledger_id,
  130. update: {},
  131. }
  132. updateData.update[col.field] = col.type === 'Number' ? parseFloat(args.editingText) : args.editingText;
  133. // begin test
  134. // node[col.field] = col.type === 'Number' ? parseFloat(args.editingText) : args.editingText;
  135. // node.deal_totalprice = node.unit_price * node.deal_quantity;
  136. // const nodes = treeCalc.calculateParent(sheet.zh_tree, node, ['deal_totalprice']);
  137. // SpreadJsObj.reLoadNodesData(sheet, nodes);
  138. // end test;
  139. postData('/measure/billsUpdate', updateData, function (data) {
  140. if (sheet.zh_tree.loadLeafData) {
  141. sheet.zh_tree.loadLeafData(data);
  142. const nodes = treeCalc.calculateParent(sheet.zh_tree, node, ['deal_totalprice', 'qc_totalprice']);
  143. SpreadJsObj.reLoadNodesData(sheet, nodes);
  144. }
  145. }, function () {
  146. args.cancel = true;
  147. });
  148. } else {
  149. args.cancel = true;
  150. }
  151. } else {
  152. args.cancel = true;
  153. }
  154. });
  155. } else {
  156. SpreadJsObj.reLoadSheetData(billsSpread.getActiveSheet());
  157. }
  158. });
  159. }
  160. // 新增计量清单
  161. function addMeasureBills (bid) {
  162. const data = {
  163. mid: $('#measures').val(),
  164. operate: 'add',
  165. bid: bid,
  166. };
  167. postData('/measure/bills', data, function (data) {
  168. billsTree.addData(data);
  169. SpreadJsObj.reLoadSheetData(billsSpread.getActiveSheet());
  170. });
  171. }
  172. // 移除计量清单
  173. function removeMeasureBills (bid) {
  174. const data = {
  175. mid: $('#measures').val(),
  176. operate: 'remove',
  177. bid: bid,
  178. };
  179. postData('/measure/bills', data, function (data) {
  180. billsTree.removeData(data);
  181. SpreadJsObj.reLoadSheetData(billsSpread.getActiveSheet());
  182. });
  183. }
  184. // 勾选计量清单
  185. function checkMeasureBills() {
  186. const bid = $(this).parent().parent().attr('id');
  187. if (!bid) { return; }
  188. if (this.checked) {
  189. addMeasureBills(bid);
  190. } else {
  191. removeMeasureBills(bid);
  192. }
  193. }
  194. if (!codeRule || codeRule.length === 0) {
  195. codeRule = [];
  196. const firstSet = new codeRuleSet($('div.modal-body', '#first'));
  197. // 确认规则上传服务器
  198. $('#setRule', '#first').bind('click', function () {
  199. const data = {
  200. rule: ruleType,
  201. data: JSON.stringify(codeRule),
  202. };
  203. postData('/tender/rule', data, function () {
  204. $('#first').modal('hide');
  205. $('#add-mj').modal('show');
  206. });
  207. });
  208. $('#first').modal('show');
  209. } else if ($('#measures')[0].options.length === 0) {
  210. $('#add-mj').modal('show');
  211. } else {
  212. // 添加计量清单
  213. $('#addMeasureBills').click(function () {
  214. if ($('#measurePosList').children().length === 0) {
  215. $('#add-pos').modal('show');
  216. } else {
  217. $('#add-qd').modal('show');
  218. }
  219. });
  220. // 搜索项目节部位
  221. $('#search-pos').click(function () {
  222. const keyword = $('input', '#add-pos').val();
  223. if (keyword !== '') {
  224. postData('/measure/search', {
  225. mid: $('#measures').val(),
  226. searchType: 'pos',
  227. keyword: keyword
  228. }, function (data) {
  229. const html = [];
  230. for (const d of data) {
  231. const tr = [];
  232. tr.push('<tr id="' + d.ledger_id +'">');
  233. tr.push('<td>' + d.code + '</td>');
  234. tr.push('<td>' + d.name + '</td>');
  235. tr.push('<td><a href="javascript: void(0)" onclick="addMeasurePos(' + d.ledger_id + ')">添加</a></td>');
  236. tr.push('</tr>');
  237. html.push(tr.join(''));
  238. }
  239. $('#searchedPosList').html(html.join(''));
  240. });
  241. }
  242. });
  243. // 选择计量清单
  244. $('#chooseBills').click(function () {
  245. $('#add-pos').modal('hide');
  246. $('#add-qd').modal('show');
  247. });
  248. // 搜索计量清单
  249. $('#search-bills').click(function () {
  250. const keyword = $('input', '#add-qd').val();
  251. if (keyword !== '') {
  252. postData('/measure/search', {
  253. mid: $('#measures').val(),
  254. searchType: 'bills',
  255. keyword: keyword
  256. }, function (data) {
  257. const html = [];
  258. for (const d of data) {
  259. const tr = [];
  260. const check = billsTree.getItems(d.ledger_id) ? 'checked' : '';
  261. tr.push('<tr id="' + d.ledger_id +'">');
  262. tr.push('<td>' + d.b_code + '</td>');
  263. tr.push('<td>' + d.name + '</td>');
  264. tr.push('<td>' + d.unit + '</td>');
  265. tr.push('<td>' + (d.unit_price ? d.unit_price : '') + '</td>');
  266. tr.push('<td><input type="checkbox" ' + check + '> 已选择</td>');
  267. tr.push('</tr>');
  268. html.push(tr.join(''));
  269. }
  270. $('#searchedBillsList').html(html.join(''));
  271. $('input[type=checkbox]', '#add-qd').click(checkMeasureBills);
  272. });
  273. }
  274. });
  275. // 选择计量范围
  276. $('#choosePos').click(function () {
  277. $('#add-qd').modal('hide');
  278. $('#add-pos').modal('show');
  279. });
  280. getMeasureDetail($('#measures').val());
  281. }
  282. const staticSet = new codeRuleSet($('#rule'), '#static');
  283. });
  284. class codeRuleSet {
  285. constructor (obj) {
  286. this.body = obj;
  287. // 切换规则组件类型
  288. $('select', obj).change(function () {
  289. const codeType = this.selectedIndex;
  290. if (codeType === ruleConst.ruleType.addNo) {
  291. $('#format', obj).show();
  292. $('#text', obj).show();
  293. $('#text>label', obj).text('起始编号');
  294. $('#text>input', obj).val('001');
  295. const s = '0000000000' + 1;
  296. $('#text>input', obj).val(s.substr(s.length - $('#format>input', obj).val()));
  297. } else if (codeType === ruleConst.ruleType.text) {
  298. $('#format', obj).hide();
  299. $('#text', obj).show();
  300. $('#text>label', obj).text('文本');
  301. $('#text>input', obj).val('').attr('placeholder', '请在这里输入需要的文本');
  302. } else {
  303. $('#format', obj).hide();
  304. $('#text', obj).hide();
  305. }
  306. });
  307. // 修改编号位数
  308. $('#format>input', obj).change(function () {
  309. const s = '0000000000' + parseInt($('#text>input', obj).val());
  310. $('#text>input', obj).val(s.substr(s.length - $(this).val()));
  311. });
  312. // 新增规则组件
  313. $('#addRule', obj).click(function () {
  314. const codeType = $('select', obj)[0].selectedIndex;
  315. const rule = {rule_type: codeType}, html = [];
  316. let preview;
  317. switch (codeType) {
  318. case ruleConst.ruleType.tenderName: {
  319. preview = $('#tenderName').text();
  320. break;
  321. }
  322. case ruleConst.ruleType.text: {
  323. rule.text = $('#text>input', obj).val();
  324. preview = rule.text;
  325. break;
  326. }
  327. case ruleConst.ruleType.inDate: {
  328. preview = moment().format('YYYYMM');
  329. break;
  330. }
  331. case ruleConst.ruleType.addNo: {
  332. rule.format = parseInt($('#format>input', obj).val());
  333. rule.start = parseInt($('#text>input', obj).val());
  334. const s = '0000000000';
  335. preview = s.substr(s.length - rule.format);
  336. break;
  337. }
  338. }
  339. // 更新规则
  340. codeRule.push(rule);
  341. // 更新规则显示
  342. html.push('<span class="badge badge-light" title="' + ruleConst.ruleString[codeType] + '" rule="' + JSON.stringify(rule) + '">');
  343. html.push('<span>' + preview + '</span>');
  344. html.push('<a href="javascript: void(0);" class="text-danger" title="移除"><i class="fa fa-remove"></i></a>');
  345. html.push('</span>');
  346. const part = $('#ruleParts', obj).append(html.join(''));
  347. // 更新规则预览
  348. $('#preview', obj).text($('#preview', obj).text() + preview);
  349. $('a', part).bind('click', function () {
  350. const index = $('a', obj).index(this);
  351. codeRule.splice(index, 1);
  352. $(this).parent().remove();
  353. const rules = $('span>span', obj), ruleText = [];
  354. for (const r of rules) {
  355. ruleText.push(r.innerText);
  356. }
  357. $('#preview', obj).text(ruleText.join(''));
  358. });
  359. });
  360. }
  361. }