Переглянути джерело

1. 移除原台账控制列只读部分代码
2. 台账修订相关

MaiXinRong 5 роки тому
батько
коміт
a46cfc874d

+ 12 - 12
app/const/spread.js

@@ -20,17 +20,17 @@ const withCl = {
             {title: '清单编号', colSpan: '1', rowSpan: '2', field: 'b_code', hAlign: 0, width: 80, formatter: '@'},
             {title: '名称', colSpan: '1', rowSpan: '2', field: 'name', hAlign: 0, width: 230, formatter: '@'},
             {title: '单位', colSpan: '1', rowSpan: '2', field: 'unit', hAlign: 1, width: 50, formatter: '@', cellType: 'unit'},
-            {title: '单价', colSpan: '1', rowSpan: '2', field: 'unit_price', hAlign: 2, width: 60, type: 'Number', readOnly: 'readOnly.unit_price'},
-            {title: '设计数量|数量1',  colSpan: '2|1', rowSpan: '1|1', field: 'dgn_qty1', hAlign: 2, width: 60, type: 'Number', readOnly: 'readOnly.dgnQty'},
-            {title: '|数量2',  colSpan: '|1', rowSpan: '|1', field: 'dgn_qty2', hAlign: 2, width: 60, type: 'Number', readOnly: 'readOnly.dgnQty'},
+            {title: '单价', colSpan: '1', rowSpan: '2', field: 'unit_price', hAlign: 2, width: 60, type: 'Number'},
+            {title: '设计数量|数量1',  colSpan: '2|1', rowSpan: '1|1', field: 'dgn_qty1', hAlign: 2, width: 60, type: 'Number'},
+            {title: '|数量2',  colSpan: '|1', rowSpan: '|1', field: 'dgn_qty2', hAlign: 2, width: 60, type: 'Number'},
             {title: '经济指标',  colSpan: '1', rowSpan: '2', field: 'dgn_price', hAlign: 2, width: 60, type: 'Number', readOnly: true},
-            {title: '签约|数量', colSpan: '2|1', rowSpan: '1|1', field: 'deal_qty', hAlign: 2, width: 60, type: 'Number', readOnly: 'readOnly.quantity'},
+            {title: '签约|数量', colSpan: '2|1', rowSpan: '1|1', field: 'deal_qty', hAlign: 2, width: 60, type: 'Number'},
             {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'deal_tp', hAlign: 2, width: 60, type: 'Number', readOnly: true},
-            {title: '施工图复核|数量', colSpan: '2|1', rowSpan: '1|1', field: 'sgfh_qty', hAlign: 2, width: 60, type: 'Number', readOnly: 'readOnly.quantity'},
+            {title: '施工图复核|数量', colSpan: '2|1', rowSpan: '1|1', field: 'sgfh_qty', hAlign: 2, width: 60, type: 'Number'},
             {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'sgfh_tp', hAlign: 2, width: 60, type: 'Number', readOnly: true},
-            {title: '设计错漏增减|数量', colSpan: '2|1', rowSpan: '1|1', field: 'sjcl_qty', hAlign: 2, width: 60, type: 'Number', readOnly: 'readOnly.quantity'},
+            {title: '设计错漏增减|数量', colSpan: '2|1', rowSpan: '1|1', field: 'sjcl_qty', hAlign: 2, width: 60, type: 'Number'},
             {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'sjcl_tp', hAlign: 2, width: 60, type: 'Number', readOnly: true},
-            {title: '其他错漏增减|数量', colSpan: '2|1', rowSpan: '1|1', field: 'qtcl_qty', hAlign: 2, width: 60, type: 'Number', readOnly: 'readOnly.quantity'},
+            {title: '其他错漏增减|数量', colSpan: '2|1', rowSpan: '1|1', field: 'qtcl_qty', hAlign: 2, width: 60, type: 'Number'},
             {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'qtcl_tp', hAlign: 2, width: 60, type: 'Number', readOnly: true},
             {title: '小计|数量', colSpan: '2|1', rowSpan: '1|1', field: 'quantity', hAlign: 2, width: 60, type: 'Number', readOnly: true},
             {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'total_price', hAlign: 2, width: 60, type: 'Number', readOnly: true},
@@ -64,13 +64,13 @@ const withoutCl = {
             {title: '清单编号', colSpan: '1', rowSpan: '2', field: 'b_code', hAlign: 0, width: 80, formatter: '@'},
             {title: '名称', colSpan: '1', rowSpan: '2', field: 'name', hAlign: 0, width: 230, formatter: '@'},
             {title: '单位', colSpan: '1', rowSpan: '2', field: 'unit', hAlign: 1, width: 50, formatter: '@', cellType: 'unit'},
-            {title: '单价', colSpan: '1', rowSpan: '2', field: 'unit_price', hAlign: 2, width: 60, type: 'Number', readOnly: 'readOnly.unit_price'},
-            {title: '设计数量|数量1',  colSpan: '2|1', rowSpan: '1|1', field: 'dgn_qty1', hAlign: 2, width: 60, type: 'Number', readOnly: 'readOnly.dgnQty'},
-            {title: '|数量2',  colSpan: '|1', rowSpan: '|1', field: 'dgn_qty2', hAlign: 2, width: 60, type: 'Number', readOnly: 'readOnly.dgnQty'},
+            {title: '单价', colSpan: '1', rowSpan: '2', field: 'unit_price', hAlign: 2, width: 60, type: 'Number'},
+            {title: '设计数量|数量1',  colSpan: '2|1', rowSpan: '1|1', field: 'dgn_qty1', hAlign: 2, width: 60, type: 'Number'},
+            {title: '|数量2',  colSpan: '|1', rowSpan: '|1', field: 'dgn_qty2', hAlign: 2, width: 60, type: 'Number'},
             {title: '经济指标',  colSpan: '1', rowSpan: '2', field: 'dgn_price', hAlign: 2, width: 60, type: 'Number', readOnly: true},
-            {title: '签约|数量', colSpan: '2|1', rowSpan: '1|1', field: 'deal_qty', hAlign: 2, width: 60, type: 'Number', readOnly: 'readOnly.quantity'},
+            {title: '签约|数量', colSpan: '2|1', rowSpan: '1|1', field: 'deal_qty', hAlign: 2, width: 60, type: 'Number'},
             {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'deal_tp', hAlign: 2, width: 60, type: 'Number', readOnly: true},
-            {title: '施工图复核|数量', colSpan: '2|1', rowSpan: '1|1', field: 'sgfh_qty', hAlign: 2, width: 60, type: 'Number', readOnly: 'readOnly.quantity'},
+            {title: '施工图复核|数量', colSpan: '2|1', rowSpan: '1|1', field: 'sgfh_qty', hAlign: 2, width: 60, type: 'Number'},
             {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'sgfh_tp', hAlign: 2, width: 60, type: 'Number', readOnly: true},
             {title: '图(册)号', colSpan: '1', rowSpan: '2', field: 'drawing_code', hAlign: 0, width: 80, formatter: '@'},
             {title: '备注', colSpan: '1', rowSpan: '2', field: 'memo', hAlign: 0, width: 100, formatter: '@', cellType: 'ellipsisAutoTip'}

+ 6 - 1
app/controller/revise_controller.js

@@ -42,9 +42,11 @@ module.exports = app => {
          */
         async _getAddReviseValid(ctx) {
             const revise = await ctx.service.ledgerRevise.getLastestRevise(ctx.tender.id);
+            const lastStage = await ctx.service.stage.getLastestStage(ctx.tender.id, true);
             return (ctx.tender.data.user_id === ctx.session.sessionUser.accountId) &&
                 (ctx.tender.data.ledger_status === audit.revise.status.checked) &&
-                (!revise || !revise.valid || revise.status === audit.revise.status.checked);
+                (!revise || !revise.valid || revise.status === audit.revise.status.checked) &&
+                (!lastStage || lastStage.status === audit.stage.status.checking);
         }
 
         /**
@@ -603,6 +605,9 @@ module.exports = app => {
                 if (!revise || revise.status === audit.revise.status.checking || revise.status === audit.revise.status.checked) {
                     throw '台账修订数据有误';
                 }
+                if (revise.content === '') {
+                    throw '未填写修订内容,请先填写并保存修订内容';
+                }
                 if (revise.uid !== ctx.session.sessionUser.accountId) throw '上报失败';
 
                 await ctx.service.reviseAudit.start(revise, revise.times);

+ 21 - 0
app/public/js/global.js

@@ -405,3 +405,24 @@ function copyToClipboard( text ) {
     // 删除创建元素
     document.body.removeChild(aux);
 }
+
+function toastMessageUniq (obj) {
+    if (!obj.msg || !obj.type) return;
+    if (!obj.once) {
+        switch (obj.type) {
+            case 'error':
+                toastr.error(obj.msg);
+                break;
+            case 'warning':
+                toastr.warning(obj.msg);
+                break;
+            case 'info':
+                toastr.info(obj.msg);
+                break;
+            case 'success':
+                toastr.success(obj.msg);
+                break;
+        }
+        obj.once = true;
+    }
+}

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

@@ -80,8 +80,12 @@ $(document).ready(function() {
             const col = sheet.zh_setting.cols[sel.col], cell = sheet.getCell(sel.row, sel.col);
             if (col.type === 'Number') {
                 const data = SpreadJsObj.getSelectObject(sheet);
-                $('#bills-expr').val(data[col.field]).attr('field', col.field).attr('org', data[col.field])
-                    .attr('readOnly', readOnly || cell.locked());
+                if (data) {
+                    $('#bills-expr').val(data[col.field]).attr('field', col.field).attr('org', data[col.field])
+                        .attr('readOnly', readOnly || cell.locked());
+                } else {
+                    $('#bills-expr').val('').attr('readOnly', true);
+                }
             } else {
                 $('#bills-expr').val('').attr('readOnly', true);
             }
@@ -1273,6 +1277,8 @@ $(document).ready(function() {
                                     toastr.warning('粘贴了表达式非法,已过滤');
                                 }
                             }
+                        } else {
+                            bPaste = true;
                         }
                     }
                     if (bPaste) {
@@ -1300,8 +1306,12 @@ $(document).ready(function() {
             const cell = info.sheet.getCell(info.newSelections[0].row, info.newSelections[0].col);
             if (col.type === 'Number') {
                 const data = SpreadJsObj.getSelectObject(info.sheet);
-                $('#pos-expr').val(data[col.field]).attr('field', col.field).attr('org', data[col.field])
-                    .attr('row', info.newSelections[0].row).attr('readOnly', readOnly || cell.locked());
+                if (data) {
+                    $('#pos-expr').val(data[col.field]).attr('field', col.field).attr('org', data[col.field])
+                        .attr('row', info.newSelections[0].row).attr('readOnly', readOnly || cell.locked());
+                } else {
+                    $('#pos-expr').val('').attr('readOnly', true);
+                }
             } else {
                 $('#pos-expr').val('').attr('readOnly', true);
             }

+ 80 - 26
app/public/js/revise.js

@@ -74,8 +74,12 @@ $(document).ready(() => {
             const col = sheet.zh_setting.cols[sel.col], cell = sheet.getCell(sel.row, sel.col);
             if (col.type === 'Number') {
                 const data = SpreadJsObj.getSelectObject(sheet);
-                $('#bills-expr').val(data[col.field]).attr('field', col.field).attr('org', data[col.field])
-                    .attr('readOnly', readOnly || cell.locked());
+                if (data) {
+                    $('#bills-expr').val(data[col.field]).attr('field', col.field).attr('org', data[col.field])
+                        .attr('readOnly', readOnly || cell.locked());
+                } else {
+                    $('#bills-expr').val('').attr('readOnly', true);
+                }
             } else {
                 $('#bills-expr').val('').attr('readOnly', true);
             }
@@ -118,10 +122,11 @@ $(document).ready(() => {
             const tree = sheet.zh_tree;
             if (!tree) return;
             const first = sheet.zh_tree.nodes[row];
-            let last = first, sameParent = true;
+            let last = first, sameParent = true, nodeUsed = first.used;
             if (sel.rowCount > 1) {
                 for (let r = 1; r < sel.rowCount; r++) {
                     const rNode = tree.nodes[sel.row + r];
+                    nodeUsed = nodeUsed || rNode.used;
                     if (rNode.level > first.level) continue;
                     if ((rNode.level < first.level) || (rNode.level === first.level && rNode.pid !== first.pid)) {
                         sameParent = false;
@@ -133,15 +138,17 @@ $(document).ready(() => {
             const preNode = tree.getPreSiblingNode(first);
             const valid = !sheet.zh_setting.readOnly;
 
-            setObjEnable($('#insert'), valid && first && first.level > 1);
-            setObjEnable($('#delete'), valid && first && sameParent && first.level > 1);
-            setObjEnable($('#up-move'), valid && first && sameParent && first.level > 1 && preNode);
-            setObjEnable($('#down-move'), valid && first && sameParent && first.level > 1 && !tree.isLastSibling(last));
+            setObjEnable($('a[type=insert]'), valid && first && first.level > 1);
+            setObjEnable($('a[type=delete]'), valid && first && sameParent && first.level > 1 && !nodeUsed);
+            setObjEnable($('a[type=up-move]'), valid && first && sameParent && first.level > 1 && preNode);
+            setObjEnable($('a[type=down-move]'), valid && first && sameParent && first.level > 1 && !tree.isLastSibling(last));
             if (isTz) {
                 const posRange = last ? pos.getLedgerPos(last.id) : [];
-                setObjEnable($('#up-level'), valid && first && sameParent && tree.getParent(first) && first.level > 2 && ((!posRange || posRange.length === 0) || tree.isLastSibling(last)));
+                setObjEnable($('a[type=up-level]'), valid && first && sameParent && tree.getParent(first) && !nodeUsed
+                    && first.level > 2 && ((!posRange || posRange.length === 0) || tree.isLastSibling(last)));
                 const preNodePosRange = preNode ? pos.getLedgerPos(preNode.id) : [];
-                setObjEnable($('#down-level'), valid && first && sameParent && first.level > 1 && preNode && (!preNodePosRange || preNodePosRange.length === 0));
+                setObjEnable($('a[type=down-level]'), valid && first && sameParent && !nodeUsed
+                    && first.level > 1 && preNode && (!preNodePosRange || preNodePosRange.length === 0));
             } else {
                 setObjEnable($('#up-level'), valid && first && sameParent && first.level > 2 && tree.getParent(first));
                 setObjEnable($('#down-level'), valid && first && sameParent && first.level > 1 && preNode);
@@ -334,6 +341,11 @@ $(document).ready(() => {
                 // 获取更新数据
                 if (info.editingText) {
                     const text = info.editingText.replace('\n', '');
+                    if (node.used && (col.field === 'code' || col.field ==='b_code') && orgValue !== '' && text === '') {
+                        toastr.error('清单已计量,请删除编号');
+                        SpreadJsObj.reLoadRowData(info.sheet, info.row);
+                        return;
+                    }
                     if (col.type === 'Number') {
                         const num = _.toNumber(text);
                         if (num) {
@@ -351,6 +363,11 @@ $(document).ready(() => {
                         data[col.field] = text;
                     }
                 } else {
+                    if (node.used && (col.field === 'code' || col.field ==='b_code') && orgValue !== '') {
+                        toastr.error('清单已计量,请删除编号');
+                        SpreadJsObj.reLoadRowData(info.sheet, info.row);
+                        return;
+                    }
                     data[col.field] = null;
                 }
                 // 更新至服务器
@@ -374,15 +391,22 @@ $(document).ready(() => {
             }
         },
         clipboardPasted: function (e, info) {
+            const hint = {
+                usedUp: {type: 'error', msg: '清单已计量,不可修改单价'},
+                usedCode: {type: 'error', msg: '清单已计量,编号不可修改为空值'},
+                invalidExpr: {type: 'error', msg: '粘贴的表达式非法'},
+                posCode: {type: 'error', msg: '清单含有部位明细,请先删除部位明细,再修改清单编号为空'},
+                posQty: {type: 'error', msg: '清单含有部位明细,数量金额根据部位明细汇总计算所得,不可修改'},
+            };
+
             const tree = info.sheet.zh_tree;
             if (!tree) { return; }
 
             const sortData = info.sheet.zh_tree.nodes;
             const datas = [], filterNodes = [];
-            let bHint = false, bPaste;
 
             for (let iRow = 0; iRow < info.cellRange.rowCount; iRow ++) {
-                bPaste = false;
+                let bPaste = false;
                 const curRow = info.cellRange.row + iRow;
                 const node = sortData[curRow];
                 if (node) {
@@ -394,22 +418,20 @@ $(document).ready(() => {
                         const lPos = pos.getLedgerPos(node.id);
                         if (lPos && lPos.length > 0) {
                             if (value === '' && colSetting.field === 'b_code') {
-                                if (!bHint) {
-                                    toastr.warning('清单含有部位明细,请先删除部位明细,再删除清单编号');
-                                    bHint = true;
-                                }
+                                toastMessageUniq(hint.posCode);
                                 continue;
                             }
                             if (colSetting.field === 'sgfh_qty' || colSetting.field === 'sgfh_tp' ||
                                 colSetting.field === 'sjcl_qty' || colSetting.field === 'sjcl_tp' ||
                                 colSetting.field === 'qtcl_qty' || colSetting.field === 'qtcl_tp') {
-                                if (!bHint) {
-                                    toastr.warning('清单含有部位明细,数量金额根据部位明细汇总计算所得,不可编辑');
-                                    bHint = true;
-                                }
+                                toastMessageUniq(hint.posQty);
                                 continue;
                             }
                         }
+                        if (node.used && col.field === 'unit_price') {
+                            toastMessageUniq (hint.usedUp);
+                            continue;
+                        }
                         if (colSetting.type === 'Number') {
                             const num = _.toNumber(value);
                             if (num) {
@@ -418,14 +440,16 @@ $(document).ready(() => {
                                 try {
                                     data[colSetting.field] = math.evaluate(transExpr(value));
                                 } catch (err) {
-                                    if (!bHint) {
-                                        toastr.warning('粘贴的表达式非法,已过滤');
-                                        bHint = true;
-                                    }
+                                    toastMessageUniq(hint.invalidExpr);
                                     continue;
                                 }
                             }
                         } else {
+                            if (node.used && (col.field === 'code' || col.field ==='b_code')
+                                && data[colSetting.field] !== '' && value === '') {
+                                toastMessageUniq(hint.usedCode);
+                                continue;
+                            }
                             data[colSetting.field] = value;
                         }
                         bPaste = true;
@@ -497,9 +521,32 @@ $(document).ready(() => {
         topRowChanged: function (e, info) {
             SpreadJsObj.saveTopAndSelect(info.sheet, ckBillsSpread);
         },
+        editStarting(e, info) {
+            if (!info.sheet.zh_setting || !info.sheet.zh_tree) return;
+            const col = info.sheet.zh_setting.cols[info.col];
+            const node = info.sheet.zh_tree.nodes[info.row];
+            switch (col.field) {
+                case 'unit_price':
+                    info.cancel = (node.children && node.children.length > 0) || node.used;
+                case 'sgfh_qty':
+                case 'sgfh_tp':
+                case 'sjcl_qty':
+                case 'sjcl_tp':
+                case 'qtcl_qty':
+                case 'qtcl_tp':
+                case 'deal_qty':
+                case 'deal_tp':
+                    info.cancel = (node.children && node.children.length > 0);
+                    break;
+                case 'dgn_qty1':
+                case 'dgn_qty2':
+                    info.cancel = !_.isEmpty(node.b_code);
+                    break;
+            }
+        }
     };
     billsTreeSpreadObj.refreshOperationValid(billsSheet);
-    billsTreeSpreadObj.loadExprToInput(info.sheet);
+    billsTreeSpreadObj.loadExprToInput(billsSheet);
     billsSpread.bind(spreadNS.Events.SelectionChanged, billsTreeSpreadObj.selectionChanged);
     billsSpread.bind(spreadNS.Events.topRowChanged, billsTreeSpreadObj.topRowChanged);
     if (!readOnly) {
@@ -539,6 +586,7 @@ $(document).ready(() => {
             });
         });
 
+        billsSpread.bind(spreadNS.Events.EditStarting, billsTreeSpreadObj.editStarting);
         billsSpread.bind(spreadNS.Events.EditEnded, billsTreeSpreadObj.editEnded);
         billsSpread.bind(spreadNS.Events.ClipboardPasting, billsTreeSpreadObj.clipboardPasting);
         billsSpread.bind(spreadNS.Events.ClipboardPasted, billsTreeSpreadObj.clipboardPasted);
@@ -870,8 +918,14 @@ $(document).ready(() => {
             const cell = info.sheet.getCell(info.newSelections[0].col, info.newSelections[0].col);
             if (col.type === 'Number') {
                 const data = SpreadJsObj.getSelectObject(info.sheet);
-                $('#pos-expr').val(data[col.field]).attr('field', col.field).attr('org', data[col.field])
-                    .attr('row', info.newSelections[0].row).attr('readOnly', readOnly || cell.locked());
+                if (data) {
+                    $('#pos-expr').val(data[col.field]).attr('field', col.field).attr('org', data[col.field])
+                        .attr('row', info.newSelections[0].row).attr('readOnly', readOnly || cell.locked());
+                } else {
+                    $('#pos-expr').val(''.attr('readOnly', true);
+                }
+            } else {
+                $('#pos-expr').val(''.attr('readOnly', true);
             }
         },
     };

+ 2 - 2
app/public/js/revise_history.js

@@ -278,9 +278,9 @@ $(document).ready(() => {
 
     $('#reviseHistory').change(function () {
         postData(window.location.pathname + '/info', { rid: this.value }, function (result) {
-            $('#user-name').value(result.user_name);
+            $('#user-name').val(result.user_name);
             $('#content')[0].textContent = result.content;
-            $('#end-time').value(result.end_time.toLocaleString());
+            $('#end-time').val(result.end_time.toLocaleString());
         });
     });
 });

+ 10 - 2
app/public/js/stage.js

@@ -490,6 +490,10 @@ $(document).ready(() => {
             const col = sheet.zh_setting.cols[sel.col], cell = sheet.getCell(sel.row, sel.col);
             if (col.type === 'Number') {
                 const data = SpreadJsObj.getSelectObject(sheet);
+                if (!data) {
+                    $('#bills-expr').val('').attr('readOnly', true);
+                    return;
+                }
                 const nodePos = stagePos.getLedgerPos(data.id);
                 if (nodePos && nodePos.length > 0) {
                     $('#bills-expr').val('').attr('readOnly', true);
@@ -952,8 +956,12 @@ $(document).ready(() => {
             const col = sheet.zh_setting.cols[sel.col], cell = sheet.getCell(sel.row, sel.col);
             if (col.type === 'Number') {
                 const data = SpreadJsObj.getSelectObject(sheet);
-                $('#pos-expr').val(data[col.field]).attr('field', col.field).attr('org', data[col.field])
-                    .attr('row', sel.row).attr('readOnly', readOnly || cell.locked());
+                if (data) {
+                    $('#pos-expr').val(data[col.field]).attr('field', col.field).attr('org', data[col.field])
+                        .attr('row', sel.row).attr('readOnly', readOnly || cell.locked());
+                } else {
+                    $('#pos-expr').val('').attr('readOnly', true);
+                }
             } else {
                 $('#pos-expr').val('').attr('readOnly', true);
             }

+ 3 - 4
app/service/pos.js

@@ -106,7 +106,6 @@ module.exports = app => {
             } else {
                 this._completeInsertPosData(tid, data);
             }
-            console.log(data);
             await this.db.insert(this.tableName, data);
             return { pos: data }
         }
@@ -164,7 +163,7 @@ module.exports = app => {
                     throw err;
                 }
             } else {
-                await this.db.update(this.tableName, d, {tid: tid, id: d.id});
+                await this.db.update(this.tableName, data, {tid: tid, id: data.id});
                 return {pos: data};
             }
         }
@@ -277,8 +276,8 @@ module.exports = app => {
                 throw err;
             }
             result.pos = data;
-            if (updateLid.length > 0) {
-                result.ledger.update = await this.ctx.service.ledger.getDataByIds(updateLid);
+            if (updateBills.length > 0) {
+                result.ledger.update = await this.ctx.service.ledger.getDataByIds(this._.map(updateBills, 'id'));
             }
             return result;
         }

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

@@ -59,9 +59,6 @@
                 <div class="resize-x" id="revise-right-spr" r-Type="width" div1="#left-view" div2="#right-view" title="调整大小" a-type="percent"><!--调整左右高度条--></div>
                 <div class="tab-content">
                     <div id="xd-content" class="tab-pane">
-                        <div class="sjs-bar-2">
-                            <div class="d-flex"><a href="javascirpt: void(0);" class="btn btn-sm btn-outline-success mb-1 ml-auto" id="save">保存</a></div>
-                        </div>
                         <div class="sjs-sh-2" style="overflow:auto">
                             <div class="form-group mt-2">
                                 <label >创建时间</label>

+ 2 - 0
app/view/revise/info.ejs

@@ -105,9 +105,11 @@
                 <div class="resize-x" id="revise-right-spr" r-Type="width" div1="#left-view" div2="#right-view" title="调整大小" a-type="percent"><!--调整左右高度条--></div>
                 <div class="tab-content">
                     <div id="xd-content" class="tab-pane">
+                        <% if ((revise.status === audit.status.uncheck || revise.status === audit.status.checkNo) && !readOnly) { %>
                         <div class="sjs-bar-2">
                             <div class="d-flex"><a href="javascirpt: void(0);" class="btn btn-sm btn-outline-success mb-1 ml-auto" id="save">保存</a></div>
                         </div>
+                        <% } %>
                         <div class="sjs-sh-2" style="overflow:auto">
                             <div class="form-group mt-2">
                                 <label >创建时间</label>

+ 5 - 0
app/view/revise/info_modal.ejs

@@ -477,6 +477,11 @@
 
     // 检查上报情况
     function checkAuditorFrom () {
+        const content = $('textarea').val();
+        if (!content || content === '') {
+            toastr.error('请先填写修订内容,再上报数据');
+            return false;
+        }
         if ($('#auditors li').length === 0) {
             toastr.error('请先选择审批人,再上报数据');
             return false;