material_exponent.js 60 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144
  1. const is_numeric = (value) => {
  2. if (typeof(value) === 'object') {
  3. return false;
  4. } else {
  5. return !Number.isNaN(Number(value)) && value.toString().trim() !== '';
  6. }
  7. };
  8. function getPasteHint (str, row = '') {
  9. let returnObj = str;
  10. if (row) {
  11. returnObj.msg = '指数清单第' + (row+1) + '行' + str.msg;
  12. }
  13. return returnObj;
  14. }
  15. $(document).ready(() => {
  16. autoFlashHeight();
  17. const materialExponentSpread = SpreadJsObj.createNewSpread($('#material-exponent-spread')[0]);
  18. const materialExponentSpreadSetting = {
  19. cols: [
  20. {title: '类型', colSpan: '1', rowSpan: '2', field: 'type', hAlign: 1, width: 60, formatter: '@', readOnly: true,cellType: 'customizeCombo', comboItems: materialType.ex_type, cellTypeKey: 1},
  21. {title: '符号', colSpan: '1', rowSpan: '2', field: 'symbol', hAlign: 1, width: 60, formatter: '@', readOnly: 'readOnly.isEdit'},
  22. {title: '符号说明', colSpan: '1', rowSpan: '2', field: 'symbol_desc', hAlign: 0, width: 180, formatter: '@', readOnly: 'readOnly.isEdit'},
  23. {title: '编号', colSpan: '1', rowSpan: '2', field: 'code', hAlign: 1, width: 60, formatter: '@', readOnly: 'readOnly.isEdit'},
  24. {title: '基本价格指数(F0)', colSpan: '1', rowSpan: '2', field: 'basic_price', hAlign: 2, width: 120, readOnly: 'readOnly.isEdit'},
  25. {title: '基准时间', colSpan: '1', rowSpan: '2', field: 'basic_times', hAlign: 0, width: 80, formatter: '@', readOnly: 'readOnly.isEdit'},
  26. {title: '现行价格指数(Ft)', colSpan: '1', rowSpan: '2', field: 'm_price', hAlign: 2, width: 120, type: 'Number', readOnly: 'readOnly.remark'},
  27. {title: '加权系数(B)', colSpan: '1', rowSpan: '2', field: 'weight_num', hAlign: 2, width: 120, formatter: '@', readOnly: 'readOnly.isConstant'},
  28. {title: '计算值(Ft/F0*B)', colSpan: '1', rowSpan: '2', field: 'calc_num', hAlign: 2, width: 100, formatter: '@', readOnly: true, getValue: 'getValue.calc_num'},
  29. {title: '备注', colSpan: '1', rowSpan: '2', field: 'remark', hAlign: 0, width: 60, formatter: '@', readOnly: 'readOnly.remark'},
  30. {title: '是否汇总', colSpan: '1', rowSpan: '2', field: 'is_summary', hAlign: 1, width: 60, cellType: 'checkbox', readOnly: 'readOnly.isEdit'},
  31. ],
  32. emptyRows: 0,
  33. headRows: 2,
  34. headRowHeight: [25, 25],
  35. defaultRowHeight: 21,
  36. headerFont: '12px 微软雅黑',
  37. font: '12px 微软雅黑',
  38. readOnly: readOnly,
  39. };
  40. const materialExponentBase = {
  41. isUsed: function (data) {
  42. if (data.type === 2) {
  43. return data.mid === materialID || data.basic_price === null || data.basic_price === 0;
  44. } else {
  45. return false;
  46. }
  47. },
  48. isEdit: function (data) {
  49. return data.mid === materialID && data.type === 2;
  50. },
  51. isConstant: function (data) {
  52. return (materialOrder === 1 && data.type === 1) || (data.mid === materialID && data.type === 2);
  53. }
  54. };
  55. const materialExponentCol = {
  56. getValue: {
  57. calc_num : function (data) {
  58. if (data.type === 1) return null;
  59. const calc_num = data.basic_price > 0 ? ZhCalc.mul(data.weight_num, ZhCalc.div(data.m_price, data.basic_price)) : 0;
  60. return calc_num > 0 ? ZhCalc.round(calc_num, materialExponentDecimal.qty) : 0;
  61. },
  62. },
  63. readOnly: {
  64. isEdit: function (data) {
  65. return !(!readOnly && materialExponentBase.isEdit(data));
  66. },
  67. isUsed: function (data) {
  68. return !(!readOnly && materialExponentBase.isUsed(data));
  69. },
  70. remark: function (data) {
  71. return !(!readOnly && data.type === 2);
  72. },
  73. isConstant: function (data) {
  74. // return !(!readOnly && materialExponentBase.isConstant(data));
  75. return readOnly;
  76. }
  77. },
  78. };
  79. const stageTjSpread = SpreadJsObj.createNewSpread($('#stage-tj-spread')[0]);
  80. const getTipText = function (data) {
  81. if (!data || !data.tip) return '';
  82. return data.tip;
  83. };
  84. const stageTjSpreadSetting = {
  85. cols: [
  86. {title: '计量期数', colSpan: '1', rowSpan: '2', field: 'order', hAlign: 0, width: 250, formatter: '@', cellType: 'delayTip', getTip: getTipText},
  87. {title: '本期调差金额', colSpan: '1', rowSpan: '2', field: 'ex_tp', hAlign: 1, width: 200, type: 'Number'},
  88. {title: '本期调差金额(建筑税)', colSpan: '1', rowSpan: '2', field: 'ex_tax_tp', hAlign: 1, width: 200, type: 'Number'},
  89. ],
  90. emptyRows: 0,
  91. headRows: 1,
  92. headRowHeight: [32],
  93. defaultRowHeight: 21,
  94. headerFont: '12px 微软雅黑',
  95. font: '12px 微软雅黑',
  96. readOnly: true,
  97. };
  98. SpreadJsObj.initSheet(stageTjSpread.getActiveSheet(), stageTjSpreadSetting);
  99. const needUpdateArray = ['weight_num', 'm_price', 'remark'];
  100. const materialExponentSpreadObj = {
  101. getMaterialExponentData: function (msid = null, mnid = null) {
  102. const ms_id = msid || $('#myTab').find('.active').attr('data-msid') || null;
  103. const mn_id = mnid || $('#myTab2').find('.active').attr('data-mnid') || null;
  104. if (ms_id || mn_id) {
  105. const condition = {};
  106. if (ms_id) condition.ms_id = parseInt(ms_id);
  107. if (mn_id) condition.mn_id = parseInt(mn_id);
  108. const mseList = _.filter(materialExponentShardData, condition);
  109. console.log(mseList);
  110. for (const me of materialExponentData) {
  111. me.ms_id = ms_id ? parseInt(ms_id) : null;
  112. me.mn_id = mn_id ? parseInt(mn_id) : null;
  113. const mseInfo = _.find(mseList, { me_id: me.me_id ? me.me_id : me.id });
  114. console.log(mseInfo);
  115. if (mseInfo) {
  116. for (const nu of needUpdateArray) {
  117. me[nu] = mseInfo[nu];
  118. }
  119. }
  120. }
  121. }
  122. console.log(materialExponentData, materialExponentShardData);
  123. return materialExponentData;
  124. },
  125. updateMaterialNodeTab: function () {
  126. const nodeList = $('#myTab2').find('li');
  127. const nowli = $('#myTab2').find('.active');
  128. const materialExponentNodeSort = exponent_nodes ? ['-1'].concat(exponent_nodes.split(',')) : [];
  129. const map = Object.fromEntries(materialExponentNodeSort.map((v, i) => [v, i]));
  130. materialExponentNodeData = materialExponentNodeData.sort((a, b) => map[a.node] - map[b.node]);
  131. const newNodeList = _.filter(materialExponentNodeData, { ms_id: parseInt($('#myTab').find('.active').attr('data-msid')) });
  132. for (const n of nodeList) {
  133. const node = $(n).children('a').attr('data-node');
  134. const nl = _.find(newNodeList, { node });
  135. $(n).children('a').attr('data-mnid', nl.id);
  136. }
  137. const newMnid = parseInt(nowli.attr('data-mnid'));
  138. materialExponentSpreadObj.getMaterialExponentData($('#myTab').find('.active').attr('data-msid'), newMnid);
  139. materialExponentSpreadObj.materialSheetReset(true);
  140. setExCalc($('#myTab').find('.active').attr('data-msid'), newMnid);
  141. },
  142. updateOneMaterialExponent: function (data) {
  143. const ms_id = $('#myTab').find('.active').attr('data-msid') || null;
  144. const mn_id = $('#myTab2').find('.active').attr('data-mnid') || null;
  145. const condition = { me_id: data.id };
  146. if (ms_id) condition.ms_id = parseInt(ms_id);
  147. if (mn_id) condition.mn_id = parseInt(mn_id);
  148. const mseInfo = _.find(materialExponentShardData, condition);
  149. console.log(mseInfo);
  150. data.ms_id = ms_id ? parseInt(ms_id) : null;
  151. data.mn_id = mn_id ? parseInt(mn_id) : null;
  152. for (const nu of needUpdateArray) {
  153. data[nu] = mseInfo[nu];
  154. }
  155. return data;
  156. },
  157. updateMaterialData: function (datas) {
  158. if (datas.stageData && datas.stageData.length > 0) {
  159. if (datas.stageData.length === materialStageData.length) {
  160. // 全体替换
  161. materialStageData = datas.stageData;
  162. } else {
  163. // 替换对应的stage数据
  164. for (const s of datas.stageData) {
  165. const index = _.findIndex(materialStageData, { id: s.id });
  166. materialStageData.splice(index, 1, s);
  167. }
  168. }
  169. }
  170. if (datas.nodeData && datas.nodeData.length > 0) {
  171. if (datas.nodeData.length === materialExponentNodeData.length) {
  172. // 全体替换
  173. materialExponentNodeData = datas.nodeData;
  174. } else {
  175. // 替换对应的stage数据
  176. for (const s of datas.nodeData) {
  177. const index = _.findIndex(materialExponentNodeData, { id: s.id });
  178. materialExponentNodeData.splice(index, 1, s);
  179. }
  180. }
  181. }
  182. if (datas.pushExponentShardData && datas.pushExponentShardData.length > 0) {
  183. materialExponentShardData = _.concat(materialExponentShardData, datas.pushExponentShardData);
  184. }
  185. if (datas.removeExponentShardData && datas.removeExponentShardData.length > 0) {
  186. materialExponentShardData = _.remove(materialExponentShardData, function (item) {
  187. return _.findIndex(datas.removeExponentShardData, { id: item.me_id }) === -1
  188. })
  189. }
  190. if (datas.exponentShardData && datas.exponentShardData.length > 0) {
  191. if (datas.exponentShardData.length === materialExponentShardData.length) {
  192. // 全体替换
  193. materialExponentShardData = datas.exponentShardData;
  194. } else {
  195. // 替换对应的stage数据
  196. for (const s of datas.exponentShardData) {
  197. const index = _.findIndex(materialExponentShardData, { id: s.id });
  198. materialExponentShardData.splice(index, 1, s);
  199. }
  200. }
  201. }
  202. if (datas.exponentData && datas.exponentData.length > 0) {
  203. if (datas.exponentData.length === materialExponentData.length) {
  204. // 全体替换
  205. materialExponentData = datas.exponentData;
  206. materialExponentSpreadObj.getMaterialExponentData();
  207. } else {
  208. for (const b of datas.exponentData) {
  209. const index = _.findIndex(materialExponentData, {id: b.id});
  210. materialExponentData.splice(index, 1, b);
  211. materialExponentSpreadObj.updateOneMaterialExponent(materialExponentData[index]);
  212. }
  213. }
  214. }
  215. },
  216. materialSheetReset: function (redo = false) {
  217. let newMaterialExponentData = _.cloneDeep(materialExponentData);
  218. if (redo) {
  219. materialExponentSpread.getActiveSheet().reset();
  220. SpreadJsObj.initSpreadSettingEvents(materialExponentSpreadSetting, materialExponentCol);
  221. SpreadJsObj.initSheet(materialExponentSpread.getActiveSheet(), materialExponentSpreadSetting);
  222. }
  223. SpreadJsObj.loadSheetData(materialExponentSpread.getActiveSheet(), SpreadJsObj.DataType.Data, newMaterialExponentData);
  224. materialExponentSpreadObj.refreshActn();
  225. },
  226. refreshActn: function (rowCount = 1) {
  227. const setObjEnable = function (obj, enable) {
  228. if (enable) {
  229. obj.removeClass('disabled');
  230. } else {
  231. obj.addClass('disabled');
  232. }
  233. };
  234. const sheet = materialExponentSpread.getActiveSheet();
  235. const select = SpreadJsObj.getSelectObject(sheet);
  236. // 还需判断是否已被调差清单调用
  237. setObjEnable($('#del'), !readOnly && select && materialExponentBase.isUsed(select) && rowCount === 1);
  238. },
  239. add: function () {
  240. const sheet = materialExponentSpread.getActiveSheet();
  241. postData(window.location.pathname + '/save', {type: 'add'}, function (result) {
  242. if (result) {
  243. materialExponentData.push(result.info);
  244. if (showStageExponent || exponent_nodes) {
  245. materialExponentSpreadObj.updateMaterialData(result);
  246. materialExponentSpreadObj.getMaterialExponentData();
  247. }
  248. SpreadJsObj.loadSheetData(materialExponentSpread.getActiveSheet(), SpreadJsObj.DataType.Data, materialExponentData);
  249. sheet.setSelection(materialExponentData.length - 1, 0, 1, 1);
  250. materialExponentSpreadObj.refreshActn();
  251. }
  252. });
  253. },
  254. del: function () {
  255. const sheet = materialExponentSpread.getActiveSheet();
  256. const select = SpreadJsObj.getSelectObject(sheet);
  257. const sel = sheet.getSelections();
  258. postData(window.location.pathname + '/save', {type: 'del', id: select.id}, function (result) {
  259. ex_tp = result.ex_tp;
  260. ex_tax_tp = result.ex_tax_tp;
  261. ex_expr = result.ex_expr || null;
  262. const index = _.findIndex(materialExponentData, { id: select.id });
  263. materialExponentData.splice(index, 1);
  264. if (showStageExponent || exponent_nodes) {
  265. result.removeExponentShardData = [{ id: select.id }];
  266. materialExponentSpreadObj.updateMaterialData(result);
  267. materialExponentSpreadObj.getMaterialExponentData();
  268. }
  269. materialExponentSpreadObj.materialSheetReset(true);
  270. resetExTpTable();
  271. sheet.setSelection(index > 0 ? index - 1 : 0, sel.length > 0 ? sel[0].col : 0, 1, 1);
  272. materialExponentSpreadObj.refreshActn();
  273. });
  274. },
  275. selectionChanged: function (e, info) {
  276. const sel = info.sheet.getSelections()[0];
  277. const col = info.sheet.zh_setting.cols[sel.col];
  278. materialExponentSpreadObj.refreshActn(sel.rowCount);
  279. const data = SpreadJsObj.getSelectObject(info.sheet);
  280. materialExponentSpreadObj.setReadOnly(true);
  281. },
  282. editEnded: function (e, info) {
  283. if (info.sheet.zh_setting) {
  284. const select = SpreadJsObj.getSelectObject(info.sheet);
  285. const col = info.sheet.zh_setting.cols[info.col];
  286. if (col.field === 'is_summary') {
  287. return;
  288. }
  289. // 未改变值则不提交
  290. let validText = is_numeric(info.editingText) ? parseFloat(info.editingText) : (info.editingText ? trimInvalidChar(info.editingText) : null);
  291. const orgValue = select[col.field];
  292. if (orgValue == validText || ((!orgValue || orgValue === '') && (validText === '' || validText === null))) {
  293. SpreadJsObj.reLoadRowData(info.sheet, info.row);
  294. return;
  295. }
  296. // 判断部分值是否输入的是数字判断和数据计算
  297. if (col.field === 'basic_price' || col.field === 'm_price') {
  298. if (isNaN(validText)) {
  299. toastr.error('不能输入其它非数字类型字符');
  300. SpreadJsObj.reLoadRowData(info.sheet, info.row);
  301. return;
  302. }
  303. const num = parseFloat(validText.toPrecision(10));
  304. if (validText !== null && num < 0) {
  305. toastr.error('请输入10位以内有效数字并且小于3位小数的浮点数');
  306. SpreadJsObj.reLoadRowData(info.sheet, info.row);
  307. return;
  308. } else if (validText !== null) {
  309. if(!Number.isInteger(num) && !/^(\d{1,10}\.\d{1,3})?$/.test(num)) {
  310. toastr.warning('已保留3位小数');
  311. } else if (validText.toString().length > 11) {
  312. toastr.warning('已保留10位有效数字');
  313. }
  314. // SpreadJsObj.reLoadRowData(info.sheet, info.row);
  315. // return;
  316. validText = ZhCalc.round(num, 3);
  317. }
  318. }
  319. if (col.field === 'weight_num') {
  320. if (isNaN(validText)) {
  321. toastr.error('不能输入其它非数字类型字符');
  322. SpreadJsObj.reLoadRowData(info.sheet, info.row);
  323. return;
  324. }
  325. let num = parseFloat(validText);
  326. if (validText !== null && (num < 0 || num >= 1)) {
  327. toastr.error('请输入0~1范围内并且小于3位小数的浮点数');
  328. SpreadJsObj.reLoadRowData(info.sheet, info.row);
  329. return;
  330. } else if (validText !== null && num > 0 && num < 1 && !/^\d+(\.\d{1,3})?$/.test(num)) {
  331. toastr.warning('已保留3位小数');
  332. validText = ZhCalc.round(num, 3);
  333. num = ZhCalc.round(num, 3);
  334. }
  335. const weight_datas = showStageExponent || exponent_nodes ? _.filter(materialExponentShardData, { ms_id: parseInt($('#myTab').find('.active').attr('data-msid')) || null, mn_id: parseInt($('#myTab2').find('.active').attr('data-mnid')) || null }) : materialExponentData;
  336. const total_weight = ZhCalc.add(ZhCalc.sub(ZhCalc.sum(_.map(weight_datas, 'weight_num')), parseFloat(orgValue)), num);
  337. if (total_weight > 1) {
  338. toastr.error('加权系数总和不能大于1');
  339. SpreadJsObj.reLoadRowData(info.sheet, info.row);
  340. return;
  341. }
  342. }
  343. select[col.field] = validText;
  344. select.calc_num = materialExponentCol.getValue.calc_num(select);
  345. delete select.waitingLoading;
  346. // console.log(select);
  347. // 更新至服务器
  348. postData(window.location.pathname + '/save', { type:'update', updateData: select, ms_id: $('#myTab').find('.active').attr('data-msid') || null, mn_id: $('#myTab2').find('.active').attr('data-mnid') || null }, function (result) {
  349. ex_tp = result.ex_tp;
  350. ex_tax_tp = result.ex_tax_tp;
  351. ex_expr = result.ex_expr || null;
  352. if (showStageExponent || exponent_nodes) {
  353. materialExponentSpreadObj.updateMaterialData(result);
  354. }
  355. resetExTpTable();
  356. SpreadJsObj.reLoadRowData(info.sheet, info.row);
  357. // materialExponentData.splice(info.row, 1, select);
  358. }, function () {
  359. select[col.field] = orgValue;
  360. SpreadJsObj.reLoadRowData(info.sheet, info.row);
  361. });
  362. }
  363. },
  364. buttonClicked: function (e, info) {
  365. if (info.sheet.zh_setting) {
  366. const select = SpreadJsObj.getSelectObject(info.sheet);
  367. const col = info.sheet.zh_setting.cols[info.col];
  368. if (col.field === 'weight_num') {
  369. if(materialExponentCol.readOnly.isConstant(select)) {
  370. return;
  371. }
  372. } else {
  373. if(materialExponentCol.readOnly.isEdit(select)) {
  374. return
  375. }
  376. }
  377. if (col.field === 'is_summary') {
  378. if (info.sheet.isEditing()) {
  379. info.sheet.endEdit(true);
  380. }
  381. select.is_summary = info.sheet.getValue(info.row, info.col) ? 1 : 0;
  382. delete select.waitingLoading;
  383. // 更新至服务器
  384. postData(window.location.pathname + '/save', { type:'update', updateData: select, ms_id: $('#myTab').find('.active').attr('data-msid') || null, mn_id: $('#myTab2').find('.active').attr('data-mnid') || null }, function (result) {
  385. ex_tp = result.ex_tp;
  386. ex_tax_tp = result.ex_tax_tp;
  387. ex_expr = result.ex_expr || null;
  388. if (showStageExponent || exponent_nodes) {
  389. materialExponentSpreadObj.updateMaterialData(result);
  390. }
  391. resetExTpTable();
  392. SpreadJsObj.reLoadRowData(info.sheet, info.row);
  393. }, function () {
  394. select.is_summary = info.sheet.getValue(info.row, info.col) ? 0 : 1;
  395. SpreadJsObj.reLoadRowData(info.sheet, info.row);
  396. });
  397. }
  398. }
  399. },
  400. deletePress: function (sheet) {
  401. if (!sheet.zh_setting || readOnly || sheet.zh_setting.readOnly) return;
  402. // materialExponentBase.isUsed(select)
  403. if (sheet.zh_setting && sheet.zh_data) {
  404. const sel = sheet.getSelections()[0];
  405. if (!sel) return;
  406. const sortData = sheet.zh_data || [];
  407. const data = [];
  408. for (let iRow = sel.row; iRow < sel.row + sel.rowCount; iRow++) {
  409. // let bPaste = true;
  410. const exData = sortData[iRow];
  411. const materialExData = { id: sortData[iRow].id };
  412. for (let iCol = 0; iCol < sel.colCount; iCol++) {
  413. const curCol = sel.col + iCol;
  414. const colSetting = sheet.zh_setting.cols[curCol];
  415. if(colSetting.readOnly(exData)) continue;
  416. if (!colSetting) continue;
  417. const orgValue = sortData[iRow][colSetting.field];
  418. if(orgValue === null) {
  419. // bPaste = false;
  420. continue;
  421. }
  422. if (exData.type === materialType.ex_type[0].value && colSetting.field !== 'weight_num') {
  423. // bPaste = false;
  424. continue;
  425. }
  426. if (colSetting.field === 'type' || colSetting.field === 'calc_num' || colSetting.field === 'is_summary'){
  427. // bPaste = false;
  428. continue;
  429. }
  430. materialExData[colSetting.field] = null;
  431. sortData[iRow][colSetting.field] = null;
  432. }
  433. if (exData.type !== materialType.ex_type[0].value) materialExData.calc_num = materialExponentCol.getValue.calc_num(sortData[iRow]);
  434. const arr = Object.keys(materialExData);
  435. if (arr.length !== 1) {
  436. data.push(materialExData);
  437. }
  438. }
  439. if (data.length === 0) {
  440. SpreadJsObj.reLoadSheetData(sheet);
  441. return;
  442. }
  443. // 更新至服务器
  444. postData(window.location.pathname + '/save', { type:'paste', updateData: data, ms_id: $('#myTab').find('.active').attr('data-msid') || null, mn_id: $('#myTab2').find('.active').attr('data-mnid') || null }, function (result) {
  445. ex_tp = result.ex_tp;
  446. ex_tax_tp = result.ex_tax_tp;
  447. ex_expr = result.ex_expr || null;
  448. materialExponentSpreadObj.updateMaterialData(result);
  449. if (showStageExponent || exponent_nodes) {
  450. materialExponentSpreadObj.getMaterialExponentData();
  451. }
  452. SpreadJsObj.loadSheetData(materialExponentSpread.getActiveSheet(), SpreadJsObj.DataType.Data, materialExponentData);
  453. resetExTpTable();
  454. }, function () {
  455. SpreadJsObj.reLoadSheetData(sheet);
  456. return;
  457. });
  458. }
  459. },
  460. clipboardPasted(e, info) {
  461. const hint = {
  462. cellError: {type: 'error', msg: '粘贴内容超出了表格范围'},
  463. numberExpr: {type: 'error', msg: '不能粘贴其它非数字类型字符'},
  464. numberCan: {type: 'error', msg: '请粘贴10位以内有效数字并且小于3位小数的浮点数'},
  465. numberCan2: {type: 'error', msg: '请粘贴0~1范围内并且小于3位小数的浮点数'},
  466. numberCan3: {type: 'warning', msg: '已保留3位小数'},
  467. numberCan4: {type: 'warning', msg: '已保留10位有效数字'},
  468. weightNumberCan: {type: 'error', msg: '粘贴的加权系数总和不能大于1'},
  469. };
  470. const range = info.cellRange;
  471. const sortData = info.sheet.zh_data || [];
  472. if (info.cellRange.row + info.cellRange.rowCount > sortData.length) {
  473. toastMessageUniq(hint.cellError);
  474. // SpreadJsObj.loadSheetData(materialSpread.getActiveSheet(), SpreadJsObj.DataType.Data, materialBillsData);
  475. SpreadJsObj.reLoadSheetHeader(materialExponentSpread.getActiveSheet());
  476. SpreadJsObj.reLoadSheetData(materialExponentSpread.getActiveSheet());
  477. return;
  478. }
  479. if (sortData.length > 0 && range.col + range.colCount > 10) {
  480. toastMessageUniq(hint.cellError);
  481. SpreadJsObj.reLoadSheetHeader(materialExponentSpread.getActiveSheet());
  482. SpreadJsObj.reLoadSheetData(materialExponentSpread.getActiveSheet());
  483. return;
  484. }
  485. const data = [];
  486. // const rowData = [];
  487. for (let iRow = 0; iRow < range.rowCount; iRow++) {
  488. let bPaste = true;
  489. const curRow = range.row + iRow;
  490. // const materialData = JSON.parse(JSON.stringify(sortData[curRow]));
  491. const materialExData = { id: sortData[curRow].id };
  492. const hintRow = range.rowCount > 1 ? curRow : '';
  493. let sameCol = 0;
  494. for (let iCol = 0; iCol < range.colCount; iCol++) {
  495. const curCol = range.col + iCol;
  496. const colSetting = info.sheet.zh_setting.cols[curCol];
  497. if (!colSetting) continue;
  498. let validText = info.sheet.getText(curRow, curCol);
  499. validText = is_numeric(validText) ? parseFloat(validText) : (validText ? trimInvalidChar(validText) : null);
  500. const orgValue = sortData[curRow][colSetting.field];
  501. if (orgValue == validText || ((!orgValue || orgValue === '') && (validText === ''))) {
  502. sameCol++;
  503. if (range.colCount === sameCol) {
  504. bPaste = false;
  505. }
  506. continue;
  507. }
  508. if (colSetting.field === 'basic_price' || colSetting.field === 'm_price') {
  509. if (isNaN(validText)) {
  510. toastMessageUniq(getPasteHint(hint.numberExpr, hintRow));
  511. bPaste = false;
  512. continue;
  513. }
  514. const num = parseFloat(validText.toPrecision(10));
  515. if (validText !== null && num < 0) {
  516. toastMessageUniq(getPasteHint(hint.numberCan, hintRow));
  517. bPaste = false;
  518. continue;
  519. } else if (validText !== null) {
  520. if(!Number.isInteger(num) && !/^(\d{1,10}\.\d{1,3})?$/.test(num)) {
  521. toastMessageUniq(getPasteHint(hint.numberCan3, hintRow));
  522. } else if (validText.toString().length > 11) {
  523. toastMessageUniq(getPasteHint(hint.numberCan4, hintRow));
  524. }
  525. // SpreadJsObj.reLoadRowData(info.sheet, info.row);
  526. // return;
  527. validText = ZhCalc.round(num, 3);
  528. }
  529. }
  530. if (colSetting.field === 'weight_num') {
  531. if (isNaN(validText)) {
  532. toastMessageUniq(getPasteHint(hint.numberExpr, hintRow));
  533. bPaste = false;
  534. continue;
  535. }
  536. let num = parseFloat(validText);
  537. if (validText !== null && (num < 0 || num >= 1)) {
  538. toastMessageUniq(getPasteHint(hint.numberCan2, hintRow));
  539. bPaste = false;
  540. continue;
  541. } else if (validText !== null && num > 0 && num < 1 && !/^\d+(\.\d{1,3})?$/.test(num)) {
  542. toastMessageUniq(getPasteHint(hint.numberCan3, hintRow));
  543. validText = ZhCalc.round(num, 3);
  544. num = ZhCalc.round(num, 3);
  545. }
  546. const weight_datas = showStageExponent || exponent_nodes ? _.filter(materialExponentShardData, { ms_id: parseInt($('#myTab').find('.active').attr('data-msid')) || null, mn_id: parseInt($('#myTab2').find('.active').attr('data-mnid')) || null }) : materialExponentData;
  547. const total_weight = ZhCalc.add(ZhCalc.sub(ZhCalc.sum(_.map(weight_datas, 'weight_num')), parseFloat(orgValue)), num);
  548. if (total_weight > 1) {
  549. toastMessageUniq(getPasteHint(hint.weightNumberCan, hintRow));
  550. bPaste = false;
  551. continue;
  552. }
  553. }
  554. materialExData[colSetting.field] = validText;
  555. sortData[curRow][colSetting.field] = validText;
  556. }
  557. if (bPaste) {
  558. materialExData.calc_num = materialExponentCol.getValue.calc_num(sortData[curRow]);
  559. data.push(materialExData);
  560. // rowData.push(curRow);
  561. } else {
  562. SpreadJsObj.reLoadRowData(info.sheet, curRow);
  563. }
  564. }
  565. if (data.length === 0) {
  566. SpreadJsObj.reLoadRowData(info.sheet, info.cellRange.row, info.cellRange.rowCount);
  567. return;
  568. }
  569. // console.log(data);
  570. // 更新至服务器
  571. postData(window.location.pathname + '/save', { type:'paste', updateData: data, ms_id: $('#myTab').find('.active').attr('data-msid') || null, mn_id: $('#myTab2').find('.active').attr('data-mnid') || null }, function (result) {
  572. ex_tp = result.ex_tp;
  573. ex_tax_tp = result.ex_tax_tp;
  574. ex_expr = result.ex_expr || null;
  575. materialExponentSpreadObj.updateMaterialData(result);
  576. if (showStageExponent || exponent_nodes) {
  577. materialExponentSpreadObj.getMaterialExponentData();
  578. }
  579. SpreadJsObj.loadSheetData(materialExponentSpread.getActiveSheet(), SpreadJsObj.DataType.Data, materialExponentData);
  580. resetExTpTable();
  581. }, function () {
  582. SpreadJsObj.reLoadRowData(info.sheet, info.cellRange.row, info.cellRange.rowCount);
  583. return;
  584. });
  585. },
  586. setReadOnly: function(readOnly) {
  587. // SpreadJsObj.resetFieldReadOnly(materialSpread.getActiveSheet(), 'msg_spread', 'm_spread', 'm_tp', 'pre_tp', readOnly);
  588. },
  589. _checkExprValid(expr) {
  590. if (!expr) return [true, null];
  591. const param = [];
  592. let num = '', base = '';
  593. for (let i = 0, iLen = expr.length; i < iLen; i++) {
  594. if (/^[\d\.%]+/.test(expr[i])) {
  595. if (base !== '') {
  596. param.push({type: 'base', value: base});
  597. base = '';
  598. }
  599. num = num + expr[i];
  600. } else if (expr[i] === '(') {
  601. if (num !== '') {
  602. param.push({type: 'num', value: num});
  603. num = '';
  604. }
  605. if (base !== '') {
  606. param.push({type: 'base', value: base});
  607. base = '';
  608. }
  609. param.push({type: 'left', value: '('});
  610. } else if (expr[i] === ')') {
  611. if (num !== '') {
  612. param.push({type: 'num', value: num});
  613. num = '';
  614. }
  615. if (base !== '') {
  616. param.push({type: 'base', value: base});
  617. base = '';
  618. }
  619. param.push({type: 'right', value: ')'});
  620. } else if (/^[\+\-*\/]/.test(expr[i])) {
  621. if (num !== '') {
  622. param.push({type: 'num', value: num});
  623. num = '';
  624. }
  625. if (base !== '') {
  626. param.push({type: 'base', value: base});
  627. base = '';
  628. }
  629. param.push({type: 'calc', value: expr[i]});
  630. } else {
  631. return [false, '输入的表达式含有非法字符: ' + expr[i]];
  632. }
  633. }
  634. if (num !== '') {
  635. param.push({type: 'num', value: num});
  636. num = '';
  637. }
  638. if (base !== '') {
  639. param.push({type: 'base', value: base});
  640. base = '';
  641. }
  642. if (param.length === 0) return true;
  643. if (param.length > 1) {
  644. if (param[0].value === '-' && param[1].type === 'num') {
  645. param[1].value = '-' + param[1].value;
  646. param.shift();
  647. }
  648. }
  649. const iLen = param.length;
  650. let iLeftCount = 0, iRightCount = 0;
  651. for (const [i, p] of param.entries()) {
  652. if (p.type === 'calc') {
  653. if (i === 0 || i === iLen - 1)
  654. return [false, '输入的表达式非法:计算符号' + p.value + '前后应有数字'];
  655. }
  656. if (p.type === 'num') {
  657. num = p.value.replace('%', '');
  658. if (p.value.length - num.length > 1)
  659. return [false, '输入的表达式非法:' + p.value + '不是一个有效的数字'];
  660. num = _.toNumber(num);
  661. if (num === undefined || num === null || _.isNaN(num))
  662. return [false, '输入的表达式非法:' + p.value + '不是一个有效的数字'];
  663. if (i > 0) {
  664. if (param[i - 1].type !== 'calc' && param[i - 1].type !== 'left') {
  665. return [false, '输入的表达式非法:' + p.value + '前应有运算符'];
  666. } else if (param[i - 1].value === '/' && num === 0) {
  667. return [false, '输入的表达式非法:请勿除0'];
  668. }
  669. }
  670. }
  671. if (p.type === 'base') {
  672. if (i > 0 && (param[i - 1].type === 'num' || param[i - 1].type === 'right'))
  673. return [false, '输入的表达式非法:' + p.value + '前应有运算符'];
  674. }
  675. if (p.type === 'left') {
  676. iLeftCount += 1;
  677. if (i !== 0 && param[i-1].type !== 'calc')
  678. return [false, '输入的表达式非法:(前应有运算符'];
  679. }
  680. if (p.type === 'right') {
  681. iRightCount += 1;
  682. if (i !== iLen - 1 && param[i+1].type !== 'calc')
  683. return [false, '输入的表达式非法:)后应有运算符'];
  684. if (iRightCount > iLeftCount)
  685. return [false, '输入的表达式非法:")"前无对应的"("'];
  686. }
  687. }
  688. if (iLeftCount > iRightCount)
  689. return [false, '输入的表达式非法:"("后无对应的")"'];
  690. return [true, ''];
  691. },
  692. _checkExpr: function (text, data) {
  693. if (text) {
  694. const num = _.toNumber(text);
  695. if (num) {
  696. data.quantity = num;
  697. data.expr = '';
  698. } else {
  699. const expr = $.trim(text).replace('\t', '').replace('=', '').toLowerCase();
  700. const [valid, msg] = this._checkExprValid(expr);
  701. if (!valid) return [valid, msg];
  702. data.expr = expr;
  703. data.quantity = ZhCalc.calcExpr.calcExprStrRpn(expr.replace(new RegExp('%', 'gm'), '/100'));
  704. // const ce = new CalcEvalMin();
  705. // data.quantity = ce.eval(expr);
  706. // console.log(data.quantity);
  707. }
  708. } else {
  709. data.quantity = 0;
  710. data.expr = '';
  711. }
  712. return [true, ''];
  713. },
  714. };
  715. SpreadJsObj.initSpreadSettingEvents(materialExponentSpreadSetting, materialExponentCol);
  716. SpreadJsObj.initSheet(materialExponentSpread.getActiveSheet(), materialExponentSpreadSetting);
  717. materialExponentSpreadObj.getMaterialExponentData();
  718. SpreadJsObj.loadSheetData(materialExponentSpread.getActiveSheet(), SpreadJsObj.DataType.Data, materialExponentData);
  719. if (showStageExponent || exponent_nodes) setExCalc();
  720. if (exponent_nodes) resetExTpTable();
  721. materialExponentSpreadObj.refreshActn();
  722. // 期切换
  723. $('#myTab a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
  724. e.preventDefault();
  725. showWaitingView();
  726. setTimeout(function () {
  727. if (exponent_nodes) {
  728. materialExponentSpreadObj.updateMaterialNodeTab();
  729. } else {
  730. materialExponentSpreadObj.getMaterialExponentData();
  731. materialExponentSpreadObj.materialSheetReset(true);
  732. setExCalc();
  733. }
  734. closeWaitingView();
  735. }, 1000);
  736. });
  737. // 分项切换
  738. $('#myTab2 a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
  739. e.preventDefault();
  740. showWaitingView();
  741. setTimeout(function () {
  742. materialExponentSpreadObj.getMaterialExponentData();
  743. materialExponentSpreadObj.materialSheetReset(true);
  744. setExCalc();
  745. closeWaitingView();
  746. }, 1000);
  747. });
  748. function setExCalc(msid = null, mnid = null) {
  749. let html = '';
  750. const mn_id = mnid || $('#myTab2').find('.active').attr('data-mnid') || null;
  751. const ms_id = msid || $('#myTab').find('.active').attr('data-msid') || null;
  752. const condition = {};
  753. if (mn_id) condition.mn_id = parseInt(mn_id);
  754. if (ms_id) condition.ms_id = parseInt(ms_id);
  755. ex_calc = _.find(ex_calcList, condition).ex_calc;
  756. for (const bq of ex_calc) {
  757. html += `<tr>
  758. <td><input type="checkbox" value="${bq.code}" ${readOnly ? 'disabled' : ''} class="calc_select" ${bq.select ? 'checked' : ''}></td>
  759. <td>${materialType.ex_basic_text[bq.code]}</td><td>${bq.code === 'zdy' && !readOnly ? `<input type="text" id="calc_zdy" class="form-control form-control-sm" value="${bq.result ? bq.result : bq.value}">` : bq.result ? bq.result : bq.value }</td>
  760. </tr>`;
  761. }
  762. $('#calc_basic_select').html(html);
  763. }
  764. if (!readOnly) {
  765. $('#add').click(materialExponentSpreadObj.add);
  766. $('#del').click(materialExponentSpreadObj.del);
  767. materialExponentSpread.bind(spreadNS.Events.SelectionChanged, materialExponentSpreadObj.selectionChanged);
  768. materialExponentSpread.bind(spreadNS.Events.EditEnded, materialExponentSpreadObj.editEnded);
  769. materialExponentSpread.bind(spreadNS.Events.ButtonClicked, materialExponentSpreadObj.buttonClicked);
  770. materialExponentSpread.bind(spreadNS.Events.ClipboardPasted, materialExponentSpreadObj.clipboardPasted);
  771. if (!editForAudit) {
  772. SpreadJsObj.addDeleteBind(materialExponentSpread, materialExponentSpreadObj.deletePress);
  773. // 右键菜单
  774. $.contextMenu({
  775. selector: '#material-exponent-spread',
  776. build: function ($trigger, e) {
  777. const target = SpreadJsObj.safeRightClickSelection($trigger, e, materialExponentSpread);
  778. return target.hitTestType === GC.Spread.Sheets.SheetArea.viewport || target.hitTestType === GC.Spread.Sheets.SheetArea.rowHeader;
  779. },
  780. items: {
  781. 'create': {
  782. name: '新增',
  783. icon: 'fa-sign-in',
  784. callback: function (key, opt) {
  785. materialExponentSpreadObj.add(materialExponentSpread.getActiveSheet());
  786. },
  787. },
  788. 'delete': {
  789. name: '删除',
  790. icon: 'fa-remove',
  791. callback: function (key, opt) {
  792. materialExponentSpreadObj.del(materialExponentSpread.getActiveSheet());
  793. },
  794. disabled: function (key, opt) {
  795. const sheet = materialExponentSpread.getActiveSheet();
  796. const select = SpreadJsObj.getSelectObject(sheet);
  797. const sel = sheet.getSelections()[0];
  798. materialExponentSpreadObj.refreshActn(sel.rowCount);
  799. if (!readOnly && select && materialExponentBase.isUsed(select) && sel.rowCount === 1) {
  800. return false;
  801. } else {
  802. return true;
  803. }
  804. }
  805. },
  806. }
  807. });
  808. }
  809. // 调差基数选中
  810. $('body').on('click', '.calc_select', function () {
  811. // 如果是选中则清除其余的选中
  812. const code = $(this).val();
  813. for (const calc of ex_calc) {
  814. calc.select = $(this).is(':checked') && code === calc.code ? true : false;
  815. if (!calc.select) {
  816. $('.calc_select[value="'+ calc.code +'"]').prop('checked', false);
  817. }
  818. }
  819. postData(window.location.pathname + '/save', { type:'ex_calc', updateData: ex_calc, ms_id: $('#myTab').find('.active').attr('data-msid') || null, mn_id: $('#myTab2').find('.active').attr('data-mnid') || null }, function (result) {
  820. ex_tp = result.ex_tp;
  821. ex_tax_tp = result.ex_tax_tp;
  822. ex_expr = result.ex_expr || null;
  823. if (showStageExponent || exponent_nodes) {
  824. materialExponentSpreadObj.updateMaterialData(result);
  825. }
  826. resetExTpTable();
  827. });
  828. });
  829. // 回车提交
  830. $('body').on('keypress', '#calc_zdy', function () {
  831. if(window.event.keyCode === 13) {
  832. $(this).blur();
  833. }
  834. });
  835. $('body').on('click', '#calc_zdy', function (e) {
  836. e.stopPropagation();
  837. const zdy = _.find(ex_calc, { code: 'zdy' });
  838. $(this).val(zdy.value);
  839. });
  840. // 自定义金额变更并提交
  841. $('body').on('blur', '#calc_zdy', function () {
  842. let validText = $(this).val();
  843. let newValue = is_numeric(validText) ? parseFloat(validText) : (validText ? trimInvalidChar(validText) : '');
  844. const zdy = _.find(ex_calc, { code: 'zdy' });
  845. if (zdy.value === newValue) {
  846. $('#calc_zdy').val(zdy.result ? zdy.result : zdy.value);
  847. return;
  848. }
  849. const exprQuantity = {
  850. expr: '',
  851. quantity: 0,
  852. };
  853. const [valid, msg] = materialExponentSpreadObj._checkExpr(newValue, exprQuantity);
  854. console.log(exprQuantity, validText, valid, msg);
  855. if (!valid) {
  856. toastr.error(msg);
  857. $('#calc_zdy').val(zdy.result ? zdy.result : zdy.value);
  858. return;
  859. }
  860. if (isNaN(exprQuantity.quantity)) {
  861. toastr.error('不能输入其它非数字类型字符');
  862. $('#calc_zdy').val(zdy.result ? zdy.result : zdy.value);
  863. return;
  864. }
  865. validText = parseFloat(exprQuantity.quantity);
  866. newValue = ZhCalc.round(validText, 6);
  867. const gather = _.find(ex_calc, { code: 'bqwc' });
  868. if (gather.value === newValue) {
  869. zdy.value = gather.value;
  870. zdy.result = '';
  871. } else {
  872. zdy.value = exprQuantity.expr ? exprQuantity.expr : newValue;
  873. zdy.result = newValue;
  874. }
  875. console.log(zdy, ex_calcList, ex_calc);
  876. $('#calc_zdy').val(zdy.result ? zdy.result : zdy.value);
  877. postData(window.location.pathname + '/save', { type:'ex_calc', updateData: ex_calc, ms_id: $('#myTab').find('.active').attr('data-msid') || null, mn_id: $('#myTab2').find('.active').attr('data-mnid') || null }, function (result) {
  878. ex_tp = result.ex_tp;
  879. ex_tax_tp = result.ex_tax_tp;
  880. ex_expr = result.ex_expr || null;
  881. if (showStageExponent || exponent_nodes) {
  882. materialExponentSpreadObj.updateMaterialData(result);
  883. }
  884. resetExTpTable();
  885. });
  886. });
  887. $('.changeRate').click(function () {
  888. $('#rateInput').val(parseInt($(this).data('value')));
  889. $('#rateInput').siblings('.dropdown-menu').hide();
  890. });
  891. $('#rateInput').click(function () {
  892. $(this).siblings('.dropdown-menu').show();
  893. })
  894. // 回车提交
  895. $('#rateInput').on('keypress', function () {
  896. if(window.event.keyCode === 13) {
  897. $(this).blur();
  898. }
  899. });
  900. $('#rateInput').blur(function () {
  901. const _self = $(this);
  902. setTimeout(function () {
  903. let rate = parseFloat(_self.val());
  904. if (_.isNaN(rate)) {
  905. toastr.error('请输入0-100之前的整数值');
  906. $('#rateInput').val(materialRate);
  907. return;
  908. }
  909. rate = _.round(rate);
  910. if(rate < 0 || rate > 100) {
  911. toastr.error('请输入0-100之前的整数值');
  912. $('#rateInput').val(materialRate);
  913. return;
  914. }
  915. $('#rateInput').siblings('.dropdown-menu').hide();
  916. console.log(rate, materialRate);
  917. if (rate !== materialRate) {
  918. postData(window.location.pathname + '/save', { type:'rate', rate: rate }, function (result) {
  919. // const exbqhs = ZhCalc.round(ZhCalc.mul(ex_tp, 1+rate/100), materialDecimal.tp);
  920. // const exjzbqhs = ZhCalc.round(ZhCalc.add(ex_pre_tp_hs, exbqhs), materialDecimal.tp);
  921. // $('#rate_set').find('td').eq(3).text(exbqhs !== 0 ? exbqhs : '');
  922. // $('#rate_set').find('td').eq(4).text(exjzbqhs !== 0 ? exjzbqhs : '');
  923. materialRate = rate;
  924. ex_tax_tp = result.ex_tax_tp;
  925. $('#rateInput').val(rate);
  926. if (showStageExponent || exponent_nodes) {
  927. materialExponentSpreadObj.updateMaterialData(result);
  928. }
  929. resetExTpTable();
  930. });
  931. } else {
  932. $('#rateInput').val(rate);
  933. }
  934. }, 500);
  935. });
  936. }
  937. $('a', '[id=material-exponent-tab]').click(function() {
  938. setTimeout(refreshRelaSpread, 100);
  939. });
  940. function refreshRelaSpread() {
  941. stageTjSpread.refresh();
  942. }
  943. function resetExTpTable() {
  944. $('#tj_ledger').children('td').eq(1).text(ex_tp ? ZhCalc.round(ex_tp, materialExponentDecimal.tp) : '');
  945. $('#tj_ledger').children('td').eq(2).text(ex_tax_tp ? ZhCalc.round(ex_tax_tp, materialExponentDecimal.tp) : '');
  946. $('#tj_ledger').children('td').eq(3).text(ZhCalc.add(ex_pre_tp, ZhCalc.round(ex_tp, materialExponentDecimal.tp)));
  947. $('#tj_ledger').children('td').eq(4).text(ZhCalc.add(ex_pre_tp_hs, ZhCalc.round(ex_tax_tp, materialExponentDecimal.tp)));
  948. $('#total_set').children('td').eq(1).text(ex_tp ? ZhCalc.round(ex_tp, materialExponentDecimal.tp) : '');
  949. $('#total_set').children('td').eq(2).text(ex_tax_tp ? ZhCalc.round(ex_tax_tp, materialExponentDecimal.tp) : '');
  950. $('#total_set').children('td').eq(3).text(ZhCalc.add(ex_pre_tp, ZhCalc.round(ex_tp, materialExponentDecimal.tp)));
  951. $('#total_set').children('td').eq(4).text(ZhCalc.add(ex_pre_tp_hs, ZhCalc.round(ex_tax_tp, materialExponentDecimal.tp)));
  952. if (exponent_nodes) {
  953. const materialExponentNodeSort = exponent_nodes ? ['-1'].concat(exponent_nodes.split(',')) : [];
  954. const map = Object.fromEntries(materialExponentNodeSort.map((v, i) => [v, i]));
  955. materialExponentNodeData = materialExponentNodeData.sort((a, b) => map[a.node] - map[b.node]);
  956. let html = '';
  957. for (const node of materialExponentNodeSort) {
  958. const mnList = _.filter(materialExponentNodeData, { node });
  959. const one_mn = mnList[0];
  960. let total_tp = 0;
  961. let total_tax_tp = 0;
  962. let total_pre_tp = one_mn.ex_pre_tp || 0;
  963. let total_pre_tp_hs = one_mn.ex_tax_pre_tp || 0;
  964. // 汇总
  965. for (const mn of mnList) {
  966. total_tp = ZhCalc.add(total_tp, mn.ex_tp ? mn.ex_tp : 0);
  967. total_tax_tp = ZhCalc.add(total_tax_tp, mn.ex_tax_tp ? mn.ex_tax_tp : 0);
  968. total_pre_tp = ZhCalc.add(total_pre_tp, mn.ex_tp ? mn.ex_tp : 0);
  969. total_pre_tp_hs = ZhCalc.add(total_pre_tp_hs, mn.ex_tax_tp ? mn.ex_tax_tp : 0);
  970. }
  971. const exprHtml = isStageSelf ? '' : `<a href="javascript:void(0);" data-toggle="tooltip" data-placement="bottom" title="${one_mn.name}(${one_mn.code})价差:${one_mn.ex_expr ? one_mn.ex_expr : ''}"><i class="fa fa-question-circle-o"></i></a>`;
  972. html += `<tr id="tj_node_${node}">
  973. <td class="text-center">${one_mn.name}(${one_mn.code}) ${exprHtml}</td>
  974. <td class="text-center">${total_tp}</td>
  975. <td class="text-center">${total_tax_tp}</td>
  976. <td class="text-center">${total_pre_tp}</td>
  977. <td class="text-center">${total_pre_tp_hs}</td>
  978. </tr>`;
  979. }
  980. $('#tj_node').html(html);
  981. $('[data-toggle="tooltip"]').tooltip();
  982. }
  983. if (showStageExponent) {
  984. // $('#total_stage').children('td').eq(1).text(ex_tp ? ZhCalc.round(ex_tp, materialExponentDecimal.tp) : '');
  985. // $('#total_stage').children('td').eq(2).text(ex_tax_tp ? ZhCalc.round(ex_tax_tp, materialExponentDecimal.tp) : '');
  986. const stage_datas = [{
  987. order: '合计',
  988. ex_tp: ex_tp ? ZhCalc.round(ex_tp, materialExponentDecimal.tp) : 0,
  989. ex_tax_tp: ex_tax_tp ? ZhCalc.round(ex_tax_tp, materialExponentDecimal.tp) : 0,
  990. }];
  991. for (const ms of materialStageData) {
  992. // if (!exponent_nodes) {
  993. // $('.ex_expr_' + ms.order).attr('data-original-title', '第' + ms.order + '期价差:' + (ms.ex_expr ? ms.ex_expr : ''));
  994. // }
  995. // $('#tj_stage_' + ms.order).children('td').eq(1).text(ms.ex_tp ? ZhCalc.round(ms.ex_tp, materialExponentDecimal.tp) : '');
  996. // $('#tj_stage_' + ms.order).children('td').eq(2).text(ms.ex_tax_tp ? ZhCalc.round(ms.ex_tax_tp, materialExponentDecimal.tp) : '');
  997. stage_datas.push({
  998. order: ' ' + ' 第' + ms.order + '期',
  999. ex_tp: ms.ex_tp ? ZhCalc.round(ms.ex_tp, materialExponentDecimal.tp) : 0,
  1000. ex_tax_tp: ms.ex_tax_tp ? ZhCalc.round(ms.ex_tax_tp, materialExponentDecimal.tp) : 0,
  1001. tip: !exponent_nodes ? '第' + ms.order + '期价差:' + (ms.ex_expr ? ms.ex_expr : '') : '',
  1002. });
  1003. if (exponent_nodes) {
  1004. const mnList = _.filter(materialExponentNodeData, { ms_id: ms.id });
  1005. for (const mn of mnList) {
  1006. stage_datas.push({
  1007. order: ' ' + ' ' + mn.name + '(' + mn.code + ')',
  1008. ex_tp: mn.ex_tp ? ZhCalc.round(mn.ex_tp, materialExponentDecimal.tp) : 0,
  1009. ex_tax_tp: mn.ex_tax_tp ? ZhCalc.round(mn.ex_tax_tp, materialExponentDecimal.tp) : 0,
  1010. tip: mn.name + '(' + mn.code + ')' + '价差:' + (mn.ex_expr ? mn.ex_expr : ''),
  1011. })
  1012. }
  1013. }
  1014. }
  1015. // if (exponent_nodes) {
  1016. // for (const mn of materialExponentNodeData) {
  1017. // $('.ex_expr_node_' + mn.id).attr('data-original-title', mn.name + '价差:' + (mn.ex_expr ? mn.ex_expr : ''));
  1018. // $('#tj_node_' + mn.id).children('td').eq(1).text(mn.ex_tp ? ZhCalc.round(mn.ex_tp, materialExponentDecimal.tp) : '');
  1019. // $('#tj_node_' + mn.id).children('td').eq(2).text(mn.ex_tax_tp ? ZhCalc.round(mn.ex_tax_tp, materialExponentDecimal.tp) : '');
  1020. // }
  1021. // }
  1022. SpreadJsObj.loadSheetData(stageTjSpread.getActiveSheet(), SpreadJsObj.DataType.Data, stage_datas);
  1023. } else {
  1024. $('#ex_expr').attr('data-original-title', '本期价差:' + (ex_expr ? ex_expr : ''));
  1025. }
  1026. }
  1027. $.divResizer({
  1028. select: '#right-spr',
  1029. callback: function () {
  1030. materialExponentSpread.refresh();
  1031. const width = (($('#right-view').width()/$('#right-view').parent('div').width())*100).toFixed();
  1032. setLocalCache('material_exponent_' + materialID, width);
  1033. }
  1034. });
  1035. $.divResizer({
  1036. select: '#main-resize',
  1037. callback: function () {
  1038. let bcontent = $(".bcontent-wrap") ? $(".bcontent-wrap").height() : 0;
  1039. $(".sp-wrap").height(bcontent-30);
  1040. const height = $('.bcontent-wrap').height();
  1041. const cutHeight = isStageSelf ? getObjHeight($('#myTab')) : 0;
  1042. const cutHeight2 = exponent_nodes ? getObjHeight($('#myTab2')) : 0;
  1043. $('.sjs-height-material').height($('.sjs-height-1').height() - cutHeight - cutHeight2);
  1044. materialExponentSpread.refresh();
  1045. if (showStageExponent) stageTjSpread.refresh();
  1046. // const height = $('#material-exponent-spread').height();
  1047. setLocalCache('material_exponent2_' + materialID, height);
  1048. }
  1049. });
  1050. // 展开收起月信息价并浏览器记住本期展开收起
  1051. $('a', '.right-nav').bind('click', function () {
  1052. //const main = $('#main-view'), tool = $('#tools-view');
  1053. const tab = $(this), tabPanel = $(tab.attr('content'));
  1054. if (!tab.hasClass('active')) {
  1055. $('a', '.side-menu').removeClass('active');
  1056. $('.tab-content .tab-select-show').removeClass('active');
  1057. tab.addClass('active');
  1058. tabPanel.addClass('active');
  1059. showSideTools(tab.hasClass('active'));
  1060. if (tab.attr('content') === '#base-tab') {
  1061. const width = (($('#right-view').width()/$('#right-view').parent('div').width())*100).toFixed();
  1062. setLocalCache('material_exponent_' + materialID, width);
  1063. }
  1064. } else {
  1065. removeLocalCache('material_exponent_' + materialID);
  1066. tab.removeClass('active');
  1067. tabPanel.removeClass('active');
  1068. showSideTools(tab.hasClass('active'));
  1069. }
  1070. materialExponentSpread.refresh();
  1071. if (showStageExponent) stageTjSpread.refresh();
  1072. });
  1073. // 根据浏览器记录展开收起
  1074. const cutHeight = isStageSelf ? getObjHeight($('#myTab')) : 0;
  1075. const cutHeight2 = exponent_nodes ? getObjHeight($('#myTab2')) : 0;
  1076. if (getLocalCache('material_exponent_' + materialID)) {
  1077. const tab = $('.right-nav a[content="#base-tab"]'), tabPanel = $(tab.attr('content'));
  1078. $('a', '.side-menu').removeClass('active');
  1079. $('.tab-content .tab-select-show').removeClass('active');
  1080. tab.addClass('active');
  1081. tabPanel.addClass('active');
  1082. $('#right-view').width(getLocalCache('material_exponent_' + materialID) + '%');
  1083. showSideTools(tab.hasClass('active'));
  1084. materialExponentSpread.refresh();
  1085. if (showStageExponent) stageTjSpread.refresh();
  1086. }
  1087. if (getLocalCache('material_exponent2_' + materialID)) {
  1088. // $('#material-exponent-spread').height(getLocalCache('material_exponent2_' + materialID));
  1089. $('.bcontent-wrap').height(getLocalCache('material_exponent2_' + materialID));
  1090. var cHeader = getObjHeight($(".c-header"));
  1091. const bcontent = $(".bcontent-wrap") ? $(".bcontent-wrap").height() : 0;
  1092. $(".sp-wrap").height(bcontent-30);
  1093. $('.sjs-height-1').height($(window).height()-cHeader-bcontent-90+53);
  1094. $('.sjs-height-material').height($('.sjs-height-1').height() - cutHeight - cutHeight2);
  1095. // var sjs1 = getObjHeight($('.sjs-height-1'));
  1096. // $(".bcontent-wrap").height($(window).height()-cHeader-sjs1-90+53);
  1097. materialExponentSpread.refresh();
  1098. if (showStageExponent) stageTjSpread.refresh();
  1099. } else {
  1100. $('.sjs-height-material').height($('.sjs-height-1').height() - cutHeight - cutHeight2);
  1101. materialExponentSpread.refresh();
  1102. if (showStageExponent) stageTjSpread.refresh();
  1103. }
  1104. function getObjHeight(select) {
  1105. return select.length > 0 ? select.outerHeight(true) : 0;
  1106. }
  1107. $.subMenu({
  1108. menu: '#sub-menu', miniMenu: '#sub-mini-menu', miniMenuList: '#mini-menu-list',
  1109. toMenu: '#to-menu', toMiniMenu: '#to-mini-menu',
  1110. key: 'menu.1.0.0',
  1111. miniHint: '#sub-mini-hint', hintKey: 'menu.hint.1.0.1',
  1112. callback: function (info) {
  1113. if (info.mini) {
  1114. $('.panel-title').addClass('fluid');
  1115. $('#sub-menu').removeClass('panel-sidebar');
  1116. } else {
  1117. $('.panel-title').removeClass('fluid');
  1118. $('#sub-menu').addClass('panel-sidebar');
  1119. }
  1120. autoFlashHeight();
  1121. materialExponentSpread.refresh();
  1122. if (showStageExponent) stageTjSpread.refresh();
  1123. }
  1124. });
  1125. });