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

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

Tony Kang 1 год назад
Родитель
Сommit
6a35ae3856

+ 66 - 12
app/controller/change_controller.js

@@ -156,6 +156,7 @@ module.exports = app => {
                 changePlanList,
                 changePlanList,
                 apLists,
                 apLists,
                 auditType,
                 auditType,
+                precision: ctx.tender.info.precision,
             };
             };
 
 
             if (ctx.session.sessionProject.page_show.openChangeState) {
             if (ctx.session.sessionProject.page_show.openChangeState) {
@@ -424,10 +425,6 @@ module.exports = app => {
                         }
                         }
                     }
                     }
                 }
                 }
-                const accountInfo = await this.ctx.service.projectAccount.getDataById(this.ctx.session.sessionUser.accountId);
-                const userPermission = accountInfo !== undefined && accountInfo.permission !== ''
-                    ? JSON.parse(accountInfo.permission) : null;
-                const deleteFilePermission = userPermission && userPermission.change !== undefined && userPermission.change.indexOf('2') !== -1;
 
 
                 // 工程变更类别读取
                 // 工程变更类别读取
                 const projectData = await ctx.service.project.getDataById(ctx.session.sessionProject.id);
                 const projectData = await ctx.service.project.getDataById(ctx.session.sessionProject.id);
@@ -436,6 +433,9 @@ module.exports = app => {
                 // 获取用户人验证手机号
                 // 获取用户人验证手机号
                 const pa = await ctx.service.projectAccount.getDataById(ctx.session.sessionUser.accountId);
                 const pa = await ctx.service.projectAccount.getDataById(ctx.session.sessionUser.accountId);
                 const auth_mobile = pa.auth_mobile;
                 const auth_mobile = pa.auth_mobile;
+                const userPermission = pa !== undefined && pa.permission !== ''
+                    ? JSON.parse(pa.permission) : null;
+                const deleteFilePermission = userPermission && userPermission.change !== undefined && userPermission.change.indexOf('2') !== -1;
                 const unitList = await ctx.service.constructionUnit.getAllDataByCondition({ where: { pid: ctx.session.sessionProject.id } });
                 const unitList = await ctx.service.constructionUnit.getAllDataByCondition({ where: { pid: ctx.session.sessionProject.id } });
                 const settleBills = ctx.change.readySettle ? await ctx.service.settleBills.getAllDataByCondition({ where: { settle_id: ctx.change.readySettle.id } }) : [];
                 const settleBills = ctx.change.readySettle ? await ctx.service.settleBills.getAllDataByCondition({ where: { settle_id: ctx.change.readySettle.id } }) : [];
                 const settlePos = ctx.change.readySettle ? await ctx.service.settlePos.getAllDataByCondition({ where: { settle_id: ctx.change.readySettle.id } }) : [];
                 const settlePos = ctx.change.readySettle ? await ctx.service.settlePos.getAllDataByCondition({ where: { settle_id: ctx.change.readySettle.id } }) : [];
@@ -555,6 +555,43 @@ module.exports = app => {
         }
         }
 
 
         /**
         /**
+         * 变更关联数据 - 操作 (Ajax)
+         * @param ctx
+         * @return {Promise<void>}
+         */
+        async relation(ctx) {
+            try {
+                if (!ctx.session.sessionProject.page_show.openChangePlan) {
+                    throw '该功能已关闭';
+                }
+                // await this._getChangeAuditViewData(ctx);
+                const tender = ctx.tender;
+                const change = ctx.change;
+                const renderData = {
+                    tender,
+                    change,
+                };
+                renderData.changePlanInfo = null;
+                renderData.changeApplyInfo = null;
+                renderData.changeProjectInfo = null;
+                if (change.plan_code) {
+                    renderData.changePlanInfo = await ctx.service.changePlan.getDataByCondition({ tid: tender.id, code: change.plan_code });
+                    if (renderData.changePlanInfo && renderData.changePlanInfo.apply_code) {
+                        renderData.changeApplyInfo = await ctx.service.changeApply.getDataByCondition({ tid: tender.id, code: renderData.changePlanInfo.apply_code });
+                        if (renderData.changeApplyInfo && renderData.changeApplyInfo.project_code) {
+                            renderData.changeProjectInfo = await ctx.service.changeProject.getDataByCondition({ tid: tender.id, code: renderData.changeApplyInfo.project_code });
+                        }
+                    }
+                }
+                await this.layout('change/relation.ejs', renderData);
+            } catch (err) {
+                this.log(err);
+                ctx.session.postError = err.toString();
+                ctx.redirect('/tender/' + ctx.params.id + '/change');
+            }
+        }
+
+        /**
          * 变更清单 - 操作 (Ajax)
          * 变更清单 - 操作 (Ajax)
          * @param ctx
          * @param ctx
          * @return {Promise<void>}
          * @return {Promise<void>}
@@ -2138,6 +2175,9 @@ module.exports = app => {
                 // 获取用户人验证手机号
                 // 获取用户人验证手机号
                 const pa = await ctx.service.projectAccount.getDataById(ctx.session.sessionUser.accountId);
                 const pa = await ctx.service.projectAccount.getDataById(ctx.session.sessionUser.accountId);
                 const auth_mobile = pa.auth_mobile;
                 const auth_mobile = pa.auth_mobile;
+                const userPermission = pa !== undefined && pa.permission !== ''
+                    ? JSON.parse(pa.permission) : null;
+                const deleteFilePermission = userPermission && userPermission.change !== undefined && userPermission.change.indexOf('2') !== -1;
                 // 判断并更新
                 // 判断并更新
                 const renderData = {
                 const renderData = {
                     tender: ctx.tender,
                     tender: ctx.tender,
@@ -2148,6 +2188,7 @@ module.exports = app => {
                     fileList,
                     fileList,
                     whiteList,
                     whiteList,
                     authMobile: auth_mobile,
                     authMobile: auth_mobile,
+                    deleteFilePermission,
                     auditType,
                     auditType,
                     shenpiConst,
                     shenpiConst,
                     returnUrl: this.app._.includes(ctx.request.headers.referer, '/tender/' + ctx.tender.id + '/change/project') ? ctx.request.headers.referer : null,
                     returnUrl: this.app._.includes(ctx.request.headers.referer, '/tender/' + ctx.tender.id + '/change/project') ? ctx.request.headers.referer : null,
@@ -2521,10 +2562,10 @@ module.exports = app => {
                     throw '数据错误';
                     throw '数据错误';
                 }
                 }
                 if (ctx.change.uid !== ctx.session.sessionUser.accountId) {
                 if (ctx.change.uid !== ctx.session.sessionUser.accountId) {
-                    throw '您无权上报该数据';
+                    throw '您无权上报该变更立项数据';
                 }
                 }
                 if (ctx.change.status === auditConst.status.checking || ctx.change.status === auditConst.status.checked) {
                 if (ctx.change.status === auditConst.status.checking || ctx.change.status === auditConst.status.checked) {
-                    throw '该材料调差期数据当前无法上报';
+                    throw '该变更立项数据当前无法上报';
                 }
                 }
 
 
                 await ctx.service.changeProjectAudit.start(ctx.change.id, ctx.change.times);
                 await ctx.service.changeProjectAudit.start(ctx.change.id, ctx.change.times);
@@ -2546,7 +2587,7 @@ module.exports = app => {
             try {
             try {
                 const auditConst = audit.changeProject;
                 const auditConst = audit.changeProject;
                 if (!ctx.change || ctx.change.status !== auditConst.status.checking) {
                 if (!ctx.change || ctx.change.status !== auditConst.status.checking) {
-                    throw '当前材料调差期数据有误';
+                    throw '当前变更立项数据有误';
                 }
                 }
                 if (ctx.change.curAuditorIds.length === 0 || ctx.change.curAuditorIds.indexOf(ctx.session.sessionUser.accountId) === -1) {
                 if (ctx.change.curAuditorIds.length === 0 || ctx.change.curAuditorIds.indexOf(ctx.session.sessionUser.accountId) === -1) {
                     throw '您无权进行该操作';
                     throw '您无权进行该操作';
@@ -2990,6 +3031,9 @@ module.exports = app => {
                 // 获取用户人验证手机号
                 // 获取用户人验证手机号
                 const pa = await ctx.service.projectAccount.getDataById(ctx.session.sessionUser.accountId);
                 const pa = await ctx.service.projectAccount.getDataById(ctx.session.sessionUser.accountId);
                 const auth_mobile = pa.auth_mobile;
                 const auth_mobile = pa.auth_mobile;
+                const userPermission = pa !== undefined && pa.permission !== ''
+                    ? JSON.parse(pa.permission) : null;
+                const deleteFilePermission = userPermission && userPermission.change !== undefined && userPermission.change.indexOf('2') !== -1;
                 const renderData = {
                 const renderData = {
                     tender,
                     tender,
                     change: ctx.change,
                     change: ctx.change,
@@ -3001,6 +3045,7 @@ module.exports = app => {
                     fileList,
                     fileList,
                     whiteList,
                     whiteList,
                     authMobile: auth_mobile,
                     authMobile: auth_mobile,
+                    deleteFilePermission,
                     auditType,
                     auditType,
                     shenpiConst,
                     shenpiConst,
                     tpUnit: ctx.change.decimal ? ctx.change.decimal.tp : ctx.tender.info.decimal.tp,
                     tpUnit: ctx.change.decimal ? ctx.change.decimal.tp : ctx.tender.info.decimal.tp,
@@ -3042,6 +3087,10 @@ module.exports = app => {
                 // 获取附件列表
                 // 获取附件列表
                 const fileList = await ctx.service.changeApplyAtt.getAllChangeApplyAtt(ctx.tender.id, ctx.change.id);
                 const fileList = await ctx.service.changeApplyAtt.getAllChangeApplyAtt(ctx.tender.id, ctx.change.id);
                 await this._getChangeApplyAuditViewData(ctx);
                 await this._getChangeApplyAuditViewData(ctx);
+                const pa = await ctx.service.projectAccount.getDataById(ctx.session.sessionUser.accountId);
+                const userPermission = pa !== undefined && pa.permission !== ''
+                    ? JSON.parse(pa.permission) : null;
+                const deleteFilePermission = userPermission && userPermission.change !== undefined && userPermission.change.indexOf('2') !== -1;
                 const renderData = {
                 const renderData = {
                     tender,
                     tender,
                     change: ctx.change,
                     change: ctx.change,
@@ -3051,6 +3100,7 @@ module.exports = app => {
                     returnUrl: this.app._.includes(ctx.request.headers.referer, '/tender/' + ctx.tender.id + '/change/apply') ? ctx.request.headers.referer : null,
                     returnUrl: this.app._.includes(ctx.request.headers.referer, '/tender/' + ctx.tender.id + '/change/apply') ? ctx.request.headers.referer : null,
                     jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.change.apply_information_notice),
                     jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.change.apply_information_notice),
                     preUrl: '/tender/' + ctx.tender.id + '/change/apply/' + ctx.change.id + '/information/notice',
                     preUrl: '/tender/' + ctx.tender.id + '/change/apply/' + ctx.change.id + '/information/notice',
+                    deleteFilePermission,
                 };
                 };
                 await this.layout('change/apply_information_notice.ejs', renderData, 'change/apply_information_notice_modal.ejs');
                 await this.layout('change/apply_information_notice.ejs', renderData, 'change/apply_information_notice_modal.ejs');
             } catch (err) {
             } catch (err) {
@@ -3314,10 +3364,10 @@ module.exports = app => {
                     throw '数据错误';
                     throw '数据错误';
                 }
                 }
                 if (ctx.change.uid !== ctx.session.sessionUser.accountId) {
                 if (ctx.change.uid !== ctx.session.sessionUser.accountId) {
-                    throw '您无权上报该数据';
+                    throw '您无权上报该变更申请数据';
                 }
                 }
                 if (ctx.change.status === auditConst.status.checking || ctx.change.status === auditConst.status.checked) {
                 if (ctx.change.status === auditConst.status.checking || ctx.change.status === auditConst.status.checked) {
-                    throw '该材料调差期数据当前无法上报';
+                    throw '该变更申请数据当前无法上报';
                 }
                 }
 
 
                 await ctx.service.changeApplyAudit.start(ctx.change.id, ctx.change.times);
                 await ctx.service.changeApplyAudit.start(ctx.change.id, ctx.change.times);
@@ -3339,7 +3389,7 @@ module.exports = app => {
             try {
             try {
                 const auditConst = audit.changeApply;
                 const auditConst = audit.changeApply;
                 if (!ctx.change || ctx.change.status !== auditConst.status.checking) {
                 if (!ctx.change || ctx.change.status !== auditConst.status.checking) {
-                    throw '当前材料调差期数据有误';
+                    throw '当前变更申请数据有误';
                 }
                 }
                 if (ctx.change.curAuditorIds.length === 0 || ctx.change.curAuditorIds.indexOf(ctx.session.sessionUser.accountId) === -1) {
                 if (ctx.change.curAuditorIds.length === 0 || ctx.change.curAuditorIds.indexOf(ctx.session.sessionUser.accountId) === -1) {
                     throw '您无权进行该操作';
                     throw '您无权进行该操作';
@@ -3816,6 +3866,9 @@ module.exports = app => {
                 // 获取用户人验证手机号
                 // 获取用户人验证手机号
                 const pa = await ctx.service.projectAccount.getDataById(ctx.session.sessionUser.accountId);
                 const pa = await ctx.service.projectAccount.getDataById(ctx.session.sessionUser.accountId);
                 const auth_mobile = pa.auth_mobile;
                 const auth_mobile = pa.auth_mobile;
+                const userPermission = pa !== undefined && pa.permission !== ''
+                    ? JSON.parse(pa.permission) : null;
+                const deleteFilePermission = userPermission && userPermission.change !== undefined && userPermission.change.indexOf('2') !== -1;
                 const changeClass = await this._getOrUpdateClass(ctx, 'changePlan');
                 const changeClass = await this._getOrUpdateClass(ctx, 'changePlan');
                 const renderData = {
                 const renderData = {
                     tender,
                     tender,
@@ -3828,6 +3881,7 @@ module.exports = app => {
                     fileList,
                     fileList,
                     whiteList,
                     whiteList,
                     authMobile: auth_mobile,
                     authMobile: auth_mobile,
+                    deleteFilePermission,
                     auditType,
                     auditType,
                     shenpiConst,
                     shenpiConst,
                     tpUnit: ctx.change.decimal ? ctx.change.decimal.tp : ctx.tender.info.decimal.tp,
                     tpUnit: ctx.change.decimal ? ctx.change.decimal.tp : ctx.tender.info.decimal.tp,
@@ -4130,10 +4184,10 @@ module.exports = app => {
                     throw '数据错误';
                     throw '数据错误';
                 }
                 }
                 if (ctx.change.uid !== ctx.session.sessionUser.accountId) {
                 if (ctx.change.uid !== ctx.session.sessionUser.accountId) {
-                    throw '您无权上报该数据';
+                    throw '您无权上报该变更方案数据';
                 }
                 }
                 if (ctx.change.status === auditConst.status.checking || ctx.change.status === auditConst.status.checked) {
                 if (ctx.change.status === auditConst.status.checking || ctx.change.status === auditConst.status.checked) {
-                    throw '该材料调差期数据当前无法上报';
+                    throw '该变更方案数据当前无法上报';
                 }
                 }
 
 
                 await ctx.service.changePlanAudit.start(ctx.change.id, ctx.change.times);
                 await ctx.service.changePlanAudit.start(ctx.change.id, ctx.change.times);

+ 16 - 0
app/lib/rm/material.js

@@ -305,6 +305,8 @@ class rptMemChange extends RptMemBase {
                 return [this.ctx.tender.data];
                 return [this.ctx.tender.data];
             case 'mem_tender_info':
             case 'mem_tender_info':
                 return [this.ctx.tender.info];
                 return [this.ctx.tender.info];
+            case 'mem_deal_bills':
+                return this.ctx.service.dealBills.getAllDataByCondition({ where: { tender_id: this.ctx.tender.id } });
             case 'mem_material':
             case 'mem_material':
                 return [this.ctx.material];
                 return [this.ctx.material];
             case 'mem_material_audit':
             case 'mem_material_audit':
@@ -326,6 +328,20 @@ class rptMemChange extends RptMemBase {
         }
         }
     }
     }
 
 
+    getMaterialCalcQty(qtySource, info, is_join) {
+        let qty = 0;
+        switch(qtySource) {
+            case materialConst.qty_source_value.gather_qty: qty = info.gather_qty; break;
+            case materialConst.qty_source_value.contract_qty: qty = info.contract_qty; break;
+            case materialConst.qty_source_value.gather_minus_qty: qty = info.gather_minus_qty; break;
+            default: throw '未配置计量来源';
+        }
+        if (qtySource !== materialConst.qty_source_value.contract_qty && is_join === 2) {
+            qty = info.contract_qty;
+        }
+        return qty;
+    }
+
     async _getMaterialStageGatherBills(tender_id, stage_id, stage_order, stageSelf, stageIndex = 0) {
     async _getMaterialStageGatherBills(tender_id, stage_id, stage_order, stageSelf, stageIndex = 0) {
         const decimal = this.materialGatherBase.decimal;
         const decimal = this.materialGatherBase.decimal;
         const billsData = this.materialGatherBase.billsData;
         const billsData = this.materialGatherBase.billsData;

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

@@ -12,6 +12,9 @@ function getNewCode() {
     postData('/tender/'+ $('#tenderId').val() +'/change/newCode', null, function (code) {
     postData('/tender/'+ $('#tenderId').val() +'/change/newCode', null, function (code) {
         if (code !== '') {
         if (code !== '') {
             $('#bj-code').val(code);
             $('#bj-code').val(code);
+            if (openChangePlan && changePlanList && _.findIndex(changePlanList, { code: code }) !== -1) {
+                $('#plan-code').val(code).trigger('change');;
+            }
         }
         }
     });
     });
 }
 }
@@ -507,4 +510,19 @@ $(document).ready(() => {
         }
         }
         window.location.href = link;
         window.location.href = link;
     });
     });
+
+    // 输入变更令号下方方案同步编号
+    $('#bj-code').change(function () {
+        const code = $(this).val();
+        if (openChangePlan && changePlanList && _.findIndex(changePlanList, { code: code }) !== -1) {
+            $('#plan-code').val(code).trigger('change');
+        }
+    });
+
+    $('#plan-code').select2({
+        language: 'zh-CN',
+        theme: 'bootstrap4',
+        selectOnClose: true,
+        // width: '150',
+    });
 });
 });

+ 11 - 0
app/public/js/change_apply.js

@@ -12,6 +12,9 @@ function getNewCode() {
     postData('/tender/'+ tenderId +'/change/newCode', { type: rulesType }, function (code) {
     postData('/tender/'+ tenderId +'/change/newCode', { type: rulesType }, function (code) {
         if (code !== '') {
         if (code !== '') {
             $('#bj-code').val(code);
             $('#bj-code').val(code);
+            if (openChangeProject && changeProjectList && _.findIndex(changeProjectList, { code: code }) !== -1) {
+                $('#project-code').val(code);
+            }
         }
         }
     });
     });
 }
 }
@@ -492,4 +495,12 @@ $(document).ready(() => {
             autoFlashHeight();
             autoFlashHeight();
         }
         }
     });
     });
+
+    // 输入变更令号下方方案同步编号
+    $('#bj-code').change(function () {
+        const code = $(this).val();
+        if (openChangeProject && changeProjectList && _.findIndex(changeProjectList, { code: code }) !== -1) {
+            $('#project-code').val(code);
+        }
+    })
 });
 });

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

@@ -71,7 +71,7 @@ $(document).ready(() => {
                 //     curAuditor.audit_id === cur_uid && (showDel = true)
                 //     curAuditor.audit_id === cur_uid && (showDel = true)
                 // }
                 // }
                 if (change.status === auditConst.status.checked) {
                 if (change.status === auditConst.status.checked) {
-                    showDel = Boolean(file.extra_upload )
+                    showDel = Boolean(file.extra_upload ) || deleteFilePermission
                 } else {
                 } else {
                     showDel = true
                     showDel = true
                 }
                 }

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

@@ -40,7 +40,7 @@ $(document).ready(() => {
                 //     curAuditor.audit_id === cur_uid && (showDel = true)
                 //     curAuditor.audit_id === cur_uid && (showDel = true)
                 // }
                 // }
                 if (change.status === auditConst.status.checked) {
                 if (change.status === auditConst.status.checked) {
-                    showDel = Boolean(file.extra_upload )
+                    showDel = Boolean(file.extra_upload ) || deleteFilePermission
                 } else {
                 } else {
                     showDel = true
                     showDel = true
                 }
                 }

+ 11 - 0
app/public/js/change_plan.js

@@ -12,6 +12,9 @@ function getNewCode() {
     postData('/tender/'+ tenderId +'/change/newCode', { type: rulesType }, function (code) {
     postData('/tender/'+ tenderId +'/change/newCode', { type: rulesType }, function (code) {
         if (code !== '') {
         if (code !== '') {
             $('#bj-code').val(code);
             $('#bj-code').val(code);
+            if (openChangeApply && changeApplyList && _.findIndex(changeApplyList, { code: code }) !== -1) {
+                $('#apply-code').val(code);
+            }
         }
         }
     });
     });
 }
 }
@@ -491,4 +494,12 @@ $(document).ready(() => {
             autoFlashHeight();
             autoFlashHeight();
         }
         }
     });
     });
+
+    // 输入变更令号下方方案同步编号
+    $('#bj-code').change(function () {
+        const code = $(this).val();
+        if (openChangeApply && changeApplyList && _.findIndex(changeApplyList, { code: code }) !== -1) {
+            $('#apply-code').val(code);
+        }
+    })
 });
 });

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

@@ -65,7 +65,7 @@ $(document).ready(() => {
                 //     curAuditor.audit_id === cur_uid && (showDel = true)
                 //     curAuditor.audit_id === cur_uid && (showDel = true)
                 // }
                 // }
                 if (change.status === auditConst.status.checked) {
                 if (change.status === auditConst.status.checked) {
-                    showDel = Boolean(file.extra_upload )
+                    showDel = Boolean(file.extra_upload ) || deleteFilePermission
                 } else {
                 } else {
                     showDel = true
                     showDel = true
                 }
                 }

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

@@ -65,7 +65,7 @@ $(document).ready(() => {
                 //     curAuditor.audit_id === cur_uid && (showDel = true)
                 //     curAuditor.audit_id === cur_uid && (showDel = true)
                 // }
                 // }
                 if (change.status === auditConst.status.checked) {
                 if (change.status === auditConst.status.checked) {
-                    showDel = Boolean(file.extra_upload )
+                    showDel = Boolean(file.extra_upload ) || deleteFilePermission
                 } else {
                 } else {
                     showDel = true
                     showDel = true
                 }
                 }

+ 1 - 0
app/router.js

@@ -555,6 +555,7 @@ module.exports = app => {
 
 
     // 变更令 - 新版本
     // 变更令 - 新版本
     app.get('/tender/:id/change/:cid/information', sessionAuth, tenderCheck, uncheckTenderCheck, changeCheck, changeAuditCheck, 'changeController.information');
     app.get('/tender/:id/change/:cid/information', sessionAuth, tenderCheck, uncheckTenderCheck, changeCheck, changeAuditCheck, 'changeController.information');
+    app.get('/tender/:id/change/:cid/relation', sessionAuth, tenderCheck, uncheckTenderCheck, changeCheck, 'changeController.relation');
     app.post('/tender/:id/change/:cid/information/save', sessionAuth, tenderCheck, uncheckTenderCheck, changeCheck, 'changeController.saveListsData');
     app.post('/tender/:id/change/:cid/information/save', sessionAuth, tenderCheck, uncheckTenderCheck, changeCheck, 'changeController.saveListsData');
     app.post('/tender/:id/change/:cid/information/audit/start', sessionAuth, tenderCheck, uncheckTenderCheck, changeCheck, changeAuditCheck, 'changeController.startAudit');
     app.post('/tender/:id/change/:cid/information/audit/start', sessionAuth, tenderCheck, uncheckTenderCheck, changeCheck, changeAuditCheck, 'changeController.startAudit');
     app.post('/tender/:id/change/:cid/information/file/upload', sessionAuth, 'changeController.uploadFile');
     app.post('/tender/:id/change/:cid/information/file/upload', sessionAuth, 'changeController.uploadFile');

+ 1 - 1
app/view/change/apply.ejs

@@ -78,7 +78,7 @@
                     <% for (const c of changes) { %>
                     <% for (const c of changes) { %>
                         <tr><td><a href="/tender/<%- tender.id %>/change/apply/<%- c.id %>/information"><%- c.code %></a></td><td><%- c.name %></td>
                         <tr><td><a href="/tender/<%- tender.id %>/change/apply/<%- c.id %>/information"><%- c.code %></a></td><td><%- c.name %></td>
                             <td style="text-align: right"><%- c.total_price %></td>
                             <td style="text-align: right"><%- c.total_price %></td>
-                            <td><%- c.project_code %></td>
+                            <td><% if (c.project_code) { %><% if (ctx.helper._.find(changeProjectList, { code: c.project_code })) { %><a href="/tender/<%- tender.id %>/change/project/<%- ctx.helper._.find(changeProjectList, { code: c.project_code }).id %>/information" target="_blank"><%- c.project_code %></a><% } else { %><%- c.project_code %><% } %><% } %></td>
                             <td><% if (c.notice_code) { %><a href="/tender/<%- tender.id %>/change/apply/<%- c.id %>/information/notice"><%- c.notice_code %></a><% } %></td>
                             <td><% if (c.notice_code) { %><a href="/tender/<%- tender.id %>/change/apply/<%- c.id %>/information/notice"><%- c.notice_code %></a><% } %></td>
                             <td><%- c.account_name %></td>
                             <td><%- c.account_name %></td>
                             <td class="text-center">
                             <td class="text-center">

+ 1 - 0
app/view/change/apply_information.ejs

@@ -199,6 +199,7 @@
     const fileTypeConst = JSON.parse(unescape('<%- escape(JSON.stringify(changeConst.file_type)) %>'));
     const fileTypeConst = JSON.parse(unescape('<%- escape(JSON.stringify(changeConst.file_type)) %>'));
     const fileList = JSON.parse(unescape('<%- escape(JSON.stringify(fileList)) %>')) || [];
     const fileList = JSON.parse(unescape('<%- escape(JSON.stringify(fileList)) %>')) || [];
     const whiteList = JSON.parse('<%- JSON.stringify(whiteList) %>');
     const whiteList = JSON.parse('<%- JSON.stringify(whiteList) %>');
+    const deleteFilePermission = <%- deleteFilePermission %>;
     const preUrl = '<%- preUrl %>';
     const preUrl = '<%- preUrl %>';
     const change = JSON.parse(unescape('<%- escape(JSON.stringify(change)) %>'));
     const change = JSON.parse(unescape('<%- escape(JSON.stringify(change)) %>'));
     let listRule = JSON.parse(unescape('<%- escape(JSON.stringify(listRule)) %>'));
     let listRule = JSON.parse(unescape('<%- escape(JSON.stringify(listRule)) %>'));

+ 1 - 0
app/view/change/apply_information_notice.ejs

@@ -86,6 +86,7 @@
     const auditConst = JSON.parse('<%- JSON.stringify(auditConst) %>');
     const auditConst = JSON.parse('<%- JSON.stringify(auditConst) %>');
     const fileTypeConst = JSON.parse(unescape('<%- escape(JSON.stringify(changeConst.file_type)) %>'));
     const fileTypeConst = JSON.parse(unescape('<%- escape(JSON.stringify(changeConst.file_type)) %>'));
     const fileList = JSON.parse(unescape('<%- escape(JSON.stringify(fileList)) %>')) || [];
     const fileList = JSON.parse(unescape('<%- escape(JSON.stringify(fileList)) %>')) || [];
+    const deleteFilePermission = <%- deleteFilePermission %>;
     const preUrl = '<%- preUrl %>';
     const preUrl = '<%- preUrl %>';
     const change = JSON.parse(unescape('<%- escape(JSON.stringify(change)) %>'));
     const change = JSON.parse(unescape('<%- escape(JSON.stringify(change)) %>'));
 </script>
 </script>

+ 3 - 0
app/view/change/index.ejs

@@ -162,6 +162,9 @@
 </div>
 </div>
 <script src="/public/js/sub_menu.js"></script>
 <script src="/public/js/sub_menu.js"></script>
 <script  src="/public/js/colResizable/colResizable-1.6.min.js"></script>
 <script  src="/public/js/colResizable/colResizable-1.6.min.js"></script>
+<link href="/public/css/bootstrap/select2.min.css" rel="stylesheet" />
+<link rel="stylesheet" href="/public/css/bootstrap/select2-bootstrap4.min.css">
+<script src="/public/js/bootstrap/select2.min.js"></script>
 <script>
 <script>
     $.subMenu({
     $.subMenu({
         menu: '#sub-menu', miniMenu: '#sub-mini-menu', miniMenuList: '#mini-menu-list',
         menu: '#sub-menu', miniMenu: '#sub-mini-menu', miniMenuList: '#mini-menu-list',

+ 3 - 0
app/view/change/information.ejs

@@ -9,6 +9,9 @@
                         <div class="btn-group btn-group-toggle group-tab">
                         <div class="btn-group btn-group-toggle group-tab">
                             <a class="btn btn-sm btn-light active" href="javascript:void(0);">变更详情</a>
                             <a class="btn btn-sm btn-light active" href="javascript:void(0);">变更详情</a>
                             <a class="btn btn-sm btn-light" href="/tender/<%- ctx.tender.id %>/change/<%- ctx.change.cid %>/report">输出报表</a>
                             <a class="btn btn-sm btn-light" href="/tender/<%- ctx.tender.id %>/change/<%- ctx.change.cid %>/report">输出报表</a>
+                            <% if (ctx.session.sessionProject.page_show.openChangePlan) { %>
+                            <a class="btn btn-sm btn-light" href="/tender/<%- ctx.tender.id %>/change/<%- ctx.change.cid %>/relation">关联数据</a>
+                            <% } %>
                         </div>
                         </div>
                     </div>
                     </div>
                 </div>
                 </div>

+ 57 - 5
app/view/change/modal.ejs

@@ -62,6 +62,42 @@
                     </div>
                     </div>
                 </div>
                 </div>
                 <% if (ctx.session.sessionProject.page_show.openChangePlan) { %>
                 <% if (ctx.session.sessionProject.page_show.openChangePlan) { %>
+                    <style>
+                        .select2-container {
+                            /*display: inline-block!important;*/
+                            /*height: 27px;*/
+                            width: 100% !important;
+                        }
+                        .select2-container--bootstrap4 .select2-selection--single {
+                            height: calc(1.1em + .75rem + 2px) !important;
+                        }
+                        /*.select2-container--bootstrap4 .select2-selection {*/
+                        /*    background-color: #f8f9fa;*/
+                        /*    !*border-color: #f8f9fa;*!*/
+                        /*    border: 1px solid #f8f9fa;*/
+                        /*}*/
+                        /*.select2-container--bootstrap4 .select2-selection--single .select2-selection__rendered:focus{*/
+                        /*    box-shadow: 0 0 0 0.2rem rgba(216,217,219,.5);*/
+                        /*}*/
+                        /*.select2-container--bootstrap4 .select2-selection--single .select2-selection__rendered:hover {*/
+                        /*    background-color: #e2e6ea;*/
+                        /*    border-color: #dae0e5;*/
+                        /*}*/
+                        .select2-container--bootstrap4 .select2-selection--single .select2-selection__rendered {
+                            line-height: calc(1.1em + .75rem);
+                            /*color: #007bff!important;*/
+                            border-radius: 0.2rem;
+                            /*background-color: #f8f9fa;*/
+                            /*border-color: #f8f9fa;*/
+                        }
+                        .select2-container--bootstrap4 .select2-selection--single .select2-selection__arrow b {
+                            border-color: #007bff transparent transparent transparent;
+                            border-width: 4px 3.7px 0;
+                        }
+                        .select2-search--dropdown .select2-search__field {
+                            padding: 0.175rem 0.5rem;
+                        }
+                    </style>
                     <div class="form-group">
                     <div class="form-group">
                         <label>关联变更方案</label>
                         <label>关联变更方案</label>
                         <select class="form-control form-control-sm" id="plan-code">
                         <select class="form-control form-control-sm" id="plan-code">
@@ -332,6 +368,7 @@
 <script src="/public/js/gcl_gather.js"></script>
 <script src="/public/js/gcl_gather.js"></script>
 <script>
 <script>
     const shenpiConst = JSON.parse(unescape('<%- escape(JSON.stringify(shenpiConst)) %>'));
     const shenpiConst = JSON.parse(unescape('<%- escape(JSON.stringify(shenpiConst)) %>'));
+    const precision = JSON.parse('<%- JSON.stringify(precision) %>');
     $(function () {
     $(function () {
         const intervalIds = {};
         const intervalIds = {};
         <% if (tender.user_id === ctx.session.sessionUser.accountId) { %>
         <% if (tender.user_id === ctx.session.sessionUser.accountId) { %>
@@ -781,10 +818,10 @@
                 for (const c of cids) {
                 for (const c of cids) {
                     const cInfo = checkingList.find(item => item.cid === c);
                     const cInfo = checkingList.find(item => item.cid === c);
                     if (cInfo) {
                     if (cInfo) {
-                        $('#batch-sp-progress .change-progress').append(`<div id="change-${cInfo.cid}-progress"><div class="mt-3 progress">` +
+                        $('#batch-sp-progress .change-progress').append(`<div class="mt-3" id="change-${cInfo.cid}-progress"><div>变更令 <a href="/tender/${cInfo.tid}/change/${cInfo.cid}/information" target="_blank"><b>${cInfo.code}</b></a> :</div><div class="progress">` +
                             '<div class="progress-bar progress-bar-striped progress-bar-animated" role="progressbar" style="width: 0%" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100"></div>' +
                             '<div class="progress-bar progress-bar-striped progress-bar-animated" role="progressbar" style="width: 0%" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100"></div>' +
                             '</div>' +
                             '</div>' +
-                            `<div class="mt-1">变更令 <b>${cInfo.code}</b> <span class="progress-change-text">审批处理中...</span></div></div>`);
+                            `<div class="mt-1"><span class="progress-change-text">审批处理中...</span></div></div>`);
                         await checkAndChange(cInfo, changeListData, result.changeLedgerList, 'checking');
                         await checkAndChange(cInfo, changeListData, result.changeLedgerList, 'checking');
                     }
                     }
                 }
                 }
@@ -866,8 +903,8 @@
                                 break;
                                 break;
                             }
                             }
                         }
                         }
-                        const info = makePushBwmx(clinfo, listinfo, removeList, updateList);
-                        if (info) break;
+                        const [info, needUpdate] = makePushBwmx(clinfo, listinfo, removeList, updateList);
+                        if (needUpdate) break;
                         if (_.findIndex(changeLedgerList, { id: clinfo.gcl_id }) !== -1) {
                         if (_.findIndex(changeLedgerList, { id: clinfo.gcl_id }) !== -1) {
                             // 可能因为升降级关系:细目,分部分项等会发生变化,更新清单
                             // 可能因为升降级关系:细目,分部分项等会发生变化,更新清单
                             const updateInfo = {};
                             const updateInfo = {};
@@ -902,6 +939,7 @@
                 }
                 }
                 await sleep(2000);
                 await sleep(2000);
                 if (updateList.length > 0 || removeList.length > 0) {
                 if (updateList.length > 0 || removeList.length > 0) {
+                    console.log(updateList, removeList);
                     failProgress($('#change-' + cInfo.cid + '-progress .progress-bar'), `change-${cInfo.cid}`);
                     failProgress($('#change-' + cInfo.cid + '-progress .progress-bar'), `change-${cInfo.cid}`);
                     $('#change-' + cInfo.cid + '-progress .mt-1').addClass('text-danger');
                     $('#change-' + cInfo.cid + '-progress .mt-1').addClass('text-danger');
                     $('#change-' + cInfo.cid + '-progress .progress-change-text').text('清单数据发生变化,需要进入到详情页处理');
                     $('#change-' + cInfo.cid + '-progress .progress-change-text').text('清单数据发生变化,需要进入到详情页处理');
@@ -1027,6 +1065,7 @@
         }
         }
 
 
         function makePushBwmx(clinfo, listinfo, removeList, updateList) {
         function makePushBwmx(clinfo, listinfo, removeList, updateList) {
+            let info = '';
             let needUpdate = false;
             let needUpdate = false;
             const checkKey = ['name', 'code', 'unit', 'unit_price'];
             const checkKey = ['name', 'code', 'unit', 'unit_price'];
             const checkLeafKey = ['oamount', 'bwmx', 'code', 'dwgc', 'fbgc', 'fxgc', 'jldy'];
             const checkLeafKey = ['oamount', 'bwmx', 'code', 'dwgc', 'fbgc', 'fxgc', 'jldy'];
@@ -1088,12 +1127,25 @@
                     if (needUpdate) {
                     if (needUpdate) {
                         updateList.push(oneUpdate);
                         updateList.push(oneUpdate);
                     }
                     }
+                    info = leafInfo;
                 } else {
                 } else {
                     removeList.push(clinfo);
                     removeList.push(clinfo);
                     needUpdate = true;
                     needUpdate = true;
                 }
                 }
             }
             }
-            return needUpdate;
+            return [info, needUpdate];
+        }
+
+        function findDecimal(unit) {
+            let value = precision.other.value;
+            const changeUnits = precision;
+            for (const d in changeUnits) {
+                if (changeUnits[d].unit !== undefined && changeUnits[d].unit === unit) {
+                    value = changeUnits[d].value;
+                    break;
+                }
+            }
+            return value;
         }
         }
 
 
         // 编号排序,多重判断
         // 编号排序,多重判断

+ 1 - 1
app/view/change/plan.ejs

@@ -79,7 +79,7 @@
                         <tr><td><a href="/tender/<%- tender.id %>/change/plan/<%- c.id %>/information"><%- c.code %></a></td><td><%- c.name %></td>
                         <tr><td><a href="/tender/<%- tender.id %>/change/plan/<%- c.id %>/information"><%- c.code %></a></td><td><%- c.name %></td>
                             <td><%- c.quality %></td>
                             <td><%- c.quality %></td>
                             <td style="text-align: right"><%- c.total_price %></td>
                             <td style="text-align: right"><%- c.total_price %></td>
-                            <td><%- c.apply_code %></td>
+                            <td><% if (c.apply_code) { %><% if (ctx.helper._.find(changeApplyList, { code: c.apply_code })) { %><a href="/tender/<%- tender.id %>/change/apply/<%- ctx.helper._.find(changeApplyList, { code: c.apply_code }).id %>/information" target="_blank"><%- c.apply_code %></a><% } else { %><%- c.apply_code %><% } %><% } %></td>
                             <td class="text-center">
                             <td class="text-center">
                                 <% if (c.status === auditConst.status.uncheck && c.uid === ctx.session.sessionUser.accountId) { %>
                                 <% if (c.status === auditConst.status.uncheck && c.uid === ctx.session.sessionUser.accountId) { %>
                                     <a href="/tender/<%- tender.id %>/change/plan/<%- c.id %>/information" class="btn <%- auditConst.statusButtonClass[c.status] %> btn-sm"><%- auditConst.statusButton[c.status] %></a>
                                     <a href="/tender/<%- tender.id %>/change/plan/<%- c.id %>/information" class="btn <%- auditConst.statusButtonClass[c.status] %> btn-sm"><%- auditConst.statusButton[c.status] %></a>

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

@@ -196,6 +196,7 @@
     const fileTypeConst = JSON.parse(unescape('<%- escape(JSON.stringify(changeConst.file_type)) %>'));
     const fileTypeConst = JSON.parse(unescape('<%- escape(JSON.stringify(changeConst.file_type)) %>'));
     const fileList = JSON.parse(unescape('<%- escape(JSON.stringify(fileList)) %>')) || [];
     const fileList = JSON.parse(unescape('<%- escape(JSON.stringify(fileList)) %>')) || [];
     const whiteList = JSON.parse('<%- JSON.stringify(whiteList) %>');
     const whiteList = JSON.parse('<%- JSON.stringify(whiteList) %>');
+    const deleteFilePermission = <%- deleteFilePermission %>;
     const preUrl = '<%- preUrl %>';
     const preUrl = '<%- preUrl %>';
     const change = JSON.parse(unescape('<%- escape(JSON.stringify(change)) %>'));
     const change = JSON.parse(unescape('<%- escape(JSON.stringify(change)) %>'));
     let listRule = JSON.parse(unescape('<%- escape(JSON.stringify(listRule)) %>'));
     let listRule = JSON.parse(unescape('<%- escape(JSON.stringify(listRule)) %>'));

+ 1 - 0
app/view/change/project_information.ejs

@@ -169,6 +169,7 @@
     const auditConst = JSON.parse('<%- JSON.stringify(auditConst) %>');
     const auditConst = JSON.parse('<%- JSON.stringify(auditConst) %>');
     const fileList = JSON.parse(unescape('<%- escape(JSON.stringify(fileList)) %>')) || [];
     const fileList = JSON.parse(unescape('<%- escape(JSON.stringify(fileList)) %>')) || [];
     const whiteList = JSON.parse('<%- JSON.stringify(whiteList) %>');
     const whiteList = JSON.parse('<%- JSON.stringify(whiteList) %>');
+    const deleteFilePermission = <%- deleteFilePermission %>;
     const preUrl = '<%- preUrl %>';
     const preUrl = '<%- preUrl %>';
     const change = JSON.parse(unescape('<%- escape(JSON.stringify(change)) %>'));
     const change = JSON.parse(unescape('<%- escape(JSON.stringify(change)) %>'));
 </script>
 </script>

+ 63 - 0
app/view/change/relation.ejs

@@ -0,0 +1,63 @@
+<% include ../tender/tender_sub_menu.ejs %>
+<div class="panel-content">
+    <div class="panel-title"><!--收起详解目录添加类名 fluid -->
+        <div class="title-main d-flex"><!--工具-->
+            <% include ../tender/tender_sub_mini_menu.ejs %>
+            <div>
+                <div class="d-inline-block">
+                    <div class="btn-group btn-group-toggle group-tab">
+                        <a class="btn btn-sm btn-light" href="/tender/<%- ctx.tender.id %>/change/<%- ctx.change.cid %>/information">申请详情</a>
+                        <a class="btn btn-sm btn-light" href="/tender/<%- ctx.tender.id %>/change/<%- ctx.change.cid %>/report">输出报表</a>
+                        <a class="btn btn-sm btn-light active" href="javascript:void(0);">关联数据</a>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+    <div class="content-wrap">
+        <div class="c-body">
+            <div class="sjs-height-0">
+                <table class="table table-bordered">
+                    <thead>
+                    <tr class="text-center">
+                        <th>变更类型</th>
+                        <th>编号</th>
+                        <th>变更工程名称</th>
+                        <th>操作</th>
+                    </tr>
+                    </thead>
+                    <tbody>
+                    <tbody>
+                    <% if (ctx.session.sessionProject.page_show.openChangeProject) { %>
+                    <tr>
+                        <td class="text-center">变更立项</td>
+                        <td><% if (changeProjectInfo) { %><%- changeProjectInfo.code %><% } %></td>
+                        <td><% if (changeProjectInfo) { %><%- changeProjectInfo.name %><% } %></td>
+                        <td class="text-center"><% if (changeProjectInfo) { %><a target="_blank" href="/tender/<%- tender.id %>/change/project/<%- changeProjectInfo.id %>/information">查看详情</a><% } %></td>
+                    </tr>
+                    <% } %>
+                    <% if (ctx.session.sessionProject.page_show.openChangeApply) { %>
+                    <tr>
+                        <td class="text-center">变更申请</td>
+                        <td><% if (changeApplyInfo) { %><%- changeApplyInfo.code %><% } %></td>
+                        <td><% if (changeApplyInfo) { %><%- changeApplyInfo.name %><% } %></td>
+                        <td class="text-center"><% if (changeApplyInfo) { %><a target="_blank" href="/tender/<%- tender.id %>/change/apply/<%- changeApplyInfo.id %>/information">查看详情</a><% } %></td>
+                    </tr>
+                    <% } %>
+                    <% if (ctx.session.sessionProject.page_show.openChangePlan) { %>
+                    <tr>
+                        <td class="text-center">变更方案</td>
+                        <td><% if (changePlanInfo) { %><%- changePlanInfo.code %><% } %></td>
+                        <td><% if (changePlanInfo) { %><%- changePlanInfo.name %><% } %></td>
+                        <td class="text-center"><% if (changePlanInfo) { %><a target="_blank" href="/tender/<%- tender.id %>/change/plan/<%- changePlanInfo.id %>/information">查看详情</a><% } %></td>
+                    </tr>
+                    <% } %>
+                    </tbody>
+                </table>
+            </div>
+        </div>
+    </div>
+</div>
+<script>
+    autoFlashHeight();
+</script>

+ 1 - 0
app/view/change/report.ejs

@@ -9,6 +9,7 @@
                         <div class="btn-group btn-group-toggle group-tab">
                         <div class="btn-group btn-group-toggle group-tab">
                             <a class="btn btn-sm btn-light" href="/tender/<%- ctx.tender.id %>/change/<%- ctx.change.cid %>/information">变更详情</a>
                             <a class="btn btn-sm btn-light" href="/tender/<%- ctx.tender.id %>/change/<%- ctx.change.cid %>/information">变更详情</a>
                             <a class="btn btn-sm btn-light active" href="javascript:void(0);">输出报表</a>
                             <a class="btn btn-sm btn-light active" href="javascript:void(0);">输出报表</a>
+                            <a class="btn btn-sm btn-light" href="/tender/<%- ctx.tender.id %>/change/<%- ctx.change.cid %>/relation">关联数据</a>
                         </div>
                         </div>
                     </div>
                     </div>
                 </div>
                 </div>

+ 3 - 0
app/view/report/index.ejs

@@ -95,6 +95,9 @@
                     <a class="btn btn-sm btn-light" href="/tender/<%- tender_id %>/change/apply/<%- bizId %>/information">申请详情</a>
                     <a class="btn btn-sm btn-light" href="/tender/<%- tender_id %>/change/apply/<%- bizId %>/information">申请详情</a>
                     <% } %>
                     <% } %>
                     <a class="btn btn-sm btn-light active" href="javascript:void(0);">输出报表</a>
                     <a class="btn btn-sm btn-light active" href="javascript:void(0);">输出报表</a>
+                    <% if (ctx.session.sessionProject.page_show.openChangePlan && [-300].includes(stg_id)) { %>
+                    <a class="btn btn-sm btn-light" href="/tender/<%- tender_id %>/change/<%- bizId %>/relation">关联数据</a>
+                    <% } %>
                 </div>
                 </div>
                 <% } %>
                 <% } %>
                 <% if (false || ![-100, -200, -300, -301, -302, -303].includes(stg_id)) { %>
                 <% if (false || ![-100, -200, -300, -301, -302, -303].includes(stg_id)) { %>