浏览代码

调差和签名文件更新

laiguoran 5 年之前
父节点
当前提交
c9b3a10003

+ 19 - 6
app/controller/material_controller.js

@@ -219,15 +219,22 @@ module.exports = app => {
                 await this._getMaterialAuditViewData(ctx);
                 const renderData = await this._getDefaultRenderData(ctx);
                 // 根据期判断需要获取的工料信息值
+                const searchsql = { tid: ctx.tender.id };
+                if (ctx.material.highOrder !== ctx.material.order) {
+                    const midList = await ctx.service.material.getPreMidList(ctx.tender.id, ctx.material.order);
+                    searchsql.mid = midList;
+                }
                 // 取所有工料表
-                renderData.materialBillsData = await ctx.service.materialBills.getAllDataByCondition({ where: { tid: ctx.tender.id } });
-                // 取截取上期的调差金额
+                renderData.materialBillsData = await ctx.service.materialBills.getAllDataByCondition({ where: searchsql });
+                // 取对应期的截取上期的调差金额和应耗数量
                 for (const mindex in renderData.materialBillsData) {
                     const pre_tp = renderData.materialBillsData[mindex].pre_tp !== null ? renderData.materialBillsData[mindex].pre_tp.split(',')[ctx.material.order - 1] : null;
+                    const quantity = renderData.materialBillsData[mindex].quantity !== null ? renderData.materialBillsData[mindex].quantity.split(',')[ctx.material.order - 1] : null;
                     renderData.materialBillsData[mindex].pre_tp = pre_tp;
+                    renderData.materialBillsData[mindex].quantity = quantity;
                 }
                 // 取所有已被调用的工料清单表
-                renderData.materialListData = await ctx.service.materialList.getAllDataByCondition({ where: { tid: ctx.tender.id } });
+                renderData.materialListData = await ctx.service.materialList.getAllDataByCondition({ where: searchsql });
                 renderData.materialType = JSON.stringify(materialConst);
                 renderData.jsFiles = this.app.jsFiles.common.concat(this.app.jsFiles.material.info);
                 await this.layout('material/info.ejs', renderData, 'material/info_modal.ejs');
@@ -246,10 +253,16 @@ module.exports = app => {
             try {
                 await this._getMaterialAuditViewData(ctx);
                 const renderData = await this._getDefaultRenderData(ctx);
-                // 取所有工料表
-                renderData.materialBillsData = await ctx.service.materialBills.getAllDataByCondition({ where: { tid: ctx.tender.id } });
+                // 根据期判断需要获取的工料信息值表
+                const searchsql = { tid: ctx.tender.id };
+                let midList = [];
+                if (ctx.material.highOrder !== ctx.material.order) {
+                    midList = await ctx.service.material.getPreMidList(ctx.tender.id, ctx.material.order);
+                    searchsql.mid = midList;
+                }
+                renderData.materialBillsData = await ctx.service.materialBills.getAllDataByCondition({ where: searchsql });
                 // 取所有已被调用的工料清单表
-                renderData.materialListData = await ctx.service.materialList.getMaterialData(ctx.tender.id);
+                renderData.materialListData = await ctx.service.materialList.getMaterialData(ctx.tender.id, midList);
                 renderData.materialNotJoinListData = await ctx.service.materialListNotjoin.getAllDataByCondition({ where: { tid: ctx.tender.id, mid: ctx.material.id } });
                 renderData.materialType = JSON.stringify(materialConst);
                 renderData.jsFiles = this.app.jsFiles.common.concat(this.app.jsFiles.material.list);

+ 1 - 1
app/controller/profile_controller.js

@@ -287,7 +287,7 @@ module.exports = app => {
                 // 获取当前用户数据
                 const sessionUser = ctx.session.sessionUser;
 
-                const text = ctx.request.header.host + '/sign?user_id=' + sessionUser.accountId + '&app_token=' + sessionUser.sessionToken;
+                const text = 'http://' + ctx.request.header.host + '/sign?user_id=' + sessionUser.accountId + '&app_token=' + sessionUser.sessionToken;
 
                 // 大小默认5,二维码周围间距默认1
                 const img = qr.image(text || '', { type: 'png', size: size || 5, margin: margin || 1 });

+ 9 - 3
app/public/js/material.js

@@ -57,6 +57,9 @@ $(document).ready(() => {
             return materialListData.find(function (item) {
                 return item.mb_id === data.id;
             });
+        },
+        isStage: function (data) {
+            return data.mid === materialID;
         }
     }
 
@@ -76,7 +79,7 @@ $(document).ready(() => {
         },
         readOnly: {
             isEdit: function (data) {
-                return !(readOnly || materialBase.isEdit(data) === undefined);
+                return !(!readOnly && materialBase.isEdit(data) === undefined && materialBase.isStage(data));
             },
             remark: function () {
                 return readOnly;
@@ -200,8 +203,11 @@ $(document).ready(() => {
                         return;
                     }
                 }
-
                 select[col.field] = validText;
+                select.msg_spread = materialCol.getValue.msg_spread(select);
+                select.m_spread = materialCol.getValue.m_spread(select);
+                select.m_tp = materialCol.getValue.m_tp(select);
+                console.log(select);
                 // 更新至服务器
                 postData(window.location.pathname + '/save', { type:'update', updateData: select }, function (result) {
                     SpreadJsObj.reLoadRowData(info.sheet, info.row);
@@ -256,7 +262,7 @@ $(document).ready(() => {
             }
         });
     } else {
-        SpreadJsObj.forbiddenSpreadContextMenu('#material-spread', materialSpread);
+        // SpreadJsObj.forbiddenSpreadContextMenu('#material-spread', materialSpread);
     }
     $.subMenu({
         menu: '#sub-menu', miniMenu: '#sub-mini-menu', miniMenuList: '#mini-menu-list',

+ 49 - 18
app/public/js/material_list.js

@@ -19,6 +19,14 @@ function findNotJoinLeafXmj(x, type = '') {
     });
 }
 
+function getMpSpreadByMBData(id) {
+    const info = materialBillsData.find(function (item) {
+        return item.id === parseInt(id);
+    });
+    console.log(info);
+    return info.m_spread;
+}
+
 $(document).ready(() => {
     autoFlashHeight();
     // 清单table
@@ -52,13 +60,8 @@ $(document).ready(() => {
         if (gcl) {
             SpreadJsObj.loadSheetData(leafXmjSpread.getActiveSheet(), SpreadJsObj.DataType.Data, gcl.leafXmjs);
             // 对清单调差工料table的单位数量进行改变
-            // console.log(materialSpreadSetting.cols[materialSpreadSetting.cols.length - 1]);
-            // materialSpreadSetting.cols[materialSpreadSetting.cols.length - 1].title = '|' + gcl.unit + '数量<a href="" data-toggle="tooltip" data-placement="bottom" title="单位数量:每一单位清单下所需工料消耗量。"><i class="fa fa-question-circle-o"></i></a>';
             materialSpreadSetting.cols[materialSpreadSetting.cols.length - 1].title = '|' + gcl.unit + '数量';
-            // const sheet = materialSpread.getActiveSheet();
-            // sheet.setCellType(2,3, '1', spreadNS.SheetArea.colHeader);
             SpreadJsObj.initSheet(materialSpread.getActiveSheet(), materialSpreadSetting);
-            // materialSpread.resumePaint();
         } else {
             SpreadJsObj.loadSheetData(leafXmjSpread.getActiveSheet(), SpreadJsObj.DataType.Data, []);
         }
@@ -79,7 +82,7 @@ $(document).ready(() => {
             {title: '本期计量数量|合同', colSpan: '3|1', rowSpan: '1|1', field: 'contract_qty', hAlign: 2, width: 60, type: 'Number'},
             {title: '|数量变更', colSpan: '|1', rowSpan: '|1', field: 'qc_qty', hAlign: 2, width: 80, type: 'Number'},
             {title: '|小计', colSpan: '|1', rowSpan: '|1', field: 'gather_qty', hAlign: 2, width: 60, type: 'Number'},
-            {title: '本期价差', colSpan: '1', rowSpan: '2', field: 'jijia', hAlign: 2, width: 80, type: 'Number'},
+            {title: '本期价差', colSpan: '1', rowSpan: '2', field: 'jiacha', hAlign: 2, width: 80, type: 'Number', getValue: 'getValue.jiacha'},
         ],
         emptyRows: 0,
         headRows: 2,
@@ -89,6 +92,23 @@ $(document).ready(() => {
         readOnly: true,
         font: '10pt 微软雅黑',
     };
+    const leafXmjCol = {
+        getValue: {
+            jiacha: function (data) {
+                let sum = 0;
+                const sheet = leafXmjSpread.getActiveSheet();
+                const select = SpreadJsObj.getSelectObject(sheet);
+                const notx = findNotJoinLeafXmj(select);
+                if (notx === undefined) {
+                    for(const ml of materialList) {
+                        sum = ZhCalc.add(sum, ZhCalc.mul(ZhCalc.mul(data.gather_qty, ml.quantity), getMpSpreadByMBData(ml.mb_id)));
+                    }
+                }
+                return sum;
+            }
+        }
+    };
+    SpreadJsObj.initSpreadSettingEvents(leafXmjSpreadSetting, leafXmjCol);
     SpreadJsObj.initSheet(leafXmjSpread.getActiveSheet(), leafXmjSpreadSetting);
     // 加载清单数据
     SpreadJsObj.loadSheetData(ledgerSpread.getActiveSheet(), SpreadJsObj.DataType.Data, gclGatherData);
@@ -100,7 +120,7 @@ $(document).ready(() => {
             {title: '清单调差工料|编号', colSpan: '4|1', rowSpan: '1|1', field: 'code', hAlign: 0, width: 80, formatter: '@', readOnly: true},
             {title: '|名称', colSpan: '|1', rowSpan: '|1', field: 'name', hAlign: 0, width: 100, formatter: '@', readOnly: true},
             {title: '|单位', colSpan: '|1', rowSpan: '|1', field: 'unit', hAlign: 1, width: 60, formatter: '@', readOnly: true},
-            {title: '|数量', colSpan: '1', rowSpan: '|1', field: 'quantity', hAlign: 2, width: 60, type: 'Number', readOnly: true},
+            {title: '|数量', colSpan: '1', rowSpan: '|1', field: 'quantity', hAlign: 2, width: 60, type: 'Number', readOnly: 'readOnly.isEdit'},
         ],
         emptyRows: 0,
         headRows: 2,
@@ -110,6 +130,25 @@ $(document).ready(() => {
         font: '10pt 微软雅黑',
     };
 
+    const materialBase = {
+        isEdit: function (data) {
+            // 是否本期添加的工料
+            return data.mid === materialID;
+        }
+    };
+
+    const materialCol = {
+        readOnly: {
+            isEdit: function (data) {
+                const sheet = leafXmjSpread.getActiveSheet();
+                const select = SpreadJsObj.getSelectObject(sheet);
+                const notx = findNotJoinLeafXmj(select);
+                return !(!readOnly && notx === undefined && materialBase.isEdit(data));
+            },
+        },
+    };
+    SpreadJsObj.initSpreadSettingEvents(materialSpreadSetting, materialCol);
+
     // 获取项目节数据
     let materialList = [];
     function loadMaterialData(iGclRow, iLXmjRow) {
@@ -122,14 +161,11 @@ $(document).ready(() => {
                     materialList.push(m);
                 }
             }
-            // console.log(materialList);
-            const notx = findNotJoinLeafXmj(xmj);
-            materialSpreadSetting.cols[materialSpreadSetting.cols.length - 1].readOnly = !(readOnly || notx === undefined);
-            SpreadJsObj.initSheet(materialSpread.getActiveSheet(), materialSpreadSetting);
             SpreadJsObj.loadSheetData(materialSpread.getActiveSheet(), SpreadJsObj.DataType.Data, materialList);
         } else {
             SpreadJsObj.loadSheetData(materialSpread.getActiveSheet(), SpreadJsObj.DataType.Data, []);
         }
+        SpreadJsObj.reLoadSheetData(leafXmjSpread.getActiveSheet());
     }
 
     loadLeafXmjData(0);
@@ -280,18 +316,11 @@ $(document).ready(() => {
                 }
             }
         });
-        const materialBase = {
-            isEdit: function (data) {
-                // 是否本期添加的工料
-                return data.mid === materialID;
-            }
-        };
         // material-spread右键功能
         const materialSpreadObj = {
             del: function () {
                 const sheet = materialSpread.getActiveSheet();
                 const select = SpreadJsObj.getSelectObject(sheet);
-                console.log(select);
                 postData(window.location.pathname + '/save', {type: 'del', id: select.id}, function (result) {
                     const index = materialList.indexOf(select);
                     materialList.splice(index, 1);
@@ -322,6 +351,8 @@ $(document).ready(() => {
                         materialListData.splice(materialListIndex, 1, select);
                         materialList.indexOf(index, 1, select);
                         SpreadJsObj.reLoadRowData(info.sheet, info.row);
+                        const [iGclRow, iRow, sheet, lselect] = leafXmjSpreadObj.getSelect();
+                        SpreadJsObj.reLoadRowData(sheet, iRow);
                     }, function () {
                         SpreadJsObj.reLoadRowData(info.sheet, info.row);
                     });

+ 25 - 0
app/service/material.js

@@ -125,6 +125,11 @@ module.exports = app => {
             };
             const transaction = await this.db.beginTransaction();
             try {
+                if (preMaterial) {
+                    newMaterial.rate = preMaterial.rate;
+                    newMaterial.pre_tp = preMaterial.m_tp + preMaterial.pre_tp;
+                    // 计算新一期本期金额
+                }
                 // 新增期记录
                 const result = await transaction.insert(this.tableName, newMaterial);
                 if (result.affectedRows === 1) {
@@ -174,6 +179,26 @@ module.exports = app => {
                 throw err;
             }
         }
+
+        /**
+         * 获取包含当前期之前的调差期id
+         *
+         * @param {Number} id - 期Id
+         * @returns {Promise<void>}
+         */
+        async getPreMidList(tid, order) {
+            const midList = await this.getAllDataByCondition({
+                where: { tid },
+                columns: ['id'],
+                limit: order,
+                offset: 0,
+            });
+            const list = [];
+            for (const ml of midList) {
+                list.push(ml.id);
+            }
+            return list;
+        }
     }
 
     return Material;

+ 4 - 2
app/service/material_list.js

@@ -114,14 +114,16 @@ module.exports = app => {
         /**
          * 获取工料清单关联表
          * @param {int} tid 标段id
+         * @param {Object} midList 期id列表
          * @return {void}
          */
-        async getMaterialData(tid) {
+        async getMaterialData(tid, midList = []) {
+            const midsql = midList.length !== 0 ? ' AND ml.mid in (' + this.ctx.helper.getInArrStrSqlFilter(midList) + ')' : '';
             const sql = 'SELECT ml.`id`, mb.`code`, mb.`name`, mb.`unit`, ml.`quantity`, ml.`mb_id`, ml.`gcl_id`, ml.`xmj_id`, ml.`mx_id`, ml.`tid`, ml.`mid`' +
                 ' FROM ' + this.tableName + ' as ml' +
                 ' LEFT JOIN ' + this.ctx.service.materialBills.tableName + ' as mb' +
                 ' ON ml.`mb_id` = mb.`id`' +
-                ' WHERE ml.`tid` = ?';
+                ' WHERE ml.`tid` = ?' + midsql;
             const sqlParam = [tid];
             return await this.db.query(sql, sqlParam);
         }

+ 4 - 5
app/service/material_list_notjoin.js

@@ -74,12 +74,11 @@ module.exports = app => {
             const notJoinlist = [];
             for (const mb of list) {
                 const newLists = {
-                    tid: list.id,
+                    tid: mb.tid,
                     mid,
-                    mb_id: list.mb_id,
-                    gcl_id: list.gcl_id,
-                    xmj_id: list.xmj_id,
-                    mx_id: list.mx_id,
+                    gcl_id: mb.gcl_id,
+                    xmj_id: mb.xmj_id,
+                    mx_id: mb.mx_id,
                     in_time: new Date(),
                 };
                 notJoinlist.push(newLists);

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

@@ -198,7 +198,7 @@
             <div class="modal-footer">
                 <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>
                 <input type="hidden" name="_csrf" value="<%= ctx.csrf %>" />
-                <input type="hidden" name="checkType" value="<%= auditConst.status.checked %>" />
+                <input type="hidden" name="checkType" value="<%= auditConst.status.checkNo %>" />
                 <button type="submit" class="btn btn-warning" >确认退回</button>
             </div>
         </form>

+ 1 - 1
app/view/material/index.ejs

@@ -52,7 +52,7 @@
                     <% } else if (m.status === auditConst.status.checking && m.curAuditor && m.curAuditor.aid === ctx.session.sessionUser.accountId) { %>
                         <a href="<%- '/tender/' + ctx.tender.id + '/measure/material/' + m.order %>" class="btn <%- auditConst.statusButtonClass[m.status] %> btn-sm"><%- auditConst.statusButton[m.status] %></a>
                     <% } else { %>
-                        <span class="<%- auditConst.auditStringClass[m.status] %>"><%- auditConst.auditString[m.status] %></span>
+                        <span class="<%- auditConst.auditProgressClass[m.status] %>"><%- auditConst.auditProgress[m.status] %></span>
                     <% } %>
                     <% if (m.user_id === ctx.session.sessionUser.accountId && m.order === materials.length) { %>
                         <a href="#del-qi" class="btn btn-outline-danger btn-sm ml-1" data-toggle="modal" data-target="#del-qi">删除</a>

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

@@ -68,4 +68,5 @@
     const materialBillsData = JSON.parse('<%- JSON.stringify(materialBillsData) %>');
     const materialListData = JSON.parse('<%- JSON.stringify(materialListData) %>');
     const readOnly = <%- material.readOnly %>;
+    const materialID = <%- material.id %>;
 </script>

+ 1 - 1
app/view/material/modal.ejs

@@ -49,7 +49,7 @@
                 <h5>删除后,数据无法恢复,请谨慎操作。</h5>
             </div>
             <div class="modal-footer">
-                <input type="hidden" name="stage_id" value="<%= materials[0].id %>">
+                <input type="hidden" name="material_id" value="<%= materials[0].id %>">
                 <input type="hidden" name="_csrf" value="<%= ctx.csrf %>" />
                 <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
                 <button type="submit" class="btn btn-danger">确定删除</button>