Browse Source

1. 本期计量台账,部位明细,复制粘贴、删除数量报错
2. 本期计量台账,部位明细,计算截止本期数据
3. 本期计量台账,部位明细,本期批注
4. 期列表,显示计量月份
5. 期列表,编辑功能

MaiXinRong 6 years ago
parent
commit
33454bbbee

+ 2 - 2
app/const/spread.js

@@ -96,8 +96,8 @@ const stage = {
             {title: '|数量变更计量', colSpan: '|1', rowSpan: '|1', field: 'end_qc_qty', hAlign: 2, width: 80, type: 'Number', readOnly: true},
             {title: '|数量变更计量', colSpan: '|1', rowSpan: '|1', field: 'end_qc_qty', hAlign: 2, width: 80, type: 'Number', readOnly: true},
             {title: '|变更令', colSpan: '|1', rowSpan: '|1', field: 'end_qc_bgl', hAlign: 0, width: 60, formatter: '@', readOnly: true},
             {title: '|变更令', colSpan: '|1', rowSpan: '|1', field: 'end_qc_bgl', hAlign: 0, width: 60, formatter: '@', readOnly: true},
             {title: '|完成计量', colSpan: '|1', rowSpan: '|1', field: 'end_gather_qty', hAlign: 2, width: 60, type: 'Number', readOnly: true},
             {title: '|完成计量', colSpan: '|1', rowSpan: '|1', field: 'end_gather_qty', hAlign: 2, width: 60, type: 'Number', readOnly: true},
-            {title: '本期批注', colSpan: '1', rowSpan: '2', field: 'b_code', hAlign: 0, width: 80, formatter: '@'},
-            {title: '图册号', colSpan: '1', rowSpan: '2', field: 'b_code', hAlign: 0, width: 80, formatter: '@', readOnly: true},
+            {title: '本期批注', colSpan: '1', rowSpan: '2', field: 'postil', hAlign: 0, width: 80, formatter: '@'},
+            {title: '图册号', colSpan: '1', rowSpan: '2', field: 'drawing_code', hAlign: 0, width: 80, formatter: '@', readOnly: true},
             {title: '添加期数', colSpan: '1', rowSpan: '2', field: 'add_stage', hAlign:1, width: 80, readOnly: true},
             {title: '添加期数', colSpan: '1', rowSpan: '2', field: 'add_stage', hAlign:1, width: 80, readOnly: true},
         ],
         ],
         emptyRows: 3,
         emptyRows: 3,

+ 21 - 427
app/controller/measure_controller.js

@@ -32,7 +32,7 @@ module.exports = app => {
         }
         }
 
 
         /**
         /**
-         * 期计量(Get)
+         * 期列表(Get)
          * @param ctx
          * @param ctx
          * @returns {Promise<void>}
          * @returns {Promise<void>}
          */
          */
@@ -60,7 +60,7 @@ module.exports = app => {
          * @param ctx
          * @param ctx
          * @returns {Promise<void>}
          * @returns {Promise<void>}
          */
          */
-        async addStage(ctx) {
+        async add(ctx) {
             try {
             try {
                 if (ctx.session.sessionUser.accountId !== ctx.tender.data.user_id) {
                 if (ctx.session.sessionUser.accountId !== ctx.tender.data.user_id) {
                     throw '您无权创建计量期';
                     throw '您无权创建计量期';
@@ -78,9 +78,18 @@ module.exports = app => {
             }
             }
         }
         }
 
 
-        async saveStage(ctx) {
+        /**
+         * 编辑期(Post)
+         * @param ctx
+         * @returns {Promise<void>}
+         */
+        async save(ctx) {
             try {
             try {
-                const data = JSON.parse(ctx.request.body.data);
+                const data = {
+                    order: ctx.request.body.order,
+                    date: ctx.request.body.date,
+                    period: ctx.request.body.period,
+                };
                 const stage = await ctx.service.stage.getDataByCondition({
                 const stage = await ctx.service.stage.getDataByCondition({
                     tid: ctx.tender.id,
                     tid: ctx.tender.id,
                     order: data.order,
                     order: data.order,
@@ -95,15 +104,15 @@ module.exports = app => {
                     throw '您无权修改该数据';
                     throw '您无权修改该数据';
                 }
                 }
                 await this.ctx.service.stage.saveStage(ctx.tender.id, data.order, data.date, data.period);
                 await this.ctx.service.stage.saveStage(ctx.tender.id, data.order, data.date, data.period);
-                ctx.body = {err: 0, msg: '', data: null};
+                ctx.redirect('/tender/' + ctx.tender.id + '/measure/stage/');
             } catch (err) {
             } catch (err) {
                 this.log(err);
                 this.log(err);
-                ctx.body = {err: 1, msg: err.toString(), data: null};
+                ctx.redirect('/tender/' + ctx.tender.id + '/measure/stage/');
             }
             }
         }
         }
 
 
         /**
         /**
-         * 清单汇总
+         * 多期汇总 (Get)
          * @param ctx
          * @param ctx
          * @returns {Promise<void>}
          * @returns {Promise<void>}
          */
          */
@@ -121,6 +130,11 @@ module.exports = app => {
             }
             }
         }
         }
 
 
+        /**
+         * 多期比较(Get)
+         * @param ctx
+         * @returns {Promise<void>}
+         */
         async compare(ctx) {
         async compare(ctx) {
             try {
             try {
                 const renderData = {
                 const renderData = {
@@ -134,426 +148,6 @@ module.exports = app => {
                 ctx.redirect(this.menu.menu.dashboard.url);
                 ctx.redirect(this.menu.menu.dashboard.url);
             }
             }
         }
         }
-
-        async list(ctx) {
-            try {
-                const tenderList = ctx.tenderList;
-                const tenderData = ctx.tenderData;
-
-                const codeRule = tenderData.m_rule ? JSON.parse(tenderData.m_rule) : [];
-                for (const rule of codeRule) {
-                    switch (rule.rule_type) {
-                        case codeRuleConst.measure.ruleType.tenderName:
-                            rule.preview = tenderData.name;
-                            break;
-                        case codeRuleConst.measure.ruleType.inDate:
-                            rule.preview = moment().format('YYYYMM');
-                            break;
-                        case codeRuleConst.measure.ruleType.text:
-                            rule.preview = rule.text;
-                            break;
-                        case codeRuleConst.measure.ruleType.addNo:
-                            const s = '0000000000';
-                            rule.preview = s.substr(s.length - rule.format);
-                            break;
-                    }
-                }
-                const works = await ctx.service.measure.measureList({
-                    tender_id: tenderData.id,
-                    user_id: ctx.session.sessionUser.accountId,
-                    valid: true,
-                });
-                const renderData = {
-                    tenderData,
-                    tenderList,
-                    ruleType: codeRuleConst.ruleType.measure,
-                    ruleConst: codeRuleConst.measure,
-                    codeRule,
-                    works,
-                    auditConst,
-                };
-                await this.layout('measure/wlist.ejs', renderData, 'measure/wlist_modal.ejs');
-            } catch (err) {
-                this.log(err);
-                ctx.redirect(ctx.menuList.dashboard.url);
-            }
-        }
-
-        /**
-         * 中间计量--计量编制 页面 (Get)
-         *
-         * @param {Object} ctx - egg全局变量
-         * @return {void}
-         */
-        async work(ctx) {
-            try {
-                const tenderList = ctx.tenderList;
-                const tenderData = ctx.tenderData;
-                const codeRule = tenderData.m_rule ? JSON.parse(tenderData.m_rule) : [];
-                for (const rule of codeRule) {
-                    switch (rule.rule_type) {
-                        case codeRuleConst.measure.ruleType.tenderName:
-                            rule.preview = tenderData.name;
-                            break;
-                        case codeRuleConst.measure.ruleType.inDate:
-                            rule.preview = moment().format('YYYYMM');
-                            break;
-                        case codeRuleConst.measure.ruleType.text:
-                            rule.preview = rule.text;
-                            break;
-                        case codeRuleConst.measure.ruleType.addNo:
-                            const s = '0000000000';
-                            rule.preview = s.substr(s.length - rule.format);
-                            break;
-                    }
-                }
-
-                const mid = ctx.params.mid
-                const measure = await ctx.service.measure.getDataByCondition({mid: mid, valid: true});
-                if (!measure) {
-                    throw '该数据已被删除'
-                }
-                const renderData = {
-                    tenderData,
-                    tenderList,
-                    auditConst,
-                    measure,
-                    measureSpreadSetting: JSON.stringify(spreadConst.measureSpread),
-                };
-                await this.layout('measure/work.ejs', renderData, 'measure/work_modal.ejs');
-            } catch (err) {
-                this.log(err);
-                ctx.redirect(ctx.menuList.dashboard.url);
-            }
-        }
-
-        /**
-         * 中间计量 -- 获取新编号 (Ajax)
-         *
-         * @param {Object} ctx - egg全局变量
-         * @returns {Promise<void>}
-         */
-        async newCode(ctx) {
-            const responseData = {
-                err: 0,
-                msg: '',
-                data: '',
-            };
-            try {
-                const tenderId = ctx.session.sessionUser.tenderId;
-                if (!tenderId) {
-                    throw '当前未打开标段';
-                }
-                const tenderData = await ctx.service.tender.getDataById(tenderId);
-                const mCodeRule = JSON.parse(tenderData.m_rule);
-
-                const code = [];
-                for (const rule of mCodeRule) {
-                    switch (rule.rule_type) {
-                        case codeRuleConst.measure.ruleType.tenderName:
-                            code.push(tenderData.name);
-                            break;
-                        case codeRuleConst.measure.ruleType.text:
-                            code.push(rule.text);
-                            break;
-                        case codeRuleConst.measure.ruleType.inDate:
-                            code.push(moment().format('YYYYMM'));
-                            break;
-                        case codeRuleConst.measure.ruleType.addNo:
-                            let s = '0000000000';
-                            const count = rule.start + await ctx.service.measure.count({tender_id: tenderId});
-                            s = s + count;
-                            code.push(s.substr(s.length - rule.format));
-                            break;
-                    }
-                }
-                responseData.data = code.join('');
-            } catch (err) {
-                responseData.err = 1;
-                responseData.msg = err;
-            }
-
-            ctx.body = responseData;
-        }
-
-        /**
-         * 中间计量 -- 新增中间计量 (Ajax)
-         *
-         * @param {Object} ctx - egg全局变量
-         * @returns {Promise<void>}
-         */
-        async addMeasure(ctx) {
-            const responseData = {
-                err: 0,
-                msg: '',
-                data: '',
-            };
-            try {
-                const tenderId = ctx.session.sessionUser.tenderId;
-                if (!tenderId) {
-                    throw '当前未打开标段';
-                }
-                const tenderData = await ctx.service.tender.getDataById(tenderId);
-
-                const data = JSON.parse(ctx.request.body.data);
-                await ctx.service.measure.add(tenderId, data.code, ctx.session.sessionUser.accountId, data.date, data.stage);
-
-                responseData.data = await ctx.service.measure.measureData({
-                    tender_id: tenderId, code: data.code,
-                });
-            } catch (err) {
-                this.log(err);
-                responseData.err = 1;
-                responseData.msg = err.toString();
-            }
-            ctx.body = responseData;
-        }
-
-        async deleteMeasure(ctx) {
-            const responseData = {
-                err: 0,
-                msg: '',
-                data: '',
-            };
-            try {
-                const tenderId = ctx.session.sessionUser.tenderId;
-                if (!tenderId) {
-                    throw '当前未打开标段';
-                }
-
-                const data = JSON.parse(ctx.request.body.data);
-                responseData.data = await ctx.service.measure.invalid(tenderId, data.code, ctx.session.sessionUser.accountId);
-            } catch (err) {
-                this.log(err);
-                responseData.err = 1;
-                responseData.msg = err.toString();
-            }
-            ctx.body = responseData;
-        }
-
-        /**
-         * 获取中间计量详细数据(包括部位和清单) (Ajax)
-         * @param ctx - egg全局变量
-         * @returns {Promise<void>}
-         */
-        async measureDetail(ctx) {
-            const responseData = {
-                err: 0,
-                msg: '',
-                data: '',
-            };
-            try {
-                const tenderId = ctx.session.sessionUser.tenderId;
-                if (!tenderId) {
-                    throw '当前未打开标段';
-                }
-                const tenderData = await ctx.service.tender.getDataById(tenderId);
-
-                const data = JSON.parse(ctx.request.body.data);
-                if (!data.mid) {
-                    throw '查询数据有误';
-                }
-                const measure = await ctx.service.measure.getDataByCondition({
-                    tender_id: tenderId,
-                    mid: data.mid,
-                });
-                if (!measure.times) {
-                    measure.times = 1;
-                }
-
-                measure.pos = await ctx.service.measurePos.getPosDetail(tenderId, data.mid);
-                measure.bills = await ctx.service.measureBills.getBillsDetail(tenderId, data.mid);
-                measure.billsTree = await ctx.service.measureBills.getBillsDetailWithParent(tenderId, data.mid);
-                measure.curAuditor = await ctx.service.measureAudit.getCurAuditor(data.mid, measure.times);
-                if (measure.times > 1 && measure.status === auditConst.status.checkNo) {
-                    measure.auditors = await ctx.service.measureAudit.getAuditors(data.mid, measure.times-1);
-                } else {
-                    measure.auditors = await ctx.service.measureAudit.getAuditors(data.mid, measure.times);
-                }
-
-                responseData.data = measure;
-            } catch (err) {
-                this.log(err);
-                responseData.err = 1;
-                responseData.msg = err.toString();
-            }
-
-            ctx.body = responseData;
-        }
-
-        /**
-         * 查询部位或者清单 (Ajax)
-         *
-         * @param ctx - egg全局变量
-         * @returns {Promise<void>}
-         */
-        async search(ctx) {
-            const responseData = {
-                err: 0,
-                msg: '',
-                data: '',
-            };
-
-            try {
-                const tenderId = ctx.session.sessionUser.tenderId;
-                if (!tenderId) {
-                    throw '当前未打开标段';
-                }
-                const tenderData = await ctx.service.tender.getDataById(tenderId);
-
-                const data = JSON.parse(ctx.request.body.data);
-                if (!data.mid || !data.searchType) {
-                    throw '查询数据有误';
-                }
-
-                if (data.searchType === 'pos') {
-                    const key = {
-                        value: app.mysql.escape('%' + data.keyword + '%'),
-                        operate: 'Like',
-                        fields: ['code', 'name'],
-                    };
-                    responseData.data = await ctx.service.ledger.search(tenderId, key);
-                } else if (data.searchType === 'bills') {
-                    const key = {
-                        value: app.mysql.escape('%' + data.keyword + '%'),
-                        operate: 'Like',
-                        fields: ['b_code', 'name'],
-                    };
-
-                    const range = [];
-                    const pos = await ctx.service.measurePos.getPosDetail(tenderId, data.mid);
-                    const posFullPath = [];
-                    for (const p of pos) {
-                        posFullPath.push(app.mysql.escape(p.full_path + '.%'));
-                    }
-
-                    responseData.data = await ctx.service.ledger.searchRange(tenderId, key, [{
-                        value: posFullPath,
-                        operate: 'Like',
-                        fields: ['full_path'],
-                    }, {
-                        value: true,
-                        operate: '=',
-                        fields: ['is_leaf'],
-                    }]);
-                } else {
-                    throw '查询数据有误';
-                }
-            } catch (err) {
-                this.log(err);
-                responseData.err = 1;
-                responseData.msg = err.toString();
-            }
-
-            ctx.body = responseData;
-        }
-
-        /**
-         * 操作部位 -- 增删 (Ajax)
-         *
-         * @param ctx - egg全局变量
-         * @returns {Promise<void>}
-         */
-        async pos(ctx) {
-            const responseData = {
-                err: 0,
-                msg: '',
-                data: {},
-            };
-            try {
-                const tenderId = ctx.session.sessionUser.tenderId;
-                if (!tenderId) {
-                    throw '当前未打开标段';
-                }
-
-                const data = JSON.parse(ctx.request.body.data);
-                if (!data.mid || !data.operate || !data.pid) {
-                    throw '计量范围数据有误';
-                }
-
-                if (data.operate === 'add') {
-                    responseData.data = await ctx.service.measurePos.addPos(tenderId, data.mid, data.pid);
-                } else if (data.operate === 'remove') {
-                    await ctx.service.measurePos.removePos(tenderId, data.mid, data.pid);
-                } else {
-                    throw '未知操作';
-                }
-            } catch(err) {
-                this.log(err);
-                responseData.err = 1;
-                responseData.msg = err.toString();
-            }
-            ctx.body = responseData;
-        }
-
-        /**
-         * 操作清单 -- 增删 (Ajax)
-         * @param ctx
-         * @returns {Promise<void>}
-         */
-        async bills(ctx) {
-            const responseData = {
-                err: 0,
-                msg: '',
-                data: {},
-            };
-            try {
-                const tenderId = ctx.session.sessionUser.tenderId;
-                if (!tenderId) {
-                    throw '当前未打开标段';
-                }
-
-                const data = JSON.parse(ctx.request.body.data);
-                if (!data.mid || !data.operate || !data.bid) {
-                    throw '计量清单数据有误';
-                }
-
-                if (data.operate === 'add') {
-                    await ctx.service.measureBills.addBills(tenderId, data.mid, data.bid);
-                    responseData.data = await ctx.service.measureBills.getBillsDataWithParent(tenderId, data.mid, data.bid);
-                } else if (data.operate === 'remove') {
-                    responseData.data = await ctx.service.measureBills.getBillsDataWithParent(tenderId, data.mid, data.bid);
-                    await ctx.service.measureBills.removeBills(tenderId, data.mid, data.bid);
-                } else {
-                    throw '未知操作';
-                }
-            } catch(err) {
-                this.log(err);
-                responseData.err = 1;
-                responseData.msg = err.toString();
-                responseData.data = {};
-            }
-            ctx.body = responseData;
-        }
-
-        /**
-         * 清单 -- 计量 (Ajax)
-         * @param ctx
-         * @returns {Promise<void>}
-         */
-        async billsUpdate (ctx) {
-            const responseData = { err: 0, msg: '', data: {} };
-            try {
-                const tenderId = ctx.session.sessionUser.tenderId;
-                if (!tenderId) {
-                    throw '当前未打开标段';
-                }
-
-                const data = JSON.parse(ctx.request.body.data);
-                if (!data.mid || !data.bid || !data.update) {
-                    throw '计量清单数据有误';
-                }
-
-                responseData.data = await ctx.service.measureBills.updateBills(tenderId, data.mid, data.bid, data.update);
-            } catch(err) {
-                this.log(err);
-                responseData.err = 1;
-                responseData.msg = err.toString();
-                responseData.data = {};
-            }
-
-            ctx.body = responseData;
-        }
     }
     }
 
 
     return MeasureController;
     return MeasureController;

+ 1 - 1
app/public/js/ledger.js

@@ -777,7 +777,7 @@ $(document).ready(function() {
             if (info.sheet.zh_setting) {
             if (info.sheet.zh_setting) {
                 const data = [];
                 const data = [];
                 const sortData = info.sheet.zh_data || [];
                 const sortData = info.sheet.zh_data || [];
-                if (sortData.length === 0 || info.cellRange.row + info.cellRange.rowCount >= sortData.length) {
+                if (sortData.length === 0 || info.cellRange.row + info.cellRange.rowCount > sortData.length) {
                     if (info.cellRange.col !== 0) {
                     if (info.cellRange.col !== 0) {
                         toast('新增部位请先输入名称', 'warning');
                         toast('新增部位请先输入名称', 'warning');
                         self.loadCurPosData();
                         self.loadCurPosData();

+ 4 - 1
app/public/js/stage.js

@@ -107,10 +107,13 @@ $(document).ready(() => {
     // 初始化 部位明细
     // 初始化 部位明细
     const stagePosSetting = {
     const stagePosSetting = {
         id: 'id', ledgerId: 'lid',
         id: 'id', ledgerId: 'lid',
-        updateFields: ['contract_qty', 'qc_qty'],
+        updateFields: ['contract_qty', 'qc_qty', 'postil'],
     };
     };
     stagePosSetting.calcFun = function (pos) {
     stagePosSetting.calcFun = function (pos) {
         pos.gather_qty = _.add(pos.contract_qty, pos.qc_qty);
         pos.gather_qty = _.add(pos.contract_qty, pos.qc_qty);
+        pos.end_contract_qty = _.add(pos.pre_contract_qty, pos.contract_qty);
+        pos.end_qc_qty = _.add(pos.pre_qc_qty, pos.qc_qty);
+        pos.end_gather_qty = _.add(pos.pre_gather_qty, pos.gather_qty);
     };
     };
     const stagePos = new StagePosData(stagePosSetting);
     const stagePos = new StagePosData(stagePosSetting);
     const spSpread = SpreadJsObj.createNewSpread($('#stage-pos')[0]);
     const spSpread = SpreadJsObj.createNewSpread($('#stage-pos')[0]);

+ 5 - 2
app/public/js/tender_list.js

@@ -244,15 +244,18 @@ function recursiveGetTenderNodeHtml (node, arr) {
         html.push('</span>');
         html.push('</span>');
         //html.push('<a href="/tender/' + node.id + '">', node[c.field], '</a>');
         //html.push('<a href="/tender/' + node.id + '">', node[c.field], '</a>');
         html.push('<a href="javascript: void(0)" id="' + node.id + '">', node.name, '</a>');
         html.push('<a href="javascript: void(0)" id="' + node.id + '">', node.name, '</a>');
+        if (node.measure_type) {
+            html.push('<span class="small">', ' (', node.measure_type === measureType.tz.value ? '台账' : '清单', ')', '</span>');
+        }
     }
     }
     html.push('</td>');
     html.push('</td>');
     // 计量期数
     // 计量期数
     html.push('<td>');
     html.push('<td>');
-    html.push(node.lastStage ? '第' + node.lastStage.order + '期' : '');
+    html.push(node.lastStage ? '第' + node.lastStage.order + '期' : '台账');
     html.push('</td>');
     html.push('</td>');
     // 审批状态
     // 审批状态
     html.push('<td>');
     html.push('<td>');
-    html.push(node.lastStage ? auditConst.statusString[node.lastStage.status] : '');
+    html.push(node.lastStage ? auditConst.stage.statusString[node.lastStage.status] : auditConst.ledger.statusString[node.ledger_status]);
     html.push('</td>');
     html.push('</td>');
     // 0号台账合同
     // 0号台账合同
     html.push('<td>');
     html.push('<td>');

+ 2 - 2
app/router.js

@@ -114,8 +114,8 @@ module.exports = app => {
     // 计量台账
     // 计量台账
     // 期计量
     // 期计量
     app.get('/tender/:id/measure/stage', sessionAuth, tenderCheck, 'measureController.stage');
     app.get('/tender/:id/measure/stage', sessionAuth, tenderCheck, 'measureController.stage');
-    app.post('/tender/:id/measure/stage/add', sessionAuth, tenderCheck, 'measureController.addStage');
-    app.post('/tender/:id/measure/stage/save', sessionAuth, tenderCheck, 'measureController.saveStage');
+    app.post('/tender/:id/measure/add', sessionAuth, tenderCheck, 'measureController.add');
+    app.post('/tender/:id/measure/save', sessionAuth, tenderCheck, 'measureController.save');
     // 计量台账 -- 清单汇总
     // 计量台账 -- 清单汇总
     app.get('/tender/:id/measure/gather', sessionAuth, tenderCheck, 'measureController.gather');
     app.get('/tender/:id/measure/gather', sessionAuth, tenderCheck, 'measureController.gather');
     // 计量台账 -- 审核比较
     // 计量台账 -- 审核比较

+ 7 - 5
app/service/stage_pos.js

@@ -151,12 +151,14 @@ module.exports = app => {
             const orgStagePos = await this.getLastestStageData(this.ctx.tender.id, this.ctx.stage.id, this._.map(datas, 'pid'));
             const orgStagePos = await this.getLastestStageData(this.ctx.tender.id, this.ctx.stage.id, this._.map(datas, 'pid'));
             const userOrder = this.ctx.stage.curAuditor ? this.ctx.stage.curAuditor.order : 0;
             const userOrder = this.ctx.stage.curAuditor ? this.ctx.stage.curAuditor.order : 0;
             for (const d of datas) {
             for (const d of datas) {
-                if (!bills || bills.id !== data.lid) {
-                    bills = await this.ctx.service.ledger.getDataById(data.lid);
-                    precision = this.ctx.helper.findPrecision(this.ctx.tender.info.precision, bills.unit);
-                }
                 const osp = this._.find(orgStagePos, function (p) { return p.pid === d.pid; });
                 const osp = this._.find(orgStagePos, function (p) { return p.pid === d.pid; });
-                this.ctx.helper.checkFieldPrecision(d, this.qtyFields, precision.value);
+                if (d.contract_qty || d.qc_qty) {
+                    if (!bills || bills.id !== data.lid) {
+                        bills = await this.ctx.service.ledger.getDataById(d.lid);
+                        precision = this.ctx.helper.findPrecision(this.ctx.tender.info.precision, bills.unit);
+                    }
+                    this.ctx.helper.checkFieldPrecision(d, this.qtyFields, precision.value);
+                }
                 if (osp && osp.times === this.ctx.stage.times && osp.order === userOrder) {
                 if (osp && osp.times === this.ctx.stage.times && osp.order === userOrder) {
                     await transaction.update(this.tableName, d, {where: {id: osp.id}});
                     await transaction.update(this.tableName, d, {where: {id: osp.id}});
                 } else {
                 } else {

+ 5 - 2
app/view/measure/stage.ejs

@@ -38,7 +38,7 @@
                         <a href="#edit" data-toggle="modal" data-target="#edit"><i class="fa fa-pencil-square-o "></i></a>
                         <a href="#edit" data-toggle="modal" data-target="#edit"><i class="fa fa-pencil-square-o "></i></a>
                         <% } %>
                         <% } %>
                     </td>
                     </td>
-                    <td class="text-center"></td>
+                    <td class="text-center"><%- s.s_time %></td>
                     <td class="text-right"></td>
                     <td class="text-right"></td>
                     <td class="text-right"></td>
                     <td class="text-right"></td>
                     <td class="text-right"></td>
                     <td class="text-right"></td>
@@ -66,4 +66,7 @@
             </table>
             </table>
         </div>
         </div>
     </div>
     </div>
-</div>
+</div>
+<script>
+    const stages = JSON.parse('<%- JSON.stringify(stages) %>');
+</script>

+ 32 - 20
app/view/measure/stage_modal.ejs

@@ -3,7 +3,7 @@
 <!--弹出添加期-->
 <!--弹出添加期-->
 <div class="modal fade" id="add-qi" data-backdrop="static">
 <div class="modal fade" id="add-qi" data-backdrop="static">
     <div class="modal-dialog" role="document">
     <div class="modal-dialog" role="document">
-        <form class="modal-content" action="<%- preUrl + '/measure/stage/add' %>" method="post">
+        <form class="modal-content" action="<%- preUrl + '/measure/add' %>" method="post">
             <div class="modal-header">
             <div class="modal-header">
                 <h5 class="modal-title">添加新一期</h5>
                 <h5 class="modal-title">添加新一期</h5>
             </div>
             </div>
@@ -116,7 +116,7 @@
 <!--设置-->
 <!--设置-->
 <div class="modal fade" id="edit" data-backdrop="static">
 <div class="modal fade" id="edit" data-backdrop="static">
     <div class="modal-dialog" role="document">
     <div class="modal-dialog" role="document">
-        <div class="modal-content">
+        <form class="modal-content" action="<%- preUrl + '/measure/save' %>" method="post">
             <div class="modal-header">
             <div class="modal-header">
                 <h5 class="modal-title">期编辑</h5>
                 <h5 class="modal-title">期编辑</h5>
             </div>
             </div>
@@ -127,38 +127,50 @@
                 </div>
                 </div>
                 <div class="form-group">
                 <div class="form-group">
                     <label>计量年月</label>
                     <label>计量年月</label>
-                    <input class="datepicker-here form-control" name="edit-date" placeholder="点击选择年月" data-view="months" data-min-view="months" data-date-format="yyyy-MM" data-language="zh" type="text" value="<%- stages[0].s_time %>">
+                    <input class="datepicker-here form-control" id="edit-date" name="date" placeholder="点击选择年月" data-view="months" data-min-view="months" data-date-format="yyyy-MM" data-language="zh" type="text">
                 </div>
                 </div>
                 <div class="form-group">
                 <div class="form-group">
                     <label>开始-截止日期</label>
                     <label>开始-截止日期</label>
-                    <input class="datepicker-here form-control" name="edit-period" placeholder="点击选择时间" data-range="true" data-multiple-dates-separator=" ~ " data-language="zh" type="text" value="<%- stages[0].period %>">
+                    <input class="datepicker-here form-control" id="edit-period" name="period" placeholder="点击选择时间" data-range="true" data-multiple-dates-separator=" ~ " data-language="zh" type="text">
                 </div>
                 </div>
             </div>
             </div>
             <div class="modal-footer">
             <div class="modal-footer">
+                <input type="hidden" name="_csrf" value="<%= ctx.csrf %>" />
+                <input type="hidden" name="order" value="<%- stages[0].order %>">
                 <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>
                 <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>
-                <button type="button" class="btn btn-primary" id="edit-ok" s-order="<%- stages[0].order%>">确定修改</button>
+                <button type="submit" class="btn btn-primary" id="edit-ok" >确定修改</button>
             </div>
             </div>
-        </div>
+        </form>
     </div>
     </div>
 </div>
 </div>
 <% } %>
 <% } %>
 <script src="/public/js/datepicker/datepicker.min.js"></script>
 <script src="/public/js/datepicker/datepicker.min.js"></script>
 <script src="/public/js/datepicker/datepicker.zh.js"></script>
 <script src="/public/js/datepicker/datepicker.zh.js"></script>
 <script>
 <script>
-    $('#edit-ok').click(function () {
-        const data = {
-            order: parseInt($(this).attr('s-order')),
-            date: $('input[name=edit-date]').val(),
-            period: $('input[name=edit-period]').val(),
-        };
-        if (data.date === '' || data.period === '') {
-            return;
-        }
-        const tenderId = window.location.pathname.split('/')[2];
-        postData('/tender/' + tenderId + '/measure/stage/save', data, function () {
-            $('#edit').modal('hide');
-        });
-    });
+    <% if (stages.length > 0 && stages[0].status === auditConst.status.uncheck && stages[0].user_id === ctx.session.sessionUser.accountId) { %>
+    const editDate = $('#edit-date').datepicker().data('datepicker');
+    editDate.selectDate(new Date('<%- stages[0].s_time %>'));
+    const period = [];
+    for (const p of'<%- stages[0].period %>'.split('~')) {
+        period.push(new Date(p));
+    }
+    const editPeriod = $('#edit-period').datepicker().data('datepicker');
+    editPeriod.selectDate(period);
+    <% } %>
+    // $('#edit-ok').click(function () {
+    //     const data = {
+    //         order: parseInt($(this).attr('s-order')),
+    //         date: $('input[name=edit-date]').val(),
+    //         period: $('input[name=edit-period]').val(),
+    //     };
+    //     if (data.date === '' || data.period === '') {
+    //         return;
+    //     }
+    //     const tenderId = window.location.pathname.split('/')[2];
+    //     postData('/tender/' + tenderId + '/measure/stage/save', data, function () {
+    //         $('#edit').modal('hide');
+    //     });
+    // });
     $('.datepicker-here').datepicker({
     $('.datepicker-here').datepicker({
         autoClose: true,
         autoClose: true,
     });
     });

+ 2 - 1
app/view/tender/index.ejs

@@ -10,5 +10,6 @@
     const categoryType = JSON.parse('<%- JSON.stringify(settingConst.cType) %>');
     const categoryType = JSON.parse('<%- JSON.stringify(settingConst.cType) %>');
     const category = JSON.parse('<%- JSON.stringify(categoryData) %>');
     const category = JSON.parse('<%- JSON.stringify(categoryData) %>');
     const TenderTableCol = JSON.parse('<%- JSON.stringify(tableColSetting) %>');
     const TenderTableCol = JSON.parse('<%- JSON.stringify(tableColSetting) %>');
-    const auditConst = JSON.parse('<%- JSON.stringify(auditConst.stage) %>');
+    const auditConst = JSON.parse('<%- JSON.stringify(auditConst) %>');
+    const measureType = JSON.parse('<%- JSON.stringify(measureType) %>');
 </script>
 </script>