Procházet zdrojové kódy

Merge branch 'greenUrgent' into allTestUrgent

qymljy před 3 měsíci
rodič
revize
abadd3c4f4

+ 5 - 1
src/HDrpManagement/serveBill/components/selectOrder.vue

@@ -123,5 +123,9 @@ export default {
 }
 
 </script>
-<style>
+<style scoped>
+/*搜索框移除多余删除按钮*/
+/deep/ .el-input__validateIcon {
+  display: none;
+}
 </style>

+ 5 - 1
src/HDrpManagement/serveBillMag/components/selectOrder.vue

@@ -122,5 +122,9 @@ export default {
   created() {},
 };
 </script>
-<style>
+<style scoped>
+/*搜索框移除多余删除按钮*/
+/deep/ .el-input__validateIcon {
+  display: none;
+}
 </style>

+ 86 - 50
src/HDrpManagement/serveWorkBill/components/generalTemplate.vue

@@ -6,60 +6,82 @@
       direction="rtl"
       append-to-body
       @close="onClose">
-    <div class="drawer__panel" style="margin-bottom: -10px" v-if="dataInfo.workorder">
+    <div class="drawer__panel" style="margin-bottom: 0 !important;" v-if="dataInfo.workorder">
       <el-descriptions :title="$t(`单据信息`)" >
-        <el-descriptions-item :label="$t(`服务单号`)"><span style="color: #666">{{$t(dataInfo.workorder.servicebillno)}}</span></el-descriptions-item>
-        <el-descriptions-item :label="$t(`项目名称`)"><span style="color: #666">{{$t(dataInfo.workorder.projectname)}}</span></el-descriptions-item>
+        <el-descriptions-item :label="$t(`服务单号`)"><span style="color: #666">{{$t(dataInfo.workorder.servicebillno) || '--'}}</span></el-descriptions-item>
+        <el-descriptions-item :label="$t(`项目名称`)"><span style="color: #666">{{$t(dataInfo.workorder.projectname) || '--'}}</span></el-descriptions-item>
         <el-descriptions-item :label="$t(`是否有偿服务`)"><span style="color: #666">{{paidServiceAmount > 0 ? $t('是') : $t('否')}}</span></el-descriptions-item>
       </el-descriptions>
-      <el-descriptions :title="$t(`客户信息`)">
-        <el-descriptions-item :label="$t(`企业名称`)"><span style="color: #666">{{$t(dataInfo.workorder.abbreviation)}}</span></el-descriptions-item>
-        <el-descriptions-item :label="$t(`联系方式`)"><span style="color: #666">{{$t(dataInfo.workorder.scenecontactphonenumber)}}</span></el-descriptions-item>
+      <el-descriptions :title="$t(`客户信息`)" style="margin-top: 10px">
+        <el-descriptions-item :label="$t(`企业名称`)"><span style="color: #666">{{$t(dataInfo.workorder.abbreviation) || '--'}}</span></el-descriptions-item>
+        <el-descriptions-item :label="$t(`联系方式`)"><span style="color: #666">{{$t(dataInfo.workorder.scenecontactphonenumber) || '--'}}</span></el-descriptions-item>
         <el-descriptions-item :label="$t(`服务地址`)"><span style="color: #666">{{$t(dataInfo.workorder.province + dataInfo.workorder.city + dataInfo.workorder.county + dataInfo.workorder.address)}}</span></el-descriptions-item>
-        <el-descriptions-item :label="$t(`业务员`)"><span style="color: #666">{{$t(dataInfo.workorder.saler_name)}}</span></el-descriptions-item>
-        <el-descriptions-item :label="$t(`服务企业`)"><span style="color: #666">{{$t(dataInfo.workorder.enterprisename)}}</span></el-descriptions-item>
-
-      </el-descriptions>
-      <el-descriptions :title="$t(`现场联系人信息`)">
-        <el-descriptions-item :label="$t(`姓名`)"><span style="color: #666">{{$t(dataInfo.workorder.scenecontact)}}</span></el-descriptions-item>
-        <el-descriptions-item :label="$t(`电话`)"><span style="color: #666">{{$t(dataInfo.workorder.scenecontactphonenumber)}}</span></el-descriptions-item>
-        <el-descriptions-item :label="$t(`地址`)"><span style="color: #666">{{$t(dataInfo.workorder.address)}}</span></el-descriptions-item>
       </el-descriptions>
-      <el-descriptions :title="$t(`应用信息`)">
-        <el-descriptions-item :label="$t(`应用系统`)"><span style="color: #666">{{$t(dataInfo.workorder.class1)}}</span></el-descriptions-item>
-        <el-descriptions-item :label="$t(`客诉大类`)"><span style="color: #666">{{$t(dataInfo.workorder.class2)}}</span></el-descriptions-item>
+      <el-descriptions :title="$t(`应用信息`)" style="margin-top: 10px">
+        <el-descriptions-item :label="$t(`应用系统`)"><span style="color: #666">{{$t(dataInfo.workorder.class1) || '--'}}</span></el-descriptions-item>
+        <el-descriptions-item :label="$t(`客诉大类`)"><span style="color: #666">{{$t(dataInfo.workorder.class2) || '--'}}</span></el-descriptions-item>
       </el-descriptions>
-      <el-descriptions :title="$t(`问题及处理`)">
-        <el-descriptions-item :label="$t(`应用系统`)"><span style="color: #666">{{$t(dataInfo.workorder.class1)}}</span></el-descriptions-item>
-        <el-descriptions-item :label="$t(`客诉大类`)"><span style="color: #666">{{$t(dataInfo.workorder.class2)}}</span></el-descriptions-item>
+      <el-descriptions :title="$t(`问题及处理`)" style="margin-top: 10px">
       </el-descriptions>
-    </div>
-    <div style="height: 10px;background: #f5f5f5"></div>
-    <div style="margin: 10px;font-weight: bold;font-size: 16px">产品</div>
-    <div class="drawer__panel" style="margin-bottom: -10px" v-if="dataInfo.trainertitems">
-      <tableDetailLayout
-          :layout="tablecols"
-          :data="dataInfo.trainertitems"
-          :opwidth="200"
-          :width="true"
-          :custom="true">
-        <template v-slot:customcol="scope">
-          <div v-if="scope.column.columnname === 'nominalpressure'">
-            {{tool.nominalPressureSet(scope.column.data[scope.column.columnname])}}
-          </div>
-          <div v-else>
-            {{
-              $t(scope.column.data[[scope.column.columnname]])
-                  ? $t(scope.column.data[[scope.column.columnname]])
-                  : "--"
-            }}
-          </div>
-        </template>
-      </tableDetailLayout>
+      <div style="color: #999;font-size: 14px">{{$t(`客诉内容`)}}</div>
+      <el-input
+          type="textarea"
+          style="margin-top: 10px;margin-bottom: 20px"
+          @blur="changeRate"
+          :rows="1"
+          disabled
+          placeholder="客诉内容"
+          v-model="dataInfo.workorder.reason">
+      </el-input>
+      <div style="color: #999;font-size: 14px">{{$t(`原因及处理措施`)}}</div>
+      <el-input
+          type="textarea"
+          style="margin-top: 10px;margin-bottom: 20px"
+          :rows="1"
+          @blur="inputChange('treatment',treatment)"
+          placeholder="原因及处理措施"
+          v-model="treatment">
+      </el-input>
+      <div style="color: #999;font-size: 14px">{{$t(`下次处理时间`)}}</div>
+      <el-date-picker
+          v-model="nextTreatmentTime"
+          style="margin-top: 10px;margin-bottom: 20px;width: 100%"
+          @blur="inputChange('nextTreatmentTime',nextTreatmentTime)"
+          value-format="yyyy-MM-dd"
+          type="date"
+          placeholder="选择日期">
+      </el-date-picker>
+      <div style="color: #999;font-size: 14px">{{$t(`事项说明`)}}</div>
+      <el-input
+          type="textarea"
+          style="margin-top: 10px;margin-bottom: 20px;width: 100%"
+          @blur="inputChange('explain',explain)"
+          :rows="1"
+          placeholder="事项说明"
+          v-model="explain">
+      </el-input>
+      <div style="color: #999;font-size: 14px">{{$t(`希望下次回访时间`)}}</div>
+        <el-date-picker
+            v-model="nextRebackTime"
+            style="margin-top: 10px;margin-bottom: 20px;width: 100%"
+            @change="inputChange('nextRebackTime',nextRebackTime)"
+            value-format="yyyy-MM-dd"
+            type="date"
+            placeholder="选择日期">
+        </el-date-picker>
+      <div style="color: #999;font-size: 14px">{{$t(`文字说明`)}}</div>
+      <el-input
+          type="textarea"
+          style="margin-top: 10px;margin-bottom: 10px"
+          @blur="inputChange('text',text)"
+          :rows="1"
+          placeholder="文字说明"
+          v-model="text">
+      </el-input>
     </div>
     <div style="height: 10px;background: #f5f5f5"></div>
     <div style="margin: 10px;font-weight: bold;font-size: 16px">{{$t(`评价`)}}</div>
-    <div class="drawer__panel" style="margin-bottom: -10px">
+    <div class="drawer__panel" style="margin-bottom: 0 !important;">
       <div style="display: flex;justify-content: space-between">
         <div style="display: flex;justify-content: left">
           <div style="color: #999;font-size: 14px;margin-right: 10px">{{$t(`反应速度`)}}:</div>
@@ -69,15 +91,11 @@
           <div style="color: #999;font-size: 14px;margin-right: 10px">{{$t(`配合态度`)}}:</div>
           <el-rate v-model="dataInfo.attitudescore" @change="changeRate"></el-rate>
         </div>
-        <div style="display: flex;justify-content: left">
-          <div style="color: #999;font-size: 14px;margin-right: 10px">{{$t(`满意态度`)}}:</div>
-          <el-rate v-model="dataInfo.satisfaction" @change="changeRate"></el-rate>
-        </div>
       </div>
     </div>
     <div style="height: 10px;background: #f5f5f5"></div>
     <div style="margin: 10px;font-weight: bold;font-size: 16px">{{$t(`客户签字`)}}</div>
-    <div class="drawer__panel" style="margin-bottom: -50px">
+    <div class="drawer__panel" style="margin-bottom: 0 !important;">
       <signature></signature>
     </div>
     <div class="fixed__btn__panel">
@@ -102,7 +120,12 @@ export default {
       paidServiceAmount:'',
       inqualityguaranteeperiod:'',
       drawerVisible:false,
-      tablecols:[]
+      tablecols:[],
+      nextTreatmentTime:'',
+      treatment:'',
+      explain:'',
+      nextRebackTime:'',
+      text:''
     }
   },
   methods:{
@@ -195,6 +218,19 @@ export default {
         })
       })
     },
+    inputChange(key,data) {
+      console.log(key,data)
+      let name = key
+      this.dataInfo.confirmationcontent.forEach(e => {
+        Object.keys(e).map((key, index) => {
+          if (name === key) {
+            e[key].confirm_value = data
+          }
+        })
+      })
+
+      this.changeRate()
+    },
     async changeRate(){
       console.log(this.dataInfo,'detaInfo')
       const res = await this.$api.requested({

+ 95 - 69
src/HDrpManagement/serveWorkBill/components/installationCommissioning.vue

@@ -7,23 +7,24 @@
         direction="rtl"
         append-to-body
         @close="onClose">
-      <div class="drawer__panel" style="margin-bottom: -10px" v-if="dataInfo.workorder">
+      <div class="drawer__panel" style="margin-bottom: 0 !important;" v-if="dataInfo.workorder">
         <el-descriptions :title="$t(`单据信息`)" >
-          <el-descriptions-item :label="$t(`服务申请单号`)"><span style="color: #666">{{$t(dataInfo.workorder.servicebillno)}}</span></el-descriptions-item>
-          <el-descriptions-item :label="$t(`项目名称`)"><span style="color: #666">{{$t(dataInfo.workorder.projectname)}}</span></el-descriptions-item>
-          <el-descriptions-item :label="$t(`是否有偿服务`)"><span style="color: #666">{{paidServiceAmount > 0 ? $t('是') : $t('否')}}</span></el-descriptions-item>
-          <el-descriptions-item :label="$t(`是否质保期内`)"><span style="color: #666">{{inqualityguaranteeperiod == 1 ? $t('是') : $t('否')}}</span></el-descriptions-item>
-          <el-descriptions-item :label="$t(`申请原因`)"><span style="color: #666">{{$t(dataInfo.reason)}}</span></el-descriptions-item>
+          <el-descriptions-item :label="$t(`服务单号`)"><span style="color: #666">{{$t(dataInfo.workorder.servicebillno) || '--'}}</span></el-descriptions-item>
+          <el-descriptions-item :label="$t(`确认日期`)"><span style="color: #666">{{$t(dataInfo.workorder.createdate) || '--'}}</span></el-descriptions-item>
         </el-descriptions>
-        <el-descriptions :title="$t(`应用信息`)">
-          <el-descriptions-item :label="$t(`应用系统`)"><span style="color: #666">{{$t(dataInfo.workorder.class1)}}</span></el-descriptions-item>
-          <el-descriptions-item :label="$t(`客诉大类`)"><span style="color: #666">{{$t(dataInfo.workorder.class2)}}</span></el-descriptions-item>
-          <el-descriptions-item :label="$t(`服务方式`)"><span style="color: #666">{{$t(dataInfo.workorder.type)}}</span></el-descriptions-item>
+        <el-descriptions :title="$t(`服务信息`)">
+          <el-descriptions-item :label="$t(`服务分类`)"><span style="color: #666">{{$t(dataInfo.workorder.servicetype) || '--'}}</span></el-descriptions-item>
+          <el-descriptions-item :label="$t(`应用系统`)"><span style="color: #666">{{$t(dataInfo.workorder.class1) || '--'}}</span></el-descriptions-item>
+          <el-descriptions-item :label="$t(`客诉大类`)"><span style="color: #666">{{$t(dataInfo.workorder.class2) || '--'}}</span></el-descriptions-item>
+          <el-descriptions-item :label="$t(`工单负责人`)"><span style="color: #666">{{$t(dataInfo.workorder.projectleader) || '--'}}</span></el-descriptions-item>
+          <el-descriptions-item :label="$t(`项目名称`)"><span style="color: #666">{{$t(dataInfo.workorder.projectname) || '--'}}</span></el-descriptions-item>
+          <el-descriptions-item :label="$t(`业务员`)"><span style="color: #666">{{$t(dataInfo.workorder.saler_name) || '--'}}</span></el-descriptions-item>
+          <el-descriptions-item :label="$t(`服务企业`)"><span style="color: #666">{{$t(dataInfo.workorder.enterprisename) || '--'}}</span></el-descriptions-item>
         </el-descriptions>
-        <el-descriptions :title="$t(`客户信息`)">
-          <el-descriptions-item :label="$t(`企业名称`)"><span style="color: #666">{{$t(dataInfo.workorder.abbreviation)}}</span></el-descriptions-item>
-          <el-descriptions-item :label="$t(`联系方式`)"><span style="color: #666">{{$t(dataInfo.workorder.scenecontactphonenumber)}}</span></el-descriptions-item>
-          <el-descriptions-item :label="$t(`服务地址`)"><span style="color: #666">{{$t(dataInfo.workorder.province + dataInfo.workorder.city + dataInfo.workorder.county + dataInfo.workorder.address)}}</span></el-descriptions-item>
+        <el-descriptions :title="$t(`现场联系人信息`)">
+          <el-descriptions-item :label="$t(`姓名`)"><span style="color: #666">{{$t(dataInfo.workorder.scenecontact) || '--'}}</span></el-descriptions-item>
+          <el-descriptions-item :label="$t(`电话`)"><span style="color: #666">{{$t(dataInfo.workorder.scenecontactphonenumber) || '--'}}</span></el-descriptions-item>
+          <el-descriptions-item :label="$t(`地址`)"><span style="color: #666">{{$t(dataInfo.workorder.address) || '--'}}</span></el-descriptions-item>
         </el-descriptions>
       </div>
       <div style="height: 10px;background: #f5f5f5"></div>
@@ -49,6 +50,60 @@
           </template>
         </tableDetailLayout>
       </div>
+      <el-descriptions :title="$t(`客诉情况`)" style="margin-top: 10px">
+      </el-descriptions>
+      <div style="color: #999;font-size: 14px">{{$t(`客诉内容`)}}</div>
+      <el-input
+          type="textarea"
+          style="margin-top: 10px;margin-bottom: 20px"
+          @blur="changeRate"
+          :rows="1"
+          disabled
+          placeholder="客诉内容"
+          v-model="dataInfo.workorder.reason">
+      </el-input>
+      <el-descriptions :title="$t(`维修信息确认`)" style="margin-top: 10px">
+        <el-descriptions-item :label="$t(`是否需要拆卸配件或整拆`)"><span style="color: #666">{{$t(node1)}}</span></el-descriptions-item>
+      </el-descriptions>
+      <div style="color: #999;font-size: 14px">{{$t(`维修方案及周期`)}}</div>
+      <el-input
+          type="textarea"
+          style="margin-top: 10px;margin-bottom: 20px"
+          @blur="inputChange('与现场协商确认维修方案',node2)"
+          :rows="1"
+          placeholder="维修方案及周期"
+          v-model="node2">
+      </el-input>
+      <div style="color: #999;font-size: 14px;margin-top: 10px;margin-bottom: 20px">{{$t(`是否有偿服务`)}}:<span>{{paidServiceAmount > 0 ? $t('是') : $t('否') }}</span></div>
+      <div style="color: #999;font-size: 14px;margin-top: 10px;margin-bottom: 20px">{{$t(`服务金额`)}}:<span>{{tool.formatAmount(paidServiceAmount,2) }}</span></div>
+      <div style="color: #999;font-size: 14px">{{$t(`实施内容`)}}</div>
+      <el-input
+          type="textarea"
+          style="margin-top: 10px;margin-bottom: 20px"
+          @blur="inputChange('实施内容',node3)"
+          :rows="1"
+          placeholder="实施内容"
+          v-model="node3">
+      </el-input>
+      <div style="color: #999;font-size: 14px">{{$t(`服务测试内容描述`)}}</div>
+      <el-input
+          type="textarea"
+          style="margin-top: 10px;margin-bottom: 20px"
+          @blur="inputChange('与现场协商试运行',node4)"
+          :rows="1"
+          placeholder="服务测试内容描述"
+          v-model="node4">
+      </el-input>
+      <div style="color: #999;font-size: 14px">{{$t(`现场交代事项`)}}</div>
+      <el-input
+          type="textarea"
+          style="margin-top: 10px;margin-bottom: 20px"
+          @blur="inputChange('现场交代事项',node5)"
+          :rows="1"
+          placeholder="现场交代事项"
+          v-model="node5">
+      </el-input>
+
       <div style="height: 10px;background: #f5f5f5"></div>
       <div style="margin: 10px;font-weight: bold;font-size: 16px">{{$t(`评价`)}}</div>
       <div class="drawer__panel" style="margin-bottom: -10px">
@@ -61,10 +116,6 @@
             <div style="color: #999;font-size: 14px;margin-right: 10px">{{$t(`配合态度`)}}:</div>
             <el-rate v-model="dataInfo.attitudescore" @change="changeRate"></el-rate>
           </div>
-          <div style="display: flex;justify-content: left">
-            <div style="color: #999;font-size: 14px;margin-right: 10px">{{$t(`满意态度`)}}:</div>
-            <el-rate v-model="dataInfo.satisfaction" @change="changeRate"></el-rate>
-          </div>
         </div>
       </div>
       <div style="height: 10px;background: #f5f5f5"></div>
@@ -96,7 +147,12 @@ export default {
       inqualityguaranteeperiod:'',
       drawerVisible:false,
       tablecols:[],
-      sa_workorder_confirmationid:''
+      sa_workorder_confirmationid:'',
+      node1:'',
+      node2:'',
+      node3:'',
+      node4:'',
+      node5:''
     }
   },
   methods:{
@@ -110,46 +166,6 @@ export default {
         }
       })
       console.log(res.data)
-      let ishave = false
-      res.data.confirmationcontent.forEach(item => {
-        if (item.nextTreatmentTime) {
-          ishave = true
-        }
-      })
-      if (!ishave) {
-        let arr = [{
-          nextTreatmentTime: {
-            confirm_value: ''
-          }
-        }, {
-          treatment: {
-            confirm_value: ''
-          }
-        }, {
-          explain: {
-            confirm_value: ''
-          }
-        }, {
-          repairResult: {
-            confirm_value: ''
-          }
-        }, {
-          rebackTime: {
-            confirm_value: ''
-          }
-        }, {
-          nextRebackTime: {
-            confirm_value: ''
-          }
-        }, {
-          text: {
-            confirm_value: ''
-          }
-        }]
-        arr.forEach(e => {
-          res.data.confirmationcontent.push(e)
-        }, this)
-      }
       this.dataInfo = res.data
       this.setInputData()
       this.drawerVisible = true
@@ -162,34 +178,44 @@ export default {
 
           that.paidServiceAmount = that.paidServiceAmount + e[key].amount
 
-          if (key === 'nextTreatmentTime') {
+          if (key.includes('是否需要拆卸配件或整拆')) {
 
-            that.nextTreatmentTime = e[key].confirm_value
+            that.node1 = e[key].confirm_value
 
           }
-          if (key === 'treatment') {
+          if (key.includes('与现场协商确认维修方案')) {
 
-            that.treatment =  e[key].confirm_value
+            that.node2 =  e[key].confirm_value ? e[key].confirm_value : e[key].textcontent
 
           }
-          if (key === 'explain') {
+          if (key.includes('实施内容')) {
 
-            that.explain = e[key].confirm_value
+            that.node3 = e[key].confirm_value ? e[key].confirm_value : e[key].textcontent
 
           }
-          if (key === 'nextRebackTime') {
+          if (key.includes('与现场协商试运行')) {
 
-            that.nextRebackTime =  e[key].confirm_value
+            that.node4 =  e[key].confirm_value ? e[key].confirm_value : e[key].textcontent
 
           }
-          if (key === 'text') {
+          if (key.includes('现场交代事项')) {
 
-            that.text =  e[key].confirm_value
+            that.node5 =  e[key].confirm_value ? e[key].confirm_value : e[key].textcontent
 
           }
         })
       })
     },
+    inputChange(key,data){
+      let keyValue = key
+      this.dataInfo.confirmationcontent.forEach(e => {
+        Object.keys(e).map((key, index) => {
+          if (key.includes(keyValue)) {
+            e[key].confirm_value = data
+          }
+        })
+      })
+    },
     async changeRate(){
       console.log(this.dataInfo,'detaInfo')
       const res = await this.$api.requested({

+ 50 - 98
src/HDrpManagement/serveWorkBill/components/installationTraining.vue

@@ -9,46 +9,48 @@
         @close="onClose">
       <div class="drawer__panel" style="margin-bottom: -10px" v-if="dataInfo.workorder">
         <el-descriptions :title="$t(`单据信息`)" >
-          <el-descriptions-item :label="$t(`服务申请单号`)"><span style="color: #666">{{$t(dataInfo.workorder.servicebillno)}}</span></el-descriptions-item>
-          <el-descriptions-item :label="$t(`项目名称`)"><span style="color: #666">{{$t(dataInfo.workorder.projectname)}}</span></el-descriptions-item>
-          <el-descriptions-item :label="$t(`是否有偿服务`)"><span style="color: #666">{{paidServiceAmount > 0 ? $t('是') : $t('否')}}</span></el-descriptions-item>
-          <el-descriptions-item :label="$t(`是否质保期内`)"><span style="color: #666">{{inqualityguaranteeperiod == 1 ? $t('是') : $t('否')}}</span></el-descriptions-item>
-          <el-descriptions-item :label="$t(`申请原因`)"><span style="color: #666">{{$t(dataInfo.reason)}}</span></el-descriptions-item>
+          <el-descriptions-item :label="$t(`服务单号`)"><span style="color: #666">{{$t(dataInfo.workorder.servicebillno) || '--'}}</span></el-descriptions-item>
+          <el-descriptions-item :label="$t(`确认日期`)"><span style="color: #666">{{$t(dataInfo.workorder.createdate) || '--'}}</span></el-descriptions-item>
         </el-descriptions>
-        <el-descriptions :title="$t(`应用信息`)">
-          <el-descriptions-item :label="$t(`应用系统`)"><span style="color: #666">{{$t(dataInfo.workorder.class1)}}</span></el-descriptions-item>
-          <el-descriptions-item :label="$t(`客诉大类`)"><span style="color: #666">{{$t(dataInfo.workorder.class2)}}</span></el-descriptions-item>
-          <el-descriptions-item :label="$t(`服务方式`)"><span style="color: #666">{{$t(dataInfo.workorder.type)}}</span></el-descriptions-item>
+        <el-descriptions :title="$t(`服务信息`)">
+          <el-descriptions-item :label="$t(`服务分类`)"><span style="color: #666">{{$t(dataInfo.workorder.servicetype) || '--'}}</span></el-descriptions-item>
+          <el-descriptions-item :label="$t(`应用系统`)"><span style="color: #666">{{$t(dataInfo.workorder.class1) || '--'}}</span></el-descriptions-item>
+          <el-descriptions-item :label="$t(`工单负责人`)"><span style="color: #666">{{$t(dataInfo.workorder.projectleader) || '--'}}</span></el-descriptions-item>
+          <el-descriptions-item :label="$t(`项目名称`)"><span style="color: #666">{{$t(dataInfo.workorder.projectname) || '--'}}</span></el-descriptions-item>
+          <el-descriptions-item :label="$t(`业务员`)"><span style="color: #666">{{$t(dataInfo.workorder.saler_name) || '--'}}</span></el-descriptions-item>
+          <el-descriptions-item :label="$t(`服务企业`)"><span style="color: #666">{{$t(dataInfo.workorder.enterprisename) || '--'}}</span></el-descriptions-item>
         </el-descriptions>
         <el-descriptions :title="$t(`客户信息`)">
           <el-descriptions-item :label="$t(`企业名称`)"><span style="color: #666">{{$t(dataInfo.workorder.abbreviation)}}</span></el-descriptions-item>
           <el-descriptions-item :label="$t(`联系方式`)"><span style="color: #666">{{$t(dataInfo.workorder.scenecontactphonenumber)}}</span></el-descriptions-item>
           <el-descriptions-item :label="$t(`服务地址`)"><span style="color: #666">{{$t(dataInfo.workorder.province + dataInfo.workorder.city + dataInfo.workorder.county + dataInfo.workorder.address)}}</span></el-descriptions-item>
         </el-descriptions>
+        <el-descriptions :title="$t(`现场联系人信息`)">
+          <el-descriptions-item :label="$t(`姓名`)"><span style="color: #666">{{$t(dataInfo.workorder.scenecontact) || '--'}}</span></el-descriptions-item>
+          <el-descriptions-item :label="$t(`电话`)"><span style="color: #666">{{$t(dataInfo.workorder.scenecontactphonenumber) || '--'}}</span></el-descriptions-item>
+          <el-descriptions-item :label="$t(`地址`)"><span style="color: #666">{{$t(dataInfo.workorder.address) || '--'}}</span></el-descriptions-item>
+        </el-descriptions>
       </div>
-      <div style="height: 10px;background: #f5f5f5"></div>
-      <div style="margin: 10px;font-weight: bold;font-size: 16px">产品</div>
-      <div class="drawer__panel" style="margin-bottom: -10px" v-if="dataInfo.trainertitems">
-        <tableDetailLayout
-            :layout="tablecols"
-            :data="dataInfo.trainertitems"
-            :opwidth="200"
-            :width="true"
-            :custom="true">
-          <template v-slot:customcol="scope">
-            <div v-if="scope.column.columnname === 'nominalpressure'">
-              {{tool.nominalPressureSet(scope.column.data[scope.column.columnname])}}
-            </div>
-            <div v-else>
-              {{
-                $t(scope.column.data[[scope.column.columnname]])
-                    ? $t(scope.column.data[[scope.column.columnname]])
-                    : "--"
-              }}
-            </div>
-          </template>
-        </tableDetailLayout>
-      </div>
+      <el-descriptions :title="$t(`工序内容填写`)" style="margin-top: 10px">
+      </el-descriptions>
+      <div style="color: #999;font-size: 14px">{{$t(`现场培训内容`)}}</div>
+      <el-input
+          type="textarea"
+          style="margin-top: 10px;margin-bottom: 20px"
+          @blur="inputChange('现场培训内容',trainerContent)"
+          :rows="1"
+          placeholder="现场培训内容"
+          v-model="trainerContent">
+      </el-input>
+      <div style="color: #999;font-size: 14px">{{$t(`现场互动及测试培训效果`)}}</div>
+      <el-input
+          type="textarea"
+          style="margin-top: 10px;margin-bottom: 20px"
+          @blur="inputChange('现场互动及测试培训效果',trainerResult)"
+          :rows="1"
+          placeholder="现场互动及测试培训效果"
+          v-model="trainerResult">
+      </el-input>
       <div style="height: 10px;background: #f5f5f5"></div>
       <div style="margin: 10px;font-weight: bold;font-size: 16px">{{$t(`评价`)}}</div>
       <div class="drawer__panel" style="margin-bottom: -10px">
@@ -61,10 +63,6 @@
             <div style="color: #999;font-size: 14px;margin-right: 10px">{{$t(`配合态度`)}}:</div>
             <el-rate v-model="dataInfo.attitudescore" @change="changeRate"></el-rate>
           </div>
-          <div style="display: flex;justify-content: left">
-            <div style="color: #999;font-size: 14px;margin-right: 10px">{{$t(`满意态度`)}}:</div>
-            <el-rate v-model="dataInfo.satisfaction" @change="changeRate"></el-rate>
-          </div>
         </div>
       </div>
       <div style="height: 10px;background: #f5f5f5"></div>
@@ -96,7 +94,9 @@ export default {
       inqualityguaranteeperiod:'',
       drawerVisible:false,
       tablecols:[],
-      sa_workorder_confirmationid:''
+      sa_workorder_confirmationid:'',
+      trainerContent:'',
+      trainerResult:''
     }
   },
   methods:{
@@ -110,46 +110,6 @@ export default {
         }
       })
       console.log(res.data)
-      let ishave = false
-      res.data.confirmationcontent.forEach(item => {
-        if (item.nextTreatmentTime) {
-          ishave = true
-        }
-      })
-      if (!ishave) {
-        let arr = [{
-          nextTreatmentTime: {
-            confirm_value: ''
-          }
-        }, {
-          treatment: {
-            confirm_value: ''
-          }
-        }, {
-          explain: {
-            confirm_value: ''
-          }
-        }, {
-          repairResult: {
-            confirm_value: ''
-          }
-        }, {
-          rebackTime: {
-            confirm_value: ''
-          }
-        }, {
-          nextRebackTime: {
-            confirm_value: ''
-          }
-        }, {
-          text: {
-            confirm_value: ''
-          }
-        }]
-        arr.forEach(e => {
-          res.data.confirmationcontent.push(e)
-        }, this)
-      }
       this.dataInfo = res.data
       this.setInputData()
       this.drawerVisible = true
@@ -160,32 +120,24 @@ export default {
 
         Object.keys(e).map((key, index) => {
 
-          that.paidServiceAmount = that.paidServiceAmount + e[key].amount
+          if (key.includes('现场培训内容')) {
 
-          if (key === 'nextTreatmentTime') {
+            that.trainerContent = e[key].confirm_value
 
-            that.nextTreatmentTime = e[key].confirm_value
+          }else if (key.includes('现场互动及测试培训效果')) {
 
-          }
-          if (key === 'treatment') {
-
-            that.treatment =  e[key].confirm_value
-
-          }
-          if (key === 'explain') {
-
-            that.explain = e[key].confirm_value
-
-          }
-          if (key === 'nextRebackTime') {
-
-            that.nextRebackTime =  e[key].confirm_value
+            that.trainerResult =  e[key].confirm_value
 
           }
-          if (key === 'text') {
-
-            that.text =  e[key].confirm_value
-
+        })
+      })
+    },
+    inputChange(key,data){
+      let keyValue = key
+      this.dataInfo.confirmationcontent.forEach(e => {
+        Object.keys(e).map((key, index) => {
+          if (key.includes(keyValue)) {
+            e[key].confirm_value = data
           }
         })
       })

+ 23 - 15
src/HDrpManagement/serveWorkBill/components/nonProcessTemplate.vue

@@ -7,28 +7,28 @@
         direction="rtl"
         append-to-body
         @close="onClose">
-      <div class="drawer__panel" style="margin-bottom: -10px" v-if="dataInfo.workorder">
+      <div class="drawer__panel" style="margin-bottom: 0px !important;" v-if="dataInfo.workorder">
         <el-descriptions :title="$t(`单据信息`)" >
-          <el-descriptions-item :label="$t(`服务申请单号`)"><span style="color: #666">{{$t(dataInfo.workorder.servicebillno)}}</span></el-descriptions-item>
+          <el-descriptions-item :label="$t(`服务申请单号`)"><span style="color: #666">{{$t(dataInfo.workorder.servicebillno) || '--'}}</span></el-descriptions-item>
           <el-descriptions-item :label="$t(`项目名称`)"><span style="color: #666">{{$t(dataInfo.workorder.projectname)}}</span></el-descriptions-item>
           <el-descriptions-item :label="$t(`是否有偿服务`)"><span style="color: #666">{{paidServiceAmount > 0 ? $t('是') : $t('否')}}</span></el-descriptions-item>
           <el-descriptions-item :label="$t(`是否质保期内`)"><span style="color: #666">{{inqualityguaranteeperiod == 1 ? $t('是') : $t('否')}}</span></el-descriptions-item>
-          <el-descriptions-item :label="$t(`申请原因`)"><span style="color: #666">{{$t(dataInfo.reason)}}</span></el-descriptions-item>
+          <el-descriptions-item :label="$t(`申请原因`)"><span style="color: #666">{{$t(dataInfo.reason) || '--'}}</span></el-descriptions-item>
         </el-descriptions>
-        <el-descriptions :title="$t(`应用信息`)">
-          <el-descriptions-item :label="$t(`应用系统`)"><span style="color: #666">{{$t(dataInfo.workorder.class1)}}</span></el-descriptions-item>
-          <el-descriptions-item :label="$t(`客诉大类`)"><span style="color: #666">{{$t(dataInfo.workorder.class2)}}</span></el-descriptions-item>
-          <el-descriptions-item :label="$t(`服务方式`)"><span style="color: #666">{{$t(dataInfo.workorder.type)}}</span></el-descriptions-item>
+        <el-descriptions :title="$t(`应用信息`)" style="margin-top: 10px">
+          <el-descriptions-item :label="$t(`应用系统`)"><span style="color: #666">{{$t(dataInfo.workorder.class1) || '--'}}</span></el-descriptions-item>
+          <el-descriptions-item :label="$t(`客诉大类`)"><span style="color: #666">{{$t(dataInfo.workorder.class2) || '--'}}</span></el-descriptions-item>
+          <el-descriptions-item :label="$t(`服务方式`)"><span style="color: #666">{{$t(dataInfo.workorder.type) || '--'}}</span></el-descriptions-item>
         </el-descriptions>
-        <el-descriptions :title="$t(`客户信息`)">
-          <el-descriptions-item :label="$t(`企业名称`)"><span style="color: #666">{{$t(dataInfo.workorder.abbreviation)}}</span></el-descriptions-item>
-          <el-descriptions-item :label="$t(`联系方式`)"><span style="color: #666">{{$t(dataInfo.workorder.scenecontactphonenumber)}}</span></el-descriptions-item>
+        <el-descriptions :title="$t(`客户信息`)" style="margin-top: 10px">
+          <el-descriptions-item :label="$t(`企业名称`)"><span style="color: #666">{{$t(dataInfo.workorder.abbreviation) || '--'}}</span></el-descriptions-item>
+          <el-descriptions-item :label="$t(`联系方式`)"><span style="color: #666">{{$t(dataInfo.workorder.scenecontactphonenumber) || '--'}}</span></el-descriptions-item>
           <el-descriptions-item :label="$t(`服务地址`)"><span style="color: #666">{{$t(dataInfo.workorder.province + dataInfo.workorder.city + dataInfo.workorder.county + dataInfo.workorder.address)}}</span></el-descriptions-item>
         </el-descriptions>
       </div>
       <div style="height: 10px;background: #f5f5f5"></div>
-      <div style="margin: 10px;font-weight: bold;font-size: 16px">产品</div>
-      <div class="drawer__panel" style="margin-bottom: -10px" v-if="dataInfo.trainertitems">
+      <div style="margin: 10px;font-weight: bold;font-size: 16px">{{$t(`产品`)}}</div>
+      <div class="drawer__panel" style="margin-bottom: 0 !important;" v-if="dataInfo.trainertitems">
         <tableDetailLayout
             :layout="tablecols"
             :data="dataInfo.trainertitems"
@@ -51,7 +51,7 @@
       </div>
       <div style="height: 10px;background: #f5f5f5"></div>
       <div style="margin: 10px;font-weight: bold;font-size: 16px">{{$t(`评价`)}}</div>
-      <div class="drawer__panel" style="margin-bottom: -10px">
+      <div class="drawer__panel" style="margin-bottom: 0 !important;">
         <div style="display: flex;justify-content: space-between">
           <div style="display: flex;justify-content: left">
             <div style="color: #999;font-size: 14px;margin-right: 10px">{{$t(`反应速度`)}}:</div>
@@ -69,9 +69,10 @@
       </div>
       <div style="height: 10px;background: #f5f5f5"></div>
       <div style="margin: 10px;font-weight: bold;font-size: 16px">{{$t(`客户签字`)}}</div>
-      <div class="drawer__panel" style="margin-bottom: -50px">
-        <signature :sa_workorder_confirmationid="sa_workorder_confirmationid"></signature>
+      <div class="drawer__panel" style="margin-bottom: 20px !important;">
+        <signature ref="signatureRef" :sa_workorder_confirmationid="sa_workorder_confirmationid"></signature>
       </div>
+      <div style="height: 25px;background: #f5f5f5"></div>
       <div class="fixed__btn__panel">
         <el-button
             size="small"
@@ -153,6 +154,10 @@ export default {
       this.dataInfo = res.data
       this.setInputData()
       this.drawerVisible = true
+      this.$nextTick(()=>{
+        this.$refs.signatureRef.getField()
+      })
+
     },
     setInputData() {
       let that = this
@@ -198,6 +203,9 @@ export default {
       })
     },
     onClose(){
+      this.$refs.signatureRef.btnTitle = ''
+      this.$refs.signatureRef.signatureData = null
+      this.$refs.signatureRef.signatureStarted = false
       this.$emit('onClose')
     }
   },

+ 1 - 1
src/HDrpManagement/serveWorkBill/index.vue

@@ -70,7 +70,7 @@
           <label class="search__label">{{ $t("客诉大类") }}:</label>
           <el-select
               class="inline-24"
-              v-model="where.type"
+              v-model="where.class2"
               :placeholder="$t(`请选择客诉大类`)"
               @focus="queryType('customerclass')"
               @change="selectChange"

+ 6 - 0
src/HDrpManagement/serveWorkBill/modules/checkBill/add.vue

@@ -68,6 +68,12 @@ export default {
       this.$nextTick(()=>{
         if (this.mainData.actiontype == '非工序模板'){
           this.$refs.nonProcessRef.queryInfo(sa_workorder_confirmationid)
+        }else if (this.mainData.actiontype == '安装调试'){
+          this.$refs.commissioningRef.queryInfo(sa_workorder_confirmationid)
+        }else if (this.mainData.actiontype == '安装培训'){
+          this.$refs.trainingRef.queryInfo(sa_workorder_confirmationid)
+        }else {
+          this.$refs.generalRef.queryInfo(sa_workorder_confirmationid)
         }
       })
 

+ 2 - 2
src/HDrpManagement/serveWorkBill/modules/detail.vue

@@ -100,8 +100,8 @@
         <customBtn
             btnName="中止"
             message="确认中止当前服务申请单吗?"
-            idName="2026012414051502"
-            keyName="sa_serviceorderid"
+            idName="2026012714282702"
+            keyName="sa_workorderid"
             :id="$route.query.id"
             :dialog="true"
             :checkString="true"

+ 84 - 46
src/HDrpManagement/serveWorkBill/modules/signature/index.vue

@@ -7,7 +7,7 @@
         style="margin-bottom: 20px"
         v-if="!signatureStarted"
     >
-      {{signatureData?$t(`重新签名`):$t(`点击签字`)}}
+      {{$t(btnTitle)}}
     </el-button>
 
     <!-- 签名画布区域 -->
@@ -122,32 +122,32 @@
           <img :src="signatureData" alt="签名预览" class="preview-image" />
         </div>
 
-<!--        <div class="preview-actions">-->
-<!--          <el-button-->
-<!--              type="success"-->
-<!--              @click="uploadToHuaweiCloud"-->
-<!--              :loading="uploading"-->
-<!--              :disabled="uploading"-->
-<!--          >-->
-<!--            <i class="el-icon-upload"></i>-->
-<!--            {{ uploading ? '上传中...' : '上传至华为云' }}-->
-<!--          </el-button>-->
-
-<!--          <el-button-->
-<!--              type="info"-->
-<!--              @click="downloadSignature"-->
-<!--              :disabled="!signatureData"-->
-<!--          >-->
-<!--            <i class="el-icon-download"></i> 下载签名-->
-<!--          </el-button>-->
-
-<!--          <el-button-->
-<!--              type="warning"-->
-<!--              @click="restartSignature"-->
-<!--          >-->
-<!--            <i class="el-icon-refresh-left"></i> 重新签名-->
-<!--          </el-button>-->
-<!--        </div>-->
+        <!--        <div class="preview-actions">-->
+        <!--          <el-button-->
+        <!--              type="success"-->
+        <!--              @click="uploadToHuaweiCloud"-->
+        <!--              :loading="uploading"-->
+        <!--              :disabled="uploading"-->
+        <!--          >-->
+        <!--            <i class="el-icon-upload"></i>-->
+        <!--            {{ uploading ? '上传中...' : '上传至华为云' }}-->
+        <!--          </el-button>-->
+
+        <!--          <el-button-->
+        <!--              type="info"-->
+        <!--              @click="downloadSignature"-->
+        <!--              :disabled="!signatureData"-->
+        <!--          >-->
+        <!--            <i class="el-icon-download"></i> 下载签名-->
+        <!--          </el-button>-->
+
+        <!--          <el-button-->
+        <!--              type="warning"-->
+        <!--              @click="restartSignature"-->
+        <!--          >-->
+        <!--            <i class="el-icon-refresh-left"></i> 重新签名-->
+        <!--          </el-button>-->
+        <!--        </div>-->
 
         <!-- 上传状态 -->
         <div class="upload-status" v-if="uploadStatus">
@@ -201,6 +201,7 @@ export default {
   data() {
     return {
       // 签名状态
+      btnTitle:'点击签字',
       signatureStarted: false,
       signatureData: null,
       hasSignature: false,
@@ -231,7 +232,7 @@ export default {
         "method": "getFileName",
         "content": {
           "filename": '客户签字',
-          "filetype": 'png',
+          "filetype": 'jpg',
           "parentid": ""//归属文件夹ID
         }
       },
@@ -240,7 +241,8 @@ export default {
         "ownertable": 'sa_workorder_confirmation',
         "ownerid": 0,
         "usetype": 'signature',
-      }
+      },
+      linksid:''
 
     };
   },
@@ -275,12 +277,15 @@ export default {
   methods: {
     // 开始签名
     startSignature() {
-      this.signatureData = ''
-      this.signatureStarted = true
-      this.$nextTick(() => {
-        this.initCanvas()
-      })
-      this.$emit('signature-start')
+      if (this.btnTitle == '重新签字'){
+        this.restartSignature()
+      }else {
+        this.signatureData = ''
+        this.signatureStarted = true
+        this.$nextTick(() => {
+          this.initCanvas()
+        })
+      }
     },
 
     // 取消签名
@@ -304,14 +309,26 @@ export default {
         cancelButtonText: '取消',
         type: 'warning'
       }).then(() => {
-        this.signatureData = null
-        this.hasSignature = false
+        this.delFile()
+      })
+    },
+    async delFile(){
+      const res = await this.$api.requested({
+        "classname": "system.attachment.Attachment",
+        "method": "deleteFileLink",
+        "content": {
+          "linksids": [this.linksid]
+        }
+      })
+      if (res.code == 0){
+        this.tool.showMessage(res,()=>{})
+      }else {
+        this.signatureData = ''
         this.signatureStarted = true
         this.$nextTick(() => {
           this.initCanvas()
         })
-        this.$emit('signature-restart')
-      })
+      }
     },
 
     // 初始化画布
@@ -470,7 +487,7 @@ export default {
         tempCtx.drawImage(this.canvas, 0, 0)
 
         // 转换为Base64
-        this.signatureData = tempCanvas.toDataURL('image/png')
+        this.signatureData = tempCanvas.toDataURL('image/jpg')
         try {
           // 移除Base64前缀
           const base64WithoutPrefix = this.signatureData.replace(/^data:image\/(png|jpeg|jpg);base64,/, '')
@@ -486,17 +503,17 @@ export default {
 
           // 创建Blob对象
           const blob = new Blob([bytes], {
-            type: 'image/png'
+            type: 'image/jpg'
           })
           console.log(blob,'2222输出blob数据')
 
           // 生成文件名
           const timestamp = new Date().getTime()
-          const fileName = `signature_${timestamp}.png`
+          const fileName = `signature_${timestamp}.jgp`
 
           // 创建File对象
           const file = new File([blob], fileName, {
-            type: 'image/png',
+            type: 'image/jpg',
             lastModified: Date.now()
           })
           console.log(file,'file输出3333')
@@ -544,7 +561,7 @@ export default {
 
       ctx.drawImage(canvas, 0, 0, 200, 100)
 
-      return thumbnailCanvas.toDataURL('image/png')
+      return thumbnailCanvas.toDataURL('image/jpg')
     },
 
     // 显示预览弹窗
@@ -553,9 +570,30 @@ export default {
         this.previewDialogVisible = true
       }
     },
+    // 获取附件信息
+    async getField(){
+      const res = await this.$api.requested({
+        "classname": "system.attachment.Attachment",
+        "method": "queryFileLink",
+        "content": {
+          "ownertable": "sa_workorder_confirmation",
+          "ownerid": this.sa_workorder_confirmationid,
+          "usetype":"signature"//传空返回有所
+        }
+      })
+      if (res.data.length > 0){
+        const url = new URL(res.data[0].url)
+        this.signatureData = url.origin + url.pathname
+        this.linksid = res.data[0].linksid
+        this.btnTitle = '重新签字'
+      }else {
+        this.btnTitle = '点击签字'
+      }
+
+    },
     // 获取华为云上传地址
     async getUploadUrl (file, ext,formData) {
-      this.params.content.parentid = this.folderid
+      this.params.content.parentid = this.folderid.appfolderid
       const res = await this.$api.requested(this.params)
       let url = res.data.uploadurl
       let obsfilename = res.data.serialfilename
@@ -906,7 +944,7 @@ export default {
 
 /* 预览区域样式 */
 .preview-area {
-  margin-top: 30px;
+  margin-top: 0px;
   background: white;
   border-radius: 12px;
   box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);

+ 1030 - 0
src/HDrpManagement/serveWorkBill/modules/signature/indexCopy.vue

@@ -0,0 +1,1030 @@
+<template>
+  <div class="signature-container">
+    <!-- 签名触发区域 -->
+    <el-button
+        type="primary"
+        @click="startSignature"
+        style="margin-bottom: 20px"
+        v-if="!signatureStarted"
+    >
+      {{$t(btnTitle)}}
+    </el-button>
+
+    <!-- 签名画布区域 -->
+    <div class="signature-canvas-container" v-if="signatureStarted" style="margin-bottom: -100px !important;">
+      <div class="canvas-header">
+        <span class="prompt-text">请在下方区域签名</span>
+        <div class="toolbar">
+          <el-button-group>
+            <el-button
+                size="small"
+                :type="penColor === 'black' ? 'primary' : ''"
+                @click="setPenColor('black')"
+            >
+              黑色
+            </el-button>
+            <el-button
+                size="small"
+                :type="penColor === 'blue' ? 'primary' : ''"
+                @click="setPenColor('blue')"
+            >
+              蓝色
+            </el-button>
+            <el-button
+                size="small"
+                :type="penColor === 'red' ? 'primary' : ''"
+                @click="setPenColor('red')"
+            >
+              红色
+            </el-button>
+          </el-button-group>
+
+          <el-button-group style="margin-left: 10px;">
+            <el-button
+                size="small"
+                :type="penSize === 2 ? 'primary' : ''"
+                @click="setPenSize(2)"
+            >
+              细
+            </el-button>
+            <el-button
+                size="small"
+                :type="penSize === 4 ? 'primary' : ''"
+                @click="setPenSize(4)"
+            >
+              中
+            </el-button>
+            <el-button
+                size="small"
+                :type="penSize === 6 ? 'primary' : ''"
+                @click="setPenSize(6)"
+            >
+              粗
+            </el-button>
+          </el-button-group>
+          <el-button
+              @click="clearCanvas"
+              :disabled="!hasSignature"
+              size="small"
+          >
+            <i class="el-icon-delete"></i> 清空
+          </el-button>
+          <el-button
+              type="primary"
+              @click="saveSignature"
+              :disabled="!hasSignature"
+              size="small"
+              :loading="saving"
+          >
+            <i class="el-icon-check"></i> {{ saving ? '保存中...' : '确认签名' }}
+          </el-button>
+        </div>
+      </div>
+
+      <!-- 画布 -->
+      <div
+          class="signature-canvas"
+          @mousedown="startDrawing"
+          @mousemove="draw"
+          @mouseup="stopDrawing"
+          @mouseleave="stopDrawing"
+          @touchstart="startDrawingTouch"
+          @touchmove="drawTouch"
+          @touchend="stopDrawing"
+          ref="canvasContainer"
+      >
+        <canvas
+            ref="signatureCanvas"
+            :width="canvasWidth"
+            :height="canvasHeight"
+        ></canvas>
+      </div>
+    </div>
+
+    <!-- 预览区域 -->
+<!--    <div class="preview-area" v-if="signatureData">-->
+<!--      <div class="preview-header">-->
+<!--        <span class="preview-title">签名预览</span>-->
+<!--      </div>-->
+
+<!--      <div class="preview-content">-->
+<!--        <div class="preview-image-container">-->
+<!--          <img :src="signatureData" alt="签名预览" class="preview-image" />-->
+<!--        </div>-->
+<!--      </div>-->
+<!--    </div>-->
+    <!-- 预览区域 -->
+    <div class="preview-area" v-if="signatureData">
+      <div class="preview-header">
+        <span class="preview-title">签名预览</span>
+      </div>
+
+      <div class="preview-content">
+        <div class="preview-image-container">
+          <img :src="signatureData" alt="签名预览" class="preview-image" />
+        </div>
+
+        <!--        <div class="preview-actions">-->
+        <!--          <el-button-->
+        <!--              type="success"-->
+        <!--              @click="uploadToHuaweiCloud"-->
+        <!--              :loading="uploading"-->
+        <!--              :disabled="uploading"-->
+        <!--          >-->
+        <!--            <i class="el-icon-upload"></i>-->
+        <!--            {{ uploading ? '上传中...' : '上传至华为云' }}-->
+        <!--          </el-button>-->
+
+        <!--          <el-button-->
+        <!--              type="info"-->
+        <!--              @click="downloadSignature"-->
+        <!--              :disabled="!signatureData"-->
+        <!--          >-->
+        <!--            <i class="el-icon-download"></i> 下载签名-->
+        <!--          </el-button>-->
+
+        <!--          <el-button-->
+        <!--              type="warning"-->
+        <!--              @click="restartSignature"-->
+        <!--          >-->
+        <!--            <i class="el-icon-refresh-left"></i> 重新签名-->
+        <!--          </el-button>-->
+        <!--        </div>-->
+
+        <!-- 上传状态 -->
+<!--        <div class="upload-status" v-if="uploadStatus">-->
+<!--          <el-alert-->
+<!--              :title="uploadStatus.title"-->
+<!--              :type="uploadStatus.type"-->
+<!--              :description="uploadStatus.message"-->
+<!--              :closable="false"-->
+<!--              show-icon-->
+<!--          >-->
+<!--          </el-alert>-->
+<!--        </div>-->
+      </div>
+    </div>
+
+
+
+
+  </div>
+</template>
+
+<script>
+export default {
+  name: "index",
+  props:['sa_workorder_confirmationid'],
+  data() {
+    return {
+      // 签名状态
+      btnTitle:'点击签字',
+      signatureStarted: false,
+      signatureData: null,
+      hasSignature: false,
+      saving: false,
+
+      // 画布相关
+      canvas: null,
+      ctx: null,
+      isDrawing: false,
+      lastX: 0,
+      lastY: 0,
+      penColor: 'black',
+      penSize: 4,
+
+      // 弹窗
+      previewDialogVisible: false,
+      folderid:JSON.parse(sessionStorage.getItem('folderid')),
+
+      params: {
+        "classname": "system.attachment.huawei.OBS",
+        "method": "getFileName",
+        "content": {
+          "filename": '客户签字',
+          "filetype": 'jpg',
+          "parentid": ""//归属文件夹ID
+        }
+      },
+
+      bindData:{
+        "ownertable": 'sa_workorder_confirmation',
+        "ownerid": 0,
+        "usetype": 'signature',
+      },
+      linksid:''
+
+    };
+  },
+  computed: {
+    canvasWidth() {
+      return this.$refs.canvasContainer ?
+          this.$refs.canvasContainer.clientWidth : 2800
+    },
+    canvasHeight() {
+      return 400
+    },
+  },
+  mounted() {
+    if (this.autoStart) {
+      this.startSignature()
+    }
+  },
+  methods: {
+    // 开始签名
+    startSignature() {
+      if (this.btnTitle == '重新签字'){
+        this.restartSignature()
+      }else {
+        this.signatureData = ''
+        this.signatureStarted = true
+        this.$nextTick(() => {
+          this.initCanvas()
+        })
+      }
+    },
+
+    // 取消签名
+    cancelSignature() {
+      this.$confirm('确定要取消签名吗?签名内容将不会被保存。', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        this.signatureStarted = false
+        this.signatureData = null
+        this.hasSignature = false
+      })
+    },
+
+    // 重新签名
+    restartSignature() {
+      this.$confirm('重新签名将清除当前签名,是否继续?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        this.delFile()
+      })
+    },
+
+    async delFile(){
+      const res = await this.$api.requested({
+        "classname": "system.attachment.Attachment",
+        "method": "deleteFileLink",
+        "content": {
+          "linksids": [this.linksid]
+        }
+      })
+      if (res.code == 0){
+        this.tool.showMessage(res,()=>{})
+      }else {
+        this.signatureData = ''
+        this.signatureStarted = true
+        this.$nextTick(() => {
+          this.initCanvas()
+        })
+      }
+    },
+
+    // 初始化画布
+    initCanvas() {
+      if (!this.$refs.signatureCanvas) return
+
+      this.canvas = this.$refs.signatureCanvas
+      this.ctx = this.canvas.getContext('2d')
+
+      // 设置白色背景
+      this.ctx.fillStyle = 'white'
+      this.ctx.fillRect(0, 0, this.canvas.width, this.canvas.height)
+
+      // 设置绘制样式
+      this.ctx.strokeStyle = this.penColor
+      this.ctx.lineWidth = this.penSize
+      this.ctx.lineCap = 'round'
+      this.ctx.lineJoin = 'round'
+
+      // 添加网格背景
+      this.drawGridBackground()
+    },
+
+    // 绘制网格背景
+    drawGridBackground() {
+      const gridSize = 20
+      const gridColor = '#f0f0f0'
+
+      this.ctx.save()
+      this.ctx.strokeStyle = gridColor
+      this.ctx.lineWidth = 1
+
+      // 绘制水平线
+      for (let y = gridSize; y < this.canvas.height; y += gridSize) {
+        this.ctx.beginPath()
+        this.ctx.moveTo(0, y)
+        this.ctx.lineTo(this.canvas.width, y)
+        this.ctx.stroke()
+      }
+
+      // 绘制垂直线
+      for (let x = gridSize; x < this.canvas.width; x += gridSize) {
+        this.ctx.beginPath()
+        this.ctx.moveTo(x, 0)
+        this.ctx.lineTo(x, this.canvas.height)
+        this.ctx.stroke()
+      }
+
+      this.ctx.restore()
+    },
+
+    // 设置笔颜色
+    setPenColor(color) {
+      this.penColor = color
+      this.ctx.strokeStyle = color
+    },
+
+    // 设置笔粗细
+    setPenSize(size) {
+      this.penSize = size
+      this.ctx.lineWidth = size
+    },
+
+    // 清空画布
+    clearCanvas() {
+      this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height)
+      this.ctx.fillStyle = 'white'
+      this.ctx.fillRect(0, 0, this.canvas.width, this.canvas.height)
+      this.drawGridBackground()
+      this.hasSignature = false
+      this.$emit('clear')
+    },
+
+    // 清空签名(完全重置)
+    clearSignature() {
+      this.clearCanvas()
+      this.signatureData = null
+    },
+
+    // 鼠标事件处理
+    startDrawing(e) {
+      this.isDrawing = true
+      const rect = this.canvas.getBoundingClientRect()
+      this.lastX = e.clientX - rect.left
+      this.lastY = e.clientY - rect.top
+    },
+
+    draw(e) {
+      if (!this.isDrawing) return
+
+      const rect = this.canvas.getBoundingClientRect()
+      const currentX = e.clientX - rect.left
+      const currentY = e.clientY - rect.top
+
+      this.ctx.beginPath()
+      this.ctx.moveTo(this.lastX, this.lastY)
+      this.ctx.lineTo(currentX, currentY)
+      this.ctx.stroke()
+
+      this.lastX = currentX
+      this.lastY = currentY
+
+      // 标记已有签名
+      if (!this.hasSignature) {
+        this.hasSignature = true
+      }
+    },
+
+    stopDrawing() {
+      this.isDrawing = false
+    },
+
+    // 触摸事件处理
+    startDrawingTouch(e) {
+      e.preventDefault()
+      const touch = e.touches[0]
+      const mouseEvent = new MouseEvent('mousedown', {
+        clientX: touch.clientX,
+        clientY: touch.clientY
+      })
+      this.startDrawing(mouseEvent)
+    },
+
+    drawTouch(e) {
+      e.preventDefault()
+      const touch = e.touches[0]
+      const mouseEvent = new MouseEvent('mousemove', {
+        clientX: touch.clientX,
+        clientY: touch.clientY
+      })
+      this.draw(mouseEvent)
+    },
+
+    // 保存签名
+    saveSignature() {
+      if (!this.hasSignature) {
+        this.$message.warning('请先完成签名')
+        return
+      }
+
+      this.saving = true
+
+      try {
+        // 创建临时画布
+        const tempCanvas = document.createElement('canvas')
+        const tempCtx = tempCanvas.getContext('2d')
+
+        tempCanvas.width = this.canvas.width
+        tempCanvas.height = this.canvas.height
+
+        // 白色背景
+        tempCtx.fillStyle = 'white'
+        tempCtx.fillRect(0, 0, tempCanvas.width, tempCanvas.height)
+
+        // 绘制签名
+        tempCtx.drawImage(this.canvas, 0, 0)
+
+        // 转换为Base64
+        this.signatureData = tempCanvas.toDataURL('image/jpg')
+        try {
+          // 移除Base64前缀
+          const base64WithoutPrefix = this.signatureData.replace(/^data:image\/(png|jpeg|jpg);base64,/, '')
+
+          // 将Base64转换为二进制字符串
+          const binaryString = window.atob(base64WithoutPrefix)
+
+          // 创建Uint8Array
+          const bytes = new Uint8Array(binaryString.length)
+          for (let i = 0; i < binaryString.length; i++) {
+            bytes[i] = binaryString.charCodeAt(i)
+          }
+
+          // 创建Blob对象
+          const blob = new Blob([bytes], {
+            type: 'image/jpg'
+          })
+          console.log(blob,'2222输出blob数据')
+
+          // 生成文件名
+          const timestamp = new Date().getTime()
+          const fileName = `signature_${timestamp}.png`
+
+          // 创建File对象
+          const file = new File([blob], fileName, {
+            type: 'image/jpg',
+            lastModified: Date.now()
+          })
+          console.log(file,'file输出3333')
+          const index = file.name.lastIndexOf(".")
+          const ext = file.name.substr(index + 1)
+
+          const formData = new FormData()
+          formData.append('file', file)
+          formData.append('type', 'signature')
+          formData.append('uploadTime', new Date().toISOString())
+          formData.append('source', 'web_signature_pad')
+
+          this.getUploadUrl(file,ext,formData)
+        } catch (error) {
+          console.error('转换Base64为Blob失败:', error)
+          throw new Error('图片格式转换失败')
+        }
+
+        // 生成缩略图
+        const thumbnail = this.generateThumbnail(tempCanvas)
+
+        this.$emit('save', {
+          full: this.signatureData,
+          thumbnail: thumbnail,
+          timestamp: new Date().getTime()
+        })
+        this.$message.success('签名保存成功!')
+        this.signatureStarted = false
+
+      } catch (error) {
+        console.error('保存签名失败:', error)
+        this.$message.error('保存失败,请重试')
+      } finally {
+        this.saving = false
+      }
+    },
+
+    // 生成缩略图
+    generateThumbnail(canvas) {
+      const thumbnailCanvas = document.createElement('canvas')
+      const ctx = thumbnailCanvas.getContext('2d')
+
+      thumbnailCanvas.width = 200
+      thumbnailCanvas.height = 100
+
+      ctx.drawImage(canvas, 0, 0, 200, 100)
+
+      return thumbnailCanvas.toDataURL('image/jpg')
+    },
+
+    // 显示预览弹窗
+    showPreviewDialog() {
+      if (this.signatureData) {
+        this.previewDialogVisible = true
+      }
+    },
+    // 获取附件信息
+    async getField(){
+      const res = await this.$api.requested({
+        "classname": "system.attachment.Attachment",
+        "method": "queryFileLink",
+        "content": {
+          "ownertable": "sa_workorder_confirmation",
+          "ownerid": this.sa_workorder_confirmationid,
+          "usetype":"signature"//传空返回有所
+        }
+      })
+      if (res.data.length > 0){
+        const url = new URL(res.data[0].url)
+        this.signatureData = url.origin + url.pathname
+        this.linksid = res.data[0].linksid
+        this.btnTitle = '重新签字'
+      }else {
+        this.btnTitle = '点击签字'
+      }
+
+    },
+    // 获取华为云上传地址
+    async getUploadUrl (file, ext,formData) {
+      this.params.content.parentid = this.folderid.appfolderid
+      const res = await this.$api.requested(this.params)
+      let url = res.data.uploadurl
+      let obsfilename = res.data.serialfilename
+
+      this.upoladFileToServer(url, file, ext, obsfilename,formData,res.data)
+    },
+    // 上传到华为云
+    async upoladFileToServer (url, file, ext, obsfilename,formData,data) {
+      this.$axios({
+        url:url,
+        method:'PUT',
+        data: file,
+        headers: {
+          'Content-Type': 'application/octet-stream'
+        }
+      }).then((res) => {
+        console.log(res,'输出res的数据')
+        this.createFileRecord(obsfilename)
+      })
+    },
+    // 上传成功以后生成附件记录
+    async createFileRecord (obsfilename,attinfos) {
+      this.bindData.ownerid = this.sa_workorder_confirmationid
+      let obj = {
+        "serialfilename": obsfilename
+      }
+      obj = Object.assign({},obj,this.bindData)
+      console.log(this.sa_workorder_confirmationid)
+      let param = {
+        "classname": "system.attachment.huawei.OBS",
+        "method": "uploadSuccess",
+        "content":obj
+      }
+      const res = await this.$api.requested(param)
+      console.log(res.data,'上传成功')
+      // if (res.code ===  1) {
+      //   this.$emit('onSuccess',res)
+      // }
+    },
+    // 上传至华为云
+    async uploadToHuaweiCloud() {
+      if (!this.signatureData) {
+        this.$message.warning('请先完成签名并保存')
+        return
+      }
+
+      this.uploading = true
+      this.uploadDialogVisible = true
+      this.uploadProgress = 0
+
+      try {
+        // 模拟上传进度
+        const progressInterval = setInterval(() => {
+          if (this.uploadProgress < 90) {
+            this.uploadProgress += 10
+          }
+        }, 200)
+
+        // 这里应该调用后端接口
+        // 注意:实际项目中应该通过后端上传,而不是前端直接上传
+        await this.uploadToBackend()
+
+        clearInterval(progressInterval)
+        this.uploadProgress = 100
+
+        // 上传成功状态
+        this.uploadStatus = {
+          type: 'success',
+          title: '上传成功',
+          message: '签名已成功上传至华为云存储'
+        }
+
+        this.$emit('upload-success', {
+          url: 'https://example.com/signature.png',
+          timestamp: new Date().getTime()
+        })
+
+        // 3秒后关闭弹窗
+        setTimeout(() => {
+          this.uploadDialogVisible = false
+          this.uploading = false
+        }, 3000)
+
+      } catch (error) {
+        console.error('上传失败:', error)
+
+        this.uploadStatus = {
+          type: 'error',
+          title: '上传失败',
+          message: error.message || '上传过程中出现错误'
+        }
+
+        this.$emit('upload-error', error)
+        this.uploading = false
+      }
+    },
+
+    // 上传到后端接口
+    uploadToBackend() {
+      return new Promise((resolve, reject) => {
+        // 实际项目中应该调用后端接口
+        // 这里使用setTimeout模拟网络请求
+        setTimeout(() => {
+          // 模拟成功或失败
+          const success = Math.random() > 0.2
+          if (success) {
+            resolve()
+          } else {
+            reject(new Error('网络请求失败,请检查网络连接'))
+          }
+        }, 1500)
+      })
+    },
+
+    // 取消上传
+    cancelUpload() {
+      if (this.uploadProgress < 100) {
+        this.$confirm('确定要取消上传吗?', '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          this.uploadDialogVisible = false
+          this.uploading = false
+          this.uploadProgress = 0
+          this.uploadStatus = null
+          this.$message.info('上传已取消')
+        })
+      } else {
+        this.uploadDialogVisible = false
+        this.uploading = false
+      }
+    },
+
+    // 下载签名
+    downloadSignature() {
+      if (!this.signatureData) {
+        this.$message.warning('没有可下载的签名')
+        return
+      }
+
+      const link = document.createElement('a')
+      const timestamp = new Date().getTime()
+      const fileName = `客户签名_${timestamp}.png`
+
+      link.href = this.signatureData
+      link.download = fileName
+      document.body.appendChild(link)
+      link.click()
+      document.body.removeChild(link)
+
+      this.$message.success('签名下载成功')
+    }
+  }
+}
+</script>
+
+<style scoped>
+.signature-container {
+  min-height: 500px;
+}
+
+/* 触发区域样式 */
+.trigger-area {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  min-height: 400px;
+  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+  border-radius: 12px;
+  padding: 40px;
+}
+
+.trigger-content {
+  text-align: center;
+  color: white;
+}
+
+.start-signature-btn {
+  padding: 20px 40px;
+  font-size: 18px;
+  border-radius: 50px;
+  background: rgba(255, 255, 255, 0.2);
+  border: 2px solid rgba(255, 255, 255, 0.5);
+  transition: all 0.3s ease;
+}
+
+.start-signature-btn:hover {
+  background: rgba(255, 255, 255, 0.3);
+  transform: translateY(-2px);
+  box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2);
+}
+
+.hint-text {
+  margin-top: 20px;
+  font-size: 16px;
+  opacity: 0.9;
+}
+
+.signature-instructions {
+  margin-top: 40px;
+  background: rgba(255, 255, 255, 0.1);
+  padding: 20px;
+  border-radius: 10px;
+  text-align: left;
+  max-width: 400px;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+.signature-instructions h4 {
+  margin-bottom: 10px;
+  color: white;
+}
+
+.signature-instructions ul {
+  list-style: none;
+  padding-left: 0;
+}
+
+.signature-instructions li {
+  padding: 5px 0;
+  color: rgba(255, 255, 255, 0.9);
+  position: relative;
+  padding-left: 20px;
+}
+
+.signature-instructions li:before {
+  content: '✓';
+  position: absolute;
+  left: 0;
+  color: #67C23A;
+}
+
+/* 签名区域样式 */
+.signature-area {
+  background: white;
+  border-radius: 12px;
+  box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
+  overflow: hidden;
+  margin-bottom: 60px;
+}
+
+.signature-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 20px;
+  background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
+  border-bottom: 1px solid #e4e7ed;
+}
+
+.header-left {
+  display: flex;
+  align-items: center;
+  gap: 10px;
+}
+
+.signature-title {
+  font-size: 18px;
+  font-weight: bold;
+  color: #303133;
+}
+
+.canvas-header {
+  padding: 15px 20px;
+  background: #f8f9fa;
+  border-bottom: 1px solid #ebeef5;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+
+.prompt-text {
+  color: #606266;
+  font-weight: 500;
+}
+
+.toolbar {
+  display: flex;
+  gap: 10px;
+}
+
+.signature-canvas-container {
+  padding: 2px
+}
+
+.signature-canvas {
+  position: relative;
+  border: 2px solid #dcdfe6;
+  border-radius: 8px;
+  background: white;
+  cursor: crosshair;
+  height: 400px;
+  overflow: hidden;
+  transition: border-color 0.3s;
+}
+
+.signature-canvas:hover {
+  border-color: #409eff;
+}
+
+.signature-canvas canvas {
+  display: block;
+  background: white;
+  position: relative;
+  z-index: 1;
+}
+
+.canvas-hint {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  z-index: 0;
+  pointer-events: none;
+}
+
+.hint-icon {
+  font-size: 48px;
+  color: #dcdfe6;
+  margin-bottom: 10px;
+}
+
+.hint-text {
+  color: #909399;
+  font-size: 16px;
+  margin-bottom: 5px;
+}
+
+.hint-subtext {
+  color: #c0c4cc;
+  font-size: 14px;
+}
+
+.signature-actions {
+  display: flex;
+  justify-content: center;
+  gap: 20px;
+  padding: 20px 0;
+}
+
+/* 预览区域样式 */
+.preview-area {
+  margin-top: 30px;
+  background: white;
+  border-radius: 12px;
+  box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
+  overflow: hidden;
+}
+
+.preview-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 20px;
+  background: linear-gradient(135deg, #f0f9eb 0%, #e1f3d8 100%);
+  border-bottom: 1px solid #e1f3d8;
+}
+
+.preview-title {
+  font-size: 18px;
+  font-weight: bold;
+  color: #303133;
+}
+
+.preview-content {
+  padding: 20px;
+}
+
+.preview-image-container {
+  position: relative;
+  border: 1px solid #ebeef5;
+  border-radius: 8px;
+  overflow: hidden;
+  margin-bottom: 20px;
+  background: #fafafa;
+  text-align: center;
+  min-height: 200px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.preview-image {
+  max-width: 100%;
+  max-height: 300px;
+  object-fit: contain;
+}
+
+.preview-overlay {
+  position: absolute;
+  bottom: 10px;
+  right: 10px;
+}
+
+.preview-actions {
+  display: flex;
+  justify-content: center;
+  gap: 15px;
+  flex-wrap: wrap;
+  margin-bottom: 20px;
+}
+
+.upload-status {
+  margin-top: 20px;
+}
+
+/* 上传进度样式 */
+.upload-progress-container {
+  padding: 20px;
+  text-align: center;
+}
+
+.progress-text {
+  margin-top: 15px;
+  color: #606266;
+  font-size: 14px;
+}
+
+/* 全屏预览样式 */
+.full-preview {
+  text-align: center;
+  padding: 20px;
+  background: #f5f7fa;
+  border-radius: 8px;
+}
+
+.full-preview img {
+  max-width: 100%;
+  max-height: 70vh;
+  object-fit: contain;
+  border: 1px solid #dcdfe6;
+  border-radius: 4px;
+  background: white;
+}
+
+/* 响应式调整 */
+@media (max-width: 768px) {
+  .trigger-area {
+    padding: 20px;
+    min-height: 300px;
+  }
+
+  .start-signature-btn {
+    padding: 15px 30px;
+    font-size: 16px;
+  }
+
+  .signature-instructions {
+    padding: 15px;
+  }
+
+  .canvas-header {
+    flex-direction: column;
+    gap: 10px;
+    align-items: stretch;
+  }
+
+  .toolbar {
+    justify-content: center;
+    flex-wrap: wrap;
+  }
+
+  .preview-actions {
+    flex-direction: column;
+  }
+
+  .preview-actions .el-button {
+    width: 100%;
+  }
+}
+</style>

+ 1 - 1
src/HDrpManagement/serveWorkBill/modules/teamList/index.vue

@@ -44,7 +44,7 @@
         <el-table-column :label="$t('操作')">
           <template slot-scope="scope">
             <el-button
-              :disabled="mainData.status != '进行中'"
+              :disabled="mainData.status != '进行中' || scope.row.isleader"
               class="inline-16"
               size="mini"
               type="text"

+ 5 - 5
src/HManagement/siteManage/securityConfig/modules/serviceImprovementRule.vue

@@ -8,7 +8,7 @@
           <el-button type="primary" size="mini" @click="addRow">{{ $t('添加行') }}</el-button>
         </div>
       </div>
-      
+
       <el-table :data="tableData" style="width: 100%" border size="small">
         <el-table-column :label="$t('产品经理')" prop="name">
           <template slot-scope="scope" >
@@ -113,7 +113,7 @@
 
       <div class="dialog-footer" style="margin-top: 20px; text-align: right;">
         <el-button size="small" @click="dialogVisible = false" class="normal-btn-width">{{$t('取 消')}}</el-button>
-        <el-button size="small" type="primary" class="normal-btn-width" @click="dialogVisible = false">{{$t('确 定')}}</el-button>
+<!--        <el-button size="small" type="primary" class="normal-btn-width" @click="dialogVisible = false">{{$t('确 定')}}</el-button>-->
       </div>
     </el-dialog>
   </div>
@@ -201,7 +201,7 @@ export default {
           this.tableData.splice(index, 1);
         });
       }
-      
+
     },
     resetParam() {
       this.managerParam.content.where.condition = '';
@@ -301,7 +301,7 @@ export default {
         this.$message.warning(this.$t('请选择产品经理'));
         return;
       }
-      
+
       const res = await this.$api.requested({
         "content": {
           "hrid": row.hrid,
@@ -310,7 +310,7 @@ export default {
         },
         "id": 2026011709520902,
       });
-      
+
       if (res.code === 1) {
         this.$message.success(this.$t('保存成功'));
         this.queryData();