Ver código fonte

feature:增加工单反馈流程,增加工单反馈记录,修改创建工单文件上传模式,解决线上打开小程序创建的经销商报错的问题

liuzl 2 anos atrás
pai
commit
5316d1d400

+ 33 - 1
src/api/work/index.js

@@ -2,7 +2,7 @@
  * @Author: liuzhenlin 461480418@qq.ocm
  * @Date: 2023-03-21 16:33:47
  * @LastEditors: liuzhenlin
- * @LastEditTime: 2023-06-20 11:09:40
+ * @LastEditTime: 2023-07-10 14:44:29
  * @Description: file content
  * @FilePath: \订单全流程管理系统\src\api\work\index.js
  */
@@ -56,4 +56,36 @@ export default {
   closeWorkOrder(query) {
     return micro_request.postRequest(basePath, 'WorkOrder', 'Close', query)
   },
+  // 上传文件
+  uploadDingtalk(query) {
+    return micro_request.postRequest(basePath, 'WorkOrder', 'UploadDingtalk', query)
+  },
+  // 支持总结
+  feedbackSupport(query) {
+    return micro_request.postRequest(basePath, 'WorkOrder', 'FeedbackSupport', query)
+  },
+  // 销售反馈
+  feedbackSale(query) {
+    return micro_request.postRequest(basePath, 'WorkOrder', 'FeedbackSale', query)
+  },
+  // 试用反馈
+  feedbackTrail(query) {
+    return micro_request.postRequest(basePath, 'WorkOrder', 'FeedbackTrail', query)
+  },
+  // 修改期望完成时间(技术文件)
+  changeSupportTime(query) {
+    return micro_request.postRequest(basePath, 'WorkOrder', 'TimeUpdateExpect', query)
+  },
+  // 修改支持时间(售前讲解)
+  changeSaleTime(query) {
+    return micro_request.postRequest(basePath, 'WorkOrder', 'TimeUpdateSupport', query)
+  },
+  //  修改试用时间(试用)
+  changeTryTime(query) {
+    return micro_request.postRequest(basePath, 'WorkOrder', 'TimeUpdateTrial', query)
+  },
+  // 首页时间轴
+  getListFull(query) {
+    return micro_request.postRequest(basePath, 'WorkOrder', 'ListFull', query)
+  },
 }

+ 1 - 2
src/views/base/distributor/components/DistrEdit.vue

@@ -172,9 +172,8 @@
           this.title = '新建'
         } else {
           this.title = '编辑'
-
           this.form = Object.assign({}, row)
-          this.form.customerType = row.customerType.split(',')
+          this.form.customerType = row.customerType ? row.customerType.split(',') : null
           //  this.pid = this.form.provinceId
           // this.form.provinceId = this.form.provinceDesc
         }

+ 0 - 3
src/views/base/distributor/detail.vue

@@ -191,10 +191,7 @@
         if (!type) return
         let arr = []
         let typeArr = type.split(',')
-        console.log(type)
-        console.log(this.customerOptions)
         typeArr.map((item) => {
-          console.log(item)
           arr.push(this.customerOptions.find((e) => e.key == item).value)
         })
         return arr.join(',')

+ 234 - 0
src/views/plat/work/index.vue

@@ -0,0 +1,234 @@
+<template>
+  <div class="app-container">
+    <ul class="records" :style="{ height: height }">
+      <li v-for="(v, index) in dynamicsList" :key="index">
+        <div class="date">
+          {{ parseTime(v.createdTime, '{y}-{m}-{d}') }}
+          <h2>{{ parseTime(v.createdTime, '{y}-{m}-{d}').split('-')[2] }}</h2>
+          <h3>{{ parseTime(v.createdTime, '{y}-{m}-{d}').split('-').splice(0, 2).join('.') }}</h3>
+        </div>
+        <ul class="content">
+          <li>
+            <vab-icon class="user-avatar" icon="account-circle-fill" />
+            <div class="text">
+              <p class="action">{{ v.assignUserName }} {{ v.orderTypeName }}</p>
+              <p>{{ parseTime(v.updatedTime, '{y}-{m}-{d}') }}</p>
+              <el-row
+                v-if="v.orderTypeName == '产品试用申请(硬件)' || v.orderTypeName == '产品试用申请(软件)'"
+                :gutter="20">
+                <el-col v-if="v.feedbackTrail" :span="24">
+                  <p class="tit">支持人员总结:</p>
+                  <el-descriptions
+                    v-for="(row, idx) in v.feedbackTrail"
+                    v-show="idx < (v.showLength ? v.showLength : 3)"
+                    :key="idx"
+                    border
+                    :column="2"
+                    :content-style="CS"
+                    :label-style="LS">
+                    <el-descriptions-item label="反馈时间">
+                      {{ row.feedbackTrialTime }} {{ v.showLength }}
+                    </el-descriptions-item>
+                    <el-descriptions-item label="试用反馈类型">
+                      {{ tryType[row.feedbackTrialType] }}
+                    </el-descriptions-item>
+                    <el-descriptions-item label="总结/问题">
+                      {{ row.feedbackTrialContent }}
+                    </el-descriptions-item>
+                    <el-descriptions-item label="客户/经销商反馈">
+                      {{ row.feedbackTrialDist }}
+                    </el-descriptions-item>
+                    <el-descriptions-item label="计划">
+                      {{ row.feedbackTrialPlan }}
+                    </el-descriptions-item>
+                    <el-descriptions-item label="更新时间">
+                      {{ parseTime(row.feedbackSupportTime, '{y}-{m}-{d}') }}
+                    </el-descriptions-item>
+                  </el-descriptions>
+                  <div v-if="v.feedbackTrail && v.feedbackTrail.length > 3" style="margin-top: 10px">
+                    <el-button size="mini" @click="changeLength(index, 3)">收起</el-button>
+                    <el-button size="mini" @click="changeLength(index, 999)">展开</el-button>
+                  </div>
+                </el-col>
+              </el-row>
+              <el-row v-if="v.orderTypeName == '技术文件支持' || v.orderTypeName == '售前讲解支持'" :gutter="20">
+                <el-col v-if="v.feedbackSupportTime" :span="24">
+                  <p class="tit">支持人员总结:</p>
+                  <el-descriptions border :column="2" :content-style="CS" :label-style="LS">
+                    <el-descriptions-item label="反馈时间">{{ v.feedbackSupportTime }}</el-descriptions-item>
+                    <el-descriptions-item label="本次讲解情况反馈">
+                      {{ v.feedbackSupportContent }}
+                    </el-descriptions-item>
+                    <el-descriptions-item label="更新时间">
+                      {{ parseTime(v.feedbackSupportTime, '{y}-{m}-{d}') }}
+                    </el-descriptions-item>
+                  </el-descriptions>
+                </el-col>
+                <el-col v-if="v.feedbackSaleTime" :span="24">
+                  <p class="tit">销售人员反馈:</p>
+                  <el-descriptions border :column="2" :content-style="CS" :label-style="LS">
+                    <el-descriptions-item label="反馈时间">{{ v.feedbackSaleTime }}</el-descriptions-item>
+                    <el-descriptions-item v-if="v.orderTypeName == '售前讲解支持'" label="会议纪要">
+                      {{ v.feedbackSaleMeeting }}
+                    </el-descriptions-item>
+                    <el-descriptions-item v-if="v.orderTypeName == '售前讲解支持'" label="客户/经销商反馈">
+                      {{ v.feedbackSaleDist }}
+                    </el-descriptions-item>
+                    <el-descriptions-item v-if="v.orderTypeName == '技术文件支持'" label="用户反馈">
+                      {{ v.feedbackSaleUser }}
+                    </el-descriptions-item>
+                    <el-descriptions-item label="下一步计划">
+                      {{ v.feedbackSaleNext }}
+                    </el-descriptions-item>
+                    <el-descriptions-item label="更新时间">
+                      {{ parseTime(v.feedbackSaleTime, '{y}-{m}-{d}') }}
+                    </el-descriptions-item>
+                  </el-descriptions>
+                </el-col>
+              </el-row>
+            </div>
+          </li>
+        </ul>
+      </li>
+    </ul>
+    <el-pagination
+      background
+      :current-page="queryForm.pageNum"
+      :layout="layout"
+      :page-size="queryForm.pageSize"
+      :total="total"
+      @current-change="handleCurrentChange"
+      @size-change="handleSizeChange" />
+  </div>
+</template>
+
+<script>
+  import workApi from '@/api/work/index'
+  import to from 'await-to-js'
+  export default {
+    name: 'WorkRecords',
+    data() {
+      return {
+        LS: {
+          width: '15%',
+        },
+        CS: {
+          width: '35%',
+        },
+        tryType: {
+          10: '试用启动反馈',
+          20: '试用过程反馈',
+          30: '试用总结反馈',
+        },
+        height: this.$baseTableHeight(0),
+        layout: 'total, sizes, prev, pager, next, jumper',
+        total: 0,
+        dynamicsList: [],
+        queryForm: {
+          pageNum: 1,
+          pageSize: 10,
+        },
+      }
+    },
+    mounted() {
+      this.fetchData()
+    },
+    methods: {
+      changeLength(index, length) {
+        this.$set(this.dynamicsList[index], 'showLength', length)
+      },
+      async fetchData() {
+        const [err, res] = await to(workApi.getListFull(this.queryForm))
+        if (err) return
+        if (res.code == 200) {
+          this.dynamicsList = res.data.list
+          this.total = res.data.total
+        }
+      },
+      handleSizeChange(val) {
+        this.queryForm.pageSize = val
+        this.fetchData()
+      },
+      handleCurrentChange(val) {
+        this.queryForm.pageNum = val
+        this.fetchData()
+      },
+    },
+  }
+</script>
+<style lang="scss" scoped>
+  .records {
+    margin: 0;
+    padding: 10px 20px;
+    list-style: none;
+    height: 100%;
+    overflow-y: auto;
+
+    > li {
+      display: flex;
+
+      & + li {
+        margin-top: 10px;
+      }
+    }
+
+    .date {
+      width: 100px;
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+
+      h2,
+      h3 {
+        margin: 0;
+      }
+
+      h2 {
+        font-size: 26px;
+        line-height: 32px;
+      }
+    }
+
+    .content {
+      flex: 1;
+      list-style: none;
+
+      li {
+        display: flex;
+
+        & + li {
+          margin-top: 10px;
+        }
+      }
+
+      .user-avatar {
+        font-size: 40px;
+      }
+
+      .text {
+        flex: 1;
+        padding-left: 20px;
+
+        p {
+          font-weight: 500;
+          margin: 0;
+          line-height: 20px;
+
+          span {
+            color: #1d66dc;
+          }
+        }
+
+        .action {
+          font-weight: bold;
+          color: #333;
+        }
+      }
+      .tit {
+        font-weight: bold !important;
+        color: #000;
+        padding: 10px 0;
+      }
+    }
+  }
+</style>

+ 0 - 0
src/views/work/order/deliver/components/editPlan.vue → src/views/work/deliver/components/editPlan.vue


+ 0 - 0
src/views/work/order/deliver/components/editWork.vue → src/views/work/deliver/components/editWork.vue


+ 0 - 0
src/views/work/order/deliver/components/finish.vue → src/views/work/deliver/components/finish.vue


+ 0 - 0
src/views/work/order/deliver/components/selectStatus.vue → src/views/work/deliver/components/selectStatus.vue


+ 0 - 0
src/views/work/order/deliver/components/updateUser.vue → src/views/work/deliver/components/updateUser.vue


+ 1 - 2
src/views/work/order/deliver/index.vue → src/views/work/deliver/index.vue

@@ -140,7 +140,6 @@
             label: '交付状态',
             width: '160px',
             prop: 'orderStatus',
-            disableCheck: true,
           },
           {
             label: '交付类型',
@@ -174,7 +173,7 @@
           },
           {
             label: '完成信息',
-            width: '160px',
+            width: 'auto',
             prop: 'finishRemark',
           },
           {

+ 8 - 10
src/views/work/order/deliver/plan.vue → src/views/work/deliver/plan.vue

@@ -194,8 +194,8 @@
   import planApi from '@/api/work/deliverPlan'
   import deliverWorkApi from '@/api/work/deliverWork'
   import TableTool from '@/components/table/TableTool'
-  import EditPlan from '@/views/work/order/deliver/components/editPlan'
-  import EditWork from '@/views/work/order/deliver/components/editWork'
+  import EditPlan from '@/views/work/deliver/components/editPlan'
+  import EditWork from '@/views/work/deliver/components/editWork'
   import selectStatus from './components/selectStatus'
   import to from 'await-to-js'
   export default {
@@ -239,7 +239,7 @@
           {
             label: '任务内容',
             prop: 'progressContext',
-            minWidth: '160px',
+            minWidth: 'auto',
             sortable: false,
             disableCheck: true,
           },
@@ -257,35 +257,33 @@
           },
           {
             label: '计划开始时间',
-            width: '120px',
+            width: '160px',
             prop: 'startDate',
             sortable: false,
-            disableCheck: true,
           },
 
           {
             label: '计划结束时间',
-            width: '120px',
+            width: '160px',
             prop: 'endDate',
             sortable: false,
           },
           {
             label: '实际开始时间',
-            width: '120px',
+            width: '160px',
             prop: 'reaStartDate',
             sortable: false,
-            disableCheck: true,
           },
 
           {
             label: '实际结束时间',
-            width: '120px',
+            width: '160px',
             prop: 'reaEndDate',
             sortable: false,
           },
           {
             label: '备注',
-            width: '120px',
+            width: 'auto',
             prop: 'remark',
             sortable: false,
           },

+ 145 - 0
src/views/work/order/components/ChangeTime.vue

@@ -0,0 +1,145 @@
+<template>
+  <el-dialog title="改期" :visible.sync="dialogFormVisible" width="600px" @close="close">
+    <el-form v-if="detail" ref="form" label-position="top" :model="form" :rules="rules">
+      <el-row :gutter="20">
+        <!-- 技术支持 -->
+        <el-col v-if="detail.orderTypeName == '技术文件支持'" :span="24">
+          <el-form-item label="期望完成时间" prop="expectTime">
+            <el-date-picker
+              v-model="form.expectTime"
+              placeholder="选择期望完成时间"
+              style="width: 100%"
+              type="date"
+              value-format="yyyy-MM-dd" />
+          </el-form-item>
+        </el-col>
+        <!-- end -->
+        <!-- 售前 -->
+        <el-col v-if="detail.orderTypeName == '售前讲解支持'" :span="24">
+          <el-form-item label="支持时间" prop="supportTime">
+            <el-date-picker
+              v-model="form.supportTime"
+              placeholder="选择支持时间"
+              style="width: 100%"
+              type="date"
+              value-format="yyyy-MM-dd" />
+          </el-form-item>
+        </el-col>
+        <!-- end -->
+        <!-- 修改试用时间 -->
+        <el-col
+          v-if="detail.orderTypeName == '产品试用申请(硬件)' || detail.orderTypeName == '产品试用申请(软件)'"
+          :span="24">
+          <el-form-item label="试用时间" prop="trialTime">
+            <el-date-picker
+              v-model="form.trialTime"
+              end-placeholder="结束日期"
+              range-separator="至"
+              start-placeholder="开始日期"
+              style="width: 100%"
+              type="datetimerange"
+              value-format="yyyy-MM-dd HH:mm:ss" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <template #footer>
+      <el-button @click="close">取 消</el-button>
+      <el-button type="primary" @click="save">确 定</el-button>
+    </template>
+  </el-dialog>
+</template>
+
+<script>
+  import to from 'await-to-js'
+  import workOrderApi from '@/api/work/index'
+  export default {
+    name: 'WorkOrderFeedback',
+    data() {
+      return {
+        detail: null,
+        form: {
+          expectTime: '',
+          supportTime: '',
+          trialTime: [],
+        },
+        rules: {
+          expectTime: [{ required: true, message: '不能为空', trigger: ['blur', 'change'] }],
+          supportTime: [{ required: true, message: '不能为空', trigger: ['blur', 'change'] }],
+          trialTime: [{ required: true, message: '不能为空', trigger: ['blur', 'change'] }],
+        },
+        dialogFormVisible: false,
+      }
+    },
+
+    mounted() {},
+    methods: {
+      open(row) {
+        this.detail = row
+        this.dialogFormVisible = true
+      },
+      close() {
+        this.$refs['form'].resetFields()
+        this.form = this.$options.data().form
+        this.dialogFormVisible = false
+      },
+      save() {
+        this.$refs['form'].validate(async (valid) => {
+          if (valid) {
+            let params = {}
+            if (
+              this.detail.orderTypeName == '产品试用申请(硬件)' ||
+              this.detail.orderTypeName == '产品试用申请(软件)'
+            ) {
+              params = {
+                orderId: this.detail.id,
+                trialTimeEnd: this.form.trialTime[1],
+                trialTimeStart: this.form.trialTime[0],
+              }
+              const [err, res] = await to(workOrderApi.changeTryTime(params))
+              if (err) return
+              if (res.code == 200) {
+                this.$message({
+                  type: 'success',
+                  message: '修改成功!',
+                })
+                this.close()
+                this.$emit('update-detail')
+              }
+            } else if (this.detail.orderTypeName == '技术文件支持') {
+              params = {
+                orderId: this.detail.id,
+                expectTime: this.form.expectTime,
+              }
+              const [err, res] = await to(workOrderApi.changeSupportTime(params))
+              if (err) return
+              if (res.code == 200) {
+                this.$message({
+                  type: 'success',
+                  message: '修改成功!',
+                })
+                this.close()
+                this.$emit('update-detail')
+              }
+            } else if (this.detail.orderTypeName == '售前讲解支持') {
+              params = {
+                orderId: this.detail.id,
+                supportTime: this.form.supportTime,
+              }
+              const [err, res] = await to(workOrderApi.changeSaleTime(params))
+              if (err) return
+              if (res.code == 200) {
+                this.$message({
+                  type: 'success',
+                  message: '修改成功!',
+                })
+                this.close()
+                this.$emit('update-detail')
+              }
+            }
+          }
+        })
+      },
+    },
+  }
+</script>

+ 92 - 15
src/views/work/order/components/DingTalkFromToVue.vue

@@ -79,13 +79,11 @@
               <el-upload
                 v-else-if="item.componentName === 'DDAttachment'"
                 :ref="item.props.id"
-                action="#"
-                :auto-upload="false"
-                :file-list="item.props.value"
+                :action="uploadFileUrl"
                 :limit="1"
-                :on-change="
-                  (file) => {
-                    return setFile(index, file)
+                :on-success="
+                  (response, file) => {
+                    return setQuotationFile(response, file, index)
                   }
                 ">
                 <el-button size="mini" type="primary">点击上传</el-button>
@@ -162,8 +160,11 @@
 
 <script>
   import productApi from '@/api/base/product'
+  import workApi from '@/api/work/index'
   import SelectUser from '@/components/select/SelectUser'
-
+  import asyncUploadFile from '@/utils/uploadajax'
+  import axios from 'axios'
+  import to from 'await-to-js'
   export default {
     name: 'DingTalkFromToVue',
     components: {
@@ -178,11 +179,16 @@
     data() {
       return {
         dingtalkForm: {},
-        fileList: [],
         productList: [],
         dingRules: {},
         userItemIndex: {},
         dingTableFlag: true,
+        uploadFileUrl: process.env.VUE_APP_UPLOAD_FILE_WEED,
+        fileSettings: {
+          // 文件配置信息
+          fileSize: 20971520,
+          fileTypes: '.rar,.zip,.doc,.docx,.pdf',
+        },
       }
     },
     mounted() {
@@ -228,15 +234,86 @@
         this.dingtalkForm.items[this.userItemIndex].props.value = nickName
         this.$forceUpdate()
       },
+      async setQuotationFile(res, file, index) {
+        // 如果上传成功
+        if (res.Code == 200) {
+          console.log(file)
+          const fileName = file.name // 资料存储url
+          const fileUrl = res.Data // 资料存储url
+          const [uploadErr, uploadRes] = await to(workApi.uploadDingtalk({ fileName, fileUrl }))
+          if (uploadErr) return
+          if (uploadRes.code == 200) {
+            this.dingtalkForm.items[index].props.value = uploadRes.data
+            let temp = JSON.parse(JSON.stringify(this.dingtalkForm))
+            this.$refs.dingtalkForm.clearValidate('items.' + index + '.props.value')
+            this.dingtalkForm = temp
+          }
+        } else {
+          this.$message.error('上传文件失败')
+        }
+      },
       // 文件
       setFile(index, file) {
-        this.$emit('upload', file.raw)
-        this.dingtalkForm.items[index].props.value = file.name
-        // 上传文件一直校验不过问题方案
-        let temp = JSON.parse(JSON.stringify(this.dingtalkForm))
-        this.$refs.dingtalkForm.clearValidate('items.' + index + '.props.value')
-        this.dingtalkForm = temp
+        // this.$emit('upload', file.raw)
+        let flag1 = file.size < this.fileSettings.fileSize
+        if (!flag1) {
+          this.$message.warning('文件过大,请重新选择!')
+          this.dingtalkForm.items[index].props.value = ''
+          return false
+        }
+        // let flag2 = this.fileSettings.fileTypes.split(',').includes('.' + file.name.split('.').pop())
+        // if (!flag2) {
+        //   this.$message.warning('文件类型不符合,请重新选择!')
+        //   this.dingtalkForm.items[index].props.value = ''
+        //   this.$forceUpdate()
+        //   return false
+        // }
         return true
+        // // 上传文件一直校验不过问题方案
+        // let temp = JSON.parse(JSON.stringify(this.dingtalkForm))
+        // this.$refs.dingtalkForm.clearValidate('items.' + index + '.props.value')
+        // this.dingtalkForm = temp
+      },
+      // 上传
+      uploadrequest(index, option) {
+        let idx = index
+        console.log(option)
+        let _this = this
+        let url = process.env.VUE_APP_UPLOAD_WEED
+        axios
+          .post(url)
+          .then(function (res) {
+            if (res.data && res.data.fid && res.data.fid !== '') {
+              option.action = `${process.env.VUE_APP_PROTOCOL}${res.data.publicUrl}/${res.data.fid}`
+              asyncUploadFile(option).then(async (res) => {
+                if (res) {
+                  let fileRes = JSON.parse(res)
+                  const fileName = fileRes.name // 资料存储url
+                  const fileUrl = option.action // 资料存储url
+                  const [uploadErr, uploadRes] = await to(workApi.uploadDingtalk({ fileName, fileUrl }))
+                  if (uploadErr) return
+                  if (uploadRes.code == 200) {
+                    console.log(uploadRes)
+                    _this.dingtalkForm.items[idx].props.value = uploadRes.data
+                    let temp = JSON.parse(JSON.stringify(_this.dingtalkForm))
+                    _this.$refs.dingtalkForm.clearValidate('items.' + idx + '.props.value')
+                    _this.dingtalkForm = temp
+                  }
+                }
+              })
+            } else {
+              _this.$message({
+                type: 'warning',
+                message: '未上传成功!请刷新界面重新上传!',
+              })
+            }
+          })
+          .catch(function () {
+            _this.$message({
+              type: 'warning',
+              message: '未上传成功!请重新上传!',
+            })
+          })
       },
       selectDataToJson(data) {
         return data.map((item) => {
@@ -262,7 +339,7 @@
           // 表格数据需要特殊处理
           if (this.dingtalkForm.items[index].componentName === 'TableField') {
             this.dingtalkForm.items[index].props.value = []
-            let tableData = this.dingtalkForm.items[index].tableData
+            let tableData = this.dingtalkForm.items[index].tableData || []
             for (let row of tableData) {
               // 循环数据,组装信息
               let newData = []

+ 38 - 18
src/views/work/order/components/Edit.vue

@@ -42,7 +42,7 @@
       </el-row>
 
       <!--      钉钉审批流表单-->
-      <DingTalkFromToVue ref="dingTalkFrom" :col-span="12" @upload="handleUploadFile" />
+      <DingTalkFromToVue ref="dingTalkFrom" :col-span="12" />
       <!--      钉钉审批流表单-->
       <!--      <el-row :gutter="20">-->
 
@@ -92,10 +92,14 @@
           formData: undefined,
           dingTalkFormData: undefined,
           feedback: undefined,
-          file: undefined,
+          // file: undefined,
           remark: undefined,
           endTime: undefined,
           dingtalkForm: undefined,
+          trialTimeStart: undefined,
+          trialTimeEnd: undefined,
+          expectTime: undefined,
+          supportTime: undefined,
         },
         rules: {
           name: [{ required: true, message: '不能为空', trigger: ['blur', 'change'] }],
@@ -145,12 +149,16 @@
             this.dingtalkForm.items[index].props.value = this.form.custCity
             this.dingtalkForm.items[index].props.disabled = true
           }
+          if (this.dingtalkForm.items[index].props.label === '销售工程师') {
+            this.dingtalkForm.items[index].props.value = this.form.saleName
+            this.dingtalkForm.items[index].props.disabled = true
+          }
         }
         this.$refs.dingTalkFrom.setFormAndRules(this.dingtalkForm)
       },
-      handleUploadFile(file) {
-        this.form.file = file
-      },
+      // handleUploadFile(file) {
+      //   this.form.file = file
+      // },
       handleSelectUser() {
         this.$refs.selectUser.open()
       },
@@ -173,6 +181,8 @@
           this.form.nboCode = this.businessInfo.nboCode
           this.form.custId = this.businessInfo.custId
           this.form.custName = this.businessInfo.custName
+          this.form.saleId = this.businessInfo.saleId
+          this.form.saleName = this.businessInfo.saleName
         }
         this.dialogFormVisible = true
       },
@@ -187,12 +197,10 @@
         this.$refs['form'].validate(async (valid) => {
           if (valid && dingValid) {
             let items = []
-            let fileFlag = false
             let dingtalkForm = this.$refs['dingTalkFrom'].getFormData()
             for (let item of dingtalkForm.items) {
               if (item.componentName === 'DDAttachment') {
-                fileFlag = true
-                if (!this.form.file && item.props.required) {
+                if (!item.props && item.props.required) {
                   this.$baseMessage('请上传' + item.props.label, 'error', 'vab-hey-message-error')
                   return
                 }
@@ -209,6 +217,25 @@
               if (item.props.label === '工单名称') {
                 this.form.name = item.props.value
               }
+              if (item.props.label === '备注' && !item.props.value) {
+                item.props.value = ''
+              }
+              if (item.props.label === '调研表上传' && !item.props.value) {
+                item.props.value = ''
+              }
+
+              if (item.props.label === '试用开始时间') {
+                this.form.trialTimeStart = item.props.value
+              }
+              if (item.props.label === '试用结束时间') {
+                this.form.trialTimeEnd = item.props.value
+              }
+              if (item.props.label === '期望完成时间') {
+                this.form.expectTime = item.props.value
+              }
+              if (item.props.label === '支持时间') {
+                this.form.supportTime = item.props.value
+              }
               items.push({
                 componentName: item.componentName,
                 id: item.props.id,
@@ -217,16 +244,9 @@
                 required: item.props.required,
               })
             }
-            if (fileFlag) {
-              this.form.dingTalkFormData = JSON.stringify(items)
-              const { msg } = await workApi.createUploadFileOrder(this.form)
-              this.$baseMessage(msg, 'success', 'vab-hey-message-success')
-            } else {
-              this.form.formData = items
-              const { msg } = await workApi.doAdd(this.form)
-              this.$baseMessage(msg, 'success', 'vab-hey-message-success')
-            }
-
+            this.form.formData = items
+            const { msg } = await workApi.doAdd(this.form)
+            this.$baseMessage(msg, 'success', 'vab-hey-message-success')
             this.$emit('fetch-data')
             this.close()
           }

+ 247 - 0
src/views/work/order/components/FeedbackRecord.vue

@@ -0,0 +1,247 @@
+<template>
+  <div style="height: 100%">
+    <div v-if="type == 'try'">
+      <el-table border :data="detail.feedbackTrail">
+        <el-table-column
+          v-for="(item, index) in tryColumns"
+          :key="index"
+          align="center"
+          height="calc(100% - 42px)"
+          :label="item.label"
+          :min-width="item.width"
+          :prop="item.prop"
+          show-overflow-tooltip>
+          <template #default="{ row }">
+            <span v-if="item.prop === 'feedbackTrialType'">
+              {{ tryType[row.feedbackTrialType] }}
+            </span>
+            <span v-else-if="item.prop === 'feedbackTrialTime'">
+              {{ parseTime(row.feedbackTrialTime, '{y}-{m}-{d}') }}
+            </span>
+            <span v-else>{{ row[item.prop] }}</span>
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+    <div v-if="type == 'support'">
+      <el-empty v-if="!detail.feedbackSupportTime" :image-size="200" />
+      <el-descriptions v-else border :column="2" direction="vertical">
+        <el-descriptions-item label="反馈时间">{{ detail.feedbackSupportTime }}</el-descriptions-item>
+        <el-descriptions-item label="本次讲解情况反馈">{{ detail.feedbackSupportContent }}</el-descriptions-item>
+      </el-descriptions>
+    </div>
+    <div v-if="type == 'sale'">
+      <el-empty v-if="!detail.feedbackSaleTime" :image-size="200" />
+      <el-descriptions v-else-if="detail.orderTypeName == '技术文件支持'" border :column="3" direction="vertical">
+        <el-descriptions-item label="反馈时间">{{ detail.feedbackSaleTime }}</el-descriptions-item>
+        <el-descriptions-item label="用户反馈">{{ detail.feedbackSaleUser }}</el-descriptions-item>
+        <el-descriptions-item label="下一步计划">{{ detail.feedbackSaleNext }}</el-descriptions-item>
+      </el-descriptions>
+      <el-descriptions v-else-if="detail.orderTypeName == '售前讲解支持'" border :column="4" direction="vertical">
+        <el-descriptions-item label="反馈时间">{{ detail.feedbackSaleTime }}</el-descriptions-item>
+        <el-descriptions-item label="会议纪要">{{ detail.feedbackSaleMeeting }}</el-descriptions-item>
+        <el-descriptions-item label="客户/经销商反馈">{{ detail.feedbackSaleDist }}</el-descriptions-item>
+        <el-descriptions-item label="下一步计划">{{ detail.feedbackSaleNext }}</el-descriptions-item>
+      </el-descriptions>
+    </div>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: 'DetailsContract',
+    props: {
+      detail: {
+        type: [Object, String],
+        required: true,
+      },
+      type: {
+        type: String,
+        required: true,
+      },
+    },
+    data() {
+      return {
+        tryType: {
+          10: '试用启动反馈',
+          20: '试用过程反馈',
+          30: '试用总结反馈',
+        },
+        tryColumns: [
+          {
+            label: '试用反馈类型',
+            width: '100px',
+            prop: 'feedbackTrialType',
+            sortable: false,
+            disableCheck: false,
+          },
+          {
+            label: '总结/问题',
+            width: '100px',
+            prop: 'feedbackTrialContent',
+            sortable: false,
+            disableCheck: false,
+          },
+          {
+            label: '客户/经销商反馈',
+            width: '160px',
+            prop: 'feedbackTrialDist',
+            sortable: false,
+            disableCheck: false,
+          },
+          {
+            label: '计划',
+            width: '280px',
+            prop: 'feedbackTrialPlan',
+            sortable: false,
+            disableCheck: false,
+          },
+          {
+            label: '反馈时间',
+            width: '100px',
+            prop: 'feedbackTrialTime',
+            sortable: false,
+            disableCheck: false,
+          },
+        ],
+        list: [],
+      }
+    },
+    mounted() {},
+    methods: {},
+  }
+</script>
+
+<style lang="scss" scoped>
+  .follow {
+    height: 100%;
+    padding: 10px 20px;
+    overflow: auto;
+
+    > li {
+      display: flex;
+
+      + li {
+        margin-top: 10px;
+      }
+    }
+
+    .date {
+      width: 100px;
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+
+      h2,
+      h3 {
+        margin: 0;
+      }
+
+      h2 {
+        font-size: 26px;
+        line-height: 32px;
+      }
+    }
+
+    .content {
+      flex: 1;
+      list-style: none;
+
+      > li {
+        border: 1px solid rgb(215, 232, 244);
+        background: rgb(247, 251, 254);
+        border-radius: 4px;
+        padding: 8px;
+        overflow: hidden;
+
+        .text-container {
+          display: flex;
+        }
+
+        .comments {
+          padding-left: 60px;
+          margin-top: 10px;
+          max-height: 190px;
+          overflow: auto;
+
+          li {
+            display: flex;
+            border-top: 1px solid #e3e5e7;
+
+            .text {
+              flex: 1;
+              padding: 0 10px;
+
+              p {
+                font-weight: 500;
+                margin: 0;
+                line-height: 32px;
+              }
+
+              p:first-child {
+                line-height: 30px;
+                font-weight: bold;
+              }
+
+              p:last-child {
+                font-size: 12px;
+                color: #9499a0;
+                text-align: right;
+              }
+            }
+          }
+        }
+
+        + li {
+          margin-top: 10px;
+        }
+      }
+
+      .user-avatar {
+        font-size: 40px;
+      }
+
+      .text {
+        flex: 1;
+        padding-left: 20px;
+        padding-right: 10px;
+
+        p {
+          font-weight: 500;
+          margin: 0;
+          line-height: 32px;
+
+          span {
+            color: #1d66dc;
+          }
+        }
+
+        .action {
+          display: flex;
+          justify-content: space-between;
+
+          span:first-child {
+            font-weight: bold;
+            color: #333;
+          }
+        }
+
+        .footer {
+          display: flex;
+          justify-content: space-between;
+          align-items: center;
+        }
+      }
+    }
+  }
+
+  .no-follow {
+    height: 100%;
+    width: 100%;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    font-size: 12px;
+    color: rgba(0, 0, 0, 0.65);
+  }
+</style>

+ 124 - 0
src/views/work/order/components/SaleFeedback.vue

@@ -0,0 +1,124 @@
+<template>
+  <el-dialog title="销售反馈" :visible.sync="dialogFormVisible" width="600px" @close="close">
+    <el-form ref="form" label-position="top" :model="form" :rules="rules">
+      <el-row :gutter="20">
+        <el-col :span="24">
+          <el-form-item label="反馈时间" prop="feedbackSaleTime">
+            <el-date-picker
+              v-model="form.feedbackSaleTime"
+              placeholder="选择反馈时间"
+              style="width: 100%"
+              type="date"
+              value-format="yyyy-MM-dd" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <!-- 售前讲解 -->
+      <el-row v-if="workType == '售前讲解支持'">
+        <el-col :span="24">
+          <el-form-item label="会议纪要" prop="feedbackSaleMeeting">
+            <el-input
+              v-model="form.feedbackSaleMeeting"
+              placeholder="会议纪要"
+              :rows="5"
+              show-word-limit
+              type="textarea" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="客户/经销商反馈" prop="feedbackSaleDist">
+            <el-input
+              v-model="form.feedbackSaleDist"
+              placeholder="客户/经销商反馈"
+              :rows="5"
+              show-word-limit
+              type="textarea" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <!-- END -->
+      <!-- 技术文件 -->
+      <el-row v-if="workType == '技术文件支持'">
+        <el-col :span="24">
+          <el-form-item label="用户反馈" prop="feedbackSaleUser">
+            <el-input
+              v-model="form.feedbackSaleUser"
+              placeholder="用户反馈"
+              :rows="5"
+              show-word-limit
+              type="textarea" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <!-- END -->
+      <el-row>
+        <el-col :span="24">
+          <el-form-item label="下一步计划" prop="feedbackSaleNext">
+            <el-input
+              v-model="form.feedbackSaleNext"
+              placeholder="下一步计划"
+              :rows="5"
+              show-word-limit
+              type="textarea" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <template #footer>
+      <el-button @click="close">取 消</el-button>
+      <el-button type="primary" @click="save">确 定</el-button>
+    </template>
+  </el-dialog>
+</template>
+
+<script>
+  import workOrderApi from '@/api/work/index'
+  export default {
+    name: 'WorkOrderFeedback',
+    data() {
+      return {
+        workType: '',
+        form: {
+          feedbackSaleTime: '',
+          feedbackSaleMeeting: '',
+          feedbackSaleDist: '',
+          feedbackSaleUser: '',
+          feedbackSaleNext: '',
+          orderId: '',
+        },
+        rules: {
+          feedbackSaleTime: [{ required: true, message: '不能为空', trigger: ['blur', 'change'] }],
+          feedbackSaleMeeting: [{ required: true, message: '不能为空', trigger: ['blur', 'change'] }],
+          feedbackSaleDist: [{ required: true, message: '不能为空', trigger: ['blur', 'change'] }],
+          feedbackSaleUser: [{ required: true, message: '不能为空', trigger: ['blur', 'change'] }],
+          feedbackSaleNext: [{ required: true, message: '不能为空', trigger: ['blur', 'change'] }],
+        },
+        dialogFormVisible: false,
+      }
+    },
+    mounted() {},
+    methods: {
+      open(row) {
+        console.log(row)
+        this.form.orderId = row.id
+        this.workType = row.orderTypeName
+        this.dialogFormVisible = true
+      },
+      close() {
+        this.$refs['form'].resetFields()
+        this.form = this.$options.data().form
+        this.dialogFormVisible = false
+      },
+      save() {
+        this.$refs['form'].validate(async (valid) => {
+          if (valid) {
+            const { msg } = await workOrderApi.feedbackSale(this.form)
+            this.$baseMessage(msg, 'success', 'vab-hey-message-success')
+            this.$emit('update-detail')
+            this.close()
+          }
+        })
+      },
+    },
+  }
+</script>

+ 77 - 0
src/views/work/order/components/SupportFeedback.vue

@@ -0,0 +1,77 @@
+<template>
+  <el-dialog title="支持人员总结" :visible.sync="dialogFormVisible" width="600px" @close="close">
+    <el-form ref="form" label-position="top" :model="form" :rules="rules">
+      <el-row :gutter="20">
+        <el-col :span="24">
+          <el-form-item label="反馈时间" prop="feedbackSupportTime">
+            <el-date-picker
+              v-model="form.feedbackSupportTime"
+              placeholder="选择反馈时间"
+              style="width: 100%"
+              type="date"
+              value-format="yyyy-MM-dd" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="本次情况反馈" prop="feedbackSupportContent">
+            <el-input
+              v-model="form.feedbackSupportContent"
+              placeholder="本次情况反馈"
+              :rows="5"
+              show-word-limit
+              type="textarea" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <template #footer>
+      <el-button @click="close">取 消</el-button>
+      <el-button type="primary" @click="save">确 定</el-button>
+    </template>
+  </el-dialog>
+</template>
+
+<script>
+  import workOrderApi from '@/api/work/index'
+  export default {
+    name: 'WorkOrderFeedback',
+    data() {
+      return {
+        workType: '',
+        form: {
+          feedbackSupportContent: '',
+          feedbackSupportTime: '',
+          orderId: '',
+        },
+        rules: {
+          feedbackSupportContent: [{ required: true, message: '不能为空', trigger: ['blur', 'change'] }],
+          feedbackSupportTime: [{ required: true, message: '不能为空', trigger: ['blur', 'change'] }],
+        },
+        dialogFormVisible: false,
+      }
+    },
+    mounted() {},
+    methods: {
+      open(row) {
+        console.log(row)
+        this.form.orderId = row.id
+        this.dialogFormVisible = true
+      },
+      close() {
+        this.$refs['form'].resetFields()
+        this.form = this.$options.data().form
+        this.dialogFormVisible = false
+      },
+      save() {
+        this.$refs['form'].validate(async (valid) => {
+          if (valid) {
+            const { msg } = await workOrderApi.feedbackSupport(this.form)
+            this.$baseMessage(msg, 'success', 'vab-hey-message-success')
+            this.$emit('update-detail')
+            this.close()
+          }
+        })
+      },
+    },
+  }
+</script>

+ 143 - 0
src/views/work/order/components/TryFeedback.vue

@@ -0,0 +1,143 @@
+<template>
+  <el-dialog title="试用反馈" :visible.sync="dialogFormVisible" width="600px" @close="close">
+    <el-form ref="form" label-position="top" :model="form" :rules="rules">
+      <el-row :gutter="20">
+        <el-col :span="24">
+          <el-form-item label="反馈时间" prop="feedbackTrialTime">
+            <el-date-picker
+              v-model="form.feedbackTrialTime"
+              placeholder="选择反馈时间"
+              style="width: 100%"
+              type="date"
+              value-format="yyyy-MM-dd" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item :label="summarizeLabel" prop="feedbackTrialContent">
+            <el-input
+              v-model="form.feedbackTrialContent"
+              :placeholder="summarizeLabel"
+              :rows="5"
+              show-word-limit
+              type="textarea" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="客户/经销商反馈" prop="feedbackTrialDist">
+            <el-input
+              v-model="form.feedbackTrialDist"
+              placeholder="客户/经销商反馈"
+              :rows="5"
+              show-word-limit
+              type="textarea" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item :label="nextPlanLabel" prop="feedbackTrialPlan">
+            <el-input
+              v-model="form.feedbackTrialPlan"
+              :placeholder="nextPlanLabel"
+              :rows="5"
+              show-word-limit
+              type="textarea" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <template #footer>
+      <el-button @click="close">取 消</el-button>
+      <el-button type="primary" @click="save">确 定</el-button>
+    </template>
+  </el-dialog>
+</template>
+
+<script>
+  import workOrderApi from '@/api/work/index'
+  export default {
+    name: 'WorkOrderFeedback',
+    data() {
+      return {
+        workType: '',
+        fbType: '',
+        form: {
+          feedbackTrialTime: '',
+          feedbackTrialContent: '',
+          feedbackTrialDist: '',
+          feedbackTrialPlan: '',
+          workOrderId: '',
+        },
+        rules: {
+          feedbackTrialTime: [{ required: true, message: '不能为空', trigger: ['blur', 'change'] }],
+          feedbackTrialContent: [{ required: true, message: '不能为空', trigger: ['blur', 'change'] }],
+          feedbackTrialDist: [{ required: true, message: '不能为空', trigger: ['blur', 'change'] }],
+          feedbackTrialPlan: [{ required: true, message: '不能为空', trigger: ['blur', 'change'] }],
+        },
+        feedbackTrialTypeObj: {
+          start: '10',
+          process: '20',
+          summarize: '30',
+        },
+        dialogFormVisible: false,
+      }
+    },
+    computed: {
+      summarizeLabel() {
+        let str = ''
+        switch (this.fbType) {
+          case 'start':
+            str = this.workType == '产品试用申请(软件)' ? '部署安装总结' : '会议总结'
+            break
+          case 'process':
+            str = '过程问题'
+            break
+          case 'summarize':
+            str = '使用总结'
+            break
+        }
+        return str
+      },
+      nextPlanLabel() {
+        let str = ''
+        switch (this.fbType) {
+          case 'start':
+            str = '跟进计划'
+            break
+          case 'process':
+            str = '跟进计划'
+            break
+          case 'summarize':
+            str = '下一步计划'
+            break
+        }
+        return str
+      },
+    },
+    mounted() {},
+    methods: {
+      open(row, type) {
+        console.log(row, type)
+        this.form.workOrderId = row.id
+        this.workType = row.orderTypeName
+        this.fbType = type
+        this.dialogFormVisible = true
+      },
+      close() {
+        this.$refs['form'].resetFields()
+        this.form = this.$options.data().form
+        this.dialogFormVisible = false
+      },
+      save() {
+        this.$refs['form'].validate(async (valid) => {
+          if (valid) {
+            let params = Object.assign(this.form)
+            params.feedbackTrialType = this.feedbackTrialTypeObj[this.fbType]
+            const { msg } = await workOrderApi.feedbackTrail(params)
+            this.$baseMessage(msg, 'success', 'vab-hey-message-success')
+            this.$emit('update-detail')
+            this.close()
+          }
+        })
+      },
+    },
+  }
+</script>

+ 121 - 11
src/views/work/order/detail.vue

@@ -6,6 +6,60 @@
           <p>工单</p>
           <h3>
             {{ detail.name }}
+            <span v-if="detail.orderStatus == '30'">
+              <span>
+                <el-button @click="handleChangeTime()">改期</el-button>
+              </span>
+              <!--支持人员反馈(总结)-->
+              <span>
+                <el-button
+                  v-if="
+                    detail.feedbackSupportBy == 0 &&
+                    (detail.orderTypeName == '技术文件支持' || detail.orderTypeName == '售前讲解支持')
+                  "
+                  v-permissions="['work:workOrder:feedback:support']"
+                  @click="openFeedBack('support')">
+                  支持人员总结
+                </el-button>
+              </span>
+              <!--销售反馈-->
+              <span>
+                <el-button
+                  v-if="
+                    detail.feedbackSupportBy == 1 &&
+                    detail.feedbackSaleBy != 1 &&
+                    (detail.orderTypeName == '技术文件支持' || detail.orderTypeName == '售前讲解支持')
+                  "
+                  v-permissions="['work:workOrder:feedback:sale']"
+                  @click="openFeedBack('sale')">
+                  销售反馈
+                </el-button>
+              </span>
+              <span
+                v-if="detail.orderTypeName == '产品试用申请(硬件)' || detail.orderTypeName == '产品试用申请(软件)'">
+                <!--试用启动反馈-->
+                <el-button
+                  v-if="!detail.feedbackTrail"
+                  v-permissions="['work:workOrder:feedback:start']"
+                  @click="openFeedBack('start')">
+                  试用启动反馈
+                </el-button>
+                <!--试用过程反馈-->
+                <el-button
+                  v-if="detail.feedbackTrail"
+                  v-permissions="['work:workOrder:feedback:process']"
+                  @click="openFeedBack('process')">
+                  试用过程反馈
+                </el-button>
+                <!--试用总结反馈-->
+                <el-button
+                  v-if="detail.feedbackTrail && detail.feedbackTrail.length > 1"
+                  v-permissions="['work:workOrder:feedback:summarize']"
+                  @click="openFeedBack('summarize')">
+                  试用总结反馈
+                </el-button>
+              </span>
+            </span>
           </h3>
         </div>
         <header>
@@ -43,7 +97,19 @@
                 v-show="item.componentName !== 'TableField'"
                 :key="index"
                 :label="item.name">
-                <span v-if="item.componentName === 'DDDateRangeField'">{{ item.value.join(' 至 ') }}</span>
+                <span v-if="item.name == '试用开始时间'">
+                  {{ parseTime(detail.trialTimeStart, '{y}-{m}-{d} {h}:{i}') }}
+                </span>
+                <span v-else-if="item.name == '试用结束时间'">
+                  {{ parseTime(detail.trialTimeEnd, '{y}-{m}-{d} {h}:{i}') }}
+                </span>
+                <span v-else-if="item.name == '期望完成时间'">
+                  {{ parseTime(detail.expectTime, '{y}-{m}-{d} {h}:{i}') }}
+                </span>
+                <span v-else-if="item.name == '支持时间'">
+                  {{ parseTime(detail.supportTime, '{y}-{m}-{d} {h}:{i}') }}
+                </span>
+                <span v-else-if="item.componentName === 'DDDateRangeField'">{{ item.value.join(' 至 ') }}</span>
                 <span v-else-if="item.componentName === 'DDAttachment'">
                   {{ item && item.length > 0 ? item[0].fileName : '' }}
                 </span>
@@ -77,8 +143,26 @@
             </div>
           </el-tab-pane>
           <!-- <el-tab-pane label="反馈记录" name="feedback">
-            <detail-feedback ref="feedback" :work-order-id="id" />
+            <feedback-record :detail="detail" />
           </el-tab-pane> -->
+          <el-tab-pane
+            v-if="detail.orderTypeName == '技术文件支持' || detail.orderTypeName == '售前讲解支持'"
+            label="支持人员总结"
+            name="supportFB">
+            <feedback-record :detail="detail" type="support" />
+          </el-tab-pane>
+          <el-tab-pane
+            v-if="detail.orderTypeName == '技术文件支持' || detail.orderTypeName == '售前讲解支持'"
+            label="销售反馈"
+            name="saleFB">
+            <feedback-record :detail="detail" type="sale" />
+          </el-tab-pane>
+          <el-tab-pane
+            v-if="detail.orderTypeName == '产品试用申请(硬件)' || detail.orderTypeName == '产品试用申请(软件)'"
+            label="试用反馈"
+            name="try">
+            <feedback-record :detail="detail" type="try" />
+          </el-tab-pane>
         </el-tabs>
       </div>
       <div class="info-side">
@@ -116,17 +200,24 @@
         </el-row>
       </div>
     </div>
+    <support-feedback ref="supportFB" @update-detail="getDetail" />
+    <sale-feedback ref="saleFB" @update-detail="getDetail" />
+    <try-feedback ref="tryFB" @update-detail="getDetail" />
+    <change-time ref="changeTime" @update-detail="getDetail" />
   </div>
 </template>
 
 <script>
   import to from 'await-to-js'
   import api from '@/api/work/index'
-  // import DetailFeedback from './components/DetailFeedback'
-
+  import SaleFeedback from '@/views/work/order/components/SaleFeedback'
+  import SupportFeedback from '@/views/work/order/components/SupportFeedback'
+  import TryFeedback from '@/views/work/order/components/TryFeedback'
+  import FeedbackRecord from './components/FeedbackRecord'
+  import ChangeTime from './components/ChangeTime'
   export default {
     name: 'WorkOrderDetail',
-    // components: { DetailFeedback },
+    components: { FeedbackRecord, SaleFeedback, SupportFeedback, TryFeedback, ChangeTime },
     data() {
       return {
         feedBackContent: '',
@@ -145,8 +236,22 @@
       this.id = parseInt(this.$route.query.id)
       this.getOptions()
       this.getDynamics()
+      this.getDetail()
     },
     methods: {
+      handleChangeTime() {
+        this.$refs.changeTime.open(this.detail)
+      },
+      // 打开不同的反馈组件
+      openFeedBack(type = null) {
+        if (type == 'support') {
+          this.$refs.supportFB.open(this.detail)
+        } else if (type == 'sale') {
+          this.$refs.saleFB.open(this.detail)
+        } else {
+          this.$refs.tryFB.open(this.detail, type)
+        }
+      },
       async getDynamics() {
         const [err, res] = await to(api.dynamicsList({ orderId: this.id }))
         if (err) return
@@ -178,16 +283,21 @@
         }
       },
       getOptions() {
-        Promise.all([api.getDetail({ id: this.id }), this.getDicts('work_order_status')])
-          .then(([detail, workOrderStatus]) => {
-            this.detail = detail.data
+        Promise.all([this.getDicts('work_order_status')])
+          .then(([workOrderStatus]) => {
             this.orderStatusOptions = workOrderStatus.data.values || []
-
-            this.dingFormData = JSON.parse(this.detail.formData)
-            this.checkDingFormType()
           })
           .catch((err) => console.log(err))
       },
+      async getDetail() {
+        const [err, res] = await to(api.getDetail({ id: this.id }))
+        if (err) return
+        if (res.code == 200) {
+          this.detail = res.data
+          this.dingFormData = JSON.parse(this.detail.formData)
+          this.checkDingFormType()
+        }
+      },
       checkDingFormType() {
         for (let item of this.dingFormData) {
           if (item.componentName === 'TableField') {

+ 2 - 10
src/views/work/order/index.vue

@@ -71,9 +71,8 @@
           <span v-else>{{ row[item.prop] }}</span>
         </template>
       </el-table-column>
-      <el-table-column align="center" label="操作" width="100">
+      <el-table-column align="center" label="操作" width="60">
         <template #default="{ row }">
-          <el-button v-if="row.orderStatus == 30" type="text" @click="handleFeedback(row)">完成</el-button>
           <el-button v-if="row.orderStatus == 10 || row.orderStatus == 30" type="text" @click="handleClose(row.id)">
             关闭
           </el-button>
@@ -94,8 +93,6 @@
       @size-change="handleSizeChange" />
     <!--创建工单-->
     <edit ref="edit" @fetch-data="fetchData" />
-    <!--反馈-->
-    <feedback ref="feedback" :order-status-options="orderStatusOptions" @fetch-data="fetchData" />
   </div>
 </template>
 
@@ -104,11 +101,10 @@
   import api from '@/api/work/index'
   import TableTool from '@/components/table/TableTool'
   import Edit from './components/Edit'
-  import Feedback from './components/Feedback'
 
   export default {
     name: 'WorkOrder',
-    components: { TableTool, Edit, Feedback },
+    components: { TableTool, Edit },
     data() {
       return {
         activeName: 'first',
@@ -246,10 +242,6 @@
           this.$refs['edit'].showEdit()
         }
       },
-      handleFeedback(row) {
-        row.orderId = row.id
-        this.$refs['feedback'].showEdit(row)
-      },
       // 关闭工单
       handleClose(id) {
         this.$confirm('确认关闭?', '提示', {