Browse Source

变更方案清单及审批

laiguoran 3 years ago
parent
commit
242e3375eb

+ 1 - 0
app/const/audit.js

@@ -597,6 +597,7 @@ const pushType = {
     advance: 6,
     changeProject: 7,
     changeApply: 8,
+    changePlan: 9,
 };
 
 module.exports = {

+ 34 - 23
app/controller/change_controller.js

@@ -2001,7 +2001,7 @@ module.exports = app => {
                 }
             }
             // 获取审批流程中左边列表
-            ctx.change.auditors2 = ctx.change.status === auditConst.status.back && ctx.change.user_id !== ctx.session.sessionUser.accountId ?
+            ctx.change.auditors2 = ctx.change.status === auditConst.status.back && ctx.change.uid !== ctx.session.sessionUser.accountId ?
                 await ctx.service.changeProjectAudit.getAuditorsWithOwner(ctx.change.id, times) :
                 await ctx.service.changeProjectAudit.getAuditorsWithOwner(ctx.change.id, ctx.change.times);
             if (ctx.change.status === auditConst.status.uncheck || ctx.change.status === auditConst.status.back) {
@@ -2589,7 +2589,7 @@ module.exports = app => {
                 }
             }
             // 获取审批流程中左边列表
-            ctx.change.auditors2 = ctx.change.status === auditConst.status.checkNo && ctx.change.user_id !== ctx.session.sessionUser.accountId ?
+            ctx.change.auditors2 = ctx.change.status === auditConst.status.checkNo && ctx.change.uid !== ctx.session.sessionUser.accountId ?
                 await ctx.service.changeApplyAudit.getAuditorsWithOwner(ctx.change.id, times) :
                 await ctx.service.changeApplyAudit.getAuditorsWithOwner(ctx.change.id, ctx.change.times);
             if (ctx.change.status === auditConst.status.uncheck || ctx.change.status === auditConst.status.checkNo) {
@@ -3089,7 +3089,7 @@ module.exports = app => {
                 }
                 const data = JSON.parse(ctx.request.body.data);
                 if (!data.code || data.code === '') {
-                    throw '变更申请编号不能为空';
+                    throw '变更方案编号不能为空';
                 }
 
                 const change = await ctx.service.changePlan.add(tenderId, ctx.session.sessionUser.accountId, data.code, data.apply_code, data.name);
@@ -3110,7 +3110,7 @@ module.exports = app => {
             try {
                 const result = await ctx.service.changePlan.delete(ctx.request.body.cpid);
                 if (!result) {
-                    throw '删除变更立项失败';
+                    throw '删除变更方案失败';
                 }
                 ctx.redirect(ctx.request.header.referer);
             } catch (err) {
@@ -3136,7 +3136,7 @@ module.exports = app => {
                 }
             }
             // 获取审批流程中左边列表
-            ctx.change.auditors2 = ctx.change.status === auditConst.status.checkNo && ctx.change.user_id !== ctx.session.sessionUser.accountId ?
+            ctx.change.auditors2 = ctx.change.status === auditConst.status.checkNo && ctx.change.uid !== ctx.session.sessionUser.accountId ?
                 await ctx.service.changePlanAudit.getAuditorsWithOwner(ctx.change.id, times) :
                 await ctx.service.changePlanAudit.getAuditorsWithOwner(ctx.change.id, ctx.change.times);
             if (ctx.change.status === auditConst.status.uncheck || ctx.change.status === auditConst.status.checkNo) {
@@ -3148,11 +3148,22 @@ module.exports = app => {
             try {
                 const whiteList = this.ctx.app.config.multipart.whitelist;
                 const tender = await ctx.service.tender.getDataById(ctx.tender.id);
+                await this._getChangePlanAuditViewData(ctx);
                 // 获取附件列表
                 const fileList = await ctx.service.changePlanAtt.getAllChangePlanAtt(ctx.tender.id, ctx.change.id);
                 // 获取清单列表
                 const changeList = await ctx.service.changePlanList.getList(ctx.change.id);
-                await this._getChangePlanAuditViewData(ctx);
+                if (ctx.change.status === audit.changeApply.status.checking || ctx.change.status === audit.changeApply.status.checked) {
+                    const listAudits = await ctx.service.changePlanAudit.getAuditGroupByList(ctx.change.id, ctx.change.times);
+                    ctx.change.listAudits = listAudits;
+                    for (const cl of changeList) {
+                        const audit_amount = cl.audit_amount !== null && cl.audit_amount !== '' ? cl.audit_amount.split(',') : '';
+                        // 清单表页赋值
+                        for (const [index, au] of listAudits.entries()) {
+                            cl['audit_amount_' + au.aid] = ctx.change.shenpiPower && au.aid === ctx.session.sessionUser.accountId ? cl.spamount : (audit_amount[index] ? parseFloat(audit_amount[index]) : null);
+                        }
+                    }
+                }
                 const renderData = {
                     tender,
                     change: ctx.change,
@@ -3168,7 +3179,7 @@ module.exports = app => {
                     upUnit: ctx.tender.info.decimal.up,
                     changeUnits: changeConst.units,
                     precision: ctx.tender.info.precision,
-                    returnUrl: this.app._.includes(ctx.request.headers.referer, '/tender/' + ctx.tender.id + '/change/plan') ? ctx.request.headers.referer : null,
+                    returnUrl: this.app._.includes(ctx.request.headers.referer, '/tender/' + ctx.tender.id + '/change/plan') && !this.app._.includes(ctx.request.headers.referer, '/tender/' + ctx.tender.id + '/change/plan/' + ctx.change.id + '/information') ? ctx.request.headers.referer : null,
                     jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.change.plan_information),
                     preUrl: '/tender/' + ctx.tender.id + '/change/plan/' + ctx.change.id + '/information',
                 };
@@ -3494,7 +3505,9 @@ module.exports = app => {
                         responseData.data = await ctx.service.changePlanList.batchAdd(data);
                         break;
                     case 'del':
-                        await ctx.service.changePlanList.del(data.id);
+                        await ctx.service.changePlanList.del(data.ids);
+                        // 取所有工料表
+                        responseData.data = await ctx.service.changePlanList.getList(ctx.change.id);
                         break;
                     case 'update':
                         // if (data.updateData.code === '' || data.updateData.code === null) {
@@ -3514,21 +3527,19 @@ module.exports = app => {
                         }
                         break;
                     case 'paste_amount_rows':
-                        // await ctx.service.changeAuditList.saveDatas(data.updateData);
-                        // let changeList = await ctx.service.changeAuditList.getList(ctx.change.cid);
-                        // const auditList2 = await ctx.service.changeAudit.getListGroupByTimes(ctx.change.cid, ctx.change.times);
-                        // changeList = JSON.parse(JSON.stringify(changeList.sort())).sort().sort();
-                        // for (const cl of changeList) {
-                        //     const audit_amount = cl.audit_amount !== null && cl.audit_amount !== '' ? cl.audit_amount.split(',') : '';
-                        //     // 清单表页赋值
-                        //     for (const [index, au] of auditList2.entries()) {
-                        //         if (au.usite !== 0) {
-                        //             cl['audit_amount_' + au.uid] = au.uid === ctx.session.sessionUser.accountId ? cl.spamount : (audit_amount[index - 1] ? audit_amount[index - 1] : null);
-                        //         }
-                        //     }
-                        // }
-                        // // 取所有工料表
-                        // responseData.data = changeList;
+                        await ctx.service.changePlanList.saveDatas(data.updateData);
+                        const changeList = await ctx.service.changePlanList.getList(ctx.change.id);
+                        const listAudits = await ctx.service.changePlanAudit.getAuditGroupByList(ctx.change.id, ctx.change.times);
+                        for (const cl of changeList) {
+                            // 清单表页赋值
+                            const audit_amount = cl.audit_amount !== null && cl.audit_amount !== '' ? cl.audit_amount.split(',') : '';
+                            // 清单表页赋值
+                            for (const [index, au] of listAudits.entries()) {
+                                cl['audit_amount_' + au.aid] = ctx.change.shenpiPower && au.aid === ctx.session.sessionUser.accountId ? cl.spamount : (audit_amount[index] ? parseFloat(audit_amount[index]) : null);
+                            }
+                        }
+                        // 取所有工料表
+                        responseData.data = changeList;
                         break;
                     default: throw '参数有误';
                 }

+ 1 - 0
app/middleware/change_plan_check.js

@@ -96,6 +96,7 @@ module.exports = options => {
             }
             // 调差的readOnly 指表格和页面只能看不能改,和审批无关
             change.readOnly = !((change.status === status.uncheck || change.status === status.checkNo) && accountId === change.uid);
+            change.shenpiPower = change.status === status.checking && change.curAuditor.aid === accountId;
             this.change = change;
             yield next;
         } catch (err) {

+ 8 - 0
app/public/js/change_plan_audit.js

@@ -197,6 +197,14 @@ function checkAuditorFrom () {
         toastr.error('变更原因不能为空');
         flag = true;
     }
+    // 判断变更清单是否有空值
+    const nullCodeList = _.filter(changeList, function(item) {
+        return item.code === null || item.code === '';
+    });
+    if (nullCodeList.length > 0) {
+        toastr.error('变更清单都需要设置清单编号才能上报');
+        flag = true;
+    }
     if (flag) {
         return false;
     }

+ 306 - 121
app/public/js/change_plan_information.js

@@ -188,6 +188,8 @@ $(document).ready(() => {
             {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: 'readOnly.isEdit', getValue: 'getValue.camount'},
             {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'ca_tp', hAlign: 2, width: 80, type: 'Number', readOnly: true, getValue: 'getValue.ca_tp'},
+            {title: '审批后变更|数量', colSpan: '2|1', rowSpan: '1|1', field: 'samount', hAlign: 2, width: 60, type: 'Number', getValue: 'getValue.samount'},
+            {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'sa_tp', hAlign: 2, width: 80, type: 'Number', readOnly: true, getValue: 'getValue.sa_tp'},
         ],
         emptyRows: !readOnly ? 3 : 0,
         headRows: 2,
@@ -195,12 +197,35 @@ $(document).ready(() => {
         defaultRowHeight: 21,
         headerFont: '12px 微软雅黑',
         font: '12px 微软雅黑',
-        readOnly: readOnly,
+        readOnly: change.status === auditConst.status.checking ? false : readOnly,
         localCache: {
             key: 'changes-plan-list-spread',
             colWidth: true,
         }
     };
+    console.log(changeList, change.listAudits);
+
+    if (change.status === auditConst.status.checking || change.status === auditConst.status.checked) {
+        for (const audit of change.listAudits) {
+            // const userinfo = _.find(auditList2, { 'aid': aid });
+            const newColcount = {
+                title: audit.name + ' 审批|数量',
+                colSpan: '2|1', rowSpan: '1|1',
+                field: 'audit_amount_' + audit.aid,
+                hAlign: 2, width: 60, type: 'Number',
+                readOnly: !(change.shenpiPower && audit.aid === parseInt(cur_uid))
+            };
+            const newColTp = {
+                title: '|金额',
+                colSpan: '|1', rowSpan: '|1',
+                field: 'sa_tp_' + audit.aid,
+                hAlign: 2, width: 80, type: 'Number',
+                readOnly: true
+            };
+            changeSpreadSetting.cols.push(newColcount);
+            changeSpreadSetting.cols.push(newColTp);
+        }
+    }
 
     const changeCol = {
         getValue: {
@@ -219,6 +244,12 @@ $(document).ready(() => {
             camount: function (data) {
                 return ZhCalc.round(data.camount, findDecimal(data.unit));
             },
+            samount: function (data) {
+                return ZhCalc.round(data.samount, findDecimal(data.unit));
+            },
+            sa_tp: function (data) {
+                return ZhCalc.round(ZhCalc.mul(data.unit_price, data.samount), totalPriceUnit);
+            },
         },
         readOnly: {
             isEdit: function (data) {
@@ -226,72 +257,94 @@ $(document).ready(() => {
             },
         },
     };
-
     const changeSpreadObj = {
-        makeSjsFooter: function () {
+        makeSjsFooter: function() {
             // 增加汇总行并设为锁定禁止编辑状态
             changeSpreadSheet.addRows(changeSpreadSheet.getRowCount(), 1);
             changeSpreadSheet.setValue(changeSpreadSheet.getRowCount() - 1, 0, '合计');
             changeSpreadSheet.setStyle(changeSpreadSheet.getRowCount() - 1, -1, style1);
             changeSpreadObj.countSum();
         },
+        setAuditValue: function () {
+            for (const c of changeList) {
+                for (const audit of change.listAudits) {
+                    c['sa_tp_' + audit.aid] = ZhCalc.round(ZhCalc.mul(c['audit_amount_' + audit.aid], c.unit_price), totalPriceUnit);
+                }
+            }
+        },
+        setRowValueAndSum: function (data, row, col) {
+            for (const j in change.listAudits) {
+                const sum = ZhCalc.round(ZhCalc.mul(data.unit_price, parseFloat(changeSpreadSheet.getValue(row, 10 + parseInt(j)*2))), totalPriceUnit);
+                changeSpreadSheet.setValue(row, 11 + 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);
+            const rowCount = changeSpreadSheet.getRowCount();
+            // 用户的数据合计
+            let audit_sum = 0;
+            for(let i = 0; i < rowCount - 1; i++){
+                audit_sum = ZhCalc.add(audit_sum, changeSpreadSheet.getValue(i, col+1));
+            }
+            changeSpreadSheet.setValue(changeSpreadSheet.getRowCount() - 1, col+1, audit_sum !== 0 ? audit_sum : null);
+        },
         countSum: function() {
             const rowCount = changeSpreadSheet.getRowCount();
             let oSum = 0,
-                cSum = 0;
-            for(var i = 0; i < rowCount - 1; i++){
+                cSum = 0,
+                sSum = 0;
+            for (let i = 0; i < rowCount - 1; i++) {
                 oSum = ZhCalc.add(oSum, changeSpreadSheet.getValue(i, 5));
                 cSum = ZhCalc.add(cSum, changeSpreadSheet.getValue(i, 7));
+                sSum = ZhCalc.add(sSum, changeSpreadSheet.getValue(i, 9));
             }
             changeSpreadSheet.setValue(changeSpreadSheet.getRowCount() - 1, 5, oSum !== 0 ? oSum : null);
             changeSpreadSheet.setValue(changeSpreadSheet.getRowCount() - 1, 7, cSum !== 0 ? cSum : null);
-        },
-        add: function () {
-            postData(preUrl + '/list/save', {type: 'add'}, function (result) {
-                if (result) {
-                    changeList.push(result);
-                    changeSpreadSheet.addRows(changeList.length - 1, 1);
-                    SpreadJsObj.reLoadRowData(changeSpreadSheet, changeList.length - 1);
-                    changeSpreadSheet.setStyle(changeSpreadSheet.getRowCount() - 1, -1, style1);
-                    changeSpreadSheet.setSelection(changeList.length - 1, 0, 1, 1);
-                    // $('#plan-spread').css('height', `${21*changeList + 100}px`);
-                }
-            });
-        },
-        batchAdd: function(num) {
-            postData(preUrl + '/list/save', {type: 'batchadd', num}, function (result) {
-                if (result) {
-                    changeList = _.concat(changeList, result);
-                    SpreadJsObj.loadSheetData(changeSpreadSheet, SpreadJsObj.DataType.Data, changeList);
-                    changeSpreadObj.makeSjsFooter();
+            changeSpreadSheet.setValue(changeSpreadSheet.getRowCount() - 1, 9, sSum !== 0 ? sSum : null);
+            // 用户的数据合计
+            for (const j in change.listAudits) {
+                let audit_sum = 0;
+                for(let i = 0; i < rowCount - 1; i++){
+                    audit_sum = ZhCalc.add(audit_sum, changeSpreadSheet.getValue(i, 11 + j*2));
                 }
-            });
-        },
-        del: function () {
-            const select = SpreadJsObj.getSelectObject(changeSpreadSheet);
-            const index = changeList.indexOf(select);
-            if (index > -1) {
-                postData(preUrl + '/list/save', {type: 'del', id: select.id}, function (result) {
-                    changeList.splice(index, 1);
-                    changeSpreadSheet.deleteRows(index, 1);
-                    const sel = changeSpreadSheet.getSelections();
-                    changeSpreadSheet.setSelection(0, 0, 1, 1);
-                    changeSpreadObj.countSum();
-                });
+                changeSpreadSheet.setValue(changeSpreadSheet.getRowCount() - 1, 11 + j*2, audit_sum !== 0 ? audit_sum : null);
             }
         },
-        selectionChanged: function (e, info) {
-            // const sel = info.sheet.getSelections()[0];
-            // const col = info.sheet.zh_setting.cols[sel.col];
-            // // const data = SpreadJsObj.getSelectObject(info.sheet);
-            // if (col && col.field === 'del_list') {
-            //     changeSpreadObj.del();
-            // }
-        },
         deletePress: function (sheet) {
             return;
         },
-        editEnded: function (e, info) {
+        showHideAudit: function (show = false) {
+            const count = changeSpreadSetting.cols.length;
+            for (let i = 10; i < count; i++) {
+                changeSpreadSheet.setColumnVisible(i, show, GC.Spread.Sheets.SheetArea.viewport);
+            }
+            changeSpreadSheet.setColumnVisible(8, !show, GC.Spread.Sheets.SheetArea.viewport);
+            changeSpreadSheet.setColumnVisible(9, !show, GC.Spread.Sheets.SheetArea.viewport);
+        },
+        valueChanged: function (e, info) {
+            // 防止ctrl+z撤销数据
+            SpreadJsObj.reLoadRowData(info.sheet, info.row);
+        }
+    };
+    if (!readOnly) {
+        changeSpreadObj.del = function (sheet) {
+            const selection = sheet.getSelections();
+            const row = selection[0].row, count = selection[0].rowCount;
+            const sortData = sheet.zh_data;
+            const ids = [];
+            for (let iRow = 0; iRow < count; iRow++) {
+                if (sortData[iRow + row]) {
+                    ids.push(sortData[iRow + row].id);
+                }
+            }
+            if (ids.length > 0) {
+                postData(preUrl + '/list/save', {type: 'del', ids}, function (result) {
+                    changeList = result;
+                    SpreadJsObj.loadSheetData(changeSpreadSheet, SpreadJsObj.DataType.Data, changeList);
+                    changeSpreadObj.makeSjsFooter();
+                });
+            }
+        };
+        changeSpreadObj.editEnded = function (e, info) {
             if (info.sheet.zh_setting) {
                 const type = SpreadJsObj.getSelectObject(info.sheet) ? 'update' : 'add';
                 const select = type === 'update' ? SpreadJsObj.getSelectObject(info.sheet) : {unit: ''};
@@ -353,8 +406,11 @@ $(document).ready(() => {
                     SpreadJsObj.reLoadRowData(info.sheet, info.row);
                 });
             }
-        },
-        clipboardPasted(e, info) {
+        };
+        changeSpreadObj.clipboardPasted  = function(e, info, cellRange) {
+            if (info.sheet.getColumnCount() > info.sheet.zh_setting.cols.length) {
+                info.sheet.setColumnCount(info.sheet.zh_setting.cols.length);
+            }
             const hint = {
                 cellError: {type: 'error', msg: '粘贴内容超出了表格范围'},
                 numberExpr: {type: 'error', msg: '不能粘贴其它非数字类型字符'},
@@ -363,22 +419,6 @@ $(document).ready(() => {
                 const sortData = info.sheet.zh_data || [];
                 const range = info.cellRange;
                 const data = [];
-                // if (info.cellRange.row + info.cellRange.rowCount > sortData.length) {
-                //     toastMessageUniq(hint.cellError);
-                //     // SpreadJsObj.loadSheetData(materialSpread.getActiveSheet(), SpreadJsObj.DataType.Data, materialBillsData);
-                //     SpreadJsObj.reLoadSheetHeader(changeSpreadSheet);
-                //     SpreadJsObj.reLoadSheetData(changeSpreadSheet);
-                //     changeSpreadObj.makeSjsFooter();
-                //     return;
-                // }
-                // if (sortData.length > 0 && range.col + range.colCount > 8) {
-                //     toastMessageUniq(hint.cellError);
-                //     SpreadJsObj.reLoadSheetHeader(changeSpreadSheet);
-                //     SpreadJsObj.reLoadSheetData(changeSpreadSheet);
-                //     changeSpreadObj.makeSjsFooter();
-                //     return;
-                // }
-
                 for (let iRow = 0; iRow < range.rowCount; iRow++) {
                     let bPaste = true;
                     const curRow = range.row + iRow;
@@ -421,19 +461,22 @@ $(document).ready(() => {
                             //粘贴内容要为下拉列表里所有的单位,不然为空
                             if (changeUnits.indexOf(validText) === -1) {
                                 unitdecimal = '';
+                                // validText = null;
                             }
                             cLData.camount = curRow >= sortData.length ? 0 : ZhCalc.round(sortData[curRow].camount, findDecimal(unitdecimal)) || 0;
                             cLData.oamount = curRow >= sortData.length ? 0 : ZhCalc.round(sortData[curRow].oamount, findDecimal(unitdecimal)) || 0;
                             cLData.spamount = curRow >= sortData.length ? 0 : ZhCalc.round(sortData[curRow].camount, findDecimal(unitdecimal)) || 0;
                         }
                         // sortData[curRow][colSetting.field] = validText;
-                        if (colSetting.type === 'camount') {
+                        if (colSetting.field === 'camount') {
                             cLData.spamount = ZhCalc.round(validText, findDecimal(unitdecimal)) || 0;
                         }
                         cLData[colSetting.field] = validText;
 
                     }
                     if (bPaste) {
+                        delete cLData.oa_tp;
+                        delete cLData.ca_tp;
                         data.push(cLData);
                         // rowData.push(curRow);
                     } else {
@@ -446,21 +489,18 @@ $(document).ready(() => {
                 }
                 console.log(data);
                 // 更新至服务器
-                // postData(preUrl + '/list/save', { type:'paste', updateData: data }, function (result) {
-                //     changeList = result;
-                //     SpreadJsObj.loadSheetData(changeSpreadSheet, SpreadJsObj.DataType.Data, changeList);
-                //     changeSpreadObj.makeSjsFooter();
-                // }, function () {
-                //     SpreadJsObj.reLoadRowData(info.sheet, info.cellRange.row, info.cellRange.rowCount);
-                //     return;
-                // });
+                postData(preUrl + '/list/save', { type:'paste', updateData: data }, function (result) {
+                    changeList = result;
+                    SpreadJsObj.loadSheetData(changeSpreadSheet, SpreadJsObj.DataType.Data, changeList);
+                    changeSpreadObj.makeSjsFooter();
+                }, function () {
+                    SpreadJsObj.reLoadRowData(info.sheet, info.cellRange.row, info.cellRange.rowCount);
+                    return;
+                });
             }
-        },
-        valueChanged(e, info) {
-            // 防止ctrl+z撤销数据
-            SpreadJsObj.reLoadRowData(info.sheet, info.row);
-        },
-        updateOamount: function () {
+        };
+
+        changeSpreadObj.updateOamount = function () {
             const select = SpreadJsObj.getSelectObject(changeSpreadSheet);
             console.log(changeSpreadSheet);
             const index = changeList.indexOf(select);
@@ -493,44 +533,9 @@ $(document).ready(() => {
                     });
                 }
             }
-        },
-    };
-    let changeListData;
-    let gclGatherData;
-    let dealBillList;
-    const billUrl = window.location.pathname.split('/').slice(0, 4).join('/');
-    postData(billUrl + '/defaultBills', {}, function (result) {
-        gclGatherModel.loadLedgerData(result.bills);
-        gclGatherModel.loadPosData(result.pos);
-
-        gclGatherData = gclGatherModel.gatherGclData();
-        gclGatherData = _.filter(gclGatherData, function (item) {
-            return item.leafXmjs && item.leafXmjs.length !== 0;
-        });
-        // 数组去重
-        dealBillList = result.dealBills;
-        // for (const db of gclGatherData) {
-        //     const exist_index = dealBillList.findIndex(function (item) {
-        //         return item.code === db.code && item.name === db.name && item.unit === db.unit && item.unit_price === db.unit_price;
-        //     });
-        //     if (exist_index !== -1) {
-        //         dealBillList.splice(exist_index, 1);
-        //     }
-        // }
-        // changeListData = gclGatherData.concat(dealBillList);
-        changeListData = gclGatherData;
-        console.log(changeListData, dealBillList);
-
-        SpreadJsObj.initSpreadSettingEvents(changeSpreadSetting, changeCol);
-        SpreadJsObj.initSheet(changeSpreadSheet, changeSpreadSetting);
-        SpreadJsObj.loadSheetData(changeSpreadSheet, SpreadJsObj.DataType.Data, changeList);
-        changeSpreadObj.makeSjsFooter();
-    });
-
-    if (!readOnly) {
-        $('#add-white-btn').click(changeSpreadObj.add);
+        };
+        // changeSpread.bind(spreadNS.Events.CellChanged, changeSpreadObj.cellChanged);
         changeSpread.bind(spreadNS.Events.EditEnded, changeSpreadObj.editEnded);
-        changeSpread.bind(spreadNS.Events.SelectionChanged, changeSpreadObj.selectionChanged);
         changeSpread.bind(spreadNS.Events.ClipboardPasted, changeSpreadObj.clipboardPasted);
         changeSpread.bind(spreadNS.Events.ValueChanged, changeSpreadObj.valueChanged);
         SpreadJsObj.addDeleteBind(changeSpread, changeSpreadObj.deletePress);
@@ -568,14 +573,20 @@ $(document).ready(() => {
                         changeSpreadObj.del(changeSpreadSheet);
                     },
                     disabled: function (key, opt) {
-                        const select = SpreadJsObj.getSelectObject(changeSpreadSheet);
-                        const sel = changeSpreadSheet.getSelections()[0];
-                        // console.log(select, sel);
-                        if (!readOnly && select && sel.row !== changeSpreadSheet.getRowCount() - 1) {
-                            return false;
+                        // const select = SpreadJsObj.getSelectObject(changeSpreadSheet);
+                        if (changeSpreadSheet.zh_data) {
+                            const selection = changeSpreadSheet.getSelections();
+                            return changeSpreadSheet.zh_data.length < selection[0].row + selection[0].rowCount;
                         } else {
                             return true;
                         }
+                        // const sel = changeSpreadSheet.getSelections()[0];
+                        // // console.log(select, sel);
+                        // if (!readOnly && select && sel.row !== changeSpreadSheet.getRowCount() - 1) {
+                        //     return false;
+                        // } else {
+                        //     return true;
+                        // }
                     }
                 },
             }
@@ -605,6 +616,172 @@ $(document).ready(() => {
             });
         })
     }
+
+    if (change.shenpiPower) {
+        changeSpreadObj.editEnded = function (e, info) {
+            if (info.sheet.zh_setting) {
+                const select = SpreadJsObj.getSelectObject(info.sheet);
+                const col = info.sheet.zh_setting.cols[info.col];
+                // 未改变值则不提交
+                let validText = is_numeric(info.editingText) ? parseFloat(info.editingText) : (info.editingText ? trimInvalidChar(info.editingText) : '');
+                const orgValue = select[col.field];
+                if (orgValue == validText || ((!orgValue || orgValue === '') && (validText === ''))) {
+                    SpreadJsObj.reLoadRowData(info.sheet, info.row);
+                    changeSpreadObj.setRowValueAndSum(select, info.row, info.col);
+                    return;
+                }
+                // 判断部分值是否输入的是数字判断和数据计算
+                if (col.type === 'Number') {
+                    if (isNaN(validText)) {
+                        toastr.error('不能输入其它非数字类型字符');
+                        SpreadJsObj.reLoadRowData(info.sheet, info.row);
+                        changeSpreadObj.setRowValueAndSum(select, info.row, info.col);
+                        return;
+                    }
+                    validText = ZhCalc.round(validText, findDecimal(select.unit)) || 0;
+                    // 判断是否 正数必须大于等于限制值,负数必须小于等于限制值,否则无法更改
+                }
+                select[col.field] = validText;
+                select.spamount = ZhCalc.round(validText, findDecimal(select.unit)) || 0;
+
+                const data = {
+                    id: select.id,
+                    spamount: select.spamount,
+                };
+                console.log(data);
+
+                // 更新至服务器
+                postData(preUrl + '/list/save', { type:'update', updateData: data }, function (result) {
+                    changeList.splice(info.row, 1, select);
+                    SpreadJsObj.reLoadRowData(info.sheet, info.row);
+                    changeSpreadObj.setRowValueAndSum(select, info.row, info.col);
+                }, function () {
+                    select[col.field] = orgValue;
+                    select.spamount = orgValue;
+                    SpreadJsObj.reLoadRowData(info.sheet, info.row);
+                    changeSpreadObj.setRowValueAndSum(select, info.row, info.col);
+                });
+            }
+        };
+        changeSpreadObj.clipboardPasted = function(e, info) {
+            const hint = {
+                cellError: {type: 'error', msg: '粘贴内容超出了表格范围'},
+                numberExpr: {type: 'error', msg: '不能粘贴其它非数字类型字符'},
+            };
+            const range = info.cellRange;
+            const sortData = info.sheet.zh_data || [];
+            const data = [];
+            for (let iRow = 0; iRow < range.rowCount; iRow++) {
+                let bPaste = true;
+                const curRow = range.row + iRow;
+                // const materialData = JSON.parse(JSON.stringify(sortData[curRow]));
+                const cLData = { id: sortData[curRow].id };
+                const hintRow = range.rowCount > 1 ? curRow : '';
+                let sameCol = 0;
+                for (let iCol = 0; iCol < range.colCount; iCol++) {
+                    const curCol = range.col + iCol;
+                    const colSetting = info.sheet.zh_setting.cols[curCol];
+                    if (!colSetting) continue;
+
+                    let validText = info.sheet.getText(curRow, curCol);
+                    validText = is_numeric(validText) ? parseFloat(validText) : (validText ? trimInvalidChar(validText) : null);
+                    const orgValue = sortData[curRow][colSetting.field];
+                    if (orgValue == validText || ((!orgValue || orgValue === '') && (validText === ''))) {
+                        sameCol++;
+                        if (range.colCount === sameCol)  {
+                            bPaste = false;
+                        }
+                        continue;
+                    }
+                    if (colSetting.type === 'Number') {
+                        if (isNaN(validText)) {
+                            toastMessageUniq(hint.numberExpr);
+                            bPaste = false;
+                            continue;
+                        }
+                        validText = ZhCalc.round(validText, findDecimal(sortData[curRow].unit)) || 0;
+                    }
+                    // cLData[colSetting.field] = validText;
+                    sortData[curRow][colSetting.field] = validText;
+                    cLData.spamount = validText;
+                }
+                if (bPaste) {
+                    data.push(cLData);
+                    // rowData.push(curRow);
+                } else {
+                    changeSpreadObj.setAuditValue();
+                    SpreadJsObj.reLoadRowData(info.sheet, curRow);
+                    // SpreadJsObj.reLoadRowData(info.sheet, curRow);
+                }
+            }
+            if (data.length === 0) {
+                // SpreadJsObj.reLoadRowData(info.sheet, info.cellRange.row, info.cellRange.rowCount);
+                return;
+            }
+            console.log(data);
+            // 更新至服务器
+            postData(preUrl + '/list/save', { type:'paste_amount_rows', updateData: data }, function (result) {
+                changeList = result;
+                changeSpreadObj.setAuditValue();
+                SpreadJsObj.loadSheetData(changeSpreadSheet, SpreadJsObj.DataType.Data, changeList);
+                changeSpreadObj.makeSjsFooter();
+            }, function () {
+                changeSpreadObj.setAuditValue();
+                SpreadJsObj.reLoadRowData(info.sheet, info.cellRange.row, info.cellRange.rowCount);
+                return;
+            });
+        };
+        changeSpread.bind(spreadNS.Events.EditEnded, changeSpreadObj.editEnded);
+        changeSpread.bind(spreadNS.Events.ClipboardPasted, changeSpreadObj.clipboardPasted);
+        changeSpread.bind(spreadNS.Events.ValueChanged, changeSpreadObj.valueChanged);
+        SpreadJsObj.addDeleteBind(changeSpread, changeSpreadObj.deletePress);
+    }
+
+    let changeListData;
+    let gclGatherData;
+    let dealBillList;
+    const billUrl = window.location.pathname.split('/').slice(0, 4).join('/');
+    postData(billUrl + '/defaultBills', {}, function (result) {
+        gclGatherModel.loadLedgerData(result.bills);
+        gclGatherModel.loadPosData(result.pos);
+
+        gclGatherData = gclGatherModel.gatherGclData();
+        gclGatherData = _.filter(gclGatherData, function (item) {
+            return item.leafXmjs && item.leafXmjs.length !== 0;
+        });
+        // 数组去重
+        dealBillList = result.dealBills;
+        // for (const db of gclGatherData) {
+        //     const exist_index = dealBillList.findIndex(function (item) {
+        //         return item.code === db.code && item.name === db.name && item.unit === db.unit && item.unit_price === db.unit_price;
+        //     });
+        //     if (exist_index !== -1) {
+        //         dealBillList.splice(exist_index, 1);
+        //     }
+        // }
+        // changeListData = gclGatherData.concat(dealBillList);
+        changeListData = gclGatherData;
+        console.log(changeListData, dealBillList);
+
+        SpreadJsObj.initSpreadSettingEvents(changeSpreadSetting, changeCol);
+        SpreadJsObj.initSheet(changeSpreadSheet, changeSpreadSetting);
+        if (change.status === auditConst.status.checking || change.status === auditConst.status.checked) changeSpreadObj.setAuditValue();
+        SpreadJsObj.loadSheetData(changeSpreadSheet, SpreadJsObj.DataType.Data, changeList);
+        changeSpreadObj.makeSjsFooter();
+        if (change.status === auditConst.status.checked) {
+            changeSpreadObj.showHideAudit(false);
+        } else {
+            changeSpreadObj.showHideAudit(true);
+        }
+    });
+
+    // 审批流程展示与隐藏
+    $('#show-table-detail').on('click', function (e) {
+        if($(e.target).is('label')){
+            return;
+        }
+        changeSpreadObj.showHideAudit($(this).is(':checked'));
+    });
 });
 
 /**
@@ -648,3 +825,11 @@ const is_numeric = (value) => {
         return !Number.isNaN(Number(value)) && value.toString().trim() !== '';
     }
 };
+
+function getPasteHint (str, row = '') {
+    let returnObj = str;
+    if (row) {
+        returnObj.msg = '清单第' + (row+1) + '行' + str.msg;
+    }
+    return returnObj;
+}

+ 2 - 0
app/service/change_plan.js

@@ -382,6 +382,8 @@ module.exports = app => {
                 const changeInfo = await this.getDataById(id);
                 // 先删除审批人列表
                 await this.transaction.delete(this.ctx.service.changePlanAudit.tableName, { cpid: id });
+                // 删除清单
+                await this.transaction.delete(this.ctx.service.changePlanList.tableName, { cpid: id });
                 // 再删除附件和附件文件ni zuo
                 const attList = await this.ctx.service.changePlanAtt.getAllDataByCondition({ where: { cpid: id } });
                 await this.ctx.helper.delFiles(attList);

+ 5 - 2
app/service/change_plan_audit.js

@@ -382,6 +382,9 @@ module.exports = app => {
                 });
                 await transaction.insert('zh_notice', records);
 
+                // 清单审批流程修改的数据插入到audit_amount中,审批完成则最后一位并插入到审批后变更值中
+                await this.ctx.service.changePlanList.insertAuditAmount(transaction, cpId, !nextAudit);
+
                 // 无下一审核人表示,审核结束
                 if (nextAudit) {
                     // 流程至下一审批人
@@ -408,8 +411,6 @@ module.exports = app => {
                     // 同步 期信息
                     await transaction.update(this.ctx.service.changePlan.tableName, {
                         id: cpId, status: checkData.checkType,
-                        notice_code: checkData.notice_code,
-                        notice_uid: checkData.notice_uid,
                     });
 
                     // 微信模板通知
@@ -465,6 +466,8 @@ module.exports = app => {
                 });
                 // 拷贝新一次审核流程列表
                 await transaction.insert(this.tableName, auditors);
+                // 清单审批值删除并重算变更金额
+                await this.ctx.service.changePlanList.delAuditAmount(transaction, cpId);
                 // 微信模板通知
                 // const begin_audit = await this.getDataByCondition({
                 //     mid: materialId,

+ 44 - 32
app/service/change_plan_list.js

@@ -27,10 +27,10 @@ module.exports = app => {
          * 取出变更令清单列表,并按台账清单在前,空白清单在后排序
          * @return {void}
          */
-        async getList(cpid) {
+        async getList(cpid, transaction = false) {
             const sql = 'SELECT * FROM ?? WHERE `cpid` = ? ORDER BY `id` asc';
             const sqlParam = [this.tableName, cpid];
-            return await this.db.query(sql, sqlParam);
+            return transaction ? await transaction.query(sql, sqlParam) : await this.db.query(sql, sqlParam);
         }
 
         /**
@@ -91,14 +91,14 @@ module.exports = app => {
          * @param {int} id 清单id
          * @return {void}
          */
-        async del(id) {
+        async del(ids) {
             if (!this.ctx.tender || !this.ctx.change) {
                 throw '数据错误';
             }
             const transaction = await this.db.beginTransaction();
             try {
                 // 判断是否可删
-                await transaction.delete(this.tableName, { id });
+                await transaction.delete(this.tableName, { id: ids });
                 // 重新算变更令总额
                 await this.calcCamountSum(transaction);
                 await transaction.commit();
@@ -148,13 +148,19 @@ module.exports = app => {
             // 判断t_type是否为费用
             const transaction = await this.db.beginTransaction();
             try {
-                // for (const data of datas) {
-                //     const mb_id = data.mb_id;
-                //     delete data.mb_id;
-                //     await transaction.update(this.tableName, data);
-                //     await this.calcQuantityByML(transaction, mb_id);
-                // }
-                await transaction.updateRows(this.tableName, datas);
+                const insertArray = [];
+                const updateArray = [];
+                for (const d of datas) {
+                    if (d.id) {
+                        updateArray.push(d);
+                    } else {
+                        d.tid = this.ctx.tender.id;
+                        d.cpid = this.ctx.change.id;
+                        insertArray.push(d);
+                    }
+                }
+                if (insertArray.length > 0) await transaction.insert(this.tableName, insertArray);
+                if (updateArray.length > 0) await transaction.updateRows(this.tableName, updateArray);
                 await this.calcCamountSum(transaction);
                 await transaction.commit();
                 return true;
@@ -191,27 +197,33 @@ module.exports = app => {
             await transaction.update(this.ctx.service.changePlan.tableName, updateData, options);
         }
 
-        /**
-         * 用户数据数量提交
-         * @param {Object} data 内容
-         * @return {void}
-         */
-        async saveAmountData(data) {
-            if (!this.ctx.tender || !this.ctx.change) {
-                throw '数据错误';
-            }
-            // 判断是否可修改
-            // 判断t_type是否为费用
-            const transaction = await this.db.beginTransaction();
-            try {
-                await transaction.update(this.tableName, data);
-                await this.calcCamountSum(transaction);
-                await transaction.commit();
-                return true;
-            } catch (err) {
-                await transaction.rollback();
-                throw err;
-            }
+        async insertAuditAmount(transaction, cpId, lastAudit = false) {
+            const changeList = await this.getList(cpId, transaction);
+            const updateArray = [];
+            for (const c of changeList) {
+                const audit_amount = c.audit_amount !== null && c.audit_amount !== '' ? c.audit_amount.split(',') : [];
+                audit_amount.push(c.spamount);
+                updateArray.push({
+                    id: c.id,
+                    audit_amount: audit_amount.join(','),
+                    samount: lastAudit ? c.spamount : null,
+                });
+            }
+            if (updateArray.length > 0) await transaction.updateRows(this.tableName, updateArray);
+        }
+
+        async delAuditAmount(transaction, cpId) {
+            const changeList = await this.getList(cpId, transaction);
+            const updateArray = [];
+            for (const c of changeList) {
+                updateArray.push({
+                    id: c.id,
+                    audit_amount: null,
+                    spamount: c.camount,
+                });
+            }
+            if (updateArray.length > 0) await transaction.updateRows(this.tableName, updateArray);
+            await this.calcCamountSum(transaction);
         }
     }
 

+ 11 - 1
app/view/change/plan_information.ejs

@@ -10,9 +10,11 @@
                 <div class="d-inline-block" id="change-plan-code">
                     <%- change.code %>
                 </div>
+                <% if (change.status === auditConst.status.uncheck || change.status === auditConst.status.checkNo) { %>
                 <div class="d-inline-block">
                     <a href="#shuliangguize" data-toggle="modal" data-target="#shuliangguize" class="btn btn-outline-primary btn-sm"><i class="fa fa-cog"></i></a>
                 </div>
+                <% } %>
             </div>
             <div class="ml-auto" id="sp-btn">
                 <% if (ctx.change.status === auditConst.status.uncheck) { %>
@@ -106,7 +108,15 @@
                                 <td colspan="3"><textarea class="form-control form-control-sm" data-name="memo" <% if (change.readOnly) { %>readonly<% } %> rows="3"><%- change.memo %></textarea></td>
                             </tr>
                         </table>
-                        <h5 id="qingdan">变更清单</h5>
+                        <h5 id="qingdan" class="d-inline-block">变更清单</h5>
+                        <% if (change.status === auditConst.status.checked) { %>
+                        <div class="d-inline-block ml-3">
+                            <div class="custom-control custom-checkbox" style="line-height: normal;">
+                                <input type="checkbox" class="custom-control-input" id="show-table-detail">
+                                <label class="custom-control-label" for="show-table-detail">审批过程</label>
+                            </div>
+                        </div>
+                        <% } %>
                         <div style="height: <%= 21*(changeList.length+3) + 100 %>px;min-height: 300px" id="plan-spread"></div>
                         <h5 id="fujian">附件</h5>
                         <table class="table table-bordered">

+ 0 - 16
app/view/change/plan_information_modal.ejs

@@ -436,14 +436,6 @@
                                                                             <label>审批意见<b class="text-danger">*</b></label>
                                                                             <textarea class="form-control form-control-sm"
                                                                                       name="opinion">同意</textarea>
-                                                                            <% if (auditors[auditors.length - 1].aid === auditor.aid) { %>
-                                                                                <!--终审填写批复编号-->
-                                                                                <div class="form-group mt-3">
-                                                                                    <label>变更通知书<b class="text-danger">*&nbsp;</b></label>
-                                                                                    <input class="form-control form-control-sm" value="BGTZ-<%- change.code %>" name="notice_code" type="text">
-                                                                                    <input type="hidden" name="notice_uid" value="<%- auditor.aid %>">
-                                                                                </div>
-                                                                            <% } %>
                                                                         <% } else { %>
                                                                             <p style="margin: 0;"><%- auditor.opinion %></p>
                                                                         <% } %>
@@ -497,14 +489,6 @@
                                                                             <label>审批意见<b class="text-danger">*</b></label>
                                                                             <textarea class="form-control form-control-sm"
                                                                                       name="opinion">同意</textarea>
-                                                                            <% if (auditors[auditors.length - 1].aid === auditor.aid) { %>
-                                                                            <!--终审填写批复编号-->
-                                                                            <div class="form-group mt-3">
-                                                                                <label>变更通知书<b class="text-danger">*&nbsp;</b></label>
-                                                                                <input class="form-control form-control-sm" value="BGTZ-<%- change.code %>" name="notice_code" type="text">
-                                                                                <input type="hidden" name="notice_uid" value="<%- auditor.aid %>">
-                                                                            </div>
-                                                                            <% } %>
                                                                         <% } else { %>
                                                                             <p style="margin: 0;"><%- auditor.opinion %></p>
                                                                         <% } %>

+ 3 - 3
app/view/dashboard/index.ejs

@@ -152,8 +152,8 @@
                                         <li class="media pb-3 mb-3 border-bottom-1">
                                             <div class="media-body">
                                                 <div class="row">
-                                                    <div class="col-auto"><span class="badge badge-danger">变更申请</span></div>
-                                                    <div class="col-6"><a href="/tender/<%- acp.tid %>"><%- acp.name %></a> 变更申请 <%- acp.mcode %></div>
+                                                    <div class="col-auto"><span class="badge badge-danger">变更方案</span></div>
+                                                    <div class="col-6"><a href="/tender/<%- acp.tid %>"><%- acp.name %></a> 变更方案 <%- acp.mcode %></div>
                                                     <div class="col-3 ml-auto text-right pl-0"><a href="/tender/<%- acp.tid %>/change/plan/<%- acp.cpid %>/information" class="btn btn-sm btn-outline-primary"><% if (acp.mstatus !== acChangePlan.status.checkNo) { %>审批<% } else { %>重新上报<% } %></a></div>
                                                 </div>
                                                 <p class="mt-1 mb-0"><%- ctx.session.sessionUser.name %><small class="ml-1 text-muted"><%- (role ? '- ' + role : '') %></small>
@@ -349,7 +349,7 @@
                                             <li class="media pb-3 mb-3 border-bottom-1">
                                                 <div class="media-body">
                                                     <div class="row">
-                                                        <div class="col-auto"><span class="badge badge-danger">变更申请</span></div>
+                                                        <div class="col-auto"><span class="badge badge-danger">变更方案</span></div>
                                                         <div class="col-6">
                                                             <a href="/tender/<%- notice.tid %>"><%- notice.name %></a>
                                                             <a href="/tender/<%- notice.tid %>/change/plan/<%- notice.cpid %>/information"><%- notice.c_code %> </a>