Преглед на файлове

变更状态及计量上限值功能

ellisran преди 1 година
родител
ревизия
068f58e036

+ 20 - 0
app/const/fun_set.js

@@ -47,6 +47,25 @@ const changeClass = [
     },
 ];
 
+// 计量调用上限,变更令里使用
+const changeState = [
+    {
+        order: 1,
+        name: '临时变更令',
+        value: 100,
+    },
+    {
+        order: 2,
+        name: '立项变更令',
+        value: 100,
+    },
+    {
+        order: 3,
+        name: '正式变更令',
+        value: 100,
+    },
+];
+
 const defaultInfo = {
     // 合同信息
     stage_start: {
@@ -55,6 +74,7 @@ const defaultInfo = {
         end_day: 0,
     },
     change_class: changeClass,
+    change_state: changeState,
 };
 
 module.exports = {

+ 1 - 0
app/const/page_show.js

@@ -46,6 +46,7 @@ const defaultSetting = {
     openChangeApply: 0,
     openChangePlan: 0,
     openChangeWhiteList: 0,
+    openChangeState: 0,
     isPreset: 0,
     isOnlyChecked: 1,
     openStageStart: 0,

+ 70 - 34
app/controller/change_controller.js

@@ -277,8 +277,10 @@ module.exports = app => {
                 if (!data.code || data.code === '') {
                     throw '变更令号不能为空';
                 }
-
-                const change = await ctx.service.change.add(tenderId, ctx.session.sessionUser.accountId, data.code, data.plan_code, data.name);
+                const projectData = await ctx.service.project.getDataById(ctx.session.sessionProject.id);
+                const fun_set = await ctx.service.project.getFunSet(projectData.fun_set);
+                const stateInfo = ctx.helper._.find(fun_set.change_state, { order: 3 });
+                const change = await ctx.service.change.add(tenderId, ctx.session.sessionUser.accountId, data.code, data.plan_code, data.name, stateInfo.value);
 
                 ctx.body = { err: 0, msg: '', data: change };
             } catch (err) {
@@ -624,6 +626,7 @@ module.exports = app => {
                     othersChange,
                     changeConst,
                     changeClass: fun_set.change_class,
+                    changeState: fun_set.change_state,
                     auditStatus,
                     auditConst: audit.flow,
                     ledgerConsts: audit.ledger.status,
@@ -641,6 +644,29 @@ module.exports = app => {
                     preUrl: '/tender/' + ctx.tender.id + '/change/' + ctx.change.cid + '/information',
                     precision: ctx.tender.info.precision,
                 };
+                // 获取是否已存在调用变更令
+                let changeUsedData = await ctx.service.stageChange.getFinalUsedData(ctx.tender.id, change.cid);
+                changeUsedData = ctx.helper._.orderBy(ctx.helper._.filter(changeUsedData, function(item) {
+                    return item.qty !== null;
+                }), ['sorder'], ['desc']);
+                const useChangeUsedData = [];
+                if (changeUsedData.length > 0) { // 防止未创建期时调用
+                    // const stage = await this.ctx.service.stage.getLastestStage(ctx.tender.id, true);
+                    for (const cu of changeUsedData) {
+                        // if (cu.sorder !== 0 ||
+                        //     (cu.sorder === 0 && !(stage.status === audit.stage.status.uncheck || stage.status === audit.stage.status.checkNo))) {
+                        const index = ctx.helper._.findIndex(useChangeUsedData, { cbid: cu.cbid });
+                        if (index !== -1) {
+                            useChangeUsedData[index].qty = ctx.helper.add(useChangeUsedData[index].qty, cu.qty);
+                        } else {
+                            useChangeUsedData.push(cu);
+                        }
+                        // }
+                    }
+                }
+                renderData.changeUsedData = useChangeUsedData;
+                renderData.stageChangeNum = this.ctx.helper.sum(changeUsedData.map(x => { return Math.abs(x.qty); }));
+
                 // 根据auditStatus状态获取的不同的数据
                 if (auditStatus === 1 || auditStatus === 2 || auditStatus === 9) {
                     renderData.changeUnits = changeConst.units;
@@ -684,9 +710,33 @@ module.exports = app => {
                     renderData.companyList = companyList;
                     // 获取已选清单
                     const changeList = await ctx.service.changeAuditList.getList(change.cid);
-                    renderData.changeList = changeList;
                     renderData.changeLedgerList = await ctx.service.changeLedger.getAllDataByCondition({ where: { tender_id: ctx.tender.id } });
                     renderData.changePosList = await ctx.service.changePos.getAllDataByCondition({ where: { tid: ctx.tender.id } });
+                    const stateInfo = ctx.helper._.find(fun_set.change_state, { order: ctx.change.state });
+                    renderData.deLimit = stateInfo.value;
+                    if (stateInfo.value !== ctx.change.delimit) {
+                        // 需要更新所有的计量上限值,除了已调用的值
+                        const updateList = [];
+                        for (const cl of changeList) {
+                            const one = {
+                                id: cl.id,
+                            };
+                            if (useChangeUsedData.length > 0 && ctx.helper._.findIndex(useChangeUsedData, { cbid: cl.id }) !== -1) {
+                                if (cl.delimit < renderData.deLimit) {
+                                    one.delimit = renderData.deLimit;
+                                    cl.delimit = renderData.deLimit;
+                                }
+                            } else if (cl.delimit !== renderData.deLimit) {
+                                one.delimit = renderData.deLimit;
+                                cl.delimit = renderData.deLimit;
+                            }
+                            if (!ctx.helper._.isEqual(one, { id: cl.id })) updateList.push(one);
+                        }
+                        console.log(updateList);
+                        if (updateList.length > 0) await ctx.service.changeAuditList.defaultUpdateRows(updateList);
+                        await ctx.service.change.defaultUpdate({ delimit: stateInfo.value }, { where: { cid: change.cid } });
+                    }
+                    renderData.changeList = changeList;
 
                     // 判断是否更新变更类别
                     if (ctx.helper._.findIndex(fun_set.change_class, { value: change.class, checked: true }) === -1) {
@@ -791,29 +841,6 @@ module.exports = app => {
                     renderData.changePosList = await ctx.service.changePos.getAllDataByCondition({ where: { tid: ctx.tender.id } });
                 }
                 renderData.auditList = auditList;
-
-                // 获取是否已存在调用变更令
-                let changeUsedData = await ctx.service.stageChange.getFinalUsedData(ctx.tender.id, change.cid);
-                changeUsedData = ctx.helper._.orderBy(ctx.helper._.filter(changeUsedData, function(item) {
-                    return item.qty !== null;
-                }), ['sorder'], ['desc']);
-                const useChangeUsedData = [];
-                if (changeUsedData.length > 0) { // 防止未创建期时调用
-                    // const stage = await this.ctx.service.stage.getLastestStage(ctx.tender.id, true);
-                    for (const cu of changeUsedData) {
-                        // if (cu.sorder !== 0 ||
-                        //     (cu.sorder === 0 && !(stage.status === audit.stage.status.uncheck || stage.status === audit.stage.status.checkNo))) {
-                        const index = ctx.helper._.findIndex(useChangeUsedData, { cbid: cu.cbid });
-                        if (index !== -1) {
-                            useChangeUsedData[index].qty = ctx.helper.add(useChangeUsedData[index].qty, cu.qty);
-                        } else {
-                            useChangeUsedData.push(cu);
-                        }
-                        // }
-                    }
-                }
-                renderData.changeUsedData = useChangeUsedData;
-                renderData.stageChangeNum = this.ctx.helper.sum(changeUsedData.map(x => { return Math.abs(x.qty); }));
                 await this.layout('change/information.ejs', renderData, 'change/information_modal.ejs');
             } catch (err) {
                 this.log(err);
@@ -836,16 +863,18 @@ module.exports = app => {
                 };
                 switch (data.type) {
                     case 'add':
-                        if (!ctx.session.sessionProject.page_show.openChangeWhiteList) {
-                            throw '空白清单添加功能未开启。';
-                        }
-                        responseData.data = await ctx.service.changeAuditList.add(data.postData);
-                        break;
                     case 'batchadd':
                         if (!ctx.session.sessionProject.page_show.openChangeWhiteList) {
                             throw '空白清单添加功能未开启。';
                         }
-                        responseData.data = await ctx.service.changeAuditList.batchAdd(data);
+                        const projectData = await ctx.service.project.getDataById(ctx.session.sessionProject.id);
+                        const fun_set = await ctx.service.project.getFunSet(projectData.fun_set);
+                        const stateInfo = ctx.helper._.find(fun_set.change_state, { order: ctx.change.state });
+                        if (data.type === 'add') {
+                            responseData.data = await ctx.service.changeAuditList.add(data.postData, stateInfo.value);
+                        } else {
+                            responseData.data = await ctx.service.changeAuditList.batchAdd(data, stateInfo.value);
+                        }
                         break;
                     case 'del':
                         await ctx.service.changeAuditList.del(data);
@@ -875,9 +904,16 @@ module.exports = app => {
                         // responseData.data = await ctx.service.changeAuditList.getList(ctx.change.cid);
                         break;
                     case 'info':
-                        await ctx.service.change.saveInfo(data.updateData);
+                        let value = 100;
+                        if (data.updateData.state && parseInt(data.updateData.state) !== ctx.change.state) {
+                            const projectData = await ctx.service.project.getDataById(ctx.session.sessionProject.id);
+                            const fun_set = await ctx.service.project.getFunSet(projectData.fun_set);
+                            const stateInfo = ctx.helper._.find(fun_set.change_state, { order: parseInt(data.updateData.state) });
+                            value = stateInfo.value;
+                        }
+                        responseData.data = await ctx.service.change.saveInfo(data.updateData, value);
                         // 取所有工料表
-                        responseData.data = '保存成功';
+                        // responseData.data = '保存成功';
                         break;
                     case 'paste_amount_rows':
                         await ctx.service.changeAuditList.saveDatas(data.updateData);

+ 3 - 2
app/controller/setting_controller.js

@@ -885,7 +885,7 @@ module.exports = app => {
                 ctx.body = { err: 0, msg: '', data: result };
             } catch (err) {
                 this.log(err);
-                this.ajaxErrorBody(error, '保存数据失败');
+                this.ajaxErrorBody(err, '保存数据失败');
             }
         }
 
@@ -971,6 +971,7 @@ module.exports = app => {
                 this.ctx.session.sessionProject.page_show.openChangeApply = data.openChangeApply ? 1 : 0;
                 this.ctx.session.sessionProject.page_show.openChangePlan = data.openChangePlan ? 1 : 0;
                 this.ctx.session.sessionProject.page_show.openChangeWhiteList = data.openChangeWhiteList ? 1 : 0;
+                this.ctx.session.sessionProject.page_show.openChangeState = data.openChangeState ? 1 : 0;
                 this.ctx.session.sessionProject.page_show.openMaterialTax = data.openMaterialTax ? 1 : 0;
                 this.ctx.session.sessionProject.page_show.openMaterialChecklist = data.openMaterialChecklist ? 1 : 0;
                 this.ctx.session.sessionProject.page_show.openMaterialSelf = data.openMaterialSelf ? 1 : 0;
@@ -1012,7 +1013,7 @@ module.exports = app => {
                 await this.layout('setting/s2b.ejs', {
                     projectData,
                     tenders,
-                })
+                });
             } catch (error) {
                 ctx.helper.log(error);
                 ctx.redirect('/dashboard');

+ 13 - 13
app/public/js/change_information_approval.js

@@ -26,6 +26,7 @@ $(document).ready(() => {
             {title: '单价', colSpan: '1', rowSpan: '2', field: 'unit_price', hAlign: 2, width: 60, type: 'Number', getValue: 'getValue.unit_price', readOnly: true},
             {title: '变更部位', colSpan: '1', rowSpan: '2', field: 'bwmx', hAlign: 0, width: 120, formatter: '@', readOnly: true},
             {title: '变更详情', colSpan: '1', rowSpan: '2', field: 'detail', hAlign: 0, width: 120, formatter: '@', readOnly: true},
+            {title: '计量上限(%)', colSpan: '1', rowSpan: '2', field: 'delimit', hAlign: 2, width: 60, formatter: '@', readOnly: true, visible: openChangeState},
             {title: '原设计|数量', colSpan: '2|1', rowSpan: '1|1', field: 'oamount', hAlign: 2, width: 60, type: 'Number', getValue: 'getValue.oamount', readOnly: true},
             {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'oa_tp', hAlign: 2, width: 80, type: 'Number', getValue: 'getValue.oa_tp', readOnly: true},
             {title: '申请变更增(+)减(-)|数量', colSpan: '2|1', rowSpan: '1|1', field: 'camount', hAlign: 2, width: 60, type: 'Number', getValue: 'getValue.camount', readOnly: true},
@@ -108,7 +109,6 @@ $(document).ready(() => {
             },
         },
     };
-
     const changeSpreadObj = {
         makeSjsFooter: function () {
             // 增加汇总行并设为锁定禁止编辑状态
@@ -162,8 +162,8 @@ $(document).ready(() => {
         },
         setRowValueAndSum: function (data, row, col) {
             for (const j in aidList) {
-                const sum = ZhCalc.round(ZhCalc.mul(data.unit_price, parseFloat(changeSpreadSheet.getValue(row, 11 + parseInt(j)*2))), totalPriceUnit);
-                changeSpreadSheet.setValue(row, 12 + j*2, sum !== 0 ? sum : null);
+                const sum = ZhCalc.round(ZhCalc.mul(data.unit_price, parseFloat(changeSpreadSheet.getValue(row, startLimit + 3 + parseInt(j)*2))), totalPriceUnit);
+                changeSpreadSheet.setValue(row, startLimit + 4 + j*2, sum !== 0 ? sum : null);
             }
             // const sum = ZhCalc.round(ZhCalc.mul(data.unit_price, data.spamount), totalPriceUnit);
             // changeSpreadSheet.setValue(row, col+1, sum !== 0 ? sum : null);
@@ -174,11 +174,11 @@ $(document).ready(() => {
             let changed_sum = 0;
             for(let i = 0; i < rowCount - 1; i++){
                 audit_sum = ZhCalc.add(audit_sum, changeSpreadSheet.getValue(i, col+1));
-                changed_sum = ZhCalc.add(changed_sum, changeSpreadSheet.getValue(i, (12 + aidList.length*2)));
+                changed_sum = ZhCalc.add(changed_sum, changeSpreadSheet.getValue(i, (startLimit + 4 + aidList.length*2)));
             }
 
             changeSpreadSheet.setValue(changeSpreadSheet.getRowCount() - 1, col+1, audit_sum !== 0 ? audit_sum : null);
-            changeSpreadSheet.setValue(changeSpreadSheet.getRowCount() - 1, (12 + aidList.length*2), changed_sum !== 0 ? changed_sum : null);
+            changeSpreadSheet.setValue(changeSpreadSheet.getRowCount() - 1, (startLimit + 4 + aidList.length*2), changed_sum !== 0 ? changed_sum : null);
         },
         countSum: function() {
             const rowCount = changeSpreadSheet.getRowCount();
@@ -186,20 +186,20 @@ $(document).ready(() => {
                 cSum = 0,
                 cdSum = 0;
             for(let i = 0; i < rowCount - 1; i++){
-                oSum = ZhCalc.add(oSum, changeSpreadSheet.getValue(i, 8));
-                cSum = ZhCalc.add(cSum, changeSpreadSheet.getValue(i, 10));
-                cdSum = ZhCalc.add(cdSum, changeSpreadSheet.getValue(i, (12 + aidList.length*2)));
+                oSum = ZhCalc.add(oSum, changeSpreadSheet.getValue(i, startLimit));
+                cSum = ZhCalc.add(cSum, changeSpreadSheet.getValue(i, startLimit + 2));
+                cdSum = ZhCalc.add(cdSum, changeSpreadSheet.getValue(i, (startLimit + 4 + aidList.length*2)));
             }
-            changeSpreadSheet.setValue(changeSpreadSheet.getRowCount() - 1, 8, oSum !== 0 ? oSum : null);
-            changeSpreadSheet.setValue(changeSpreadSheet.getRowCount() - 1, 10, cSum !== 0 ? cSum : null);
-            changeSpreadSheet.setValue(changeSpreadSheet.getRowCount() - 1, (12 + aidList.length*2), cdSum !== 0 ? cdSum : null);
+            changeSpreadSheet.setValue(changeSpreadSheet.getRowCount() - 1, startLimit, oSum !== 0 ? oSum : null);
+            changeSpreadSheet.setValue(changeSpreadSheet.getRowCount() - 1, startLimit + 2, cSum !== 0 ? cSum : null);
+            changeSpreadSheet.setValue(changeSpreadSheet.getRowCount() - 1, (startLimit + 4 + aidList.length*2), cdSum !== 0 ? cdSum : null);
             // 用户的数据合计
             for (const j in aidList) {
                 let audit_sum = 0;
                 for(let i = 0; i < rowCount - 1; i++){
-                    audit_sum = ZhCalc.add(audit_sum, changeSpreadSheet.getValue(i, 12 + j*2));
+                    audit_sum = ZhCalc.add(audit_sum, changeSpreadSheet.getValue(i, startLimit + 4 + j*2));
                 }
-                changeSpreadSheet.setValue(changeSpreadSheet.getRowCount() - 1, 12 + j*2, audit_sum !== 0 ? audit_sum : null);
+                changeSpreadSheet.setValue(changeSpreadSheet.getRowCount() - 1, startLimit + 4 + j*2, audit_sum !== 0 ? audit_sum : null);
             }
         },
         deletePress: function (sheet) {

+ 25 - 9
app/public/js/change_information_set.js

@@ -101,6 +101,7 @@ $(document).ready(() => {
             {title: '单价', colSpan: '1', rowSpan: '2', field: 'unit_price', hAlign: 2, width: 60, type: 'Number', readOnly: 'readOnly.isEdit2', getValue: 'getValue.unit_price'},
             {title: '变更部位', colSpan: '1', rowSpan: '2', field: 'bwmx', hAlign: 0, width: 120, formatter: '@', readOnly: 'readOnly.isEdit2'},
             {title: '变更详情', colSpan: '1', rowSpan: '2', field: 'detail', hAlign: 0, width: 120, formatter: '@', readOnly: false},
+            {title: '计量上限(%)', colSpan: '1', rowSpan: '2', field: 'delimit', hAlign: 2, width: 60, formatter: '@', readOnly: false, visible: openChangeState},
             {title: '原设计|数量', colSpan: '2|1', rowSpan: '1|1', field: 'oamount', hAlign: 2, width: 60, type: 'Number', readOnly: 'readOnly.isEdit', getValue: 'getValue.oamount'},
             {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'oa_tp', hAlign: 2, width: 80, type: 'Number', readOnly: true, getValue: 'getValue.oa_tp'},
             {title: '申请变更增(+)减(-)|数量', colSpan: '2|1', rowSpan: '1|1', field: 'camount', hAlign: 2, width: 60, type: 'Number', readOnly: false, getValue: 'getValue.camount'},
@@ -197,13 +198,13 @@ $(document).ready(() => {
                 cSum = 0,
                 cdSum = 0;
             for(var i = 0; i < rowCount - 1; i++){
-                oSum = ZhCalc.add(oSum, changeSpreadSheet.getValue(i, 8));
-                cSum = ZhCalc.add(cSum, changeSpreadSheet.getValue(i, 10));
-                cdSum = ZhCalc.add(cdSum, changeSpreadSheet.getValue(i, 12));
+                oSum = ZhCalc.add(oSum, changeSpreadSheet.getValue(i, startLimit));
+                cSum = ZhCalc.add(cSum, changeSpreadSheet.getValue(i, startLimit + 2));
+                cdSum = ZhCalc.add(cdSum, changeSpreadSheet.getValue(i, startLimit + 4));
             }
-            changeSpreadSheet.setValue(changeSpreadSheet.getRowCount() - 1, 8, oSum !== 0 ? oSum : null);
-            changeSpreadSheet.setValue(changeSpreadSheet.getRowCount() - 1, 10, cSum !== 0 ? cSum : null);
-            changeSpreadSheet.setValue(changeSpreadSheet.getRowCount() - 1, 12, cdSum !== 0 ? cdSum : null);
+            changeSpreadSheet.setValue(changeSpreadSheet.getRowCount() - 1, startLimit, oSum !== 0 ? oSum : null);
+            changeSpreadSheet.setValue(changeSpreadSheet.getRowCount() - 1, startLimit + 2, cSum !== 0 ? cSum : null);
+            changeSpreadSheet.setValue(changeSpreadSheet.getRowCount() - 1, startLimit + 4, cdSum !== 0 ? cdSum : null);
         },
         add: function () {
             let select = null;
@@ -586,7 +587,7 @@ $(document).ready(() => {
                 for (let iCol = 0; iCol < range.colCount; iCol++) {
                     const curCol = range.col + iCol;
                     let colSetting = info.sheet.zh_setting.cols[curCol];
-                    if ((needColAdd && curCol > 5) || (needCopyIgnore && curCol === 5)) { // 要判断是否已隐藏了变更详情,是则变更详情后面的curCol要+1
+                    if ((needColAdd && curCol > 6) || (needCopyIgnore && curCol === 6)) { // 要判断是否已隐藏了变更详情,是则变更详情后面的curCol要+1
                         const newCurCol = curCol + 1;
                         needColAdd = true;
                         colSetting = info.sheet.zh_setting.cols[newCurCol];
@@ -968,7 +969,7 @@ $(document).ready(() => {
         changeSpread.bind(spreadNS.Events.ValueChanged, changeSpreadObj.valueChanged);
         changeSpread.bind(spreadNS.Events.ButtonClicked, changeSpreadObj.buttonClicked);
         SpreadJsObj.addDeleteBind(changeSpread, changeSpreadObj.deletePress);
-        changeSpreadSheet.getCell(-1, 13).foreColor('#dc3545');
+        changeSpreadSheet.getCell(-1, startLimit + 5).foreColor('#dc3545');
         const delCommand = {
             canUndo: false,
             execute: function (context, options, isUndo) {
@@ -1822,7 +1823,7 @@ $(document).ready(() => {
         // 更新至服务器
         postData(window.location.pathname + '/save', { type:'info', updateData: changeInfo }, function (result) {
             $('.reduction-code').attr('data-code', $('input[name="code"]').val());
-            toastr.success(result);
+            toastr.success(result ? result.msg : '');
             $('#show-save-btn').hide();
             $('#sp-btn').show();
             $('.title-main').removeClass('bg-warning');
@@ -1831,6 +1832,18 @@ $(document).ready(() => {
             changeInfo.expr = changeInfo.expr.replace(/[\r\n]/g, '<br>');
             changeInfo.memo = changeInfo.memo.replace(/[\r\n]/g, '<br>');
             back_changeInfo = Object.assign({}, changeInfo);
+            if (result.changeList) {
+                deLimit = result.deLimit;
+                changeList = result.changeList;
+                SpreadJsObj.initSpreadSettingEvents(changeSpreadSetting, changeCol);
+                SpreadJsObj.initSheet(changeSpreadSheet, changeSpreadSetting);
+                SpreadJsObj.loadSheetData(changeSpreadSheet, SpreadJsObj.DataType.Data, changeList);
+                // SpreadJsObj.reLoadSheetData(changeSpreadSheet);
+                changeSpreadObj.makeSjsFooter();
+                const select = SpreadJsObj.getSelectObject(changeSpreadSheet);
+                changeSpreadObj.resetXmjSpread(select);
+                changeSpreadObj.refreshActn();
+            }
         });
         return false;
     });
@@ -2235,6 +2248,7 @@ function remakeChangeSpread(cOrder = changeOrder) {
                 gcl_id,
                 mx_id,
                 is_valuation: 1,
+                delimit: deLimit,
             };
             const radionInfo = changeList.find(function (info) {
                 //return info.code === code && (info.lid == lid || parseInt(info.lid) === parseInt(lindex)) && gcl_id == info.gcl_id && (info.bwmx === bwmx || (info.bwmx === xmj_jldy && info.mx_id && info.mx_id === mx_id)) && parseInt(info.oamount) === parseInt(oamount);
@@ -2245,6 +2259,7 @@ function remakeChangeSpread(cOrder = changeOrder) {
                 trlist.camount_expr = radionInfo.camount_expr;
                 trlist.detail = radionInfo.detail;
                 trlist.is_valuation = radionInfo.is_valuation;
+                trlist.delimit = radionInfo.delimit;
             }
             newTableList.push(trlist);
         }
@@ -2315,6 +2330,7 @@ function changeFormRemake() {
     $('#change_form select[name="quality"]').val(changeInfo.quality);
     $('#change_form select[name="company"]').val(changeInfo.company);
     $('#change_form input[name="charge"][value="'+ changeInfo.charge +'"]').prop('checked', true);
+    $('#change_form input[name="state"][value="'+ changeInfo.state +'"]').prop('checked', true);
     $('#change_form input[name="type[]"]').prop('checked', false);
     const typecheck = changeInfo.type.split(',');
     for (const type of typecheck) {

+ 16 - 16
app/public/js/change_information_show.js

@@ -17,6 +17,7 @@ $(document).ready(() => {
             {title: '单价', colSpan: '1', rowSpan: '2', field: 'unit_price', hAlign: 2, width: 60, type: 'Number', getValue: 'getValue.unit_price'},
             {title: '变更部位', colSpan: '1', rowSpan: '2', field: 'bwmx', hAlign: 0, width: 120, formatter: '@'},
             {title: '变更详情', colSpan: '1', rowSpan: '2', field: 'detail', hAlign: 0, width: 120, formatter: '@'},
+            {title: '计量上限(%)', colSpan: '1', rowSpan: '2', field: 'delimit', hAlign: 2, width: 60, formatter: '@', visible: openChangeState},
             {title: '原设计|数量', colSpan: '2|1', rowSpan: '1|1', field: 'oamount', hAlign: 2, width: 60, type: 'Number', getValue: 'getValue.oamount'},
             {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'oa_tp', hAlign: 2, width: 80, type: 'Number', getValue: 'getValue.oa_tp'},
             {title: '申请变更增(+)减(-)|数量', colSpan: '2|1', rowSpan: '1|1', field: 'camount', hAlign: 2, width: 60, type: 'Number', getValue: 'getValue.camount'},
@@ -102,7 +103,6 @@ $(document).ready(() => {
             },
         },
     };
-
     const changeSpreadObj = {
         makeSjsFooter: function () {
             // 增加汇总行并设为锁定禁止编辑状态
@@ -141,10 +141,10 @@ $(document).ready(() => {
                 for(let i = 0; i <= rowCount - 1; i++){
                     const data = {
                         unit_price: changeSpreadSheet.getValue(i, 4),
-                        amount: parseFloat(changeSpreadSheet.getValue(i, 13 + parseInt(j)*2)),
+                        amount: parseFloat(changeSpreadSheet.getValue(i, startLimit + 5 + parseInt(j)*2)),
                     };
                     const sum = ZhCalc.round(ZhCalc.mul(data.unit_price, data.amount), totalPriceUnit);
-                    changeSpreadSheet.setValue(i, 14 + j*2, sum !== 0 ? sum : null);
+                    changeSpreadSheet.setValue(i, startLimit + 6 + j*2, sum !== 0 ? sum : null);
                 }
             }
         },
@@ -155,31 +155,31 @@ $(document).ready(() => {
                 sSum = 0,
                 cdSum = 0;
             for(let i = 0; i < rowCount - 1; i++){
-                oSum = ZhCalc.add(oSum, changeSpreadSheet.getValue(i, 8));
-                cSum = ZhCalc.add(cSum, changeSpreadSheet.getValue(i, 10));
-                sSum = ZhCalc.add(sSum, changeSpreadSheet.getValue(i, 12));
-                cdSum = ZhCalc.add(cdSum, changeSpreadSheet.getValue(i, (14 + aidList.length*2)));
+                oSum = ZhCalc.add(oSum, changeSpreadSheet.getValue(i, startLimit));
+                cSum = ZhCalc.add(cSum, changeSpreadSheet.getValue(i, startLimit + 2));
+                sSum = ZhCalc.add(sSum, changeSpreadSheet.getValue(i, startLimit + 4));
+                cdSum = ZhCalc.add(cdSum, changeSpreadSheet.getValue(i, (startLimit + 6 + aidList.length*2)));
             }
-            changeSpreadSheet.setValue(changeSpreadSheet.getRowCount() - 1, 8, oSum !== 0 ? oSum : null);
-            changeSpreadSheet.setValue(changeSpreadSheet.getRowCount() - 1, 10, cSum !== 0 ? cSum : null);
-            changeSpreadSheet.setValue(changeSpreadSheet.getRowCount() - 1, 12, sSum !== 0 ? sSum : null);
-            changeSpreadSheet.setValue(changeSpreadSheet.getRowCount() - 1, (14 + aidList.length*2), cdSum !== 0 ? cdSum : null);
+            changeSpreadSheet.setValue(changeSpreadSheet.getRowCount() - 1, startLimit, oSum !== 0 ? oSum : null);
+            changeSpreadSheet.setValue(changeSpreadSheet.getRowCount() - 1, startLimit + 2, cSum !== 0 ? cSum : null);
+            changeSpreadSheet.setValue(changeSpreadSheet.getRowCount() - 1, startLimit + 4, sSum !== 0 ? sSum : null);
+            changeSpreadSheet.setValue(changeSpreadSheet.getRowCount() - 1, (startLimit + 6 + aidList.length*2), cdSum !== 0 ? cdSum : null);
             // 用户的数据合计
             for (const j in aidList) {
                 let audit_sum = 0;
                 for(let i = 0; i < rowCount - 1; i++){
-                    audit_sum = ZhCalc.add(audit_sum, changeSpreadSheet.getValue(i, 14 + j*2));
+                    audit_sum = ZhCalc.add(audit_sum, changeSpreadSheet.getValue(i, startLimit + 6 + j*2));
                 }
-                changeSpreadSheet.setValue(changeSpreadSheet.getRowCount() - 1, 14 + j*2, audit_sum !== 0 ? audit_sum : null);
+                changeSpreadSheet.setValue(changeSpreadSheet.getRowCount() - 1, startLimit + 6 + j*2, audit_sum !== 0 ? audit_sum : null);
             }
         },
         showHideAudit: function (show = false) {
             const count = changeSpreadSetting.cols.length;
-            for (let i = 13; i < count - 2; i++) {
+            for (let i = startLimit + 5; i < count - 2; i++) {
                 changeSpreadSheet.setColumnVisible(i, show, GC.Spread.Sheets.SheetArea.viewport);
             }
-            changeSpreadSheet.setColumnVisible(11, !show, GC.Spread.Sheets.SheetArea.viewport);
-            changeSpreadSheet.setColumnVisible(12, !show, GC.Spread.Sheets.SheetArea.viewport);
+            changeSpreadSheet.setColumnVisible(startLimit + 3, !show, GC.Spread.Sheets.SheetArea.viewport);
+            changeSpreadSheet.setColumnVisible(startLimit + 4, !show, GC.Spread.Sheets.SheetArea.viewport);
         }
     };
 

+ 48 - 3
app/service/change.js

@@ -81,7 +81,7 @@ module.exports = app => {
             }
         }
 
-        async add(tenderId, userId, code, plan_code, name) {
+        async add(tenderId, userId, code, plan_code, name, delimit = 100) {
             const sql = 'SELECT COUNT(*) as count FROM ?? WHERE `tid` = ? AND ((`code` = ? AND `status` != ?) OR (`p_code` = ? AND `status` = ?))';
             const sqlParam = [this.tableName, tenderId, code, audit.flow.status.checked, code, audit.flow.status.checked];
             const codeCount = await this.db.queryOne(sql, sqlParam);
@@ -106,6 +106,8 @@ module.exports = app => {
                     code,
                     name,
                     plan_code,
+                    state: 3,
+                    delimit,
                     // tp_decimal: this.ctx.tender.info.decimal.tp,
                     // up_decimal: this.ctx.tender.info.decimal.up,
                 };
@@ -680,19 +682,62 @@ module.exports = app => {
          * @param {int} tenderId - 标段id
          * @return {void}
          */
-        async saveInfo(postData) {
+        async saveInfo(postData, delimit = 100) {
             // 初始化事务
             const transaction = await this.db.beginTransaction();
             let result = false;
             try {
+                result = {};
                 const options = {
                     where: {
                         cid: this.ctx.change.cid,
                     },
                 };
+                if (postData.state && parseInt(postData.state) !== this.ctx.change.state) {
+                    // 变更清单需要同步设置计量上限值
+                    // 判断是否存在已调用清单,并判断新上限值是否比它小,更新计量上限值
+                    const changeList = await this.ctx.service.changeAuditList.getList(this.ctx.change.cid);
+                    // 获取是否已存在调用变更令
+                    let changeUsedData = await this.ctx.service.stageChange.getFinalUsedData(this.ctx.tender.id, this.ctx.change.cid);
+                    changeUsedData = this._.orderBy(this._.filter(changeUsedData, function(item) {
+                        return item.qty !== null;
+                    }), ['sorder'], ['desc']);
+                    const useChangeUsedData = [];
+                    if (changeUsedData.length > 0) { // 防止未创建期时调用
+                        for (const cu of changeUsedData) {
+                            const index = this._.findIndex(useChangeUsedData, { cbid: cu.cbid });
+                            if (index !== -1) {
+                                useChangeUsedData[index].qty = this.ctx.helper.add(useChangeUsedData[index].qty, cu.qty);
+                            } else {
+                                useChangeUsedData.push(cu);
+                            }
+                        }
+                    }
+                    const updateList = [];
+                    for (const cl of changeList) {
+                        const one = {
+                            id: cl.id,
+                        };
+                        if (useChangeUsedData.length > 0 && this._.findIndex(useChangeUsedData, { cbid: cl.id }) !== -1) {
+                            if (cl.delimit < delimit) {
+                                one.delimit = delimit;
+                                cl.delimit = delimit;
+                            }
+                        } else if (cl.delimit !== delimit) {
+                            one.delimit = delimit;
+                            cl.delimit = delimit;
+                        }
+                        if (!this._.isEqual(one, { id: cl.id })) updateList.push(one);
+                    }
+                    if (updateList.length > 0) await transaction.updateRows(this.ctx.service.changeAuditList.tableName, updateList);
+                    result.changeList = changeList;
+                    result.deLimit = delimit;
+                    if (this.ctx.change.delimit !== delimit) postData.delimit = delimit;
+                }
+
                 await transaction.update(this.tableName, postData, options);
                 await transaction.commit();
-                result = true;
+                result.msg = '保存成功';
             } catch (error) {
                 await transaction.rollback();
                 result = false;

+ 4 - 2
app/service/change_audit_list.js

@@ -67,7 +67,7 @@ module.exports = app => {
          * 添加空白变更清单
          * @return {void}
          */
-        async add(data) {
+        async add(data, delimit = 100) {
             if (!this.ctx.tender || !this.ctx.change) {
                 throw '数据错误';
             }
@@ -107,6 +107,7 @@ module.exports = app => {
                     gcl_id: '',
                     order,
                     is_valuation: 1,
+                    delimit,
                 };
                 // 新增工料
                 const result = await transaction.insert(this.tableName, insertData);
@@ -125,7 +126,7 @@ module.exports = app => {
          * 批量添加空白变更清单
          * @return {void}
          */
-        async batchAdd(data) {
+        async batchAdd(data, delimit = 100) {
             if (!this.ctx.tender || !this.ctx.change) {
                 throw '数据错误';
             }
@@ -171,6 +172,7 @@ module.exports = app => {
                         gcl_id: '',
                         order: order ? order + i : null,
                         is_valuation: 1,
+                        delimit,
                     };
                     insertArray.push(insertData);
                 }

+ 39 - 10
app/view/change/information.ejs

@@ -26,7 +26,7 @@
                 <% } %>
                 </div>
                 <% if (auditStatus === 1 || auditStatus === 2 || auditStatus === 9) { %>
-                    <div class="d-inline-block ml-3">
+                    <div class="d-inline-block ml-1">
                         <a href="#addlist" data-toggle="modal" class="btn btn-sm btn-light text-primary" id="open-list-modal" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="添加清单"><i class="fa fa-plus" aria-hidden="true"></i> <span class="order_text"><% if (change.order_by === 0) { %>添加<% } else { %>插入<% } %></span>台账清单</a>
                     </div>
                     <% if (ctx.session.sessionProject.page_show.openChangeWhiteList) { %>
@@ -34,7 +34,7 @@
                         <a href="javascript:void(0);" class="btn btn-sm btn-light text-primary" id="add-white-btn" data-original-title="添加清单"><i class="fa fa-plus" aria-hidden="true"></i> <span class="order_text"><% if (change.order_by === 0) { %>添加<% } else { %>插入<% } %></span>空白清单</a>
                     </div>
                     <% } %>
-                    <div class="d-inline-block mr-3">
+                    <div class="d-inline-block mr-2">
                         <button type="button" class="btn btn-sm btn-light text-primary dropdown-toggle" data-toggle="dropdown" id="bpaixu">清单排序:<% if (change.order_by === 0) { %>清单编号<% } else { %>添加顺序<% } %></button>
                         <div class="dropdown-menu" aria-labelledby="bpaixu">
                             <ul class="list-unstyled px-3 mb-0">
@@ -58,19 +58,19 @@
                         <a href="javascript:void(0)" id="down-move" class="btn btn-sm btn-light text-primary" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="下移"><i class="fa fa-arrow-down" aria-hidden="true"></i></a>
                     </div>
                 <% } %>
-                <div class="d-inline-block">
-                    <div class="input-group input-group-sm ml-2">
+                <% if (showPlanBtn) { %>
+                <div class="d-inline-block mr-2">
+                    <a class="btn btn-sm btn-primary" href="#bgfadb" data-toggle="modal" data-target="#bgfadb">差值对比</a>
+                </div>
+                <% } %>
+                <div class="d-inline-block mr-2">
+                    <div class="input-group input-group-sm">
                         <div class="input-group-prepend">
                             <span class="input-group-text" id="basic-addon1">表达式</span>
                         </div>
                         <input type="text" class="form-control form-control-sm m-0" id="camount-expr" readonly="readOnly" autocomplete="off">
                     </div>
                 </div>
-                <% if (showPlanBtn) { %>
-                <div class="d-inline-block ml-3">
-                    <a class="btn btn-sm btn-primary" href="#bgfadb" data-toggle="modal" data-target="#bgfadb">差值对比</a>
-                </div>
-                <% } %>
                 <div class="pull-right mr-3" id="sp-btn">
                     <!--info状态区分-->
                     <% if (auditStatus === 1) { %>
@@ -110,7 +110,7 @@
                 <!--info状态区分-->
                 <% if (auditStatus === 1 || auditStatus === 2 || auditStatus === 9) { %>
                     <div class="pull-right px-3" id="show-save-btn" style="display: none">
-                        <span>您修改了变更信息,记得保存修改。</span>
+<!--                        <span>您修改了变更信息,记得保存修改。</span>-->
                         <button class="btn btn-sm btn-primary save_change_btn" id="save_change"><i class="fa fa-save"></i> 保存修改</button>
                         <button class="btn btn-sm btn-light" id="cancel_change">取消</button>
                     </div>
@@ -149,6 +149,19 @@
                         <div class="sjs-sh-1" style="overflow-y: auto;">
                             <% if (auditStatus === 1 || auditStatus === 2 || auditStatus === 9) { %>
                             <form class="p-2" action="/tender/<%- change.tid %>/change/<%- change.cid %>/information/save?_csrf_j=<%= ctx.csrf %>" method="post" id="change_form">
+                                <% if (ctx.session.sessionProject.page_show.openChangeState) { %>
+                                <div class="form-group">
+                                    <label>变更状态</label>
+                                    <div>
+                                        <% for (const cs of changeState) { %>
+                                        <div class="form-check form-check-inline">
+                                            <input class="form-check-input" type="radio" id="state_<%- cs.order %>" value="<%- cs.order %>" name="state" <% if (cs.order === change.state) { %>checked<% } %>>
+                                            <label class="form-check-label" for="state_<%- cs.order %>"><%- cs.name %></label>
+                                        </div>
+                                        <% } %>
+                                    </div>
+                                </div>
+                                <% } %>
                                 <div class="form-group">
                                     <label><b class="text-danger">*&nbsp;</b>申请编号</label>
                                     <a href="javascript:void(0);" class="pull-right reduction-code" data-toggle="tooltip" data-placement="bottom" title="" data-code="<%- change.code %>" data-original-title="重置"><i class="fa fa-repeat"></i></a>
@@ -256,6 +269,18 @@
                             </form>
                             <% } else { %>
                             <form class="p-2">
+                                <% if (ctx.session.sessionProject.page_show.openChangeState) { %>
+                                <div class="form-group">
+                                    <label>变更状态</label>
+                                    <div>
+                                        <% const cState = ctx.helper._.find(changeState, { order: change.state }) %>
+                                        <div class="form-check form-check-inline">
+                                            <input class="form-check-input" type="radio" id="state_<%- cState.order %>" name="state" disabled checked>
+                                            <label class="form-check-label" for="state_<%- cState.order %>"><%- cState.name %></label>
+                                        </div>
+                                    </div>
+                                </div>
+                                <% } %>
                                 <div class="form-group">
                                     <label>申请编号</label>
                                     <input class="form-control form-control-sm" value="<%- change.code %>" type="text" readonly>
@@ -474,6 +499,8 @@
             }
         }
     }
+    const openChangeState = <%- ctx.session.sessionProject.page_show.openChangeState ? true : false %>;
+    const startLimit = 9;
 </script>
 <% if (auditStatus === 1 || auditStatus === 2 || auditStatus === 9) { %>
 <script>
@@ -506,12 +533,14 @@
         quality: '<%- change.quality %>',
         company: JSON.parse(unescape('<%- escape(JSON.stringify((change.company ? change.company : (companyList && companyList[0] ? companyList[0].name : (unitList && unitList[0] ? unitList[0].name : ''))))) %>')),
         charge: '<%- change.charge %>',
+        state: '<%- change.state %>',
         w_code: JSON.parse(unescape('<%- escape(JSON.stringify(change.w_code ? change.w_code : '')) %>')),
     };
     let changeInfo = Object.assign({}, back_changeInfo);
     let changeUsedData = JSON.parse(unescape('<%- escape(JSON.stringify(changeUsedData)) %>'));
     let changeOrder = parseInt('<%- change.order_by %>');
     const openChangeWhiteList = <%- ctx.session.sessionProject.page_show.openChangeWhiteList %>;
+    let deLimit = parseInt('<%- deLimit %>');
     console.log(changeInfo);
     console.log(changeUsedData);
 </script>

+ 78 - 11
app/view/setting/fun.ejs

@@ -178,14 +178,14 @@
                                             </div>
                                             <a class="pull-right mr-3"  href="#bgclass" data-toggle="modal" data-target="#bgclass">设置</a>
                                         </div>
-<!--                                        <div class="mb-1">-->
-<!--                                            <div class="form-check form-check-inline">-->
-<!--                                                <input class="form-check-input" type="checkbox" id="inlineCheckbox12" value="option1">-->
-<!--                                                <label class="form-check-label" for="inlineCheckbox12">开启变更令状态功能 </label>-->
-<!--                                                <a href=""  data-toggle="tooltip" data-placement="bottom" title="" data-original-title="变更令提供临时、立项、批复状态,可设置计量上限"><i class="fa fa-question-circle "></i></a>-->
-<!--                                            </div>-->
-<!--                                            <a class="pull-right mr-3"  href="#bgstatus" data-toggle="modal" data-target="#bgstatus">设置(未勾选,灰选不可用)</a>-->
-<!--                                        </div>-->
+                                        <div class="mb-1">
+                                            <div class="form-check form-check-inline">
+                                                <input class="form-check-input" type="checkbox" id="openChangeState" <% if (ctx.session.sessionProject.page_show.openChangeState) { %>checked<% } %> onchange="updateSetting();">
+                                                <label class="form-check-label" for="openChangeState">开启变更令状态功能 </label>&nbsp;
+                                                <a href="javascript:void(0);"  data-toggle="tooltip" data-placement="bottom" title="" data-original-title="变更令提供临时、立项、批复状态,可设置计量上限"><i class="fa fa-question-circle "></i></a>
+                                            </div>
+                                            <a class="pull-right mr-3 <% if (!ctx.session.sessionProject.page_show.openChangeState) { %>text-secondary<% } %>" href="javascript:void(0);" id="openBgStatus">设置</a>
+                                        </div>
                                         <div class="mb-1">
                                             <div class="form-check form-check-inline">
                                                 <input class="form-check-input" type="checkbox" id="openChangeWhiteList" <% if (ctx.session.sessionProject.page_show.openChangeWhiteList) { %>checked<% } %> onchange="updateSetting();">
@@ -254,6 +254,7 @@
 <script src="/public/js/setting.js"></script>
 <script>
     let changeClass = JSON.parse(unescape('<%- escape(JSON.stringify(funSet.change_class)) %>'));
+    let changeState = JSON.parse(unescape('<%- escape(JSON.stringify(funSet.change_state)) %>'));
     $(() => {
         autoFlashHeight();
         // 自定义变更类别
@@ -289,8 +290,40 @@
         $('#set_change_class_btn').click(function () {
             updateSetting(false, 1);
         });
+
+        $('#openBgStatus').click(function () {
+            if ($('#openChangeState').is(':checked')) {
+                $('#bgstatus').modal('show');
+            }
+        });
+
+        $("#bgstatus").on('show.bs.modal', function () {
+            let html = '';
+            for (const cs of changeState) {
+                html += `<tr data-order="${cs.order}">
+                        <td>${cs.name}</td>
+                        <td>
+                            <div class="input-group input-group-sm" style="width:90px">
+                                <input type="number" class="form-control" max="100" min="0" step="1" value="${cs.value}">
+                                <div class="input-group-append">
+                                    <span class="input-group-text" id="set_change_state_btn">%</span>
+                                </div>
+                            </div>
+                        </td>
+                    </tr>`;
+            }
+            $('#change_state_table').html(html);
+        });
+
+        $('#set_change_state_btn').click(function () {
+            if ($('#openChangeState').is(':checked')) {
+                updateSetting(false, 2);
+            } else {
+                toastr.error('未开启变更令状态功能,不能设置计量上限默认值');
+            }
+        });
     });
-    const updateSetting = function (tab = false, setChangeClass = false) {
+    const updateSetting = function (tab = false, set_type = 0) {
         if (!$('#openChangeApply')[0].checked && $('#openChangeProject')[0].checked && tab === 1) {
             $('#openChangeApply').prop('checked', true);
             $('#openChangePlan').prop('checked', true);
@@ -357,7 +390,8 @@
             $('#end_month').removeAttr('disabled');
             $('#end_day').removeAttr('disabled');
         }
-        if (setChangeClass) {
+        if (set_type === 1) {
+            // 自定义变更类别
             const change_class = [];
             let flag = false;
             let allUnchecked = true;
@@ -400,6 +434,29 @@
                 return;
             }
             pushData.change_class = change_class;
+        } else if (set_type === 2) {
+            // 变更令状态功能-设置计量调用上限
+            const change_state = [];
+            let flag = false;
+            const reg = /^[1-9]\d{0,2}$|^0|^100$/;
+            $('#change_state_table tr').each(function () {
+                const one_state = _.find(changeState, { order: parseInt($(this).attr('data-order'))});
+                const value = parseFloat($(this).find('input[type="number"]').val());
+                if (!(_.isNumber(value) && reg.test(value))) {
+                    toastr.error(one_state.name + '的计量上限默认值只能输入0-100之间的整数');
+                    flag = true;
+                }
+                const one_updateState = {
+                    order: one_state.order,
+                    name: one_state.name,
+                    value: value,
+                }
+                change_state.push(one_updateState);
+            });
+            if (flag) {
+                return;
+            }
+            pushData.change_state = change_state;
         }
         postData('/setting/fun/update', {
             imType: parseInt($('[name=im_type]:checked').val()),
@@ -413,6 +470,7 @@
             openChangeApply: $('#openChangeApply')[0].checked,
             openChangePlan: $('#openChangePlan')[0].checked,
             openChangeWhiteList: $('#openChangeWhiteList')[0].checked,
+            openChangeState: $('#openChangeState')[0].checked,
             openMaterialTax: $('#openMaterialTax')[0].checked,
             openMaterialChecklist: $('#openMaterialChecklist')[0].checked,
             openMaterialSelf: $('#openMaterialSelf')[0].checked,
@@ -420,10 +478,19 @@
             openStageStart: $('#openStageStart')[0].checked,
             addFunSet: _.size(pushData) !== 0 ? pushData : null,
         }, function (result) {
-            if (setChangeClass) {
+            if ($('#openChangeState').is(':checked')) {
+                $('#openBgStatus').removeClass('text-secondary');
+            } else {
+                $('#openBgStatus').addClass('text-secondary');
+            }
+            if (set_type === 1) {
                 changeClass = pushData.change_class;
                 toastr.success('设置成功');
                 $('#bgclass').modal('hide');
+            } else if (set_type === 2) {
+                changeState = pushData.change_state;
+                toastr.success('设置成功');
+                $('#bgstatus').modal('hide');
             }
         });
     }

+ 37 - 0
app/view/setting/fun_modal.ejs

@@ -28,3 +28,40 @@
         </div>
     </div>
 </div>
+<!--设置变更令状态对应的上限-->
+<div class="modal fade" id="bgstatus" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">设置计量调用上限</h5>
+            </div>
+            <div class="modal-body">
+                <table class="table table-hover table-bordered">
+                    <thead class="text-center"><tr><th>状态</th><th>计量上限默认值</th></tr></thead>
+                    <tbody id="change_state_table">
+                    <% for (const cs of funSet.change_state) { %>
+                    <tr data-order="<%- cs.order %>">
+                        <td><%- cs.name %></td>
+                        <td>
+                            <div class="input-group input-group-sm" style="width:90px">
+                                <input type="number" class="form-control" min="0" max="100" step="1" value="<%- cs.value %>">
+                                <div class="input-group-append">
+                                    <span class="input-group-text">%</span>
+                                </div>
+                            </div>
+                        </td>
+                    </tr>
+                    <% } %>
+                    </tbody>
+                </table>
+            </div>
+            <div class="modal-footer">
+                <div class="mr-auto">
+                    <span class="text-warning">计量比例只用于初始化变更令清单</span>
+                </div>
+                <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">关闭</button>
+                <button type="button" class="btn btn-sm btn-primary" id="set_change_state_btn">确认</button>
+            </div>
+        </div>
+    </div>
+</div>

+ 9 - 0
sql/update.sql

@@ -12,3 +12,12 @@ ADD COLUMN `camount_expr` varchar(500) DEFAULT '' COMMENT '变更数量计算式
 
 ALTER TABLE `zh_change_audit_list`
 ADD COLUMN `is_valuation` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否计价' AFTER `spamount`;
+
+ALTER TABLE `zh_change_audit_list`
+ADD COLUMN `delimit` int(4) NOT NULL DEFAULT 100 COMMENT '计量上限值';
+
+ALTER TABLE `zh_change`
+ADD COLUMN `state` tinyint(1) NOT NULL DEFAULT 3 COMMENT '变更令状态(计量上限设置使用)';
+
+ALTER TABLE `zh_change`
+ADD COLUMN `delimit` int(4) NOT NULL DEFAULT 100 COMMENT '计量上限值(用于对比项目及更新清单上限值)' AFTER `state`;