ソースを参照

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

TonyKang 3 年 前
コミット
595ec5b355

+ 2 - 2
app/controller/material_controller.js

@@ -200,7 +200,7 @@ module.exports = app => {
                 material: ctx.material,
                 shenpiConst,
             };
-            if ((ctx.material.status === auditConst.status.uncheck || ctx.material.status === auditConst.status.checkNo) && ctx.session.sessionUser.accountId === ctx.material.user_id) {
+            if ((ctx.material.status === auditConst.status.uncheck || ctx.material.status === auditConst.status.checkNo) && (ctx.session.sessionUser.accountId === ctx.material.user_id || ctx.tender.isTourist)) {
                 // data.accountGroup = accountGroup;
                 // 获取所有项目参与者
                 const accountList = await ctx.service.projectAccount.getAllDataByCondition({
@@ -1245,7 +1245,7 @@ module.exports = app => {
             ctx.material.checklistPermission = false;
             if (ctx.session.sessionProject.page_show.openMaterialChecklist && ctx.material.highOrder === ctx.material.order && ctx.material.status !== auditConst.status.checked) {
                 const permission = ctx.session.sessionUser.permission;
-                if ((permission.tender !== undefined && permission.tender.indexOf('4') !== -1) || (ctx.material.order === 1 && ctx.session.sessionUser.accountId === ctx.material.user_id && (ctx.material.status === auditConst.status.uncheck || ctx.material.status === auditConst.status.checkNo))) {
+                if ((permission && permission.tender !== undefined && permission.tender.indexOf('4') !== -1) || (ctx.material.order === 1 && ctx.session.sessionUser.accountId === ctx.material.user_id && (ctx.material.status === auditConst.status.uncheck || ctx.material.status === auditConst.status.checkNo))) {
                     ctx.material.checklistPermission = true;
                 }
             }

+ 1 - 1
app/controller/stage_controller.js

@@ -1087,7 +1087,7 @@ module.exports = app => {
                 data.tenderInfo = ctx.tender.info;
                 data.ledger = await ctx.service.ledger.getData(ctx.tender.id);
                 data.usedChangesId = await ctx.service.stageChange.getStageUsedChangeId(ctx.stage.id);
-                data.changes = await ctx.service.change.getChangeAndUsedInfo(ctx.tender.id);
+                data.changes = await ctx.service.stageChange.getChangeWithUsedInfo(ctx.stage);
                 if (data.changes.length > 0) {
                     const change = data.changes[0];
                     change.detail = await this._getChangeDetailData(ctx.tender.id, ctx.stage.id, change.cid);

+ 105 - 24
app/public/js/material.js

@@ -244,6 +244,16 @@ $(document).ready(() => {
     SpreadJsObj.loadSheetData(materialSpread.getActiveSheet(), SpreadJsObj.DataType.Data, materialBillsData);
 
     const materialSpreadObj = {
+        materialSheetReset: function () {
+            let newMaterialBillsData = materialBillsData;
+            if($('#bills0_list').is(':checked')) {
+                newMaterialBillsData = _.filter(materialBillsData, function (item) {
+                    return item.quantity === null || item.quantity === 0;
+                });
+            }
+            SpreadJsObj.loadSheetData(materialSpread.getActiveSheet(), SpreadJsObj.DataType.Data, newMaterialBillsData);
+            materialSpreadObj.refreshActn();
+        },
         refreshActn: function (rowCount = 1) {
             const setObjEnable = function (obj, enable) {
                 if (enable) {
@@ -256,8 +266,8 @@ $(document).ready(() => {
             const select = SpreadJsObj.getSelectObject(sheet);
             // 还需判断是否已被调差清单调用
             setObjEnable($('#del'), !readOnly && select && materialBase.isUsed(select) && rowCount === 1);
-            setObjEnable($('#up-move'), !readOnly && select && materialBillsData.indexOf(select) > 0);
-            setObjEnable($('#down-move'), !readOnly && select && materialBillsData.indexOf(select) < materialBillsData.length - 1);
+            setObjEnable($('#up-move'), !readOnly && select && materialBillsData.indexOf(select) > 0 && !$('#bills0_list').is(':checked'));
+            setObjEnable($('#down-move'), !readOnly && select && materialBillsData.indexOf(select) < materialBillsData.length - 1 && !$('#bills0_list').is(':checked'));
         },
         add: function () {
             const sheet = materialSpread.getActiveSheet();
@@ -266,8 +276,15 @@ $(document).ready(() => {
                     materialBillsData.push(result);
                     // sheet.addRows(materialBillsData.length - 1, 1);
                     // SpreadJsObj.reLoadRowData(sheet, materialBillsData.length - 1);
-                    SpreadJsObj.loadSheetData(materialSpread.getActiveSheet(), SpreadJsObj.DataType.Data, materialBillsData);
-                    sheet.setSelection(materialBillsData.length - 1, 0, 1, 1);
+                    let newMaterialBillsData = materialBillsData;
+                    if($('#bills0_list').is(':checked')) {
+                        newMaterialBillsData = _.filter(materialBillsData, function (item) {
+                            return item.quantity === null || item.quantity === 0;
+                        });
+                    }
+                    SpreadJsObj.loadSheetData(materialSpread.getActiveSheet(), SpreadJsObj.DataType.Data, newMaterialBillsData);
+                    // materialSpreadObj.materialSheetReset();
+                    sheet.setSelection(newMaterialBillsData.length - 1, 0, 1, 1);
                     materialSpreadObj.refreshActn();
                     // 月信息价需要同时添加空白的list
                     if (months.length > 0) {
@@ -276,8 +293,13 @@ $(document).ready(() => {
                             one_month[m] = null;
                         }
                         monthsList.push(one_month);
-                        materialMonthSpread.getActiveSheet().addRows(monthsList.length - 1, 1);
-                        SpreadJsObj.reLoadRowData(materialMonthSpread.getActiveSheet(), monthsList.length - 1);
+                        // const newMonthsList = _.filter(monthsList, function (item) {
+                        //     return _.findIndex(newMaterialBillsData, { code: item.code }) !== -1;
+                        // });
+                        // materialMonthSpread.getActiveSheet().addRows(newMonthsList.length - 1, 1);
+                        // SpreadJsObj.reLoadRowData(materialMonthSpread.getActiveSheet(), newMonthsList.length - 1);
+                        monthFunGather.monthsListSet();
+                        // materialMonthSpreadObj.monthsListSet();
                     }
                 }
             });
@@ -292,21 +314,32 @@ $(document).ready(() => {
                 }
                 resetTpTable();
                 const index = materialBillsData.indexOf(select);
+                let newMaterialBillsData = materialBillsData;
+                let newIndex = index;
+                if($('#bills0_list').is(':checked')) {
+                    newMaterialBillsData = _.filter(materialBillsData, function (item) {
+                        return item.quantity === null || item.quantity === 0;
+                    });
+                    newIndex = newMaterialBillsData.indexOf(select);
+                }
                 materialBillsData.splice(index, 1);
-                sheet.deleteRows(index, 1);
+                sheet.deleteRows(newIndex, 1);
                 // SpreadJsObj.reLoadSheetData(materialSpread.getActiveSheet());
                 const sel = sheet.getSelections();
-                sheet.setSelection(index > 0 ? index - 1 : 0, sel.length > 0 ? sel[0].col : 0, 1, 1);
+                sheet.setSelection(newIndex > 0 ? newIndex - 1 : 0, sel.length > 0 ? sel[0].col : 0, 1, 1);
                 materialSpreadObj.refreshActn();
                 // 月信息价需要同时删除
                 if (months.length > 0) {
                     monthsList.splice(index, 1);
-                    materialMonthSpread.getActiveSheet().deleteRows(index, 1);
+                    materialMonthSpread.getActiveSheet().deleteRows(newIndex, 1);
                     // SpreadJsObj.reLoadSheetData(materialMonthSpread.getActiveSheet());
                 }
             });
         },
         upMove: function () {
+            if($('#bills0_list').is(':checked')) {
+                return;
+            }
             const sheet = materialSpread.getActiveSheet();
             const cur = SpreadJsObj.getSelectObject(sheet);
             const up = materialBillsData[materialBillsData.indexOf(cur) - 1];
@@ -338,6 +371,9 @@ $(document).ready(() => {
             });
         },
         downMove: function () {
+            if($('#bills0_list').is(':checked')) {
+                return;
+            }
             const sheet = materialSpread.getActiveSheet();
             const cur = SpreadJsObj.getSelectObject(sheet);
             const down = materialBillsData[materialBillsData.indexOf(cur) + 1];
@@ -460,8 +496,9 @@ $(document).ready(() => {
                     SpreadJsObj.reLoadRowData(info.sheet, info.row);
                     // 判断如果是更改了编号,名称,单位,月信息价需要跟着改变值
                     if (months.length > 0 && (col.field === 'code' || col.field === 'name' || col.field === 'unit')) {
-                        monthsList[info.row][col.field] = validText;
-                        SpreadJsObj.reLoadRowData(materialMonthSpread.getActiveSheet(), info.row);
+                        const index = materialBillsData.indexOf(select);
+                        monthsList[index][col.field] = validText;
+                        monthFunGather.monthsListSet();
                     }
                 }, function () {
                     select[col.field] = orgValue;
@@ -617,7 +654,8 @@ $(document).ready(() => {
             postData(window.location.pathname + '/save', { type:'paste', updateData: data }, function (result) {
                 materialBillsData = result.info;
                 // SpreadJsObj.reLoadSheetData(materialSpread.getActiveSheet());
-                SpreadJsObj.loadSheetData(materialSpread.getActiveSheet(), SpreadJsObj.DataType.Data, materialBillsData);
+                materialSpreadObj.materialSheetReset();
+                // SpreadJsObj.loadSheetData(materialSpread.getActiveSheet(), SpreadJsObj.DataType.Data, materialBillsData);
                 // for (const row in rowData) {
                 //     materialBillsData.splice(index, 1, result.info[row]);
                 //     SpreadJsObj.reLoadRowData(info.sheet, row);
@@ -629,7 +667,8 @@ $(document).ready(() => {
                         m.unit = materialBillsData[i].unit;
                         m.origin = materialBillsData[i].origin;
                     }
-                    SpreadJsObj.loadSheetData(materialMonthSpread.getActiveSheet(), SpreadJsObj.DataType.Data, monthsList);
+                    // SpreadJsObj.loadSheetData(materialMonthSpread.getActiveSheet(), SpreadJsObj.DataType.Data, monthsList);
+                    monthFunGather.monthsListSet();
                     // SpreadJsObj.reLoadSheetData(materialMonthSpread.getActiveSheet());
                 }
                 m_tp = result.m_tp;
@@ -720,7 +759,7 @@ $(document).ready(() => {
             }
             return pushMonth;
         },
-        monthSheetReset: function () {
+        monthSheetReset: function (ml = monthsList) {
             const monthCols = monthFunGather._monthHeaderSet();
             const newMonthSpreadHeaderCols = static_cols.concat(monthCols);
             materialMonthSpreadSetting.cols = newMonthSpreadHeaderCols;
@@ -728,10 +767,21 @@ $(document).ready(() => {
             materialMonthSpread.getActiveSheet().reset();
             SpreadJsObj.initSpreadSettingEvents(materialMonthSpreadSetting, materialMonthCol);
             SpreadJsObj.initSheet(materialMonthSpread.getActiveSheet(), materialMonthSpreadSetting);
-            SpreadJsObj.loadSheetData(materialMonthSpread.getActiveSheet(), SpreadJsObj.DataType.Data, monthsList);
+            SpreadJsObj.loadSheetData(materialMonthSpread.getActiveSheet(), SpreadJsObj.DataType.Data, ml);
             monthFunGather._setMonthHtml();
+        },
+        monthsListSet: function (ml = materialBillsData, checked = true) {
+            if($('#bills0_list').is(':checked') && checked) {
+                ml = _.filter(materialBillsData, function (item) {
+                    return item.quantity === null || item.quantity === 0;
+                });
+            }
+            const newMonthsList = _.filter(monthsList, function (item) {
+                return _.findIndex(ml, { code: item.code }) !== -1;
+            });
+            monthFunGather.monthSheetReset(newMonthsList);
         }
-    }
+    };
 
     const materialMonthSpread = SpreadJsObj.createNewSpread($('#material-month-spread')[0]);
     const materialMonthSpreadSetting = {
@@ -794,7 +844,8 @@ $(document).ready(() => {
                     postData(window.location.pathname + '/month/save', { type:'updateOrigin', updateData: { mb_id: select.mb_id, value: validText } }, function (result) {
                         SpreadJsObj.reLoadRowData(info.sheet, info.row);
                         materialBillsData = result.materialBillsData;
-                        SpreadJsObj.loadSheetData(materialSpread.getActiveSheet(), SpreadJsObj.DataType.Data, materialBillsData);
+                        materialSpreadObj.materialSheetReset();
+                        // SpreadJsObj.loadSheetData(materialSpread.getActiveSheet(), SpreadJsObj.DataType.Data, materialBillsData);
                     }, function () {
                         select[col.field] = orgValue;
                         SpreadJsObj.reLoadRowData(info.sheet, info.row);
@@ -818,7 +869,8 @@ $(document).ready(() => {
                     postData(window.location.pathname + '/month/save', { type:'update', updateData: { mb_id: select.mb_id, yearmonth: col.field, value: validText } }, function (result) {
                         SpreadJsObj.reLoadRowData(info.sheet, info.row);
                         materialBillsData = result.materialBillsData;
-                        SpreadJsObj.loadSheetData(materialSpread.getActiveSheet(), SpreadJsObj.DataType.Data, materialBillsData);
+                        materialSpreadObj.materialSheetReset();
+                        // SpreadJsObj.loadSheetData(materialSpread.getActiveSheet(), SpreadJsObj.DataType.Data, materialBillsData);
                         m_tp = result.m_tp;
                         if (materialTax) {
                             m_tax_tp = result.m_tax_tp;
@@ -949,7 +1001,8 @@ $(document).ready(() => {
                 postData(window.location.pathname + '/month/save', { type:'paste', updateData: data }, function (result) {
                     SpreadJsObj.reLoadSheetData(materialMonthSpread.getActiveSheet());
                     materialBillsData = result.materialBillsData;
-                    SpreadJsObj.loadSheetData(materialSpread.getActiveSheet(), SpreadJsObj.DataType.Data, materialBillsData);
+                    materialSpreadObj.materialSheetReset();
+                    // SpreadJsObj.loadSheetData(materialSpread.getActiveSheet(), SpreadJsObj.DataType.Data, materialBillsData);
                     m_tp = result.m_tp;
                     if (materialTax) {
                         m_tax_tp = result.m_tax_tp;
@@ -1177,8 +1230,17 @@ $(document).ready(() => {
                 const sheet = materialSpread.getActiveSheet();
                 const select = SpreadJsObj.getSelectObject(sheet);
                 const index = materialBillsData.indexOf(select);
+                let newIndex = index;
+                if($('#bills0_list').is(':checked')) {
+                    const newMaterialBillsData = _.filter(materialBillsData, function (item) {
+                        return item.quantity === null || item.quantity === 0;
+                    });
+                    newIndex = newMaterialBillsData.indexOf(select);
+                    newMaterialBillsData.splice(newIndex, 1, result.info);
+                    sheet.zh_data[newIndex] = result.info;
+                }
                 materialBillsData.splice(index, 1, result.info);
-                SpreadJsObj.reLoadRowData(sheet, index);
+                SpreadJsObj.reLoadRowData(sheet, newIndex);
                 $('#bcyy').modal('hide');
             });
         });
@@ -1200,10 +1262,11 @@ $(document).ready(() => {
                 months.push(yearmonth);
                 months.sort();
                 monthsList = data.monthsList;
-                monthFunGather.monthSheetReset();
+                monthFunGather.monthsListSet();
                 // 工料表单价显示也要更新
                 materialBillsData = data.materialBillsData;
-                SpreadJsObj.loadSheetData(materialSpread.getActiveSheet(), SpreadJsObj.DataType.Data, materialBillsData);
+                materialSpreadObj.materialSheetReset();
+                // SpreadJsObj.loadSheetData(materialSpread.getActiveSheet(), SpreadJsObj.DataType.Data, materialBillsData);
                 m_tp = data.m_tp;
                 if (materialTax) {
                     m_tax_tp = data.m_tax_tp;
@@ -1232,11 +1295,12 @@ $(document).ready(() => {
                     });
                 }
                 monthsList = data.monthsList;
-                monthFunGather.monthSheetReset();
+                monthFunGather.monthsListSet();
 
                 // 工料表单价显示也要更新
                 materialBillsData = data.materialBillsData;
-                SpreadJsObj.loadSheetData(materialSpread.getActiveSheet(), SpreadJsObj.DataType.Data, materialBillsData);
+                materialSpreadObj.materialSheetReset();
+                // SpreadJsObj.loadSheetData(materialSpread.getActiveSheet(), SpreadJsObj.DataType.Data, materialBillsData);
                 m_tp = data.m_tp;
                 if (materialTax) {
                     m_tax_tp = data.m_tax_tp;
@@ -1248,6 +1312,23 @@ $(document).ready(() => {
     } else {
         // SpreadJsObj.forbiddenSpreadContextMenu('#material-spread', materialSpread);
     }
+
+    // 筛选调差工料本期应耗数量为0
+    $('#bills0_list').click(function () {
+        const isCheck = $(this).is(':checked');
+        let newMaterialBillsData = materialBillsData;
+        if (isCheck) {
+            newMaterialBillsData = _.filter(materialBillsData, function (item) {
+                return item.quantity === null || item.quantity === 0;
+            });
+            SpreadJsObj.initSpreadSettingEvents(materialSpreadSetting, materialCol);
+            SpreadJsObj.initSheet(materialSpread.getActiveSheet(), materialSpreadSetting);
+        }
+        SpreadJsObj.loadSheetData(materialSpread.getActiveSheet(), SpreadJsObj.DataType.Data, newMaterialBillsData);
+        monthFunGather.monthsListSet(newMaterialBillsData, false);
+        materialSpreadObj.refreshActn();
+    });
+
     $.subMenu({
         menu: '#sub-menu', miniMenu: '#sub-mini-menu', miniMenuList: '#mini-menu-list',
         toMenu: '#to-menu', toMiniMenu: '#to-mini-menu',

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

@@ -1117,7 +1117,7 @@ $(document).ready(() => {
             const height = $('.bcontent-wrap').height();
             setLocalCache('material_list2_' + materialID, height);
         }
-    });
+    });jub
 
     // 展开收起月信息价并浏览器记住本期展开收起
     $('a', '.right-nav').bind('click', function () {

+ 11 - 6
app/public/js/stage_change.js

@@ -70,11 +70,15 @@ $(document).ready(() => {
     // 初始化变更令spread
     const changeSpreadSetting = {
         cols: [
-            {title: '变更令号', colSpan: '1', rowSpan: '1', field: 'p_code', hAlign: 0, width: 150, formatter: '@', readOnly: true},
-            {title: '变更名称', colSpan: '1', rowSpan: '1', field: 'name', hAlign: 0, width: 350, formatter: '@', readOnly: true},
-            {title: '金额', colSpan: '1', rowSpan: '1', field: 'total_price', hAlign: 2, width: 100, type: 'Number', readOnly: true},
-            {title: '批复文号', colSpan: '1', rowSpan: '1', field: 'w_code', hAlign: 0, width: 150, formatter: '@', readOnly: true},
-            {title: '已执行(%)', colSpan: '1', rowSpan: '1', field: 'used_pt', hAlign: 2, width: 100, type: 'Number', readOnly: true},
+            {title: '变更令号', colSpan: '1', rowSpan: '1', field: 'p_code', hAlign: 0, width: 150, formatter: '@'},
+            {title: '变更名称', colSpan: '1', rowSpan: '1', field: 'name', hAlign: 0, width: 350, formatter: '@'},
+            {title: '金额', colSpan: '1', rowSpan: '1', field: 'total_price', hAlign: 2, width: 100, type: 'Number'},
+            {title: '批复文号', colSpan: '1', rowSpan: '1', field: 'w_code', hAlign: 0, width: 150, formatter: '@'},
+            {title: '已执行(%)', colSpan: '1', rowSpan: '1', field: 'used_pt', hAlign: 2, width: 100, type: 'Number'},
+            {title: '正变更已计量', colSpan: '1', rowSpan: '1', field: 'p_used_tp', hAlign: 2, width: 80, type: 'Number'},
+            {title: '正变更执行率', colSpan: '1', rowSpan: '1', field: 'p_used_pt', hAlign: 2, width: 80, type: 'Number'},
+            {title: '负变更已计量', colSpan: '1', rowSpan: '1', field: 'n_used_tp', hAlign: 2, width: 80, type: 'Number'},
+            {title: '负变更执行率', colSpan: '1', rowSpan: '1', field: 'n_used_pt', hAlign: 2, width: 80, type: 'Number'},
         ],
         emptyRows: 0,
         headRows: 1,
@@ -86,7 +90,8 @@ $(document).ready(() => {
         localCache: {
             key: 'stage-change',
             colWidth: true,
-        }
+        },
+        readOnly: true,
     };
     const changeSpread = SpreadJsObj.createNewSpread($('#bgl-spread')[0]);
     SpreadJsObj.initSheet(changeSpread.getActiveSheet(), changeSpreadSetting);

+ 2 - 1
app/service/change.js

@@ -1261,7 +1261,8 @@ module.exports = app => {
             const sql =
                 'SELECT C.*, Sum(U.utp) As used_tp, TRUNCATE(Sum(U.utp) / C.total_price * 100 + 0.005, 2) As used_pt' +
                 '  FROM ' + this.tableName + ' As C' +
-                '  LEFT JOIN (SELECT sc.tid, sc.cid, sc.cbid, IF(SUM(sc.qty) > 0, TRUNCATE(SUM(sc.qty) * cb.unit_price + ?, ?), TRUNCATE(SUM(sc.qty) * cb.unit_price - ?, ?)) As utp' +
+                '  LEFT JOIN (SELECT sc.tid, sc.cid, sc.cbid, IF(SUM(sc.qty) > 0, TRUNCATE(SUM(sc.qty) * cb.unit_price + ?, ?), TRUNCATE(SUM(sc.qty) * cb.unit_price - ?, ?)) As utp,' +
+                '      IF(SUM(sc.qty) > 0, TRUNCATE(SUM(sc.qty) * cb.unit_price + ?, ?), 0, ?)) As utp_po, IF(SUM(sc.qty) > 0, 0, TRUNCATE(SUM(sc.qty) * cb.unit_price - ?, ?)) As utp_ne' +
                 '    FROM ' + this.ctx.service.stageChange.tableName + ' As sc' +
                 '    INNER JOIN (' +
                 '      SELECT MAX(`stimes`) As `stimes`, MAX(`sorder`) As `sorder`, `lid`, `pid`, `cbid`, sChange.`sid` ' +

+ 15 - 10
app/service/material_audit.js

@@ -13,6 +13,7 @@ const pushType = require('../const/audit').pushType;
 const smsTypeConst = require('../const/sms_type');
 const wxConst = require('../const/wechat_template');
 const shenpiConst = require('../const/shenpi');
+const materialConst = require('../const/material');
 
 module.exports = app => {
     class MaterialAudit extends app.BaseService {
@@ -234,13 +235,14 @@ module.exports = app => {
 
                 // 微信模板通知
                 const materialInfo = await this.ctx.service.material.getDataById(materialId);
+                const material_decimal = materialInfo && materialInfo.decimal ? JSON.parse(materialInfo.decimal) : materialConst.decimal;
                 const wechatData = {
                     qi: materialInfo.order,
                     status: wxConst.status.check,
                     tips: wxConst.tips.check,
                     begin_time: Date.parse(new Date()),
-                    m_tp: this.ctx.helper.add(this.ctx.helper.round(materialInfo.m_tp, 2), this.ctx.helper.round(materialInfo.ex_tp, 2)),
-                    hs_m_tp: this.ctx.helper.add(this.ctx.helper.round(this.ctx.helper.mul(materialInfo.m_tp, 1+materialInfo.rate/100), 2), this.ctx.helper.round(this.ctx.helper.mul(materialInfo.ex_tp, 1+materialInfo.rate/100), 2)),
+                    m_tp: this.ctx.helper.add(this.ctx.helper.round(materialInfo.m_tp, material_decimal.tp), this.ctx.helper.round(materialInfo.ex_tp, material_decimal.tp)),
+                    hs_m_tp: this.ctx.helper.add(this.ctx.helper.round(this.ctx.helper.mul(materialInfo.m_tp, 1+materialInfo.rate/100), material_decimal.tp), this.ctx.helper.round(this.ctx.helper.mul(materialInfo.ex_tp, 1+materialInfo.rate/100), material_decimal.tp)),
                 };
                 await this.ctx.helper.sendWechat(audit.aid, smsTypeConst.const.TC, smsTypeConst.judge.approval.toString(), wxConst.template.material, wechatData);
 
@@ -302,6 +304,7 @@ module.exports = app => {
                     order: 1,
                 });
                 const materialInfo = await this.ctx.service.material.getDataById(materialId);
+                const material_decimal = materialInfo && materialInfo.decimal ? JSON.parse(materialInfo.decimal) : materialConst.decimal;
 
                 // 无下一审核人表示,审核结束
                 if (nextAudit) {
@@ -321,8 +324,8 @@ module.exports = app => {
                         status: wxConst.status.check,
                         tips: wxConst.tips.check,
                         begin_time: Date.parse(begin_audit.begin_time),
-                        m_tp: this.ctx.helper.add(this.ctx.helper.round(materialInfo.m_tp, 2), this.ctx.helper.round(materialInfo.ex_tp, 2)),
-                        hs_m_tp: this.ctx.helper.add(this.ctx.helper.round(this.ctx.helper.mul(materialInfo.m_tp, 1+materialInfo.rate/100), 2), this.ctx.helper.round(this.ctx.helper.mul(materialInfo.ex_tp, 1+materialInfo.rate/100), 2)),
+                        m_tp: this.ctx.helper.add(this.ctx.helper.round(materialInfo.m_tp, material_decimal.tp), this.ctx.helper.round(materialInfo.ex_tp, material_decimal.tp)),
+                        hs_m_tp: this.ctx.helper.add(this.ctx.helper.round(this.ctx.helper.mul(materialInfo.m_tp, 1+materialInfo.rate/100), material_decimal.tp), this.ctx.helper.round(this.ctx.helper.mul(materialInfo.ex_tp, 1+materialInfo.rate/100), material_decimal.tp)),
                     };
                     await this.ctx.helper.sendWechat(nextAudit.aid, smsTypeConst.const.TC, smsTypeConst.judge.approval.toString(), wxConst.template.material, wechatData);
 
@@ -413,8 +416,8 @@ module.exports = app => {
                         status: wxConst.status.success,
                         tips: wxConst.tips.success,
                         begin_time: Date.parse(begin_audit.begin_time),
-                        m_tp: this.ctx.helper.add(this.ctx.helper.round(materialInfo.m_tp, 2), this.ctx.helper.round(materialInfo.ex_tp, 2)),
-                        hs_m_tp: this.ctx.helper.add(this.ctx.helper.round(this.ctx.helper.mul(materialInfo.m_tp, 1+materialInfo.rate/100), 2), this.ctx.helper.round(this.ctx.helper.mul(materialInfo.ex_tp, 1+materialInfo.rate/100), 2)),
+                        m_tp: this.ctx.helper.add(this.ctx.helper.round(materialInfo.m_tp, material_decimal.tp), this.ctx.helper.round(materialInfo.ex_tp, material_decimal.tp)),
+                        hs_m_tp: this.ctx.helper.add(this.ctx.helper.round(this.ctx.helper.mul(materialInfo.m_tp, 1+materialInfo.rate/100), material_decimal.tp), this.ctx.helper.round(this.ctx.helper.mul(materialInfo.ex_tp, 1+materialInfo.rate/100), material_decimal.tp)),
                     };
                     await this.ctx.helper.sendWechat(users, smsTypeConst.const.TC, smsTypeConst.judge.result.toString(), wxConst.template.material, wechatData);
 
@@ -504,14 +507,15 @@ module.exports = app => {
                     order: 1,
                 });
                 const materialInfo = await this.ctx.service.material.getDataById(materialId);
+                const material_decimal = materialInfo && materialInfo.decimal ? JSON.parse(materialInfo.decimal) : materialConst.decimal;
                 const users = this._.uniq(this._.concat(this._.map(auditors, 'aid'), materialInfo.user_id));
                 const wechatData = {
                     qi: materialInfo.order,
                     status: wxConst.status.back,
                     tips: wxConst.tips.back,
                     begin_time: Date.parse(begin_audit.begin_time),
-                    m_tp: this.ctx.helper.add(this.ctx.helper.round(materialInfo.m_tp, 2), this.ctx.helper.round(materialInfo.ex_tp, 2)),
-                    hs_m_tp: this.ctx.helper.add(this.ctx.helper.round(this.ctx.helper.mul(materialInfo.m_tp, 1+materialInfo.rate/100), 2), this.ctx.helper.round(this.ctx.helper.mul(materialInfo.ex_tp, 1+materialInfo.rate/100), 2)),
+                    m_tp: this.ctx.helper.add(this.ctx.helper.round(materialInfo.m_tp, material_decimal.tp), this.ctx.helper.round(materialInfo.ex_tp, material_decimal.tp)),
+                    hs_m_tp: this.ctx.helper.add(this.ctx.helper.round(this.ctx.helper.mul(materialInfo.m_tp, 1+materialInfo.rate/100), material_decimal.tp), this.ctx.helper.round(this.ctx.helper.mul(materialInfo.ex_tp, 1+materialInfo.rate/100), material_decimal.tp)),
                 };
                 await this.ctx.helper.sendWechat(users, smsTypeConst.const.TC, smsTypeConst.judge.result.toString(), wxConst.template.material, wechatData);
 
@@ -602,13 +606,14 @@ module.exports = app => {
                     order: 1,
                 });
                 const materialInfo = await this.ctx.service.material.getDataById(materialId);
+                const material_decimal = materialInfo && materialInfo.decimal ? JSON.parse(materialInfo.decimal) : materialConst.decimal;
                 const wechatData = {
                     qi: materialInfo.order,
                     status: wxConst.status.check,
                     tips: wxConst.tips.check,
                     begin_time: Date.parse(begin_audit.begin_time),
-                    m_tp: this.ctx.helper.add(this.ctx.helper.round(materialInfo.m_tp, 2), this.ctx.helper.round(materialInfo.ex_tp, 2)),
-                    hs_m_tp: this.ctx.helper.add(this.ctx.helper.round(this.ctx.helper.mul(materialInfo.m_tp, 1+materialInfo.rate/100), 2), this.ctx.helper.round(this.ctx.helper.mul(materialInfo.ex_tp, 1+materialInfo.rate/100), 2)),
+                    m_tp: this.ctx.helper.add(this.ctx.helper.round(materialInfo.m_tp, material_decimal.tp), this.ctx.helper.round(materialInfo.ex_tp, material_decimal.tp)),
+                    hs_m_tp: this.ctx.helper.add(this.ctx.helper.round(this.ctx.helper.mul(materialInfo.m_tp, 1+materialInfo.rate/100), material_decimal.tp), this.ctx.helper.round(this.ctx.helper.mul(materialInfo.ex_tp, 1+materialInfo.rate/100), material_decimal.tp)),
                 };
                 await this.ctx.helper.sendWechat(preAuditor.aid, smsTypeConst.const.TC, smsTypeConst.judge.approval.toString(), wxConst.template.material, wechatData);
 

+ 1 - 1
app/service/material_list.js

@@ -220,7 +220,7 @@ module.exports = app => {
             const newTp = this.ctx.helper.round(this.ctx.helper.mul(newQuantity, mbInfo.m_spread), this.ctx.material.decimal.tp);
             const updateData = {
                 id: mb_id,
-                quantity: this.ctx.helper.round(mb_quantity.quantity, this.ctx.material.decimal.qty),
+                quantity: newQuantity,
                 m_tp: newTp,
                 m_tax_tp: this.ctx.helper.round(this.ctx.helper.mul(newTp, (1 + this.ctx.helper.div(mbInfo.m_tax, 100))), this.ctx.material.decimal.tp),
             };

+ 67 - 0
app/service/stage_change.js

@@ -428,6 +428,73 @@ module.exports = app => {
             result.great = helper.sum(helper._.map(bqData.filter(x => {return x.quality === changeConst.quality.great.value; }), 'tp'));
             return result;
         }
+
+        async _getChangeBillsWithUsedInfo(stage) {
+            if (stage.status === audit.stage.status.checked) {
+                const sql = 'SELECT scf.*, cal.unit_price ' +
+                    '  FROM ' + this.tableName + ' scf ' +
+                    '  LEFT JOIN ' + this.ctx.service.stage.tableName + ' s ON scf.sid = s.id' +
+                    '  WHERE scf.tid = ? And s.order <= ?';
+                const result = await this.db.query(sql, [stage.tid, stage.order]);
+                return result;
+            } else {
+                const preSql = 'SELECT scf.* ' +
+                    '  FROM ' + this.tableName + ' scf ' +
+                    '  LEFT JOIN ' + this.ctx.service.stage.tableName + ' s ON scf.sid = s.id' +
+                    '  WHERE scf.tid = ? And s.order < ?';
+                const pre = await this.db.query(preSql, [stage.tid, stage.order]);
+                const sql = 'SELECT * FROM ' + this.ctx.service.stageChange.tableName + ' WHERE sid = ? AND (stimes * 100 + sorder) <= (? * 100 + ?)';
+                const curAll = await this.db.query(sql, [stage.id, stage.curTimes, stage.curOrder]);
+                const cur = this.ctx.helper.filterLastestData(curAll, ['lid', 'pid', 'cid', 'cbid']);
+                return [...pre, ...cur];
+            }
+        }
+
+        async getChangeWithUsedInfo(stage) {
+            const change = await this.ctx.service.change.getAllDataByCondition({
+                where: { tid: stage.tid, status: audit.flow.status.checked }
+            });
+            if (change.length === 0) return [];
+
+            const changeBills = await this.ctx.service.changeAuditList.getAllDataByCondition({
+                where: { cid: change.map(x => { return x.cid; }) }
+            });
+            const changeBillsIndex = {}, changeBillsPart = {};
+            for (const cb of changeBills) {
+                changeBillsIndex[cb.id] = cb;
+                if (!changeBillsPart[cb.cid]) changeBillsPart[cb.cid] = [];
+                changeBillsPart[cb.cid].push(cb);
+            }
+            const stageChangeBills = await this._getChangeBillsWithUsedInfo(stage);
+            for (const scb of stageChangeBills) {
+                if (!scb.qty) continue;
+
+                const cb = changeBillsIndex[scb.cbid];
+                if (cb) cb.used_qty = this.ctx.helper.add(cb.used_qty, scb.qty);
+            }
+            for (const cid in changeBillsPart) {
+                const c = change.find(x => { return x.cid === cid });
+                if (!c) continue;
+
+                for (const cb of changeBillsPart[cid]) {
+                    cb.tp = this.ctx.helper.mul(cb.spamount, cb.unit_price, c.tp_decimal);
+                    cb.used_tp = this.ctx.helper.mul(cb.used_qty, cb.unit_price, this.ctx.tender.info.decimal.tp);
+
+                    c.used_tp = this.ctx.helper.add(c.used_tp, cb.used_tp);
+                    if (cb.spamount > 0) {
+                        c.p_tp = this.ctx.helper.add(c.p_tp, cb.tp);
+                        c.p_used_tp = this.ctx.helper.add(c.p_used_tp, cb.used_tp);
+                    } else if (cb.spamount < 0){
+                        c.n_tp = this.ctx.helper.add(c.n_tp, cb.tp);
+                        c.n_used_tp = this.ctx.helper.add(c.n_used_tp, cb.used_tp);
+                    }
+                }
+                c.used_pt = c.total_price ? this.ctx.helper.mul(this.ctx.helper.div(c.used_tp, c.total_price, 4), 100) : 0;
+                c.p_used_pt = c.p_tp ? this.ctx.helper.mul(this.ctx.helper.div(c.p_used_tp, c.p_tp, 4), 100) : 0;
+                c.n_used_pt = c.n_tp ? this.ctx.helper.mul(this.ctx.helper.div(c.n_used_tp, c.n_tp, 4), 100) : 0;
+            }
+            return change;
+        }
     }
 
     return StageChange;

+ 1 - 1
app/view/login/login.ejs

@@ -77,7 +77,7 @@
             </div>
         </form>
         <form id="code-form" class="right-login position-relative text-center" style="min-width: 360px;display: none">
-            <h3 class="mt-3">&nbsp;</h3>
+            <h5>&nbsp;</h5>
             <div class="position-absolute"><a href="javascript:void(0);" class="change-form" data-toggle="tooltip" data-placement="left" title="账号登录"><img alt="账号登录" src="/public/images/icon_login_pc.png"></a></div>
             <div id="wx-code" style="text-align: center">
             </div>

+ 8 - 0
app/view/material/info.ejs

@@ -23,6 +23,14 @@
                 <div class="d-inline-block ml-2" >
                     <a href="#cc-digits" class="btn btn-sm btn-light text-primary" data-toggle="modal" data-placement="bottom" title="小数位数" data-target="#cc-digits" ><i class="fa fa-cog" aria-hidden="true"></i></a>
                 </div>
+                <div class="d-inline-block">
+                    <a class="btn btn-sm btn-light">
+                        <div class="custom-control custom-checkbox">
+                            <input type="checkbox" class="custom-control-input" id="bills0_list">
+                            <label class="custom-control-label text-primary" for="bills0_list">过滤数量为0的工料</label>
+                        </div>
+                    </a>
+                </div>
             </div>
             <div class="ml-auto">
                 <% if (ctx.session.sessionProject.page_show.openMaterialChecklist && material.order === material.highOrder) { %>

+ 1 - 1
app/view/tender/tender_sub_menu.ejs

@@ -43,7 +43,7 @@
             <ul class="nav-list list-unstyled sub-list">
                 <% if (ctx.session.sessionProject.page_show.openChangeProject) { %><li <% if (ctx.url.indexOf('/tender/' + ctx.tender.id + '/change/project') !== -1) { %>class="active"<% } %>><a class="change_project_sort_link" href="/tender/<%- ctx.tender.id %>/change/project"><span>变更立项</span></a></li><% } %>
                     <% if (ctx.session.sessionProject.page_show.openChangeApply) { %><li <% if (ctx.url.indexOf('/tender/' + ctx.tender.id + '/change/apply') !== -1) { %>class="active"<% } %>><a class="change_apply_sort_link" href="/tender/<%- ctx.tender.id %>/change/apply"><span>变更申请</span></a></li><% } %>
-                <li <% if (ctx.url.indexOf('/tender/' + ctx.tender.id + '/change') !== -1 && ctx.url.indexOf('/tender/' + ctx.tender.id + '/change/project') === -1 && ctx.url.indexOf('/tender/' + ctx.tender.id + '/change/apply') === -1) { %>class="active"<% } %>><a class="change_sort_link" href="/tender/<%- ctx.tender.id %>/change"><span>变更方案</span></a></li>
+                <li <% if (ctx.url.indexOf('/tender/' + ctx.tender.id + '/change') !== -1 && ctx.url.indexOf('/tender/' + ctx.tender.id + '/change/project') === -1 && ctx.url.indexOf('/tender/' + ctx.tender.id + '/change/apply') === -1) { %>class="active"<% } %>><a class="change_sort_link" href="/tender/<%- ctx.tender.id %>/change"><span>变更</span></a></li>
             </ul>
             <% } %>
         </div>

+ 1 - 1
app/view/tender/tender_sub_mini_menu.ejs

@@ -45,7 +45,7 @@
                 <ul class="nav-list list-unstyled sub-list">
                     <% if (ctx.session.sessionProject.page_show.openChangeProject) { %><li <% if (ctx.url.indexOf('/tender/' + ctx.tender.id + '/change/project') !== -1) { %>class="active"<% } %>><a class="change_project_sort_link" href="/tender/<%- ctx.tender.id %>/change/project"><span>变更立项</span></a></li><% } %>
                     <% if (ctx.session.sessionProject.page_show.openChangeApply) { %><li <% if (ctx.url.indexOf('/tender/' + ctx.tender.id + '/change/apply') !== -1) { %>class="active"<% } %>><a class="change_apply_sort_link" href="/tender/<%- ctx.tender.id %>/change/apply"><span>变更申请</span></a></li><% } %>
-                    <li <% if (ctx.url.indexOf('/tender/' + ctx.tender.id + '/change') !== -1 && ctx.url.indexOf('/tender/' + ctx.tender.id + '/change/project') === -1 && ctx.url.indexOf('/tender/' + ctx.tender.id + '/change/apply') === -1) { %>class="active"<% } %>><a class="change_sort_link" href="/tender/<%- ctx.tender.id %>/change"><span>变更方案</span></a></li>
+                    <li <% if (ctx.url.indexOf('/tender/' + ctx.tender.id + '/change') !== -1 && ctx.url.indexOf('/tender/' + ctx.tender.id + '/change/project') === -1 && ctx.url.indexOf('/tender/' + ctx.tender.id + '/change/apply') === -1) { %>class="active"<% } %>><a class="change_sort_link" href="/tender/<%- ctx.tender.id %>/change"><span>变更</span></a></li>
                 </ul>
             <% } %>
         </div>