Browse Source

变更令部分功能提交

laiguoran 6 years ago
parent
commit
edd34b9b7d

+ 60 - 16
app/const/audit.js

@@ -7,31 +7,71 @@
  * @date
  * @version
  */
-
+// 变更令状态
 const status = {
-    uncheck: 1,
-    checking: 2,
-    checked: 3,
-    checkNo: 4,
+    uncheck: 1,     // 待上报
+    checking: 2,    // 审批中
+    checked: 3,     // 审批完成
+    checkNo: 4,     // 审批终止
+    back: 5,        // 重新上报
 };
-
-const statusString = [];
-statusString[status.uncheck] = '待上报';
-statusString[status.checking] = '审批中';
-statusString[status.checked] = '审批完成';
-statusString[status.checkNo] = '审批退回';
-
 const statusButton = [];
 statusButton[status.uncheck] = '上报';
 statusButton[status.checking] = '审批';
 statusButton[status.checked] = '';
-statusButton[status.checked] = '重新上报';
+statusButton[status.checkNo] = '';
+statusButton[status.back] = '重新上报';
+
+const statusButtonClass = [];
+statusButtonClass[status.uncheck] = 'btn-primary';
+statusButtonClass[status.checking] = 'btn-success';
+statusButtonClass[status.checked] = '';
+statusButtonClass[status.checkNo] = '';
+statusButtonClass[status.back] = 'btn-warning';
+
+const statusString = [];
+statusString[status.uncheck] = '';
+statusString[status.checking] = '审批中';
+statusString[status.checked] = '完成';
+statusString[status.checkNo] = '终止';
+statusString[status.back] = '退回';
 
 const statusClass = [];
 statusClass[status.uncheck] = '';
 statusClass[status.checking] = 'text-warning';
 statusClass[status.checked] = 'text-success';
-statusClass[status.checkNo] = 'text-warning';
+statusClass[status.checkNo] = 'text-danger';
+statusClass[status.back] = 'text-warning';
+
+/* ------------------------------------------------------- */
+
+// 变更令审批人状态
+const auditStatus = {
+    uncheck: 1,     // 待审批
+    checking: 2,    // 审批中或者原报人待上报
+    checked: 3,     // 审批通过或者原报人上报完成
+    checkNo: 4,     // 审批终止
+    back: 5,       // 退回到原报人重新上报
+    backnew: 6,    // 退回到上一个审批人
+};
+
+const auditStatusString = [];
+auditStatusString[auditStatus.uncheck] = '待上报';
+auditStatusString[auditStatus.checking] = '审批中';
+auditStatusString[auditStatus.checked] = '审批通过';
+auditStatusString[auditStatus.checkNo] = '审批终止';
+auditStatusString[auditStatus.back] = '退回';
+auditStatusString[auditStatus.backnew] = '审批退回';
+
+const auditStatusClass = [];
+auditStatusClass[auditStatus.uncheck] = '';
+auditStatusClass[auditStatus.checking] = 'text-warning';
+auditStatusClass[auditStatus.checked] = 'text-success';
+auditStatusClass[auditStatus.checkNo] = 'text-danger';
+auditStatusClass[auditStatus.back] = 'text-warning';
+auditStatusClass[auditStatus.backnew] = 'text-warning';
+
+/* ------------------------------------------------------- */
 
 const filter = {
     status: {
@@ -42,19 +82,23 @@ const filter = {
         checkNo: 5,
     },
     statusString: [],
-}
+};
 filter.statusString[filter.status.pending] = '待处理';
 filter.statusString[filter.status.uncheck] = '待上报';
 filter.statusString[filter.status.checking] = '进行中';
 filter.statusString[filter.status.checked] = '已完成';
-filter.statusString[filter.status.checkNo] = '不通过';
+filter.statusString[filter.status.checkNo] = '终止';
 
 module.exports = {
     flow: {
         status,
         statusString,
         statusButton,
+        statusButtonClass,
         statusClass,
+        auditStatus,
+        auditStatusString,
+        auditStatusClass,
     },
     filter,
 };

+ 75 - 15
app/controller/change_controller.js

@@ -12,6 +12,7 @@ const moment = require('moment');
 const audit = require('../const/audit');
 const codeRuleConst = require('../const/code_rule');
 const changeConst = require('../const/change');
+const tenderMenu = require('../../config/menu').tenderMenu;
 
 module.exports = app => {
     class ChangeController extends app.BaseController {
@@ -28,19 +29,38 @@ module.exports = app => {
             ctx.showTitle = true;
         }
 
-        async _filterChanges(ctx, status) {
+        async _filterChanges(ctx, status = 0) {
             const tenderId = ctx.params.id;
+            ctx.session.sessionUser.tenderId = tenderId;
             const tender = await this.service.tender.getDataById(tenderId);
             const tenderList = await this.service.tender.getList();
 
-            const changes = await ctx.service.change.checkingDatas(tender.id, ctx.session.sessionUser.accountId);
+            const page = ctx.page;
+            const changes = await ctx.service.change.getListByStatus(tender.id, status);
+            const total = await ctx.service.change.getCountByStatus(tender.id, status);
+            if (changes !== null) {
+                let i = 0;
+                for(let c of changes) {
+                    const changeAudit = await ctx.service.changeAudit.getLastUser(c.cid, c.times);
+                    changes[i].changeAudit = changeAudit;
+                    i++;
+                }
+            }
+
+            // 分页相关
+            const pageInfo = {
+                page,
+                total: parseInt(total / app.config.pageSize),
+                queryData: JSON.stringify(ctx.urlInfo.query),
+            };
+
             const filter = JSON.parse(JSON.stringify(audit.filter));
             filter.count = [];
-            filter.count[filter.status.pending] = 4;// await ctx.service.change.pendingDatas(tender.id, ctx.session.sessionUser.accountId);
-            filter.count[filter.status.uncheck] = 4;// await ctx.service.change.checkingDatas(tender.id, ctx.session.sessionUser.accountId);
-            filter.count[filter.status.checking] = 4;// await ctx.service.change.checkedDatas(tender.id, ctx.session.sessionUser.accountId);
-            filter.count[filter.status.checked] = 4;// await ctx.service.change.pendingDatas(tender.id, ctx.session.sessionUser.accountId);
-            filter.count[filter.status.checkNo] = 4;//await ctx.service.change.pendingDatas(tender.id, ctx.session.sessionUser.accountId);
+            filter.count[filter.status.pending] = await ctx.service.change.getCountByStatus(tender.id, filter.status.pending);// await ctx.service.change.pendingDatas(tender.id, ctx.session.sessionUser.accountId);
+            filter.count[filter.status.uncheck] = await ctx.service.change.getCountByStatus(tender.id, filter.status.uncheck);// await ctx.service.change.checkingDatas(tender.id, ctx.session.sessionUser.accountId);
+            filter.count[filter.status.checking] = await ctx.service.change.getCountByStatus(tender.id, filter.status.checking);// await ctx.service.change.checkedDatas(tender.id, ctx.session.sessionUser.accountId);
+            filter.count[filter.status.checked] = await ctx.service.change.getCountByStatus(tender.id, filter.status.checked);// await ctx.service.change.pendingDatas(tender.id, ctx.session.sessionUser.accountId);
+            filter.count[filter.status.checkNo] = await ctx.service.change.getCountByStatus(tender.id, filter.status.checkNo);//await ctx.service.change.pendingDatas(tender.id, ctx.session.sessionUser.accountId);
 
             const codeRule = tender.c_rule ? JSON.parse(tender.c_rule) : [];
             for (const rule of codeRule) {
@@ -60,10 +80,13 @@ module.exports = app => {
                         break;
                 }
             }
+
             const renderData = {
+                uid: ctx.session.sessionUser.accountId,
                 moment,
                 tender,
                 tenderList,
+                pageInfo,
                 changes,
                 filter,
                 status: status,
@@ -71,6 +94,8 @@ module.exports = app => {
                 auditConst: audit.flow,
                 ruleType: codeRuleConst.ruleType.change,
                 ruleConst: codeRuleConst.measure,
+                tenderMenu: this.menu.tenderMenu,
+                preUrl: '/tender/' + tenderId,
             };
 
             await this.layout('change/index.ejs', renderData, 'change/modal.ejs');
@@ -84,7 +109,7 @@ module.exports = app => {
          */
         async index(ctx) {
             try {
-                await this._filterChanges(ctx, audit.filter.status.uncheck);
+                await this._filterChanges(ctx);
             } catch (err) {
                 this.log(err);
                 ctx.redirect('/dashboard');
@@ -176,7 +201,7 @@ module.exports = app => {
                 await this._filterChanges(ctx, status);
             } catch (err) {
                 this.logger.error(err);
-                ctx.redirect('/change');
+                ctx.redirect('/tender/'+ ctx.params.id +'/change');
             }
         }
 
@@ -188,20 +213,29 @@ module.exports = app => {
          */
         async info(ctx) {
             try {
-                const tender = ctx.tenderData;
-                const tenderList = ctx.tenderList;
+                const tid = ctx.session.sessionUser.tenderId !== undefined ? ctx.session.sessionUser.tenderId : ctx.params.id;
+                const tender = await this.service.tender.getDataById(tid);
                 const change = await ctx.service.change.getDataByCondition({cid: ctx.params.cid});
 
+                // 后台判断当前人查看info状态
+                const auditStatus = await ctx.service.changeAudit.getStatusByChange(change);
+
+                // 获取公司列表
+                const companyList = await ctx.service.changeCompany.getAllDataByCondition({ tid: tid });
+
                 const renderData = {
+                    uid: ctx.session.sessionUser.accountId,
                     tender,
-                    tenderList,
                     change,
                     changeConst,
+                    auditStatus,
+                    auditConst: audit.flow,
+                    companyList,
                 };
-                await this.layout('change/info.ejs', renderData);
+                await this.layout('change/info.ejs', renderData, 'change/info_modal.ejs');
             } catch (err) {
                 this.log(err);
-                ctx.redirect('/change');
+                ctx.redirect('/tender/'+ ctx.params.id +'/change');
             }
         }
 
@@ -222,7 +256,7 @@ module.exports = app => {
                     tenderList,
                     change,
                 };
-                await this.layout('change/bills.ejs', renderData, 'change/bills_modal.ejs');
+                await this.layout('change/bills.ejs', renderData, 'change/info_modal.ejs');
 
             } catch (err) {
                 this.log(err);
@@ -254,6 +288,32 @@ module.exports = app => {
                 ctx.redirect('/change');
             }
         }
+
+        /**
+         * 变更公司管理
+         * @param ctx
+         * @return {Promise.<void>}
+         */
+        async updateCompany(ctx) {
+            const responseData = {
+                err: 0,
+                msg: '',
+                data: '',
+            };
+            try {
+                const data = JSON.parse(ctx.request.body.data);
+                if (data.tid === undefined || data.uci === undefined || data.uc === undefined || data.ac === undefined) {
+                    throw '参数有误';
+                }
+                const [addCompany, selectCompany] = await ctx.service.changeCompany.setCompanyList(data);
+                responseData.data = { add: addCompany, select: selectCompany };
+            } catch (err) {
+                responseData.err = 1;
+                responseData.msg = err;
+            }
+
+            ctx.body = responseData;
+        }
     }
 
     return ChangeController;

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

@@ -432,6 +432,10 @@ body {
   background:#e4e7ea;
   font-weight: 600
 }
+.nav-list li a.active{
+  background:#e4e7ea;
+  font-weight: 600
+}
 /*内容区*/
 .c-header {
   padding:0 0 5px

File diff suppressed because it is too large
+ 233 - 0
app/public/css/toastr.css


+ 14 - 4
app/public/js/change.js

@@ -9,7 +9,7 @@
  */
 // 向后端请求中间计量号
 function getNewCode() {
-    postData('/change/newCode', null, function (code) {
+    postData('/tender/'+ $('#tenderId').val() +'/change/newCode', null, function (code) {
         if (code !== '') {
             $('#bj-code').val(code);
         }
@@ -51,7 +51,7 @@ class codeRuleSet {
             let preview;
             switch (codeType) {
                 case ruleConst.ruleType.tenderName: {
-                    preview = $('#tenderName').text();
+                    preview = $('#tenderName').val();
                     break;
                 }
                 case ruleConst.ruleType.text: {
@@ -159,10 +159,10 @@ $(document).ready(() => {
             name: $('#bj-name').val(),
         };
         if (data.code || data.code !== '' || data.name || data.name !== '') {
-            postData('/change/add', data, function (rst) {
+            postData('/tender/'+ $('#tenderId').val() +'/change/add', data, function (rst) {
                 $('#bj-code').removeClass('is-invalid');
                 $('#mj-add').modal('hide');
-                window.location.href = '/change/' + rst.cid + '/info';
+                window.location.href = '/tender/'+ $('#tenderId').val() +'/change/' + rst.cid + '/info';
             }, function () {
                 $('#mj-code').addClass('is-invalid');
                 $('#mj-Hint').show();
@@ -170,4 +170,14 @@ $(document).ready(() => {
         }
     });
 
+    //状态切换
+    $('#status_select').change(function () {
+       const status = $(this).val();
+       let url = '/tender/'+ $('#tenderId').val() +'/change';
+       if (status !== 0) {
+           url += '/status/'+ status;
+       }
+       window.location.href = url;
+    });
+
 });

+ 81 - 0
app/public/js/change_company.js

@@ -0,0 +1,81 @@
+'use strict';
+
+/**
+ * 变更令公司编辑js
+ *
+ * @author EllisRan.
+ * @date 2018/11/26
+ * @version
+ */
+
+$(document).ready(() => {
+    //提出单位编辑
+    $('#addcompany').click(function(){
+        let newinput = '<div class="form-group"><input type="text" class="form-control" placeholder="请输入公司名称"></div>';
+        $('#companyadddiv').append(newinput);
+    });
+
+    $('#updatecompany').click(function(){
+        $(this).attr('disabled','disabled');
+        let addcompanyArr = new Array();
+        $('#companyadddiv').find('.form-control').each(function(){
+            addcompanyArr.push($(this).val());
+        });
+        var updatecompanyArr = new Array();
+        var updatecompanyidArr = new Array();
+        $('#companyshow').find('.form-control').each(function(){
+            updatecompanyArr.push($(this).val());
+            updatecompanyidArr.push($(this).attr('id'));
+        });
+
+        //判断是否有重名情况再提交
+        let flag = isRepeat(addcompanyArr.concat(updatecompanyArr));
+        if(!flag){
+            const data = {
+                tid: $('#tenderId').val(),
+                uci:updatecompanyidArr.length !== 0 ? updatecompanyidArr : '',
+                uc:updatecompanyArr.length ? updatecompanyArr : '',
+                ac:addcompanyArr.length !== 0 ? addcompanyArr : ''
+            };
+            postData('/change/update/company', data, function (result) {
+                $('#companyadddiv').html('');
+                addCompanyHtml(result);
+                selectCOmpanyHtml(result);
+                $('#editcompany').modal('hide');
+                toastr.success('变更单位已更新');
+                $('#updatecompany').attr('disabled',false);
+            });
+        }else{
+            toastr.error('变更单位不能同名');
+            $('#updatecompany').attr('disabled',false);
+        }
+    });
+});
+
+function isRepeat(arr){
+    let hash = {};
+    for(let i in arr) {
+        if(hash[arr[i]])
+            return true;
+        hash[arr[i]] = true;
+    }
+    return false;
+}
+
+function addCompanyHtml(data) {
+    const html = [];
+
+    for (const a of data.add) {
+        html.push('<div class="form-group">');
+        html.push('<input type="text" id="' + a.id +'" class="form-control" value="'+ a.name +'">');
+        html.push('</div>');
+    }
+    $('#companyshow').append(html.join(''));
+}
+function selectCOmpanyHtml(data) {
+    const html = [];
+    for (const s of data.select) {
+        html.push('<option>'+ s.name +'</option>');
+    }
+    $('#company').html(html);
+}

+ 18 - 0
app/public/js/change_detail.js

@@ -0,0 +1,18 @@
+'use strict';
+
+/**
+ * 变更令详细页js
+ *
+ * @author EllisRan.
+ * @date 2018/11/22
+ * @version
+ */
+
+$(document).ready(() => {
+    // tab切换
+    $('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
+        const tab = $(this).attr('aria-controls');
+        $('.show_title').hide();
+        $('#'+ tab +'_title').show();
+    })
+});

File diff suppressed because it is too large
+ 7 - 0
app/public/js/toastr.min.js


+ 3 - 0
app/router.js

@@ -107,6 +107,9 @@ module.exports = app => {
     app.get('/tender/:id/change/:cid/bills', sessionAuth, 'changeController.bills');
     app.get('/tender/:id/change/:cid/file', sessionAuth, 'changeController.file');
 
+    // 变更单位管理
+    app.post('/change/update/company', sessionAuth, 'changeController.updateCompany');
+
     // 个人账号相关
     app.get('/profile/info', sessionAuth, 'profileController.info');
     app.post('/profile/save', sessionAuth, 'profileController.saveBase');

+ 203 - 13
app/service/change.js

@@ -23,25 +23,110 @@ module.exports = app => {
             this.tableName = 'change';
         }
 
+        /**
+         * 查找数据
+         *
+         * @param {Object} data - 筛选表单中的get数据
+         * @return {void}
+         */
+        searchFilter(data) {
+            this.initSqlBuilder();
+            // this.sqlBuilder.columns = ['id', 'username', 'real_name', 'create_time', 'last_login', 'login_ip',
+            //     'group_id', 'token', 'can_login'];
+
+            data.type = parseInt(data.status);
+            if (data.keyword !== undefined) {
+                switch (data.type) {
+                    // 用户名
+                    case 1:
+                        this.sqlBuilder.setAndWhere('username', {
+                            value: this.db.escape(data.keyword + '%'),
+                            operate: 'like',
+                        });
+                        break;
+                    // 姓名
+                    case 2:
+                        this.sqlBuilder.setAndWhere('real_name', {
+                            value: this.db.escape(data.keyword + '%'),
+                            operate: 'like',
+                        });
+                        break;
+                    // 联系电话
+                    case 3:
+                        this.sqlBuilder.setAndWhere('telephone', {
+                            value: this.db.escape(data.keyword + '%'),
+                            operate: 'like',
+                        });
+                        break;
+                    default:
+                        break;
+                }
+            }
+
+            // 办事处筛选
+            if (data.office !== undefined && data.office !== '') {
+                this.sqlBuilder.setAndWhere('office', {
+                    value: this.db.escape(data.office),
+                    operate: '=',
+                });
+            }
+        }
+
         async add(tenderId, userId, code, name) {
             const count = await this.count({tid: tenderId, code: code});
             if (count > 0) {
                 throw '变更令号重复';
             }
 
-            const change = {
-                cid: this.uuid.v4(),
-                tid: tenderId,
-                uid: userId,
-                status: audit.flow.status.uncheck,
-                times: 1,
-                valid: true,
-                in_time: new Date(),
-                code: code,
-                name: name,
-            };
-            await this.db.insert(this.tableName, change);
-            return change;
+            // 初始化事务
+            this.transaction = await this.db.beginTransaction();
+            let result = false;
+            try {
+                let cid = this.uuid.v4();
+                const change = {
+                    cid: cid,
+                    tid: tenderId,
+                    uid: userId,
+                    status: audit.flow.status.uncheck,
+                    times: 1,
+                    valid: true,
+                    in_time: new Date(),
+                    code: code,
+                    name: name,
+                };
+                const operate = await this.transaction.insert(this.tableName, change);
+
+                if (operate.affectedRows <= 0) {
+                    throw '新建变更令数据失败';
+                }
+
+                // 把提交人信息添加到zh_change_audit
+                this.ctx.service.changeAudit.transaction = this.transaction;
+                const userInfo = await this.ctx.service.projectAccount.getDataById(userId);
+                const changeaudit = {
+                    tid: tenderId,
+                    cid: cid,
+                    uid: userId,
+                    name: userInfo.name,
+                    jobs: userInfo.role,
+                    company: userInfo.company,
+                    times: 1,
+                    usite: 0,
+                    usort: 0,
+                    status: 2
+                };
+
+                await this.transaction.insert(this.ctx.service.changeAudit.tableName, changeaudit);
+
+                result = change;
+                this.transaction.commit();
+            } catch (error) {
+                console.log(error);
+                // 回滚
+                await this.transaction.rollback();
+            }
+
+            return result;
         }
 
         async pendingDatas(tenderId, userId) {
@@ -91,6 +176,111 @@ module.exports = app => {
                 status: audit.flow.status.checkNo,
             });
         }
+
+
+        /**
+         * 获取变更令列表
+         * @param tenderId 标段id
+         * @param userId  创建者id
+         * @param status  状态
+         * @return {Promise.<void>}
+         */
+        async getListByStatus(tenderId, status = 0) {
+            let sql = '';
+            let sqlParam = '';
+            switch (status) {
+                case 0:
+                    // 包含你的所有变更令
+                    sql = 'SELECT a.* FROM ?? AS a WHERE a.tid = ? AND ' +
+                        '(a.uid = ? OR (a.status != 1 AND a.cid IN (SELECT b.cid FROM ?? AS b WHERE b.uid = ? GROUP BY b.cid)))';
+                    sqlParam = [this.tableName, tenderId, this.ctx.session.sessionUser.accountId,
+                        this.ctx.service.changeAudit.tableName, this.ctx.session.sessionUser.accountId];
+                    break;
+                case 1:
+                    // 待处理(你的)
+                    sql = 'SELECT * FROM ?? WHERE tid = ? AND uid = ? AND status = ?';
+                    sqlParam = [this.tableName, tenderId, this.ctx.session.sessionUser.accountId, status];
+                    break;
+                case 2:
+                    // 待上报(所有的)PS:取未上报和退回的变更令
+                    sql = 'SELECT a.* FROM ?? AS a WHERE ' +
+                        'a.cid IN (SELECT b.cid FROM ?? AS b WHERE b.uid = ? GROUP BY b.cid) AND ' +
+                        '(a.status = 1 OR a.status = 5) AND a.tid = ?';
+                    sqlParam = [this.tableName, this.ctx.service.changeAudit.tableName,
+                        this.ctx.session.sessionUser.accountId, tenderId];
+                    break;
+                case 3:
+                // 进行中(所有的)
+                case 4:
+                // 已完成(所有的)
+                case 5:
+                    // 终止(所有的)
+                    sql = 'SELECT a.* FROM ?? AS a WHERE ' +
+                        'a.cid IN (SELECT b.cid FROM ?? AS b WHERE b.uid = ? GROUP BY b.cid) AND ' +
+                        'a.status = ? AND a.tid = ?';
+                    sqlParam = [this.tableName, this.ctx.service.changeAudit.tableName,
+                        this.ctx.session.sessionUser.accountId, status, tenderId];
+                    break;
+                default:
+                    break;
+            }
+
+            const limit = this.app.config.pageSize;
+            const offset = limit * (this.ctx.page - 1);
+            const limitString = offset >= 0 ? offset + ',' + limit : limit;
+            sql += ' LIMIT ' + limitString;
+            const list = await this.db.query(sql, sqlParam);
+            return list;
+        }
+
+        /**
+         * 获取变更令个数
+         * @param tenderId 标段id
+         * @param userId  创建者id
+         * @param status  状态
+         * @return {Promise.<*>}
+         */
+        async getCountByStatus(tenderId, status) {
+            switch (status) {
+                case 0:
+                    // 包含你的所有变更令
+                    let sql = 'SELECT count(*) AS count FROM ?? AS a WHERE a.tid = ? AND ' +
+                        '(a.uid = ? OR a.cid IN (SELECT b.cid FROM ?? AS b WHERE b.uid = ? GROUP BY b.cid))';
+                    let sqlParam = [this.tableName, tenderId, this.ctx.session.sessionUser.accountId,
+                        this.ctx.service.changeAudit.tableName, this.ctx.session.sessionUser.accountId];
+                    let result = await this.db.query(sql, sqlParam);
+                    return result[0]['count'];
+                    break;
+                case 1:
+                    // 待处理(你的)
+                    return await this.count({
+                        tid: tenderId,
+                        uid: this.ctx.session.sessionUser.accountId,
+                        status: status,
+                    });
+                    break;
+                case 2:
+                    // 待上报(所有的)PS:取未上报和退回的变更令
+                    let sql2 = 'SELECT count(*) AS count FROM ?? AS a WHERE a.cid IN (SELECT b.cid FROM ?? AS b WHERE b.uid = ? GROUP BY b.cid) AND (a.status = 1 OR a.status = 5) AND a.tid = ?';
+                    let sqlParam2 = [this.tableName, this.ctx.service.changeAudit.tableName, this.ctx.session.sessionUser.accountId, tenderId];
+                    let result2 = await this.db.query(sql2, sqlParam2);
+                    return result2[0]['count'];
+                    break;
+                case 3:
+                    // 进行中(所有的)
+                case 4:
+                    // 已完成(所有的)
+                case 5:
+                    // 终止(所有的)
+                    let sql3 = 'SELECT count(*) AS count FROM ?? AS a WHERE a.cid IN (SELECT b.cid FROM ?? AS b WHERE b.uid = ? GROUP BY b.cid) AND a.status = ? AND a.tid = ?';
+                    let sqlParam3 = [this.tableName, this.ctx.service.changeAudit.tableName, this.ctx.session.sessionUser.accountId, status, tenderId];
+                    let result3 = await this.db.query(sql3, sqlParam3);
+                    return result3[0]['count'];
+                    break;
+                default:
+                    break;
+            }
+        }
     }
 
     return Change;

+ 106 - 0
app/service/change_audit.js

@@ -0,0 +1,106 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Mai
+ * @date 2018/8/14
+ * @version
+ */
+
+const audit = require('../const/audit');
+
+module.exports = app => {
+    class ChangeAudit extends app.BaseService {
+        /**
+         * 构造函数
+         *
+         * @param {Object} ctx - egg全局变量
+         * @return {void}
+         */
+        constructor(ctx) {
+            super(ctx);
+            this.tableName = 'change_audit';
+        }
+
+
+        /**
+         * 获取最后一位审批人
+         * @param cid
+         * @return {Promise.<void>}
+         */
+        async getLastUser(cid, times, site = 1) {
+            this.initSqlBuilder();
+            this.sqlBuilder.setAndWhere('cid', {
+                value: this.db.escape(cid),
+                operate: '=',
+            });
+            this.sqlBuilder.setAndWhere('times', {
+                value: times,
+                operate: '=',
+            });
+            this.sqlBuilder.setAndWhere('status', {
+                value: 1,
+                operate: '!=',
+            });
+            if (site === 0) {
+                this.sqlBuilder.setAndWhere('usite', {
+                    value: site,
+                    operate: '=',
+                });
+            }
+            this.sqlBuilder.orderBy = [['usort', 'DESC']];
+            const [sql, sqlParam] = this.sqlBuilder.build(this.tableName);
+            const data = await this.db.queryOne(sql, sqlParam);
+
+            return data;
+        }
+
+        /**
+         * 获取当前审批人查看info时的状态
+         * @param cid
+         * @param times
+         * @param status
+         * @return {Promise.<void>}
+         */
+        async getStatusByChange(change) {
+            const statusConst = audit.flow.status;
+            const auditStatusConst = audit.flow.auditStatus;
+            const uid = this.ctx.session.sessionUser.accountId;
+            const changeAuditInfo = (await this.getAllDataByCondition({where: { cid: change.cid, times: change.times, uid: uid}, order: ['id', 'DESC']}));
+
+            if (changeAuditInfo === null) {
+                // 无权限查看此变更令
+                return 0;
+            }
+
+            if (change.status === statusConst.uncheck && uid === change.uid) {
+                // 待上报
+                return 1;
+            } else if (change.status === statusConst.back && uid === change.uid) {
+                // 待重新上报
+                return 2;
+            } else if (change.status === statusConst.back && uid !== change.uid) {
+                // 被退回但你不是原报人
+                return 3;
+            } else if (change.status === statusConst.checked) {
+                // 已完成
+                return 4;
+            } else if (change.status === statusConst.checkNo) {
+                // 已终止
+                return 5;
+            } else if (change.status === statusConst.checking && changeAuditInfo.status === auditStatusConst.checking) {
+                // 待你审批
+                return 6;
+            } else if (change.status === statusConst.checking && changeAuditInfo.status !== auditStatusConst.checking) {
+                // 审批中但你未到你审批或你已审批
+                return 7;
+            } else {
+                // 无权限查看此变更令
+                return 0;
+            }
+        }
+    }
+
+    return ChangeAudit;
+};

+ 82 - 0
app/service/change_company.js

@@ -0,0 +1,82 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Mai
+ * @date 2018/8/14
+ * @version
+ */
+
+const audit = require('../const/audit');
+
+module.exports = app => {
+    class ChangeCompany extends app.BaseService {
+        /**
+         * 构造函数
+         *
+         * @param {Object} ctx - egg全局变量
+         * @return {void}
+         */
+        constructor(ctx) {
+            super(ctx);
+            this.tableName = 'change_company';
+        }
+
+        /**
+         * 队列修改和添加公司信息
+         * @param tenderId   标段id
+         * @param updateIdArray  更新的公司id
+         * @param updateArray   更新的公司名称
+         * @param addArray      添加的公司名称
+         * @return {Promise.<[*,*]>}  返回新增的公司列表,和替换下拉选择公司列表
+         */
+        async setCompanyList(data) {
+            const tenderId = parseInt(data.tid);
+            const updateIdArray = data.uci;
+            const updateArray = data.uc;
+            const addArray = data.ac;
+            let addCompany = new Array();
+            let selectCompany = new Array();
+            // 初始化事务
+            this.transaction = await this.db.beginTransaction();
+            try {
+                // 更新公司信息
+                if (updateIdArray.length !== 0) {
+                    for (let index in updateIdArray) {
+                        const updateData = {
+                            id: updateIdArray[index],
+                            name: updateArray[index],
+                        };
+                        await this.transaction.update(this.tableName, updateData);
+                        selectCompany.push(updateData);
+                    }
+                }
+
+                if (addArray.length !== 0) {
+                    for (let name of addArray) {
+                        const addData = {
+                            tid: tenderId,
+                            name: name,
+                        };
+                        const operate = await this.transaction.insert(this.tableName, addData);
+                        if (operate.affectedRows !== 1) {
+                            throw '提交数据失败';
+                        } else {
+                            selectCompany.push({id: operate.insertId, name: name});
+                            addCompany.push({id: operate.insertId, name: name});
+                        }
+                    }
+                }
+                this.transaction.commit();
+            } catch (error) {
+                console.log(error);
+                // 回滚
+                await this.transaction.rollback();
+            }
+            return [addCompany, selectCompany];
+        }
+    }
+
+    return ChangeCompany;
+};

+ 7 - 0
app/service/customer.js

@@ -74,6 +74,13 @@ module.exports = app => {
             const customerData = await this.db.get(this.tableName, { email: data.useremail });
             if (customerData !== null) {
                 // 存在则直接返回id
+                const updateData = {
+                    id: customerData.id,
+                    email: data.useremail,
+                    mobile: data.mobile,
+                    name: data.username,
+                };
+                await this.db.update(this.tableName, updateData);
                 return customerData.id;
             }
             const insertData = {

+ 39 - 60
app/view/change/index.ejs

@@ -1,19 +1,16 @@
+<% include ../tender/tender_sub_menu.ejs %>
 <div class="panel-content">
-    <div class="panel-title fluid">
+    <div class="panel-title">
         <div class="title-main d-flex justify-content-between">
             <div>
                 <div class="d-inline-block">
-                    <ul class="nav nav-pills m-0">
+                    <select class="form-control form-control-sm" id="status_select">
+                        <option value="0">全部</option>
                         <% for (const fs in filter.status) { %>
                         <% const f = filter.status[fs]; %>
-                        <li class="nav-item">
-                            <a class="nav-link <% if (f === status) { %>active<% } %>" href="/change/status/<%- f %>">
-                                <%- filter.statusString[f] %>
-                                <span class="badge badge-secondary"><%- filter.count[f] %></span>
-                            </a>
-                        </li>
+                        <option value="<%- f %>" <% if (f === status) { %>selected="selected"<% } %>><%- filter.statusString[f] %>(<%- filter.count[f] %>)</option>
                         <% } %>
-                    </ul>
+                    </select>
                 </div>
             </div>
             <div>
@@ -24,75 +21,57 @@
     </div>
     <div class="content-wrap">
         <div class="c-body">
-            <% if (status === filter.status.pending || status === filter.status.uncheck) { %>
+            <input id="tenderName" value="<%= tender.name %>" type="hidden">
+            <input id="tenderId" value="<%= tender.id %>" type="hidden">
             <table class="table">
                 <thead>
-                <tr><th width="10%">标段</th><th width="20%">变更令号</th><th width="30%">工程名称</th><th width="10%">变更类别</th><th width="10%">变更金额</th><th width="10%">操作</th></tr>
+                <tr>
+                    <th width="20%">变更令号</th><th width="30%">工程名称</th>
+                    <th width="10%">变更类别</th><th width="10%">变更金额</th>
+                    <th width="10%">审批状态</th><th>审批进度</th>
+                </tr>
                 </thead>
                 <tbody id="changeList">
                 <% for (const c of changes) { %>
                 <tr>
-                    <td><%- ctx.session.sessionUser.tenderName %></td>
-                    <td><a href="/change/<%- c.cid %>/info"><%- c.code %></a></td>
+                    <td><a href="change/<%- c.cid %>/info"><%- c.code %></a></td>
                     <td><%- c.name %></td>
                     <td><%- c.class %></td>
                     <td><%- c.total_price %></td>
+                    <% if (uid === c.changeAudit.uid && c.status === auditConst.status.uncheck) { %>
                     <td>
-                        <a href="/change/<%- c.cid %>/info" class="btn <% if (c.status === auditConst.status.checking) { %>btn-warning<% } %> btn-sm">
+                        <a href="change/<%- c.cid %>/info" class="btn <%- auditConst.statusButtonClass[c.status] %> btn-sm">
                             <%- auditConst.statusButton[c.status] %>
                         </a>
                     </td>
+                    <td>
+                        待上报
+                    </td>
+                    <% } else if (uid === c.changeAudit.uid) { %>
+                    <td>
+                        <a href="change/<%- c.cid %>/info" class="btn <%- auditConst.statusButtonClass[c.status] %> btn-sm">
+                            <%- auditConst.statusButton[c.status] %>
+                        </a>
+                    </td>
+                    <td>
+                        <%- c.changeAudit.name %>-<%- c.changeAudit.jobs %>
+                        <span class="<%- auditConst.auditStatusClass[c.changeAudit.status] %>"><%- auditConst.auditStatusString[c.changeAudit.status] %></span>
+                    </td>
+                    <% } else if (uid !== c.changeAudit.uid) { %>
+                    <td>
+                        <span class="<%- auditConst.statusClass[c.status] %>"><%- auditConst.statusString[c.status] %></span>
+                    </td>
+                    <td>
+                        <%- c.changeAudit.name %>-<%- c.changeAudit.jobs %>
+                        <span class="<%- auditConst.auditStatusClass[c.changeAudit.status] %>"><%- auditConst.auditStatusString[c.changeAudit.status] %></span>
+                    </td>
+                    <% } %>
                 </tr>
                 <% } %>
                 </tbody>
             </table>
-            <% } else if (status === filter.status.checking) { %>
-            <!--进行中-->
-            <table class="table">
-                <thead>
-                <tr><th width="10%">标段</th><th width="20%">变更令号</th><th width="30%">工程名称</th><th width="10%">变更类别</th><th width="10%">变更金额</th><th width="10%">审批流程</th></tr>
-                </thead>
-                <tbody>
-                <tr><td>LZTJ-1</td><td><a href="biangeng-list-detail.html">LZTJ-1标项目部发变更(2015)001号 (点我)</a></td><td>收费站出口右侧加宽段及K0+532基底换填</td><td>A类变更(设计变更)</td><td>101112.23</td><td>陈特 <span class="colOrange">审批中</span></td></tr>
-                <tr><td>LZTJ-1</td><td><a href="">LZTJ-1标项目部发变更(2015)002号</a></td><td>路基基底换填</td><td>A类变更(设计变更)</td><td>191991.32</td><td>陈特 <span class="colOrange">审批中</span></td></tr>
-                <tr><td>LZTJ-1</td><td><a href="">LZTJ-1标项目部发变更(2015)004号</a></td><td>土方运距</td><td>B类变更(施工措施变)</td><td>432664.96</td><td>陈特 <span class="colOrange">审批中</span></td></tr>
-                <tr><td>LZTJ-1</td><td><a href="">LZTJ-1标项目部发变更(2015)005号</a></td><td>K0+440通道台背回填</td><td>C类变更(计划变更)</td><td>136515.46</td><td>陈特 <span class="colOrange">审批中</span></td></tr>
-                </tbody>
-            </table>
-            <% } else if (status === filter.status.checked || status === filter.status.checkNo) { %>
-            <!--已完成-->
-            <table class="table">
-                <thead>
-                <tr><th width="10%">标段</th><th width="20%">变更令号</th><th width="30%">工程名称</th><th width="10%">变更类别</th><th width="10%">变更金额</th></tr>
-                </thead>
-                <tbody>
-                <tr><td>LZTJ-1</td><td><a href="biangeng-list-detail.html">LZTJ-1标项目部发变更(2015)001号 (点我)</a></td><td>收费站出口右侧加宽段及K0+532基底换填</td><td>A类变更(设计变更)</td><td>101112.23</td></tr>
-                <tr><td>LZTJ-1</td><td><a href="">LZTJ-1标项目部发变更(2015)002号</a></td><td>路基基底换填</td><td>A类变更(设计变更)</td><td>191991.32</td></tr>
-                <tr><td>LZTJ-1</td><td><a href="">LZTJ-1标项目部发变更(2015)004号</a></td><td>土方运距</td><td>B类变更(施工措施变)</td><td>432664.96</td></tr>
-                <tr><td>LZTJ-1</td><td><a href="">LZTJ-1标项目部发变更(2015)005号</a></td><td>K0+440通道台背回填</td><td>C类变更(计划变更)</td><td>136515.46</td></tr>
-                </tbody>
-            </table>
-            <% } %>
             <!--翻页-->
-            <nav aria-label="Page navigation">
-                <ul class="pagination">
-                    <li>
-                        <a href="#" aria-label="Previous">
-                            <span aria-hidden="true">«</span>
-                        </a>
-                    </li>
-                    <li><a href="#">1</a></li>
-                    <li><a href="#">2</a></li>
-                    <li><a href="#">3</a></li>
-                    <li><a href="#">4</a></li>
-                    <li><a href="#">5</a></li>
-                    <li>
-                        <a href="#" aria-label="Next">
-                            <span aria-hidden="true">»</span>
-                        </a>
-                    </li>
-                </ul>
-            </nav>
+            <% include ../layout/page.ejs %>
         </div>
     </div>
 </div>

File diff suppressed because it is too large
+ 242 - 18
app/view/change/info.ejs


+ 242 - 0
app/view/change/info_modal.ejs

@@ -0,0 +1,242 @@
+<% if (auditStatus === 1 || auditStatus === 2) { %>
+<!--变更单位-->
+<div class="modal fade" id="editcompany" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title" id="myModalLabel">变更单位</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 id="companyshow">
+                    <% for (const company of companyList) { %>
+                    <div class="form-group">
+                        <input type="text" id="<%= company.id %>" class="form-control" value="<%= company.name %>">
+                    </div>
+                    <% } %>
+                </div>
+                <div class="alert alert-warning" role="alert">修改后,已创建的变更不受影响。</div>
+                <p><button class="btn btn-primary btn-sm" id="addcompany" role="button" title="填写公司"><b class="fa fa-plus"></b></button></p>
+                <div id="companyadddiv">
+                    <!--<input type="text" class="form-control" placeholder="请输入公司名称">-->
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                <button type="button" id="updatecompany" class="btn btn-primary">确定</button>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="/public/js/change_company.js"></script>
+<% } %>
+
+<!--添加清单-->
+<div class="modal fade " tabindex="-1" role="dialog" aria-hidden="true" id="addlist">
+    <div class="modal-dialog modal-lg">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title" id="mySmallModalLabel">从清单中选择</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 style="height:400px;overflow-y:auto">
+                    <table class="table table-striped table-bordered table-condensed">
+                        <thead><tr><th>序号</th><th>清单编号</th><th>名称</th><th>单位</th><th>单价</th><th>选择</th></tr></thead>
+                        <tbody>
+                        <tr>
+                            <td>1</td>
+                            <td>202-1-1</td>
+                            <td>清理现场</td>
+                            <td>m2</td>
+                            <td>3.88</td>
+                            <td><input type="checkbox"></td>
+                        </tr>
+                        <tr class="table-success">
+                            <td>2</td>
+                            <td>204-1</td>
+                            <td>干处挖土方</td>
+                            <td>m3</td>
+                            <td>435</td>
+                            <td><input type="checkbox" checked></td>
+                        </tr>
+                        <tr class="table-success">
+                            <td>3</td>
+                            <td>202-1-1</td>
+                            <td>清理现场</td>
+                            <td>m2</td>
+                            <td>3.88</td>
+                            <td><input type="checkbox" checked></td>
+                        </tr>
+                        <tr>
+                            <td>4</td>
+                            <td>204-1</td>
+                            <td>干处挖土方</td>
+                            <td>m3</td>
+                            <td>435</td>
+                            <td><input type="checkbox"></td>
+                        </tr>
+                        <tr>
+                            <td>5</td>
+                            <td>202-1-1</td>
+                            <td>清理现场</td>
+                            <td>m2</td>
+                            <td>3.88</td>
+                            <td><input type="checkbox"></td>
+                        </tr>
+                        <tr>
+                            <td>6</td>
+                            <td>204-1</td>
+                            <td>干处挖土方</td>
+                            <td>m3</td>
+                            <td>435</td>
+                            <td><input type="checkbox"></td>
+                        </tr>
+                        <tr>
+                            <td>7</td>
+                            <td>202-1-1</td>
+                            <td>清理现场</td>
+                            <td>m2</td>
+                            <td>3.88</td>
+                            <td><input type="checkbox"></td>
+                        </tr>
+                        <tr>
+                            <td>8</td>
+                            <td>204-1</td>
+                            <td>干处挖土方</td>
+                            <td>m3</td>
+                            <td>435</td>
+                            <td><input type="checkbox"></td>
+                        </tr>
+                        <tr>
+                            <td>9</td>
+                            <td>202-1-1</td>
+                            <td>清理现场</td>
+                            <td>m2</td>
+                            <td>3.88</td>
+                            <td><input type="checkbox"></td>
+                        </tr>
+                        <tr>
+                            <td>10</td>
+                            <td>204-1</td>
+                            <td>干处挖土方</td>
+                            <td>m3</td>
+                            <td>435</td>
+                            <td><input type="checkbox"></td>
+                        </tr><tr>
+                            <td>11</td>
+                            <td>202-1-1</td>
+                            <td>清理现场</td>
+                            <td>m2</td>
+                            <td>3.88</td>
+                            <td><input type="checkbox"></td>
+                        </tr>
+                        <tr>
+                            <td>12</td>
+                            <td>204-1</td>
+                            <td>干处挖土方</td>
+                            <td>m3</td>
+                            <td>435</td>
+                            <td><input type="checkbox"></td>
+                        </tr>
+                        <tr>
+                            <td>13</td>
+                            <td>202-1-1</td>
+                            <td>清理现场</td>
+                            <td>m2</td>
+                            <td>3.88</td>
+                            <td><input type="checkbox"></td>
+                        </tr>
+                        <tr>
+                            <td>14</td>
+                            <td>204-1</td>
+                            <td>干处挖土方</td>
+                            <td>m3</td>
+                            <td>435</td>
+                            <td><input type="checkbox"></td>
+                        </tr>
+                        <tr>
+                            <td>15</td>
+                            <td>202-1-1</td>
+                            <td>清理现场</td>
+                            <td>m2</td>
+                            <td>3.88</td>
+                            <td><input type="checkbox"></td>
+                        </tr>
+                        <tr>
+                            <td>16</td>
+                            <td>204-1</td>
+                            <td>干处挖土方</td>
+                            <td>m3</td>
+                            <td>435</td>
+                            <td><input type="checkbox"></td>
+                        </tr>
+                        <tr>
+                            <td>17</td>
+                            <td>202-1-1</td>
+                            <td>清理现场</td>
+                            <td>m2</td>
+                            <td>3.88</td>
+                            <td><input type="checkbox"></td>
+                        </tr>
+                        <tr>
+                            <td>18</td>
+                            <td>204-1</td>
+                            <td>干处挖土方</td>
+                            <td>m3</td>
+                            <td>435</td>
+                            <td><input type="checkbox"></td>
+                        </tr>
+                        <tr>
+                            <td>19</td>
+                            <td>202-1-1</td>
+                            <td>清理现场</td>
+                            <td>m2</td>
+                            <td>3.88</td>
+                            <td><input type="checkbox"></td>
+                        </tr>
+                        <tr>
+                            <td>20</td>
+                            <td>204-1</td>
+                            <td>干处挖土方</td>
+                            <td>m3</td>
+                            <td>435</td>
+                            <td><input type="checkbox"></td>
+                        </tr>
+                        </tbody>
+                    </table>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                <button type="button" class="btn btn-primary">添加</button>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!--添加附件-->
+<div class="modal fade" tabindex="-1" role="dialog" aria-hidden="true" id="addfujian">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title" id="myModalLabel">上传附件</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <p>上传文件大小最大:10MB</p>
+                <p><a href="" class="btn btn-primary">选择文件</a></p>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                <button type="button" class="btn btn-primary">添加</button>
+            </div>
+        </div>
+    </div>
+</div>

+ 91 - 0
app/view/layout/page.ejs

@@ -0,0 +1,91 @@
+<nav aria-label="Page navigation example">
+    <ul class="pagination"></ul>
+</nav>
+<script type="text/javascript" src="/public/js/bootstrap/bootstrap-paginator.js"></script>
+<script type="text/javascript">
+    let options = {
+        bootstrapMajorVersion: 4,
+        currentPage: "<%= pageInfo.page %>",
+        totalPages: "<%= pageInfo.total %>",
+        size: "normal",
+        itemContainerClass: function(type, page, current) {
+            let className = 'page-item';
+            this.currentPage = parseInt(this.currentPage);
+            this.totalPages = parseInt(this.totalPages);
+
+            switch (type) {
+                case "prev":
+                    className = this.currentPage === 1 ? className + ' disabled' : className;
+                    break;
+                case "next":
+                    className = this.currentPage === this.totalPages ? className + ' disabled' : className;
+                    break;
+                case "page":
+                    className = page === this.currentPage ? className + ' active' : className;
+                    break;
+            }
+
+            return className;
+        },
+        itemContentClass: function(type, page, current) {
+            return 'page-link';
+        },
+        itemTexts: function(type, page, current) {
+            switch (type) {
+                case "first":
+                    return "&laquo;";
+                case "prev":
+                    return "上一页";
+                case "next":
+                    return "下一页";
+                case "last":
+                    return "最后一页";
+                case "page":
+                    return page;
+            }
+        },
+        shouldShowPage: function (type, page, current) {
+            let result = true;
+            switch (type) {
+                case "first":
+                    result = (current !== 1);
+                    break;
+                case "prev":
+                    break;
+                case "next":
+                    break;
+                case "last":
+                    result = false;
+                    break;
+                case "page":
+                    result = true;
+                    break;
+            }
+            return result;
+
+        },
+        pageUrl: function(type, page, current){
+            let queryData = JSON.parse('<%- pageInfo.queryData %>');
+            // 如果没有附带查询条件则直接返回
+            if (Object.keys(queryData).length <= 0) {
+                return "?page=" + page;
+            }
+            // 有其它数据则重新赋值page,然后组合字符串
+            queryData.page = page;
+            let queryArray = [];
+            for(let tmp in queryData) {
+                let tempString = tmp + '=' + queryData[tmp];
+                queryArray.push(tempString);
+            }
+
+            let firstQuery = queryArray.shift();
+            let queryString = queryArray.join('&');
+            return  queryString === '' ? '?' + firstQuery : '?' + firstQuery + '&' + queryString;
+        }
+    };
+    if (options.totalPages > 0) {
+        $(".pagination").bootstrapPaginator(options);
+    } else {
+        $(".pagination").hide();
+    }
+</script>

+ 1 - 1
config/config.default.js

@@ -54,7 +54,7 @@ module.exports = appInfo => {
     config.pageSize = 15;
 
     // 中间件
-    config.middleware = ['urlParse', 'autoLogger'];
+    config.middleware = ['urlParse', 'sortFilter', 'autoLogger'];
 
     // session配置
     config.session = {