Browse Source

Merge branch 'dev' of http://192.168.1.41:3000/maixinrong/Calculation into dev

laiguoran 4 years ago
parent
commit
0d0312a403

+ 1 - 0
app/const/account_permission.js

@@ -28,6 +28,7 @@ const permission = {
         children: [
             { title: '创建标段', value: 1 },
             { title: '查阅所有标段', value: 2 },
+            { title: '维护签约清单', value: 3, hint: '开启该选项,台帐审批通过后,可上传签约清单', hintIcon: 'fa-question-circle' },
         ],
     },
     // cooperation: {

+ 21 - 4
app/controller/deal_bills_controller.js

@@ -19,6 +19,7 @@ const loadExcelType = {
 };
 const loadType = loadExcelType.display;
 const auditConst = require('../const/audit').ledger;
+const permissionConst = require('../const/account_permission');
 
 module.exports = app => {
     class DealBillsController extends app.BaseController {
@@ -48,6 +49,24 @@ module.exports = app => {
             ctx.body = responseData;
         }
 
+        async checkPermisision(ctx) {
+            if (!ctx.tender.data) throw '标段数据错误';
+
+            const tender = ctx.tender.data;
+            const isUser = tender.user_id === this.ctx.session.sessionUser.accountId;
+            const auditors = await this.service.ledgerAudit.getAuditors(tender.id, tender.ledger_times);
+            const auditorsId = this.ctx.helper._.map(auditors, 'audit_id');
+            const isAuditor  = auditorsId.indexOf(this.ctx.session.sessionUser.accountId) >= 0;
+            const upPermision = this.ctx.session.sessionUser.permission
+                ? this.ctx.session.sessionUser.permission.tender.indexOf('3') >= 0
+                : false;
+            if (!(((tender.ledger_status === auditConst.status.uncheck || tender.ledger_status === auditConst.status.checkNo) && isUser) ||
+                (tender.ledger_status === auditConst.status.checking && isAuditor) ||
+                (tender.ledger_status === auditConst.status.checked && isAuditor && upPermision))) {
+                throw '您无权进行该操作';
+            }
+        }
+
         /**
          * 导入Excel数据
          * @param ctx
@@ -56,6 +75,7 @@ module.exports = app => {
         async loadExcel(ctx) {
             let stream;
             try {
+                await this.checkPermisision(ctx);
                 stream = await ctx.getFileStream();
                 const create_time = Date.parse(new Date()) / 1000;
                 const fileInfo = path.parse(stream.filename);
@@ -165,10 +185,7 @@ module.exports = app => {
          */
         async update(ctx) {
             try {
-                if (!ctx.tender.data) throw '标段数据错误';
-                if (ctx.tender.data.user_id !== ctx.session.sessionUser.accountId ||
-                    (ctx.tender.ledger_status === auditConst.status.checking || ctx.tender.ledger_status === auditConst.status.checked))
-                    throw '您无权进行该操作';
+                await this.checkPermisision(ctx);
                 const data = JSON.parse(ctx.request.body.data);
                 const result = await ctx.service.dealBills.updateDatas(data);
                 ctx.body = { err: 0, msg: '', data: result };

+ 13 - 1
app/controller/ledger_controller.js

@@ -56,6 +56,18 @@ module.exports = app => {
                 (tender.ledger_status === auditConst.status.checking || tender.ledger_status === auditConst.status.checked);
         }
 
+        _canUpdateDealBills(tender, auditors) {
+            const isUser = tender.user_id === this.ctx.session.sessionUser.accountId;
+            const auditorsId = this.ctx.helper._.map(auditors, 'audit_id');
+            const isAuditor  = auditorsId.indexOf(this.ctx.session.sessionUser.accountId) >= 0;
+            const upPermission = this.ctx.session.sessionUser.permission
+                ? this.ctx.session.sessionUser.permission.tender.indexOf('3') >= 0
+                : false;
+            return ((tender.ledger_status === auditConst.status.uncheck || tender.ledger_status === auditConst.status.checkNo) && isUser) ||
+                (tender.ledger_status === auditConst.status.checking && isAuditor) ||
+                (tender.ledger_status === auditConst.status.checked && isAuditor && upPermission);
+        }
+
         /**
          * 获取SpreadSetting
          * @private
@@ -145,6 +157,7 @@ module.exports = app => {
                     jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.ledger.explode),
                     stdBills,
                     stdChapters,
+                    dealBillsPermission: this._canUpdateDealBills(tender.data, auditors.filter(x => {return x.audit_order > 0}))
                 };
                 if ((tender.data.ledger_status === auditConst.status.uncheck || tender.data.ledger_status === auditConst.status.checkNo) && tender.data.user_id === ctx.session.sessionUser.accountId) {
                     // renderData.accountGroup = accountGroup;
@@ -615,7 +628,6 @@ module.exports = app => {
                         fileName = path.join(this.app.baseDir, 'app', 'public', 'files', 'template', 'ledger', '导入分项清单EXCEL格式.xls');
                         ctx.body = await fs.readFileSync(fileName);
                     } else if (file === '台账分解.xlsx') {
-                        console.log(file);
                         const create_time = Date.parse(new Date()) / 1000;
                         fileName = this.app.baseDir + '/app/public/files/ledger' + ctx.tender.id + '-' + create_time + '.xlsx';
                         const exportor = new exportExcel.exportLedger2Excel(ctx);

+ 1 - 1
app/controller/material_controller.js

@@ -1005,7 +1005,7 @@ module.exports = app => {
                 const zipFilename = `${ctx.tender.data.name}-材料调差-${ctx.params.order}-附件.zip`;
                 const time = Date.now();
                 const zipPath = `app/public/upload/${ctx.tender.id}/tc/fu_jian_zip${time}.zip`;
-                const size = await ctx.service.stageAtt.compressedFile(fileIds, zipPath);
+                const size = await ctx.service.materialFile.compressedFile(fileIds, zipPath);
 
                 // 解决中文无法下载问题
                 const userAgent = (ctx.request.header['user-agent'] || '').toLowerCase();

+ 1 - 1
app/controller/revise_controller.js

@@ -526,7 +526,7 @@ module.exports = app => {
                 const data = JSON.parse(ctx.request.body.data);
                 if (!data || !data.rid || data.rid === '') throw '查询的台账修订有误';
                 const reviseInfo = await ctx.service.ledgerRevise.getRevise(ctx.tender.id, data.rid);
-                reviseInfo.end_time_str = reviseInfo.end_time ? reviseInfo.end_time.toLocaleString() : '';
+                reviseInfo.end_time_str = reviseInfo.end_time ? ctx.moment(reviseInfo.end_time).format('YYYY-MM-DD hh:mm:ss') : '';
                 ctx.body = { err: 0, msg: '', data: reviseInfo };
             } catch (err) {
                 this.log(err);

+ 2 - 0
app/controller/tender_controller.js

@@ -425,8 +425,10 @@ module.exports = app => {
                     p.end_tp = sum;
                     p.end_ratio = ctx.helper.mul(ctx.helper.div(p.end_tp, tender.sum, 4), 100);
                 }
+                const revise = await ctx.service.ledgerRevise.getLastestRevise(tender.id);
                 const renderData = {
                     tender,
+                    revise,
                     tenderInfo: ctx.tender.info,
                     tenderMenu: this.menu.tenderMenu,
                     preUrl: '/tender/' + ctx.tender.id,

+ 15 - 0
app/extend/context.js

@@ -0,0 +1,15 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Mai
+ * @date
+ * @version
+ */
+
+const moment = require('moment');
+
+module.exports = {
+    moment: moment,
+};

+ 1 - 1
app/public/js/ledger.js

@@ -706,8 +706,8 @@ $(document).ready(function() {
                                 const exprInfo = getExprInfo(colSetting.field);
                                 if (exprInfo) {
                                     data[exprInfo.expr] = value;
+                                    bPaste = true;
                                 }
-                                bPaste = true;
                             } catch(err) {
                                 toastMessageUniq(hint.invalidExpr);
                             }

+ 1 - 1
app/public/report/js/rpt_custom.js

@@ -360,7 +360,7 @@ const rptCustomObj = (function () {
 
     const resetAuditSelect = function () {
         const selObj = $('select', '#audit-select-list');
-        const data = { audit_select: [] };
+        const data = { audit_select: [], closeWatermark: getCloseWatermark() };
         getCommonParams(data);
         for (const s of selObj) {
             const sf = stageFlow[s.selectedIndex];

+ 53 - 5
app/reports/rpt_component/jpc_flow_tab.js

@@ -15,6 +15,7 @@ const fsUtil = require('../public/fsUtil');
 const strUtil = require('../public/stringUtil');
 const fontWidthMap = require('./helper/jpc_helper_font_width');
 const bc = require('../../lib/base_calc.js');
+const SEG_PAGE_SPLIT_STR = '`';
 
 const JpcFlowTabSrv = function() {};
 JpcFlowTabSrv.prototype.createNew = function() {
@@ -184,6 +185,8 @@ JpcFlowTabSrv.prototype.createNew = function() {
         me.signatureRst = [];
         me.signatureDateRst = [];
         me.signatureAuditRst = [];
+
+        me.hasBreakFlowArr = [];
     };
     JpcFlowTabResult.sorting = function(rptTpl, dataObj, dataSeq, $CURRENT_RPT) {
         const me = this;
@@ -515,13 +518,42 @@ JpcFlowTabSrv.prototype.createNew = function() {
             followTabEx.setupGroupingData(rptTpl, dataObj, $CURRENT_RPT);
         }
         me.sumSeg(dataObj, $CURRENT_RPT); // 考虑到实际会有离散指标的汇总,这些离散指标数据是通过计算式后得来的,这种情况下,不适宜在sorting阶段进行汇总统计,现统一挪到这里处理
+        // const _chkHasBreakFlow = function(segIdx, pageIdx) {
+        //     if (rptTpl[JV.NODE_FLOW_INFO][JV.NODE_DISCRETE_INFO]) {
+        //         for (const discrete of rptTpl[JV.NODE_FLOW_INFO][JV.NODE_DISCRETE_INFO]) {
+        //             if (discrete[JV.PROP_DISCRETE_FIELDS] && discrete[JV.PROP_DISCRETE_FIELDS].length > 0) {
+        //                 for (const df of discrete[JV.PROP_DISCRETE_FIELDS]) {
+        //                     const map_data_field = JE.F(df[JV.PROP_FIELD_ID], $CURRENT_RPT);
+        //                     if (map_data_field) {
+        //                         const val = JE.getFieldValue(map_data_field, dataObj, segIdx, '');
+        //                         if (typeof val === 'string') {
+        //                             if (val.indexOf(SEG_PAGE_SPLIT_STR) >= 0) {
+        //                                 me.hasBreakFlowArr[pageIdx][0] = true;
+        //                                 break;
+        //                             }
+        //                         }
+        //                     }
+        //                     if (me.hasBreakFlowArr[pageIdx][0]) break;
+        //                 }
+        //             }
+        //             if (me.hasBreakFlowArr[pageIdx][0]) break;
+        //         }
+        //     }
+        // };
         const bands = JpcBand.createNew(rptTpl, defProperties);
         if (me.paging_option === JV.PAGING_OPTION_INFINITY) {
             rst = me.segments.length;
-            // const pageStatus = [true, true, false, true, true, true, false, false];
             const pageStatus = [true, true, false, true, true, true, true, true];
             const grpPageInfo = {};
+            let pageIdx = 0;
             for (let segIdx = 0; segIdx < me.segments.length; segIdx++) {
+                /*
+                me.hasBreakFlowArr[pageIdx] = [];
+                me.hasBreakFlowArr[pageIdx][0] = false;
+                me.hasBreakFlowArr[pageIdx][1] = segIdx;
+                _chkHasBreakFlow(segIdx, pageIdx);
+                //*/
+                // 备注:有break flow的情况下 连续输出 要考虑段(seg)的多页输出问题
                 if (segIdx === me.segments.length - 1) {
                     pageStatus[JV.STATUS_REPORT_END] = true;
                 }
@@ -546,6 +578,23 @@ JpcFlowTabSrv.prototype.createNew = function() {
                 me.pageStatusLst.push(pageStatus.slice(0));
                 pageIdx++;
                 const rowAmt = Math.max(maxRowRec, me.segments[segIdx].length + adHocAutoHeightAmt);
+                /*
+                if (me.hasBreakFlowArr[pageIdx][0]) {
+                    let accAmt = 0;
+                    rowAmt = maxRowRec;
+                    while (accAmt < me.segments[segIdx].length + adHocAutoHeightAmt) {
+                        me.hasBreakFlowArr[pageIdx][0] = true;
+                        me.hasBreakFlowArr[pageIdx][1] = segIdx;
+                        private_addPageValue(me.dispValueIdxLst, me.segments[segIdx], grpSeqInfo, 0, rowAmt, me.page_seg_map, segIdx, pageIdx, grpPageInfo, false, me.auto_height_info, 0);
+                        pageIdx++;
+                        accAmt += maxRowRec;
+                        // remark: 需要再细化
+                    }
+                } else {
+                    private_addPageValue(me.dispValueIdxLst, me.segments[segIdx], grpSeqInfo, 0, rowAmt, me.page_seg_map, segIdx, pageIdx, grpPageInfo, false, me.auto_height_info, 0);
+                    pageIdx++;
+                }
+                //*/
                 private_addPageValue(me.dispValueIdxLst, me.segments[segIdx], grpSeqInfo, 0, rowAmt, me.page_seg_map, segIdx, pageIdx, grpPageInfo, false, me.auto_height_info, 0);
             }
             // 目前不支持flowTabEx
@@ -827,11 +876,10 @@ JpcFlowTabSrv.prototype.createNew = function() {
                 }
             }
             const rowAmt = Math.max(maxRowRec, me.segments[segIdx].length + adHocAutoHeightAmt); // 如不满一页,则需要填充满一页
+            // if (me.hasBreakFlowArr[segIdx]) {
+            //     rowAmt = maxRowRec;
+            // }
             const actH = JpcFlowTabHelper.getActualContentAreaHeight(bands, rptTpl, me.segments, rowAmt, page, me.isEx);
-            // console.log('page:' + page);
-            // console.log('maxRowRec:' + maxRowRec);
-            // console.log('me.segments[segIdx].length:' + me.segments[segIdx].length);
-            // console.log('actH:' + actH);
             const offsetY = actH - (flowContentBand.Bottom - flowContentBand.Top);
             JpcBandHelper.resetBandPos(rptTpl[JV.NODE_BAND_COLLECTION], bands, flowContentBand, 0, offsetY);
             // 2.1 Content-Tab

+ 10 - 0
app/service/revise_pos.js

@@ -52,6 +52,16 @@ module.exports = app => {
             });
         }
 
+        async getPosDataByUnits(tenderId, units) {
+            const sql = 'SELECT p.id, p.lid, p.sgfh_qty, p.sjcl_qty, p.qtcl_qty' +
+                '  FROM ' + this.tableName + ' p' +
+                '  LEFT JOIN ' + this.ctx.service.reviseBills.tableName + ' b' +
+                '  ON p.lid = b.id ' +
+                '  WHERE p.tid = ? and b.unit IN (?)';
+            const sqlParam = [tenderId, units];
+            return await this.db.query(sql, sqlParam);
+        }
+
         async insertLedgerPosData(transaction, tid, rid, bills, data) {
             const precision = this.ctx.helper.findPrecision(this.ctx.tender.info.precision, bills.unit);
             const insertDatas = [];

+ 24 - 9
app/service/tender_info.js

@@ -13,6 +13,9 @@ const parseInfo = infoConst.parseInfo;
 const arrayInfo = infoConst.arrayInfo;
 const defaultInfo = infoConst.defaultInfo;
 const advanceConst = require('../const/audit').advance;
+const auditConst = require('../const/audit');
+
+
 module.exports = app => {
 
     class TenderInfo extends app.BaseService {
@@ -143,12 +146,21 @@ module.exports = app => {
             }
             changeUnits = this._.flatten(changeUnits);
 
+            let billsService, posService;
+            if (this.ctx.tender.data.status === auditConst.ledger.status.checked) {
+                billsService = this.ctx.service.ledger;
+                posService = this.ctx.service.pos;
+            } else {
+                billsService = this.ctx.service.reviseBills;
+                posService = this.ctx.service.revisePos;
+            }
+
             if (changeUnits.length > 0) {
-                const bills = await this.ctx.service.ledger.getAllDataByCondition({
+                const bills = await billsService.getAllDataByCondition({
                     columns: ['id', 'unit', 'unit_price', 'sgfh_qty', 'sjcl_qty', 'qtcl_qty', 'deal_qty'],
                     where: { tender_id: tenderId, unit: changeUnits, is_leaf: true },
                 });
-                const pos = changeUnits.length > 0 ? await this.ctx.service.pos.getPosDataByUnits(tenderId, changeUnits) : [];
+                const pos = changeUnits.length > 0 ? await posService.getPosDataByUnits(tenderId, changeUnits) : [];
 
                 for (const b of bills) {
                     const precision = this.ctx.helper.findPrecision(newPrecision, b.unit);
@@ -185,8 +197,8 @@ module.exports = app => {
                 try {
                     await transaction.update(this.tableName,
                         { precision: JSON.stringify(newPrecision) }, { where: { tid: tenderId } });
-                    if (bills.length > 0) await transaction.updateRows(this.ctx.service.ledger.tableName, bills);
-                    if (pos.length > 0) await transaction.updateRows(this.ctx.service.pos.tableName, pos);
+                    if (bills.length > 0) await transaction.updateRows(billsService.tableName, bills);
+                    if (pos.length > 0) await transaction.updateRows(posService.tableName, pos);
                     await transaction.commit();
                 } catch (err) {
                     await transaction.rollback();
@@ -198,11 +210,11 @@ module.exports = app => {
             }
         }
 
-        async _reCalcLedger(tenderId, newDecimal, oldDecimal) {
+        async _reCalcLedger(tenderId, billsService, newDecimal, oldDecimal) {
             const changeBills = [];
             const calcUp = newDecimal.up < oldDecimal.up, calcTp = newDecimal.tp !== oldDecimal.tp;
             if (calcUp || calcTp) {
-                const bills = await this.ctx.service.ledger.getAllDataByCondition({
+                const bills = await billsService.getAllDataByCondition({
                     columns: ['id', 'unit_price', 'sgfh_qty', 'sjcl_qty', 'qtcl_qty', 'deal_qty', 'quantity'],
                     where: { tender_id: tenderId, is_leaf: true },
                 });
@@ -227,7 +239,6 @@ module.exports = app => {
             const upDecimal = newDecimal.up, tpDecimal = newDecimal.extra ? newDecimal.extraTp : newDecimal.tp;
             const calcUp = upDecimal < oldDecimal.up,
                 calcTp = tpDecimal < (oldDecimal.extra ? oldDecimal.extraTp : oldDecimal.tp);
-            console.log(calcUp, calcTp);
 
             if (calcUp || calcTp) {
                 const stageJgcl = await this.ctx.service.stageJgcl.getAllDataByCondition({
@@ -281,7 +292,11 @@ module.exports = app => {
                     changeAdvanceBills.push(cb);
                 }
             }
-            const changeBills = await this._reCalcLedger(tenderId, newDecimal, oldDecimal);
+
+            const billsService = this.ctx.tender.data.status === auditConst.ledger.status.checked
+                ? this.ctx.service.ledger
+                : this.ctx.service.reviseBills;
+            const changeBills = await this._reCalcLedger(tenderId, billsService, newDecimal, oldDecimal);
             const [changeSj, changeSb, changeSo] = await this._reCalcStageExtra(tenderId, newDecimal, oldDecimal);
             if (changeBills.length > 0 ||
                 changeAdvanceBills.length > 0 ||
@@ -290,7 +305,7 @@ module.exports = app => {
                 try {
                     await transaction.update(this.tableName,
                         { decimal: JSON.stringify(newDecimal) }, { where: { tid: tenderId } });
-                    if (changeBills.length > 0) await transaction.updateRows(this.ctx.service.ledger.tableName, changeBills);
+                    if (changeBills.length > 0) await transaction.updateRows(billsService.tableName, changeBills);
                     if (changeSj.length > 0) await transaction.updateRows(this.ctx.service.stageJgcl.tableName, changeSj);
                     if (changeSb.length > 0) await transaction.updateRows(this.ctx.service.stageBonus.tableName, changeSb);
                     if (changeSo.length > 0) await transaction.updateRows(this.ctx.service.stageOther.tableName, changeSo);

+ 3 - 5
app/view/change/info.ejs

@@ -152,14 +152,12 @@
                 </div>
             </div>
             <div id="files_title" class="show_title" style="line-height:34px;display: none">
-                <% if (auditStatus === 1 || auditStatus === 2 || auditStatus === 6) { %>
-                <!-- <a href="#addfujian" data-toggle="modal" class="btn btn-sm" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="添加清单">
-                    <i class="fa fa-cloud-upload" aria-hidden="true"></i> 上传附件
-                </a> -->
+                <!-- <% if (auditStatus === 1 || auditStatus === 2 || auditStatus === 6) { %>
                 <a href="#addfujian" data-toggle="modal" class="btn btn-sm btn-light text-primary" data-placement="bottom" title="" data-original-title="上传附件"><i class="fa fa-cloud-upload" aria-hidden="true"></i> 上传附件</a>
                 <% } else { %>
                 <h2 class="change-title">附件</h2>
-                <% } %>
+                <% } %> -->
+                <a href="#addfujian" data-toggle="modal" class="btn btn-sm btn-light text-primary" data-placement="bottom" title="" data-original-title="上传附件"><i class="fa fa-cloud-upload" aria-hidden="true"></i> 上传附件</a>
                 <a href="javascript: void(0);" data-toggle="modal" class="btn btn-sm btn-light text-primary" id="bach-download"><i class="fa fa-download "></i> 批量下载</a>
                 <a href="" id="downloadZip" style="display: none;" download></a>
             </div>

+ 10 - 10
app/view/dashboard/index.ejs

@@ -40,7 +40,7 @@
                                                         <div class="col-3 ml-auto text-right pl-0"><a href="/tender/<%- t.id %>/ledger/audit" class="btn btn-sm btn-outline-primary">审批</a></div>
                                                     </div>
                                                     <p class="mt-1 mb-0"><%- ctx.session.sessionUser.name %><small class="ml-1 text-muted"><%- (role ? '- ' + role : '') %></small>
-                                                        <span class="pull-right text-muted"><%- (t.begin_time ? t.begin_time.toLocaleString() : '') %></span>
+                                                        <span class="pull-right text-muted"><%- (t.begin_time ? ctx.moment(t.begin_time).format('YYYY-MM-DD hh:mm:ss') : '') %></span>
                                                     </p>
                                                 </div>
                                             </li>
@@ -53,7 +53,7 @@
                                                         <div class="col-3 ml-auto text-right pl-0"><a href="/tender/<%- t.id %>/ledger" class="btn btn-sm btn-outline-primary">重新上报</a></div>
                                                     </div>
                                                     <p class="mt-1 mb-0"><%- ctx.session.sessionUser.name %><small class="ml-1 text-muted"><%- (role ? '- ' + role : '') %></small>
-                                                        <span class="pull-right text-muted"><%- (t.end_time ? t.end_time.toLocaleString() : '') %></span>
+                                                        <span class="pull-right text-muted"><%- (t.end_time ? ctx.moment(t.end_time).format('YYYY-MM-DD hh:mm:ss') : '') %></span>
                                                     </p>
                                                 </div>
                                             </li>
@@ -68,7 +68,7 @@
                                                     <div class="col-3 ml-auto text-right pl-0"><a href="/tender/<%- revise.t_id %>/revise/info" class="btn btn-sm btn-outline-primary"><% if (revise.status === acRevise.status.checking) { %>审批<% } else if (revise.status === acRevise.status.checkNo) { %>重新上报<% } %></a></div>
                                                 </div>
                                                 <p class="mt-1 mb-0"><%- revise.audit_name %><small class="ml-1 text-muted"><%- (revise.audit_role ? '- ' + revise.audit_role: '') %></small>
-                                                    <span class="pull-right text-muted"><%- (revise.end_time ? revise.end_time.toLocaleString() : '') %></span>
+                                                    <span class="pull-right text-muted"><%- (revise.end_time ? ctx.moment(revise.end_time).format('YYYY-MM-DD hh:mm:ss') : '') %></span>
                                                 </p>
                                             </div>
                                         </li>
@@ -83,7 +83,7 @@
                                                         <div class="col-3 ml-auto text-right pl-0"><a href="/tender/<%- audit.tid %>/measure/stage/<%- audit.sorder %>" class="btn btn-sm btn-outline-primary"><% if (audit.sstatus === acStage.status.checkNoPre) { %>重新<% } %>审批</a></div>
                                                     </div>
                                                     <p class="mt-1 mb-0"><%- ctx.session.sessionUser.name %><small class="ml-1 text-muted"><%- (role ? '- ' + role : '') %></small>
-                                                        <span class="pull-right text-muted"><%- audit.begin_time.toLocaleString() %></span>
+                                                        <span class="pull-right text-muted"><%- ctx.moment(audit.begin_time).format('YYYY-MM-DD hh:mm:ss') %></span>
                                                     </p>
                                                 </div>
                                             </li>
@@ -96,7 +96,7 @@
                                                         <div class="col-3 ml-auto text-right pl-0"><a href="/tender/<%- audit.tid %>/measure/stage/<%- audit.sorder %>" class="btn btn-sm btn-outline-primary">重新上报</a></div>
                                                     </div>
                                                     <p class="mt-1 mb-0"><%- ctx.session.sessionUser.name %><small class="ml-1 text-muted"><%- (role ? '- ' + role : '') %></small>
-                                                        <span class="pull-right text-muted"><%- audit.end_time.toLocaleString() %></span>
+                                                        <span class="pull-right text-muted"><%- ctx.moment(audit.end_time).format('YYYY-MM-DD hh:mm:ss') %></span>
                                                     </p>
                                                 </div>
                                             </li>
@@ -111,7 +111,7 @@
                                                     <div class="col-3 ml-auto text-right pl-0"><a href="/tender/<%- change.tid %>/change/<%- change.cid %>/info" class="btn btn-sm btn-outline-primary"><% if (change.cstatus === acChange.status.checking) { %>审批<% } else if (change.cstatus === acChange.status.backnew) { %>重新审批<% } else { %>重新上报<% } %></a></div>
                                                 </div>
                                                 <p class="mt-1 mb-0"><%- change.caname %><small class="ml-1 text-muted"><%- (role ? '- ' + role : '') %></small>
-                                                    <span class="pull-right text-muted"><%- (change.sin_time ? change.sin_time.toLocaleString() : '') %></span>
+                                                    <span class="pull-right text-muted"><%- (change.sin_time ? ctx.moment(change.sin_time).format('YYYY-MM-DD hh:mm:ss') : '') %></span>
                                                 </p>
                                             </div>
                                         </li>
@@ -126,7 +126,7 @@
                                                         <div class="col-3 ml-auto text-right pl-0"><a href="/tender/<%- am.tid %>/measure/material/<%- am.morder %>" class="btn btn-sm btn-outline-primary">审批</a></div>
                                                     </div>
                                                     <p class="mt-1 mb-0"><%- ctx.session.sessionUser.name %><small class="ml-1 text-muted"><%- (role ? '- ' + role : '') %></small>
-                                                        <span class="pull-right text-muted"><%- am.begin_time.toLocaleString() %></span>
+                                                        <span class="pull-right text-muted"><%- ctx.moment(am.begin_time).format('YYYY-MM-DD hh:mm:ss') %></span>
                                                     </p>
                                                 </div>
                                             </li>
@@ -139,7 +139,7 @@
                                                         <div class="col-3 ml-auto text-right pl-0"><a href="/tender/<%- am.tid %>/measure/material/<%- am.morder %>" class="btn btn-sm btn-outline-primary">重新上报</a></div>
                                                     </div>
                                                     <p class="mt-1 mb-0"><%- ctx.session.sessionUser.name %><small class="ml-1 text-muted"><%- (role ? '- ' + role : '') %></small>
-                                                        <span class="pull-right text-muted"><%- am.end_time.toLocaleString() %></span>
+                                                        <span class="pull-right text-muted"><%- ctx.moment(am.end_time).format('YYYY-MM-DD hh:mm:ss') %></span>
                                                     </p>
                                                 </div>
                                             </li>
@@ -155,7 +155,7 @@
                                                         <div class="col-3 ml-auto text-right pl-0"><a href="/tender/<%- am.tid %>/advance/<%- am.vid %>/detail" class="btn btn-sm btn-outline-primary">审批</a></div>
                                                     </div>
                                                     <p class="mt-1 mb-0"><%- ctx.session.sessionUser.name %><small class="ml-1 text-muted"><%- (role ? '- ' + role : '') %></small>
-                                                        <span class="pull-right text-muted"><%- am.create_time.toLocaleString() %></span>
+                                                        <span class="pull-right text-muted"><%- ctx.moment(am.create_time).format('YYYY-MM-DD hh:mm:ss') %></span>
                                                     </p>
                                                 </div>
                                             </li>
@@ -168,7 +168,7 @@
                                                         <div class="col-3 ml-auto text-right pl-0"><a href="/tender/<%- am.tid %>/advance/<%- am.vid %>/detail" class="btn btn-sm btn-outline-primary">重新上报</a></div>
                                                     </div>
                                                     <p class="mt-1 mb-0"><%- ctx.session.sessionUser.name %><small class="ml-1 text-muted"><%- (role ? '- ' + role : '') %></small>
-                                                        <span class="pull-right text-muted"><%- am.end_time.toLocaleString() %></span>
+                                                        <span class="pull-right text-muted"><%- ctx.moment(am.end_time).format('YYYY-MM-DD hh:mm:ss') %></span>
                                                     </p>
                                                 </div>
                                             </li>

+ 4 - 0
app/view/ledger/explode.ejs

@@ -139,7 +139,11 @@
                     <div id="deal-bills" class="tab-pane">
                         <div class="sjs-bar-4">
                             <div class="pb-1">
+                                <% if (dealBillsPermission) { %>
                                 <a href="#upload-deal" data-toggle="modal" data-target="#upload-deal" class="btn btn-sm btn-primary">上传签约清单</a>
+                                <% } else { %>
+                                <a href="javascript: void(0);" class="btn btn-sm btn-outline-dark">上传签约清单</a>
+                                <% } %>
                                 <a href="/tender/<%- ctx.tender.id %>/deal/download/签约清单.xlsx" class="btn btn-sm btn-primary" style="display: none">下载签约清单</a>
                             </div>
                         </div>

+ 3 - 3
app/view/revise/history.ejs

@@ -22,7 +22,7 @@
                     </div>
                 </div>
                 <div class="d-inline-flex">
-                    <%- (revise.in_time ? revise.in_time.toLocaleString() : '') %>
+                    <%- (revise.in_time ? ctx.moment(revise.in_time).format('YYYY-MM-DD hh:mm:ss') : '') %>
                 </div>
             </div>
             <div class="ml-auto">
@@ -66,7 +66,7 @@
                                 <label >创建时间</label>
                                 <select class="form-control form-control-sm" id="reviseHistory">
                                     <% for (const hr of historyRevise) { %>
-                                    <option value="<%- hr.id %>"><%- hr.corder + '#' + (hr.in_time ? hr.in_time.toLocaleDateString() : '') + (hr.valid ? '' : '(作废)')%></option>
+                                    <option value="<%- hr.id %>"><%- hr.corder + '#' + (hr.in_time ? ctx.moment(hr.in_time).format('YYYY-MM-DD') : '') + (hr.valid ? '' : '(作废)')%></option>
                                     <% } %>
                                 </select>
                             </div>
@@ -81,7 +81,7 @@
                             </div>
                             <div class="form-group">
                                 <label >审批完成</label>
-                                <input id="end-time" type="" class="form-control form-control-sm" value="<%- (revise.end_time ? revise.end_time.toLocaleString() : '') %>" disabled>
+                                <input id="end-time" type="" class="form-control form-control-sm" value="<%- (revise.end_time ? ctx.moment(revise.end_time).format('YYYY-MM-DD hh:mm:ss') : '') %>" disabled>
                             </div>
                         </div>
                     </div>

+ 2 - 2
app/view/revise/index.ejs

@@ -40,7 +40,7 @@
                     <% for (const lr of ledgerRevise) { %>
                     <tr>
                         <td><%- lr.corder %></td>
-                        <td><%- lr.in_time ? lr.in_time.toLocaleDateString() : '' %></td>
+                        <td><%- lr.in_time ? ctx.moment(lr.in_time).format('YYYY-MM-DD') : '' %></td>
                         <td><%- lr.user_name %></td>
                         <% if (!lr.valid) {%>
                         <td class="text-danger">
@@ -54,7 +54,7 @@
                             <%- auditConst.auditProgress[lr.status] %>
                         </td>
                         <% } %>
-                        <td><%- lr.end_time ? lr.end_time.toLocaleDateString() : '' %></td>
+                        <td><%- lr.end_time ? ctx.moment(lr.end_time).format('YYYY-MM-DD') : '' %></td>
                         <td>
                             <% if (lr.valid) { %>
                             <% if (lr.status === auditConst.status.uncheck && lr.uid === ctx.session.sessionUser.accountId) { %>

+ 1 - 1
app/view/revise/info.ejs

@@ -124,7 +124,7 @@
                         <div class="sjs-sh" style="overflow:auto">
                             <div class="form-group mt-2">
                                 <label >创建时间</label>
-                                <input type="" class="form-control form-control-sm" value="<%- revise.in_time.toLocaleString() %>" disabled>
+                                <input type="" class="form-control form-control-sm" value="<%- ctx.moment(revise.in_time).format('YYYY-MM-DD hh:mm:ss') %>" disabled>
                             </div>
                             <div class="form-group mt-2">
                                 <label >提交人</label>

+ 3 - 0
app/view/setting/user_permission_modal.ejs

@@ -81,6 +81,9 @@
                         <div class="form-check form-check-inline">
                             <input class="form-check-input" type="<%= permission[pm].type %>" id="<%= pm %>_<%= ip.value %>" name="<%= pm %><% if (permission[pm].type === 'checkbox') { %>[]<% } %>" value="<%= ip.value %>">
                             <label class="form-check-label" for="<%= pm %>_<%= ip.value %>"><%= ip.title %></label>
+                            <% if (ip.hint && ip.hintIcon) { %>
+                            <a href="" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="<%- ip.hint%>"><i class="fa <%- ip.hintIcon%>"></i></a>
+                            <% } %>
                         </div>
                         <% } %>
                     </div>

+ 12 - 6
app/view/tender/detail_modal.ejs

@@ -284,8 +284,11 @@
     </div>
 </div>
 
-<% if (((tender.ledger_status === audit.ledger.status.uncheck || tender.ledger_status === audit.ledger.status.checkNo) && tender.user_id === ctx.session.sessionUser.accountId)
-        || (lastStage && lastStage.user_id === ctx.session.sessionUser.accountId && (lastStage.status === audit.stage.status.checkNo || lastStage.status === audit.stage.status.uncheck))) { %>
+<% if (
+    ((tender.ledger_status === audit.ledger.status.uncheck || tender.ledger_status === audit.ledger.status.checkNo) && tender.user_id === ctx.session.sessionUser.accountId) ||
+    (lastStage && lastStage.user_id === ctx.session.sessionUser.accountId && (lastStage.status === audit.stage.status.checkNo || lastStage.status === audit.stage.status.uncheck)) ||
+    (!lastStage && revise && revise.valid && (revise.status === audit.revise.status.uncheck || revise.status === audit.revise.status.checkNo) && tender.user_id === ctx.session.sessionUser.accountId)
+) { %>
 <!--标段设置-小数位数-->
 <div class="modal fade" id="bd-set-2" data-backdrop="static">
     <div class="modal-dialog" role="document">
@@ -613,7 +616,7 @@
 </div>
 <script>
     let property = JSON.parse('<%- JSON.stringify(tenderInfo) %>');
-    let ledgerChecked = <%- tender.ledger_status === audit.ledger.status.checked %>;
+    let ledgerChecked = <%- (tender.ledger_status === audit.ledger.status.checked) && ((lastStage !== undefined && lastStage !== null) || !revise || !revise.valid || revise.status === audit.revise.status.checked) %>;
     let firstStageChecked = <%- lastStage !== undefined && lastStage !== null && (lastStage.order > 1 || (lastStage.order === 1 && lastStage.status === audit.stage.status.checked)) %>;
 
     // 根据Min Max限制Input输入
@@ -974,7 +977,7 @@
             return precision;
         }
         function checkPrecisionMinLimit(precision, limit) {
-            for (const unit of precision) {
+            for (const unit in precision) {
                 if (precision[unit].value < limit[unit].value) {
                     if (precision[unit].unit) {
                         toastr.warning('台账已审批通过,清单精度不可减少,单位为' + limit[unit].unit + '的清单的精度不可小于' + limit[unit].value);
@@ -990,8 +993,11 @@
         return {loadPrecisonProperty, setReadOnly, getNewPrecisionData, checkPrecisionMinLimit};
     })();
     $('#bd-set-3').on('show.bs.modal', function () {
-        <% if (((tender.ledger_status !== audit.ledger.status.uncheck && tender.ledger_status !== audit.ledger.status.checkNo) || tender.user_id !== ctx.session.sessionUser.accountId)
-                && (!lastStage || lastStage.user_id !== ctx.session.sessionUser.accountId || (lastStage.status !== audit.stage.status.checkNo || lastStage.status !== audit.stage.status.uncheck))) { %>
+        <% if (!(
+                ((tender.ledger_status === audit.ledger.status.uncheck || tender.ledger_status === audit.ledger.status.checkNo) && tender.user_id === ctx.session.sessionUser.accountId) ||
+                (lastStage && lastStage.user_id === ctx.session.sessionUser.accountId && (lastStage.status === audit.stage.status.checkNo || lastStage.status === audit.stage.status.uncheck)) ||
+                (!lastStage && revise && revise.valid && (revise.status === audit.revise.status.uncheck || revise.status === audit.revise.status.checkNo) && tender.user_id === ctx.session.sessionUser.accountId)
+        )) { %>
         precisionObj.setReadOnly(true);
         <% } %>
         precisionObj.loadPrecisonProperty();