|  | @@ -14,6 +14,59 @@ const is_numeric = (value) => {
 | 
	
		
			
				|  |  |          return !Number.isNaN(Number(value)) && value.toString().trim() !== '';
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  };
 | 
	
		
			
				|  |  | +function sortByCode(a, b) {
 | 
	
		
			
				|  |  | +    let code1 = a.code.split('-');
 | 
	
		
			
				|  |  | +    let code2 = b.code.split('-');
 | 
	
		
			
				|  |  | +    let code1length = code1.length;
 | 
	
		
			
				|  |  | +    let code2length = code2.length;
 | 
	
		
			
				|  |  | +    for (let i = 0; i < code1length; i ++) {
 | 
	
		
			
				|  |  | +        if (i+1 <= code2length) {
 | 
	
		
			
				|  |  | +            if (code1[i] != code2[i]) {
 | 
	
		
			
				|  |  | +                if (/^\d+$/.test(code1[i]) && /^\d+$/.test(code2[i])) {
 | 
	
		
			
				|  |  | +                    return parseInt(code1[i]) - parseInt(code2[i]);
 | 
	
		
			
				|  |  | +                } else if (!/^\d+$/.test(code1[i]) && /^\d+$/.test(code2[i])) {
 | 
	
		
			
				|  |  | +                    return 1;
 | 
	
		
			
				|  |  | +                } else if (/^\d+$/.test(code1[i]) && !/^\d+$/.test(code2[i])) {
 | 
	
		
			
				|  |  | +                    return -1;
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                    const str1length = code1[i].length;
 | 
	
		
			
				|  |  | +                    const str2length = code2[i].length;
 | 
	
		
			
				|  |  | +                    for (let j = 0; j < str1length; j++) {
 | 
	
		
			
				|  |  | +                        if (j+1 <= str2length) {
 | 
	
		
			
				|  |  | +                            if (code1[i].charAt(j) != code2[i].charAt(j)) {
 | 
	
		
			
				|  |  | +                                return code1[i].charAt(j).charCodeAt() - code2[i].charAt(j).charCodeAt();
 | 
	
		
			
				|  |  | +                            }  else if (j+1 == str1length && code1[i].charAt(j) == code2[i].charAt(j)) {
 | 
	
		
			
				|  |  | +                                if (str1length == str2length) {
 | 
	
		
			
				|  |  | +                                    return 0;
 | 
	
		
			
				|  |  | +                                } else {
 | 
	
		
			
				|  |  | +                                    return str1length - str2length;
 | 
	
		
			
				|  |  | +                                }
 | 
	
		
			
				|  |  | +                            }
 | 
	
		
			
				|  |  | +                        } else {
 | 
	
		
			
				|  |  | +                            if (j+1 >= str1length) {
 | 
	
		
			
				|  |  | +                                return 1;
 | 
	
		
			
				|  |  | +                            } else {
 | 
	
		
			
				|  |  | +                                return -1;
 | 
	
		
			
				|  |  | +                            }
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            } else if (i+1 == code1length && code1[i] == code2[i]) {
 | 
	
		
			
				|  |  | +                if (code1length == code2length) {
 | 
	
		
			
				|  |  | +                    return 0;
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                    return code1length - code2length;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +            if (i+1 >= code1length) {
 | 
	
		
			
				|  |  | +                return 1;
 | 
	
		
			
				|  |  | +            } else {
 | 
	
		
			
				|  |  | +                return -1;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  |  $(document).ready(() => {
 | 
	
		
			
				|  |  |      //初始化所有附件列表
 | 
	
		
			
				|  |  |      getAllList();
 | 
	
	
		
			
				|  | @@ -236,6 +289,123 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    // 差值对比信息获取
 | 
	
		
			
				|  |  | +    let czSpread = null;
 | 
	
		
			
				|  |  | +    const czSpreadSetting = {
 | 
	
		
			
				|  |  | +        cols: [
 | 
	
		
			
				|  |  | +            {title: '清单编号', colSpan: '1', rowSpan: '2', field: 'code', hAlign: 0, width: 80},
 | 
	
		
			
				|  |  | +            {title: '名称', colSpan: '1', rowSpan: '2', field: 'name', hAlign: 0, width: 120},
 | 
	
		
			
				|  |  | +            {title: '单位', colSpan: '1', rowSpan: '2', field: 'unit', hAlign: 1, width: 60},
 | 
	
		
			
				|  |  | +            {title: '单价', colSpan: '1', rowSpan: '2', field: 'unit_price', hAlign: 2, width: 60, type: 'Number', getValue: 'getValue.unit_price'},
 | 
	
		
			
				|  |  | +            {title: '变更方案|数量', colSpan: '2|1', rowSpan: '1|1', field: 'pamount', hAlign: 2, width: 60, type: 'Number', getValue: 'getValue.pamount'},
 | 
	
		
			
				|  |  | +            {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'pa_tp', hAlign: 2, width: 80, type: 'Number', getValue: 'getValue.pa_tp'},
 | 
	
		
			
				|  |  | +            {title: '变更令|数量', colSpan: '2|1', rowSpan: '1|1', field: 'camount', hAlign: 2, width: 60, type: 'Number', getValue: 'getValue.camount'},
 | 
	
		
			
				|  |  | +            {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'ca_tp', hAlign: 2, width: 80, type: 'Number', getValue: 'getValue.ca_tp'},
 | 
	
		
			
				|  |  | +            {title: '差值对比|数量', colSpan: '2|1', rowSpan: '1|1', field: 'czamount', hAlign: 2, width: 60, type: 'Number', getValue: 'getValue.czamount'},
 | 
	
		
			
				|  |  | +            {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'cz_tp', hAlign: 2, width: 80, type: 'Number', getValue: 'getValue.cz_tp'},
 | 
	
		
			
				|  |  | +        ],
 | 
	
		
			
				|  |  | +        emptyRows: 0,
 | 
	
		
			
				|  |  | +        headRows: 2,
 | 
	
		
			
				|  |  | +        headRowHeight: [25, 25],
 | 
	
		
			
				|  |  | +        defaultRowHeight: 21,
 | 
	
		
			
				|  |  | +        headerFont: '12px 微软雅黑',
 | 
	
		
			
				|  |  | +        font: '12px 微软雅黑',
 | 
	
		
			
				|  |  | +        readOnly: true,
 | 
	
		
			
				|  |  | +        localCache: {
 | 
	
		
			
				|  |  | +            key: 'changes-cz',
 | 
	
		
			
				|  |  | +            colWidth: true,
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +    const czCol = {
 | 
	
		
			
				|  |  | +        getValue: {
 | 
	
		
			
				|  |  | +            unit_price: function(data) {
 | 
	
		
			
				|  |  | +                return ZhCalc.round(data.unit_price, unitPriceUnit);
 | 
	
		
			
				|  |  | +            },
 | 
	
		
			
				|  |  | +            pa_tp: function (data) {
 | 
	
		
			
				|  |  | +                return ZhCalc.round(ZhCalc.mul(ZhCalc.round(data.unit_price, unitPriceUnit), ZhCalc.round(data.pamount, findDecimal(data.unit))), totalPriceUnit);
 | 
	
		
			
				|  |  | +            },
 | 
	
		
			
				|  |  | +            ca_tp: function (data) {
 | 
	
		
			
				|  |  | +                return ZhCalc.round(ZhCalc.mul(ZhCalc.round(data.unit_price, unitPriceUnit), ZhCalc.round(data.camount, findDecimal(data.unit))), totalPriceUnit);
 | 
	
		
			
				|  |  | +            },
 | 
	
		
			
				|  |  | +            pamount: function (data) {
 | 
	
		
			
				|  |  | +                return ZhCalc.round(data.pamount, findDecimal(data.unit));
 | 
	
		
			
				|  |  | +            },
 | 
	
		
			
				|  |  | +            camount: function (data) {
 | 
	
		
			
				|  |  | +                return ZhCalc.round(data.camount, findDecimal(data.unit));
 | 
	
		
			
				|  |  | +            },
 | 
	
		
			
				|  |  | +            czamount: function (data) {
 | 
	
		
			
				|  |  | +                return ZhCalc.sub(ZhCalc.round(data.camount, findDecimal(data.unit)), ZhCalc.round(data.pamount, findDecimal(data.unit)));
 | 
	
		
			
				|  |  | +            },
 | 
	
		
			
				|  |  | +            cz_tp: function (data) {
 | 
	
		
			
				|  |  | +                return ZhCalc.round(ZhCalc.mul(ZhCalc.round(data.unit_price, unitPriceUnit), ZhCalc.round(ZhCalc.sub(ZhCalc.round(data.camount, findDecimal(data.unit)), ZhCalc.round(data.pamount, findDecimal(data.unit))), findDecimal(data.unit))), totalPriceUnit);
 | 
	
		
			
				|  |  | +            },
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +    const czSpreadObj = {
 | 
	
		
			
				|  |  | +        makeSjsFooter: function () {
 | 
	
		
			
				|  |  | +            // 增加汇总行并设为锁定禁止编辑状态
 | 
	
		
			
				|  |  | +            czSpread.getActiveSheet().addRows(czSpread.getActiveSheet().getRowCount(), 1);
 | 
	
		
			
				|  |  | +            czSpread.getActiveSheet().setValue(czSpread.getActiveSheet().getRowCount() - 1, 0, '合计');
 | 
	
		
			
				|  |  | +            czSpread.getActiveSheet().setStyle(czSpread.getActiveSheet().getRowCount() - 1, -1, style1);
 | 
	
		
			
				|  |  | +            czSpreadObj.countSum();
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        countSum: function () {
 | 
	
		
			
				|  |  | +            const rowCount = czSpread.getActiveSheet().getRowCount();
 | 
	
		
			
				|  |  | +            let pSum = 0,
 | 
	
		
			
				|  |  | +                cSum = 0,
 | 
	
		
			
				|  |  | +                czSum = 0;
 | 
	
		
			
				|  |  | +            for (var i = 0; i < rowCount - 1; i++) {
 | 
	
		
			
				|  |  | +                pSum = ZhCalc.add(pSum, czSpread.getActiveSheet().getValue(i, 5));
 | 
	
		
			
				|  |  | +                cSum = ZhCalc.add(cSum, czSpread.getActiveSheet().getValue(i, 7));
 | 
	
		
			
				|  |  | +                czSum = ZhCalc.add(czSum, czSpread.getActiveSheet().getValue(i, 9));
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            czSpread.getActiveSheet().setValue(czSpread.getActiveSheet().getRowCount() - 1, 5, pSum !== 0 ? pSum : null);
 | 
	
		
			
				|  |  | +            czSpread.getActiveSheet().setValue(czSpread.getActiveSheet().getRowCount() - 1, 7, cSum !== 0 ? cSum : null);
 | 
	
		
			
				|  |  | +            czSpread.getActiveSheet().setValue(czSpread.getActiveSheet().getRowCount() - 1, 9, czSum !== 0 ? czSum : null);
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    $('#bgfadb').on('shown.bs.modal', function () {
 | 
	
		
			
				|  |  | +        if (!czSpread) {
 | 
	
		
			
				|  |  | +            czSpread = SpreadJsObj.createNewSpread($('#cz-spread')[0]);
 | 
	
		
			
				|  |  | +            SpreadJsObj.initSpreadSettingEvents(czSpreadSetting, czCol);
 | 
	
		
			
				|  |  | +            SpreadJsObj.initSheet(czSpread.getActiveSheet(), czSpreadSetting);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        const cList = [];
 | 
	
		
			
				|  |  | +        const newChangeList = _.cloneDeep(changeList);
 | 
	
		
			
				|  |  | +        for (const cl of newChangeList) {
 | 
	
		
			
				|  |  | +            const cIndex = _.findIndex(cList, { code: cl.code, name: cl.name, unit: cl.unit, unit_price: cl.unit_price});
 | 
	
		
			
				|  |  | +            if (cIndex !== -1) {
 | 
	
		
			
				|  |  | +                cList[cIndex].spamount = ZhCalc.add(cList[cIndex].spamount, cl.spamount);
 | 
	
		
			
				|  |  | +            } else {
 | 
	
		
			
				|  |  | +                cList.push(cl);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        // 生成差值对比数据列表
 | 
	
		
			
				|  |  | +        const czList = [];
 | 
	
		
			
				|  |  | +        const newPlanList = _.cloneDeep(planList);
 | 
	
		
			
				|  |  | +        for (const c of cList) {
 | 
	
		
			
				|  |  | +            const planInfo = _.find(newPlanList, { code: c.code, name: c.name, unit: c.unit, unit_price: c.unit_price });
 | 
	
		
			
				|  |  | +            const pamount = planInfo ? planInfo.spamount : null;
 | 
	
		
			
				|  |  | +            if (planInfo) {
 | 
	
		
			
				|  |  | +                _.remove(newPlanList, (item) => item === planInfo);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            czList.push({ code: c.code, name: c.name, unit: c.unit, unit_price: c.unit_price, camount: c.spamount, pamount });
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (newPlanList.length > 0) {
 | 
	
		
			
				|  |  | +            for (const np of newPlanList) {
 | 
	
		
			
				|  |  | +                czList.push({ code: np.code, name: np.name, unit: np.unit, unit_price: np.unit_price, camount: null, pamount: np.spamount });
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (czList.length > 0) {
 | 
	
		
			
				|  |  | +            // 按清单编号排序
 | 
	
		
			
				|  |  | +            czList.sort(sortByCode);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        // sjs设置
 | 
	
		
			
				|  |  | +        SpreadJsObj.loadSheetData(czSpread.getActiveSheet(), SpreadJsObj.DataType.Data, czList);
 | 
	
		
			
				|  |  | +        czSpreadObj.makeSjsFooter();
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      $.subMenu({
 | 
	
		
			
				|  |  |          menu: '#sub-menu', miniMenu: '#sub-mini-menu', miniMenuList: '#mini-menu-list',
 | 
	
		
			
				|  |  |          toMenu: '#to-menu', toMiniMenu: '#to-mini-menu',
 |