Bläddra i källkod

服务改善,工单、申请单跳转到服务改善单

qymljy 3 månader sedan
förälder
incheckning
6052beedd7

+ 7 - 3
src/HDrpManagement/serveBill/modules/detail.vue

@@ -95,10 +95,12 @@
           <serviceWorkOrder ref="serviceWorkOrderRef" v-if="mainData" :mainData="mainData" :nodes="nodes"
                             :team_name="team_name" :team_phone_number="team_phone_number" :new-query="true"></serviceWorkOrder>
         </div>
-        <div v-else>服务改善</div>
+        <div v-else>
+          <serviceImprovement></serviceImprovement>
+        </div>
       </div>
       <div slot="slot2">
-        服务改善
+        <serviceImprovement></serviceImprovement>
       </div>
     </basicDetails>
   </div>
@@ -114,6 +116,7 @@ import productTable from "./product/index";
 import addProduct from "./product/add";
 import serviceApplication from "@/HDrpManagement/serveBillMag/components/serviceApplication";
 import serviceWorkOrder from '@/HDrpManagement/serveWorkBill/modules/serviceWorkOrder/index'
+import serviceImprovement from '@/HDrpManagement/serveBillMag/modules/serviceImprovement'
 export default {
   name: "detail",
   data() {
@@ -141,7 +144,8 @@ export default {
     productTable,
     addProduct,
     serviceApplication,
-    serviceWorkOrder
+    serviceWorkOrder,
+    serviceImprovement
   },
   methods: {
     hrMain(data){

+ 7 - 3
src/HDrpManagement/serveBillMag/modules/detail.vue

@@ -78,10 +78,12 @@
           <serviceWorkOrder ref="serviceWorkOrderRef" v-if="mainData" :mainData="mainData" :nodes="nodes"
                             :team_name="team_name" :team_phone_number="team_phone_number" :new-query="true"></serviceWorkOrder>
         </div>
-        <div v-else>服务改善</div>
+        <div v-else>
+          <serviceImprovement></serviceImprovement>
+        </div>
       </div>
       <div slot="slot2" >
-        服务改善
+        <serviceImprovement></serviceImprovement>
       </div>
     </basicDetails>
   </div>
@@ -97,6 +99,7 @@ import productTable from './product/index'
 import addProduct from './product/add'
 import serviceApplication from '../components/serviceApplication'
 import serviceWorkOrder from '@/HDrpManagement/serveWorkBill/modules/serviceWorkOrder/index'
+import serviceImprovement from '@/HDrpManagement/serveBillMag/modules/serviceImprovement'
 export default {
   name: "detail",
   data() {
@@ -124,7 +127,8 @@ export default {
     productTable,
     addProduct,
     serviceApplication,
-    serviceWorkOrder
+    serviceWorkOrder,
+    serviceImprovement
   },
   methods:{
     hrMain(data){

+ 144 - 0
src/HDrpManagement/serveBillMag/modules/serviceImprovement/index.vue

@@ -0,0 +1,144 @@
+<template>
+  <div>
+    <el-input  style="width:200px;" :placeholder="$t('搜索')" :suffix-icon="param.content.where.condition?param.content.where.condition.length > 0?'':'':'el-icon-search'" v-model="param.content.where.condition"
+               @keyup.native.enter="listData(param.content.pageNumber = 1)" @clear="listData(param.content.pageNumber = 1)" size="small" class="input-with-select inline-16 layout_search__panel" clearable>
+    </el-input>
+    <el-card v-for="item in list" :key="item.index" style="margin-top: 20px" shadow="hover" class="box-card">
+      <div slot="header" class="clearfix" style="display: flex;justify-content: space-between">
+        <div style="margin-left: 10px;display: flex;justify-content: left">
+          <div style="color: #3874F6" @click="goDetail(item)">{{item.billno}}</div>
+          <el-tag size="mini" style="margin-left: 20px" v-if="item.type" type="warning">{{item.type}}</el-tag>
+          <div v-if="item.result">
+            <el-tag size="mini" style="margin-left: 10px" v-if="item.result == '有效'" >{{item.result}}</el-tag>
+            <el-tag size="mini" style="margin-left: 10px" v-else type="info">{{item.result}}</el-tag>
+          </div>
+        </div>
+        <div :style="tool.getStatusColor(item.status)">
+          {{item.status}}
+        </div>
+      </div>
+      <div style="padding: 20px;">
+        <el-descriptions class="margin-top"  :column="5" >
+          <el-descriptions-item :label="$t(`工单号`)">{{item.billno_workorder || '--'}}</el-descriptions-item>
+          <el-descriptions-item :label="$t(`申请单号`)">{{item.billno_serviceorder || '--'}}</el-descriptions-item>
+          <el-descriptions-item :label="$t(`客诉大类`)">{{item.class2 || '--'}}</el-descriptions-item>
+          <el-descriptions-item :label="$t(`分析负责人`)">{{item.name_analysis || '--'}}</el-descriptions-item>
+          <el-descriptions-item :label="$t(`方案编辑人`)">{{item.name_charge || '--'}}</el-descriptions-item>
+          <el-descriptions-item :label="$t(`责任部门`)">{{item.depname_charge || '--'}}</el-descriptions-item>
+          <el-descriptions-item :label="$t(`方案发布人`)">{{item.sendby || '--'}}</el-descriptions-item>
+          <el-descriptions-item :label="$t(`改善计划周期`)">{{item.planned_cycle || '--'}}</el-descriptions-item>
+          <el-descriptions-item :label="$t(`改善实际周期`)">{{item.actual_cycle || '--'}}</el-descriptions-item>
+          <el-descriptions-item :label="$t(`改善方案进度`)">{{Math.round((item.progress * 100)*100)/100 + '%'}}</el-descriptions-item>
+          <el-descriptions-item :label="$t(`真因分析时间`)">{{item.submitdate || '--'}}</el-descriptions-item>
+          <el-descriptions-item :label="$t(`方案发布时间`)">{{item.senddate || '--'}}</el-descriptions-item>
+          <el-descriptions-item :label="$t(`创建时间`)">{{item.createdate || '--'}}</el-descriptions-item>
+          <el-descriptions-item :label="$t(`完成时间`)">{{item.finishdate || '--'}}</el-descriptions-item>
+        </el-descriptions>
+      </div>
+    </el-card>
+    <div  class="container normal-panel" style="text-align:right">
+      <el-pagination
+          background
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+          :current-page="currentPage"
+          :page-sizes="[20, 50, 100, 200]"
+          :page-size="20"
+          layout="total,sizes, prev, pager, next, jumper"
+          :total="total">
+      </el-pagination>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "index",
+  data(){
+    return {
+      param:{
+        "content": {
+          "sa_serviceorderid": this.$route.query.id,
+          "pageNumber": 1,
+          "pageSize": 20,
+          "where": {
+            "condition": ""
+          }
+        },
+        "id": "2026022709165502",
+      },
+      list:[],
+      total:0,
+      currentPage:0,
+    }
+  },
+  methods:{
+    async listData(){
+      const res = await this.$api.requested(this.param)
+      if (res.code == 0){
+        this.tool.showMessage(res,()=>{})
+      }else {
+        this.list = res.data
+        this.total = res.total
+        this.currentPage = res.pageNumber
+        console.log(this.list,'list222')
+      }
+    },
+    goDetail(val) {
+      this.$store.dispatch("changeDetailDrawer", false);
+      this.$nextTick(() => {
+        let route = this.$route;
+        if (route.path !== "serviceImprovementDetail") {
+          this.oldRoute = { path: route.path, query: route.query };
+          this.$store.dispatch("setHistoryRouter", this.oldRoute);
+        }
+
+        this.$router.push({
+          path: "/serviceImprovementDetail",
+          query: {
+            id: val.sa_service_improvementid,
+          },
+        });
+        this.$store.dispatch("changeDetailDrawer", true);
+      });
+    },
+    handleSizeChange(val) {
+      // console.log(`每页 ${val} 条`);
+      this.param.content.pageSize = val
+      this.listData()
+    },
+    handleCurrentChange(val) {
+      // console.log(`当前页: ${val}`);
+      this.param.content.pageNumber = val
+      this.listData()
+    },
+  },
+  mounted() {
+    this.param.content.pageNumber = 1
+    this.listData()
+  }
+}
+</script>
+
+<style scoped>
+/deep/ .el-card__body {
+  padding: 0;
+}
+/deep/ .el-card:hover{
+  border: 1px solid #3874F6;
+}
+/deep/ .el-divider--horizontal {
+  display: block;
+  height: 1px;
+  width: 100%;
+  margin:0 0 10px 0 ;
+}
+*{
+  box-sizing: border-box;
+}
+/deep/ .el-card__header {
+  padding: 10px 10px;
+  border-bottom: 1px solid #ebeef5;
+  box-sizing: border-box;
+}
+</style>

+ 5 - 3
src/HDrpManagement/serveWorkBill/modules/detail.vue

@@ -142,7 +142,7 @@
       </div>
       <div slot="slot1">
         <div v-if="tool.checkAuth($route.name,'associatedImprovementOrder') && !tool.checkAuth($route.name,'linkedApplication')">
-          服务改善
+          <serviceImprovement></serviceImprovement>
         </div>
         <div v-else>
           <serviceWorkOrder ref="serviceWorkOrderRef" v-if="mainData" :mainData="mainData" :nodes="nodes"
@@ -150,7 +150,7 @@
         </div>
       </div>
       <div slot="slot2">
-        服务改善
+        <serviceImprovement></serviceImprovement>
       </div>
     </basicDetails>
   </div>
@@ -170,6 +170,7 @@ import checkInfo from '../components/checkInfo'
 import transferWorkOrder from '@/components/dialogTemplate/index2'
 import acceptingOrders from '../components/acceptingOrders'
 import serviceApplication from "@/HDrpManagement/serveBillMag/components/serviceApplication";
+import serviceImprovement from '@/HDrpManagement/serveWorkBill/modules/serviceImprovement/index'
 import { log } from "@antv/g2plot/lib/utils";
 export default {
   name: "detail",
@@ -204,7 +205,8 @@ export default {
     checkInfo,
     transferWorkOrder,
     acceptingOrders,
-    serviceApplication
+    serviceApplication,
+    serviceImprovement
   },
   methods: {
     async queryMainData(id) {

+ 144 - 0
src/HDrpManagement/serveWorkBill/modules/serviceImprovement/index.vue

@@ -0,0 +1,144 @@
+<template>
+  <div>
+    <el-input  style="width:200px;" :placeholder="$t('搜索')" :suffix-icon="param.content.where.condition?param.content.where.condition.length > 0?'':'':'el-icon-search'" v-model="param.content.where.condition"
+               @keyup.native.enter="listData(param.content.pageNumber = 1)" @clear="listData(param.content.pageNumber = 1)" size="small" class="input-with-select inline-16 layout_search__panel" clearable>
+    </el-input>
+    <el-card v-for="item in list" :key="item.index" style="margin-top: 20px" shadow="hover" class="box-card">
+      <div slot="header" class="clearfix" style="display: flex;justify-content: space-between">
+        <div style="margin-left: 10px;display: flex;justify-content: left">
+          <div style="color: #3874F6" @click="goDetail(item)">{{item.billno}}</div>
+          <el-tag size="mini" style="margin-left: 20px" v-if="item.type" type="warning">{{item.type}}</el-tag>
+          <div v-if="item.result">
+            <el-tag size="mini" style="margin-left: 10px" v-if="item.result == '有效'" >{{item.result}}</el-tag>
+            <el-tag size="mini" style="margin-left: 10px" v-else type="info">{{item.result}}</el-tag>
+          </div>
+        </div>
+        <div :style="tool.getStatusColor(item.status)">
+          {{item.status}}
+        </div>
+      </div>
+      <div style="padding: 20px;">
+        <el-descriptions class="margin-top"  :column="5" >
+          <el-descriptions-item :label="$t(`工单号`)">{{item.billno_workorder}}</el-descriptions-item>
+          <el-descriptions-item :label="$t(`申请单号`)">{{item.billno_serviceorder}}</el-descriptions-item>
+          <el-descriptions-item :label="$t(`客诉大类`)">{{item.class2}}</el-descriptions-item>
+          <el-descriptions-item :label="$t(`分析负责人`)">{{item.name_analysis}}</el-descriptions-item>
+          <el-descriptions-item :label="$t(`方案编辑人`)">{{item.name_charge}}</el-descriptions-item>
+          <el-descriptions-item :label="$t(`责任部门`)">{{item.depname_charge}}</el-descriptions-item>
+          <el-descriptions-item :label="$t(`方案发布人`)">{{item.sendby}}</el-descriptions-item>
+          <el-descriptions-item :label="$t(`改善计划周期`)">{{item.planned_cycle}}</el-descriptions-item>
+          <el-descriptions-item :label="$t(`改善实际周期`)">{{item.actual_cycle}}</el-descriptions-item>
+          <el-descriptions-item :label="$t(`改善方案进度`)">{{Math.round((item.progress * 100)*100)/100 + '%'}}</el-descriptions-item>
+          <el-descriptions-item :label="$t(`真因分析时间`)">{{item.submitdate}}</el-descriptions-item>
+          <el-descriptions-item :label="$t(`方案发布时间`)">{{item.senddate}}</el-descriptions-item>
+          <el-descriptions-item :label="$t(`创建时间`)">{{item.createdate}}</el-descriptions-item>
+          <el-descriptions-item :label="$t(`完成时间`)">{{item.finishdate}}</el-descriptions-item>
+        </el-descriptions>
+      </div>
+    </el-card>
+    <div  class="container normal-panel" style="text-align:right">
+      <el-pagination
+          background
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+          :current-page="currentPage"
+          :page-sizes="[20, 50, 100, 200]"
+          :page-size="20"
+          layout="total,sizes, prev, pager, next, jumper"
+          :total="total">
+      </el-pagination>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "index",
+  data(){
+    return {
+      param:{
+        "content": {
+          "sa_workorderid": this.$route.query.id,
+          "pageNumber": 1,
+          "pageSize": 20,
+          "where": {
+            "condition": ""
+          }
+        },
+        "id": "2026022709163402",
+      },
+      list:[],
+      total:0,
+      currentPage:0,
+    }
+  },
+  methods:{
+    async listData(){
+      const res = await this.$api.requested(this.param)
+      if (res.code == 0){
+        this.tool.showMessage(res,()=>{})
+      }else {
+        this.list = res.data
+        this.total = res.total
+        this.currentPage = res.pageNumber
+        console.log(this.list,'list222')
+      }
+    },
+    goDetail(val) {
+      this.$store.dispatch("changeDetailDrawer", false);
+      this.$nextTick(() => {
+        let route = this.$route;
+        if (route.path !== "serviceImprovementDetail") {
+          this.oldRoute = { path: route.path, query: route.query };
+          this.$store.dispatch("setHistoryRouter", this.oldRoute);
+        }
+
+        this.$router.push({
+          path: "/serviceImprovementDetail",
+          query: {
+            id: val.sa_service_improvementid,
+          },
+        });
+        this.$store.dispatch("changeDetailDrawer", true);
+      });
+    },
+    handleSizeChange(val) {
+      // console.log(`每页 ${val} 条`);
+      this.param.content.pageSize = val
+      this.listData()
+    },
+    handleCurrentChange(val) {
+      // console.log(`当前页: ${val}`);
+      this.param.content.pageNumber = val
+      this.listData()
+    },
+  },
+  mounted() {
+    this.param.content.pageNumber = 1
+    this.listData()
+  }
+}
+</script>
+
+<style scoped>
+/deep/ .el-card__body {
+  padding: 0;
+}
+/deep/ .el-card:hover{
+  border: 1px solid #3874F6;
+}
+/deep/ .el-divider--horizontal {
+  display: block;
+  height: 1px;
+  width: 100%;
+  margin:0 0 10px 0 ;
+}
+*{
+  box-sizing: border-box;
+}
+/deep/ .el-card__header {
+  padding: 10px 10px;
+  border-bottom: 1px solid #ebeef5;
+  box-sizing: border-box;
+}
+</style>

+ 219 - 0
src/HDrpManagement/serviceImprovement/components/actionImplementation/FileItem.vue

@@ -0,0 +1,219 @@
+<template>
+  <div class="file-box">
+    <div
+        class="item-file"
+        v-for="(item,index) in fileData"
+        :key="index"
+        :style="[
+        {'width': auto ? '100%' : '300px'},
+        {'margin-right':marginRight + 'px'},
+        {'margin-bottom':marginBottom + 'px'},
+         {'margin-top':marginTop + 'px'},
+        {'border':'1px solid #CCCCCC'}
+      ]"
+    >
+      <div class="left">
+        <div class="image">
+          <previewImage
+              v-if="item.fileType == 'image'"
+              style="width:38px;height:38px;margin:0px"
+              :image="item"
+              :deletebtn="false"
+          ></previewImage>
+          <el-image v-else :src="item.cover" fit="fit" alt  />
+        </div>
+        <div class="text">
+          <!-- <el-tooltip v-if="item.document" class="item" effect="dark" :content="item.document" placement="top-start"> -->
+          <p @click="downLoad(item)" style="font-size:14px" class="file-title">{{item.document}}</p>
+          <!-- </el-tooltip> -->
+          <p class="create-date" style="font-size:12px" v-if="item.createdate">{{item.createdate}}</p>
+        </div>
+      </div>
+      <div class="right">
+        <i class="el-icon-zoom-in" v-if="item.fileType != 'image'" @click="seeClick(item)"></i>
+        <i class="el-icon-delete" style="font-size:16px" @click="deleteFile(item,index)" v-if="isDelete"></i>
+      </div>
+    </div>
+    <SeeFile ref="seeFile" :fileData="seeFile"></SeeFile>
+  </div>
+</template>
+
+<script>
+import SeeFile from '@/components/file-block/components/SeeFile'
+import previewImage from '@/components/previewImage/index'
+
+import removeFile from '@/utils/removeFile'
+export default {
+  name: "FileItem",
+  data () {
+    return {
+      seeFile: '',
+      isSeeFileShow:false,
+      fileBoxEl: '',
+      itemWidth:0
+    };
+  },
+  props: {
+    auto: Boolean,
+    isDownLoad: Boolean,
+    isDelete:Boolean,
+    fileData: {
+      default() {
+        return []
+      }
+    },
+    /* 一行展示几个 */
+    rowCount: {
+      type: Number,
+      default () {
+        return 1
+      }
+    },
+    /* 块margin-right */
+    marginRight: {
+      type:Number,
+      default () {
+        return 0
+      }
+    },
+    /* 块margin-top */
+    marginTop: {
+      type:Number,
+      default () {
+        return 0
+      }
+    },
+    /* 块margin-bottom */
+    marginBottom: {
+      type:Number,
+      default () {
+        return 0
+      }
+    },
+  },
+  components: {
+    SeeFile,
+    previewImage
+  },
+  computed: {
+  },
+  watch: {
+  },
+  created() {
+
+  },
+  mounted () {
+    let el = document.querySelector('.file-box')
+    this.itemWidth = el.clientWidth / this.rowCount - this.marginRight > 200 ? el.clientWidth / this.rowCount - this.marginRight : 200
+  },
+  methods: {
+    debouned () {
+
+    },
+    deleteFile(item,index) {
+      let temp = item
+      removeFile.removeFileList([item]).then(res => {
+        this.tool.showMessage(res,() => {
+          this.$emit('deleteSuccess',temp)
+        })
+      })
+      this.$emit('deleteFile',index)
+    },
+    //预览
+    seeClick(item) {
+      if(item.fileType == 'image' || item.fileType == 'video') {
+        this.seeFile = item
+        this.$refs.seeFile.dialogVisible = true
+      } else {
+        this.$notify({
+          title:this.$t('提示'),
+          message:this.$t('该文件暂不支持'),
+          type:'warning'
+        })
+      }
+    },
+    downLoad(item) {
+      this.$emit('updateDownLoadRecord',item)
+      window.open(item.url,'_self')
+    }
+  },
+};
+</script>
+
+<style scoped>
+*{
+  box-sizing: border-box;
+}
+.file-box {
+  width: 100%;
+  display: flex;
+  flex-wrap: wrap;
+}
+.item-file {
+  display: flex;
+  padding: 10px;
+  display: flex;
+  align-items: center;
+  cursor: pointer;
+  transition: .2s linear;
+  cursor: pointer;
+  border-radius: 5px;
+  background: #ffffff;
+  height: 80px;
+}
+.item-file:hover {
+  box-shadow: 0 5px 10px rgb(0 0 0 / 10%);
+}
+.file-box .left {
+  width: 90%;
+  height: 100%;
+  display: flex;
+  align-items: center;
+}
+.file-box .left .image {
+  margin-right: 10px;
+}
+.file-box .left .image .el-image{
+  width: 50px;
+}
+.file-box .left .text {
+  width: calc(100% - 50px);
+  font-size: 14px;
+  display: flex;
+  flex-direction: column;
+  justify-content: space-evenly;
+  height: 100%;
+  padding-right: 10px;
+}
+.file-box .left .text .file-title {
+  color: #3874f6;
+  font-size: 16px;
+  text-decoration: underline;
+
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+}
+.file-box .left .text .create-date {
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+}
+
+.file-box .right {
+  width: 10%;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: space-evenly;
+  height: 100%;
+}
+.file-box .right .see{}
+.el-empty {
+  height: 150px;
+  transform: scale(70%);
+}
+/deep/.el-dialog__wrapper {
+  z-index: 9999;
+}
+</style>

+ 190 - 0
src/HDrpManagement/serviceImprovement/components/actionImplementation/actionDetail.vue

@@ -0,0 +1,190 @@
+<template>
+  <div>
+    <div style="display:flex;justify-content: left">
+      <div style="width: 5px;height: 20px;background: #3874F6"></div>
+      <div style="margin-left: 10px">{{$t(data.title)}}</div>
+      <addRecord style="margin-left: 20px;" v-if="userid == data.userid_charge && mainData.status == '方案已发布' && data.status != '已完成'"
+                 :data="data" @addSuccess="addSuccess" btn-title="新增改善记录"></addRecord>
+      <confirmBtn style="margin-left: 10px;" btn_title="确认完成任务" :id="data.sa_service_improvement_planid" param-id="2026020210240002"
+                  itemid="sa_service_improvement_planid" :message="'是否确认完成' + data.title"
+                  v-if="userid == data.userid_charge && mainData.status == '方案已发布' && data.status != '已完成'" color="green"></confirmBtn>
+    </div>
+    <div style="margin-top: 10px">
+      <el-card shadow="never" v-for="item in list" :key="item.index" class="card-style">
+        <div style="display: flex;justify-content: space-between;align-items: center;margin-top: -5px">
+          <div class="dateLine">
+            <div class="div"></div>
+            <span class="span margin-5">{{item.createdate}}</span>
+          </div>
+          <div style="display: flex;align-items: center">
+            <addRecord style="margin-left: 20px;" v-if="userid == data.userid_charge && mainData.status == '方案已发布' && data.status != '已完成'"
+                       :data="data" @addSuccess="addSuccess" btn-type="text" btn-title="编辑" :content="item.record" :itemData="item"></addRecord>
+            <upload
+                class="inline-16"
+                ref="upload"
+                :folderid="folderid"
+                @onSuccess="onSuccess"
+                :id="item.sa_service_improvement_planid"
+                type="button">
+            </upload>
+<!--            <editFollow :data="item" @onSuccess="onSuccess" :disabled="disabled" v-if="!disabled && item.createuserid == userid"></editFollow>-->
+            <el-button size="small" type="text" @click="onDel()">
+              {{$t(`删除`)}}</el-button>
+          </div>
+        </div>
+        <el-divider></el-divider>
+        <div>{{$t(`执行记录`)}}:</div>
+        <div>{{item.record}}</div>
+        <div v-if="item.attinfos" style="margin-bottom: 10px">
+          <FileItem
+              :marginRight="21"
+              :margin-top="10"
+              :rowCount="5"
+              :isDownLoad="true"
+              :fileData="item.attinfos"
+              @deleteSuccess="deleteFile">
+          </FileItem>
+        </div>
+      </el-card>
+    </div>
+  </div>
+</template>
+
+<script>
+import addRecord from './addRecord'
+import confirmBtn from '@/components/confirmBtn/index'
+import upload from './uploadNew.vue'
+import FileItem from './FileItem'
+export default {
+  name: "actionDetail",
+  props:['data','mainData'],
+  components:{addRecord,confirmBtn,FileItem},
+  data(){
+    return {
+      param:{
+        "id": 2026020210272402,
+        "content": {
+          "sa_service_improvement_planid":''
+        },
+      },
+      userid:JSON.parse(sessionStorage.getItem('active_account')).userid,
+      list:[],
+      folderid:JSON.parse(sessionStorage.getItem('folderid')).appfolderid,
+    }
+  },
+  methods:{
+    async listData(){
+      this.param.content.sa_service_improvement_planid = this.data.sa_service_improvement_planid
+      const res = await this.$api.requested(this.param)
+      this.list = res.data
+      console.log(res.data,'输出记录')
+    },
+    onDel(){},
+    addSuccess(){
+      this.listData()
+    },
+    deleteFile(){},
+    onSuccess () {
+      this.getFollowDetail()
+      this.$emit('onSuccess')
+    },
+  }
+}
+</script>
+
+<style scoped>
+/deep/ .el-card__body {
+  padding: 0;
+}
+/deep/ .el-card:hover{
+  border: 1px solid #3874F6;
+}
+/deep/ .el-divider--horizontal {
+  display: block;
+  height: 1px;
+  width: 100%;
+  margin:0 0 10px 0 ;
+}
+*{
+  box-sizing: border-box;
+}
+.select{
+  display: flex;
+  align-items: center;
+}
+.demonstration {
+  font-size: 14px;
+  margin-right: 10px;
+}
+.avatar__image{
+  height: 100%;
+  width: 100%;
+}
+.avatar:hover .avatar__model{
+  display: block;
+}
+.avatar{
+  position: relative;
+  float: left;
+  margin-left: 0px;
+  height:40px;
+  width: 40px;
+  margin-bottom: 5px;
+  border-radius: 100%;
+  text-align: center;
+  line-height: 40px;
+  color:#fff;
+  font-weight: 500;
+  background: #3874F6;
+  cursor: pointer;
+  overflow: hidden;
+}
+.card-border{
+  background: #F2F2F2;
+}
+.card-border .div-border{
+  background: #FFFFFF;
+  margin-top: 20px;
+  padding: 10px;
+  width: 100%;
+  height: 90px;
+  border-radius: 5px;
+}
+/deep/.el-descriptions__header {
+  margin-bottom: 0 !important;
+}
+/deep/.el-card__body {
+  padding: 10px;
+}
+.margin-5{
+  margin-left: 5px;
+}
+.padding-style{
+  padding: 0 10px 10px 10px;
+.span-style{
+  color: #999999;
+  font-size: 14px
+};
+}
+.card-style{
+  margin-bottom: 10px;
+.dateLine{
+  margin-bottom: 10px;
+  padding: 10px 10px 0 10px;
+  display: flex;
+  justify-content: left;
+  align-items: center;
+.div{
+  width: 8px;
+  height:8px;
+  border: 2px solid #3874F6;
+  background: #FFFFFF;
+  border-radius: 40px;
+}
+.span{
+  color: #3874F6;
+}
+}
+
+}
+</style>

+ 157 - 0
src/HDrpManagement/serviceImprovement/components/actionImplementation/addRecord.vue

@@ -0,0 +1,157 @@
+<template>
+  <div>
+    <el-button :type="btnType?btnType:'primary'" size="mini" @click="onShow">{{$t(btnTitle)}}</el-button>
+    <el-drawer
+        :title="$t(`方案信息`)"
+        :visible.sync="drawerShow"
+        size="70%"
+        direction="rtl"
+        append-to-body
+        @close="onClose"
+    >
+      <div class="drawer__panel" style="margin-bottom: 0 !important;">
+        <table-detail :layout="tablecols" :data="list" :opwidth="200" :custom="true" style="margin-top: 10px">
+          <template v-slot:customcol="scope">
+            <div>{{scope.column.data[scope.column.columnname]}}</div>
+          </template>
+        </table-detail>
+      </div>
+      <div style="height: 10px;background: #f1f2f3"></div>
+      <div style="margin: 10px;font-weight: bold">{{$t(`执行记录`)}}</div>
+      <div class="drawer__panel" style="margin-bottom: 0 !important;">
+        <el-input
+            type="textarea"
+            :rows="15"
+            placeholder="请输入内容"
+            v-model="record">
+        </el-input>
+      </div>
+      <div style="height: 10px;background: #f1f2f3"></div>
+      <div style="margin: 10px;font-weight: bold;">{{$t(`上传附件`)}}</div>
+      <div class="drawer__panel">
+        <uploadFile ref="upload"  :folderid="folderid" accept=".text,.doc,.xls"
+                    :bindData="{ownertable:'sa_service_improvement_record',ownerid:sa_service_improvement_recordid,usetype:'default'}"
+                    @onSuccess="uploadSuccess" :id="data.sa_service_improvement_recordid"></uploadFile>
+        <fileTable ref="list" style="margin-top: 20px;" :id="sa_service_improvement_recordid"></fileTable>
+      </div>
+      <div class="fixed__btn__panel">
+        <el-button size="small" @click="drawerShow = false" class="normal-btn-width">{{$t('取 消')}}</el-button>
+        <el-button size="small" type="primary" @click="onSubmit"   class="normal-btn-width btn-primary">{{$t('确 定')}}</el-button>
+      </div>
+    </el-drawer>
+  </div>
+</template>
+
+<script>
+import fileTable from './fileTable'
+import uploadFile from '@/components/upload/hw_obs_upload_new'
+export default {
+  name: "addRecord",
+  props:['data','btnType','btnTitle','content','itemData'],
+  components:{fileTable,uploadFile},
+  data(){
+    return {
+      drawerShow:false,
+      tablecols:[],
+      list:[],
+      record:'',
+      folderid:JSON.parse(sessionStorage.getItem('folderid')).appfolderid,
+      sa_service_improvement_recordid:'',
+      attachmentids:[],
+      linksids:[],
+      listFiles:[]
+    }
+  },
+  methods:{
+    onShow(){
+      this.drawerShow = true
+      this.list[0] = this.data
+      if (this.btnTitle == '编辑'){
+        this.sa_service_improvement_recordid = this.itemData.sa_service_improvement_recordid
+      }else {
+        this.sa_service_improvement_recordid = 9999999999
+      }
+      this.record = this.content
+    },
+    uploadSuccess(res){
+      console.log(res.data,'附件列表')
+      this.$refs['upload'].dialogUploadVisible = false
+      this.$refs.list.listData()
+      let listFiles = this.$refs.list.list
+      console.log(listFiles,4444)
+      /*if(typeof res.attinfos == 'string') {
+         this.$refs.list.listData()
+      } else {
+        console.log(res)
+        this.bindEnclosure(res.data.attachmentids)
+        this.form.attinfos = this.form.attinfos.push(res.data.attachmentids)
+        this.$refs['upload'].dialogUploadVisible = false
+      }*/
+
+
+    },
+    async onSubmit(){
+      const res = await this.$api.requested({
+        "id": 2026020210270102,
+        "content": {
+          "sa_service_improvementid":this.$route.query.id,
+          "sa_service_improvement_planid":this.data.sa_service_improvement_planid,
+          "sa_service_improvement_recordid":this.btnTitle == '编辑'?this.itemData.sa_service_improvement_recordid:0,
+          "record":this.record
+        },
+      })
+      this.tool.showMessage(res,()=>{
+        if (this.btnTitle != '编辑'){
+          this.listFiles = this.$refs.list.list
+          this.batchBinding(res.data)
+        }
+        this.drawerShow = false
+        this.$emit('addSuccess',this.data.sa_service_improvement_planid)
+      })
+    },
+    /*批量绑定*/
+    async batchBinding(id){
+      this.attachmentids = []
+      this.listFiles.forEach((item,index)=>{
+        this.attachmentids[index] = item.attachmentid
+      })
+      const res = await this.$api.requested({
+        "classname": "system.attachment.Attachment",
+        "method": "createFileLink",
+        "content": {
+          "ownertable": "sa_service_improvement_record",
+          "ownerid": id,
+          "usetype": "default",
+          "attachmentids": this.attachmentids
+        }
+      })
+      this.batchDeletion()
+    },
+    onClose(){
+      if (this.btnTitle != '编辑'){
+        this.batchDeletion()
+      }
+    },
+    async batchDeletion(){
+      this.linksids = []
+      this.listFiles.forEach((item,index)=>{
+        this.linksids[index] = item.linksid
+      })
+      const res = await this.$api.requested({
+        "classname": "system.attachment.Attachment",
+        "method": "deleteFileLink",
+        "content": {
+          "linksids": this.linksids
+        }
+      })
+    }
+  },
+  created() {
+    this.tablecols = this.tool.tabelCol(this.$route.name).improvementPlanTable.tablecols
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 70 - 0
src/HDrpManagement/serviceImprovement/components/actionImplementation/fileTable.vue

@@ -0,0 +1,70 @@
+<template>
+  <div>
+    <table-new-layout :layout="tablecols" :data="list" :opwidth="200" :custom="true" :width="true" :height="tableHieght">
+      <template v-slot:customcol="scope">
+        <p v-if="scope.column.columnname == 'contentlength'">
+          {{scope.column.data.contentlength > 1073741824?(scope.column.data.contentlength / Math.pow(1024,3)).toFixed(2)+'GB':scope.column.data.contentlength > 1048576?(scope.column.data.contentlength / Math.pow(1024,2)).toFixed(2)+'MB':scope.column.data.contentlength > 1024?(scope.column.data.contentlength / Math.pow(1024,1)).toFixed(2)+'KB':scope.column.data.contentlength+'B'}}
+      </p>
+        <p v-else>{{$t(scope.column.data[scope.column.columnname])}}</p>
+      </template>
+      <template v-slot:opreation="scope">
+        <el-button size="mini" type="text" @click="delFile(scope.data)">{{$t(`删除`)}}</el-button>
+      </template>
+    </table-new-layout>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "fileTable",
+  props:["id"],
+  data(){
+    return {
+      tableHieght:'calc(100vh - 375px)',
+      tablecols:[],
+      list:[],
+      param:{
+        "id": 20241031151204,
+        "content": {
+          "ownerid": 773,
+          "ownertable": "sa_service_improvement_record",
+          "usetype": "default"
+        }
+      },
+      actid: null,
+    }
+  },
+  mounted() {
+    this.listData()
+  },
+  methods:{
+    async listData(){
+      this.param.content.ownerid = this.id
+      const res = await this.$api.requested(this.param)
+      this.list = res.data
+    },
+    async delFile(row){
+      console.log(row,'输出2222')
+      const res = await this.$api.requested({
+        classname: "system.attachment.Attachment",
+        method: "deleteFileLink",
+        content: {
+          linksids: [row.linksid],
+        },
+      })
+      if (res.code == 0){
+        this.tool.showMessage(res,()=>{})
+      }else {
+        this.listData()
+      }
+    }
+  },
+  created() {
+    this.tablecols = this.tool.tabelCol(this.$route.name).fileTable.tablecols
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 19 - 2
src/HDrpManagement/serviceImprovement/components/actionImplementation/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div>
     <div style="display:flex;justify-content: space-between">
-      <table-detail :layout="tablecols" :data="list" :opwidth="200" :custom="true" style="margin-top: 10px">
+      <table-detail :layout="tablecols" :data="list" :opwidth="200" :custom="true" style="margin-top: 10px" @rowClick="rowClick">
         <template v-slot:customcol="scope">
           <div v-if="scope.column.columnname == 'status'">
             <div :style="tool.getStatusColor(scope.column.data[scope.column.columnname])">{{scope.column.data[scope.column.columnname]}}</div>
@@ -10,12 +10,18 @@
         </template>
       </table-detail>
     </div>
+    <div style="margin-top: 20px">
+      <actionDetail v-if="detailShow" ref="actionRef" :data="selectData" :mainData="mainData"></actionDetail>
+    </div>
   </div>
 </template>
 
 <script>
+import actionDetail from './actionDetail'
 export default {
   name: "index",
+  components:{actionDetail},
+  props:['mainData'],
   data(){
     return {
       param:{
@@ -30,7 +36,9 @@ export default {
       list:[],
       total:0,
       currentPage:0,
-      userid:JSON.parse(sessionStorage.getItem('active_account')).userid
+      userid:JSON.parse(sessionStorage.getItem('active_account')).userid,
+      detailShow:false,
+      selectData:''
     }
   },
   methods:{
@@ -38,6 +46,15 @@ export default {
       const res = await this.$api.requested(this.param)
       this.list = res.data
       console.log(res.data,'方案列表')
+    },
+    rowClick(data){
+      console.log(data)
+      this.selectData = data
+      this.detailShow = true
+      this.$nextTick(()=>{
+        this.$refs.actionRef.listData()
+      })
+
     }
   },
   created() {

+ 205 - 0
src/HDrpManagement/serviceImprovement/components/actionImplementation/uploadNew.vue

@@ -0,0 +1,205 @@
+<template>
+  <div class="file">
+    <!-- <div class="flex-align-center flex-between pionter" v-for="(img,index) in fileLinkList" :key="img.index">
+      <div class="flex-align-center">
+        <img width="30" :src="img.type.split('/')[0] === 'image'?img.url:require('@/assets/file_icons/file.svg')" class="inline-16" alt="">
+        <div class="file__link inline-16">
+          <p>{{img.name}}</p>
+        </div>
+      </div>
+      <i style="color:red;" class="el-icon-delete" @click="handleRemove(index)"></i>
+    </div> -->
+    <!--    <file-item
+            :auto="true"
+            :isDownLoad="true"
+            :isDelete='true'
+            :fileData="fileLinkList"
+            @deleteFile="handleRemove">
+        </file-item>-->
+    <el-upload
+        action="#"
+        :on-change="onChange"
+        :show-file-list="false"
+        :auto-upload="false"
+        multiple>
+      <el-button size="small" type="text" v-loading.fullscreen.lock="fullscreenLoading" :disabled="disabled">
+        <svg t="1727070968047" class="icon" viewBox="0 0 1055 1024" style="vertical-align: middle" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="13346" width="14" height="14"><path d="M1012.809143 684.982857a42.861714 42.861714 0 0 0-41.837714 41.837714 154.916571 154.916571 0 0 1-139.629715 167.424h-577.828571a154.331429 154.331429 0 0 1-139.264-167.424 42.861714 42.861714 0 0 0-41.837714-41.837714 42.861714 42.861714 0 0 0-41.837715 41.837714 238.299429 238.299429 0 0 0 223.305143 251.245715h577.828572a238.299429 238.299429 0 0 0 223.232-251.245715 42.861714 42.861714 0 0 0-42.130286-41.837714z" fill="#999999" p-id="13347"></path><path d="M569.051429 57.270857a47.250286 47.250286 0 0 0-61.293715 0L348.745143 216.356571a41.472 41.472 0 0 0 58.514286 58.514286l86.601142-86.528V662.674286a41.837714 41.837714 0 1 0 83.602286 0V188.342857l86.528 86.528a41.472 41.472 0 1 0 58.514286-58.514286z" fill="#999999" p-id="13348"></path></svg>
+        <span style="font-size: 14px;color: #333;margin-left: 5px;vertical-align: middle">上传附件</span></el-button>
+    </el-upload>
+  </div>
+</template>
+
+<script>
+import FileItem from '@/SManagement/orderclue/components/file/index3'
+export default {
+  components: {FileItem},
+  props:['folderid','type','accept','id','disabled'],
+  name: 'uploadNew',
+  data() {
+    return {
+      imageUrl:'',
+      fullscreenLoading:false,
+      fileList:[],
+      fileLinkList:[],
+      bindData:{},
+      params: {
+        "classname": "system.attachment.huawei.OBS",
+        "method": "getFileName",
+        "content": {
+          "filename": '',
+          "filetype": '',
+          "parentid": ""//归属文件夹ID
+        }
+      },
+      fileLength:0
+    };
+  },
+  computed:{
+  },
+  watch:{
+  },
+  methods: {
+    onChange (file,filelist) {
+
+      this.fileList.push(file)
+      console.log(this.fileList);
+
+      this.beforeUpload(file.raw)
+    },
+    beforeUpload (file) {
+      var that = this
+
+      var fileReader = new FileReader();
+
+      fileReader.readAsDataURL(file);
+
+      fileReader.onload = function(e) {
+
+        var result = e.target.result;
+
+        let postfix = file.name.substr(file.name.lastIndexOf('.') + 1)
+
+        that.fileLinkList.push(that.fileType.fileList([{document:file.name,url:result,type:file.type,name:file.name,postfix:postfix}])[0])
+        console.log(that.fileLinkList);
+        that.toUpload()
+
+      }
+    },
+    handleRemove (index) {
+      this.fileList = this.fileList.filter((e,idx)=>{
+        if (idx !== index) {
+          return e
+        }
+      })
+      console.log(this.fileList);
+
+      this.fileLinkList = this.fileLinkList.filter((e,idx)=>{
+        if (idx !== index) {
+          return e
+        }
+      })
+    },
+    toUpload (callback) {
+      this.fullscreenLoading = true
+      if (this.fileList.length == 0) callback()
+      this.fileList.forEach(file=>{
+        let index = file.name.lastIndexOf(".");
+        let ext = file.name.substr(index + 1);
+        this.params.content.filename = file.name
+        this.params.content.filetype = ext
+        this.getUploadUrl(file, ext,callback)
+      })
+
+    },
+
+    // 获取华为云上传地址
+    async getUploadUrl (file, ext,callback) {
+      this.params.content.parentid = this.folderid
+      const res = await this.$api.requested(this.params)
+      let url = res.data.uploadurl
+      let obsfilename = res.data.serialfilename
+
+      this.upoladFileToServer(url, file, ext, obsfilename,callback)
+    },
+
+    // 上传到华为云
+    async upoladFileToServer (url, file, ext, obsfilename,callback) {
+      let THIS = this
+      let config = {
+        headers: ext === 'pdf' ? { 'Content-Type': 'application/pdf' } : ext === 'svg'?{ 'Content-Type': 'image/svg+xml' } : { 'Content-Type': 'application/octet-stream' },
+      }
+      let res = await this.$upload.hw_upload(url, file.raw, config)
+      this.createFileRecord(obsfilename,callback)
+
+    },
+
+    // 上传成功以后生成附件记录
+    async createFileRecord (obsfilename,callback) {
+      let obj = {
+        "serialfilename": obsfilename
+      }
+      this.bindData = {
+        "ownertable": 'sat_ordercluefollowuplog',
+        "ownerid": this.id,
+        "usetype": 'default',
+      }
+      obj = Object.assign({},obj,this.bindData)
+      let param = {
+        "classname": "system.attachment.huawei.OBS",
+        "method": "uploadSuccess",
+        "content":obj
+      }
+      const res = await this.$api.requested(param)
+      if (res.code ===  1) {
+        this.fullscreenLoading = false
+        this.$emit('onSuccess',res)
+
+        this.fileList = []
+        this.fileLinkList = []
+      }
+    },
+  },
+};
+</script>
+
+<style scoped>
+.upload_image__panel{
+  position: relative;
+  height:148px;
+  width: 148px;
+  border-radius: 6px;
+  margin-right: 10px;
+  margin-bottom:10px;
+  border: 1px solid #c0ccda;
+  overflow: hidden;
+}
+.upload_image__panel img{
+  width: 100%;
+  height: 100%;
+}
+.upload_image__panel_mod{
+  position: absolute;
+  top:0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  color:#fff;
+  background: rgba(0,0,0,.8);
+  opacity: 0;
+  transition: .3s linear;
+  cursor: pointer;
+}
+.upload_image__panel:hover .upload_image__panel_mod{
+  opacity: 1;
+}
+.pionter{
+  margin:6px 0;
+  padding: 20px 10px;
+  transition: .2s linear;
+  cursor: pointer;
+  border-radius: 5px;
+}
+.pionter:hover{
+  box-shadow: 0 5px 10px rgb(0 0 0 / 10%);
+}
+</style>

+ 2 - 2
src/HDrpManagement/serviceImprovement/components/causeAnalysis/edit.vue

@@ -25,13 +25,13 @@
             <el-col :span="24">
               <el-form-item :label="$t(`主要原因`)+':'" prop="main_reason">
                 <el-input v-model="form.main_reason"  type="textarea"
-                          :rows="5" :placeholder="$t(`主要原因`)"></el-input>
+                          :rows="10" :placeholder="$t(`主要原因`)"></el-input>
               </el-form-item>
             </el-col>
             <el-col :span="24">
               <el-form-item :label="$t(`改善建议`)+':'" prop="suggestion">
                 <el-input v-model="form.suggestion"  type="textarea"
-                          :rows="5" :placeholder="$t(`改善建议`)"></el-input>
+                          :rows="10" :placeholder="$t(`改善建议`)"></el-input>
               </el-form-item>
             </el-col>
           </el-form>

+ 9 - 9
src/HDrpManagement/serviceImprovement/components/improvementPlan/edit.vue

@@ -19,7 +19,7 @@
           <template v-slot:customcol="scope">
             <div v-if="scope.column.columnname == 'title'">
               <div v-if="nowRow == scope.column.data.rowindex">
-                <el-input size="small" v-model="scope.column.data[scope.column.columnname]" placeholder="请输入任务名称" @blur="setError(scope.column.data)"></el-input>
+                <el-input size="small" v-model="scope.column.data[scope.column.columnname]" placeholder="请输入任务名称" @blur="setError(scope.column.data,'任务名称')"></el-input>
                 <div style="color: #e13333;font-size: 12px" v-if="titleError">{{titleError}}</div>
               </div>
               <div v-else>{{scope.column.data[scope.column.columnname]}}</div>
@@ -28,7 +28,7 @@
               <div v-if="nowRow == scope.column.data.rowindex">
                 <el-date-picker
                     v-model="scope.column.data[scope.column.columnname]"
-                    @change="setError(scope.column.data)"
+                    @change="setError(scope.column.data,'开始日期')"
                     value-format="yyyy-MM-dd"
                     style="width: 100%"
                     size="small"
@@ -43,7 +43,7 @@
               <div v-if="nowRow == scope.column.data.rowindex">
                 <el-date-picker
                     v-model="scope.column.data[scope.column.columnname]"
-                    @change="setError(scope.column.data)"
+                    @change="setError(scope.column.data,'结束日期')"
                     value-format="yyyy-MM-dd"
                     style="width: 100%"
                     size="small"
@@ -56,7 +56,7 @@
             </div>
             <div v-else-if="scope.column.columnname == 'measure'">
               <div v-if="nowRow == scope.column.data.rowindex">
-                <el-input size="small" v-model="scope.column.data[scope.column.columnname]" placeholder="请输入措施" @blur="setError(scope.column.data)"></el-input>
+                <el-input size="small" v-model="scope.column.data[scope.column.columnname]" placeholder="请输入措施" @blur="setError(scope.column.data,'措施')"></el-input>
                 <div style="color: #e13333;font-size: 12px" v-if="measureError">{{measureError}}</div>
               </div>
               <div v-else>{{scope.column.data[scope.column.columnname]}}</div>
@@ -260,18 +260,18 @@ export default {
       this.isSave = true
       this.nowRow = data.rowindex
     },
-    setError(data){
-      if (data.title == ''){
+    setError(data,type){
+      if (data.title == '' && type == '任务名称'){
         this.titleError = '任务名称不可为空'
       }else {
         this.titleError = ''
       }
-      if (data.begdate == ''){
+      if (data.begdate == '' && type == '开始日期'){
         this.begdateError = '开始日期不能为空'
       }else {
         this.begdateError = ''
       }
-      if (data.enddate == ''){
+      if (data.enddate == '' && type == '结束日期'){
         this.enddateError = '结束日期不可为空'
       }else {
         this.enddateError = ''
@@ -281,7 +281,7 @@ export default {
       }else {
         this.useridError = ''
       }
-      if (data.measure == ''){
+      if (data.measure == '' && type == '措施'){
         this.measureError = '措施不能为空'
       }else {
         this.measureError = ''

+ 7 - 2
src/HDrpManagement/serviceImprovement/components/serviceImprovement/index.vue

@@ -8,7 +8,7 @@
         <improvementPlan ref="planRef" :data="mainData"></improvementPlan>
       </el-tab-pane>
       <el-tab-pane label="方案执行" name="方案执行">
-        <actionImplementation ref="planActionRef"></actionImplementation>
+        <actionImplementation ref="planActionRef" :mainData="mainData"></actionImplementation>
       </el-tab-pane>
       <el-tab-pane label="影响产品范围" name="影响产品范围">
         <affectedProductScope :data="mainData" :someUserid="someUserid"></affectedProductScope>
@@ -53,6 +53,7 @@ export default {
       }else if (this.activeName == '方案执行'){
         this.$refs.planActionRef.param.content.pageNumber = 1
         this.$refs.planActionRef.listData()
+        this.$refs.planActionRef.detailShow = false
       }
     },
     changeDataStructure(){
@@ -135,7 +136,11 @@ export default {
             {label:'改善计划周期',value:this.internalData.planned_cycle},
             {label:'改善实际周期',value:this.internalData.actual_cycle},
             {label:'改善方案进度',value:Math.round((this.internalData.progress * 100) * 100)/100 + '%'},
-            {label:'改善结果',value:this.internalData.result},
+            {label:'改善结果',value:this.internalData.result,
+              style:function () {
+                let style = that.tool.getStatusColor(that.internalData.result)
+                return style
+              }},
             {label:'备注',value:this.internalData.remarks},
           ]
         },

+ 91 - 3
src/HDrpManagement/serviceImprovement/modules/detail.vue

@@ -19,6 +19,38 @@
         @onEditSuccess="queryMainData($route.query.id)">
       <div slot="customOperation">
         <edit class="inline-16" v-if="(mainData.status != '已完成' && mainData.status != '已中止') && someUserid" @editSuccess="queryMainData($route.query.id)" :data="mainData"></edit>
+        <refundOrder class="inline-16" btnTitle="转单" btnType="primary" @dialogShow="dialogShow" @onSubmit="onSubmit" ref="refundOrderRef"
+                     v-if="mainData.status == '新建' && (userid == mainData.userid_analysis)" @onCancel="onCancel">
+          <template slot="formRule">
+            <el-form
+                :model="form"
+                :rules="rules"
+                ref="form"
+                :label-width="tool.onlyZh('125px')"
+                label-position="top"
+                size="mini"
+            >
+              <el-form-item :label="$t('请选择改善单真因分析人') + ':'" prop="userid_analysis">
+                <el-select
+                    v-model="form.userid_analysis"
+                    :placeholder="$t('请选择')"
+                    style="width: 100%"
+                    size="mini"
+                    filterable
+                >
+                  <el-option
+                      v-for="(item, index) in personList"
+                      :key="index"
+                      :label="$t(item.name)"
+                      :value="item.userid"
+                  >
+                    <span style="float: left">{{ $t(item.name) }}</span>
+                  </el-option>
+                </el-select>
+              </el-form-item>
+            </el-form>
+          </template>
+        </refundOrder>
         <customBtn
             btnName="提交分析"
             message="是否确定提交真因分析?"
@@ -109,13 +141,15 @@ import serviceApplication from "@/HDrpManagement/serveBillMag/components/service
 import serviceWorkOrder from '@/HDrpManagement/serveWorkBill/modules/serviceWorkOrder/index';
 import serviceImprovement from '@/HDrpManagement/serviceImprovement/components/serviceImprovement/index'
 import edit from './edit'
+import refundOrder from '@/components/dialogTemplate/index2'
 export default {
   name: "detail",
   components:{
     serviceApplication,
     serviceWorkOrder,
     edit,
-    serviceImprovement
+    serviceImprovement,
+    refundOrder
   },
   data(){
     return {
@@ -125,7 +159,20 @@ export default {
       team_name:'',
       team_phone_number:'',
       userid:JSON.parse(sessionStorage.getItem('active_account')).userid,
-      someUserid:false
+      someUserid:false,
+      form:{
+        userid_analysis:''
+      },
+      rules:{
+        userid_analysis: [
+          {
+            required: true,
+            message: this.$t("请选择改善单真因分析人"),
+            trigger: "change",
+          },
+        ],
+      },
+      personList:[]
     }
   },
   methods:{
@@ -220,7 +267,12 @@ export default {
         {label:'改善计划周期',value:this.mainData.planned_cycle},
         {label:'改善实际周期',value:this.mainData.actual_cycle},
         {label:'改善方案进度',value:Math.round((this.mainData.progress * 100) * 100)/100 + '%'},
-        {label:'改善结果',value:this.mainData.result},
+        {label:'改善结果',value:this.mainData.result,
+          style:function () {
+            let style = that.tool.getStatusColor(that.mainData.result)
+            return style
+          }
+        },
         {label:'创建时间',value:this.mainData.createdate},
         {label:'完成时间',value:this.mainData.finishdate},
         {label:'备注',value:this.mainData.remarks},
@@ -233,6 +285,42 @@ export default {
       this.$router.replace({path:'/serveBillDetail',query:{id:id,rowindex:rowindex,tabIndex:tabIndex}})
       this.queryMainData(id)
     },
+    async dialogShow(){
+      this.form.userid_analysis = ''
+      const res = await this.$api.requested({
+        id:20230213143003,
+        content:{
+          isExport:0,
+          pageNumber:1,
+          pageSize:9999999
+        }
+      })
+      if (res.code == 0){
+        this.tool.showMessage(res,()=>{})
+      }else {
+        this.personList = res.data
+      }
+    },
+    onSubmit(){
+      this.$refs.form.validate(async (valid) => {
+        if (!valid) return false
+        const res = await this.$api.requested({
+          "content": {
+            "sa_service_improvementid": this.$route.query.id,
+            "userid_analysis": this.form.userid_analysis//userid
+          },
+          "id": "2026030414420602",
+        })
+        this.tool.showMessage(res,()=>{
+          this.$refs.refundOrderRef.dialogTableVisible = false
+          this.$refs.form.resetFields()
+          this.queryMainData()
+        })
+      })
+    },
+    onCancel(){
+      this.$refs.form.resetFields()
+    }
   },
   mounted() {
     this.queryMainData()

+ 5 - 1
src/HDrpManagement/serviceImprovement/modules/detail2.vue

@@ -167,7 +167,11 @@ export default {
         {label:'改善计划周期',value:this.mainData.planned_cycle},
         {label:'改善实际周期',value:this.mainData.actual_cycle},
         {label:'改善方案进度',value:Math.round((this.mainData.progress * 100) * 100)/100 + '%'},
-        {label:'改善结果',value:this.mainData.result},
+        {label:'改善结果',value:this.mainData.result,
+          style:function () {
+            let style = that.tool.getStatusColor(that.mainData.result)
+            return style
+          }},
         {label:'创建时间',value:this.mainData.createdate},
         {label:'完成时间',value:this.mainData.finishdate},
         {label:'备注',value:this.mainData.remarks},

+ 3 - 3
src/components/confirmBtn/index.vue

@@ -1,18 +1,18 @@
 <template>
   <div>
-    <el-button type="primary" size="mini" @click="open">{{$t(btn_title)}}</el-button>
+    <el-button type="primary" size="mini" @click="open" :style="{background:color}">{{$t(btn_title)}}</el-button>
   </div>
 </template>
 
 <script>
 export default {
   name: "index",
-  props:['btn_title','confirmButtonText','cancelButtonText','id','paramId','message'],
+  props:['btn_title','confirmButtonText','cancelButtonText','id','paramId','message','color'],
   methods:{
     open() {
       this.$confirm(this.$t(this.message), this.$t('提示'), {
         confirmButtonText: this.confirmButtonText?this.$t(this.confirmButtonText):this.$t('确定'),
-        cancelButtonText: this.cancelButtonText?cancelButtonText:this.$t('取消'),
+        cancelButtonText: this.cancelButtonText?this.cancelButtonText:this.$t('取消'),
         type: 'warning'
       }).then(async() => {
         const res = await this.$api.requested({

+ 3 - 3
src/components/dialogTemplate/index2.vue

@@ -1,10 +1,11 @@
 <template>
   <div>
     <el-button :type="disabled?'':btnType" size="mini" :disabled="disabled"  @click="dialogShow">{{$t(btnTitle)}}</el-button>
-    <el-dialog :title="dialogTitle?$t(dialogTitle):$t(`提示`)" :visible.sync="dialogTableVisible" append-to-body :show-close="false" width="600px">
+    <el-dialog :title="dialogTitle?$t(dialogTitle):$t(`提示`)" :visible.sync="dialogTableVisible" append-to-body
+               :show-close="false" width="600px" @close="onCancel">
       <slot name="formRule"></slot>
       <div slot="footer" class="dialog-footer">
-        <el-button @click="onCancel" size="small">{{$t(`取 消`)}}</el-button>
+        <el-button @click="dialogTableVisible = false" size="small">{{$t(`取 消`)}}</el-button>
         <el-button :type="disabled?'':'primary'" @click="onSubmit" size="small" :disabled="disabledSubmit">{{$t(`确 定`)}}</el-button>
       </div>
     </el-dialog>
@@ -26,7 +27,6 @@ export default {
       this.$emit('dialogShow')
     },
     onCancel(){
-      this.dialogTableVisible = false
       this.$emit('onCancel')
     },
     onSubmit(){