mlchen 1 день назад
Родитель
Сommit
5ff8b8edb0
100 измененных файлов с 810 добавлено и 694 удалено
  1. 2 1
      .gitignore
  2. 87 2
      src/BIZComponents/inventoryTableDetails.vue
  3. 1 0
      src/BIZComponents/outdetails.vue
  4. 7 0
      src/BIZComponents/processSubmitDialog/components/parentList.vue
  5. 2 0
      src/api/bpm/components/offerApproval/index.js
  6. 103 0
      src/components/ApprovalOpinion/index.vue
  7. 6 5
      src/enum/dict.js
  8. 2 0
      src/main.js
  9. 42 0
      src/utils/attachment.js
  10. 13 0
      src/utils/util.js
  11. 14 3
      src/views/bpm/done/detailDialog.vue
  12. 4 8
      src/views/bpm/handleTask/components/EnergyPricingScheme/submit.vue
  13. 4 8
      src/views/bpm/handleTask/components/accidentReport/submit.vue
  14. 4 8
      src/views/bpm/handleTask/components/adjustNote/submit.vue
  15. 4 8
      src/views/bpm/handleTask/components/afterSales/submit.vue
  16. 4 8
      src/views/bpm/handleTask/components/allocate/submit.vue
  17. 4 4
      src/views/bpm/handleTask/components/bomApprover/submit.vue
  18. 4 8
      src/views/bpm/handleTask/components/bomApproverJSYY/submit.vue
  19. 4 8
      src/views/bpm/handleTask/components/bomApproverJSdevice/submit.vue
  20. 4 8
      src/views/bpm/handleTask/components/businessOpportunity/submit.vue
  21. 4 8
      src/views/bpm/handleTask/components/centralizedMeterReading/submit.vue
  22. 4 8
      src/views/bpm/handleTask/components/certificateQualifications/submit.vue
  23. 4 8
      src/views/bpm/handleTask/components/changeManage/submit.vue
  24. 4 8
      src/views/bpm/handleTask/components/changeManagement/submit.vue
  25. 4 8
      src/views/bpm/handleTask/components/commodityManagement/submit.vue
  26. 4 8
      src/views/bpm/handleTask/components/contact/submit.vue
  27. 7 0
      src/views/bpm/handleTask/components/contactQC/parentList.vue
  28. 4 8
      src/views/bpm/handleTask/components/contactQC/submit.vue
  29. 4 8
      src/views/bpm/handleTask/components/contractBook/contractChange/submit.vue
  30. 4 8
      src/views/bpm/handleTask/components/contractBook/submit.vue
  31. 4 8
      src/views/bpm/handleTask/components/cost/submit.vue
  32. 4 8
      src/views/bpm/handleTask/components/customApproval/submit.vue
  33. 4 8
      src/views/bpm/handleTask/components/cuttingPlan/submit.vue
  34. 4 8
      src/views/bpm/handleTask/components/demandApplication/submit.vue
  35. 4 8
      src/views/bpm/handleTask/components/doc/submit.vue
  36. 4 8
      src/views/bpm/handleTask/components/ehsEquipmentDisposal/submit.vue
  37. 4 8
      src/views/bpm/handleTask/components/entrust/submit.vue
  38. 4 8
      src/views/bpm/handleTask/components/equipmentDisposal/submit.vue
  39. 4 8
      src/views/bpm/handleTask/components/exceptionManagement/exceptionList/submit.vue
  40. 14 0
      src/views/bpm/handleTask/components/financialManage/components/customerListDialog.vue
  41. 4 8
      src/views/bpm/handleTask/components/financialManage/feeManage/feeApplication/submit.vue
  42. 4 8
      src/views/bpm/handleTask/components/financialManage/invoiceManage/submit.vue
  43. 5 0
      src/views/bpm/handleTask/components/financialManage/payableManage/components/detailDialog.vue
  44. 4 8
      src/views/bpm/handleTask/components/financialManage/payableManage/submit.vue
  45. 6 1
      src/views/bpm/handleTask/components/financialManage/receivableManage/components/detailDialog.vue
  46. 4 8
      src/views/bpm/handleTask/components/financialManage/receivableManage/submit.vue
  47. 4 8
      src/views/bpm/handleTask/components/formCodeManagement/submit.vue
  48. 5 6
      src/views/bpm/handleTask/components/hiringApproval/hiringApprovalDetail.vue
  49. 4 8
      src/views/bpm/handleTask/components/hiringApproval/submit.vue
  50. 3 11
      src/views/bpm/handleTask/components/hrContractManagement/hrContractDetail.vue
  51. 4 8
      src/views/bpm/handleTask/components/hrContractManagement/submit.vue
  52. 4 8
      src/views/bpm/handleTask/components/ingredientOutbound/submit.vue
  53. 4 8
      src/views/bpm/handleTask/components/inoutBound/submit.vue
  54. 4 8
      src/views/bpm/handleTask/components/inquiryManage/submit.vue
  55. 4 8
      src/views/bpm/handleTask/components/inspectionProjectRequest/submit.vue
  56. 4 8
      src/views/bpm/handleTask/components/inspectionReportTemplate/submit.vue
  57. 4 8
      src/views/bpm/handleTask/components/inspectionStandard/submit.vue
  58. 4 8
      src/views/bpm/handleTask/components/inspectionTemplate/submit.vue
  59. 4 8
      src/views/bpm/handleTask/components/itemPublishApproval/submit.vue
  60. 4 8
      src/views/bpm/handleTask/components/itemReceipts/submit.vue
  61. 4 8
      src/views/bpm/handleTask/components/lossOverflowReport/submit.vue
  62. 3 7
      src/views/bpm/handleTask/components/maintenance/repair/submit.vue
  63. 4 8
      src/views/bpm/handleTask/components/marketManagem/submit.vue
  64. 4 8
      src/views/bpm/handleTask/components/materialPlan/submit.vue
  65. 7 11
      src/views/bpm/handleTask/components/measuringToolInspection/submit.vue
  66. 4 8
      src/views/bpm/handleTask/components/mesBatchRecordManage/submit.vue
  67. 4 8
      src/views/bpm/handleTask/components/mesWorkOrderChecklist/submit.vue
  68. 4 8
      src/views/bpm/handleTask/components/noticeIssuance/submit.vue
  69. 9 12
      src/views/bpm/handleTask/components/offerApproval/offerApprovalDetail.vue
  70. 4 8
      src/views/bpm/handleTask/components/offerApproval/submit.vue
  71. 4 8
      src/views/bpm/handleTask/components/outBound/submit.vue
  72. 4 8
      src/views/bpm/handleTask/components/outsourcedWarehousing/submit.vue
  73. 5 9
      src/views/bpm/handleTask/components/outsourcedWarehousingNoProcurement/submit.vue
  74. 4 8
      src/views/bpm/handleTask/components/positionApplication/submit.vue
  75. 95 33
      src/views/bpm/handleTask/components/positionTransfer/positionTransferDetail.vue
  76. 4 8
      src/views/bpm/handleTask/components/positionTransfer/submit.vue
  77. 4 8
      src/views/bpm/handleTask/components/prepayment/submit.vue
  78. 4 8
      src/views/bpm/handleTask/components/producePlan/submit.vue
  79. 4 8
      src/views/bpm/handleTask/components/productionWarehousing/submit.vue
  80. 4 8
      src/views/bpm/handleTask/components/project-manage/plan-manage/submit.vue
  81. 3 7
      src/views/bpm/handleTask/components/project-manage/project-initiation/submit.vue
  82. 4 8
      src/views/bpm/handleTask/components/project-manage/task-manage/submit.vue
  83. 4 8
      src/views/bpm/handleTask/components/project-manage/team-manage/submit.vue
  84. 4 8
      src/views/bpm/handleTask/components/purchaseNeedManage/submit.vue
  85. 4 8
      src/views/bpm/handleTask/components/purchaseOrder/accountstatement/submit.vue
  86. 7 0
      src/views/bpm/handleTask/components/purchaseOrder/accountstatement/supplierList.vue
  87. 5 9
      src/views/bpm/handleTask/components/purchaseOrder/invoice/submit.vue
  88. 4 8
      src/views/bpm/handleTask/components/purchaseOrder/invoiceConfirm/submit.vue
  89. 4 8
      src/views/bpm/handleTask/components/purchaseOrder/outSourceSend/submit.vue
  90. 4 8
      src/views/bpm/handleTask/components/purchaseOrder/outSourceSendCk/submit.vue
  91. 5 9
      src/views/bpm/handleTask/components/purchaseOrder/outsourceSendReturnGoods/submit.vue
  92. 1 1
      src/views/bpm/handleTask/components/purchaseOrder/returnGoods/detailDialog.vue
  93. 9 10
      src/views/bpm/handleTask/components/purchaseOrder/returnGoods/submit.vue
  94. 4 8
      src/views/bpm/handleTask/components/purchaseOrder/submit.vue
  95. 5 9
      src/views/bpm/handleTask/components/purchasePlanManage/submit.vue
  96. 4 8
      src/views/bpm/handleTask/components/qualityReportApproval/submit.vue
  97. 55 5
      src/views/bpm/handleTask/components/qualityReportApproval/unqualifiedProduct.vue
  98. 7 0
      src/views/bpm/handleTask/components/quotation/parentList.vue
  99. 4 8
      src/views/bpm/handleTask/components/quotation/submit.vue
  100. 3 3
      src/views/bpm/handleTask/components/regularizationHandling/regularizationHandlingDetail.vue

+ 2 - 1
.gitignore

@@ -23,4 +23,5 @@ yarn-error.log*
 *.sw?
 vue.config.js
 package-lock.json
-.history
+.history
+.workbuddy

+ 87 - 2
src/BIZComponents/inventoryTableDetails.vue

@@ -63,6 +63,26 @@
           {{ scope.row[countObj.unitKey] || '' }}
         </el-form-item>
       </template>
+      <!-- 单价:允许调整,联动 totalPrice / discountSinglePrice / discountTotalPrice -->
+      <template v-slot:singlePrice="scope">
+        <el-form-item :prop="'datasource.' + scope.$index + '.singlePrice'">
+          <el-input
+            v-model="scope.row.singlePrice"
+            type="number"
+            placeholder="请输入"
+            @input="changeCount(scope.row, scope.$index)"
+          >
+            <template slot="append">元</template>
+          </el-input>
+        </el-form-item>
+      </template>
+      <template v-slot:headerSinglePrice="{ column }">
+        <span>{{ column.label }}</span>
+      </template>
+      <!-- 不含税单价:跟随 singlePrice + taxRate 自动计算 -->
+      <template v-slot:notaxSinglePrice="scope">
+        {{ scope.row.notaxSinglePrice }}
+      </template>
       <!-- <template v-slot:saleUnit="scope">
         <el-form-item
           :prop="'datasource.' + scope.$index + '.' + countObj.unitKey"
@@ -107,7 +127,8 @@
     getAllQuantity,
     formatPrice,
     getAllPrice,
-    getAllDiscountPrice
+    getAllDiscountPrice,
+    changeCount as changeCountUtil
   } from '@/BIZComponents/setProduct.js';
   import { getInventoryTotalAPI } from '@/api/bpm/components/wms';
 
@@ -212,7 +233,9 @@
         },
         columnsVersion: 1,
         tabMixinsInit: false,
-        quoteTypeOp
+        quoteTypeOp,
+        // 标记:用户在表格里是否手动修改过单价,仅当为 true 时审批前才需要落库
+        singlePriceChanged: false
       };
     },
     computed: {
@@ -896,6 +919,64 @@
       handleMethod(row) {
         this.$refs.timeDialogRef.open(row);
       },
+      // 修改单价后,联动更新行内的合计/折让字段与组件级总计
+      changeCount(row, index) {
+        if (!row) {
+          this.form.datasource.forEach((item, idx) => {
+            this.$set(
+              this.form.datasource,
+              idx,
+              changeCountUtil(item, this.countObj)
+            );
+          });
+        } else {
+          // 用户在 UI 上实际修改了某行的单价,置位"已改动"标记
+          this.singlePriceChanged = true;
+          this.$set(
+            this.form.datasource,
+            index,
+            changeCountUtil(row, this.countObj)
+          );
+        }
+        this.$nextTick(() => {
+          this.getNotaxSinglePrice();
+          this.changeAll();
+          this.$forceUpdate();
+        });
+      },
+      // 供父组件查询:用户在表格里是否手动调整过单价
+      isSinglePriceChanged() {
+        return this.singlePriceChanged;
+      },
+      // 刷新组件级总计
+      changeAll() {
+        this.allPrice = getAllPrice(this.form.datasource) || 0;
+        if (this.isDiscountTotalPrice) {
+          this.form.discountTotalPrice =
+            getAllDiscountPrice(this.form.datasource) || this.allPrice;
+        }
+        // 通知父组件刷新"订单总金额 / 应付金额"
+        this.$emit('price-change', {
+          totalAmount: this.allPrice,
+          payAmount: this.form.discountTotalPrice
+        });
+      },
+      // 不含税单价 = 单价 / (1 + 税率/100)
+      getNotaxSinglePrice() {
+        this.form.datasource.forEach((item, index) => {
+          if (item.singlePrice && item.taxRate) {
+            this.$set(
+              this.form.datasource[index],
+              'notaxSinglePrice',
+              parseFloat(
+                (item.singlePrice / (1 + Number(item.taxRate) / 100)).toFixed(2)
+              )
+            );
+          } else {
+            this.$set(this.form.datasource[index], 'notaxSinglePrice', '');
+          }
+        });
+      },
       // 返回列表数据
       getTableValue() {
         let comitDatasource = this.form.datasource;
@@ -1047,6 +1128,10 @@
             'productId'
           );
           this.$refs.table?.reload();
+          // 单价允许调整:回显后统一跑一次联动计算,保证 totalPrice / discountTotalPrice / notaxSinglePrice 与 singlePrice 一致
+          if (this.isChangeCount) {
+            this.changeCount();
+          }
         }
       }
     }

+ 1 - 0
src/BIZComponents/outdetails.vue

@@ -687,6 +687,7 @@
                     categoryCode: productItem.categoryCode,
                     bizNo: productItem.bizNo,
                     deliveryDetailId: productItem.deliveryDetailId,
+                    minPackingQuantity: productItem.minPackingQuantity,
                     materialDetailList: packingItem.materialDetailList.map(
                       (materialItem) => {
                         return {

+ 7 - 0
src/BIZComponents/processSubmitDialog/components/parentList.vue

@@ -107,6 +107,13 @@
             showOverflowTooltip: true,
             minWidth: 200
           },
+          {
+            prop: 'version',
+            label: '版本号',
+            align: 'center',
+            width: 80,
+            formatter: (_row, _column, cellValue) => `V${cellValue || 1}.0`
+          },
           {
             prop: 'serialNo',
             label: '客户代号',

+ 2 - 0
src/api/bpm/components/offerApproval/index.js

@@ -1,4 +1,5 @@
 import request from '@/utils/request';
+import { parseAttachmentIds } from '@/utils/attachment';
 
 function dateOnly(value) {
   if (!value) return '';
@@ -76,6 +77,7 @@ export function adaptHiringApproval(raw = {}) {
     status: HIRING_STATUS_LABELS[statusCode] || raw.approvalStatus || '-',
     remark: raw.remark || raw.approvalComment || '',
     attachments,
+    attachmentFileIds: parseAttachmentIds(raw),
     attachmentNames: attachments
       .map((item) => item.fileName || item.name)
       .filter(Boolean),

+ 103 - 0
src/components/ApprovalOpinion/index.vue

@@ -0,0 +1,103 @@
+<template>
+  <div class="approval-opinion">
+    <el-radio-group v-model="opinionType" @change="handleTypeChange">
+      <el-radio label="agree">同意</el-radio>
+      <el-radio label="disagree">不同意</el-radio>
+      <el-radio label="custom">自定义</el-radio>
+    </el-radio-group>
+    <el-input
+      v-if="opinionType === 'custom'"
+      v-model="customOpinion"
+      type="textarea"
+      :rows="rows"
+      :maxlength="maxLength"
+      :show-word-limit="!!maxLength"
+      placeholder="请输入自定义审批意见"
+      @input="emitOpinion"
+    />
+  </div>
+</template>
+
+<script>
+  /** 流程审批意见三选一,向原有表单输出最终意见文本。 */
+  export default {
+    name: 'ApprovalOpinion',
+    props: {
+      value: {
+        type: String,
+        default: '同意'
+      },
+      rows: {
+        type: Number,
+        default: 3
+      },
+      maxLength: {
+        type: Number,
+        default: undefined
+      }
+    },
+    data() {
+      return {
+        opinionType: this.getOpinionType(this.value),
+        customOpinion: this.isPreset(this.value) ? '' : this.value || '',
+        selectedByUser: false
+      };
+    },
+    watch: {
+      value(value) {
+        if (this.opinionType === 'custom' && value === this.customOpinion) {
+          return;
+        }
+        const type = this.getOpinionType(value);
+        this.opinionType = type;
+        if (type === 'custom') {
+          this.customOpinion = value || '';
+        }
+      }
+    },
+    methods: {
+      isPreset(value) {
+        return value === '同意' || value === '不同意';
+      },
+      getOpinionType(value) {
+        if (value === '不同意') {
+          return 'disagree';
+        }
+        return value === '同意' ? 'agree' : 'custom';
+      },
+      /** 校验意见,并使默认意见与驳回操作一致。 */
+      validate(status) {
+        if (status === 0 && !this.selectedByUser && this.opinionType === 'agree') {
+          this.opinionType = 'disagree';
+          this.$emit('input', '不同意');
+        }
+        if (this.opinionType === 'custom' && !this.customOpinion.trim()) {
+          this.$message.warning('请输入自定义审批意见');
+          return false;
+        }
+        return true;
+      },
+      handleTypeChange(type) {
+        this.selectedByUser = true;
+        if (type === 'agree') {
+          this.$emit('input', '同意');
+          return;
+        }
+        if (type === 'disagree') {
+          this.$emit('input', '不同意');
+          return;
+        }
+        this.$emit('input', this.customOpinion);
+      },
+      emitOpinion() {
+        this.$emit('input', this.customOpinion);
+      }
+    }
+  };
+</script>
+
+<style scoped>
+  .approval-opinion .el-textarea {
+    margin-top: 10px;
+  }
+</style>

+ 6 - 5
src/enum/dict.js

@@ -107,7 +107,6 @@ export default {
   数学字符: 'mathematical_symbol',
   印章类型: 'main_seal_type',
   预收款款项类型: 'fin_advance_fund_type'
-
 };
 
 export const numberList = [
@@ -437,7 +436,7 @@ export const paymentTypeOp = [
     value: 4,
     label: '尾款'
   }
-]
+];
 
 export const payAndReceiveEnum = [
   {
@@ -472,10 +471,14 @@ export const payAndReceiveEnum = [
     label: '付款计划单',
     value: 8
   },
+  {
+    label: '发票',
+    value: 9
+  },
   {
     label: '其他',
     value: 99
-  },
+  }
 ];
 
 export const recordingMethodList = [
@@ -483,8 +486,6 @@ export const recordingMethodList = [
   { label: '按样品检', value: 2 }
 ];
 
-
-
 // 用能单位集合
 export const energyConsumingUnitList = [
   {

+ 2 - 0
src/main.js

@@ -35,6 +35,7 @@ import 'bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css';
 import FormMaking from '../lib/vue-form-making/src/index';
 import '@/assets/font_icon/iconfont.css';
 import fileMain from '@/components/addDoc/index.vue';
+import ApprovalOpinion from '@/components/ApprovalOpinion';
 
 import './directives';
 import seekPage from '@/BIZComponents/seekPage';
@@ -52,6 +53,7 @@ Vue.use(elTableInfiniteScroll);
 Vue.component('HeaderTitle', HeaderTitle);
 Vue.component('fileMain', fileMain);
 Vue.component('processSubmitDialog', processSubmitDialog);
+Vue.component('ApprovalOpinion', ApprovalOpinion);
 
 const config = {
   number: 'BigNumber',

+ 42 - 0
src/utils/attachment.js

@@ -0,0 +1,42 @@
+/**
+ * 从审批 / 业务详情的原始接口数据中,兼容多种附件字段来源,
+ * 解析出文件 ID 数组(去重、字符串化)。
+ *
+ * 兼容的字段来源(按常见命名):
+ *  - attachmentIds            字符串(逗号分隔)或字符串数组
+ *  - attachmentFileIds        字符串(逗号分隔)或字符串数组
+ *  - approvalDocumentFileId   单个 ID 或逗号分隔的字符串或数组
+ *  - attachmentFileId         同上
+ *  - resumeAttachmentFileIds  同上
+ *  - files / attachments      对象数组,元素含 fileId / id,或本身就是 ID 字符串
+ *
+ * 这样无论后端接口用哪种字段返回附件,前端都能正确拿到可预览的文件 ID 列表。
+ */
+export function parseAttachmentIds(raw) {
+  raw = raw || {};
+  const ids = [];
+  const collect = (value) => {
+    if (value == null || value === '') return;
+    const list = Array.isArray(value)
+      ? value
+      : String(value)
+          .split(',')
+          .map((s) => s.trim());
+    list.forEach((item) => {
+      if (item == null || item === '') return;
+      const id =
+        typeof item === 'object' ? item.fileId || item.id : String(item).trim();
+      if (id && !ids.includes(String(id))) ids.push(String(id));
+    });
+  };
+
+  collect(raw.attachmentIds);
+  collect(raw.attachmentFileIds);
+  collect(raw.approvalDocumentFileId);
+  collect(raw.attachmentFileId);
+  collect(raw.resumeAttachmentFileIds);
+  if (Array.isArray(raw.files)) collect(raw.files);
+  if (Array.isArray(raw.attachments)) collect(raw.attachments);
+
+  return ids;
+}

+ 13 - 0
src/utils/util.js

@@ -152,6 +152,19 @@ export function getSummaries(param, key, unit) {
   return sums;
 }
 
+// 按 id 去重,保留首次出现的项(用于 v-for :key="item.id" 的列表)
+// 后端返回重复 id 时会导致 Vue 报 "Duplicate keys detected" 并造成选中态/回显错乱
+export function uniqById(list) {
+  if (!Array.isArray(list)) return [];
+  const map = new Map();
+  list.forEach((item) => {
+    if (item && item.id != null && !map.has(item.id)) {
+      map.set(item.id, item);
+    }
+  });
+  return Array.from(map.values());
+}
+
 //随机id
 export function generateRandomString(num = 5) {
   let result = '';

+ 14 - 3
src/views/bpm/done/detailDialog.vue

@@ -195,6 +195,7 @@
 <script>
   import bpmDetail from '@/views/bpm/processInstance/detailNew.vue';
   import Vue from 'vue';
+  import purchaseReturnDetail from '@/views/bpm/handleTask/components/purchaseOrder/returnGoods/detailDialog.vue';
   import { getToken } from '@/utils/token-util';
 
   import businessComponent from '@/BIZComponents/processSubmitDialog/components/businessComponent.vue';
@@ -305,9 +306,19 @@ import businessTripComponent from '@/BIZComponents/processSubmitDialog/component
           );
           return;
         }
-        Vue.component('async-biz-form-component', (resolve) => {
-          require([`@/views${router}`], resolve);
-        });
+        const isPurchaseReturnDetail =
+          router ===
+            '/bpm/handleTask/components/purchaseOrder/returnGoods/detailDialog.vue' ||
+          router ===
+            '/bpm/handleTask/components/purchaseOrder/returnGoods/detailDialog';
+        Vue.component(
+          'async-biz-form-component',
+          isPurchaseReturnDetail
+            ? purchaseReturnDetail
+            : (resolve) => {
+                require([`@/views${router}`], resolve);
+              }
+        );
       },
 
       cancel() {

+ 4 - 8
src/views/bpm/handleTask/components/EnergyPricingScheme/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -10,11 +10,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -23,7 +19,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
 
@@ -32,7 +28,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         >驳回
       </el-button>
       <el-dropdown

+ 4 - 8
src/views/bpm/handleTask/components/accidentReport/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -10,11 +10,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -23,7 +19,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
 
@@ -32,7 +28,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         >驳回
       </el-button>
       <el-dropdown

+ 4 - 8
src/views/bpm/handleTask/components/adjustNote/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
 
         style="margin-bottom: 20px"
         :rules="{
@@ -11,11 +11,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -24,7 +20,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
       <el-button
@@ -32,7 +28,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
        
         >驳回
       </el-button>

+ 4 - 8
src/views/bpm/handleTask/components/afterSales/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -10,11 +10,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -28,7 +24,7 @@
             outInData.verifyStatus == 2)
         "
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
       <el-button
@@ -49,7 +45,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="rejectTask(0)"
+        @click="$refs.approvalOpinion.validate(0) && rejectTask(0)"
         >驳回
       </el-button>
     </div>

+ 4 - 8
src/views/bpm/handleTask/components/allocate/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6" v-loading="isSaveLoading">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -10,11 +10,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
 
@@ -24,7 +20,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         :loading="isSaveLoading"
         >通过
       </el-button>
@@ -34,7 +30,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         :loading="isSaveLoading"
         >驳回
       </el-button>

+ 4 - 4
src/views/bpm/handleTask/components/bomApprover/submit.vue

@@ -8,15 +8,15 @@
       }" -->
     <el-form label-width="100px" ref="formRef" :model="form">
 
-      <el-form-item label="审批建议"  style="margin-bottom: 20px">
-        <el-input type="textarea" v-model="form.reason" placeholder="请输入审批建议" />
+      <el-form-item label="审批意见"  style="margin-bottom: 20px">
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
-      <el-button icon="el-icon-edit-outline" type="success" size="mini" v-click-once @click="handleAudit(1)">通过
+      <el-button icon="el-icon-edit-outline" type="success" size="mini" v-click-once @click="$refs.approvalOpinion.validate(1) && handleAudit(1)">通过
       </el-button>
 
-      <el-button icon="el-icon-circle-close" type="danger" size="mini" v-click-once @click="handleAudit(0)">驳回
+      <el-button icon="el-icon-circle-close" type="danger" size="mini" v-click-once @click="$refs.approvalOpinion.validate(0) && handleAudit(0)">驳回
       </el-button>
 
 

+ 4 - 8
src/views/bpm/handleTask/components/bomApproverJSYY/submit.vue

@@ -3,7 +3,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
 
         style="margin-bottom: 20px"
         :rules="{
@@ -12,11 +12,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -25,7 +21,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
 
@@ -34,7 +30,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         >驳回
       </el-button>
     </div>

+ 4 - 8
src/views/bpm/handleTask/components/bomApproverJSdevice/submit.vue

@@ -3,7 +3,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
      
         style="margin-bottom: 20px"
         :rules="{
@@ -12,11 +12,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -25,7 +21,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
 
@@ -34,7 +30,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         >驳回
       </el-button>
     </div>

+ 4 - 8
src/views/bpm/handleTask/components/businessOpportunity/submit.vue

@@ -27,7 +27,7 @@
         </el-select>
       </el-form-item>
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -35,11 +35,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -48,7 +44,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
       <!-- <el-button
@@ -64,7 +60,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         v-if="!['starter', 'salesmanApprove'].includes(taskDefinitionKey)"
         >驳回
       </el-button>

+ 4 - 8
src/views/bpm/handleTask/components/centralizedMeterReading/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -10,11 +10,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -23,7 +19,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
 
@@ -32,7 +28,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         >驳回
       </el-button>
       <el-dropdown

+ 4 - 8
src/views/bpm/handleTask/components/certificateQualifications/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -10,11 +10,7 @@
           trigger: 'blur'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -23,7 +19,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
       <el-button
@@ -31,7 +27,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         >驳回
       </el-button>
 

+ 4 - 8
src/views/bpm/handleTask/components/changeManage/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
 
         style="margin-bottom: 20px"
         :rules="{
@@ -11,11 +11,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -24,7 +20,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
       <el-button
@@ -32,7 +28,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
        
         >驳回
       </el-button>

+ 4 - 8
src/views/bpm/handleTask/components/changeManagement/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -10,11 +10,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -23,7 +19,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
 
@@ -32,7 +28,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         v-if="taskDefinitionKey != 'starter'"
         >驳回
       </el-button>

+ 4 - 8
src/views/bpm/handleTask/components/commodityManagement/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -10,11 +10,7 @@
           trigger: 'blur'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -23,7 +19,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
       <el-button
@@ -31,7 +27,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         >驳回
       </el-button>
 

+ 4 - 8
src/views/bpm/handleTask/components/contact/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -10,11 +10,7 @@
           trigger: 'blur'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -23,7 +19,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
       >通过
       </el-button>
       <el-button
@@ -31,7 +27,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="rejectTask(0)"
+        @click="$refs.approvalOpinion.validate(0) && rejectTask(0)"
       >驳回
       </el-button>
 

+ 7 - 0
src/views/bpm/handleTask/components/contactQC/parentList.vue

@@ -91,6 +91,13 @@ export default {
                     showOverflowTooltip: true,
                     minWidth: 200
                 },
+                {
+                    prop: 'version',
+                    label: '版本号',
+                    align: 'center',
+                    width: 80,
+                    formatter: (_row, _column, cellValue) => `V${cellValue || 1}.0`
+                },
                 {
                     prop: 'serialNo',
                     label: '客户代号',

+ 4 - 8
src/views/bpm/handleTask/components/contactQC/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
 
         style="margin-bottom: 20px"
         :rules="{
@@ -11,11 +11,7 @@
           trigger: 'blur'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -24,7 +20,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
       >通过
       </el-button>
       <el-button
@@ -32,7 +28,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         v-if="!['starter', 'starterFillApprove'].includes(taskDefinitionKey)"
       >驳回
       </el-button>

+ 4 - 8
src/views/bpm/handleTask/components/contractBook/contractChange/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
 
         style="margin-bottom: 20px"
         :rules="{
@@ -11,11 +11,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -24,7 +20,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
       <el-button
@@ -32,7 +28,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
        
         >驳回
       </el-button>

+ 4 - 8
src/views/bpm/handleTask/components/contractBook/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
 
         style="margin-bottom: 20px"
         :rules="{
@@ -11,11 +11,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -24,7 +20,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
       <el-button
@@ -32,7 +28,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         v-if="!['starter', 'starterFillApprove'].includes(taskDefinitionKey)"
         >驳回
       </el-button>

+ 4 - 8
src/views/bpm/handleTask/components/cost/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -10,11 +10,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -28,7 +24,7 @@
           (taskDefinitionKey == 'wms_out' &&
             outInData.verifyStatus == 2)
         "
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
       <el-button
@@ -48,7 +44,7 @@
         icon="el-icon-circle-close"
         type="danger"
         size="mini"
-        @click="rejectTask(0)"
+        @click="$refs.approvalOpinion.validate(0) && rejectTask(0)"
         >驳回
       </el-button>
     </div>

+ 4 - 8
src/views/bpm/handleTask/components/customApproval/submit.vue

@@ -1,12 +1,8 @@
 <template>
   <el-col :span="16" :offset="6" v-loading="isSaveLoading">
     <el-form label-width="100px" ref="formRef" :model="form" :rules="rules">
-      <el-form-item label="审批建议" prop="reason" style="margin-bottom: 20px">
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+      <el-form-item label="审批意见" prop="reason" style="margin-bottom: 20px">
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -16,7 +12,7 @@
         size="mini"
         v-click-once
         :loading="isSaveLoading"
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
 
@@ -26,7 +22,7 @@
         size="mini"
         v-click-once
         :loading="isSaveLoading"
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         >驳回
       </el-button>
 

+ 4 - 8
src/views/bpm/handleTask/components/cuttingPlan/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
  
         style="margin-bottom: 20px"
         :rules="{
@@ -11,11 +11,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -24,7 +20,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
 
@@ -33,7 +29,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         >驳回
       </el-button>
 

+ 4 - 8
src/views/bpm/handleTask/components/demandApplication/submit.vue

@@ -1,12 +1,8 @@
 <template>
   <el-col :span="16" :offset="6" v-loading="isSaveLoading">
     <el-form label-width="100px" ref="formRef" :model="form" :rules="rules">
-      <el-form-item label="审批建议" prop="reason" style="margin-bottom: 20px">
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+      <el-form-item label="审批意见" prop="reason" style="margin-bottom: 20px">
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -16,7 +12,7 @@
         size="mini"
         v-click-once
         :loading="isSaveLoading"
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
       <el-button
@@ -25,7 +21,7 @@
         size="mini"
         v-click-once
         :loading="isSaveLoading"
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         >驳回
       </el-button>
 

+ 4 - 8
src/views/bpm/handleTask/components/doc/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -10,11 +10,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -24,7 +20,7 @@
         size="mini"
         v-click-once
         :loading="auditLoading"
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
 
@@ -34,7 +30,7 @@
         size="mini"
         v-click-once
         :loading="auditLoading"
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         v-if="!['starter'].includes(taskDefinitionKey)"
         >驳回
       </el-button>

+ 4 - 8
src/views/bpm/handleTask/components/ehsEquipmentDisposal/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -10,11 +10,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -23,7 +19,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
 
@@ -32,7 +28,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         v-if="taskDefinitionKey != 'starter'"
         >驳回
       </el-button>

+ 4 - 8
src/views/bpm/handleTask/components/entrust/submit.vue

@@ -10,7 +10,7 @@
       </el-form-item> -->
 
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -18,11 +18,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -31,7 +27,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
       <!-- <el-button
@@ -47,7 +43,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         >驳回
       </el-button>
       <!-- <el-dropdown

+ 4 - 8
src/views/bpm/handleTask/components/equipmentDisposal/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
     
         style="margin-bottom: 20px"
         :rules="{
@@ -11,11 +11,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -24,7 +20,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
 
@@ -33,7 +29,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         v-if="taskDefinitionKey != 'starter'"
         >驳回
       </el-button>

+ 4 - 8
src/views/bpm/handleTask/components/exceptionManagement/exceptionList/submit.vue

@@ -33,7 +33,7 @@
       </el-form-item>
 
       <el-form-item
-        label="审批建议"
+        label="审批意见"
 
         style="margin-bottom: 20px"
         :rules="{
@@ -42,11 +42,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
       <el-form-item
         v-if="taskDefinitionKey != 'starter'"
@@ -64,7 +60,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         v-if="form.exceptionDetermine != 1 || taskDefinitionKey == 'starter'"
         >通过
       </el-button>
@@ -82,7 +78,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         v-if="taskDefinitionKey != 'starter'"
         >驳回
       </el-button>

+ 14 - 0
src/views/bpm/handleTask/components/financialManage/components/customerListDialog.vue

@@ -91,6 +91,13 @@ export default {
             showOverflowTooltip: true,
             minWidth: 200
           },
+          {
+            prop: 'version',
+            label: '版本号',
+            align: 'center',
+            width: 80,
+            formatter: (_row, _column, cellValue) => `V${cellValue || 1}.0`
+          },
           {
             prop: 'serialNo',
             label: '客户代号',
@@ -176,6 +183,13 @@ export default {
             showOverflowTooltip: true,
             minWidth: 200
           },
+          {
+            prop: 'version',
+            label: '版本号',
+            align: 'center',
+            width: 80,
+            formatter: (_row, _column, cellValue) => `V${cellValue || 1}.0`
+          },
           {
             prop: 'serialNo',
             label: '供应商代号',

+ 4 - 8
src/views/bpm/handleTask/components/financialManage/feeManage/feeApplication/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
    
         style="margin-bottom: 20px"
         :rules="{
@@ -11,11 +11,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -24,7 +20,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
       >通过
       </el-button>
       <el-button
@@ -32,7 +28,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         v-if="!['starter'].includes(taskDefinitionKey)"
       >驳回
       </el-button>

+ 4 - 8
src/views/bpm/handleTask/components/financialManage/invoiceManage/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -10,11 +10,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -24,7 +20,7 @@
         size="mini"
         v-click-once
         :loading="loading"
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
       <el-button
@@ -33,7 +29,7 @@
         size="mini"
         v-click-once
         :loading="loading"
-        @click="_approveTaskWithVariables(0)"
+        @click="$refs.approvalOpinion.validate(0) && _approveTaskWithVariables(0)"
         >驳回
       </el-button>
       <el-dropdown @command="(command) => handleCommand(command)" style="margin-left: 30px;">

+ 5 - 0
src/views/bpm/handleTask/components/financialManage/payableManage/components/detailDialog.vue

@@ -99,6 +99,11 @@
             <el-input disabled v-model="form.contactName"></el-input>
           </el-form-item>
         </el-col>
+        <el-col :span="8">
+          <el-form-item label="款项类型" prop="paymentTypeName">
+            <el-input disabled v-model="form.paymentTypeName"></el-input>
+          </el-form-item>
+        </el-col>
         <el-col :span="8">
           <el-form-item label="附件">
             <fileMain v-model="form.files"></fileMain>

+ 4 - 8
src/views/bpm/handleTask/components/financialManage/payableManage/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         prop="reason"
         style="margin-bottom: 20px"
         :rules="{
@@ -11,11 +11,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -24,7 +20,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
       >通过
       </el-button>
       <el-button
@@ -32,7 +28,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         v-if="!['starter'].includes(taskDefinitionKey)"
       >驳回
       </el-button>

+ 6 - 1
src/views/bpm/handleTask/components/financialManage/receivableManage/components/detailDialog.vue

@@ -107,7 +107,12 @@
               <el-input :disabled="dialogType == 'view'" v-model="dataForm.remark"></el-input>
             </el-form-item>
           </el-col>
-          <el-col :span="12">
+          <el-col :span="8">
+            <el-form-item label="款项类型" prop="paymentTypeName">
+              <el-input disabled v-model="dataForm.paymentTypeName"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
             <el-form-item prop="files" label="附件">
               <fileMain v-model="dataForm.files" :type="dialogType == 'view' ? 'view' : 'add'"></fileMain>
             </el-form-item>

+ 4 - 8
src/views/bpm/handleTask/components/financialManage/receivableManage/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -10,11 +10,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -24,7 +20,7 @@
         size="mini"
         v-click-once
         :loading="saveLoading"
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
       >通过
       </el-button>
       <el-button
@@ -33,7 +29,7 @@
         size="mini"
         v-click-once
         :loading="saveLoading"
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         v-if="!['starter'].includes(taskDefinitionKey)"
       >驳回
       </el-button>

+ 4 - 8
src/views/bpm/handleTask/components/formCodeManagement/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -10,11 +10,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -23,7 +19,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
 
@@ -32,7 +28,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         >驳回
       </el-button>
       <el-dropdown

+ 5 - 6
src/views/bpm/handleTask/components/hiringApproval/hiringApprovalDetail.vue

@@ -209,7 +209,7 @@
           <div class="attach-row">
             <label>简历</label>
             <div class="attach-content">
-              <fileMain v-model="resumeFileIds" type="view" size="small" />
+              <fileMain v-model="resumeFileIds" type="view" size="small" :view-disabled="!resumeFileIds.length" />
             </div>
           </div>
         </section>
@@ -221,11 +221,11 @@
 <script>
 import { getPositionById, getPositionPage } from '@/api/hr';
 import {
-  getHiringApprovalById,
-  parseResumeAttachmentFileIds
+  getHiringApprovalById
 } from '@/api/hr/hiringApproval';
 import { listOrganizations } from '@/api/organization';
 import { getDictByCode } from '@/api/sys';
+import { parseAttachmentIds } from '@/utils/attachment';
 
 const emptyForm = () => ({
   id: null,
@@ -425,9 +425,8 @@ export default {
         specialTerms: detail.specialTerms || detail.remark || '',
         specialApprovalReason: detail.specialApprovalReason || ''
       };
-      this.resumeFileIds = parseResumeAttachmentFileIds(
-        detail.resumeAttachmentFileIds
-      );
+      // 兼容多种附件字段来源(attachmentIds / resumeAttachmentFileIds / files 等)
+      this.resumeFileIds = parseAttachmentIds(detail);
     },
     async loadDictOptions() {
       try {

+ 4 - 8
src/views/bpm/handleTask/components/hiringApproval/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -10,11 +10,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
 
@@ -25,7 +21,7 @@
         size="mini"
         :loading="isLoading"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
 
@@ -35,7 +31,7 @@
         size="mini"
         v-click-once
         :loading="isLoading"
-        @click="outApproveNotPass(0)"
+        @click="$refs.approvalOpinion.validate(0) && outApproveNotPass(0)"
         >驳回
       </el-button>
     </div>

+ 3 - 11
src/views/bpm/handleTask/components/hrContractManagement/hrContractDetail.vue

@@ -180,6 +180,7 @@ import {
   contractFlowSignStatusLabel,
   pickFlowSignStatus
 } from '@/api/hr';
+import { parseAttachmentIds } from '@/utils/attachment';
 
 const CONTRACT_TYPES = [
   { value: 'FIXED', label: '固定期限劳动合同' },
@@ -213,16 +214,7 @@ function signMethodLabel(value) {
   return value || '';
 }
 
-function collectAttachmentFileIds(files) {
-  const list = (Array.isArray(files) ? files : []).filter(Boolean);
-  const attach = list.filter((item) =>
-    ['ATTACHMENT', 'SCAN', 'ARCHIVE'].includes(item.filePurpose)
-  );
-  const source = attach.length ? attach : list;
-  return source
-    .map((item) => item.fileId || item.id)
-    .filter((id) => id != null && id !== '');
-}
+// 附件 ID 解析已统一由 src/utils/attachment.js 的 parseAttachmentIds 处理
 
 function adaptContract(item = {}) {
   const files = item.files || [];
@@ -263,7 +255,7 @@ function adaptContract(item = {}) {
     probationMonths: item.probationMonths,
     createdAt: formatDateTime(item.createTime),
     probationEnd: formatDate(item.probationEndDate),
-    attachmentFileIds: collectAttachmentFileIds(files),
+    attachmentFileIds: parseAttachmentIds(item),
     level: item.positionLevel || item.level || '',
     manager: item.managerName || item.manager || '',
     archived:

+ 4 - 8
src/views/bpm/handleTask/components/hrContractManagement/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -10,11 +10,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -24,7 +20,7 @@
         size="mini"
         :loading="isLoading"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
 
@@ -34,7 +30,7 @@
         size="mini"
         :loading="isLoading"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         >驳回
       </el-button>
       <el-dropdown

+ 4 - 8
src/views/bpm/handleTask/components/ingredientOutbound/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -10,11 +10,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -24,7 +20,7 @@
         size="mini"
         :loading="isLoading"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
       <el-button
@@ -32,7 +28,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         >驳回
       </el-button>
 

+ 4 - 8
src/views/bpm/handleTask/components/inoutBound/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
 
         style="margin-bottom: 20px"
         :rules="{
@@ -11,11 +11,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
 
@@ -26,7 +22,7 @@
         size="mini"
         :loading="isLoading"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
 
@@ -36,7 +32,7 @@
         size="mini"
         :loading="isLoading"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         >驳回
       </el-button>
     </div>

+ 4 - 8
src/views/bpm/handleTask/components/inquiryManage/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
    
         style="margin-bottom: 20px"
         :rules="{
@@ -11,11 +11,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -24,7 +20,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
       <el-button
@@ -32,7 +28,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
      
         >驳回
       </el-button>

+ 4 - 8
src/views/bpm/handleTask/components/inspectionProjectRequest/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -10,11 +10,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -24,7 +20,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
 
@@ -34,7 +30,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="rejectTask(0)"
+        @click="$refs.approvalOpinion.validate(0) && rejectTask(0)"
         >驳回
       </el-button>
     </div>

+ 4 - 8
src/views/bpm/handleTask/components/inspectionReportTemplate/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -10,11 +10,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -23,7 +19,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
 
@@ -32,7 +28,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="rejectTask(0)"
+        @click="$refs.approvalOpinion.validate(0) && rejectTask(0)"
         >驳回
       </el-button>
     </div>

+ 4 - 8
src/views/bpm/handleTask/components/inspectionStandard/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -10,11 +10,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -23,7 +19,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
 
@@ -32,7 +28,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="rejectTask(0)"
+        @click="$refs.approvalOpinion.validate(0) && rejectTask(0)"
         >驳回
       </el-button>
     </div>

+ 4 - 8
src/views/bpm/handleTask/components/inspectionTemplate/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -10,11 +10,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -23,7 +19,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
 
@@ -32,7 +28,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="rejectTask(0)"
+        @click="$refs.approvalOpinion.validate(0) && rejectTask(0)"
         >驳回
       </el-button>
     </div>

+ 4 - 8
src/views/bpm/handleTask/components/itemPublishApproval/submit.vue

@@ -1,12 +1,8 @@
 <template>
   <el-col :span="16" :offset="6" v-loading="isSaveLoading">
     <el-form label-width="100px" ref="formRef" :model="form" :rules="rules">
-      <el-form-item label="审批建议" prop="reason" style="margin-bottom: 20px">
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+      <el-form-item label="审批意见" prop="reason" style="margin-bottom: 20px">
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -16,7 +12,7 @@
         size="mini"
         v-click-once
         :loading="isSaveLoading"
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
 
@@ -26,7 +22,7 @@
         size="mini"
         v-click-once
         :loading="isSaveLoading"
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         >驳回
       </el-button>
 

+ 4 - 8
src/views/bpm/handleTask/components/itemReceipts/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
 
         style="margin-bottom: 20px"
         :rules="{
@@ -11,11 +11,7 @@
           trigger: 'blur'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -24,7 +20,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
       <el-button
@@ -32,7 +28,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         >驳回
       </el-button>
     </div>

+ 4 - 8
src/views/bpm/handleTask/components/lossOverflowReport/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
 
         style="margin-bottom: 20px"
         :rules="{
@@ -11,11 +11,7 @@
           trigger: 'blur'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -24,7 +20,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
       <el-button
@@ -32,7 +28,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         >驳回
       </el-button>
     </div>

+ 3 - 7
src/views/bpm/handleTask/components/maintenance/repair/submit.vue

@@ -80,7 +80,7 @@
         </el-select>
       </el-form-item>
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -88,11 +88,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -101,7 +97,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
       <!-- <el-button

+ 4 - 8
src/views/bpm/handleTask/components/marketManagem/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -10,11 +10,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -23,7 +19,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
 
@@ -32,7 +28,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         v-if="!['starter'].includes(taskDefinitionKey)"
         >驳回
       </el-button>

+ 4 - 8
src/views/bpm/handleTask/components/materialPlan/submit.vue

@@ -27,7 +27,7 @@
         </el-select>
       </el-form-item> -->
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -35,11 +35,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -47,7 +43,7 @@
         icon="el-icon-edit-outline"
         type="success"
         size="mini"
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         v-click-once
         >通过
       </el-button>
@@ -57,7 +53,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="rejectTask(0)"
+        @click="$refs.approvalOpinion.validate(0) && rejectTask(0)"
         >驳回
       </el-button>
 

+ 7 - 11
src/views/bpm/handleTask/components/measuringToolInspection/submit.vue

@@ -1,12 +1,8 @@
 <template>
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
-      <el-form-item label="审批建议"  style="margin-bottom: 20px">
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+      <el-form-item label="审批意见"  style="margin-bottom: 20px">
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -16,7 +12,7 @@
         size="mini"
         :loading="isSaveLoading"
         v-click-once
-        @click="submit"
+        @click="$refs.approvalOpinion.validate(1) && submit()"
         v-if="currentBtn === '上交'"
         >上交
       </el-button>
@@ -26,7 +22,7 @@
         size="mini"
         :loading="isSaveLoading"
         v-click-once
-        @click="submit"
+        @click="$refs.approvalOpinion.validate(1) && submit()"
         v-if="currentBtn === '接收'"
         >接收
       </el-button>
@@ -36,7 +32,7 @@
         size="mini"
         :loading="isSaveLoading"
         v-click-once
-        @click="submit"
+        @click="$refs.approvalOpinion.validate(1) && submit()"
         v-if="currentBtn === '检查'"
         >已检
       </el-button>
@@ -46,7 +42,7 @@
         size="mini"
         :loading="isSaveLoading"
         v-click-once
-        @click="submit"
+        @click="$refs.approvalOpinion.validate(1) && submit()"
         v-if="currentBtn === '发出'"
         >发出
       </el-button>
@@ -56,7 +52,7 @@
         size="mini"
         :loading="isSaveLoading"
         v-click-once
-        @click="submit(1)"
+        @click="$refs.approvalOpinion.validate(1) && submit(1)"
         v-if="['user_receive'].includes(this.taskDefinitionKey)"
         >报工
       </el-button>

+ 4 - 8
src/views/bpm/handleTask/components/mesBatchRecordManage/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
 
         style="margin-bottom: 20px"
         :rules="{
@@ -11,11 +11,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -24,7 +20,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
       <el-button
@@ -32,7 +28,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
 
         >驳回
       </el-button>

+ 4 - 8
src/views/bpm/handleTask/components/mesWorkOrderChecklist/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -10,11 +10,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -23,7 +19,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
       <el-button
@@ -31,7 +27,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         >驳回
       </el-button>
 

+ 4 - 8
src/views/bpm/handleTask/components/noticeIssuance/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
 
         style="margin-bottom: 20px"
         :rules="{
@@ -11,11 +11,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -24,7 +20,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
       <el-button
@@ -32,7 +28,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
        
         >驳回
       </el-button>

+ 9 - 12
src/views/bpm/handleTask/components/offerApproval/offerApprovalDetail.vue

@@ -107,17 +107,12 @@
       </div>
       <div class="detail-block">
         <span>附件</span>
-        <div
-          class="file-tags"
-          v-if="form.attachmentNames && form.attachmentNames.length"
-        >
-          <em
-            v-for="(name, index) in form.attachmentNames"
-            :key="name + index"
-            class="file-tag"
-            >{{ name }}</em
-          >
-        </div>
+        <fileMain
+          v-if="attachmentFileIds.length"
+          v-model="attachmentFileIds"
+          type="view"
+          size="small"
+        />
         <p v-else class="detail-muted">暂无附件</p>
       </div>
       <div class="detail-block" v-if="form.remark">
@@ -163,7 +158,8 @@ export default {
   data() {
     return {
       loading: false,
-      form: emptyForm()
+      form: emptyForm(),
+      attachmentFileIds: []
     };
   },
   watch: {
@@ -183,6 +179,7 @@ export default {
           ...emptyForm(),
           ...(await getHiringApprovalById(id))
         };
+        this.attachmentFileIds = this.form.attachmentFileIds || [];
       } catch (error) {
         this.form = emptyForm();
         this.$message.error(error.message || '录用审批详情加载失败');

+ 4 - 8
src/views/bpm/handleTask/components/offerApproval/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -10,11 +10,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -23,7 +19,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
 
@@ -32,7 +28,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         >驳回
       </el-button>
       <el-dropdown

+ 4 - 8
src/views/bpm/handleTask/components/outBound/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -10,11 +10,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
 
@@ -25,7 +21,7 @@
         size="mini"
         :loading="isLoading"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
 
@@ -35,7 +31,7 @@
         size="mini"
         v-click-once
         :loading="isLoading"
-        @click="outApproveNotPass(0)"
+        @click="$refs.approvalOpinion.validate(0) && outApproveNotPass(0)"
         >驳回
       </el-button>
     </div>

+ 4 - 8
src/views/bpm/handleTask/components/outsourcedWarehousing/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -10,11 +10,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
 
@@ -24,7 +20,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit2(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit2(1)"
         >通过
       </el-button>
 
@@ -33,7 +29,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit2(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit2(0)"
         >驳回
       </el-button>
     </div>

+ 5 - 9
src/views/bpm/handleTask/components/outsourcedWarehousingNoProcurement/submit.vue

@@ -27,7 +27,7 @@
         </el-select>
       </el-form-item>
       <el-form-item
-        label="审批建议"
+        label="审批意见"
 
         style="margin-bottom: 20px"
         :rules="{
@@ -36,11 +36,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -49,7 +45,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         v-if="
           !['storeManagerApprove'].includes(taskDefinitionKey) ||
           (['storeManagerApprove'].includes(taskDefinitionKey) &&
@@ -63,7 +59,7 @@
         size="mini"
         :loading="isSaveLoading"
         v-click-once
-        @click="storeManagerApprove"
+        @click="$refs.approvalOpinion.validate(1) && storeManagerApprove()"
         v-if="
           ['storeManagerApprove'].includes(taskDefinitionKey) &&
           activeComp == 'inoutBound' &&
@@ -76,7 +72,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         v-if="
           !['starter', 'qualityInspectionFeedback', 'QCLeaderApprove'].includes(
             taskDefinitionKey

+ 4 - 8
src/views/bpm/handleTask/components/positionApplication/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -10,11 +10,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -23,7 +19,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
 
@@ -32,7 +28,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         >驳回
       </el-button>
       <el-dropdown

+ 95 - 33
src/views/bpm/handleTask/components/positionTransfer/positionTransferDetail.vue

@@ -77,8 +77,9 @@
 
 <script>
 import { getUserChangeById } from '@/api/main';
-import { listOrganizations, adaptEmployee, getEmployeeById } from '@/api/organization';
+import { listOrganizations, getOrganization, adaptEmployee, getEmployeeById } from '@/api/organization';
 import { getDictByCode } from '@/api/sys';
+import { parseAttachmentIds } from '@/utils/attachment';
 
 /** 异动类型(与接口文档 changeType 枚举对齐) */
 const CHANGE_TYPE_LABELS = {
@@ -135,6 +136,7 @@ const empty = () => ({
   contractPeriod: '',
   // 变更信息
   targetLegalId: null,
+  targetLegalName: '',
   targetDeptId: null,
   targetDept: '',
   positionSequence: '',
@@ -259,22 +261,28 @@ export default {
       this.loading = true;
       try {
         const record = await getUserChangeById(id);
-        // 异动单只带 userId:并行补查员工档案与组织列表
-        const [employee] = await Promise.all([
-          this.fetchEmployee(record),
-          this.loadOrganizations(),
-          this.loadPositionNatureOptions()
-        ]);
-        this.form = this.mapForm(record, employee);
-        const fileId = this.form.approvalDocumentFileId;
-        this.approvalFileIds = fileId ? [fileId] : [];
+        // 主数据先行渲染,补查(员工/组织/字典)失败不阻断、不清空
+        this.form = this.mapForm(record, null);
+        // 兼容多种附件字段来源(attachmentIds / approvalDocumentFileId 等)
+        this.approvalFileIds = parseAttachmentIds(record);
+        try {
+          // 异动单只带 userId:并行补查员工档案与组织列表
+          const [employee] = await Promise.all([
+            this.fetchEmployee(record),
+            this.loadOrganizations(),
+            this.loadPositionNatureOptions()
+          ]);
+          this.form = this.mapForm(record, employee);
+        } catch (error) {
+          // 补查失败:保留已解析的主数据继续展示
+        }
+        // 组织树查不到机构名时,按 id 单查补全
+        this.ensureLegalName(this.form.targetLegalId);
       } catch (error) {
         this.form = empty();
         this.approvalFileIds = [];
-        if (process.env.NODE_ENV !== 'production') {
-          // eslint-disable-next-line no-console
-          console.warn('[PositionTransferDetail] 加载岗位变更单失败:', error);
-        }
+        // eslint-disable-next-line no-console
+        console.warn('[PositionTransferDetail] 加载岗位变更单失败:', error);
       } finally {
         this.loading = false;
       }
@@ -295,21 +303,28 @@ export default {
     async loadOrganizations() {
       try {
         const res = await listOrganizations();
-        const list = Array.isArray(res)
+        const raw = Array.isArray(res)
           ? res
           : (res && (res.list || res.records || res.rows)) || [];
-        this.orgList = list
-          .filter(item => item && item.id != null && item.id !== '')
-          .map(item => ({
-            id: String(item.id),
-            name: item.name || '',
-            parentId:
-              item.parentId != null && item.parentId !== ''
-                ? String(item.parentId)
-                : '',
-            type: item.type
-          }))
-          .filter(item => item.name);
+        // getGroupList 返回树形(含 children),需递归展开为平铺列表
+        const flat = [];
+        const walk = nodes => {
+          (Array.isArray(nodes) ? nodes : []).forEach(item => {
+            if (!item || item.id == null || item.id === '') return;
+            flat.push({
+              id: String(item.id),
+              name: item.name || '',
+              parentId:
+                item.parentId != null && item.parentId !== ''
+                  ? String(item.parentId)
+                  : '',
+              type: item.type
+            });
+            if (item.children && item.children.length) walk(item.children);
+          });
+        };
+        walk(raw);
+        this.orgList = flat.filter(item => item.name);
       } catch (error) {
         this.orgList = [];
       }
@@ -408,9 +423,29 @@ export default {
           .filter(Boolean)
           .map(toDateStr)
           .join(' 至 '),
-        // 变更信息
-        targetLegalId: first(record.targetLegalId) || null,
-        targetDeptId: first(record.targetDeptId) || null,
+        // 变更信息:机构来自 beforeSnapshot / afterSnapshot(接口无顶层机构字段)
+        targetLegalId: first(
+          record.targetLegalId,
+          record.targetOrganizationId,
+          record.toOrganizationId,
+          record.toLegalId,
+          record.organizationId,
+          record.legalEntityId,
+          after.legalId,
+          before.legalId
+        ) || null,
+        // 机构名:接口/快照直接返回的名字优先,避免依赖组织树回显
+        targetLegalName: first(
+          record.targetLegalName,
+          record.targetOrganizationName,
+          record.toLegalName,
+          record.toOrganizationName,
+          record.organizationName,
+          record.legalEntityName,
+          after.legalName,
+          before.legalName
+        ) || '',
+        targetDeptId: first(record.targetDeptId, after.deptId, before.deptId) || null,
         targetDept: first(
           record.targetDeptName,
           record.targetDept,
@@ -466,13 +501,15 @@ export default {
       if (explicit) return explicit;
       return onlineDocumentTemplateId ? 'online' : 'offline';
     },
-    /** 员工所属机构:档案机构 → 部门上溯顶层机构 */
+    /** 员工所属机构:档案机构 → 快照机构 → 部门上溯顶层机构 */
     resolveOriginLegal(record, employee) {
       const emp = employee || {};
+      const before = parseSnapshot(record && record.beforeSnapshot);
       const explicit = first(
         emp.company,
         emp.legalEntity,
-        emp.raw && emp.raw.groupName
+        emp.raw && emp.raw.groupName,
+        before.legalName
       );
       if (explicit) return explicit;
       const legalId = this.findLegalIdByDept(
@@ -500,13 +537,38 @@ export default {
       );
       return (legal && legal.id) || node.id;
     },
-    /** 机构名称:组织列表优先,缺失时按部门上溯,兜底原始 id */
+    /** 机构名称:接口直接返回的机构名优先,其次组织树查询,兜底原始 id */
     legalName(id) {
+      if (this.form.targetLegalName) return this.form.targetLegalName;
       const target =
         id == null || id === '' ? this.findLegalIdByDept(this.form.targetDeptId) : id;
       if (target == null || target === '') return '-';
       const node = this.orgList.find(item => String(item.id) === String(target));
       return (node && node.name) || String(target);
+    },
+    /** 组织树查不到机构名时,按 id 单查补全(不阻塞渲染) */
+    async ensureLegalName(id) {
+      if (id == null || id === '' || this.form.targetLegalName) return;
+      if (this.orgList.some(item => String(item.id) === String(id))) return;
+      try {
+        const node = await getOrganization(id);
+        if (node && node.name) {
+          this.orgList = [
+            ...this.orgList,
+            {
+              id: String(node.id != null ? node.id : id),
+              name: node.name,
+              parentId:
+                node.parentId != null && node.parentId !== ''
+                  ? String(node.parentId)
+                  : '',
+              type: node.type
+            }
+          ];
+        }
+      } catch (error) {
+        // 单查失败不影响其它字段展示
+      }
     }
   }
 };

+ 4 - 8
src/views/bpm/handleTask/components/positionTransfer/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -10,11 +10,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -23,7 +19,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
 
@@ -32,7 +28,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         >驳回
       </el-button>
       <el-dropdown

+ 4 - 8
src/views/bpm/handleTask/components/prepayment/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -10,11 +10,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -23,7 +19,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
 
@@ -32,7 +28,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="rejectTask(0)"
+        @click="$refs.approvalOpinion.validate(0) && rejectTask(0)"
         >驳回
       </el-button>
     </div>

+ 4 - 8
src/views/bpm/handleTask/components/producePlan/submit.vue

@@ -27,7 +27,7 @@
         </el-select>
       </el-form-item> -->
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -35,11 +35,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -48,7 +44,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
       <!-- <el-button
@@ -64,7 +60,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         v-if="!['starter'].includes(taskDefinitionKey)"
         >驳回
       </el-button>

+ 4 - 8
src/views/bpm/handleTask/components/productionWarehousing/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -10,11 +10,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -23,7 +19,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="storeManagerApprove"
+        @click="$refs.approvalOpinion.validate(1) && storeManagerApprove()"
         >申请入库
       </el-button>
       <el-button
@@ -31,7 +27,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         >驳回
       </el-button>
     </div>

+ 4 - 8
src/views/bpm/handleTask/components/project-manage/plan-manage/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -10,11 +10,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -24,7 +20,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
 
@@ -33,7 +29,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         v-if="!['starter'].includes(taskDefinitionKey)"
         >驳回
       </el-button>

+ 3 - 7
src/views/bpm/handleTask/components/project-manage/project-initiation/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -10,11 +10,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -33,7 +29,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0, $event)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0, $event)"
         v-if="!['starter'].includes(taskDefinitionKey)"
         >驳回
       </el-button>

+ 4 - 8
src/views/bpm/handleTask/components/project-manage/task-manage/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
 
         style="margin-bottom: 20px"
         :rules="{
@@ -11,11 +11,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -24,7 +20,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
       >通过
       </el-button>
 
@@ -33,7 +29,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         v-if="!['starter'].includes(taskDefinitionKey)"
       >驳回
       </el-button>

+ 4 - 8
src/views/bpm/handleTask/components/project-manage/team-manage/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -10,11 +10,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -23,7 +19,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
       >通过
       </el-button>
 
@@ -32,7 +28,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         v-if="!['starter'].includes(taskDefinitionKey)"
       >驳回
       </el-button>

+ 4 - 8
src/views/bpm/handleTask/components/purchaseNeedManage/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
 
         style="margin-bottom: 20px"
         :rules="{
@@ -11,11 +11,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -24,7 +20,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
 
@@ -33,7 +29,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         v-if="!['starter'].includes(taskDefinitionKey)"
         >驳回
       </el-button>

+ 4 - 8
src/views/bpm/handleTask/components/purchaseOrder/accountstatement/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px"  :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: false,
@@ -10,11 +10,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -23,7 +19,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
       >通过
       </el-button>
       <el-button
@@ -31,7 +27,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="rejectTask(0)">驳回
+        @click="$refs.approvalOpinion.validate(0) && rejectTask(0)">驳回
       </el-button>
 
       <el-dropdown @command="(command) => handleCommand(command)" style="margin-left: 30px;">

+ 7 - 0
src/views/bpm/handleTask/components/purchaseOrder/accountstatement/supplierList.vue

@@ -83,6 +83,13 @@ export default {
               showOverflowTooltip: true,
               minWidth: 200
             },
+            {
+              prop: 'version',
+              label: '版本号',
+              align: 'center',
+              width: 80,
+              formatter: (_row, _column, cellValue) => `V${cellValue || 1}.0`
+            },
             {
               prop: 'serialNo',
               label: '供应商代号',

+ 5 - 9
src/views/bpm/handleTask/components/purchaseOrder/invoice/submit.vue

@@ -26,12 +26,8 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="审批建议"  style="margin-bottom: 20px">
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+      <el-form-item label="审批意见"  style="margin-bottom: 20px">
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -40,7 +36,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         v-if="
           !['storeManagerApprove'].includes(taskDefinitionKey) ||
           (['storeManagerApprove'].includes(taskDefinitionKey) &&
@@ -54,7 +50,7 @@
         size="mini"
         v-click-once
         :loading="isSaveLoading"
-        @click="storeManagerApprove"
+        @click="$refs.approvalOpinion.validate(1) && storeManagerApprove()"
         v-if="
           ['storeManagerApprove'].includes(taskDefinitionKey) &&
           activeComp == 'inoutBound' &&
@@ -67,7 +63,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         v-if="
           !['starter', 'qualityInspectionFeedback'].includes(
             taskDefinitionKey

+ 4 - 8
src/views/bpm/handleTask/components/purchaseOrder/invoiceConfirm/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -10,11 +10,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -23,7 +19,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="_approveTaskWithVariables(1)"
+        @click="$refs.approvalOpinion.validate(1) && _approveTaskWithVariables(1)"
         >通过
       </el-button>
       <el-button
@@ -31,7 +27,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="_approveTaskWithVariables(0)"
+        @click="$refs.approvalOpinion.validate(0) && _approveTaskWithVariables(0)"
         >驳回
       </el-button>
      

+ 4 - 8
src/views/bpm/handleTask/components/purchaseOrder/outSourceSend/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -10,11 +10,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -24,7 +20,7 @@
         size="mini"
         :loading="isLoading"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
       <el-button
@@ -32,7 +28,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="rejectTask(0)"
+        @click="$refs.approvalOpinion.validate(0) && rejectTask(0)"
         >驳回
       </el-button>
 

+ 4 - 8
src/views/bpm/handleTask/components/purchaseOrder/outSourceSendCk/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
  
         style="margin-bottom: 20px"
         :rules="{
@@ -11,11 +11,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -25,7 +21,7 @@
         size="mini"
         :loading="isLoading"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
       <el-button
@@ -33,7 +29,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         >驳回
       </el-button>
 

+ 5 - 9
src/views/bpm/handleTask/components/purchaseOrder/outsourceSendReturnGoods/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
 
         style="margin-bottom: 20px"
         :rules="{
@@ -11,11 +11,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -25,7 +21,7 @@
         size="mini"
         v-click-once
         v-if="taskDefinitionKey != 'storeman'"
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
       <el-button
@@ -34,7 +30,7 @@
         size="mini"
         v-click-once
         :loading="isSaveLoading"
-        @click="storemanApprove"
+        @click="$refs.approvalOpinion.validate(1) && storemanApprove()"
         v-if="taskDefinitionKey == 'storeman' && activeComp == 'inoutBound'"
         >申请入库
       </el-button>
@@ -43,7 +39,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         v-if="!['starter'].includes(taskDefinitionKey)"
         >驳回
       </el-button>

+ 1 - 1
src/views/bpm/handleTask/components/purchaseOrder/returnGoods/detailDialog.vue

@@ -492,7 +492,7 @@
         const data = await getReturnSaleOrderrecordDetail(id);
         this.loading = false;
         if (data) {
-          let productList = data.productList;
+          let productList = data.productList || [];
           productList.forEach((r) => {
             let foundObject = this.codeData.find(
               (obj) => obj[r.returnType] != undefined

+ 9 - 10
src/views/bpm/handleTask/components/purchaseOrder/returnGoods/submit.vue

@@ -1,12 +1,8 @@
 <template>
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form" :rules="rules">
-      <el-form-item label="审批建议" prop="reason" style="margin-bottom: 20px">
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+      <el-form-item label="审批意见" prop="reason" style="margin-bottom: 20px">
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <el-alert v-if="outInQueryError" :title="outInQueryError" type="error" :closable="false" />
@@ -22,7 +18,7 @@
             !outInQueryLoading && !outInQueryError &&
             outInData.verifyStatus == 2)
         "
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
       <el-button
@@ -31,7 +27,7 @@
         size="mini"
         :loading="isSaveLoading"
         v-click-once
-        @click="storemanApprove"
+        @click="$refs.approvalOpinion.validate(1) && storemanApprove()"
         v-if="
           ['storemanApprove'].includes(taskDefinitionKey) &&
           !outInQueryLoading && !outInQueryError &&
@@ -44,7 +40,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
 
         >驳回
       </el-button>
@@ -162,7 +158,10 @@
           if (valid) {
             let res = await this.getTableValue();
             console.log(res, 'resresresresres12');
-            let storageData = res.returnStorageData;
+            let storageData = res && res.returnStorageData;
+            if (!storageData) {
+              return;
+            }
 
             // 出库来源isSkip 0-正常  1-外部(外部跳过内部审核流程)
             storageData.isSkip = 1;

+ 4 - 8
src/views/bpm/handleTask/components/purchaseOrder/submit.vue

@@ -2,7 +2,7 @@
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
       <el-form-item
-        label="审批建议"
+        label="审批意见"
 
         style="margin-bottom: 20px"
         :rules="{
@@ -11,11 +11,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -24,7 +20,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
       <el-button
@@ -32,7 +28,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         v-if="!['starter', 'starterFillApprove'].includes(taskDefinitionKey)"
         >驳回
       </el-button>

+ 5 - 9
src/views/bpm/handleTask/components/purchasePlanManage/submit.vue

@@ -41,7 +41,7 @@
         </el-select>
       </el-form-item>
       <el-form-item
-        label="审批建议"
+        label="审批意见"
         style="margin-bottom: 20px"
         :rules="{
           required: true,
@@ -49,11 +49,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -62,7 +58,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         v-if="!['storeManagerApprove'].includes(taskDefinitionKey)"
         >通过
       </el-button>
@@ -72,7 +68,7 @@
         size="mini"
         v-click-once
         :loading="isSaveLoading"
-        @click="storeManagerApprove"
+        @click="$refs.approvalOpinion.validate(1) && storeManagerApprove()"
         v-if="['storeManagerApprove'].includes(taskDefinitionKey)"
         >申请入库
       </el-button>
@@ -82,7 +78,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="rejectTask(0)"
+        @click="$refs.approvalOpinion.validate(0) && rejectTask(0)"
         >驳回
       </el-button>
 

+ 4 - 8
src/views/bpm/handleTask/components/qualityReportApproval/submit.vue

@@ -1,12 +1,8 @@
 <template>
   <el-col :span="16" :offset="6">
     <el-form label-width="100px" ref="formRef" :model="form">
-      <el-form-item label="审批建议" style="margin-bottom: 20px">
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+      <el-form-item label="审批意见" style="margin-bottom: 20px">
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -15,7 +11,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         v-if="!['storeManagerApprove'].includes(taskDefinitionKey)"
         >通过
       </el-button>
@@ -25,7 +21,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="rejectTask(0)"
+        @click="$refs.approvalOpinion.validate(0) && rejectTask(0)"
         >驳回
       </el-button>
 

+ 55 - 5
src/views/bpm/handleTask/components/qualityReportApproval/unqualifiedProduct.vue

@@ -4,10 +4,10 @@
       <ele-pro-table
         ref="table"
         :columns="columns"
-        :datasource="poList.filter((item) => item.disposalStatus != 2)"
+        :datasource="displayPoList"
         :selection.sync="selection"
         :needPage="false"
-        row-key="id"
+        row-key="uniqueKey"
         max-height="500px"
       >
         <!-- 操作列 -->
@@ -305,8 +305,10 @@
       width="60%"
       append-to-body
       title="选择"
+      @close="closeAdd"
     >
       <el-table
+        ref="addTable"
         :data="inventoryList"
         @selection-change="handleAddSelectionChange"
         row-key="id"
@@ -761,6 +763,18 @@
       },
       disposalStatustList() {
         return { 0: '待处置', 1: '处置中', 2: '处置完成' };
+      },
+      // 兜底去重,防止 uniqueKey 极端情况下仍重复
+      displayPoList() {
+        const seen = new Set();
+        return this.poList
+          .filter((item) => item.disposalStatus != 2)
+          .filter((item) => {
+            const key = item.uniqueKey || item.id;
+            if (!key || seen.has(key)) return false;
+            seen.add(key);
+            return true;
+          });
       }
     },
     created() {
@@ -769,6 +783,16 @@
       this.getReasonTypeList();
     },
     methods: {
+      // 为每行生成前端唯一 key:已保存的使用 's_'+id,新增/拆分的生成 'n_'+时间戳+随机数
+      ensureUniqueKey(item) {
+        if (item.uniqueKey) return item.uniqueKey;
+        if (item.id) {
+          item.uniqueKey = `s_${item.id}`;
+        } else {
+          item.uniqueKey = `n_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
+        }
+        return item.uniqueKey;
+      },
       disposalStatusFilter(value, row, column) {
         if (value == row.disposalStatus) {
           return row;
@@ -836,6 +860,7 @@
         if (qualityResults == 1) {
           this.poList = JSON.parse(JSON.stringify(this.oldList));
           this.poList = this.poList.map((item) => {
+            this.ensureUniqueKey(item);
             if (item.disposalStatus != 2) {
               item.disposalStatus = 1;
               item.disposeType = 5;
@@ -853,6 +878,7 @@
             )
           ];
           this.poList = this.poList.map((item) => {
+            this.ensureUniqueKey(item);
             if (item.disposalStatus != 2) {
               item.disposalStatus = 1;
               item.disposeType = 5;
@@ -869,9 +895,16 @@
               )
             )
           ];
+          this.poList = this.poList.map((item) => {
+            this.ensureUniqueKey(item);
+            return item;
+          });
         }
         if (qualityResults == 3) {
           this.poList = JSON.parse(JSON.stringify(this.oldList));
+          this.poList.forEach((item) => {
+            this.ensureUniqueKey(item);
+          });
         }
         this.qualityResults = qualityResults;
         this.setQualifiedNumber();
@@ -890,7 +923,9 @@
           this.$message.warning('请选择数据');
           return;
         }
-        const poListTotal = this.poList.reduce(
+        const poListTotal = this.poList
+        .filter((item) => ![5, 6, 7].includes(item.disposeType))
+        .reduce(
           (sum, item) => sum + Number(item.measureQuantity || 0),
           0
         );
@@ -910,6 +945,10 @@
         }
         this.addSelection.forEach((item) => {
           const newItem = JSON.parse(JSON.stringify(item));
+          // 拆分行:始终生成新的 uniqueKey(基于时间戳+随机数)
+          newItem.uniqueKey = `n_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
+          // 拆分行不带后端 id,清掉避免误传
+          delete newItem.id;
           if (this.inventoryList.length === 1) {
             newItem.measureQuantity = Number(this.singleQuantity);
           }
@@ -920,17 +959,28 @@
       },
       add() {
         this.addDialogVisible = true;
-        this.addSelection = [];
+        this.$nextTick(() => {
+          this.$refs.addTable?.clearSelection();
+        });
         if (this.inventoryList.length === 1) {
           this.singleQuantity = this.inventoryList[0].measureQuantity || 0;
         }
       },
+      closeAdd() {
+        this.addSelection = [];
+        this.$nextTick(() => {
+          this.$refs.addTable?.clearSelection();
+        });
+      },
 
       // /* 表格数据源 */
       async datasource() {
         const arr = await getById(this.id);
         this.oldList = JSON.parse(JSON.stringify(arr.poList));
-        this.poList = arr.poList;
+        this.poList = arr.poList.map((item) => {
+          this.ensureUniqueKey(item);
+          return item;
+        });
         this.setQualifiedNumber();
       },
 

+ 7 - 0
src/views/bpm/handleTask/components/quotation/parentList.vue

@@ -105,6 +105,13 @@
             showOverflowTooltip: true,
             minWidth: 200
           },
+          {
+            prop: 'version',
+            label: '版本号',
+            align: 'center',
+            width: 80,
+            formatter: (_row, _column, cellValue) => `V${cellValue || 1}.0`
+          },
           {
             prop: 'serialNo',
             label: '客户代号',

+ 4 - 8
src/views/bpm/handleTask/components/quotation/submit.vue

@@ -27,7 +27,7 @@
         </el-select>
       </el-form-item> -->
       <el-form-item
-        label="审批建议"
+        label="审批意见"
 
         style="margin-bottom: 20px"
         :rules="{
@@ -36,11 +36,7 @@
           trigger: 'change'
         }"
       >
-        <el-input
-          type="textarea"
-          v-model="form.reason"
-          placeholder="请输入审批建议"
-        />
+        <ApprovalOpinion ref="approvalOpinion" v-model="form.reason" />
       </el-form-item>
     </el-form>
     <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
@@ -49,7 +45,7 @@
         type="success"
         size="mini"
         v-click-once
-        @click="handleAudit(1)"
+        @click="$refs.approvalOpinion.validate(1) && handleAudit(1)"
         >通过
       </el-button>
       <!-- <el-button
@@ -65,7 +61,7 @@
         type="danger"
         size="mini"
         v-click-once
-        @click="handleAudit(0)"
+        @click="$refs.approvalOpinion.validate(0) && handleAudit(0)"
         v-if="
           !['starter'].includes(
             taskDefinitionKey

+ 3 - 3
src/views/bpm/handleTask/components/regularizationHandling/regularizationHandlingDetail.vue

@@ -175,6 +175,7 @@
 <script>
 import { getRegularizationById } from '@/api/main';
 import { getEmployeeById } from '@/api/organization';
+import { parseAttachmentIds } from '@/utils/attachment';
 
 const empty = () => ({
   id: '',
@@ -391,9 +392,8 @@ export default {
         }
         this.employeeInfo = this.mapEmployeeInfo(regularization, employee);
 
-        // 转正单 swagger 只有单个 approvalDocumentFileId,统一转成数组给 fileMain
-        const fileId = this.approvalDocumentFileId;
-        this.approvalFileIds = fileId ? [fileId] : [];
+        // 兼容多种附件字段来源(attachmentIds / approvalDocumentFileId 等)
+        this.approvalFileIds = parseAttachmentIds(regularization);
       } catch (error) {
         this.form = empty();
         this.employeeInfo = {};

Некоторые файлы не были показаны из-за большого количества измененных файлов