Browse Source

平台工作台功能提交

ellisran 2 months ago
parent
commit
2d94d33fe2

+ 4 - 0
app/const/audit.js

@@ -782,12 +782,16 @@ const advance = (function() {
     auditString[status.checking] = '审批中';
     auditString[status.checked] = '审批通过';
     auditString[status.checkNo] = '审批退回';
+    auditString[status.checkNoPre] = '审批退回';
+    auditString[status.checkAgain] = '重新审批';
     // 文字样式
     const auditStringClass = [];
     auditStringClass[status.uncheck] = '';
     auditStringClass[status.checking] = 'text-warning';
     auditStringClass[status.checked] = 'text-success';
     auditStringClass[status.checkNo] = 'text-warning';
+    auditStringClass[status.checkNoPre] = 'text-warning';
+    auditStringClass[status.checkAgain] = 'text-warning';
     return { type, status, statusString, statusClass, auditString, auditStringClass };
 })();
 

+ 243 - 0
app/controller/dashboard_controller.js

@@ -27,6 +27,249 @@ module.exports = app => {
          * @param {Object} ctx - egg全局变量
          * @return {void}
          */
+        async workspace(ctx) {
+            const allAuditTenders = await ctx.service.ledgerAudit.getAuditTender(ctx.session.sessionUser.accountId);
+            const allAuditStages = await ctx.service.stageAudit.getAuditStage(ctx.session.sessionUser.accountId);
+            const allAuditChanges = await ctx.service.changeAudit.getAuditChange(ctx.session.sessionUser.accountId);
+            const allAuditRevise = await ctx.service.reviseAudit.getAuditRevise(ctx.session.sessionUser.accountId);
+            const allAuditMaterial = await ctx.service.materialAudit.getAuditMaterial(ctx.session.sessionUser.accountId);
+            const allAuditAdvance = await ctx.service.advanceAudit.getAuditAdvance(ctx.session.sessionUser.accountId);
+            const allAuditChangeProject = await ctx.service.changeProjectAudit.getAuditChangeProject(ctx.session.sessionUser.accountId);
+            const allAuditChangeApply = await ctx.service.changeApplyAudit.getAuditChangeApply(ctx.session.sessionUser.accountId);
+            const allAuditChangePlan = await ctx.service.changePlanAudit.getAuditChangePlan(ctx.session.sessionUser.accountId);
+            const allAuditPayments = await ctx.service.paymentDetailAudit.getAuditPayment(ctx.session.sessionUser.accountId);
+            const allAuditStageAss = await ctx.service.stageAuditAss.getAuditStageAss(ctx.session.sessionUser.accountId);
+            const allAuditFinancials = await ctx.service.financialPayAudit.getAuditFinancial(ctx.session.sessionUser.accountId);
+            const pa = await ctx.service.projectAccount.getDataById(ctx.session.sessionUser.accountId);
+            const auditShenpiTenders = await ctx.service.ledgerAudit.getDonesByAudit(ctx.session.sessionUser.accountId);
+            const auditShenpiStages = await ctx.service.stageAudit.getDonesByAudit(ctx.session.sessionUser.accountId);
+            const auditShenpiChanges = await ctx.service.changeAudit.getDonesByAudit(ctx.session.sessionUser.accountId);
+            const auditShenpiRevise = await ctx.service.reviseAudit.getDonesByAudit(ctx.session.sessionUser.accountId);
+            const auditShenpiMaterial = await ctx.service.materialAudit.getDonesByAudit(ctx.session.sessionUser.accountId);
+            const auditShenpiAdvance = await ctx.service.advanceAudit.getDonesByAudit(ctx.session.sessionUser.accountId);
+            const auditShenpiChangeProject = await ctx.service.changeProjectAudit.getDonesByAudit(ctx.session.sessionUser.accountId);
+            const auditShenpiChangeApply = await ctx.service.changeApplyAudit.getDonesByAudit(ctx.session.sessionUser.accountId);
+            const auditShenpiChangePlan = await ctx.service.changePlanAudit.getDonesByAudit(ctx.session.sessionUser.accountId);
+            const auditShenpiPayment = await ctx.service.paymentDetailAudit.getDonesByAudit(ctx.session.sessionUser.accountId);
+            const auditShenpiFinancial = await ctx.service.financialPayAudit.getDonesByAudit(ctx.session.sessionUser.accountId);
+            const dashboardStatus = {
+                all: 0,
+                dashboard: 0,
+                worry: 0,
+                early: 0,
+            };
+            let noticeList = [];
+            // 还要考虑功能关闭不展示对应类型情况
+            const subProjects = await ctx.service.subProject.getSubProject(ctx.session.sessionProject.id, ctx.session.sessionUser.accountId, ctx.session.sessionUser.is_admin, true);
+            for (const subProject of subProjects) {
+                subProject.page_show = ctx.service.subProject.getPageShow(subProject.page_show);
+                const spTenders = ctx.helper._.filter(auditShenpiTenders, { spid: subProject.id });
+                noticeList.push(...ctx.helper.addKeyValue4ObjArray(spTenders, 'shenpi_type', 'ledger'));
+                const spStages = ctx.helper._.filter(auditShenpiStages, { spid: subProject.id });
+                noticeList.push(...ctx.helper.addKeyValue4ObjArray(spStages, 'shenpi_type', 'stage'));
+                const spChanges = ctx.helper._.filter(auditShenpiChanges, { spid: subProject.id });
+                noticeList.push(...ctx.helper.addKeyValue4ObjArray(spChanges, 'shenpi_type', 'change'));
+                const spRevise = ctx.helper._.filter(auditShenpiRevise, { spid: subProject.id });
+                noticeList.push(...ctx.helper.addKeyValue4ObjArray(spRevise, 'shenpi_type', 'revise'));
+                const spMaterial = subProject.page_show.openMaterial ? ctx.helper._.filter(auditShenpiMaterial, { spid: subProject.id }) : [];
+                noticeList.push(...ctx.helper.addKeyValue4ObjArray(spMaterial, 'shenpi_type', 'material'));
+                const spAdvance = ctx.helper._.filter(auditShenpiAdvance, { spid: subProject.id });
+                noticeList.push(...ctx.helper.addKeyValue4ObjArray(spAdvance, 'shenpi_type', 'advance'));
+                const spChangeProject = subProject.page_show.openChangeProject ? ctx.helper._.filter(auditShenpiChangeProject, { spid: subProject.id }) : [];
+                noticeList.push(...ctx.helper.addKeyValue4ObjArray(spChangeProject, 'shenpi_type', 'changeProject'));
+                const spChangeApply = subProject.page_show.openChangeApply ? ctx.helper._.filter(auditShenpiChangeApply, { spid: subProject.id }) : [];
+                noticeList.push(...ctx.helper.addKeyValue4ObjArray(spChangeApply, 'shenpi_type', 'changeApply'));
+                const spChangePlan = subProject.page_show.openChangePlan ? ctx.helper._.filter(auditShenpiChangePlan, { spid: subProject.id }) : [];
+                noticeList.push(...ctx.helper.addKeyValue4ObjArray(spChangePlan, 'shenpi_type', 'changePlan'));
+                const spPayment = subProject.page_show.openPayment ? ctx.helper._.filter(auditShenpiPayment, { spid: subProject.id }) : [];
+                noticeList.push(...ctx.helper.addKeyValue4ObjArray(spPayment, 'shenpi_type', 'payment'));
+                const spFinancial = subProject.page_show.openFinancial ? ctx.helper._.filter(auditShenpiFinancial, { spid: subProject.id }) : [];
+                noticeList.push(...ctx.helper.addKeyValue4ObjArray(spFinancial, 'shenpi_type', 'financial'));
+            }
+            const noticeDayList = [];
+            noticeList = ctx.helper._.orderBy(noticeList, ['shenpi_time'], ['desc']);
+            for (const notice of noticeList) {
+                const noticeDay = moment(new Date(notice.shenpi_time)).format('YYYY-MM-DD');
+                if (noticeDayList.indexOf(noticeDay) === -1) noticeDayList.push(noticeDay);
+            }
+            // 审批时间状态提示,0:无预警,1,预警(当前时间大于创建时间常高于stageAuditEarly天时,触发提示),2,紧急(当前时间大于审批发起时常高于stageAuditWorry天时,触发提示)
+            const auditTenders = await this.auditSet(ctx, allAuditTenders, subProjects, dashboardStatus, 'ledger');
+            const auditStages = await this.auditSet(ctx, allAuditStages, subProjects, dashboardStatus, 'stage');
+            const auditChanges = await this.auditSet(ctx, allAuditChanges, subProjects, dashboardStatus, 'change');
+            const auditRevise = await this.auditSet(ctx, allAuditRevise, subProjects, dashboardStatus, 'revise');
+            const auditMaterial = await this.auditSet(ctx, allAuditMaterial, subProjects, dashboardStatus, 'material');
+            const auditAdvance = await this.auditSet(ctx, allAuditAdvance, subProjects, dashboardStatus, 'advance');
+            const auditChangeProject = await this.auditSet(ctx, allAuditChangeProject, subProjects, dashboardStatus, 'changeProject');
+            const auditChangeApply = await this.auditSet(ctx, allAuditChangeApply, subProjects, dashboardStatus, 'changeApply');
+            const auditChangePlan = await this.auditSet(ctx, allAuditChangePlan, subProjects, dashboardStatus, 'changePlan');
+            const auditPayments = await this.auditSet(ctx, allAuditPayments, subProjects, dashboardStatus, 'payment');
+            const auditStageAss = await this.auditSet(ctx, allAuditStageAss, subProjects, dashboardStatus, 'stageAss');
+            const auditFinancials = await this.auditSet(ctx, allAuditFinancials, subProjects, dashboardStatus, 'financial');
+            const projectData = await ctx.service.project.getDataById(ctx.session.sessionProject.id);
+            // 获取销售人员数据
+            const salesmanData = await ctx.service.manager.getDataById(projectData.manager_id);
+            const officeName = officeList[salesmanData.office];
+            // 获取版本信息
+            const versionList = await ctx.service.version.getAllDataByCondition({ orders: [['id', 'desc']], limit: 5, offset: 0 });
+            // 获取项目通知
+            const msgList = await ctx.service.message.getMsgList(ctx.session.sessionProject.id);
+            // 获取系统通知
+            const sysMsgList = await ctx.service.message.getMsgList(ctx.session.sessionProject.id, '', 1, 0, 2);
+            // 获取系统维护信息
+            const maintainData = await ctx.service.maintain.getDataById(1);
+            const renderData = {
+                auditTenders,
+                auditStages,
+                auditChanges,
+                auditRevise,
+                auditMaterial,
+                auditAdvance,
+                auditChangeProject,
+                auditChangeApply,
+                auditChangePlan,
+                auditPayments,
+                auditStageAss,
+                auditFinancials,
+                dashboardStatus,
+                role: pa.role,
+                authMobile: pa.auth_mobile,
+                acLedger: auditConst.ledger,
+                acStage: auditConst.stage,
+                acChange: auditConst.change,
+                acRevise: auditConst.revise,
+                acMaterial: auditConst.material,
+                acAdvance: auditConst.advance,
+                acChangeProject: auditConst.changeProject,
+                acChangeApply: auditConst.changeApply,
+                acChangePlan: auditConst.changeApply,
+                acFinancial: auditConst.financial,
+                noticeList,
+                noticeDayList,
+                pushType: auditConst.pushType,
+                projectData,
+                salesmanData,
+                officeName,
+                versionList: JSON.parse(JSON.stringify(versionList).replace(/\\r\\n/g, '<br>').replace(/\\"/g, '&#34;').replace(/'/g, '&#39;').replace(/\\t/g, '&#9;')),
+                msgList: JSON.parse(JSON.stringify(msgList).replace(/\\r\\n/g, '<br>').replace(/\\"/g, '&#34;').replace(/'/g, '&#39;').replace(/\\t/g, '&#9;')),
+                sysMsgList: JSON.parse(JSON.stringify(sysMsgList).replace(/\\r\\n/g, '<br>').replace(/\\"/g, '&#34;').replace(/'/g, '&#39;').replace(/\\t/g, '&#9;')),
+                uid: ctx.session.sessionUser.accountId,
+                maintainData,
+                maintainConst,
+                typeColMap,
+                jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.dashboard.workspace),
+            };
+            await this.layout('dashboard/workspace.ejs', renderData, 'dashboard/modal.ejs');
+            await ctx.service.projectAccount.defaultUpdate({
+                id: this.ctx.session.sessionUser.accountId,
+                last_notice: new Date(),
+            });
+        }
+
+        async loadTenders(ctx) {
+            try {
+                const responseData = { err: 0, msg: '', data: {} };
+                const subProjects = await ctx.service.subProject.getSubProject(ctx.session.sessionProject.id, ctx.session.sessionUser.accountId, ctx.session.sessionUser.is_admin, true);
+                const tenders = [];
+                const accountInfo = await ctx.service.projectAccount.getDataById(ctx.session.sessionUser.accountId);
+                const userPermission = accountInfo !== undefined && accountInfo.permission !== '' ? JSON.parse(accountInfo.permission) : null;
+                for (const subProject of subProjects) {
+                    subProject.page_show = ctx.service.subProject.getPageShow(subProject.page_show);
+                    // 获取每个项目下参与的标段
+                    const subProjectTenders = await ctx.service.tender.getList('', userPermission, ctx.session.sessionUser.is_admin, '', subProject);
+                    tenders.push(...subProjectTenders);
+                }
+                for (const t of tenders) {
+                    // 用标段管理的方法获取t数据
+                    await this.ctx.service.tenderCache.loadTenderCache(t, '');
+                    t.total_price = t.ledger_tp && t.ledger_tp.total_price ? t.ledger_tp.total_price : 0;
+                    // [t.change_tp, t.change_p_tp, t.change_n_tp, t.change_valuation_tp, t.change_unvaluation_tp] = await ctx.service.change.getChangeTp(t.id);
+                }
+                responseData.data.tenderList = tenders;
+                ctx.body = responseData;
+            } catch (err) {
+                this.log(err);
+                ctx.body = { err: 1, msg: err.toString(), data: null };
+            }
+        }
+
+        async auditSet(ctx, allAudits, subProjects, dashboardStatus, type) {
+            const audits = [];
+            for (const t of allAudits) {
+                const sp = subProjects.find(sp => sp.id === t.spid);
+                if (sp) {
+                    t.sp_name = sp.name;
+                    t.start_audit = 0;
+                    let calcTime;
+                    switch (type) {
+                        case 'ledger':
+                            calcTime = t.ledger_status === auditConst[type].status.checking ? t.begin_time : t.end_time;
+                            break;
+                        case 'revise':
+                            calcTime = t.status === auditConst[type].status.checking ? t.begin_time : t.end_time;
+                            break;
+                        case 'stage':
+                            calcTime = t.sstatus === auditConst[type].status.checkNo ? t.end_time : t.begin_time;
+                            break;
+                        case 'stageAss':
+                            calcTime = t.begin_time;
+                            break;
+                        case 'change':
+                            calcTime = t.begin_time ? t.begin_time : t.cin_time ? ctx.moment.unix(t.cin_time).format('YYYY/MM/DD HH:mm') : '';
+                            break;
+                        case 'changeProject':
+                            if (!sp.page_show.openChangeProject) return [];
+                            calcTime = t.status !== auditConst[type].status.back ? t.begin_time : t.end_time;
+                            break;
+                        case 'changeApply':
+                            if (!sp.page_show.openChangeApply) return [];
+                            calcTime = t.mstatus !== auditConst[type].status.checkNo ? t.begin_time : t.end_time;
+                            break;
+                        case 'changePlan':
+                            if (!sp.page_show.openChangePlan) return [];
+                            calcTime = t.mstatus !== auditConst[type].status.checkNo ? t.begin_time : t.end_time;
+                            break;
+                        case 'material':
+                            if (!sp.page_show.openMaterial) return [];
+                            calcTime = t.mstatus !== auditConst[type].status.checkNo ? t.begin_time : t.end_time;
+                            break;
+                        case 'advance':
+                            calcTime = t.mstatus !== auditConst[type].status.checkNo ? t.create_time : t.end_time;
+                            break;
+                        case 'payment':
+                            if (!sp.page_show.openPayment) return [];
+                            calcTime = t.sstatus !== auditConst.stage.status.checkNo ? t.begin_time : t.end_time;
+                            break;
+                        case 'financial':
+                            if (!sp.page_show.openFinancial) return [];
+                            calcTime = t.fpcstatus !== auditConst[type].status.checkNo ? t.begin_time : t.end_time;
+                            break;
+                        default:
+                            return [];
+                    }
+                    if (sp.page_show.openStageAudit) {
+                        const now = new Date();
+                        const calcDay = ctx.helper.calculateDaysBetween(now, calcTime);
+                        if (sp.page_show.stageAuditWorry && calcDay >= sp.page_show.stageAuditWorry) {
+                            t.start_audit = 2;
+                            dashboardStatus.worry += 1;
+                        } else if (sp.page_show.stageAuditEarly && calcDay >= sp.page_show.stageAuditEarly) {
+                            t.start_audit = 1;
+                            dashboardStatus.early += 1;
+                        }
+                    }
+                    dashboardStatus.dashboard += 1;
+                    audits.push(t);
+                }
+            }
+            return audits;
+        }
+
+        /**
+         * 控制面板页面
+         *
+         * @param {Object} ctx - egg全局变量
+         * @return {void}
+         */
         async index(ctx) {
             const auditTenders = await ctx.service.ledgerAudit.getAuditTender(ctx.session.sessionUser.accountId, ctx.subProject.id);
             const auditStages = await ctx.service.stageAudit.getAuditStage(ctx.session.sessionUser.accountId, ctx.subProject.id);

+ 28 - 0
app/extend/helper.js

@@ -1752,4 +1752,32 @@ module.exports = {
         const info = _.find(objArray, { [key]: colName });
         return info ? info[showKey] : '';
     },
+
+    getTimePeriod() {
+        const hour = new Date().getHours();
+        if (hour >= 6 && hour < 12) {
+            return '上午';
+        } else if (hour >= 12 && hour < 14) {
+            return '中午';
+        } else if (hour >= 14 && hour < 18) {
+            return '下午';
+        }
+        return '晚上';
+    },
+
+    calculateDaysBetween(end, start) {
+        // 两个时间比较并得出相差天数,取整不考虑时分秒
+        if (!start) return 0;
+        const startDateTime = new Date(start);
+        const endDateTime = new Date(end);
+        const timeDifference = endDateTime - startDateTime;
+        return Math.floor(timeDifference / (1000 * 60 * 60 * 24));
+    },
+
+    addKeyValue4ObjArray(objArray, key, value) {
+        return objArray.map(item => {
+            item[key] = value;
+            return item;
+        });
+    },
 };

+ 27 - 0
app/public/css/main.css

@@ -2206,3 +2206,30 @@ animation:shake 1s .2s ease both;}
     text-align: right;
     line-height: 25px;
 }
+
+.ws-icon{
+    width: 30px;
+    height: 30px;
+    border-radius: 20%;
+    text-align: center;
+    vertical-align: middle;
+    margin-top: auto;
+    line-height: 30px;
+    /*  border: 1px solid #000;*/
+    /*  border-color: #f5c6cb;*/
+}
+
+.ws-icon-danger{
+    color: rgb(251, 56, 56);
+    background-color: rgb(253, 205, 197);
+}
+
+.ws-icon-primary{
+    color: rgb(22, 93, 255);
+    background-color: rgb(232, 243, 255);
+}
+
+.ws-icon-warning{
+    color: rgb(253, 172, 33);
+    background-color: rgb(255, 228, 186);
+}

+ 2 - 1
app/router.js

@@ -131,7 +131,8 @@ module.exports = app => {
 
     // ------------------------- 项目相关 -----------------------------
     // **工作台  todo 暂时引用控制面板,待修改
-    app.get('/dashboard', sessionAuth, 'dashboardController.index');
+    app.get('/dashboard', sessionAuth, 'dashboardController.workspace');
+    app.post('/dashboard/load', sessionAuth, 'dashboardController.loadTenders');
     app.get('/dashboard/msg', sessionAuth, 'dashboardController.msg');
     app.get('/dashboard/msg/:id', sessionAuth, 'dashboardController.msg');
     app.get('/dashboard/msg/add/:id', sessionAuth, 'dashboardController.msgAdd');

+ 24 - 1
app/service/advance_audit.js

@@ -679,7 +679,7 @@ module.exports = app => {
             const spSql = spid ? ' and t.`spid` = "' + spid + '"' : '';
             const sql = 'SELECT ma.`audit_id`, ma.`times`, ma.`order`, ma.`create_time`, ma.`end_time`, ma.`tid`, ma.`vid`,' +
                         '    m.`order` As `morder`, m.`status` As `mstatus`, m.`type` As `mtype`,' +
-                        '    t.`name`, t.`project_id`, t.`type`, t.`user_id` ' +
+                        '    t.`name`, t.`project_id`, t.`type`, t.`user_id`, t.`spid` ' +
                         '  FROM ?? AS ma' +
                         '  LEFT JOIN ?? AS m On ma.vid = m.id' +
                         '  LEFT JOIN ?? As t On m.tid = t.id' +
@@ -807,6 +807,29 @@ module.exports = app => {
             ];
             return await this.db.query(sql, sqlParam);
         }
+
+        /**
+         * 获取审核人已经审核过的审批信息(包括退回,通过,重新审批等)
+         *
+         * @param auditorId
+         * @return {Promise<*>}
+         */
+        async getDonesByAudit(auditorId, spid = '') {
+            const spSql = spid ? ' and t.`spid` = "' + spid + '"' : '';
+            const status = [auditConst.status.checked, auditConst.status.checkNo, auditConst.status.checkNoPre, auditConst.status.checkAgain];
+            const sql =
+                'SELECT la.`status`, la.`end_time` as `shenpi_time`, la.`vid`, t.`id`, v.`order` As `vorder`, v.`type`, t.`name`, t.`spid` ' +
+                '  FROM ?? AS la Left Join ?? AS t ON la.`tid` = t.`id` LEFT JOIN ?? AS v ON la.`vid` = v.`id`' +
+                '  WHERE la.`audit_id` = ? AND la.`status` in (' + this.ctx.helper.getInArrStrSqlFilter(status) +')' + spSql +
+                '  ORDER BY la.`end_time` DESC';
+            const sqlParam = [
+                this.tableName,
+                this.ctx.service.tender.tableName,
+                this.ctx.service.advance.tableName,
+                auditorId,
+            ];
+            return await this.db.query(sql, sqlParam);
+        }
     }
     return AdvanceAudit;
 };

+ 24 - 1
app/service/change_apply_audit.js

@@ -394,7 +394,7 @@ module.exports = app => {
             const spSql = spid ? ' and t.`spid` = "' + spid + '"' : '';
             const sql = 'SELECT ma.`aid`, ma.`times`, ma.`order`, ma.`begin_time`, ma.`end_time`, ma.`tid`, ma.`caid`,' +
                 '    m.`status` As `mstatus`, m.`code` As `mcode`,' +
-                '    t.`name`, t.`project_id`, t.`type`, t.`user_id` ' +
+                '    t.`name`, t.`project_id`, t.`type`, t.`user_id`, t.`spid` ' +
                 '  FROM ?? AS ma LEFT JOIN ?? AS m ON  ma.`caid` = m.`id` LEFT JOIN ?? As t ON ma.`tid` = t.`id`' +
                 '  WHERE ((ma.`aid` = ? and ma.`status` = ?) OR (m.`uid` = ? and ma.`status` = ? and m.`status` = ? and ma.`times` = (m.`times`-1)))' + spSql +
                 '  ORDER BY ma.`begin_time` DESC';
@@ -1416,6 +1416,29 @@ module.exports = app => {
             ];
             return await this.db.query(sql, sqlParam);
         }
+
+        /**
+         * 获取审核人已经审核过的审批信息(包括退回,通过,重新审批等)
+         *
+         * @param auditorId
+         * @return {Promise<*>}
+         */
+        async getDonesByAudit(auditorId, spid = '') {
+            const spSql = spid ? ' and t.`spid` = "' + spid + '"' : '';
+            const status = [auditConst.status.checked, auditConst.status.checkNo, auditConst.status.checkAgain, auditConst.status.revise, auditConst.status.cancelRevise];
+            const sql =
+                'SELECT la.`status`, la.`end_time` as `shenpi_time`, la.`caid`, t.`id`, ca.`code`, t.`name`, t.`spid` ' +
+                '  FROM ?? AS la Left Join ?? AS t ON la.`tid` = t.`id` LEFT JOIN ?? AS ca ON la.`caid` = ca.`id`' +
+                '  WHERE la.`aid` = ? AND la.`status` in (' + this.ctx.helper.getInArrStrSqlFilter(status) + ')' + spSql +
+                '  ORDER BY la.`end_time` DESC';
+            const sqlParam = [
+                this.tableName,
+                this.ctx.service.tender.tableName,
+                this.ctx.service.changeApply.tableName,
+                auditorId,
+            ];
+            return await this.db.query(sql, sqlParam);
+        }
     }
 
     return ChangeApplyAudit;

+ 24 - 1
app/service/change_audit.js

@@ -227,7 +227,7 @@ module.exports = app => {
             const spSql = spid ? ' and t.`spid` = "' + spid + '"' : '';
             const sql = 'SELECT ca.`uid`, ca.`times`, ca.`usite`, ca.`usort`, ca.`tid`, ca.`cid`, ca.`begin_time`, ca.`end_time`, ca.`sin_time`, ca.`name` As `caname`, ' +
                 '    c.`code` As `ccode`, c.`name` As `cname`, c.`status` As `cstatus`, c.`cin_time`, ' +
-                '    t.`name`, t.`type`, t.`user_id` ' +
+                '    t.`name`, t.`type`, t.`user_id`, t.`spid` ' +
                 '  FROM ?? AS ca LEFT JOIN ?? AS c ON ca.`cid` = c.`cid` ' +
                 '    LEFT JOIN ?? As t ON ca.`tid` = t.`id` ' +
                 '  WHERE ca.`uid` = ? and ca.`status` = ? and c.`status` != ?' + spSql +
@@ -1417,6 +1417,29 @@ module.exports = app => {
                 throw err;
             }
         }
+
+        /**
+         * 获取审核人已经审核过的审批信息(包括退回,通过,重新审批等)
+         *
+         * @param auditorId
+         * @return {Promise<*>}
+         */
+        async getDonesByAudit(auditorId, spid = '') {
+            const spSql = spid ? ' and t.`spid` = "' + spid + '"' : '';
+            const status = [auditConst.status.checked, auditConst.status.checkNo, auditConst.status.checkNoPre, auditConst.status.revise, auditConst.status.cancelRevise, auditConst.status.checkAgain];
+            const sql =
+                'SELECT la.`audit_order`, la.`status`, la.`end_time` as `shenpi_time`, la.`cid`, t.`id`, c.`code`, t.`name`, t.`spid` ' +
+                '  FROM ?? AS la Left Join ?? AS t ON la.`tid` = t.`id` LEFT JOIN ?? AS c ON la.`cid` = c.`cid`' +
+                '  WHERE la.`uid` = ? AND la.`status` in (' + this.ctx.helper.getInArrStrSqlFilter(status) +')' + spSql +
+                '  ORDER BY la.`end_time` DESC';
+            const sqlParam = [
+                this.tableName,
+                this.ctx.service.tender.tableName,
+                this.ctx.service.change.tableName,
+                auditorId,
+            ];
+            return await this.db.query(sql, sqlParam);
+        }
     }
 
     return ChangeAudit;

+ 24 - 1
app/service/change_plan_audit.js

@@ -392,7 +392,7 @@ module.exports = app => {
             const spSql = spid ? ' and t.`spid` = "' + spid + '"' : '';
             const sql = 'SELECT ma.`aid`, ma.`times`, ma.`order`, ma.`begin_time`, ma.`end_time`, ma.`tid`, ma.`cpid`,' +
                 '    m.`status` As `mstatus`, m.`code` As `mcode`,' +
-                '    t.`name`, t.`project_id`, t.`type`, t.`user_id` ' +
+                '    t.`name`, t.`project_id`, t.`type`, t.`user_id`, t.`spid` ' +
                 '  FROM ?? AS ma LEFT JOIN ?? AS m ON  ma.`cpid` = m.`id` LEFT JOIN ?? As t ON ma.`tid` = t.`id`' +
                 '  WHERE ((ma.`aid` = ? and ma.`status` = ?) OR (m.`uid` = ? and ma.`status` = ? and m.`status` = ? and ma.`times` = (m.`times`-1)))' + spSql +
                 '  ORDER BY ma.`begin_time` DESC';
@@ -1459,6 +1459,29 @@ module.exports = app => {
                 throw err;
             }
         }
+
+        /**
+         * 获取审核人已经审核过的审批信息(包括退回,通过,重新审批等)
+         *
+         * @param auditorId
+         * @return {Promise<*>}
+         */
+        async getDonesByAudit(auditorId, spid = '') {
+            const spSql = spid ? ' and t.`spid` = "' + spid + '"' : '';
+            const status = [auditConst.status.checked, auditConst.status.checkNo, auditConst.status.back, auditConst.status.checkAgain, auditConst.status.revise, auditConst.status.cancelRevise];
+            const sql =
+                'SELECT la.`status`, la.`end_time` as `shenpi_time`, la.`cpid`, t.`id`, cp.`code`, t.`name`, t.`spid` ' +
+                '  FROM ?? AS la Left Join ?? AS t ON la.`tid` = t.`id` LEFT JOIN ?? AS cp ON la.`cpid` = cp.`id`' +
+                '  WHERE la.`aid` = ? AND la.`status` in (' + this.ctx.helper.getInArrStrSqlFilter(status) + ')' + spSql +
+                '  ORDER BY la.`end_time` DESC';
+            const sqlParam = [
+                this.tableName,
+                this.ctx.service.tender.tableName,
+                this.ctx.service.changePlan.tableName,
+                auditorId,
+            ];
+            return await this.db.query(sql, sqlParam);
+        }
     }
     return ChangePlanAudit;
 };

+ 24 - 1
app/service/change_project_audit.js

@@ -401,7 +401,7 @@ module.exports = app => {
             const spSql = spid ? ' and t.`spid` = "' + spid + '"' : '';
             const sql = 'SELECT ma.`aid`, ma.`times`, ma.`order`, ma.`begin_time`, ma.`end_time`, ma.`tid`, ma.`cpid`,' +
                 '    m.`status` As `mstatus`, m.`code` As `mcode`,' +
-                '    t.`name`, t.`project_id`, t.`type`, t.`user_id` ' +
+                '    t.`name`, t.`project_id`, t.`type`, t.`user_id`, t.`spid` ' +
                 '  FROM ?? AS ma LEFT JOIN ?? AS m ON  ma.`cpid` = m.`id` LEFT JOIN ?? As t ON ma.`tid` = t.`id`' +
                 '  WHERE ((ma.`aid` = ? and ma.`status` = ?) OR (m.`uid` = ? and ma.`status` = ? and m.`status` = ? and ma.`times` = (m.`times`-1)))' + spSql +
                 '  ORDER BY ma.`begin_time` DESC';
@@ -1552,6 +1552,29 @@ module.exports = app => {
             ];
             return await this.db.query(sql, sqlParam);
         }
+
+        /**
+         * 获取审核人已经审核过的审批信息(包括退回,通过,重新审批等)
+         *
+         * @param auditorId
+         * @return {Promise<*>}
+         */
+        async getDonesByAudit(auditorId, spid = '') {
+            const spSql = spid ? ' and t.`spid` = "' + spid + '"' : '';
+            const status = [auditConst.status.checked, auditConst.status.checkNo, auditConst.status.back, auditConst.status.checkAgain, auditConst.status.revise, auditConst.status.cancelRevise];
+            const sql =
+                'SELECT la.`status`, la.`end_time` as `shenpi_time`, la.`cpid`, t.`id`, cp.`code`, t.`name`, t.`spid` ' +
+                '  FROM ?? AS la Left Join ?? AS t ON la.`tid` = t.`id` LEFT JOIN ?? AS cp ON la.`cpid` = cp.`id`' +
+                '  WHERE la.`aid` = ? AND la.`status` in (' + this.ctx.helper.getInArrStrSqlFilter(status) + ')' + spSql +
+                '  ORDER BY la.`end_time` DESC';
+            const sqlParam = [
+                this.tableName,
+                this.ctx.service.tender.tableName,
+                this.ctx.service.changeProject.tableName,
+                auditorId,
+            ];
+            return await this.db.query(sql, sqlParam);
+        }
     }
 
     return ChangeProjectAudit;

+ 23 - 0
app/service/financial_pay_audit.js

@@ -536,6 +536,29 @@ module.exports = app => {
             }
             return content.length ? JSON.stringify(content[0]) : '';
         }
+
+        /**
+         * 获取审核人已经审核过的审批信息(包括退回,通过,重新审批等)
+         *
+         * @param auditorId
+         * @return {Promise<*>}
+         */
+        async getDonesByAudit(auditorId, spid = '') {
+            const spSql = spid ? ' and t.`spid` = "' + spid + '"' : '';
+            const status = [auditConst.status.checked, auditConst.status.checkNo];
+            const sql =
+                'SELECT la.`status`, la.`end_time` as `shenpi_time`, la.`fpid`, t.`id`, fp.`code`, t.`name`, t.`spid` ' +
+                '  FROM ?? AS la Left Join ?? AS t ON la.`tid` = t.`id` LEFT JOIN ?? AS fp ON la.`fpid` = fp.`id`' +
+                '  WHERE la.`aid` = ? AND la.`status` in (' + this.ctx.helper.getInArrStrSqlFilter(status) + ')' + spSql +
+                '  ORDER BY la.`end_time` DESC';
+            const sqlParam = [
+                this.tableName,
+                this.ctx.service.tender.tableName,
+                this.ctx.service.financialPay.tableName,
+                auditorId,
+            ];
+            return await this.db.query(sql, sqlParam);
+        }
     }
 
     return FinancialPayAudit;

+ 23 - 1
app/service/ledger_audit.js

@@ -843,7 +843,7 @@ module.exports = app => {
         async getAuditTender(auditorId, spid = '') {
             const spSql = spid ? ' and t.`spid` = "' + spid + '"' : '';
             const sql =
-                'SELECT la.`audit_id`, la.`times`, la.`audit_order`, la.`begin_time`, la.`end_time`, t.`id`, t.`name`, t.`project_id`, t.`type`, t.`user_id`, t.`ledger_status` ' +
+                'SELECT la.`audit_id`, la.`times`, la.`audit_order`, la.`begin_time`, la.`end_time`, t.`id`, t.`name`, t.`project_id`, t.`type`, t.`user_id`, t.`ledger_status`, t.`spid` ' +
                 '  FROM ?? AS la Left Join ?? AS t ON la.`tender_id` = t.`id` ' +
                 '  WHERE ((la.`audit_id` = ? and la.`status` = ?) OR (t.`user_id` = ? and t.`ledger_status` = ? and la.`status` = ? and la.`times` = (t.`ledger_times`-1)))' + spSql +
                 '    ORDER BY la.`begin_time` DESC';
@@ -1092,6 +1092,28 @@ module.exports = app => {
                 throw err;
             }
         }
+
+        /**
+         * 获取审核人已经审核过的审批信息(包括退回,通过,重新审批等)
+         *
+         * @param auditorId
+         * @return {Promise<*>}
+         */
+        async getDonesByAudit(auditorId, spid = '') {
+            const spSql = spid ? ' and t.`spid` = "' + spid + '"' : '';
+            const status = [auditConst.status.checked, auditConst.status.checkNo, auditConst.status.checkAgain];
+            const sql =
+                'SELECT la.`status`, la.`end_time` as `shenpi_time`, t.`id`, t.`name`, t.`spid` ' +
+                '  FROM ?? AS la Left Join ?? AS t ON la.`tender_id` = t.`id` ' +
+                '  WHERE la.`audit_id` = ? AND la.`status` in (' + this.ctx.helper.getInArrStrSqlFilter(status) +')' + spSql +
+                '  ORDER BY la.`end_time` DESC';
+            const sqlParam = [
+                this.tableName,
+                this.ctx.service.tender.tableName,
+                auditorId,
+            ];
+            return await this.db.query(sql, sqlParam);
+        }
     }
 
     return LedgerAudit;

+ 24 - 1
app/service/material_audit.js

@@ -861,7 +861,7 @@ module.exports = app => {
             const spSql = spid ? ' and t.`spid` = "' + spid + '"' : '';
             const sql = 'SELECT ma.`aid`, ma.`times`, ma.`order`, ma.`begin_time`, ma.`end_time`, ma.`tid`, ma.`mid`,' +
                 '    m.`order` As `morder`, m.`status` As `mstatus`,' +
-                '    t.`name`, t.`project_id`, t.`type`, t.`user_id` ' +
+                '    t.`name`, t.`project_id`, t.`type`, t.`user_id`, t.`spid` ' +
                 '  FROM ?? AS ma' +
                 '  LEFT JOIN ?? AS m On ma.mid = m.id' +
                 '  LEFT JOIN ?? As t On m.tid = t.id' +
@@ -1381,6 +1381,29 @@ module.exports = app => {
             });
             return result;
         }
+
+        /**
+         * 获取审核人已经审核过的审批信息(包括退回,通过,重新审批等)
+         *
+         * @param auditorId
+         * @return {Promise<*>}
+         */
+        async getDonesByAudit(auditorId, spid = '') {
+            const spSql = spid ? ' and t.`spid` = "' + spid + '"' : '';
+            const status = [auditConst.status.checked, auditConst.status.checkNo, auditConst.status.checkNoPre, auditConst.status.checkAgain];
+            const sql =
+                'SELECT la.`status`, la.`end_time` as `shenpi_time`, la.`mid`, t.`id`, m.`order` As `morder`, t.`name`, t.`spid` ' +
+                '  FROM ?? AS la Left Join ?? AS t ON la.`tid` = t.`id` LEFT JOIN ?? AS m ON la.`mid` = m.`id`' +
+                '  WHERE la.`aid` = ? AND la.`status` in (' + this.ctx.helper.getInArrStrSqlFilter(status) +')' + spSql +
+                '  ORDER BY la.`end_time` DESC';
+            const sqlParam = [
+                this.tableName,
+                this.ctx.service.tender.tableName,
+                this.ctx.service.material.tableName,
+                auditorId,
+            ];
+            return await this.db.query(sql, sqlParam);
+        }
     }
 
     return MaterialAudit;

+ 1 - 1
app/service/message.js

@@ -148,7 +148,7 @@ module.exports = app => {
          * @return {Boolean} - 返回修改结果
          */
         async getMsgList(projectId, spid = '', limit = 5, offset = 0, type = 1) {
-            const sqSql = spid ? ' AND (`spid` = "' + spid + '" OR `spid` = "")' : ' AND `spid` = ""';
+            const sqSql = spid ? ' AND (`spid` = "' + spid + '" OR `spid` = "")' : '';
             if (type === 1) {
                 const sql = 'SELECT * FROM ?? WHERE `project_id` = ?' + sqSql + ' AND `type` = ? ORDER BY CONCAT(`istop`,`release_time`) DESC LIMIT ?,?';
                 const sqlParam = [this.tableName, projectId, type, offset, limit];

+ 25 - 1
app/service/payment_detail_audit.js

@@ -663,7 +663,7 @@ module.exports = app => {
                 'SELECT pda.`aid`, pda.`times`, pda.`order`, pda.`begin_time`, pda.`end_time`, pda.`tender_id`, pda.`tr_id`, pda.`td_id`,' +
                 '    pd.`code` As `scode`, pd.`order` As `sorder`, pd.`status` As `sstatus`, pd.type,' +
                 '    pr.`rpt_name` As `rpt_name`,' +
-                '    t.`name`, t.`pid`, t.`uid` ' +
+                '    t.`name`, t.`pid`, t.`uid`, t.`spid` ' +
                 '  FROM ?? AS pda ' +
                 '    Left Join ?? AS pd On pda.`td_id` = pd.`id` ' +
                 '    Left Join ?? AS pr On pda.`tr_id` = pr.`id` ' +
@@ -692,6 +692,30 @@ module.exports = app => {
                 return await transaction.delete(this.tableName, { id: auditor.id });
             }
         }
+
+        /**
+         * 获取审核人已经审核过的审批信息(包括退回,通过,重新审批等)
+         *
+         * @param auditorId
+         * @return {Promise<*>}
+         */
+        async getDonesByAudit(auditorId, spid = '') {
+            const spSql = spid ? ' and t.`spid` = "' + spid + '"' : '';
+            const status = [auditConst.status.checked, auditConst.status.checkNo, auditConst.status.checkNoPre, auditConst.status.checkAgain];
+            const sql =
+                'SELECT la.`status`, la.`end_time` as `shenpi_time`, la.`tr_id`, la.`td_id`, t.`id`, td.`code`, td.`type`, pr.`rpt_name`, t.`name`, t.`spid` ' +
+                '  FROM ?? AS la Left Join ?? AS t ON la.`tender_id` = t.`id` LEFT JOIN ?? AS td ON la.`td_id` = td.`id` LEFT JOIN ?? AS pr ON la.`tr_id` = pr.`id`' +
+                '  WHERE la.`aid` = ? AND la.`status` in (' + this.ctx.helper.getInArrStrSqlFilter(status) + ')' + spSql +
+                '  ORDER BY la.`end_time` DESC';
+            const sqlParam = [
+                this.tableName,
+                this.ctx.service.paymentTender.tableName,
+                this.ctx.service.paymentDetail.tableName,
+                this.ctx.service.paymentTenderRpt.tableName,
+                auditorId,
+            ];
+            return await this.db.query(sql, sqlParam);
+        }
     }
 
     return PaymentDetailAudit;

+ 24 - 1
app/service/revise_audit.js

@@ -846,7 +846,7 @@ module.exports = app => {
             const sql =
                 'SELECT ra.`audit_id`, ra.`times`, ra.`audit_order`, ra.`begin_time`, ra.`end_time`,' +
                 '    r.id, r.corder, r.uid, r.status, r.content,' +
-                '    t.id As t_id, t.`name` As t_name, t.`project_id` As t_pid, t.`type` As t_type, t.`user_id` As t_uid, t.`status` As t_status, ' +
+                '    t.id As t_id, t.`name` As t_name, t.`project_id` As t_pid, t.`type` As t_type, t.`user_id` As t_uid, t.`status` As t_status, t.`spid`, ' +
                 '    p.name As audit_name, p.role As audit_role, p.company As audit_company' +
                 '  FROM ' + this.tableName + ' AS ra' +
                 '  Left Join ' + this.ctx.service.ledgerRevise.tableName + ' As r On ra.rid = r.id' +
@@ -1144,6 +1144,29 @@ module.exports = app => {
             const result = await this.db.queryOne(sql, sqlParam);
             return result ? result.num : 0;
         }
+
+        /**
+         * 获取审核人已经审核过的审批信息(包括退回,通过,重新审批等)
+         *
+         * @param auditorId
+         * @return {Promise<*>}
+         */
+        async getDonesByAudit(auditorId, spid = '') {
+            const spSql = spid ? ' and t.`spid` = "' + spid + '"' : '';
+            const status = [auditConst.status.checked, auditConst.status.checkNo];
+            const sql =
+                'SELECT la.`status`, la.`end_time` as `shenpi_time`, la.`rid`, t.`id`, r.`corder`, t.`name`, t.`spid` ' +
+                '  FROM ?? AS la Left Join ?? AS t ON la.`tender_id` = t.`id` LEFT JOIN ?? AS r ON la.`rid` = r.`id`' +
+                '  WHERE la.`audit_id` = ? AND la.`status` in (' + this.ctx.helper.getInArrStrSqlFilter(status) +')' + spSql +
+                '  ORDER BY la.`end_time` DESC';
+            const sqlParam = [
+                this.tableName,
+                this.ctx.service.tender.tableName,
+                this.ctx.service.ledgerRevise.tableName,
+                auditorId,
+            ];
+            return await this.db.query(sql, sqlParam);
+        }
     }
 
     return ReviseAudit;

+ 24 - 1
app/service/stage_audit.js

@@ -1570,7 +1570,7 @@ module.exports = app => {
             const sql =
                 'SELECT sa.`aid`, sa.`times`, sa.`order`, sa.`begin_time`, sa.`end_time`, sa.`tid`, sa.`sid`,' +
                 '    s.`order` As `sorder`, s.`status` As `sstatus`, s.`in_time`,' +
-                '    t.`name`, t.`project_id`, t.`type`, t.`user_id` ' +
+                '    t.`name`, t.`project_id`, t.`type`, t.`user_id`, t.`spid` ' +
                 '  FROM ?? AS sa ' +
                 '    Left Join ?? AS s On sa.`sid` = s.`id` ' +
                 '    Left Join ?? As t ON sa.`tid` = t.`id`' +
@@ -2380,6 +2380,29 @@ module.exports = app => {
         async getComfirmLockedId(stage) {
             return await this.getAllDataByCondition({ where: { sid: stage.id, times: stage.times, order: stage.curOrder, status: auditConst.status.checked } });
         }
+
+        /**
+         * 获取审核人已经审核过的审批信息(包括退回,通过,重新审批等)
+         *
+         * @param auditorId
+         * @return {Promise<*>}
+         */
+        async getDonesByAudit(auditorId, spid = '') {
+            const spSql = spid ? ' and t.`spid` = "' + spid + '"' : '';
+            const status = [auditConst.status.checked, auditConst.status.checkNo, auditConst.status.checkNoPre, auditConst.status.checkAgain];
+            const sql =
+                'SELECT la.`status`, la.`end_time` as `shenpi_time`, la.`sid`, t.`id`, s.`order` As `sorder`, t.`name`, t.`spid` ' +
+                '  FROM ?? AS la Left Join ?? AS t ON la.`tid` = t.`id` LEFT JOIN ?? AS s ON la.`sid` = s.`id`' +
+                '  WHERE la.`aid` = ? AND la.`status` in (' + this.ctx.helper.getInArrStrSqlFilter(status) +')' + spSql +
+                '  ORDER BY la.`end_time` DESC';
+            const sqlParam = [
+                this.tableName,
+                this.ctx.service.tender.tableName,
+                this.ctx.service.stage.tableName,
+                auditorId,
+            ];
+            return await this.db.query(sql, sqlParam);
+        }
     }
 
     return StageAudit;

+ 2 - 0
app/service/stage_audit_ass.js

@@ -99,11 +99,13 @@ module.exports = app => {
                         if (s && s.status === auditConst.stage.status.checkNo && s.user_id === r.user_id) {
                             const lastAudit = await this.ctx.service.stageAudit.getLastestAuditor(s.id, s.times - 1, auditConst.stage.status.checkNo);
                             r.begin_time = lastAudit ? lastAudit.end_time : s.in_time;
+                            r.spid = t.spid;
                             result2.push(r);
                         } else {
                             const curAudits = await this.ctx.service.stageAudit.getCurAuditors(s.id, s.times);
                             if (curAudits.length > 0 && this._.findIndex(curAudits, { aid: r.user_id }) !== -1) {
                                 r.begin_time = curAudits[0].begin_time;
+                                r.spid = t.spid;
                                 result2.push(r);
                             }
                         }

+ 10 - 10
app/service/tender.js

@@ -85,8 +85,8 @@ module.exports = app => {
          * @param {Number} getAll - 是否取所有标段
          * @return {Array} - 返回标段数据
          */
-        async getList(listStatus = '', permission = null, getAll = 0, buildStatusFilter = '') {
-            if (!this.ctx.subProject) return [];
+        async getList(listStatus = '', permission = null, getAll = 0, buildStatusFilter = '', subProject = this.ctx.subProject) {
+            if (!subProject) return [];
 
             // 获取当前项目信息
             const session = this.ctx.session;
@@ -101,7 +101,7 @@ module.exports = app => {
                     '  Left Join ?? As pa ' +
                     '  ON t.`user_id` = pa.`id` ' +
                     '  WHERE t.`spid` = ? ' + buildStatusFilter + userFilter + ' ORDER BY CONVERT(t.`name` USING GBK) ASC';
-                sqlParam = [this.tableName, this.ctx.service.projectAccount.tableName, this.ctx.subProject.id];
+                sqlParam = [this.tableName, this.ctx.service.projectAccount.tableName, subProject.id];
             } else if (getAll === 1 || (permission !== null && permission.tender !== undefined && permission.tender.indexOf('2') !== -1)) {
                 // 具有查看所有标段权限的用户查阅标段
                 sql = 'SELECT t.`id`, t.`project_id`, t.`name`, t.`status`, t.`category`, t.`ledger_times`, t.`ledger_status`, t.`measure_type`, t.`user_id`, t.`create_time`, t.`total_price`, t.`deal_tp`, t.`spid`, t.filter_budget, t.filter_fund,' +
@@ -110,20 +110,20 @@ module.exports = app => {
                     '  Left Join ?? As pa ' +
                     '  ON t.`user_id` = pa.`id` ' +
                     '  WHERE t.`spid` = ?' + buildStatusFilter + ' ORDER BY CONVERT(t.`name` USING GBK) ASC';
-                sqlParam = [this.tableName, this.ctx.service.projectAccount.tableName, this.ctx.subProject.id];
+                sqlParam = [this.tableName, this.ctx.service.projectAccount.tableName, subProject.id];
             } else {
                 // 根据用户权限查阅标段
                 // tender 163条数据,project_account 68条数据测试
                 // 查询两张表耗时0.003s,查询tender左连接project_account耗时0.002s
-                const changeProjectSql = this.ctx.subProject.page_show.openChangeProject ? '    OR (t.`ledger_status` = ' + auditConst.ledger.status.checked + ' AND ' +
+                const changeProjectSql = subProject.page_show.openChangeProject ? '    OR (t.`ledger_status` = ' + auditConst.ledger.status.checked + ' AND ' +
                     '        t.id IN ( SELECT cpa.`tid` FROM ' + this.ctx.service.changeProjectAudit.tableName + ' AS cpa WHERE cpa.`aid` = ' + session.sessionUser.accountId + ' GROUP BY cpa.`tid`))' : '';
-                const changeApplySql = this.ctx.subProject.page_show.openChangeApply ? '    OR (t.`ledger_status` = ' + auditConst.ledger.status.checked + ' AND ' +
+                const changeApplySql = subProject.page_show.openChangeApply ? '    OR (t.`ledger_status` = ' + auditConst.ledger.status.checked + ' AND ' +
                     '        t.id IN ( SELECT caa.`tid` FROM ' + this.ctx.service.changeApplyAudit.tableName + ' AS caa WHERE caa.`aid` = ' + session.sessionUser.accountId + ' GROUP BY caa.`tid`))' : '';
-                const changePlanSql = this.ctx.subProject.page_show.openChangePlan ? '    OR (t.`ledger_status` = ' + auditConst.ledger.status.checked + ' AND ' +
+                const changePlanSql = subProject.page_show.openChangePlan ? '    OR (t.`ledger_status` = ' + auditConst.ledger.status.checked + ' AND ' +
                     '        t.id IN ( SELECT cpla.`tid` FROM ' + this.ctx.service.changePlanAudit.tableName + ' AS cpla WHERE cpla.`aid` = ' + session.sessionUser.accountId + ' GROUP BY cpla.`tid`))' : '';
-                const changeProjectXsSql = this.ctx.subProject.page_show.openChangeProject ? '    OR (t.`ledger_status` = ' + auditConst.ledger.status.checked + ' AND ' +
+                const changeProjectXsSql = subProject.page_show.openChangeProject ? '    OR (t.`ledger_status` = ' + auditConst.ledger.status.checked + ' AND ' +
                     '        t.id IN ( SELECT cpxa.`tid` FROM ' + this.ctx.service.changeProjectXsAudit.tableName + ' AS cpxa WHERE cpxa.`aid` = ' + session.sessionUser.accountId + ' GROUP BY cpxa.`tid`))' : '';
-                const xxjdSql = this.ctx.subProject.page_show.xxjd ? '    OR (t.id IN ( SELECT xxjd.`tid` FROM ' + this.ctx.service.scheduleAudit.tableName + ' AS xxjd WHERE xxjd.`permission` != 0 AND xxjd.`audit_id` = ' + session.sessionUser.accountId + ' GROUP BY xxjd.`tid`))' : '';
+                const xxjdSql = subProject.page_show.xxjd ? '    OR (t.id IN ( SELECT xxjd.`tid` FROM ' + this.ctx.service.scheduleAudit.tableName + ' AS xxjd WHERE xxjd.`permission` != 0 AND xxjd.`audit_id` = ' + session.sessionUser.accountId + ' GROUP BY xxjd.`tid`))' : '';
                 sql = 'SELECT t.`id`, t.`project_id`, t.`name`, t.`status`, t.`category`, t.`ledger_times`, t.`ledger_status`, t.`measure_type`, t.`user_id`, t.`create_time`, t.`total_price`, t.`deal_tp`,' +
                     '    pa.`name` As `user_name`, pa.`role` As `user_role`, pa.`company` As `user_company` ' +
                     // '  FROM ?? As t, ?? As pa ' +
@@ -166,7 +166,7 @@ module.exports = app => {
                     '    OR (t.id IN ( SELECT tt.`tid` FROM ?? AS tt WHERE tt.`user_id` = ?))' +
                     // 未参与,但可见的标段
                     ') ORDER BY CONVERT(t.`name` USING GBK) ASC';
-                sqlParam = [this.tableName, this.ctx.service.projectAccount.tableName, this.ctx.subProject.id, session.sessionUser.accountId,
+                sqlParam = [this.tableName, this.ctx.service.projectAccount.tableName, subProject.id, session.sessionUser.accountId,
                     this.ctx.service.ledgerAudit.tableName, session.sessionUser.accountId,
                     this.ctx.service.stageAudit.tableName, session.sessionUser.accountId,
                     this.ctx.service.auditAss.tableName, session.sessionUser.accountId,

+ 17 - 0
app/view/dashboard/modal.ejs

@@ -58,3 +58,20 @@
         </div>
     </div>
 </div>
+<!--弹出审批日历modal -->
+<div class="modal fade" id="notice-modal" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">审批日历(<span id="notice-day"></span>)</h5>
+            </div>
+            <div class="modal-body">
+                <ul class="list-unstyled modal-height-500" id="notice-list" style="overflow: auto">
+                </ul>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">关闭</button>
+            </div>
+        </div>
+    </div>
+</div>

File diff suppressed because it is too large
+ 865 - 0
app/view/dashboard/workspace.ejs


+ 12 - 0
config/web.js

@@ -54,6 +54,18 @@ const JsFiles = {
         '/public/js/global.js',
     ],
     controller: {
+        dashboard: {
+            workspace: {
+                files: ['/public/js/echarts/echarts.min.js', '/public/js/decimal.min.js', '/public/js/moment/moment.min.js'],
+                mergeFiles: [
+                    '/public/js/zh_calc.js',
+                    '/public/js/datepicker/datepicker.min.js',
+                    '/public/js/datepicker/datepicker.zh.js',
+                    '/public/js/dashboard.js',
+                ],
+                mergeFile: 'dashboard_workspace',
+            },
+        },
         tender: {
             list: {
                 files: ['/public/js/ztree/jquery.ztree.core.js', '/public/js/ztree/jquery.ztree.exedit.js', '/public/js/decimal.min.js', '/public/js/moment/moment.min.js'],