'use strict'; /** * 过程结算 控制器 * * @author Mai * @date 2023/10/27 * @version */ const auditConst = require('../const/audit'); const shenpiConst = require('../const/shenpi'); const tenderConst = require('../const/tender'); const measureType = tenderConst.measureType; const spreadConst = require('../const/spread'); const spreadSetting = require('../lib/spread_setting'); module.exports = app => { class SettleController extends app.BaseController { /** * 构造函数 * * @param {Object} ctx - egg全局变量 * @return {void} */ constructor(ctx) { super(ctx); ctx.showProject = true; ctx.showTender = true; ctx.showTitle = true; } /** * 期列表(Get) * @param ctx * @return {Promise} */ async list(ctx) { try { const renderData = { tender: ctx.tender.data, preUrl: `/tender/${ctx.tender.id}/measure/stage`, auditConst: auditConst.settle, auditType: auditConst.auditType, }; renderData.jsFiles = this.app.jsFiles.common.concat(this.app.jsFiles.settle.list); renderData.settles = await ctx.service.settle.getValidSettles(ctx.tender.id); for (const s of renderData.settles) { if (s.status === auditConst.settle.status.uncheck) { s.curAuditors = []; } else if (s.status === auditConst.settle.status.checkNo) { s.curAuditors = await ctx.service.settleAudit.getAuditorsByStatus(sid, s.status, s.times - 1); } else { s.curAuditors = await ctx.service.settleAudit.getAuditorsByStatus(s.id, s.status, s.times); } if (s.status === auditConst.settle.status.checkNoPre) { s.curAuditorsPre = await ctx.service.stageAudit.getAuditorsByStatus(s.id, auditConst.settle.status.checking, s.times); } } renderData.checkedStageCount = await ctx.service.stage.count({ tid: ctx.tender.id, status: auditConst.stage.status.checked }); await this.layout('settle/list.ejs', renderData, 'settle/list_modal.ejs'); } catch (err) { ctx.log(err); ctx.redirect(this.menu.menu.dashboard.url); } } /** * 期审批流程(Get) * @param ctx * @return {Promise} */ async loadAuditors(ctx) { try { const order = JSON.parse(ctx.request.body.data).order; const tenderId = ctx.params.id; const settle = await ctx.service.settle.getDataByCondition({ tid: tenderId, settle_order: order }); await ctx.service.settle.loadRelaUser(settle); await ctx.service.settle.loadAuditViewData(settle); ctx.body = { err: 0, msg: '', data: settle }; } catch (error) { ctx.log(error); ctx.body = { err: 1, msg: error.toString(), data: null }; } } async add(ctx) { try { if (ctx.session.sessionUser.accountId !== ctx.tender.data.user_id) throw '您无权创建计量期'; const date = ctx.request.body.date; const period = ctx.request.body.period; if (!date || !period) throw '请选择结算年月和结算周期'; const newSettle = await ctx.service.settle.addSettle(ctx.tender.id, date, period); ctx.redirect('/tender/' + ctx.tender.id + '/settle/' + newSettle.settle_order); } catch (err) { ctx.log(err); ctx.postError(err, '新增结算期失败,请重试'); ctx.redirect('/tender/' + ctx.tender.id + '/settle'); } } async save(ctx) { try { const data = { order: ctx.request.body.order, date: ctx.request.body.date, period: ctx.request.body.period, }; const settle = await ctx.service.settle.getDataByCondition({ tid: ctx.tender.id, settle_order: data.order }); if (!settle) throw '修改的结算期不存在'; if (ctx.session.sessionUser.accountId !== stage.user_id) throw '您无权修改该数据'; await this.ctx.service.stage.saveSettle(ctx.tender.id, data.order, data.date, data.period); ctx.redirect('/tender/' + ctx.tender.id + '/settle'); } catch (err) { ctx.log(err); ctx.postError(err, '保存结算期数据失败,请重试'); ctx.redirect('/tender/' + ctx.tender.id + '/settle'); } } async delete(ctx) { try { if (ctx.request.body.confirm !== undefined && ctx.request.body.confirm !== '确认删除本期') { throw '请输入正确的文本信息'; } const sid = ctx.request.body.settle_id; const settle = await ctx.service.settle.getDataById(sid); const settleCount = await ctx.service.settle.count({ tid: ctx.tender.id }); if (!settle || settle.tid !== ctx.tender.id) throw '选择的结算期已不存在'; if (settleCount === settle.settle_order) throw '选择的结算期无法删除'; if (ctx.session.sessionUser.accountId !== settle.user_id && !ctx.session.sessionUser.is_admin) throw '您无权删除结算期'; await ctx.service.deleteSettle(sid); ctx.redirect('/tender/' + ctx.tender.id + '/settle/'); } catch (err) { ctx.log(err); ctx.postError(err, '删除结算期数据失败,请重试'); ctx.redirect('/tender/' + ctx.tender.id + '/settle/'); } } async _getDefaultRenderData(ctx) { const data = { tender: ctx.tender.data, auditConst: auditConst.settle, measureType, preUrl: '/tender/' + ctx.tender.id + '/settle/' + ctx.params.sorder, settle: ctx.settle, shenpiConst, auditType: auditConst.auditType, }; data.tenderMenu.back.children[0].url = '/tender/' + ctx.tender.id + '/measure/stage'; // 是否已验证手机短信 const pa = await ctx.service.projectAccount.getDataById(ctx.session.sessionUser.accountId); data.authMobile = pa.auth_mobile; const loadAccount = ctx.session.sessionUser.is_admin ? true : ctx.session.sessionUser.accountId === ctx.settle.user_id && ([auditConst.settle.status.uncheck, auditConst.settle.status.checkNo].indexOf(ctx.settle.audit_status) >= 0); if (!loadAccount) return data; // 获取所有项目参与者 const accountList = await ctx.service.projectAccount.getAllDataByCondition({ where: { project_id: ctx.session.sessionProject.id, enable: 1 }, columns: ['id', 'name', 'company', 'role', 'enable', 'is_admin', 'account_group', 'mobile'], }); data.accountList = accountList; const unitList = await ctx.service.constructionUnit.getAllDataByCondition({ where: { pid: ctx.session.sessionProject.id } }); data.accountGroup = unitList.map(item => { const groupList = accountList.filter(item1 => item1.company === item.name); return { groupName: item.name, groupList }; }); return data; } async index(ctx) { try { await ctx.service.settle.loadAuditViewData(ctx.settle); const renderData = await this._getDefaultRenderData(ctx); const projectFunInfo = await this.ctx.service.project.getFunRela(ctx.session.sessionProject.id); renderData.minusNoValue = projectFunInfo.minusNoValue && ctx.tender.info.fun_rela.stage_change.minusNoValue; [renderData.ledgerSpread, renderData.posSpread] = await spreadSetting.getStageSpreadSetting(ctx, ctx.tender.id, this.ctx.stage.readOnly || this.ctx.stage.revising, {minusNoValue: renderData.minusNoValue}); renderData.whiteList = this.ctx.app.config.multipart.whitelist; await this.layout('settle/index.ejs', renderData, 'settle/modal.ejs'); } catch(err) { console.log(err); ctx.log(err); ctx.redirect('/tender/' + ctx.tender.id + '/settle'); } } async _loadSettleDataByKey(ctx, key, hpack) { switch (key) { case 'stageBills': if (!ctx.settle.latestStage) ctx.settle.latestStage = await this.ctx.service.stage.getLastestCompleteStage(ctx.tender.id); const bills = await this._getStageBillsData(ctx); return hpack ? [this.ctx.helper.hpackArr(bills), 'stageBills'] : [bills, '']; case 'stagePos': if (!ctx.settle.latestStage) ctx.settle.latestStage = await this.ctx.service.stage.getLastestCompleteStage(ctx.tender.id); const pos = await this._getStagePosData(ctx); return hpack ? [this.ctx.helper.hpackArr(pos), 'stagePos'] : [pos, '']; case 'settleBills': return ctx.service.settleBills.getAllDataByCondition({ where: { settle_id: ctx.settle.id } }); case 'settlePos': return ctx.service.settlePos.getAllDataByCondition({ where: { settle_id: ctx.settle.id } }); case 'settleSelect': return ctx.service.settleSelect.getAllDataByCondition({ where: { settle_id: ctx.settle.id } }); break; case 'tag': return await ctx.service.ledgerTag.getDatas(ctx.tender.id, ctx.stage.id, ctx.settle.id); break; } } async loadSettleData(ctx) { try { const data = JSON.parse(ctx.request.body.data); const filter = data.filter.split(';'); const responseData = { err: 0, msg: '', data: {}, hpack: [] }; const hpack = true; for (const f of filter) { const [relaData, hpackKey] = await this._loadSettleDataByKey(f, hpack); responseData.data[f] = relaData; if (hpackKey) responseData.hpack.push(hpackKey); } ctx.body = responseData; } catch (err) { ctx.log(err); ctx.body = { err: 1, msg: err.toString(), data: null }; } } async loadGatherData(ctx) { try { const settle = await this.ctx.service.settle.getLatestCompleteSettle(ctx.tender.id); const bills = await this.ctx.service.settleBillsFinal.getDataByCondition({ where: { settle_id: settle.id }}); const pos = await this.ctx.service.settlePosFinal.getDataByCondition({ where: { settle_id: settle.id }}); ctx.body = { err: 0, msg: '', data: { bills, pos } }; } catch(err) { ctx.log(err); ctx.ajaxErrorBody(err, '获取结算汇总数据错误'); } } async gather(ctx) { try { const renderData = { tender: ctx.tender.data, preUrl: `/tender/${ctx.tender.id}/measure/stage`, }; renderData.jsFiles = this.app.jsFiles.common.concat(this.app.jsFiles.settle.gather); await this.layout('settle/gather.ejs', renderData, 'settle/gather_modal.ejs'); } catch (err) { ctx.log(err); ctx.redirect(this.menu.menu.dashboard.url); } } } return SettleController; };