Selaa lähdekoodia

wap页添加方案审批

laiguoran 3 vuotta sitten
vanhempi
commit
91f59ff2bf

+ 1 - 0
app/controller/change_controller.js

@@ -3564,6 +3564,7 @@ module.exports = app => {
                 ctx.redirect(ctx.request.header.referer);
             } catch (err) {
                 this.log(err);
+                console.log(err);
                 ctx.session.postError = err.toString();
                 ctx.redirect(ctx.request.header.referer);
             }

+ 50 - 0
app/controller/wap_controller.js

@@ -129,6 +129,11 @@ module.exports = app => {
             }
             // 获取待审批的变更期
             const auditChanges = await ctx.service.changeAudit.getAuditChangeByWap(ctx.session.sessionUser.accountId);
+            // 获取待审批的变更方案
+            let auditChangePlans = [];
+            if (ctx.session.sessionProject.page_show.openChangePlan) {
+                auditChangePlans = await ctx.service.changePlanAudit.getAuditChangePlanByWap(ctx.session.sessionUser.accountId);
+            }
             // 获取待审批的台账修订
             const auditRevise = await ctx.service.reviseAudit.getAuditReviseByWap(ctx.session.sessionUser.accountId);
             for (const revise of auditRevise) {
@@ -140,6 +145,7 @@ module.exports = app => {
             const renderData = {
                 auditStages,
                 auditChanges,
+                auditChangePlans,
                 auditRevise,
                 auditAdvance,
                 changeConst,
@@ -262,6 +268,15 @@ module.exports = app => {
                     c.curAuditor = await ctx.service.changeAudit.getLastUser(c.cid, c.times);
                 }
 
+                // 变更令列表
+                let changePlans = [];
+                if (ctx.session.sessionProject.page_show.openChangePlan) {
+                    changePlans = await ctx.service.changePlan.getListByStatus(tender.id, 0, 0);
+                    for (const c of changePlans) {
+                        c.curAuditor = await ctx.service.changePlanAudit.getAuditorByStatus(c.id, c.status, c.times);
+                    }
+                }
+
                 // 台账修订列表
                 const revises = await ctx.service.ledgerRevise.getReviseList(ctx.tender.id);
                 for (const lr of revises) {
@@ -281,10 +296,12 @@ module.exports = app => {
                     tender,
                     stages,
                     changes,
+                    changePlans,
                     revises,
                     advanceList,
                     auditConst: auditConst.stage,
                     auditChangeConst: auditConst.flow,
+                    auditChangePlanConst: auditConst.changePlan,
                     auditReviseConst: auditConst.revise,
                     changeConst,
                     advanceConst,
@@ -377,6 +394,39 @@ module.exports = app => {
         }
 
         /**
+         * 变更方案审批详细页
+         *
+         * @param {Object} ctx - egg全局变量
+         * @return {void}
+         */
+        async changePlan(ctx) {
+            try {
+                const tender = ctx.tender.data;
+                if (!ctx.session.sessionProject.page_show.openChangePlan) {
+                    throw '该功能已关闭';
+                }
+                const change = await ctx.service.changePlan.getDataById(ctx.params.cpid);
+                const renderData = {
+                    tender,
+                    change,
+                    auditConst: auditConst.changePlan,
+                    changeConst,
+                    tpUnit: ctx.tender.info.decimal.tp,
+                };
+                const times = change.status !== auditConst.changePlan.status.checkNo ? change.times : change.times - 1;
+                renderData.change.user = await ctx.service.projectAccount.getAccountInfoById(change.uid);
+                renderData.change.auditors = await ctx.service.changePlanAudit.getAuditors(change.id, times);
+                // 获取审批流程中左边列表
+                renderData.change.auditors2 = await ctx.service.changePlanAudit.getAuditGroupByList(change.id, times);
+                await ctx.render('wap/shenpi_change_plan.ejs', renderData);
+            } catch (err) {
+                this.log(err);
+                ctx.redirect('/wap/list');
+            }
+        }
+
+
+        /**
          * 修订审批详细页
          *
          * @param {Object} ctx - egg全局变量

+ 1 - 1
app/lib/wechat.js

@@ -69,7 +69,7 @@ class WX {
                         break;
                     case wxConst.template.change:
                         templateId = wxConst.templateId.change;
-                        url = data.type ? '' : this.ctx.protocol + '://' + this.ctx.host + '/wx/url2wap?project=' + data.code + '&url=' + sck + data.wap_url;
+                        url = data.wap_url ? this.ctx.protocol + '://' + this.ctx.host + '/wx/url2wap?project=' + data.code + '&url=' + sck + data.wap_url : '';
                         remark = data.status === wxConst.status.check ? (data.type ? '微信暂无法在线审批' : '微信可快速审批,如需进行详细审批') :
                             (data.status === wxConst.status.success ? '审批已通过,查看审批结果' :
                                 (data.status === wxConst.status.back ? '审批被退回,查看退回结果' : '审批已终止,查看终止结果'));

+ 1 - 0
app/router.js

@@ -596,6 +596,7 @@ module.exports = app => {
     app.get('/wap/tender/:id', sessionAuth, tenderCheck, uncheckTenderCheck, 'wapController.tender');
     app.get('/wap/tender/:id/stage/:order', sessionAuth, tenderCheck, uncheckTenderCheck, 'wapController.stage');
     app.get('/wap/tender/:id/change/:cid/info', sessionAuth, tenderCheck, uncheckTenderCheck, 'wapController.change');
+    app.get('/wap/tender/:id/change/plan/:cpid/info', sessionAuth, tenderCheck, uncheckTenderCheck, 'wapController.changePlan');
     app.post('/wap/tender/:id/change/approval', sessionAuth, tenderCheck, uncheckTenderCheck, 'wapController.changeApproval');
     app.get('/wap/tender/:id/revise/:rid/info', sessionAuth, tenderCheck, uncheckTenderCheck, 'wapController.revise');
     app.get('/wap/tender/:id/advance', sessionAuth, tenderCheck, uncheckTenderCheck, 'wapController.advance');

+ 1 - 1
app/service/change_plan.js

@@ -134,7 +134,7 @@ module.exports = app => {
             let sql = '';
             let sqlParam = '';
             if (this.ctx.tender.isTourist && status === 0) {
-                sql = 'SELECT a.*, p.name as account_name FROM ?? As a LEFT JOIN ?? AS p On a.notice_uid = p.id WHERE a.tid = ?';
+                sql = 'SELECT a.*, p.name as account_name FROM ?? As a LEFT JOIN ?? AS p On a.uid = p.id WHERE a.tid = ?';
                 sqlParam = [this.tableName, this.ctx.service.projectAccount.tableName, tenderId];
             } else {
                 switch (status) {

+ 30 - 3
app/service/change_plan_audit.js

@@ -95,7 +95,7 @@ module.exports = app => {
             switch (status) {
                 case auditConst.status.checking :
                 case auditConst.status.checked :
-                    sql = 'SELECT la.`aid`, pa.`name`, pa.`company`, pa.`role`, la.`times`, la.`cpid`, la.`aid`, la.`order` ' +
+                    sql = 'SELECT la.`aid`, pa.`name`, pa.`company`, pa.`role`, la.`times`, la.`cpid`, la.`aid`, la.`order`, la.`status` ' +
                         '  FROM ?? AS la Left Join ?? AS pa On la.`aid` = pa.`id` ' +
                         '  WHERE la.`cpid` = ? and la.`status` = ? ' +
                         '  ORDER BY la.`times` desc, la.`order` desc';
@@ -103,7 +103,7 @@ module.exports = app => {
                     auditor = await this.db.queryOne(sql, sqlParam);
                     break;
                 case auditConst.status.checkNo :
-                    sql = 'SELECT la.`aid`, pa.`name`, pa.`company`, pa.`role`, la.`times`, la.`cpid`, la.`aid`, la.`order` ' +
+                    sql = 'SELECT la.`aid`, pa.`name`, pa.`company`, pa.`role`, la.`times`, la.`cpid`, la.`aid`, la.`order`, la.`status` ' +
                         '  FROM ?? AS la Left Join ?? AS pa On la.`aid` = pa.`id`' +
                         '  WHERE la.`cpid` = ? and la.`status` = ? and la.`times` = ?' +
                         '  ORDER BY la.`times` desc, la.`order` desc';
@@ -516,7 +516,34 @@ module.exports = app => {
             const sqlParam = [tenderId];
             return this.db.query(sql, sqlParam);
         }
-    }
 
+        /**
+         * 取待审批期列表(wap用)
+         *
+         * @param auditorId
+         * @return {Promise<*>}
+         */
+        async getAuditChangePlanByWap(auditorId) {
+            const sql =
+                'SELECT sa.`aid`, sa.`times`, sa.`begin_time`, sa.`end_time`, sa.`tid`, sa.`cpid`,' +
+                '    s.*,' +
+                '    t.`name` as `t_name`, t.`project_id`, t.`type`, t.`user_id`,' +
+                '    ti.`deal_info`, ti.`decimal` ' +
+                '  FROM ?? AS sa' +
+                '    Left Join ?? AS s On sa.`cpid` = s.`id`' +
+                '    Left Join ?? As t On sa.`tid` = t.`id`' +
+                '    Left Join ?? AS ti ON ti.`tid` = t.`id`' +
+                '  WHERE sa.`aid` = ? and sa.`status` = ?';
+            const sqlParam = [
+                this.tableName,
+                this.ctx.service.changePlan.tableName,
+                this.ctx.service.tender.tableName,
+                this.ctx.service.tenderInfo.tableName,
+                auditorId,
+                auditConst.status.checking,
+            ];
+            return await this.db.query(sql, sqlParam);
+        }
+    }
     return ChangePlanAudit;
 };

+ 25 - 1
app/view/wap/dashboard.ejs

@@ -9,6 +9,7 @@
     <link rel="stylesheet" href="/public/css/wap/main.css">
     <link rel="stylesheet" href="/public/css/toast.css">
     <link rel="stylesheet" href="/public/css/font-awesome/font-awesome.min.css">
+    <link rel="stylesheet" href="/public/css/toastr.css">
     <link rel="shortcut icon" href="/public/images/favicon.ico">
     <style>
         body {
@@ -36,7 +37,7 @@
         </nav>
         <!--待审批期列表-->
         <div class="py-6">
-            <% if (auditStages.length !== 0 || auditChanges.length !== 0 || auditRevise.length !== 0 || auditAdvance.length !== 0) { %>
+            <% if (auditStages.length !== 0 || auditChanges.length !== 0 || auditRevise.length !== 0 || auditAdvance.length !== 0 || auditChangePlans.length !== 0) { %>
                 <% for (const audit of auditStages) { %>
                 <div class="card mb-3">
                     <div class="card-header d-flex justify-content-between">
@@ -110,6 +111,28 @@
                         </div>
                     </div>
                 <% } %>
+                <% for (const change of auditChangePlans) { %>
+                    <div class="card mb-3">
+                        <div class="card-header d-flex justify-content-between">
+                            <span><%- JSON.parse(change.deal_info).buildName %></span>
+                            <span class="badge badge-pill badge-danger">变更方案</span>
+                        </div>
+                        <div class="bg-light p-2 px-3"><b><%- change.t_name %></b></div>
+                        <div class="card-body">
+                            <div class="d-flex justify-content-between"><span><%- change.code %></span></div>
+                            <div class="my-2">
+                                <table class="table table-sm table-bordered">
+                                    <tr><th width="90">工程名称</th><td><%- change.name %></td></tr>
+                                    <tr><th>变更性质</th><td><%- change.quality %></td></tr>
+                                    <tr><th>变更金额</th><td class="text-right"><%- ctx.helper.roundNum(change.total_price, JSON.parse(change.decimal).tp) %></td></tr>
+                                </table>
+                            </div>
+                            <div class="">
+                                <a href="/wap/tender/<%- change.tid %>/change/plan/<%- change.id %>/info#shenpi" class="btn btn-block btn-success">审批</a>
+                            </div>
+                        </div>
+                    </div>
+                <% } %>
                 <% for (const advance of auditAdvance) { %>
                     <div class="card mb-3">
                         <div class="card-header d-flex justify-content-between">
@@ -156,6 +179,7 @@
     <script src="/public/js/popper/popper.min.js"></script>
     <script src="/public/js/bootstrap/bootstrap.min.js"></script>
     <script src="/public/js/cookies.js"></script>
+    <script src="/public/js/toastr.min.js"></script>
     <script src="/public/js/wap/global.js"></script>
 <script>
     $(function () {

+ 2 - 0
app/view/wap/list.ejs

@@ -9,6 +9,7 @@
     <link rel="stylesheet" href="/public/css/wap/main.css">
     <link rel="stylesheet" href="/public/css/toast.css">
     <link rel="stylesheet" href="/public/css/font-awesome/font-awesome.min.css">
+    <link rel="stylesheet" href="/public/css/toastr.css">
     <link rel="shortcut icon" href="/public/images/favicon.ico">
     <style>
         html{height:100%;}
@@ -70,6 +71,7 @@
 <script src="/public/js/lodash.js"></script>
 <script src="/public/js/lz-string/lz-string.js"></script>
 <script src="/public/js/cookies.js"></script>
+<script src="/public/js/toastr.min.js"></script>
 <script src="/public/js/wap/global.js"></script>
 <script src="/public/js/decimal.min.js"></script>
 <script src="/public/js/zh_calc.js"></script>

+ 2 - 0
app/view/wap/login.ejs

@@ -9,6 +9,7 @@
     <link rel="stylesheet" href="/public/css/wap/main.css">
     <link rel="stylesheet" href="/public/css/toast.css">
     <link rel="stylesheet" href="/public/css/font-awesome/font-awesome.min.css">
+    <link rel="stylesheet" href="/public/css/toastr.css">
     <link rel="shortcut icon" href="/public/images/favicon.ico">
     <style>
         html{height:100%;}
@@ -73,6 +74,7 @@
 <script src="/public/js/jquery/jquery-3.2.1.min.js"></script>
 <script src="/public/js/popper/popper.min.js"></script>
 <script src="/public/js/bootstrap/bootstrap.min.js"></script>
+<script src="/public/js/toastr.min.js"></script>
 <script src="/public/js/wap/global.js"></script>
 <script>
     const csrf = '<%= ctx.csrf %>'

+ 2 - 0
app/view/wap/shenpi_advance.ejs

@@ -9,6 +9,7 @@
     <link rel="stylesheet" href="/public/css/wap/main.css">
     <link rel="stylesheet" href="/public/css/toast.css">
     <link rel="stylesheet" href="/public/css/font-awesome/font-awesome.min.css">
+    <link rel="stylesheet" href="/public/css/toastr.css">
     <script src=/public/js/echarts/echarts.min.js></script>
     <link rel="shortcut icon" href="/public/images/favicon.ico">
     <style>
@@ -127,6 +128,7 @@
 <script src="/public/js/popper/popper.min.js"></script>
 <script src="/public/js/bootstrap/bootstrap.min.js"></script>
 <script src="/public/js/cookies.js"></script>
+<script src="/public/js/toastr.min.js"></script>
 <script src="/public/js/wap/global.js"></script>
 <script>
     $(document).ready(function () {

+ 2 - 0
app/view/wap/shenpi_advance_detail.ejs

@@ -9,6 +9,7 @@
     <link rel="stylesheet" href="/public/css/wap/main.css">
     <link rel="stylesheet" href="/public/css/toast.css">
     <link rel="stylesheet" href="/public/css/font-awesome/font-awesome.min.css">
+    <link rel="stylesheet" href="/public/css/toastr.css">
     <script src=/public/js/echarts/echarts.min.js></script>
     <link rel="shortcut icon" href="/public/images/favicon.ico">
     <style>
@@ -217,6 +218,7 @@
 <script src="/public/js/popper/popper.min.js"></script>
 <script src="/public/js/bootstrap/bootstrap.min.js"></script>
 <script src="/public/js/cookies.js"></script>
+<script src="/public/js/toastr.min.js"></script>
 <script src="/public/js/wap/global.js"></script>
 <script>
     // $(document).ready(function () {

+ 5 - 0
app/view/wap/shenpi_change.ejs

@@ -9,6 +9,7 @@
     <link rel="stylesheet" href="/public/css/wap/main.css">
     <link rel="stylesheet" href="/public/css/toast.css">
     <link rel="stylesheet" href="/public/css/font-awesome/font-awesome.min.css">
+    <link rel="stylesheet" href="/public/css/toastr.css">
     <link rel="shortcut icon" href="/public/images/favicon.ico">
     <style>
         body {
@@ -147,6 +148,9 @@
                 </form>
             </div>
             <div class="tab-pane" id="shenpi">
+                <div class="mt-3">
+                    <h6 class="ml-1">审批金额:<%- ctx.helper.roundNum(change.total_price, ctx.tender.info.decimal.tp) %> 元 </h6>
+                </div>
                 <!--审批流程-->
                 <div class="card mt-3">
                     <ul class="list-group list-group-flush">
@@ -295,6 +299,7 @@
 <script src="/public/js/popper/popper.min.js"></script>
 <script src="/public/js/bootstrap/bootstrap.min.js"></script>
 <script src="/public/js/cookies.js"></script>
+<script src="/public/js/toastr.min.js"></script>
 <script src="/public/js/wap/global.js"></script>
 <script>
     $(document).ready(function () {

+ 249 - 0
app/view/wap/shenpi_change_plan.ejs

@@ -0,0 +1,249 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no">
+    <meta http-equiv="x-ua-compatible" content="ie=edge">
+    <title>标段概况-计量支付</title>
+    <link rel="stylesheet" href="/public/css/bootstrap/bootstrap.min.css">
+    <link rel="stylesheet" href="/public/css/wap/main.css">
+    <link rel="stylesheet" href="/public/css/toast.css">
+    <link rel="stylesheet" href="/public/css/font-awesome/font-awesome.min.css">
+    <link rel="stylesheet" href="/public/css/toastr.css">
+    <link rel="shortcut icon" href="/public/images/favicon.ico">
+    <style>
+        body {
+            padding: 0;
+        }
+    </style>
+</head>
+<body>
+<div class="container">
+    <!--顶部-->
+    <nav class="fixed-top bg-dark">
+        <div class="my-2 d-flex justify-content-between">
+            <span class="text-white ml-3"><a href="/wap/tender/<%- tender.id %>#biangeng" class="mr-2 text-white show-loading"><i class="fa fa-chevron-left"></i>工程变更</a></span>
+            <a tabindex="0" href="javascript:void(0)" class="text-white text-truncate text-center"
+               style="width:150px" data-toggle="popover" data-placement="top"
+               data-content="<%- tender.name %>" data-trigger="focus"><%- tender.name %></a>
+            <div class="mr-3">
+                <div class="dropdown">
+                    <button class="btn btn-sm btn-light dropdown-toggle" type="button" data-toggle="dropdown">
+                        <%- ctx.session.sessionUser.name.substr(ctx.session.sessionUser.name.length > 2 ? ctx.session.sessionUser.name.length - 2 : 0) %>
+                    </button>
+                    <div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
+                        <a class="dropdown-item" href="/wap/logout">退出登录</a>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </nav>
+    <!--标段概况-->
+    <div class="py-6">
+        <!--标签-->
+        <ul class="nav nav-tabs nav-fill">
+            <li class="nav-item">
+                <a class="nav-link active" data-toggle="tab" href="#info" role="tab">变更信息</a>
+            </li>
+            <li class="nav-item">
+                <a class="nav-link" data-toggle="tab" href="#shenpi" role="tab">审批</a>
+            </li>
+        </ul>
+        <div class="tab-content">
+            <div class="tab-pane active" id="info">
+                <form>
+                    <div class="form-group">
+                        <label>方案编号</label>
+                        <input class="form-control form-control-sm" value="<%- change.code %>" type="text" readonly="">
+                    </div>
+                    <div class="form-group">
+                        <label>变更工程名称</label>
+                        <input class="form-control form-control-sm" value="<%- change.name %>" type="text" readonly="">
+                    </div>
+                    <div class="form-group">
+                        <label>桩号</label>
+                        <input class="form-control form-control-sm" value="<%- change.peg %>" type="text" readonly="">
+                    </div>
+                    <div class="form-group">
+                        <label>原设计图名称</label>
+                        <input class="form-control form-control-sm" placeholder="" type="text" value="<%- change.org_name %>" readonly>
+                    </div>
+                    <div class="form-group">
+                        <label>图号</label>
+                        <input class="form-control form-control-sm" placeholder="" type="text" value="<%- change.new_code %>" readonly>
+                    </div>
+                    <div class="form-group">
+                        <label>变更设计名称</label>
+                        <input class="form-control form-control-sm" placeholder="" type="text" value="<%- change.design_name %>" readonly>
+                    </div>
+                    <div class="form-group">
+                        <label>变更图号</label>
+                        <input class="form-control form-control-sm" placeholder="" type="text" value="<%- change.c_new_code %>" readonly>
+                    </div>
+                    <div class="form-group">
+                        <label>工程变更类别</label>
+                        <input class="form-control form-control-sm" placeholder="" type="text" value="<%- change.class %>" readonly>
+                    </div>
+                    <div class="form-group">
+                        <label>工程变更性质</label>
+                        <input class="form-control form-control-sm" placeholder="" type="text" value="<%- change.quality %>" readonly>
+                    </div>
+                    <div class="form-group">
+                        <label><b class="text-danger">*&nbsp;</b>变更原因</label>
+                        <textarea class="form-control form-control-sm" rows="6" readonly=""><%- change.reason %></textarea>
+                    </div>
+                    <div class="form-group">
+                        <label>变更内容</label>
+                        <textarea class="form-control form-control-sm" rows="6" readonly=""><%- change.content %></textarea>
+                    </div>
+                    <div class="form-group">
+                        <label>方案描述</label>
+                        <textarea class="form-control form-control-sm" rows="2" readonly=""><%- change.memo %></textarea>
+                    </div>
+                    <div class="form-group">
+                        <label>工程量数量计算式</label>
+                        <textarea class="form-control form-control-sm" rows="3" readonly=""><%- change.expr %></textarea>
+                    </div>
+                </form>
+            </div>
+            <div class="tab-pane" id="shenpi">
+                <div class="mt-3">
+                    <h6 class="ml-1">审批金额:<%- ctx.helper.roundNum(change.total_price, ctx.tender.info.decimal.tp) %> 元 </h6>
+                </div>
+                <!--审批流程-->
+                <div class="card mt-3">
+                    <ul class="list-group list-group-flush">
+                        <li class="list-group-item">
+                            <% if (change.status === auditConst.status.uncheck) { %>
+                                <span class="pull-right"> 上报中</span>
+                            <% } else { %>
+                                <span class="text-success pull-right"><small><%- change.auditors[0].begin_time.toLocaleDateString() %></small> 上报</span>
+                            <% } %>
+                            <h5 class="card-title"><i class="fa fa-play-circle fa-rotate-90 text-success"></i> <%- change.user.name %><small class="text-muted"><%- change.user.role %></small></h5>
+                        </li>
+                        <% for (let iA = 0; iA < change.auditors.length; iA++) { %>
+                            <% const auditors = change.auditors; %>
+                            <li class="list-group-item">
+                                <% if (auditors[iA].status === auditConst.status.checked) { %>
+                                    <span class="text-success pull-right"><small><%- auditors[iA].end_time.toLocaleDateString() %></small> 审批通过</span>
+                                    <h5 class="card-title"><i class="<%- (iA < auditors.length - 1 ? 'fa fa-chevron-circle-down text-success' : 'fa fa-stop-circle text-success') %>"></i> <%- auditors[iA].name %> <small class="text-muted"><%- auditors[iA].role %></small></h5>
+                                    <p class="card-text"><%- auditors[iA].opinion %></p>
+                                <% } else if (auditors[iA].status == auditConst.status.checking) { %>
+                                    <span class="pull-right">审批中</span>
+                                    <h5 class="card-title"><i class="<%- (iA < auditors.length - 1 ? 'fa fa-chevron-circle-down' : 'fa fa-stop-circle') %>"></i> <%- auditors[iA].name %> <small class="text-muted"><%- auditors[iA].role %></small></h5>
+                                    <% if (auditors[iA].aid === ctx.session.sessionUser.accountId) { %>
+                                        <% audit = auditors[iA]; %>
+                                        <div class="form-group">
+                                            <div class="text-center">
+                                                <button class="btn btn-success" data-toggle="modal" data-target="#sp-done" >审批通过</button>
+                                                <button class="btn btn-warning" data-toggle="modal" data-target="#sp-back" >审批退回</button>
+                                            </div>
+                                        </div>
+                                    <% } %>
+                                <% } else if (auditors[iA].status === auditConst.status.checkNo) { %>
+                                    <span class="text-warning pull-right"><small><%- auditors[iA].end_time.toLocaleDateString() %></small>审批退回</span>
+                                    <h5 class="card-title"><i class="<%- (iA < auditors.length - 1 ? 'fa fa-chevron-circle-down text-warning' : 'fa fa-stop-circle text-warning') %>"></i> <%- auditors[iA].name %> <small class="text-muted"><%- auditors[iA].role %></small></h5>
+                                    <p class="card-text"><%- auditors[iA].opinion %></p>
+                                <% } else { %>
+                                    <h5 class="card-title"><i class="<%- (iA < auditors.length - 1 ? 'fa fa-chevron-circle-down' : 'fa fa-stop-circle') %>"></i> <%- auditors[iA].name %> <small class="text-muted"><%- auditors[iA].role %></small></h5>
+                                <% } %>
+                            </li>
+                        <% } %>
+                    </ul>
+                </div>
+            </div>
+        </div>
+    </div>
+    <!--底栏菜单-->
+    <nav class="fixed-bottom navbar-dark bg-light border-top">
+        <ul class="nav nav-fill my-2">
+            <li class="nav-item">
+                <a class="nav-link text-muted show-loading" href="/wap/dashboard"><i class="fa fa-check-square-o"></i> 待审批</a>
+            </li>
+            <li class="nav-item">
+                <a class="nav-link active show-loading" href="/wap/list"><i class="fa fa-list-ul"></i> 项目</a>
+            </li>
+        </ul>
+    </nav>
+</div>
+<!--审批通过弹窗-->
+<div class="modal" tabindex="-1" role="dialog" id="sp-done">
+    <div class="modal-dialog" role="document">
+        <form class="modal-content" action="/tender/<%- change.tid %>/change/plan/<%- change.id %>/information/audit/check" method="post" onsubmit="return auditCheck(0);">
+            <div class="modal-header">
+                <h5 class="modal-title">审批通过</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <div class="form-group">
+                    <label>审批意见</label>
+                    <textarea class="form-control" rows="8" name="opinion">同意</textarea>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                <input type="hidden" name="_csrf_j" value="<%= ctx.csrf %>" />
+                <input type="hidden" name="checkType" value="<%= auditConst.status.checked %>" />
+                <button type="submit" class="btn btn-success">审批通过</button>
+            </div>
+        </form>
+    </div>
+</div>
+<!--审批退回弹窗-->
+<div class="modal" tabindex="-1" role="dialog" id="sp-back">
+    <div class="modal-dialog" role="document">
+        <form class="modal-content" action="/tender/<%- change.tid %>/change/plan/<%- change.id %>/information/audit/check" method="post" onsubmit="return auditCheck(1);">
+            <div class="modal-header">
+                <h5 class="modal-title">审批退回</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <div class="form-group">
+                    <label>审批意见</label>
+                    <textarea class="form-control" rows="8" name="opinion">不同意</textarea>
+                </div>
+                <div class="alert alert-warning">
+                    <div class="custom-control custom-radio custom-control-inline">
+                        <input type="radio" id="customRadioInline1" name="checkType" class="custom-control-input" value="<%- auditConst.status.checkNo %>" checked>
+                        <label class="custom-control-label" for="customRadioInline1">退回原报 <%- change.user.name %></label>
+                    </div>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                <input type="hidden" name="_csrf_j" value="<%= ctx.csrf %>" />
+                <button type="submit" class="btn btn-warning">确认退回</button>
+            </div>
+        </form>
+    </div>
+</div>
+<script src="/public/js/jquery/jquery-3.2.1.min.js"></script>
+<script src="/public/js/popper/popper.min.js"></script>
+<script src="/public/js/bootstrap/bootstrap.min.js"></script>
+<script src="/public/js/cookies.js"></script>
+<script src="/public/js/toastr.min.js"></script>
+<script src="/public/js/wap/global.js"></script>
+<script>
+    $(document).ready(function () {
+        if (window.location.hash && window.location.hash === '#shenpi') {
+            $('#info').removeClass('active');
+            $('.nav-item a[href="#info"]').removeClass('active');
+
+            $('#shenpi').addClass('active');
+            $('.nav-item a[href="#shenpi"]').addClass('active');
+        }
+    });
+    // texterea换行
+    function auditCheck(i) {
+        const opinion = $('textarea[name="opinion"]').eq(i).val().replace(/\r\n/g, '<br/>').replace(/\n/g, '<br/>').replace(/\s/g, ' ');
+        $('textarea[name="opinion"]').eq(i).val(opinion);
+        return true;
+    }
+</script>
+</body>
+
+</html>

+ 2 - 0
app/view/wap/shenpi_revise.ejs

@@ -9,6 +9,7 @@
     <link rel="stylesheet" href="/public/css/wap/main.css">
     <link rel="stylesheet" href="/public/css/toast.css">
     <link rel="stylesheet" href="/public/css/font-awesome/font-awesome.min.css">
+    <link rel="stylesheet" href="/public/css/toastr.css">
     <script src=/public/js/echarts/echarts.min.js></script>
     <link rel="shortcut icon" href="/public/images/favicon.ico">
     <style>
@@ -183,6 +184,7 @@
 <script src="/public/js/popper/popper.min.js"></script>
 <script src="/public/js/bootstrap/bootstrap.min.js"></script>
 <script src="/public/js/cookies.js"></script>
+<script src="/public/js/toastr.min.js"></script>
 <script src="/public/js/wap/global.js"></script>
 <script>
     // $(document).ready(function () {

+ 2 - 0
app/view/wap/shenpi_stage.ejs

@@ -9,6 +9,7 @@
     <link rel="stylesheet" href="/public/css/wap/main.css">
     <link rel="stylesheet" href="/public/css/toast.css">
     <link rel="stylesheet" href="/public/css/font-awesome/font-awesome.min.css">
+    <link rel="stylesheet" href="/public/css/toastr.css">
     <script src=/public/js/echarts/echarts.min.js></script>
     <link rel="shortcut icon" href="/public/images/favicon.ico">
     <style>
@@ -230,6 +231,7 @@
 <script src="/public/js/popper/popper.min.js"></script>
 <script src="/public/js/bootstrap/bootstrap.min.js"></script>
 <script src="/public/js/cookies.js"></script>
+<script src="/public/js/toastr.min.js"></script>
 <script src="/public/js/wap/global.js"></script>
 <script>
     $(document).ready(function () {

+ 38 - 0
app/view/wap/tender.ejs

@@ -9,6 +9,7 @@
     <link rel="stylesheet" href="/public/css/wap/main.css">
     <link rel="stylesheet" href="/public/css/toast.css">
     <link rel="stylesheet" href="/public/css/font-awesome/font-awesome.min.css">
+    <link rel="stylesheet" href="/public/css/toastr.css">
     <script src=/public/js/echarts/echarts.min.js></script>
     <link rel="shortcut icon" href="/public/images/favicon.ico">
     <style>
@@ -205,6 +206,42 @@
             <div class="tab-pane" id="biangeng">
                 <!--工程变更-->
                 <dl class="mb-2 mt-3">
+                    <% for (const c of changePlans) { %>
+                        <dt class="bg-light p-2 d-flex justify-content-between"><span><a href="/wap/tender/<%- tender.id %>/change/plan/<%- c.id %>/info"><%- c.code %></a></span></dt>
+                        <dd>
+                            <table class="table table-hover">
+                                <tbody>
+                                <tr>
+                                    <td colspan="2">
+                                        <p class="mb-0">工程名称</p>
+                                        <%- c.name %>
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <td>
+                                        <p class="mb-0">变更性质</p>
+                                        <b><%- c.quality %></b>
+                                    </td>
+                                    <td>
+                                        <p class="mb-0">变更金额</p>
+                                        <b><%- ctx.helper.roundNum(c.total_price, tpUnit) %></b>
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <td colspan="2">
+                                        <% if (c.status === auditChangePlanConst.status.checking && c.curAuditor.aid === ctx.session.sessionUser.accountId) { %>
+                                            <a href="/wap/tender/<%- tender.id %>/change/plan/<%- c.id %>/info#shenpi" class="btn btn-block btn-success">审批变更</a>
+                                        <% } else if (c.status === auditChangePlanConst.status.uncheck) { %>
+                                            <span>待上报</span>
+                                        <% } else { %>
+                                            <span class="<%- auditChangePlanConst.auditStringClass[c.curAuditor.status] %>"><%- c.curAuditor.name %><%if (c.curAuditor.role !== '' && c.curAuditor.role !== null) { %>-<%- c.curAuditor.role %><% } %> <%- auditChangePlanConst.auditString[c.curAuditor.status] %></span>
+                                        <% } %>
+                                    </td>
+                                </tr>
+                                </tbody>
+                            </table>
+                        </dd>
+                    <% } %>
                     <% for (const c of changes) { %>
                     <dt class="bg-light p-2 d-flex justify-content-between"><span><a href="/wap/tender/<%- tender.id %>/change/<%- c.cid %>/info"><% if (c.status !== auditChangeConst.status.checked) { %><%- c.code %><% } else { %><%- c.p_code %><% } %></a></span></dt>
                     <dd>
@@ -263,6 +300,7 @@
 <script src="/public/js/popper/popper.min.js"></script>
 <script src="/public/js/bootstrap/bootstrap.min.js"></script>
 <script src="/public/js/cookies.js"></script>
+<script src="/public/js/toastr.min.js"></script>
 <script src="/public/js/wap/global.js"></script>
 <script type="text/javascript">
     //4 标段期数计量进度//