Просмотр исходного кода

Merge branch 'dev' of http://192.168.1.41:3000/maixinrong/Calculation into dev

TonyKang 4 лет назад
Родитель
Сommit
3974a2e776

+ 5 - 1
app/controller/schedule_controller.js

@@ -87,7 +87,8 @@ module.exports = app => {
                 // const convert = new billsPosConvert(ctx);
                 // convert.loadData(ledgerData, posData, []);
                 // const result = await convert.convert();
-                ctx.body = { err: 0, msg: '', data: ledgerData };
+                const scheduleLedgerMonthData = await ctx.service.scheduleLedgerMonth.getAllDataByCondition({ tid: ctx.tender.id });
+                ctx.body = { err: 0, msg: '', data: { bills: ledgerData, slm: scheduleLedgerMonthData } };
             } catch (err) {
                 this.log(err);
                 ctx.body = { err: 1, msg: err.toString(), data: [] };
@@ -135,6 +136,9 @@ module.exports = app => {
                     case 'delmonth':
                         responseData.data = await ctx.service.scheduleMonth.del(data.postData);
                         break;
+                    case 'ledger_edit':
+                        responseData.data = await ctx.service.scheduleLedgerMonth.save(data.postData);
+                        break;
                     default: throw '参数有误';
                 }
                 ctx.body = responseData;

+ 61 - 7
app/lib/rpt_data_analysis.js

@@ -627,10 +627,10 @@ const join = {
                 for (const k of options.keyFields) {
                     switch (k.type) {
                         case 'string':
-                            if (x[k.main] !== s[k.sub] && (!_.isNil(x[k.main]) || !_.isNil(s[k.sub]))) return false;
+                            if ((x[k.main] || '') !== (s[k.sub] || '')) return false;
                             break;
                         case 'number':
-                            if (!ctx.helper.checkZero(ctx.helper.sub(x[k.main] - s[k.sub]))) return false;
+                            if (!ctx.helper.checkZero(ctx.helper.sub(x[k.main], s[k.sub]))) return false;
                             break;
                     }
                 }
@@ -1114,7 +1114,7 @@ const datetimeFormat = {
     },
     fun: function (ctx, data, fieldsKey, options, csRela) {
         if (!options.tables) return;
-        const tables = options.tables instanceof Array ? tables : [options.tables];
+        const tables = options.tables instanceof Array ? options.tables : [options.tables];
         if (tables.length === 0) return;
 
         for (const table of tables) {
@@ -1424,17 +1424,23 @@ const loadCooperationData = {
         co_sign: [0,1,2,3],
     },
     _findSign: function (relaId, stageCooperation, auditor) {
+        if (!stageCooperation) return '';
         if (relaId.length > 0) {
             for (const id of relaId) {
                 const c = stageCooperation.find(x => {return x.ledger_id == id});
                 if (c) return c.sign_path;
             }
-            return auditor.sign_path;
+            return '';
         } else {
-            return auditor.sign_path;
+            return '';
         }
     },
+    _completeSign: function (auditor) {
+        if (!auditor) return '';
+        return 'public/upload/sign/' + auditor.sign_path;
+    },
     _loadImCooperationData: function (ctx, data, options, csRela) {
+        console.log(ctx.rpt_roleSign);
         let coSignOrder = [];
         if (csRela && csRela.tplDefine && csRela.tplDefine.audit_select && csRela.cDefine && csRela.cDefine.audit_select) {
             if (csRela.cDefine.audit_select) {
@@ -1448,7 +1454,7 @@ const loadCooperationData = {
 
         const stageCooperation = [];
         for (const sa of data.stage_audit) {
-            stageCooperation.push(data.ledger_cooperation.filter(x => {return x.user_id === sa.aid}));
+            if (sa.end_time) stageCooperation.push(data.ledger_cooperation.filter(x => {return x.user_id === sa.aid}));
         }
         for (const d of data[options.table]) {
             const bills = data.mem_stage_bills.find(x => {return x.id === d.lid});
@@ -1460,7 +1466,55 @@ const loadCooperationData = {
             }
 
             for (const [i, cs] of coSignOrder.entries()) {
-                d['co_sign' + (i+1)] = d.cooperation[cs] || '';
+                if (data.stage_audit[cs] && data.stage_audit[cs].end_time) {
+                    d['co_sign' + (i+1)] = d.cooperation[cs] || this._completeSign(data.stage_audit[cs]);
+                    d['co_opinion' + (i+1)] = data.stage_audit[cs].opinion || '';
+                    d['co_time' + (i+1)] = data.stage_audit[cs].end_time;
+                }
+            }
+        }
+    },
+    fun: function (ctx, data, fieldsKey, options, csRela) {
+        if (!options || !options.table) return;
+        if (!data[options.table]) return;
+        if (!data.mem_stage_bills) return;
+        if (!data.stage_audit) return;
+        if (!data.ledger_cooperation) return;
+
+        if (['mem_stage_im_zl', 'mem_stage_im_tz'].indexOf(options.table) >= 0)
+            this._loadImCooperationData(ctx, data, options, csRela);
+    }
+};
+const signSelect = {
+    name: '电子签名',
+    hint: '协作模式下,才需使用,其他情况勿需使用',
+    defaultSetting: {
+        table: 'mem_stage_im_zl',
+    },
+    _findSign: function (relaId, stageCooperation, auditor) {
+        if (!stageCooperation) return '';
+        if (relaId.length > 0) {
+            for (const id of relaId) {
+                const c = stageCooperation.find(x => {return x.ledger_id == id});
+                if (c) return c.sign_path;
+            }
+            return '';
+        } else {
+            return '';
+        }
+    },
+    _loadImCooperationData: function (ctx, data, options, csRela) {
+        const stageCooperation = {};
+        for (const sa of data.stage_audit) {
+            if (sa.end_time) stageCooperation[sa.aid] = data.ledger_cooperation.filter(x => {return x.user_id === sa.aid});
+        }
+        for (const d of data[options.table]) {
+            const bills = data.mem_stage_bills.find(x => {return x.id === d.lid});
+            const relaId = bills ? bills.full_path.split('-').reverse() : [];
+
+            for (const ss of data.sign_select) {
+                if (!ss.co_sign) ss.co_sign = [];
+                ss.co_sign.push(this._findSign(relaId, stageCooperation[ss.id], ss) || 'public/upload/sign/' + ss.sign_path);
             }
         }
     },

+ 22 - 0
app/public/js/change_information.js

@@ -216,6 +216,28 @@ $(document).ready(() => {
             $('#syfujian .check-all-file').prop('checked', false)
         }
     });
+
+    // 项目节信息获取
+    const xmjSpreadSetting = {
+        cols: [
+            {title: '项目节编号', colSpan: '1', rowSpan: '2', field: 'xmj_code', hAlign: 0, width: 80},
+            // {title: '名称', colSpan: '1', rowSpan: '2', field: 'name', hAlign: 0, width: 120},
+            {title: '细目', colSpan: '1', rowSpan: '2', field: 'xmj_jldy', hAlign: 0, width: 100},
+            {title: '单位工程', colSpan: '1', rowSpan: '2', field: 'xmj_dwgc', hAlign: 0, width: 100},
+            {title: '分部工程', colSpan: '1', rowSpan: '2', field: 'xmj_fbgc', hAlign: 0, width: 100},
+            {title: '分项工程', colSpan: '1', rowSpan: '2', field: 'xmj_fxgc', hAlign: 0, width: 100},
+            {title: '计量单元', colSpan: '1', rowSpan: '2', field: 'bwmx', hAlign: 0, width: 100},
+            {title: '数量', colSpan: '1', rowSpan: '2', field: 'oamount', hAlign: 2, width: 80},
+        ],
+        emptyRows: 0,
+        headRows: 1,
+        headRowHeight: [25, 25],
+        defaultRowHeight: 21,
+        headerFont: '12px 微软雅黑',
+        font: '12px 微软雅黑',
+        readOnly: true,
+    };
+    SpreadJsObj.initSheet(xmjSpread.getActiveSheet(), xmjSpreadSetting);
 });
 function findDecimal(unit) {
     let value = precision.other.value;

+ 17 - 0
app/public/js/change_information_approval.js

@@ -105,6 +105,20 @@ $(document).ready(() => {
                 }
             }
         },
+        resetXmjSpread: function(data = null) {
+            const xmj = [];
+            if (data && data.lid != 0 && data.xmj_code !== '' && data.xmj_code !== null) {
+                if (data.bwmx === data.xmj_jldy) {
+                    data.bwmx = '';
+                }
+                xmj.push(data);
+            }
+            SpreadJsObj.loadSheetData(xmjSpread.getActiveSheet(), SpreadJsObj.DataType.Data, xmj);
+        },
+        selectionChanged: function (e, info) {
+            const data = SpreadJsObj.getSelectObject(info.sheet);
+            changeSpreadObj.resetXmjSpread(data);
+        },
         setRowValueAndSum: function (data, row, col) {
             for (const j in aidList) {
                 const sum = ZhCalc.round(ZhCalc.mul(data.unit_price, parseFloat(changeSpreadSheet.getValue(row, 10 + parseInt(j)*2))), totalPriceUnit);
@@ -266,6 +280,7 @@ $(document).ready(() => {
                 SpreadJsObj.loadSheetData(changeSpreadSheet, SpreadJsObj.DataType.Data, changeList);
                 changeSpreadObj.setAuditValue();
                 changeSpreadObj.makeSjsFooter();
+                changeSpreadObj.resetXmjSpread(SpreadJsObj.getSelectObject(changeSpreadSheet));
             }, function () {
                 SpreadJsObj.reLoadRowData(info.sheet, info.cellRange.row, info.cellRange.rowCount);
                 changeSpreadObj.setAuditValue();
@@ -279,10 +294,12 @@ $(document).ready(() => {
     SpreadJsObj.loadSheetData(changeSpreadSheet, SpreadJsObj.DataType.Data, changeList);
     changeSpreadObj.setAuditValue();
     changeSpreadObj.makeSjsFooter();
+    changeSpreadObj.resetXmjSpread(SpreadJsObj.getSelectObject(changeSpreadSheet));
     const userIndex = aidList.indexOf(parseInt(accountId));
 
     changeSpread.bind(spreadNS.Events.EditEnded, changeSpreadObj.editEnded);
     changeSpread.bind(spreadNS.Events.ClipboardPasted, changeSpreadObj.clipboardPasted);
+    changeSpread.bind(spreadNS.Events.SelectionChanged, changeSpreadObj.selectionChanged);
     SpreadJsObj.addDeleteBind(changeSpread, changeSpreadObj.deletePress);
 
 

+ 18 - 0
app/public/js/change_information_set.js

@@ -152,6 +152,7 @@ $(document).ready(() => {
                     SpreadJsObj.reLoadRowData(changeSpreadSheet, changeList.length - 1);
                     changeSpreadSheet.setStyle(changeSpreadSheet.getRowCount() - 1, -1, style1);
                     changeSpreadSheet.setSelection(changeList.length - 1, 0, 1, 1);
+                    changeSpreadObj.resetXmjSpread();
                 }
             });
         },
@@ -164,6 +165,7 @@ $(document).ready(() => {
                     changeSpreadSheet.deleteRows(index, 1);
                     const sel = changeSpreadSheet.getSelections();
                     changeSpreadSheet.setSelection(0, 0, 1, 1);
+                    changeSpreadObj.resetXmjSpread(SpreadJsObj.getSelectObject(changeSpreadSheet));
                     if (select.lid != 0) {
                         tableDataRemake(changeListData);
                     }
@@ -171,6 +173,16 @@ $(document).ready(() => {
                 });
             }
         },
+        resetXmjSpread: function(data = null) {
+            const xmj = [];
+            if (data && data.lid != 0 && data.xmj_code !== '' && data.xmj_code !== null) {
+                if (data.bwmx === data.xmj_jldy) {
+                    data.bwmx = '';
+                }
+                xmj.push(data);
+            }
+            SpreadJsObj.loadSheetData(xmjSpread.getActiveSheet(), SpreadJsObj.DataType.Data, xmj);
+        },
         selectionChanged: function (e, info) {
             const sel = info.sheet.getSelections()[0];
             const col = info.sheet.zh_setting.cols[sel.col];
@@ -178,6 +190,7 @@ $(document).ready(() => {
             if (col && col.field === 'del_list') {
                 changeSpreadObj.del();
             }
+            changeSpreadObj.resetXmjSpread(data);
         },
         deletePress: function (sheet) {
             return;
@@ -320,6 +333,7 @@ $(document).ready(() => {
                 changeList = result;
                 SpreadJsObj.loadSheetData(changeSpreadSheet, SpreadJsObj.DataType.Data, changeList);
                 changeSpreadObj.makeSjsFooter();
+                changeSpreadObj.resetXmjSpread(SpreadJsObj.getSelectObject(changeSpreadSheet));
             }, function () {
                 SpreadJsObj.reLoadRowData(info.sheet, info.cellRange.row, info.cellRange.rowCount);
                 return;
@@ -385,6 +399,7 @@ $(document).ready(() => {
         SpreadJsObj.initSheet(changeSpreadSheet, changeSpreadSetting);
         SpreadJsObj.loadSheetData(changeSpreadSheet, SpreadJsObj.DataType.Data, changeList);
         changeSpreadObj.makeSjsFooter();
+        changeSpreadObj.resetXmjSpread(SpreadJsObj.getSelectObject(changeSpreadSheet));
     });
 
     if (!readOnly) {
@@ -426,6 +441,7 @@ $(document).ready(() => {
                     disabled: function (key, opt) {
                         const select = SpreadJsObj.getSelectObject(changeSpreadSheet);
                         const sel = changeSpreadSheet.getSelections()[0];
+                        changeSpreadObj.resetXmjSpread(select);
                         console.log(select, sel);
                         if (!readOnly && select && sel.row !== changeSpreadSheet.getRowCount() - 1) {
                             return false;
@@ -549,6 +565,8 @@ $(document).ready(() => {
             changeList = result;
             SpreadJsObj.loadSheetData(changeSpreadSheet, SpreadJsObj.DataType.Data, changeList);
             changeSpreadObj.makeSjsFooter();
+            const select = SpreadJsObj.getSelectObject(changeSpreadSheet);
+            changeSpreadObj.resetXmjSpread(select);
             $('#addlist').modal('hide');
         }, function () {
             $('#addlist').modal('hide');

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

@@ -97,6 +97,20 @@ $(document).ready(() => {
             changeSpreadSheet.setStyle(changeSpreadSheet.getRowCount() - 1, -1, style1);
             changeSpreadObj.countSum();
         },
+        resetXmjSpread: function(data = null) {
+            const xmj = [];
+            if (data && data.lid != 0 && data.xmj_code !== '' && data.xmj_code !== null) {
+                if (data.bwmx === data.xmj_jldy) {
+                    data.bwmx = '';
+                }
+                xmj.push(data);
+            }
+            SpreadJsObj.loadSheetData(xmjSpread.getActiveSheet(), SpreadJsObj.DataType.Data, xmj);
+        },
+        selectionChanged: function (e, info) {
+            const data = SpreadJsObj.getSelectObject(info.sheet);
+            changeSpreadObj.resetXmjSpread(data);
+        },
         setAuditValue: function () {
             const rowCount = changeSpreadSheet.getRowCount();
             // 用户的数据合计
@@ -149,6 +163,8 @@ $(document).ready(() => {
     changeSpreadObj.setAuditValue();
     changeSpreadObj.makeSjsFooter();
     changeSpreadObj.showHideAudit();
+    changeSpreadObj.resetXmjSpread(SpreadJsObj.getSelectObject(changeSpreadSheet));
+    changeSpread.bind(spreadNS.Events.SelectionChanged, changeSpreadObj.selectionChanged);
 
     // 审批流程展示与隐藏
     $('#show-table-detail').on('click', function (e) {

+ 15 - 1
app/public/js/path_tree.js

@@ -1312,12 +1312,26 @@ const createNewPathTree = function (type, setting) {
             }
             setLocalCache(this.pwdCacheKey, cache.join('|'));
         }
+
+        _getPwdPosterity(node) {
+            const children = [];
+            for (const c of node.children) {
+                const cPwd = this.pwd.find(x => {return x.node && x.node.id === c.id});
+                if (!cPwd) children.push(c);
+            }
+            let posterity = [...children];
+            for (const c of children) {
+                posterity = posterity.concat(this._getPwdPosterity(c));
+            }
+            return posterity;
+        }
+
         lockNode(p, isLock) {
             const refresh = [];
             p.check = !isLock;
             p.node.lock = isLock;
             refresh.push(this.getNodeIndex(p.node));
-            const posterity = this.getPosterity(p.node);
+            const posterity = this._getPwdPosterity(p.node);
             for (const pn of posterity) {
                 pn.lock = isLock;
                 refresh.push(this.getNodeIndex(pn));

+ 2 - 2
app/public/js/schedule_ledger.js

@@ -67,8 +67,8 @@ $(function () {
                 node.dgn_price = ZhCalc.round(ZhCalc.div(node.total_price, node.dgn_qty1), 2);
             }
         });
-        data = addIsSelect(data);
-        baseLedgerTree.loadDatas(data);
+        const datas = addIsSelect(data.bills);
+        baseLedgerTree.loadDatas(datas);
         treeCalc.calculateAll(baseLedgerTree);
         for (const d of baseLedgerTree.nodes) {
             if (!d.b_code)

+ 34 - 9
app/public/js/schedule_plan.js

@@ -110,19 +110,27 @@ $(function () {
                 node.dgn_price = ZhCalc.round(ZhCalc.div(node.total_price, node.dgn_qty1), 2);
             }
         });
-        baseLedgerTree.loadDatas(data);
+        const newLedgerList = setMonthToLedger(data.bills, data.slm);
+        console.log(newLedgerList);
+        baseLedgerTree.loadDatas(newLedgerList);
         treeCalc.calculateAll(baseLedgerTree);
+        const showList = ['ledger_id', 'ledger_pid', 'order', 'level', 'tender_id', 'full_path',
+            'code', 'name', 'unit', 'dgn_qty1', 'dgn_qty2', 'dgn_price', 'quantity', 'total_price'];
+        for (const m of monthList) {
+            showList.push(m + '_tp');
+            showList.push(m + '_gcl');
+        }
         for (const d of baseLedgerTree.nodes) {
             if (!d.b_code) {
                 const one = _.find(selectedLedgerList, function (item) {
                     return item === d.ledger_id;
                 });
                 if(one) {
-                    ledgerTree.addData(d, ['ledger_id', 'ledger_pid', 'order', 'level', 'tender_id', 'full_path',
-                        'code', 'name', 'unit', 'dgn_qty1', 'dgn_qty2', 'dgn_price', 'quantity', 'total_price']);
+                    ledgerTree.addData(d, showList);
                 }
             }
         }
+        console.log(ledgerTree);
         ledgerTree.sortTreeNode(true);
         // console.log(ledgerTree);
         SpreadJsObj.loadSheetData(ledgerSpread.getActiveSheet(), SpreadJsObj.DataType.Tree, ledgerTree);
@@ -200,8 +208,6 @@ $(function () {
                 // 判断输入位数,提示
                 if (mode === 'tp') {
                     const reg = new RegExp('^([-]?)\\d+(\\.\\d{0,'+ parseInt(tenderInfo.decimal.tp) +'})?$');
-                    console.log(reg);
-                    console.log(reg.test(validText));
                     if (validText !== null && (!reg.test(validText))) {
                         toastr.error('输入金额小数位数不能大于' + tenderInfo.decimal.tp + '位');
                         SpreadJsObj.reLoadRowData(info.sheet, info.row);
@@ -209,7 +215,6 @@ $(function () {
                     }
                     plan_gcl = select.dgn_price && select.dgn_price !== 0 ? ZhCalc.round(ZhCalc.div(validText, select.dgn_price), tenderInfo.decimal.up) : 0;
                     plan_tp = validText;
-                    select[yearmonth + '_gcl'] = plan_gcl;
                 } else {
                     const reg = new RegExp('^([-]?)\\d+(\\.\\d{0,'+ parseInt(tenderInfo.decimal.up) +'})?$');
                     if (validText !== null && (!reg.test(validText))) {
@@ -219,7 +224,6 @@ $(function () {
                     }
                     plan_gcl = validText;
                     plan_tp = select.dgn_price && select.dgn_price !== 0 ? ZhCalc.round(ZhCalc.mul(validText, select.dgn_price), tenderInfo.decimal.tp) : 0;
-                    select[yearmonth + '_tp'] = plan_tp;
                 }
                 select[col.field] = validText;
                 const updateData = {
@@ -229,9 +233,17 @@ $(function () {
                     plan_tp,
                 };
                 console.log(updateData);
-                // postData(window.location.pathname + '/save', {type: 'mode', postData: updateData}, function (result) {
+                postData(window.location.pathname + '/save', {type: 'ledger_edit', postData: updateData}, function (result) {
+                    if (mode === 'tp') {
+                        select[yearmonth + '_gcl'] = plan_gcl;
+                    } else {
+                        select[yearmonth + '_tp'] = plan_tp;
+                    }
                     SpreadJsObj.reLoadRowData(info.sheet, info.row);
-                // })
+                },function () {
+                    select[col.field] = orgValue;
+                    SpreadJsObj.reLoadRowData(info.sheet, info.row);
+                })
             }
         },
         deletePress: function (sheet) {
@@ -484,6 +496,19 @@ function setLeafData(tree) {
     }
     return newtree;
 }
+
+function setMonthToLedger(ledgerList, slm) {
+    if (slm.length > 0) {
+        for(const s of slm) {
+            const index = _.findIndex(ledgerList, { 'ledger_id': s.lid });
+            if (index && index !== -1) {
+                ledgerList[index][s.yearmonth + '_tp'] = s.plan_tp;
+                ledgerList[index][s.yearmonth + '_gcl'] = s.plan_gcl;
+            }
+        }
+    }
+    return ledgerList;
+}
 const is_numeric = (value) => {
     if (typeof(value) === 'object') {
         return false;

+ 40 - 11
app/public/js/shenpi.js

@@ -661,7 +661,7 @@ $(document).ready(function () {
                 }
             }
             if(selects.length > 0) {
-                updateByCanEdit(ledgerTree.nodes, _.filter(ledger_cooperation_list, { user_id: parseInt(uid) }), false);
+                // updateByCanEdit(ledgerTree.nodes, _.filter(ledger_cooperation_list, { user_id: parseInt(uid) }), false);
                 const refreshNode = ledgerTree.loadPostData({update: selects});
                 ledgerSpreadObj.refreshTree(ledgerSpread.getActiveSheet(), refreshNode);
                 ledgerSpreadObj.setFontColor();
@@ -783,10 +783,10 @@ $(document).ready(function () {
                     $('#cooperation-num').text(ledger_cooperation_list.length);
                     setLeftTable(ledgerTree.datas, ledger_cooperation_list, user_id, $('#stage_audits option:selected').text());
                     selects = [select];
-                    if(select) {
-                        setAllChildrenCanEdit(select, flag);
-                        // setParentCanEdit(ledgerTree.nodes, select.ledger_pid, flag);
-                    }
+                    // if(select) {
+                    //     setAllChildrenCanEdit(select, flag);
+                    //     setParentCanEdit(ledgerTree.nodes, select.ledger_pid, flag);
+                    // }
                     const refreshNode = ledgerTree.loadPostData({update: selects});
                     ledgerSpreadObj.refreshTree(info.sheet, refreshNode);
                     ledgerSpreadObj.setFontColor();
@@ -855,7 +855,7 @@ $(document).ready(function () {
                 setLeftTable(ledgerList, ledger_cooperation_list, cur_uid, yb.name + '(原报)');
                 // treeCalc.calculateAll(ledgerTree);
                 selects = [];
-                updateByCanEdit(ledgerTree.nodes, _.filter(ledger_cooperation_list, { user_id: cur_uid }), false);
+                // updateByCanEdit(ledgerTree.nodes, _.filter(ledger_cooperation_list, { user_id: cur_uid }), false);
                 ledgerTree.loadPostData({update: selects});
                 console.log(ledgerTree);
                 SpreadJsObj.loadSheetData(ledgerSpread.getActiveSheet(), SpreadJsObj.DataType.Tree, ledgerTree);
@@ -889,10 +889,10 @@ $(document).ready(function () {
             delete select.pwd;
             // const refreshNode = ledgerTree.loadPostData({update: select});
             selects = [select];
-            if(select) {
-                setAllChildrenCanEdit(select, true);
+            // if(select) {
+            //     setAllChildrenCanEdit(select, true);
                 // setParentCanEdit(ledgerTree.nodes, select.ledger_pid, true);
-            }
+            // }
             const refreshNode = ledgerTree.loadPostData({update: selects});
             ledgerSpreadObj.refreshTree(ledgerSpread.getActiveSheet(), refreshNode);
             ledgerSpreadObj.setFontColor();
@@ -1063,7 +1063,36 @@ function setAllChildrenCanEdit(ledgerInfo, flag) {
         }
     }
 }
-
+// 编号排序,多重判断
+function sortByCode(a, b) {
+    let code1 = a.code.split('-');
+    let code2 = b.code.split('-');
+    let code1length = code1.length;
+    let code2length = code2.length;
+    for (let i = 0; i < code1length; i ++) {
+        if (i+1 <= code2length) {
+            if (code1[i] != code2[i]) {
+                if (!/^\d+$/.test(code1[i])) {
+                    return code1[i].charCodeAt() - code2[i].charCodeAt();
+                } else {
+                    return parseInt(code1[i]) - parseInt(code2[i]);
+                }
+            } else if (i+1 == code1length && code1[i] == code2[i]) {
+                if (code1length == code2length) {
+                    return 0;
+                } else {
+                    return code1length - code2length;
+                }
+            }
+        } else {
+            if (i+1 >= code1length) {
+                return 1;
+            } else {
+                return -1;
+            }
+        }
+    }
+}
 function setLeftTable(ledgerList, coolist, uid, title) {
     $('#stage_audit').text(title);
     const showCooList = _.filter(coolist, { 'user_id': parseInt(uid) });
@@ -1084,7 +1113,7 @@ function setLeftTable(ledgerList, coolist, uid, title) {
     }
 
     let html = '';
-    for (const sc of showCooList) {
+    for (const sc of showCooList.sort(sortByCode)) {
         const pichtml = sc.sign_path ? `<img src="/${sc.sign_path}" width="60"><input type="file" data-id="${sc.id}" class="upload-img-file" style="display: none;"><a href="javascript: void(0);" class="d-inline-flex upload-img">更改</a>`
             : `<img src="" style="display: none" width="60"><input type="file" data-id="${sc.id}" class="upload-img-file" style="display: none;"><a href="javascript: void(0);" class="btn btn-outline-primary btn-sm upload-img">上传签名</a>`;
         html += `<tr>` +

+ 30 - 16
app/public/js/stage.js

@@ -2803,11 +2803,14 @@ $(document).ready(() => {
                         if (newValue !== '') {
                             update[field] = newValue;
                             if (data.custom_define.indexOf(field) === -1) update.custom_define.push(field);
+                            return true;
                         }
                     } else if (newValue !== org[field]){
                         update[field] = newValue;
                         if (data.custom_define.indexOf(field) === -1) update.custom_define.push(field);
+                        return true;
                     }
+                    return false;
                 }
 
                 const data = SpreadJsObj.getSelectObject(self.spread.getActiveSheet());
@@ -2824,30 +2827,34 @@ $(document).ready(() => {
                     updateData.pos_name = data.pos_name;
                     updateData.custom_define = [];
                 }
-                check('bw', $('#bw-name'), data, updateData);
-                check('peg', $('#peg'), data, updateData);
-                check('xm', $('#xm-name'), data, updateData);
-                check('position', $('#position'), data, updateData);
-                check('jldy', $('#jldy'), data, updateData);
-                check('drawing_code', $('#drawing-code'), data, updateData);
-                check('calc_memo', $('#calc-memo'), data, updateData);
+                let infoUpdate = false;
+                infoUpdate = check('bw', $('#bw-name'), data, updateData) || infoUpdate;
+                infoUpdate = check('peg', $('#peg'), data, updateData) || infoUpdate;
+                infoUpdate = check('xm', $('#xm-name'), data, updateData) || infoUpdate;
+                infoUpdate = check('position', $('#position'), data, updateData) || infoUpdate;
+                infoUpdate = check('jldy', $('#jldy'), data, updateData) || infoUpdate;
+                infoUpdate = check('drawing_code', $('#drawing-code'), data, updateData) || infoUpdate;
+                infoUpdate = check('calc_memo', $('#calc-memo'), data, updateData) || infoUpdate;
                 updateData.custom_define = updateData.custom_define.join(',');
-                postData(window.location.pathname + '/detail/save', updateData, function (result) {
-                    stageIm.loadUpdateDetailData(result);
-                    self.reLoadDetailData();
-                    if (self.updateImageData && !self.updateImageData.uuid) {
-                        self.updateImageData.uuid = result.uuid;
+                if (infoUpdate) {
+                    postData(window.location.pathname + '/detail/save', updateData, function (result) {
+                        stageIm.loadUpdateDetailData(result);
+                        self.reLoadDetailData();
+                        if (!self.updateImageData) return;
+
+                        if (!self.updateImageData.uuid) self.updateImageData.uuid = result.uuid;
                         postData(window.location.pathname + '/detail/merge-img', self.updateImageData, function (result) {
                             stageIm.loadUpdateDetailData(result);
                             self.reLoadDetailData();
                         });
-                    }
-                });
-                if (self.updateImageData && self.updateImageData.uuid) {
+                    });
+                } else if (self.updateImageData) {
                     postData(window.location.pathname + '/detail/merge-img', self.updateImageData, function (result) {
                         stageIm.loadUpdateDetailData(result);
                         self.reLoadDetailData();
                     });
+                } else {
+                    self.reLoadDetailData();
                 }
             });
             // 取消
@@ -2958,7 +2965,7 @@ $(document).ready(() => {
             $('#edit-img-ok').click(function () {
                 // 记录上传的图片的信息
                 const items = $('.img-item');
-                const img_remark = $('#text-edit').val()
+                const img_remark = $('#text-edit').val();
                 const data = SpreadJsObj.getSelectObject(self.spread.getActiveSheet());
                 if (items.length > 0) {
                     const itemInfo = [];
@@ -2989,6 +2996,13 @@ $(document).ready(() => {
                     const updateData = {updateType: 'update', lid: data.lid, pid: data.pid};
                     if (data.uuid) {
                         updateData.uuid = data.uuid;
+                    } else {
+                        updateData.code = data.code;
+                        updateData.name = data.name;
+                        updateData.unit = data.unit;
+                        updateData.unit_price = data.unit_price;
+                        updateData.pid = data.pid;
+                        updateData.pos_name = data.pos_name;
                     }
 
                     updateData.img = canvas.toDataURL('image/png');

+ 6 - 0
app/public/report/js/rpt_custom.js

@@ -183,6 +183,11 @@ const rptCustomObj = (function () {
     const initAuditSelect = function (asSetting, asSelect) {
         const setting = JSON.parse(asSetting), select = asSelect;
         $('#audit-select-title').html(setting.title);
+        if (setting.hideSign) {
+            $('#pnl_eSignature').hide();
+        } else {
+            $('#pnl_eSignature').show();
+        }
         const html = [];
         for (const [i, s] of setting.select.entries()) {
             html.push('<tr>');
@@ -291,6 +296,7 @@ const rptCustomObj = (function () {
             $('#pnl_audit_select').show();
             initAuditSelect(cDefine[sAuditSelect].setting, cSelect ? cSelect[sAuditSelect] : []);
         } else {
+            $('#pnl_eSignature').show();
             $('#pnl_audit_select').hide();
         }
         if (cDefine && cDefine[sGatherSelect] && cDefine[sGatherSelect].enable && cDefine[sGatherSelect].setting) {

+ 34 - 0
app/service/schedule_ledger_month.js

@@ -6,6 +6,40 @@ module.exports = app => {
             super(ctx);
             this.tableName = 'schedule_ledger_month';
         }
+
+        async save(data) {
+            // 判断是添加,删除,还是修改
+            const transaction = await this.db.beginTransaction();
+            try {
+                const info = await this.getDataByCondition({ tid: this.ctx.tender.id, lid: data.lid, yearmonth: data.yearmonth });
+                if (info) {
+                    if (data.plan_gcl === null && data.plan_tp === null) {
+                        await transaction.delete(this.tableName, { id: info.id });
+                    } else {
+                        const updateData = {
+                            id: info.id,
+                            plan_gcl: data.plan_gcl,
+                            plan_tp: data.plan_tp,
+                        };
+                        await transaction.update(this.tableName, updateData);
+                    }
+                } else {
+                    const insertData = {
+                        tid: this.ctx.tender.id,
+                        lid: data.lid,
+                        yearmonth: data.yearmonth,
+                        plan_gcl: data.plan_gcl,
+                        plan_tp: data.plan_tp,
+                    };
+                    await transaction.insert(this.tableName, insertData);
+                }
+                await transaction.commit();
+                return true;
+            } catch (err) {
+                await transaction.rollback();
+                throw err;
+            }
+        }
     }
     return ScheduleLedgerMonth;
 };

+ 0 - 1
app/service/stage_detail.js

@@ -8,7 +8,6 @@
  * @version
  */
 const timesLen = require('../const/audit').stage.timesLen;
-const editField = ['doc_code', 'bw', 'start_peg', 'end_peg', 'jldy', 'drawing_code', 'calc_memo', 'calc_img', 'calc_img_org', 'peg', 'xm', 'position', '']
 
 module.exports = app => {
     class StageDetail extends app.BaseService {

+ 14 - 1
app/view/change/information.ejs

@@ -352,7 +352,19 @@
                 </div>
             </div>
             <div class="c-body col-8">
-                <div class="sjs-height-0" id="change-spread">
+                <div class="sjs-height-1" id="change-spread">
+                </div>
+                <!--下半部分-->
+                <div class="bcontent-wrap">
+                    <div class="bc-bar mb-1">
+                        <ul class="nav nav-tabs">
+                            <li class="nav-item">
+                                <a class="nav-link active" href="#">所属项目节</a>
+                            </li>
+                        </ul>
+                    </div>
+                    <div class="sp-wrap" id="xmj-spread">
+                    </div>
                 </div>
             </div>
         </div>
@@ -379,6 +391,7 @@
     const readOnly = <%- change.readOnly %>;
     const changeSpread = SpreadJsObj.createNewSpread($('#change-spread')[0]);
     const changeSpreadSheet = changeSpread.getActiveSheet();
+    const xmjSpread = SpreadJsObj.createNewSpread($('#xmj-spread')[0]);
     let changeList = JSON.parse(unescape('<%- escape(JSON.stringify(changeList)) %>'));
     const style1 = new GC.Spread.Sheets.Style();
     style1.locked = true;

+ 1 - 1
app/view/stage/audit_modal.ejs

@@ -644,7 +644,7 @@
                                                                 id="inlineRadio2"
                                                                 value="<%- auditConst.status.checkNoPre %>">
                                                             <label class="form-check-label" for="inlineRadio2">退回上一审批人
-                                                                <%- auditors[index-1].status === auditConst.status.checkAgain ? auditors[index-3].name : auditors[index-1].name %></label>
+                                                                <%- auditors[index-1].status === auditConst.status.checkAgain || auditors[index-1].status === auditConst.status.checkNoPre ? auditors[index-3].name : auditors[index-1].name %></label>
                                                         </div>
                                                         <% } %>
                                                     </div>

+ 63 - 1
builder_report_index_define.js

@@ -687,6 +687,14 @@ const stage_im_zl = {
         { name: '签名2', field: 'co_sign2', type: dataType.str, isPic: true },
         { name: '签名3', field: 'co_sign3', type: dataType.str, isPic: true },
         { name: '签名4', field: 'co_sign4', type: dataType.str, isPic: true },
+        { name: '审批时间1', field: 'co_time1', type: dataType.time },
+        { name: '审批时间2', field: 'co_time2', type: dataType.time },
+        { name: '审批时间3', field: 'co_time3', type: dataType.time },
+        { name: '审批时间4', field: 'co_time4', type: dataType.time },
+        { name: '审批意见1', field: 'co_opinion1', type: dataType.time },
+        { name: '审批意见2', field: 'co_opinion2', type: dataType.time },
+        { name: '审批意见3', field: 'co_opinion3', type: dataType.time },
+        { name: '审批意见4', field: 'co_opinion4', type: dataType.time },
     ],
 };
 const stage_im_tz = {
@@ -728,6 +736,14 @@ const stage_im_tz = {
         { name: '签名2', field: 'co_sign2', type: dataType.str, isPic: true },
         { name: '签名3', field: 'co_sign3', type: dataType.str, isPic: true },
         { name: '签名4', field: 'co_sign4', type: dataType.str, isPic: true },
+        { name: '审批时间1', field: 'co_time1', type: dataType.time },
+        { name: '审批时间2', field: 'co_time2', type: dataType.time },
+        { name: '审批时间3', field: 'co_time3', type: dataType.time },
+        { name: '审批时间4', field: 'co_time4', type: dataType.time },
+        { name: '审批意见1', field: 'co_opinion1', type: dataType.time },
+        { name: '审批意见2', field: 'co_opinion2', type: dataType.time },
+        { name: '审批意见3', field: 'co_opinion3', type: dataType.time },
+        { name: '审批意见4', field: 'co_opinion4', type: dataType.time },
 
     ],
 };
@@ -1191,6 +1207,52 @@ const stage_audit = {
     ],
 };
 
+const sign_select = {
+    name: '电子签名(mem_sign_select)',
+    remark: '',
+    id: 47,
+    key: 'mem_sign_select',
+    prefix: '电子签名',
+    cols: [
+        { name: 'id-1', field: 'sign1.id', type: dataType.int },
+        { name: '名字-1', field: 'sign1.name', type: dataType.str },
+        { name: '审批意见-1', field: 'sign1.opinion', type: dataType.str },
+        { name: '审批时间-1', field: 'sign1.end_time', type: dataType.str },
+        { name: '签名-1', field: 'sign1.sign_path', type: dataType.str, isPic: true },
+        { name: '协作签名-1', field: 'sign1.co_sign', type: dataType.str, isPic: true },
+        { name: 'id-2', field: 'sign2.id', type: dataType.int },
+        { name: '名字-2', field: 'sign2.name', type: dataType.str },
+        { name: '审批意见-2', field: 'sign2.opinion', type: dataType.str },
+        { name: '审批时间-2', field: 'sign2.end_time', type: dataType.str },
+        { name: '签名-2', field: 'sign2.sign_path', type: dataType.str, isPic: true },
+        { name: '协作签名-2', field: 'sign2.co_sign', type: dataType.str, isPic: true },
+        { name: 'id-3', field: 'sign3.id', type: dataType.int },
+        { name: '名字-3', field: 'sign3.name', type: dataType.str },
+        { name: '审批意见-3', field: 'sign3.opinion', type: dataType.str },
+        { name: '审批时间-3', field: 'sign3.end_time', type: dataType.str },
+        { name: '签名-3', field: 'sign3.sign_path', type: dataType.str, isPic: true },
+        { name: '协作签名-3', field: 'sign3.co_sign', type: dataType.str, isPic: true },
+        { name: 'id-4', field: 'sign4.id', type: dataType.int },
+        { name: '名字-4', field: 'sign4.name', type: dataType.str },
+        { name: '审批意见-4', field: 'sign4.opinion', type: dataType.str },
+        { name: '审批时间-4', field: 'sign4.end_time', type: dataType.str },
+        { name: '签名-4', field: 'sign4.sign_path', type: dataType.str, isPic: true },
+        { name: '协作签名-4', field: 'sign4.co_sign', type: dataType.str, isPic: true },
+        { name: 'id-5', field: 'sign5.id', type: dataType.int },
+        { name: '名字-5', field: 'sign5.name', type: dataType.str },
+        { name: '审批意见-5', field: 'sign5.opinion', type: dataType.str },
+        { name: '审批时间-5', field: 'sign5.end_time', type: dataType.str },
+        { name: '签名-5', field: 'sign5.sign_path', type: dataType.str, isPic: true },
+        { name: '协作签名-5', field: 'sign5.co_sign', type: dataType.str, isPic: true },
+        { name: 'id-6', field: 'sign6.id', type: dataType.int },
+        { name: '名字-6', field: 'sign6.name', type: dataType.str },
+        { name: '审批意见-6', field: 'sign6.opinion', type: dataType.str },
+        { name: '审批时间-6', field: 'sign6.end_time', type: dataType.str },
+        { name: '签名-6', field: 'sign6.sign_path', type: dataType.str, isPic: true },
+        { name: '协作签名-6', field: 'sign6.co_sign', type: dataType.str, isPic: true },
+    ],
+};
+
 const recursiveMkdirSync = async function(pathName) {
     if (!fs.existsSync(pathName)) {
         const upperPath = path.dirname(pathName);
@@ -1294,7 +1356,7 @@ const defines = [
     stage_im_zl, stage_im_tz, stage_im_tz_bills,
     gather_stage_bills, gather_tender_info, gather_stage_pay, gather_deal_bills,
     material, materialGl,
-    stage_sum_bills, stage_sum_pay, stage_audit,
+    stage_sum_bills, stage_sum_pay, stage_audit, sign_select,
 ];
 for (const d of defines) {
     exportTableDefine(d);

+ 5 - 1
sql/update.sql

@@ -19,4 +19,8 @@ CREATE TABLE `zh_ledger_cooperation` (
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='台账多人协同表';
 
 
-CREATE UNIQUE INDEX `idx_tid_sid_rid`  ON `zh_rpt_custom_define` (tid, sid, rid) COMMENT '电子签名数据索引' ALGORITHM DEFAULT LOCK DEFAULT;
+CREATE UNIQUE INDEX `idx_tid_sid_rid`  ON `zh_rpt_custom_define` (tid, sid, rid) COMMENT '电子签名数据索引' ALGORITHM DEFAULT LOCK DEFAULT;
+
+ALTER TABLE `zh_change_audit_list` ADD `xmj_dwgc` varchar(255) NULL DEFAULT NULL COMMENT '单位工程' AFTER `xmj_jldy`;
+ALTER TABLE `zh_change_audit_list` ADD `xmj_fbgc` varchar(255) NULL DEFAULT NULL COMMENT '分部工程' AFTER `xmj_dwgc`;
+ALTER TABLE `zh_change_audit_list` ADD `xmj_fxgc` varchar(255) NULL DEFAULT NULL COMMENT '分项工程' AFTER `xmj_fbgc`;