Bläddra i källkod

feat: 新增weapp材料控制器及相关路由,优化材料审核逻辑

caipin 3 månader sedan
förälder
incheckning
d6b462b5c9
2 ändrade filer med 229 tillägg och 0 borttagningar
  1. 226 0
      app/controller/weapp_material_controller.js
  2. 3 0
      app/router.js

+ 226 - 0
app/controller/weapp_material_controller.js

@@ -0,0 +1,226 @@
+'use strict';
+
+const auditConst = require('../const/audit').material;
+const auditType = require('../const/audit').auditType;
+const materialConst = require('../const/material');
+
+module.exports = app => {
+    class WeappMaterialController extends app.BaseController {
+
+        async index(ctx) {
+            try {
+                if (!ctx.tender.info.isTourist) {
+                    ctx.tender.info.isTourist = false;
+                }
+
+                const subProject = await ctx.service.subProject.getDataById(ctx.tender.data.spid);
+                subProject.page_show = ctx.service.subProject.getPageShow(subProject.page_show);
+                if (!subProject.page_show.openMaterial) {
+                    ctx.body = { code: -1, msg: '该功能已关闭', data: null };
+                    return;
+                }
+
+                const materials = await ctx.service.material.getValidMaterials(ctx.tender.id);
+
+                for (const m of materials) {
+                    if (!m.final_auditor_str || m.status !== auditConst.status.checked) {
+                        m.curAuditors = await ctx.service.materialAudit.getAuditorsByStatus(m.id, m.status, m.times);
+                        if (m.status === auditConst.status.checked && m.curAuditors.length > 0) {
+                            const final_auditor_str = (m.curAuditors[0].audit_type === auditType.key.common)
+                                ? `${m.curAuditors[0].name}${(m.curAuditors[0].role ? '-' + m.curAuditors[0].role : '')}`
+                                : ctx.helper.transFormToChinese(m.curAuditors[0].audit_order) + '审';
+                            await ctx.service.material.defaultUpdate({ id: m.id, final_auditor_str });
+                        }
+                    }
+
+                    m.decimal = m.decimal ? JSON.parse(m.decimal) : materialConst.decimal;
+                    m.exponent_decimal = m.exponent_decimal ? JSON.parse(m.exponent_decimal) : materialConst.exponent_decimal;
+                }
+
+                const lastMaterial = materials.length > 0 ? materials[0] : null;
+                const openMaterialTax = subProject.page_show.openMaterialTax;
+
+                let allMaterialTax = true;
+                let actualOpenMaterialTax = openMaterialTax;
+                const materialTotalPrice = {
+                    m_tp: 0,
+                    tax_tp: 0,
+                    ex_tp: 0,
+                    ex_tax_tp: 0,
+                    m_tax_tp: 0,
+                };
+
+                for (const m of materials) {
+                    if (allMaterialTax && m.material_tax === 0) {
+                        allMaterialTax = false;
+                    }
+                    if (!openMaterialTax && m.material_tax === 1) {
+                        actualOpenMaterialTax = 1;
+                    }
+
+                    materialTotalPrice.m_tp = ctx.helper.add(materialTotalPrice.m_tp, ctx.helper.round(m.m_tp, m.decimal.tp));
+                    materialTotalPrice.tax_tp = !m.material_tax
+                        ? ctx.helper.add(materialTotalPrice.tax_tp, ctx.helper.round(ctx.helper.mul(m.m_tp, 1 + m.rate / 100), m.decimal.tp))
+                        : materialTotalPrice.tax_tp;
+                    materialTotalPrice.ex_tp = ctx.helper.add(materialTotalPrice.ex_tp, ctx.helper.round(m.ex_tp, m.decimal.tp));
+                    materialTotalPrice.ex_tax_tp = ctx.helper.add(materialTotalPrice.ex_tax_tp, ctx.helper.round(m.ex_tax_tp, m.exponent_decimal.tp));
+                    materialTotalPrice.m_tax_tp = m.material_tax
+                        ? ctx.helper.add(materialTotalPrice.m_tax_tp, ctx.helper.round(m.m_tax_tp, m.decimal.tp))
+                        : materialTotalPrice.m_tax_tp;
+                }
+
+                materialTotalPrice.total_tp = ctx.helper.add(materialTotalPrice.m_tp, materialTotalPrice.ex_tp);
+                materialTotalPrice.total_tax_tp = ctx.helper.add(materialTotalPrice.tax_tp, materialTotalPrice.ex_tax_tp);
+
+                const renderData = {
+                    tender: ctx.tender.data,
+                    materials,
+                    lastMaterial,
+                    openMaterialTax: actualOpenMaterialTax,
+                    allMaterialTax,
+                    materialTotalPrice,
+                };
+                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 materialId = ctx.params.mid;
+                const material = await ctx.service.material.getDataById(materialId);
+
+                if (!material) {
+                    ctx.body = { code: -1, msg: '材料调差期不存在', data: null };
+                    return;
+                }
+
+                if (!ctx.tender.isTourist) {
+                    ctx.tender.isTourist = false;
+                }
+
+                const subProject = await ctx.service.subProject.getDataById(ctx.tender.data.spid);
+                subProject.page_show = ctx.service.subProject.getPageShow(subProject.page_show);
+
+                const tenderMsg = await ctx.service.tender.getTender(ctx.tender.id, ['material_col_show']);
+                const materialColShow = tenderMsg.material_col_show 
+                    ? JSON.parse(tenderMsg.material_col_show) 
+                    : ctx.helper._.cloneDeep(require('../const/tender').materialColShow);
+
+                await ctx.service.material.loadMaterialUser(material);
+                await ctx.service.material.loadMaterialAuditViewData(material);
+
+                material.auditHistory = material.auditHistory && material.auditHistory.length && material.auditHistory[material.auditHistory.length - 1].reduce((prev, curr, idx) => {
+                    if (idx === 0) {
+                        const reportor = {
+                            audit_id: material.user.id,
+                            audit_order: 0,
+                            audit_type: 1,
+                            status: material.status === auditConst.status.uncheck ? auditConst.status.uncheck : auditConst.status.checked,
+                            times: material.status === auditConst.status.checkNo ? material.times - 1 : material.times,
+                            begin_time: curr.begin_time,
+                            end_time: curr.begin_time,
+                            name: material.user.name,
+                            company: material.user.company,
+                            role: material.user.role,
+                            mobile: '',
+                            opinion: '',
+                        };
+                        prev.push({
+                            name: '原报',
+                            status: reportor.status,
+                            audit_type: reportor.audit_type,
+                            auditors: [reportor],
+                        });
+                    }
+                    prev.push({
+                        name: curr.is_final ? '终审' : `${curr.audit_order}审`,
+                        audit_type: curr.audit_type,
+                        status: curr.status,
+                        auditors: curr.auditors,
+                    });
+                    return prev;
+                }, []);
+
+                material.decimal = material.decimal ? JSON.parse(material.decimal) : materialConst.decimal;
+                material.exponent_decimal = material.exponent_decimal ? JSON.parse(material.exponent_decimal) : materialConst.exponent_decimal;
+
+                const openMaterialTax = subProject.page_show.openMaterialTax;
+                let allMaterialTax = true;
+                let actualOpenMaterialTax = openMaterialTax;
+
+                if (allMaterialTax && material.material_tax === 0) {
+                    allMaterialTax = false;
+                }
+                if (!openMaterialTax && material.material_tax === 1) {
+                    actualOpenMaterialTax = 1;
+                }
+
+                material.rate_tp = material.material_tax 
+                    ? null 
+                    : ctx.helper.round(ctx.helper.mul(material.m_tp, 1 + material.rate / 100), material.decimal.tp);
+
+                material.openMaterialTax = actualOpenMaterialTax;
+                material.allMaterialTax = allMaterialTax;
+                material.materialColShow = materialColShow;
+
+                ctx.body = { code: 0, msg: '', data: material };
+
+            } catch (err) {
+                this.log(err);
+                ctx.body = { code: -1, msg: err.toString(), data: null };
+            }
+        }
+
+        async checkAudit(ctx) {
+            try {
+                const materialId = ctx.params.materialId;
+                const material = await ctx.service.material.getDataById(materialId);
+
+                if (!material) {
+                    ctx.body = { code: -1, msg: '材料调差期不存在', data: null };
+                    return;
+                }
+
+                ctx.material = material;
+                await ctx.service.material.loadMaterialUser(material);
+
+                if (ctx.material.readOnly) {
+                    ctx.body = { code: -1, msg: '该材料调差期当前您无权操作', data: null };
+                    return;
+                }
+
+                if (ctx.material.status !== auditConst.status.checking && ctx.material.status !== auditConst.status.checkNoPre) {
+                    ctx.body = { code: -1, msg: '当前期数据有误', data: null };
+                    return;
+                }
+
+                if (ctx.material.curAuditorIds && ctx.material.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.materialAudit.check(ctx.material.id, data, ctx.material.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 WeappMaterialController;
+};

+ 3 - 0
app/router.js

@@ -1265,4 +1265,7 @@ module.exports = app => {
     app.get('/wx/weapp/change/list', weappAuth, weappTenderCheck, 'weappTenderController.changeList');
     app.get('/wx/weapp/change/detail', weappAuth, weappTenderCheck, 'weappTenderController.changeDetail');
     app.post('/wx/weapp/change/audit', weappAuth, weappTenderCheck, 'weappTenderController.changeAudit');
+    app.get('/wx/weapp/tender/:tenderId/material', weappAuth, weappTenderCheck, 'weappMaterialController.index');
+    app.get('/wx/weapp/tender/:tenderId/material/:mid', weappAuth, weappTenderCheck, 'weappMaterialController.detail');
+    app.post('/wx/weapp/tender/:tenderId/material/:mid/audit/check', weappAuth, weappTenderCheck, 'weappMaterialController.checkAudit');
 };