Browse Source

feat: 新增weapp计量相关接口,优化标段审核逻辑

caipin 1 month ago
parent
commit
99474bed7b

+ 154 - 0
app/controller/weapp_measure_controller.js

@@ -0,0 +1,154 @@
+'use strict';
+
+const audit = require('../const/audit');
+
+module.exports = app => {
+    class WeappMeasureController extends app.BaseController {
+        async stage(ctx) {
+            try {
+                const tenderId = ctx.params.id;
+                const tender = await this.ctx.service.tender.getDataById(tenderId);
+                if (!tender) {
+                    ctx.body = { code: -1, msg: '标段不存在', data: null };
+                    return;
+                }
+                const renderData = {
+                    tender: tender.data
+                };
+
+                tender.info = await ctx.service.tenderInfo.getTenderInfo(tenderId);
+                ctx.tender = tender;
+                if (!ctx.tender.isTourist) {
+                    ctx.tender.isTourist = false; // 设置默认值
+                }
+
+                renderData.stages = await ctx.service.stage.getValidStages(tenderId, this.ctx.session.sessionUser.is_admin);
+                for (const s of renderData.stages) {
+                    if (!s.final_auditor_str || s.status !== audit.stage.status.checked) {
+                        if (s.status === audit.stage.status.checkNoPre) s.status = audit.stage.status.checking;
+                        if (s.status !== audit.stage.status.checkNo) s.curAuditors = await ctx.service.stageAudit.getAuditorsByStatus(s.id, s.status, s.times);
+                        if (s.status === audit.stage.status.checked) {
+                            const final_auditor_str = (s.curAuditors[0].audit_type === audit.auditType.key.common)
+                                ? `${s.curAuditors[0].name}${(s.curAuditors[0].role ? '-' + s.curAuditors[0].role : '')}`
+                                : ctx.helper.transFormToChinese(s.curAuditors[0].audit_order) + '审';
+                            await ctx.service.stage.defaultUpdate({ id: s.id, final_auditor_str });
+                        }
+                    }
+                }
+                renderData.unCompleteStageCount = renderData.stages.filter(s => {
+                    return s.status !== audit.stage.status.checked;
+                }).length;
+                ctx.body = { code: 0, msg: '', data: renderData };
+
+            } catch (err) {
+                this.log(err);
+                ctx.body = { code: 1, msg: err.toString(), data: null };
+            }
+        }
+
+        async detail(ctx) {
+            try {
+                const stageId = ctx.params.stageId;
+                const stage = await ctx.service.stage.getDataById(stageId);
+
+                if (!stage) {
+                    ctx.body = { code: -1, msg: '计量期不存在', data: null };
+                    return;
+                }
+                const tender = await ctx.service.tender.getDataById(stage.tid);
+                if (!tender) {
+                    ctx.body = { code: -1, msg: '标段不存在', data: null };
+                    return;
+                }
+                ctx.tender = tender;
+                if (!ctx.tender.isTourist) {
+                    ctx.tender.isTourist = false;
+                }
+
+                await ctx.service.stage.loadStageUser(stage);
+                await ctx.service.stage.loadStageAuditViewData(stage);
+
+                if (!stage.final_auditor_str || stage.status !== audit.stage.status.checked) {
+                    if (stage.status === audit.stage.status.checkNoPre) {
+                        stage.status = audit.stage.status.checking;
+                    }
+                    if (stage.status !== audit.stage.status.checkNo) {
+                        stage.curAuditors = await ctx.service.stageAudit.getAuditorsByStatus(stage.id, stage.status, stage.times);
+                    }
+                    if (stage.status === audit.stage.status.checked) {
+                        const final_auditor_str = (stage.curAuditors[0].audit_type === audit.auditType.key.common)
+                            ? `${stage.curAuditors[0].name}${(stage.curAuditors[0].role ? '-' + stage.curAuditors[0].role : '')}`
+                            : ctx.helper.transFormToChinese(stage.curAuditors[0].audit_order) + '审';
+                        await ctx.service.stage.defaultUpdate({ id: stage.id, final_auditor_str });
+                    }
+                }
+
+                stage.tp = ctx.helper.sum([stage.contract_tp, stage.qc_tp, stage.pc_tp]);
+                stage.pre_tp = ctx.helper.add(stage.pre_contract_tp, stage.pre_qc_tp);
+                stage.end_tp = ctx.helper.add(stage.pre_tp, stage.tp);
+
+                ctx.body = { code: 0, msg: '', data: stage };
+
+            } catch (err) {
+                this.log(err);
+                ctx.body = { code: -1, msg: err.toString(), data: null };
+            }
+        }
+
+        async checkAudit(ctx) {
+            try {
+                const stageId = ctx.params.stageId;
+                const stage = await ctx.service.stage.getDataById(stageId);
+
+                if (!stage) {
+                    ctx.body = { code: -1, msg: '计量期不存在', data: null };
+                    return;
+                }
+
+                ctx.stage = stage;
+                await ctx.service.stage.loadStageUser(stage);
+                await ctx.service.stage.loadPreCheckedStage(stage);
+                await ctx.service.stage.doCheckStage(stage);
+                await ctx.service.stage.loadStageAuditViewData(stage);
+
+                if (ctx.stage.readOnly) {
+                    ctx.body = { code: -1, msg: '该计量期当前您无权操作', data: null };
+                    return;
+                }
+                if (ctx.stage.revising) {
+                    ctx.body = { code: -1, msg: '台账修订中,请勿修改提交期数据', data: null };
+                    return;
+                }
+                if (ctx.stage.assist && ctx.stage.assist.confirm) {
+                    ctx.body = { code: -1, msg: '协同数据已确认,如需修改,请撤销上报或重新审批', data: null };
+                    return;
+                }
+                if (ctx.stage.status !== audit.stage.status.checking && ctx.stage.status !== audit.stage.status.checkNoPre) {
+                    ctx.body = { code: -1, msg: '当前期数据有误', data: null };
+                    return;
+                }
+                if (ctx.stage.curAuditorIds && ctx.stage.curAuditorIds.indexOf(ctx.session.sessionUser.accountId) < 0) {
+                    ctx.body = { code: -1, msg: '您无权进行该操作', data: null };
+                    return;
+                }
+
+                const data = ctx.request.body;
+                data.checkType = parseInt(data.checkType);
+
+                if (!data.checkType || isNaN(data.checkType)) {
+                    ctx.body = { code: -1, msg: '提交数据错误', data: null };
+                    return;
+                }
+                await ctx.service.stageAudit.check(ctx.stage.id, data, ctx.stage.times);
+                ctx.body = { code: 0, msg: '审批成功', data: null };
+            } catch (err) {
+                this.log(err);
+                ctx.body = { code: -1, msg: err.toString() || '提交失败', data: null };
+                ctx.session.postError = err.toString();
+            }
+        }
+
+    }
+
+    return WeappMeasureController;
+};

+ 1 - 1
app/middleware/weapp_tender_check.js

@@ -6,7 +6,7 @@ const buildStatus = require('../const/tender').buildStatus;
 module.exports = options => {
     return async function weappTenderCheck(ctx, next) {
         try {
-            const tenderId = ctx.request.body.tenderId || ctx.request.query.tenderId;
+            const tenderId = ctx.request.body.tenderId || ctx.request.query.tenderId || ctx.params.tenderId;
             const accountId = ctx.session.sessionUser.accountId;
             // 读取标段数据
             const tender = { id: tenderId };

+ 4 - 0
app/router.js

@@ -1249,8 +1249,12 @@ module.exports = app => {
     app.post('/wx/weapp/attention/unfollow', weappAuth, 'weappAttentionController.unfollow');
     app.get('/wx/weapp/attention/list', weappAuth, 'weappAttentionController.followedList');
     app.get('/wx/weapp/attention/check', weappAuth, 'weappAttentionController.checkFollowing');
+    app.get('/wx/weapp/tender/:id/revise', weappAuth, 'weappReviseController.index');
     app.get('/wx/weapp/tender/detail', weappAuth, weappTenderCheck, 'weappTenderController.detail');
     app.get('/wx/weapp/tender/list/manage', weappAuth, 'weappTenderController.listManage');
+    app.get('/wx/weapp/tender/:id/measure/stage', weappAuth, 'weappMeasureController.stage');
+    app.get('/wx/weapp/tender/measure/stage/:stageId', weappAuth, 'weappMeasureController.detail');
+    app.post('/wx/weapp/tender/:tenderId/measure/stage/:stageId/audit/check', weappAuth, weappTenderCheck, 'weappMeasureController.checkAudit');
     app.get('/wx/weapp/advance/list', weappAuth, weappTenderCheck, 'weappTenderController.advanceList');
     app.get('/wx/weapp/advance/detail', weappAuth, weappTenderCheck, 'weappTenderController.advanceDetail');
     app.get('/wx/weapp/revise/detail', weappAuth, weappTenderCheck, 'weappTenderController.reviseDetail');

+ 12 - 0
sql/update20260403.sql

@@ -400,6 +400,18 @@ CREATE TABLE `zh_ledger_template`  (
   PRIMARY KEY (`id`) USING BTREE
 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_unicode_ci ROW_FORMAT = Dynamic;
 
+CREATE TABLE `zh_weapp_attention`  (
+  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+  `project_account_id` int(10) NOT NULL DEFAULT 0 COMMENT '关注人/用户ID',
+  `tender_id` int(10) NOT NULL DEFAULT 0 COMMENT '关注的标段ID',
+  `status` tinyint(4) NOT NULL DEFAULT 1 COMMENT '关注状态(1:有效,0:取消)',
+  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '关注时间',
+  PRIMARY KEY (`id`) USING BTREE,
+  UNIQUE INDEX `uk_user_section`(`project_account_id`, `tender_id`) USING BTREE,
+  INDEX `idx_stage_id`(`tender_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '关注记录表' ROW_FORMAT = Dynamic;
+
+
 ------------------------------------
 -- 表数据
 ------------------------------------