瀏覽代碼

变更自定义类别功能

ellisran 1 年之前
父節點
當前提交
3f41ac24f6

+ 35 - 0
app/const/fun_set.js

@@ -13,6 +13,40 @@ const endMonth = [
     // { val: 3, name: '隔月' },
 ];
 const parseInfo = ['stage_start'];
+
+const changeClass = [
+    {
+        value: 1,
+        name: 'A类变更',
+        new_name: '',
+        checked: true,
+    },
+    {
+        value: 2,
+        name: 'B类变更',
+        new_name: '',
+        checked: true,
+    },
+    {
+        value: 3,
+        name: 'C类变更',
+        new_name: '',
+        checked: true,
+    },
+    {
+        value: 4,
+        name: 'D类变更',
+        new_name: '',
+        checked: true,
+    },
+    {
+        value: 5,
+        name: 'E类变更',
+        new_name: '',
+        checked: true,
+    },
+];
+
 const defaultInfo = {
     // 合同信息
     stage_start: {
@@ -20,6 +54,7 @@ const defaultInfo = {
         end_month: 0,
         end_day: 0,
     },
+    change_class: changeClass,
 };
 
 module.exports = {

+ 47 - 0
app/controller/change_controller.js

@@ -606,6 +606,10 @@ module.exports = app => {
                     }
                 }
 
+                // 工程变更类别读取
+                const projectData = await ctx.service.project.getDataById(ctx.session.sessionProject.id);
+                const fun_set = await ctx.service.project.getFunSet(projectData.fun_set);
+
                 // 获取用户人验证手机号
                 const pa = await ctx.service.projectAccount.getDataById(ctx.session.sessionUser.accountId);
                 const auth_mobile = pa.auth_mobile;
@@ -614,6 +618,7 @@ module.exports = app => {
                     change,
                     othersChange,
                     changeConst,
+                    changeClass: fun_set.change_class,
                     auditStatus,
                     auditConst: audit.flow,
                     ledgerConsts: audit.ledger.status,
@@ -677,6 +682,12 @@ module.exports = app => {
                     renderData.changeList = changeList;
                     renderData.changeLedgerList = await ctx.service.changeLedger.getAllDataByCondition({ where: { tender_id: ctx.tender.id } });
                     renderData.changePosList = await ctx.service.changePos.getAllDataByCondition({ where: { tid: ctx.tender.id } });
+
+                    // 判断是否更新变更类别
+                    if (ctx.helper._.findIndex(fun_set.change_class, { value: change.class, checked: true }) === -1) {
+                        renderData.change.class = ctx.helper._.find(fun_set.change_class, { checked: true }).value;
+                        await ctx.service.change.saveInfo({ class: ctx.helper._.find(fun_set.change_class, { checked: true }).value });
+                    }
                 } else if (auditStatus === 3 || auditStatus === 4 || auditStatus === 5 || auditStatus === 7 || auditStatus === 8) {
                     // 展示页左侧审批流程列表和清单审批列表数据
                     const times = change.status === audit.flow.status.back ?
@@ -2070,6 +2081,35 @@ module.exports = app => {
             ctx.change.xsAuditors = await ctx.service.changeProjectXsAudit.getAuditList(ctx.change.id);
         }
 
+        // 变更类别获取及更新
+        async _getOrUpdateClass(ctx, serviceName) {
+            // 工程变更类别读取
+            const projectData = await ctx.service.project.getDataById(ctx.session.sessionProject.id);
+            const fun_set = await ctx.service.project.getFunSet(projectData.fun_set);
+            if (ctx.change.status === audit[serviceName].status.uncheck ||
+                (serviceName === 'changeProject' && ctx.change.status === audit[serviceName].status.back) ||
+                (serviceName !== 'changeProject' && ctx.change.status === audit[serviceName].status.checkNo)) {
+                const classInfo = ctx.helper._.find(fun_set.change_class, function(item) {
+                    return item.checked && (item.name === ctx.change.class || item.new_name === ctx.change.class);
+                });
+                if (!classInfo) {
+                    const classInfo2 = ctx.helper._.find(fun_set.change_class, { checked: true });
+                    ctx.change.class = classInfo2.new_name ? classInfo2.new_name : classInfo2.name;
+                    await ctx.service[serviceName].defaultUpdate({
+                        id: ctx.change.id,
+                        class: ctx.change.class,
+                    });
+                } else if (classInfo && classInfo.new_name && ctx.change.class !== classInfo.new_name) {
+                    ctx.change.class = classInfo.new_name;
+                    await ctx.service[serviceName].defaultUpdate({
+                        id: ctx.change.id,
+                        class: ctx.change.class,
+                    });
+                }
+            }
+            return fun_set.change_class;
+        }
+
         async projectInformation(ctx) {
             try {
                 const whiteList = this.ctx.app.config.multipart.whitelist;
@@ -2077,10 +2117,13 @@ module.exports = app => {
                 // 获取附件列表
                 const fileList = await ctx.service.changeProjectAtt.getAllChangeProjectAtt(ctx.tender.id, ctx.change.id);
                 await this._getChangeProjectAuditViewData(ctx);
+                const changeClass = await this._getOrUpdateClass(ctx, 'changeProject');
+                // 判断并更新
                 const renderData = {
                     tender,
                     change: ctx.change,
                     changeConst,
+                    changeClass,
                     auditConst: audit.changeProject,
                     fileList,
                     whiteList,
@@ -2672,12 +2715,14 @@ module.exports = app => {
                 const changeList = await ctx.service.changeApplyList.getList(ctx.change.id);
                 // 获取附件列表
                 const fileList = await ctx.service.changeApplyAtt.getAllChangeApplyAtt(ctx.tender.id, ctx.change.id);
+                const changeClass = await this._getOrUpdateClass(ctx, 'changeApply');
                 const renderData = {
                     tender,
                     change: ctx.change,
                     listRule: tender.c_apply_list_rule ? JSON.parse(tender.c_apply_list_rule) : { source: 1, rule: ['unit', 'unit_price'] },
                     changeList,
                     changeConst,
+                    changeClass,
                     auditConst: audit.changeApply,
                     fileList,
                     whiteList,
@@ -3294,11 +3339,13 @@ module.exports = app => {
                         }
                     }
                 }
+                const changeClass = await this._getOrUpdateClass(ctx, 'changePlan');
                 const renderData = {
                     tender,
                     change: ctx.change,
                     listRule: tender.c_plan_list_rule ? JSON.parse(tender.c_plan_list_rule) : { source: 1, rule: ['unit', 'unit_price'] },
                     changeList,
+                    changeClass,
                     changeConst,
                     auditConst: audit.changePlan,
                     fileList,

+ 1 - 1
app/controller/setting_controller.js

@@ -937,7 +937,7 @@ module.exports = app => {
                     imType,
                     endMonth: funSet.endMonth,
                     funSet: fun_set,
-                });
+                }, 'setting/fun_modal.ejs');
             } catch (error) {
                 ctx.helper.log(error);
                 ctx.redirect('/dashboard');

+ 7 - 2
app/service/change.js

@@ -117,8 +117,13 @@ module.exports = app => {
                         change.org_code = planInfo.new_code;
                         change.new_code = planInfo.c_new_code;
                         change.new_name = planInfo.design_name;
-                        const classIndex = planInfo.class && this._.indexOf(changeConst.className, planInfo.class) !== -1 ? this._.indexOf(changeConst.className, planInfo.class) : 0;
-                        change.class = classIndex ? classIndex : changeConst.class.A.value;
+                        // 工程变更类别读取
+                        const projectData = await this.ctx.service.project.getDataById(this.ctx.session.sessionProject.id);
+                        const fun_set = await this.ctx.service.project.getFunSet(projectData.fun_set);
+                        const classInfo = this._.find(fun_set.change_class, function(item) {
+                            return item.name === planInfo.class || (item.checked && item.new_name === planInfo.class);
+                        });
+                        change.class = classInfo ? classInfo.value : this._.find(fun_set.change_class, { checked: true }).value;
                         const qualityIndex = planInfo.quality && this._.indexOf(changeConst.qualityName, planInfo.quality) !== -1 ? this._.indexOf(changeConst.qualityName, planInfo.quality) : 0;
                         change.quality = qualityIndex ? qualityIndex : changeConst.quality.common.value;
                         let content = planInfo.reason ? planInfo.reason.replace(/[\r\n]/g, '\r\n') : '';

+ 5 - 0
app/service/change_project.js

@@ -41,6 +41,10 @@ module.exports = app => {
                 throw '立项书编号重复';
             }
 
+            // 工程变更类别读取
+            const projectData = await this.ctx.service.project.getDataById(this.ctx.session.sessionProject.id);
+            const fun_set = await this.ctx.service.project.getFunSet(projectData.fun_set);
+            const classInfo = this._.find(fun_set.change_class, { checked: true });
             // 初始化事务
             this.transaction = await this.db.beginTransaction();
             let result = false;
@@ -55,6 +59,7 @@ module.exports = app => {
                     code,
                     name,
                     quality: changeConst.quality.common.name,
+                    class: classInfo.new_name ? classInfo.new_name : classInfo.name,
                 };
                 const operate = await this.transaction.insert(this.tableName, change);
 

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

@@ -86,7 +86,17 @@
                             </tr>
                             <tr>
                                 <th width="" class="text-center" style="vertical-align: middle">工程变更类别</th>
-                                <td><input class="form-control form-control-sm" type="text" value="<%- change.class %>" data-name="class" <% if (change.readOnly) { %>readonly<% } %> placeholder=""></td>
+                                <% if (change.readOnly) { %>
+                                    <td><input class="form-control form-control-sm" type="text" value="<%- change.class %>" data-name="class" readonly placeholder=""></td>
+                                <% } else { %>
+                                    <td><select class="form-control form-control-sm" name="class" data-name="class" <% if (change.readOnly) { %>readonly<% } %>>
+                                            <% for (const cc of changeClass) { %>
+                                                <% if (cc.checked) { %>
+                                                    <option <% if (cc.name === change.class || cc.new_name === change.class) { %> selected<% } %>><%- cc.new_name ? cc.new_name : cc.name %></option>
+                                                <% } %>
+                                            <% } %>
+                                        </select></td>
+                                <% } %>
                                 <th width="" class="text-center" style="vertical-align: middle">变更后工程造价(元)</th>
                                 <td><input class="form-control form-control-sm" type="text" value="<%- change.change_price %>" data-name="change_price" <% if (change.readOnly) { %>readonly<% } %> placeholder=""></td>
                             </tr>

+ 9 - 8
app/view/change/information.ejs

@@ -200,9 +200,10 @@
                                 <div class="form-group">
                                     <label>工程变更类别 </label>
                                     <select class="form-control form-control-sm" name="class">
-                                        <% for (const c in changeConst.class) { %>
-                                            <% const cClass = changeConst.class[c] %>
-                                            <option value="<%- cClass.value %>"<% if (cClass.value === change.class) { %> selected<% } %>><%- cClass.name %></option>
+                                        <% for (const cc of changeClass) { %>
+                                            <% if (cc.checked) { %>
+                                            <option value="<%- cc.value %>"<% if (cc.value === change.class) { %> selected<% } %>><%- cc.new_name ? cc.new_name : cc.name %></option>
+                                            <% } %>
                                         <% } %>
                                     </select>
                                 </div>
@@ -309,10 +310,9 @@
                                 <div class="form-group">
                                     <label>工程变更类别 </label>
                                     <select class="form-control form-control-sm" disabled>
-                                        <% for (const c in changeConst.class) { %>
-                                            <% const cClass = changeConst.class[c] %>
-                                            <% if (cClass.value === change.class) { %>
-                                                <option value="<%- cClass.value %>"><%- cClass.name %></option>
+                                        <% for (const cc of changeClass) { %>
+                                            <% if (cc.value === change.class) { %>
+                                                <option value="<%- cc.value %>"><%- cc.new_name ? cc.new_name : cc.name %></option>
                                             <% } %>
                                         <% } %>
                                     </select>
@@ -488,7 +488,7 @@
         expr: JSON.parse(unescape('<%- escape(JSON.stringify(change.expr ? ctx.helper.replaceRntoBr(change.expr) : '')) %>')),
         memo: JSON.parse(unescape('<%- escape(JSON.stringify(change.memo ? ctx.helper.replaceRntoBr(change.memo) : '')) %>')),
         type: '<%- change.type %>',
-        class: '<%- change.class %>',
+        class: '<%- ctx.helper._.find(changeClass, { value: change.class }).checked ? change.class : changeClass[0].value %>',// 防止下拉不存在导致数据丢失上报问题
         quality: '<%- change.quality %>',
         company: JSON.parse(unescape('<%- escape(JSON.stringify((change.company ? change.company : (companyList && companyList[0] ? companyList[0].name : '')))) %>')),
         charge: '<%- change.charge %>',
@@ -497,6 +497,7 @@
     let changeInfo = Object.assign({}, back_changeInfo);
     let changeUsedData = JSON.parse(unescape('<%- escape(JSON.stringify(changeUsedData)) %>'));
     let changeOrder = parseInt('<%- change.order_by %>');
+    console.log(changeInfo);
     console.log(changeUsedData);
 </script>
 <script src="/public/js/change_information_set.js?202206211"></script>

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

@@ -82,7 +82,17 @@
                             </tr>
                             <tr>
                                 <th width="" class="text-center" style="vertical-align: middle">工程变更类别</th>
-                                <td><input class="form-control form-control-sm" type="text" value="<%- change.class %>" data-name="class" <% if (change.readOnly) { %>readonly<% } %> placeholder=""></td>
+                                <% if (change.readOnly) { %>
+                                    <td><input class="form-control form-control-sm" type="text" value="<%- change.class %>" data-name="class" readonly placeholder=""></td>
+                                <% } else { %>
+                                    <td><select class="form-control form-control-sm" name="class" data-name="class" <% if (change.readOnly) { %>readonly<% } %>>
+                                            <% for (const cc of changeClass) { %>
+                                                <% if (cc.checked) { %>
+                                                    <option <% if (cc.name === change.class || cc.new_name === change.class) { %> selected<% } %>><%- cc.new_name ? cc.new_name : cc.name %></option>
+                                                <% } %>
+                                            <% } %>
+                                        </select></td>
+                                <% } %>
                                 <th width="" class="text-center" style="vertical-align: middle">工程变更性质</th>
                                 <% if (change.readOnly) { %>
                                     <td><input class="form-control form-control-sm" type="text" value="<%- change.quality %>" data-name="quality" readonly placeholder=""></td>

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

@@ -66,7 +66,17 @@
                         </tr>
                         <tr>
                             <th width="140" class="text-center" style="vertical-align: middle">工程变更类别</th>
-                            <td><input class="form-control form-control-sm" type="text" value="<%- change.class %>" data-name="class" <% if (change.readOnly) { %>readonly<% } %> placeholder=""></td>
+                            <% if (change.readOnly) { %>
+                                <td><input class="form-control form-control-sm" type="text" value="<%- change.class %>" data-name="class" readonly placeholder=""></td>
+                            <% } else { %>
+                                <td><select class="form-control form-control-sm" name="class" data-name="class" <% if (change.readOnly) { %>readonly<% } %>>
+                                        <% for (const cc of changeClass) { %>
+                                        <% if (cc.checked) { %>
+                                            <option <% if (cc.name === change.class || cc.new_name === change.class) { %> selected<% } %>><%- cc.new_name ? cc.new_name : cc.name %></option>
+                                        <% } %>
+                                        <% } %>
+                                    </select></td>
+                            <% } %>
                             <th width="140" class="text-center" style="vertical-align: middle">工程变更性质</th>
                             <% if (change.readOnly) { %>
                             <td><input class="form-control form-control-sm" type="text" value="<%- change.quality %>" data-name="quality" readonly placeholder=""></td>

+ 97 - 3
app/view/setting/fun.ejs

@@ -143,10 +143,13 @@
                             </div>
                         </div>
                         <div class="row">
-                            <div class="col-5">
+                            <div class="col-6">
                                 <div class="card mb-3">
                                     <div class="card-body">
                                         <h5 class="card-title">工程变更</h5>
+                                        <div class="alert alert-dark py-1 px-2 mb-2" role="alert">
+                                            页面显示
+                                        </div>
                                         <div class="form-group mb-1">
                                             <div class="form-check form-check-inline">
                                                 <input class="form-check-input" type="checkbox" id="openChangeProject" <% if(ctx.session.sessionProject.page_show.openChangeProject) { %>checked<% } %> onchange="updateSetting(1);">
@@ -165,10 +168,17 @@
                                                 <label class="form-check-label" for="openChangePlan">显示「变更方案」页面</label>
                                             </div>
                                         </div>
+                                        <div class="alert alert-dark py-1 px-2 mb-2" role="alert">
+                                            功能设置
+                                        </div>
+                                        <div class="my-2">
+                                            自定义变更类别
+                                            <a class="pull-right mr-3" href="#bgclass" data-toggle="modal" data-target="#bgclass">设置</a>
+                                        </div>
                                     </div>
                                 </div>
                             </div>
-                            <div class="col-7">
+                            <div class="col-6">
                                 <div class="card mb-3">
                                     <div class="card-body">
                                         <h5 class="card-title">材料调差</h5>
@@ -226,10 +236,44 @@
 </div>
 <script src="/public/js/setting.js"></script>
 <script>
+    let changeClass = JSON.parse(unescape('<%- escape(JSON.stringify(funSet.change_class)) %>'));
     $(() => {
         autoFlashHeight();
+        // 自定义变更类别
+        $('body').on('click', '#change_class_div input[type="checkbox"]', function () {
+            if ($(this).is(':checked')) {
+                $(this).parents('.input-group-prepend').siblings('input').removeAttr('readonly');
+            } else {
+                $(this).parents('.input-group-prepend').siblings('input').attr('readonly', true).val('');
+            }
+        });
+        $('body').on('change', '#change_class_div input[type="text"]', function () {
+            if ($(this).val().length > 8) {
+                toastr.error('类别名称不能超过8个字符');
+            }
+        });
+
+        $("#bgclass").on('show.bs.modal', function () {
+            let html = '';
+            for (const cc of changeClass) {
+                html += `<div class="input-group input-group-sm mb-1">
+                    <div class="input-group-prepend">
+                        <div class="input-group-text">
+                            <input type="checkbox" value="${cc.value}" aria-label="Checkbox for following text input" ${cc.checked ? 'checked' : ''}>
+                        </div>
+                        <span class="input-group-text">${cc.name}</span>
+                    </div>
+                    <input type="text" class="form-control" value="${cc.new_name}" ${!cc.checked ? 'readonly' : ''} aria-label="Text input with checkbox" placeholder="">
+                </div>`;
+            }
+            $('#change_class_div').html(html);
+        });
+
+        $('#set_change_class_btn').click(function () {
+            updateSetting(false, 1);
+        });
     });
-    const updateSetting = function (tab = false) {
+    const updateSetting = function (tab = false, setChangeClass = false) {
         if (!$('#openChangeApply')[0].checked && $('#openChangeProject')[0].checked && tab === 1) {
             $('#openChangeApply').prop('checked', true);
             $('#openChangePlan').prop('checked', true);
@@ -296,6 +340,50 @@
             $('#end_month').removeAttr('disabled');
             $('#end_day').removeAttr('disabled');
         }
+        if (setChangeClass) {
+            const change_class = [];
+            let flag = false;
+            let allUnchecked = true;
+            $('#change_class_div .input-group').each(function () {
+                const one_class = _.find(changeClass, { value: parseInt($(this).find('input[type="checkbox"]').val())});
+                if ($(this).find('input[type="checkbox"]').is(':checked') && $(this).find('input[type="text"]').val().length > 8) {
+                    toastr.error(one_class.name + ' 类别名称字符不能超过8个');
+                    flag = true;
+                }
+                const new_name = $(this).find('input[type="checkbox"]').is(':checked') ? $(this).find('input[type="text"]').val() : '';
+                if (new_name) {
+                    const classInfo = _.find(changeClass, function(item) {
+                        return item.name === new_name && item.value !== one_class.value;
+                    })
+                    if (classInfo) {
+                        toastr.error(one_class.name + '的类别名称不能与其他变更名称相同');
+                        flag = true;
+                    }
+                    if (_.findIndex(change_class, { new_name }) !== -1) {
+                        toastr.error(one_class.name + '的类别名称不能与其他类别名称相同');
+                        flag = true;
+                    }
+                }
+                if ($(this).find('input[type="checkbox"]').is(':checked')) {
+                    allUnchecked = false;
+                }
+                const one_updateClass = {
+                    value: one_class.value,
+                    name: one_class.name,
+                    new_name,
+                    checked: $(this).find('input[type="checkbox"]').is(':checked'),
+                }
+                change_class.push(one_updateClass);
+            });
+            if (flag) {
+                return;
+            }
+            if (allUnchecked) {
+                toastr.error('至少保留一个变更类别');
+                return;
+            }
+            pushData.change_class = change_class;
+        }
         postData('/setting/fun/update', {
             imType: parseInt($('[name=im_type]:checked').val()),
             banOver: $('[name=ban_over]')[0].checked,
@@ -313,6 +401,12 @@
             openMaterialEditForAudit: $('#openMaterialEditForAudit')[0].checked,
             openStageStart: $('#openStageStart')[0].checked,
             addFunSet: _.size(pushData) !== 0 ? pushData : null,
+        }, function (result) {
+            if (setChangeClass) {
+                changeClass = pushData.change_class;
+                toastr.success('设置成功');
+                $('#bgclass').modal('hide');
+            }
         });
     }
 </script>

+ 30 - 0
app/view/setting/fun_modal.ejs

@@ -0,0 +1,30 @@
+<!--设置z自定义变更类别-->
+<div class="modal fade" id="bgclass" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">自定义变更类别</h5>
+            </div>
+            <div class="modal-body">
+                <div class="alert alert-warning">设置后,工程变更-变更类别仅显示显示勾选的类别。</div>
+                <div id="change_class_div">
+                    <% for (const cc of funSet.change_class) { %>
+                        <div class="input-group input-group-sm mb-1">
+                            <div class="input-group-prepend">
+                                <div class="input-group-text">
+                                    <input type="checkbox" value="<%- cc.value %>" aria-label="Checkbox for following text input" <% if (cc.checked) { %>checked<% } %>>
+                                </div>
+                                <span class="input-group-text"><%- cc.name %></span>
+                            </div>
+                            <input type="text" class="form-control" value="<%- cc.new_name %>" <% if (!cc.checked) { %>readonly<% } %> aria-label="Text input with checkbox" placeholder="">
+                        </div>
+                    <% } %>
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">关闭</button>
+                    <button type="button" class="btn btn-sm btn-primary" id="set_change_class_btn">确认</button>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>