ソースを参照

Merge branch 'master' of http://192.168.1.41:3000/maixinrong/Calculation

MaiXinRong 5 年 前
コミット
26cb22743d

+ 3 - 0
app/const/audit.js

@@ -207,6 +207,7 @@ const auditStatus = {
     // checkNo: 4,     // 审批终止
     back: 5,       // 退回到原报人重新上报
     backnew: 6,    // 退回到上一个审批人
+    checkAgain: 7,    // 重新审批
 };
 
 const auditStatusString = [];
@@ -216,6 +217,7 @@ auditStatusString[auditStatus.checked] = '审批通过';
 // auditStatusString[auditStatus.checkNo] = '审批终止';
 auditStatusString[auditStatus.back] = '退回';
 auditStatusString[auditStatus.backnew] = '审批退回';
+auditStatusString[auditStatus.checkAgain] = '重新审批';
 
 const auditStatusClass = [];
 auditStatusClass[auditStatus.uncheck] = '';
@@ -224,6 +226,7 @@ auditStatusClass[auditStatus.checked] = 'text-success';
 // auditStatusClass[auditStatus.checkNo] = 'text-danger';
 auditStatusClass[auditStatus.back] = 'text-warning';
 auditStatusClass[auditStatus.backnew] = 'text-warning';
+auditStatusClass[auditStatus.checkAgain] = 'text-warning';
 
 /* ------------------------------------------------------- */
 

+ 26 - 0
app/controller/change_controller.js

@@ -689,6 +689,32 @@ module.exports = app => {
                 ctx.redirect(ctx.request.header.referer);
             }
         }
+
+        /**
+         * 变更令重新审批
+         * @param {Object} ctx - egg全局变量
+         * @return {void}
+         */
+        async checkAgain(ctx) {
+            try {
+                const changeData = await ctx.service.change.getDataByCondition({ cid: ctx.request.body.cid });
+                if (!changeData) {
+                    throw '变更令数据错误';
+                }
+                if (changeData.status !== audit.flow.status.checked || ctx.session.sessionUser.accountId !== changeData.uid) {
+                    throw '您无权进行该操作';
+                }
+                // 重新审批
+                const result = await ctx.service.change.checkAgain(changeData.cid);
+                if (!result) {
+                    throw '重新审批失败';
+                }
+                ctx.redirect('/tender/' + changeData.tid + '/change/' + changeData.cid + '/info');
+            } catch (err) {
+                console.log(err);
+                ctx.redirect(ctx.request.header.referer);
+            }
+        }
     }
 
     return ChangeController;

+ 3 - 2
app/public/js/change_calculation.js

@@ -122,8 +122,9 @@ Number.prototype.sub = function (arg){
 function roundnum(val,decimals){
     if(val !== ''){
         val = parseFloat(val);
+        let _sign = (val < 0) ? -1 : 1;
         if(decimals < 1){
-            val = (Math.round(val)).toString();
+            val = (Math.round(val*_sign)/_sign).toString();
         }else{
             let num = val.toString();
             if(num.lastIndexOf('.') == -1){
@@ -136,7 +137,7 @@ function roundnum(val,decimals){
                     // num += makezero(parseInt(decimals)-parseInt(valdecimals));
                     val = num;
                 }else if(parseInt(valdecimals) > parseInt(decimals)){
-                    val = parseFloat(val) != 0 ? Math.round(val.mul(makemultiple(decimals))).div(makemultiple(decimals)) : makedecimalzero(decimals);
+                    val = parseFloat(val) != 0 ? Math.round(val.mul(makemultiple(decimals)*_sign)).div(makemultiple(decimals)*_sign) : makedecimalzero(decimals);
                     let num = val.toString();
                     if(num.lastIndexOf('.') == -1){
                         // num += '.';

+ 1 - 1
app/router.js

@@ -190,7 +190,6 @@ module.exports = app => {
     app.post('/tender/:id/change/newCode', sessionAuth, tenderCheck, 'changeController.newCode');
     app.post('/tender/:id/change/add', sessionAuth, tenderCheck, 'changeController.add');
     app.get('/tender/:id/change/:cid/info', sessionAuth, tenderCheck, 'changeController.info');
-    app.get('/tender/:id/change/:cid/info', sessionAuth, tenderCheck, 'changeController.info');
     app.post('/change/upload/file', sessionAuth, 'changeController.uploadFile');
     app.get('/change/download/file/:id', sessionAuth, 'changeController.downloadFile');
     app.post('/change/delete/file', sessionAuth, 'changeController.deleteFile');
@@ -199,6 +198,7 @@ module.exports = app => {
     app.post('/change/save', sessionAuth, 'changeController.save');
 
     app.post('/change/approval', sessionAuth, 'changeController.approval');
+    app.post('/change/check/again', sessionAuth, 'changeController.checkAgain');
 
     // 变更单位管理
     app.post('/change/update/company', sessionAuth, 'changeController.updateCompany');

+ 110 - 14
app/service/change.js

@@ -295,7 +295,7 @@ module.exports = app => {
                 if (postData.changestatus !== undefined && parseInt(postData.changestatus) === 1) {
                     change_status = true;
                     // 更新原报人审批状态
-                    await this.transaction.update(this.ctx.service.changeAudit.tableName, { id: lastUser.id, status: 3, sin_time: new Date() });
+                    await this.transaction.update(this.ctx.service.changeAudit.tableName, { id: lastUser.id, status: audit.flow.auditStatus.checked, sin_time: new Date() });
                 }
                 // 再插入postData里的变更审批人和清单
                 if (postData.changeaudit !== undefined && postData.changeaudit !== '') {
@@ -305,7 +305,7 @@ module.exports = app => {
                     let uSort = parseInt(lastUser.usort) + 1;
                     for (const [index, ca] of changeAudit.entries()) {
                         const auditInfo = ca.split('/%/');
-                        const uStatus = change_status && index === 0 ? 2 : 1;
+                        const uStatus = change_status && index === 0 ? audit.flow.auditStatus.checking : audit.flow.auditStatus.uncheck;
                         const sin_time = change_status && index === 0 ? new Date() : null;
                         const caArray = {
                             tid: tenderId,
@@ -397,7 +397,7 @@ module.exports = app => {
                     },
                 };
                 if (change_status) {
-                    cArray.status = 2;
+                    cArray.status = audit.flow.status.checking;
                     cArray.cin_time = Date.parse(new Date()) / 1000;
                 }
                 await this.transaction.update(this.tableName, cArray, options);
@@ -425,12 +425,12 @@ module.exports = app => {
                 const audit_update = {
                     id: postData.audit_id,
                     sdesc: postData.sdesc,
-                    status: 3,
+                    status: audit.flow.auditStatus.checked,
                     sin_time: new Date(),
                 };
                 const change_update = {
                     w_code: postData.w_code,
-                    status: 2,
+                    status: audit.flow.status.checking,
                     cin_time: Date.parse(new Date()) / 1000,
                 };
                 await this.transaction.update(this.ctx.service.changeAudit.tableName, audit_update);
@@ -458,7 +458,7 @@ module.exports = app => {
                 }
                 if (postData.audit_next_id === undefined) {
                     // 变更令审批完成
-                    change_update.status = 3;
+                    change_update.status = audit.flow.status.checked;
                     change_update.p_code = postData.p_code;
                     change_update.sin_time = Date.parse(new Date()) / 1000;
                     change_update.total_price = total_price;
@@ -477,7 +477,7 @@ module.exports = app => {
                     // 设置下一个审批人为审批状态
                     const nextAudit_update = {
                         id: postData.audit_next_id,
-                        status: 2,
+                        status: audit.flow.auditStatus.checking,
                     };
                     await this.transaction.update(this.ctx.service.changeAudit.tableName, nextAudit_update);
 
@@ -563,7 +563,7 @@ module.exports = app => {
                 const audit_update = {
                     id: postData.audit_id,
                     sdesc: postData.sdesc,
-                    status: 5,
+                    status: audit.flow.auditStatus.back,
                     sin_time: new Date(),
                 };
                 await this.transaction.update(this.ctx.service.changeAudit.tableName, audit_update);
@@ -585,7 +585,7 @@ module.exports = app => {
                         times: newTimes,
                         usite: al.usite,
                         usort,
-                        status: al.usite !== 0 ? 1 : 2,
+                        status: al.usite !== 0 ? audit.flow.auditStatus.uncheck : audit.flow.auditStatus.checking,
                     };
                     insert_audit_array.push(insert_audit);
                     usort++;
@@ -594,7 +594,7 @@ module.exports = app => {
                 // 设置变更令退回
                 const change_update = {
                     w_code: postData.w_code,
-                    status: 5,
+                    status: audit.flow.status.back,
                     times: newTimes,
                     cin_time: Date.parse(new Date()) / 1000,
                 };
@@ -640,7 +640,7 @@ module.exports = app => {
                 const audit_update = {
                     id: postData.audit_id,
                     sdesc: postData.sdesc,
-                    status: 6,
+                    status: audit.flow.auditStatus.backnew,
                     sin_time: new Date(),
                 };
                 await this.transaction.update(this.ctx.service.changeAudit.tableName, audit_update);
@@ -666,7 +666,7 @@ module.exports = app => {
                     times: lastauditInfo.times,
                     usite: lastauditInfo.usite,
                     usort,
-                    status: 2,
+                    status: audit.flow.auditStatus.checking,
                 };
                 await this.transaction.insert(this.ctx.service.changeAudit.tableName, insert_audit1);
                 usort++;
@@ -681,7 +681,7 @@ module.exports = app => {
                     times: auditInfo.times,
                     usite: auditInfo.usite,
                     usort,
-                    status: 1,
+                    status: audit.flow.auditStatus.uncheck,
                 };
                 await this.transaction.insert(this.ctx.service.changeAudit.tableName, insert_audit2);
 
@@ -709,7 +709,7 @@ module.exports = app => {
                 // 设置变更令退回
                 const change_update = {
                     w_code: postData.w_code,
-                    status: 6,
+                    status: audit.flow.status.backnew,
                     cin_time: Date.parse(new Date()) / 1000,
                 };
                 const options = {
@@ -858,6 +858,102 @@ module.exports = app => {
             }
             return result;
         }
+
+        /**
+         * 重新审批变更令
+         * @param { string } cid - 查询的清单
+         * @return {Promise<*>} - 可用的变更令列表
+         */
+        async checkAgain(cid) {
+            // 初始化事务
+            this.transaction = await this.db.beginTransaction();
+            let result = false;
+            try {
+                const changeInfo = await this.getDataByCondition({ cid });
+
+                // 获取终审
+                const auditInfo = (await this.ctx.service.changeAudit.getAllDataByCondition({ where: { cid }, orders: [['usort', 'desc']], limit: 1, offset: 0 }))[0];
+                let usort = auditInfo.usort + 1;
+
+                // 新增2个审批状态到审批列表中
+                const insert_audit1 = {
+                    tid: auditInfo.tid,
+                    cid: auditInfo.cid,
+                    uid: auditInfo.uid,
+                    name: auditInfo.name,
+                    jobs: auditInfo.jobs,
+                    company: auditInfo.company,
+                    times: auditInfo.times,
+                    usite: auditInfo.usite,
+                    usort,
+                    sin_time: new Date(),
+                    status: audit.flow.auditStatus.checkAgain,
+                };
+                await this.transaction.insert(this.ctx.service.changeAudit.tableName, insert_audit1);
+                usort++;
+                // 新增2个审批人到审批列表中
+                const insert_audit2 = {
+                    tid: auditInfo.tid,
+                    cid: auditInfo.cid,
+                    uid: auditInfo.uid,
+                    name: auditInfo.name,
+                    jobs: auditInfo.jobs,
+                    company: auditInfo.company,
+                    times: auditInfo.times,
+                    usite: auditInfo.usite,
+                    usort,
+                    status: audit.flow.auditStatus.checking,
+                };
+                await this.transaction.insert(this.ctx.service.changeAudit.tableName, insert_audit2);
+
+                // 审批列表数据也要回退
+                let total_price = 0;
+                const changeList = await this.ctx.service.changeAuditList.getAllDataByCondition({ where: { cid: changeInfo.cid } });
+                for (const cl of changeList) {
+                    const audit_amount = cl.audit_amount.split(',');
+                    audit_amount.splice(-1, 1);
+                    const list_update = {
+                        id: cl.id,
+                        audit_amount: audit_amount.join(','),
+                        samount: '',
+                    };
+                    total_price += this.ctx.helper.accMul(cl.unit_price, cl.camount);
+                    await this.transaction.update(this.ctx.service.changeAuditList.tableName, list_update);
+                }
+
+                // 设置变更令审批中
+                const change_update = {
+                    p_code: null,
+                    status: audit.flow.status.checking,
+                    cin_time: Date.parse(new Date()) / 1000,
+                    sin_time: null,
+                    total_price,
+                };
+                const options = {
+                    where: {
+                        cid: changeInfo.cid,
+                    },
+                };
+                await this.transaction.update(this.tableName, change_update, options);
+                await this.transaction.commit();
+                result = true;
+
+                // 添加短信通知-需要审批提醒功能
+                const smsUser = await this.ctx.service.projectAccount.getDataById(auditInfo.uid);
+                if (smsUser.auth_mobile !== undefined && smsUser.sms_type !== '') {
+                    const smsType = JSON.parse(smsUser.sms_type);
+                    if (smsType[smsTypeConst.const.BG] !== undefined && smsType[smsTypeConst.const.BG].indexOf(smsTypeConst.judge.approval.toString()) !== -1) {
+                        const sms = new SMS(this.ctx);
+                        const content = '【纵横计量支付】' + changeInfo.code + '变更需要您审批。';
+                        sms.send(smsUser.auth_mobile, content);
+                    }
+                }
+            } catch (error) {
+                await this.transaction.rollback();
+                result = false;
+            }
+            return result;
+        }
     }
     return Change;
 };

+ 4 - 0
app/view/change/info.ejs

@@ -107,6 +107,10 @@
             <% } else if (auditStatus === 7) { %>
                 <a href="#sp-list" data-toggle="modal" data-target="#sp-list" class="btn btn-outline-secondary btn-sm btn-block">审批中</a>
             <% } %>
+            <% if (auditStatus === 4 && ctx.session.sessionUser.accountId === change.uid) { %>
+                <!--重新审批-->
+                <a href="javascript: void(0);" data-toggle="modal" data-target="#sp-down-back" class="btn btn-warning btn-sm btn-block">重新审批</a>
+            <% } %>
         </div>
     </div>
 </div>

+ 25 - 0
app/view/change/info_modal.ejs

@@ -370,6 +370,8 @@
                                     <span class="text-danger pull-right">审批终止</span>
                                     <% } else if (al.usite !== 0 && (al.status === 5 || al.status === 6)) { %>
                                     <span class="text-warning pull-right">审批退回 <% if (al.status === 5) {%><%= auditList3[time][0].name %><% } %></span>
+                                    <% } else if (al.usite !== 0 && al.status === 7) { %>
+                                        <span class="text-warning pull-right">重新审批</span>
                                     <% } %>
                                     <h5 class="card-title">
                                         <% if (al.usite === 0 && al.status === 2 ) { %>
@@ -384,6 +386,8 @@
                                         <i class="fa <% if (aindex+1 === auditList3[time].length) { %>fa-stop-circle<% } else { %>fa-chevron-circle-down<% } %> text-danger"></i>
                                         <% } else if (al.status === 5 || al.status === 6) { %>
                                         <i class="fa <% if (aindex+1 === auditList3[time].length) { %>fa-stop-circle<% } else { %>fa-chevron-circle-down<% } %> text-warning"></i>
+                                        <% } else if (al.status === 7) { %>
+                                        <i class="fa fa-chevron-circle-down text-warning"></i>
                                         <% } %>
                                         <%= al.name %>&nbsp;<small class="text-muted"><%= al.jobs %></small>
                                     </h5>
@@ -585,3 +589,24 @@
         </div>
     </div>
 </div>
+<% if (auditStatus === 4 && ctx.session.sessionUser.accountId === change.uid) { %>
+<!--重新审批-->
+<div class="modal fade" id="sp-down-back" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <form class="modal-content" method="post" action="/change/check/again">
+            <div class="modal-header">
+                <h5 class="modal-title">重新审批</h5>
+            </div>
+            <div class="modal-body">
+                <h5>确认由「终审-<%= auditList[auditList.length-1].name %>」重新审批「<%= change.code %>」?</h5>
+            </div>
+            <div class="modal-footer">
+                <input type="hidden" name="cid" value="<%= change.cid %>">
+                <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-warning">确定重审</button>
+            </div>
+        </form>
+    </div>
+</div>
+<% } %>