Przeglądaj źródła

feature(工单): 硬件交付工单需求初步完成

lk 2 lat temu
rodzic
commit
805403a547

+ 3 - 0
src/api/work/deliver.js

@@ -26,4 +26,7 @@ export default {
   finish(query) {
   finish(query) {
     return micro_request.postRequest(basePath, 'DeliverOrder', 'Finish', query)
     return micro_request.postRequest(basePath, 'DeliverOrder', 'Finish', query)
   },
   },
+  start(query) {
+    return micro_request.postRequest(basePath, 'DeliverOrder', 'Start', query)
+  },
 }
 }

+ 21 - 0
src/api/work/deliverWork.js

@@ -31,4 +31,25 @@ export default {
   finishWork(query) {
   finishWork(query) {
     return micro_request.postRequest(basePath, 'DeliverOrderProgress', 'Finish', query)
     return micro_request.postRequest(basePath, 'DeliverOrderProgress', 'Finish', query)
   },
   },
+  startDeliverGoodsProgress(query) {
+    return micro_request.postRequest(basePath, 'DeliverOrderProgress', 'StartDeliverGoodsProgress', query)
+  },
+  completeAssembleGoodsProgress(query) {
+    return micro_request.postRequest(basePath, 'DeliverOrderProgress', 'CompleteAssembleGoodsProgress', query)
+  },
+  deliverGoods(query) {
+    return micro_request.postRequest(basePath, 'DeliverOrderProgress', 'DeliverGoods', query)
+  },
+  inspectGoods(query) {
+    return micro_request.postRequest(basePath, 'DeliverOrderProgress', 'InspectGoods', query)
+  },
+  confirmArrival(query) {
+    return micro_request.postRequest(basePath, 'DeliverOrderProgress', 'ConfirmArrival', query)
+  },
+  startInstallProgress(query) {
+    return micro_request.postRequest(basePath, 'DeliverOrderProgress', 'StartInstallProgress', query)
+  },
+  completeInstall(query) {
+    return micro_request.postRequest(basePath, 'DeliverOrderProgress', 'CompleteInstall', query)
+  },
 }
 }

+ 211 - 0
src/views/work/deliver/components/completeProgress.vue

@@ -0,0 +1,211 @@
+<template>
+  <el-dialog :title="title" :visible.sync="dialogFormVisible" width="500px">
+    <el-form ref="form" label-position="top" :model="form" :rules="rules">
+      <el-row :gutter="20">
+        <el-col :span="24">
+          <el-form-item label="附件" prop="fileUrl">
+            <el-upload
+              ref="uploadRef"
+              action="#"
+              :before-upload="
+                (file) => {
+                  return beforeAvatarUpload(file)
+                }
+              "
+              :http-request="uploadRequest"
+              :limit="1">
+              <el-button size="mini" type="primary">点击上传</el-button>
+            </el-upload>
+            <el-button v-show="form.fileUrl != ''" @click="showFile(form.fileUrl)">查看</el-button>
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="选择完成日期" prop="date">
+            <el-date-picker
+              v-model="form.date"
+              placeholder="请选择日期"
+              style="width: 100%"
+              type="date"
+              value-format="yyyy-MM-dd HH:mm:ss" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="备注" prop="remark">
+            <el-input v-model="form.remark" placeholder="请输入备注" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <template #footer>
+      <el-button @click="dialogFormVisible = false">取 消</el-button>
+      <el-button type="primary" @click="complete">确 定</el-button>
+    </template>
+  </el-dialog>
+</template>
+
+<script>
+  import deliverWorkApi from '@/api/work/deliverWork'
+  import to from 'await-to-js'
+  import axios from 'axios'
+  import asyncUploadFile from '@/utils/uploadajax'
+
+  export default {
+    name: 'CompleteProgress',
+    components: {},
+    props: {
+      // orderStatusOptions: {
+      //   type: Array,
+      //   default: () => [],
+      // },
+    },
+    data() {
+      return {
+        form: {
+          date: '',
+          fileUrl: '',
+          fileName: '',
+          remark: '',
+        },
+        progress: {},
+        rules: {
+          fileUrl: [{ required: true, message: '不能为空', trigger: ['blur', 'change'] }],
+          date: [{ required: true, message: '不能为空', trigger: ['blur', 'change'] }],
+        },
+        dialogFormVisible: false,
+        planId: 0,
+        title: '',
+        fileSettings: {
+          // 文件配置信息
+          fileSize: 52428800,
+          fileTypes: '.doc,.docx,.zip,.xls,.xlsx,.rar,.jpg,.jpeg,.gif,.png,.jfif,.txt',
+          pictureSize: 52428800,
+          pictureTypes: '.jpg,.jpeg,.gif,.png,.jfif,.txt',
+          types: '.doc,.docx,.zip,.xls,.xlsx,.rar,.jpg,.jpeg,.gif,.png,.jfif,.mp4,.txt',
+          videoSize: 104857600,
+          videoType: '.mp4',
+        },
+      }
+    },
+    mounted() {},
+    methods: {
+      // 打开弹窗
+      open(row) {
+        this.title = '完成'
+        this.progress = row
+        this.form.date = ''
+        this.form.fileUrl = ''
+        this.form.fileName = ''
+        this.form.remark = ''
+        if (this.$refs['form']) {
+          this.$refs['form'].resetFields()
+        }
+        if (this.$refs.uploadRef) {
+          this.$refs.uploadRef.clearFiles() //去掉文件列表
+        }
+        this.dialogFormVisible = true
+      },
+      // 上传附件
+      beforeAvatarUpload(file) {
+        let flag1 = file.size < this.fileSettings.fileSize
+        if (!flag1) {
+          this.$message.warning('文件过大,请重新选择!')
+          return false
+        }
+        let flag2 = this.fileSettings.fileTypes.split(',').includes('.' + file.name.split('.').pop())
+        if (!flag2) {
+          this.$message.warning('文件类型不符合,请重新选择!')
+          return false
+        }
+        return true
+      },
+      // 上传
+      uploadRequest(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(() => {
+                _this.form.fileName = option.file.name
+                _this.form.fileUrl = `${process.env.VUE_APP_PROTOCOL}${res.data.publicUrl}/${res.data.fid}` // 资料存储url
+              })
+            } else {
+              _this.$message({
+                type: 'warning',
+                message: '未上传成功!请刷新界面重新上传!',
+              })
+            }
+          })
+          .catch(function () {
+            _this.$message({
+              type: 'warning',
+              message: '未上传成功!请重新上传!',
+            })
+          })
+      },
+      // 查看附件
+      showFile(url) {
+        let fileName = this.form.fileName
+        const xhr = new XMLHttpRequest()
+        xhr.open('GET', url, true)
+        xhr.responseType = 'blob' // 通过文件下载url拿到对应的blob对象
+        xhr.onload = () => {
+          if (xhr.status === 200) {
+            let link = document.createElement('a')
+            let body = document.querySelector('body')
+            link.href = window.URL.createObjectURL(xhr.response)
+            link.download = fileName
+            link.click()
+            this.$message.success('下载成功')
+            body.removeChild(link)
+            window.URL.revokeObjectURL(link.href)
+          }
+        }
+
+        xhr.send()
+      },
+      // 完成
+      async complete() {
+        this.$refs['form'].validate(async (valid) => {
+          if (valid) {
+            // 10发货任务单/20组装任务单/30部署安装单
+            if (this.progress.progressType == '20') {
+              const [err, res] = await to(
+                deliverWorkApi.completeAssembleGoodsProgress({
+                  id: this.progress.id,
+                  reaEndDate: this.form.date,
+                  fileUrl: this.form.fileUrl,
+                  fileName: this.form.fileName,
+                  remark: this.form.remark,
+                })
+              )
+              if (err) return
+              if (res.code == 200) {
+                this.$baseMessage(res.msg, 'success', 'vab-hey-message-success')
+                this.$emit('fetch-data')
+              }
+            } else if (this.progress.progressType == '30') {
+              const [err, res] = await to(
+                deliverWorkApi.completeInstall({
+                  id: this.progress.id,
+                  installDate: this.form.date,
+                  installCheckFileUrl: this.form.fileUrl,
+                  fileName: this.form.fileName,
+                  remark: this.form.remark,
+                })
+              )
+              if (err) return
+              if (res.code == 200) {
+                this.$baseMessage(res.msg, 'success', 'vab-hey-message-success')
+                this.$emit('fetch-data')
+              }
+            }
+            this.dialogFormVisible = false
+          }
+        })
+      },
+    },
+  }
+</script>

+ 204 - 0
src/views/work/deliver/components/deliver.vue

@@ -0,0 +1,204 @@
+<template>
+  <el-dialog :title="title" :visible.sync="dialogFormVisible" width="500px">
+    <el-form ref="form" label-position="top" :model="form" :rules="rules">
+      <el-row :gutter="20">
+        <!-- <el-col :span="24">
+          <el-form-item label="附件" prop="fileUrl">
+            <el-upload
+              ref="uploadRef"
+              action="#"
+              :before-upload="
+                (file) => {
+                  return beforeAvatarUpload(file)
+                }
+              "
+              :http-request="uploadRequest"
+              :limit="1">
+              <el-button size="mini" type="primary">点击上传</el-button>
+            </el-upload>
+            <el-button v-show="form.fileUrl != ''" @click="showFile(form.fileUrl)">查看</el-button>
+          </el-form-item>
+        </el-col> -->
+        <el-col :span="24">
+          <el-form-item label="快递名称" prop="expressName">
+            <el-input v-model="form.expressName" placeholder="请输入快递名称" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="快递单号" prop="expressCode">
+            <el-input v-model="form.expressCode" placeholder="请输入快递单号" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="选择预计到货日期" prop="date">
+            <el-date-picker
+              v-model="form.date"
+              placeholder="请选择日期"
+              style="width: 100%"
+              type="date"
+              value-format="yyyy-MM-dd HH:mm:ss" />
+          </el-form-item>
+        </el-col>
+        <!-- <el-col :span="24">
+          <el-form-item label="备注" prop="remark">
+            <el-input v-model="form.remark" placeholder="请输入备注" />
+          </el-form-item>
+        </el-col> -->
+      </el-row>
+    </el-form>
+    <template #footer>
+      <el-button @click="dialogFormVisible = false">取 消</el-button>
+      <el-button type="primary" @click="deliver">确 定</el-button>
+    </template>
+  </el-dialog>
+</template>
+
+<script>
+  import deliverWorkApi from '@/api/work/deliverWork'
+  import to from 'await-to-js'
+  import axios from 'axios'
+  import asyncUploadFile from '@/utils/uploadajax'
+
+  export default {
+    name: 'Deliver',
+    components: {},
+    props: {
+      // orderStatusOptions: {
+      //   type: Array,
+      //   default: () => [],
+      // },
+    },
+    data() {
+      return {
+        form: {
+          date: '',
+          expressName: '',
+          expressCode: '',
+          remark: '',
+        },
+        progress: {},
+        rules: {
+          expressCode: [{ required: true, message: '不能为空', trigger: ['blur', 'change'] }],
+          expressName: [{ required: true, message: '不能为空', trigger: ['blur', 'change'] }],
+          date: [{ required: true, message: '不能为空', trigger: ['blur', 'change'] }],
+        },
+        dialogFormVisible: false,
+        planId: 0,
+        title: '',
+        fileSettings: {
+          // 文件配置信息
+          fileSize: 52428800,
+          fileTypes: '.doc,.docx,.zip,.xls,.xlsx,.rar,.jpg,.jpeg,.gif,.png,.jfif,.txt',
+          pictureSize: 52428800,
+          pictureTypes: '.jpg,.jpeg,.gif,.png,.jfif,.txt',
+          types: '.doc,.docx,.zip,.xls,.xlsx,.rar,.jpg,.jpeg,.gif,.png,.jfif,.mp4,.txt',
+          videoSize: 104857600,
+          videoType: '.mp4',
+        },
+      }
+    },
+    mounted() {},
+    methods: {
+      // 打开弹窗
+      open(row) {
+        this.title = '发货'
+        this.progress = row
+        this.form.date = ''
+        this.form.expressName = ''
+        this.form.expressCode = ''
+        this.form.remark = ''
+        if (this.$refs['form']) {
+          this.$refs['form'].resetFields()
+        }
+        if (this.$refs.uploadRef) {
+          this.$refs.uploadRef.clearFiles() //去掉文件列表
+        }
+        this.dialogFormVisible = true
+      },
+      // 上传附件
+      beforeAvatarUpload(file) {
+        let flag1 = file.size < this.fileSettings.fileSize
+        if (!flag1) {
+          this.$message.warning('文件过大,请重新选择!')
+          return false
+        }
+        let flag2 = this.fileSettings.fileTypes.split(',').includes('.' + file.name.split('.').pop())
+        if (!flag2) {
+          this.$message.warning('文件类型不符合,请重新选择!')
+          return false
+        }
+        return true
+      },
+      // 上传
+      uploadRequest(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(() => {
+                _this.form.fileName = option.file.name
+                _this.form.fileUrl = `${process.env.VUE_APP_PROTOCOL}${res.data.publicUrl}/${res.data.fid}` // 资料存储url
+              })
+            } else {
+              _this.$message({
+                type: 'warning',
+                message: '未上传成功!请刷新界面重新上传!',
+              })
+            }
+          })
+          .catch(function () {
+            _this.$message({
+              type: 'warning',
+              message: '未上传成功!请重新上传!',
+            })
+          })
+      },
+      // 查看附件
+      showFile(url) {
+        let fileName = this.form.fileName
+        const xhr = new XMLHttpRequest()
+        xhr.open('GET', url, true)
+        xhr.responseType = 'blob' // 通过文件下载url拿到对应的blob对象
+        xhr.onload = () => {
+          if (xhr.status === 200) {
+            let link = document.createElement('a')
+            let body = document.querySelector('body')
+            link.href = window.URL.createObjectURL(xhr.response)
+            link.download = fileName
+            link.click()
+            this.$message.success('下载成功')
+            body.removeChild(link)
+            window.URL.revokeObjectURL(link.href)
+          }
+        }
+
+        xhr.send()
+      },
+      // 完成
+      async deliver() {
+        this.$refs['form'].validate(async (valid) => {
+          if (valid) {
+            const [err, res] = await to(
+              deliverWorkApi.deliverGoods({
+                id: this.progress.id,
+                estimatedArrivalTime: this.form.date,
+                expressName: this.form.expressName,
+                expressCode: this.form.expressCode,
+                // remark: this.form.remark,
+              })
+            )
+            if (err) return
+            if (res.code == 200) {
+              this.$baseMessage(res.msg, 'success', 'vab-hey-message-success')
+              this.$emit('fetch-data')
+            }
+            this.dialogFormVisible = false
+          }
+        })
+      },
+    },
+  }
+</script>

+ 264 - 19
src/views/work/deliver/components/editWork.vue

@@ -4,19 +4,43 @@
       <el-row :gutter="20">
       <el-row :gutter="20">
         <el-col :span="12">
         <el-col :span="12">
           <el-form-item label="任务标题" prop="progressTitle">
           <el-form-item label="任务标题" prop="progressTitle">
-            <el-input v-model="form.progressTitle" placeholder="请输入任务标题" />
+            <el-input v-model="form.progressTitle" :disabled="!editable" placeholder="请输入任务标题" />
           </el-form-item>
           </el-form-item>
         </el-col>
         </el-col>
-        <el-col :span="12">
+        <!-- <el-col :span="12">
           <el-form-item label="任务内容" prop="progressContext">
           <el-form-item label="任务内容" prop="progressContext">
             <el-input v-model="form.progressContext" placeholder="请输入任务内容" />
             <el-input v-model="form.progressContext" placeholder="请输入任务内容" />
           </el-form-item>
           </el-form-item>
+        </el-col> -->
+        <el-col :span="12">
+          <el-form-item label="任务类型" prop="progressType">
+            <el-select v-model="form.progressType" disabled placeholder="请选择任务类型" style="width: 100%">
+              <el-option label="发货任务单" value="10" />
+              <el-option label="组装任务单" value="20" />
+              <el-option label="部署安装单" value="30" />
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="负责人" prop="principalPerson">
+            <el-input
+              ref="principalPerson"
+              v-model="form.principalPerson"
+              :disabled="!editable"
+              placeholder="请选择负责人"
+              readonly
+              suffix-icon="el-icon-search"
+              @focus="openUser(false, 'principalPersonId', 'principalPerson')" />
+          </el-form-item>
         </el-col>
         </el-col>
-      </el-row>
-      <el-row :gutter="20">
         <el-col :span="12">
         <el-col :span="12">
           <el-form-item label="优先级" prop="progressLevel">
           <el-form-item label="优先级" prop="progressLevel">
-            <el-select v-model="form.progressLevel" clearable placeholder="优先级" style="width: 100%">
+            <el-select
+              v-model="form.progressLevel"
+              clearable
+              :disabled="!editable"
+              placeholder="优先级"
+              style="width: 100%">
               <el-option label="最高" value="10" />
               <el-option label="最高" value="10" />
               <el-option label="普通" value="20" />
               <el-option label="普通" value="20" />
               <el-option label="较低" value="30" />
               <el-option label="较低" value="30" />
@@ -24,78 +48,184 @@
           </el-form-item>
           </el-form-item>
         </el-col>
         </el-col>
         <el-col :span="12">
         <el-col :span="12">
-          <el-form-item label="时间范围" prop="date">
+          <el-form-item label="开始/截止时间" prop="date">
             <el-date-picker
             <el-date-picker
               v-model="form.date"
               v-model="form.date"
-              end-placeholder="结束日期"
+              :disabled="!editable"
+              end-placeholder="结束时间"
               range-separator="至"
               range-separator="至"
-              start-placeholder="开始日期"
+              start-placeholder="开始时间"
               style="width: 100%"
               style="width: 100%"
               type="datetimerange"
               type="datetimerange"
               value-format="yyyy-MM-dd HH:mm:ss" />
               value-format="yyyy-MM-dd HH:mm:ss" />
           </el-form-item>
           </el-form-item>
         </el-col>
         </el-col>
-      </el-row>
-      <el-row :gutter="20">
+        <el-col :span="24">
+          <el-table ref="productTable" :data="products" style="width: 100%">
+            <el-table-column type="selection" width="55" />
+            <el-table-column label="产品名称" prop="productName" />
+            <el-table-column label="产品编号" prop="productCode" />
+            <el-table-column label="数量" prop="productNum" />
+            <el-table-column v-if="form.progressType == '10'" label="获取方式">
+              <template slot-scope="scope">
+                <el-select
+                  v-model="scope.row.operateType"
+                  :disabled="!productEditable"
+                  placeholder="方式"
+                  style="width: 100%">
+                  <el-option label="组装" value="组装" />
+                  <el-option label="外购" value="外购" />
+                </el-select>
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-col>
+        <el-col v-if="theProgress && theProgress.deliverStatus >= 30" :span="12">
+          <el-form-item label="快递名称">
+            <el-input v-model="theProgress.expressName" disabled />
+          </el-form-item>
+        </el-col>
+        <el-col v-if="theProgress && theProgress.deliverStatus >= 30" :span="12">
+          <el-form-item label="快递单号">
+            <el-input v-model="theProgress.expressCode" disabled />
+          </el-form-item>
+        </el-col>
+        <el-col v-if="theProgress && theProgress.deliverStatus >= 30" :span="12">
+          <el-form-item label="预计到货时间">
+            <el-date-picker
+              v-model="theProgress.estimatedArrivalTime"
+              disabled
+              style="width: 100%"
+              type="date"
+              value-format="yyyy-MM-dd" />
+          </el-form-item>
+        </el-col>
+        <el-col v-if="theProgress && theProgress.deliverStatus >= 40" :span="12">
+          <el-form-item label="到货时间">
+            <el-date-picker
+              v-model="theProgress.arrivalTime"
+              disabled
+              style="width: 100%"
+              type="date"
+              value-format="yyyy-MM-dd" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="24" style="margin-top: 10px; margin-bottom: 10px">
+          <el-button
+            v-if="theProgress && theProgress.assembleFileName != ''"
+            size="mini"
+            type="primary"
+            @click="showFile(theProgress.assembleFileUrl, theProgress.assembleFileName)">
+            组装报告:{{ theProgress.assembleFileName }}
+          </el-button>
+          <el-button
+            v-if="theProgress && theProgress.checkFileName != ''"
+            size="mini"
+            type="primary"
+            @click="showFile(theProgress.checkFileUrl, theProgress.checkFileName)">
+            验收单:{{ theProgress.checkFileName }}
+          </el-button>
+          <el-button
+            v-if="theProgress && theProgress.installCheckFileName != ''"
+            size="mini"
+            type="primary"
+            @click="showFile(theProgress.installCheckFileUrl, theProgress.installCheckFileName)">
+            安装验收单:{{ theProgress.installCheckFileName }}
+          </el-button>
+        </el-col>
         <el-col :span="24">
         <el-col :span="24">
           <el-form-item label="备注" prop="remark">
           <el-form-item label="备注" prop="remark">
-            <el-input v-model="form.remark" placeholder="请输入备注信息" :rows="5" show-word-limit type="textarea" />
+            <el-input
+              v-model="form.remark"
+              :disabled="!editable"
+              placeholder="请输入备注信息"
+              :rows="5"
+              show-word-limit
+              type="textarea" />
           </el-form-item>
           </el-form-item>
         </el-col>
         </el-col>
       </el-row>
       </el-row>
     </el-form>
     </el-form>
     <template #footer>
     <template #footer>
       <el-button @click="close">取 消</el-button>
       <el-button @click="close">取 消</el-button>
-      <el-button type="primary" @click="save">确 定</el-button>
+      <el-button v-if="editable" type="primary" @click="save">确 定</el-button>
     </template>
     </template>
-
-    <!-- 选择支持人员弹窗 -->
+    <!-- 选择用户 -->
+    <select-user ref="user" :label="label" :multiple="multiple" :property="property" @save="getUser" />
   </el-dialog>
   </el-dialog>
 </template>
 </template>
 
 
 <script>
 <script>
+  import SelectUser from '@/components/select/SelectUser'
   import deliverWorkApi from '@/api/work/deliverWork'
   import deliverWorkApi from '@/api/work/deliverWork'
+  import orderWorkApi from '@/api/work/deliver'
+  import to from 'await-to-js'
+
   export default {
   export default {
     name: 'WorkOrderFeedback',
     name: 'WorkOrderFeedback',
-    components: {},
+    components: { SelectUser },
     data() {
     data() {
       return {
       return {
+        theProgress: {},
         form: {
         form: {
           progressTitle: undefined,
           progressTitle: undefined,
+          progressType: '',
           progressContext: '',
           progressContext: '',
           date: [],
           date: [],
           progressLevel: '10',
           progressLevel: '10',
+          principalPersonId: '',
+          principalPerson: '',
           remark: undefined,
           remark: undefined,
         },
         },
         rules: {
         rules: {
           progressTitle: [{ required: true, message: '不能为空', trigger: ['blur', 'change'] }],
           progressTitle: [{ required: true, message: '不能为空', trigger: ['blur', 'change'] }],
           progressContext: [{ required: true, message: '不能为空', trigger: ['blur', 'change'] }],
           progressContext: [{ required: true, message: '不能为空', trigger: ['blur', 'change'] }],
+          principalPerson: [{ required: true, trigger: 'change', message: '请选择负责人' }],
           date: [{ required: true, message: '不能为空', trigger: ['blur', 'change'] }],
           date: [{ required: true, message: '不能为空', trigger: ['blur', 'change'] }],
         },
         },
         dialogFormVisible: false,
         dialogFormVisible: false,
         planId: 0,
         planId: 0,
         workId: 0,
         workId: 0,
         title: '',
         title: '',
+        orderId: '',
+        multiple: '',
+        property: '',
+        label: '',
+        products: [],
+        allProducts: [],
+        deliverProducts: [],
+        installProducts: [],
+        selfProducts: [],
+        productEditable: false,
+        editable: false,
       }
       }
     },
     },
     mounted() {},
     mounted() {},
     methods: {
     methods: {
-      open(planId, row) {
+      open(planId, orderId, type, editable, row) {
+        this.theProgress = row
         this.planId = planId
         this.planId = planId
+        this.editable = editable
+        this.orderId = orderId
         if (row) {
         if (row) {
           this.workId = row.id
           this.workId = row.id
           this.title = '编辑'
           this.title = '编辑'
           this.form = {
           this.form = {
             progressTitle: row.progressTitle,
             progressTitle: row.progressTitle,
+            progressType: row.progressType,
             progressContext: row.progressContext,
             progressContext: row.progressContext,
             date: [row.startDate, row.endDate],
             date: [row.startDate, row.endDate],
             progressLevel: row.progressLevel,
             progressLevel: row.progressLevel,
+            principalPersonId: row.principalPersonId,
+            principalPerson: row.principalPerson,
             remark: row.remark,
             remark: row.remark,
           }
           }
         } else {
         } else {
           this.title = '新建工作项'
           this.title = '新建工作项'
+          this.form.progressType = type
           this.workId = 0
           this.workId = 0
         }
         }
+        this.getOrderDetails()
         this.dialogFormVisible = true
         this.dialogFormVisible = true
       },
       },
       close() {
       close() {
@@ -106,7 +236,7 @@
       save() {
       save() {
         this.$refs['form'].validate(async (valid) => {
         this.$refs['form'].validate(async (valid) => {
           if (valid) {
           if (valid) {
-            let params = Object.assign(this.form, { planId: this.planId })
+            let params = Object.assign(this.form, { planId: this.planId, deliverOrderId: this.orderId })
             params.startDate = this.form.date[0]
             params.startDate = this.form.date[0]
             params.endDate = this.form.date[1]
             params.endDate = this.form.date[1]
             if (this.workId) {
             if (this.workId) {
@@ -114,8 +244,38 @@
               const { msg } = await deliverWorkApi.update(params)
               const { msg } = await deliverWorkApi.update(params)
               this.$baseMessage(msg, 'success', 'vab-hey-message-success')
               this.$baseMessage(msg, 'success', 'vab-hey-message-success')
             } else {
             } else {
-              const { msg } = await deliverWorkApi.add(params)
-              this.$baseMessage(msg, 'success', 'vab-hey-message-success')
+              if (params.progressType == '10') {
+                if (!this.$refs.productTable.selection || this.$refs.productTable.selection == 0) {
+                  this.$baseMessage('未选中任何产品', 'error', 'vab-hey-message-error')
+                  return
+                }
+                for (let p of this.$refs.productTable.selection) {
+                  if (p.operateType == '') {
+                    this.$baseMessage('获取方式未选择', 'error', 'vab-hey-message-error')
+                    return
+                  }
+                }
+                let data = {
+                  progress: params,
+                  products: this.$refs.productTable.selection,
+                }
+                const { msg } = await deliverWorkApi.startDeliverGoodsProgress(data)
+                this.$baseMessage(msg, 'success', 'vab-hey-message-success')
+              } else if (params.progressType == '30') {
+                if (!this.$refs.productTable.selection || this.$refs.productTable.selection == 0) {
+                  this.$baseMessage('未选中任何产品', 'error', 'vab-hey-message-error')
+                  return
+                }
+                let data = {
+                  progress: params,
+                  products: this.$refs.productTable.selection,
+                }
+                const { msg } = await deliverWorkApi.startInstallProgress(data)
+                this.$baseMessage(msg, 'success', 'vab-hey-message-success')
+              } else {
+                const { msg } = await deliverWorkApi.add(params)
+                this.$baseMessage(msg, 'success', 'vab-hey-message-success')
+              }
             }
             }
 
 
             this.$emit('fetch-data')
             this.$emit('fetch-data')
@@ -123,6 +283,91 @@
           }
           }
         })
         })
       },
       },
+      // 查看附件
+      showFile(url, fileName) {
+        const xhr = new XMLHttpRequest()
+        xhr.open('GET', url, true)
+        xhr.responseType = 'blob' // 通过文件下载url拿到对应的blob对象
+        xhr.onload = () => {
+          if (xhr.status === 200) {
+            let link = document.createElement('a')
+            let body = document.querySelector('body')
+            link.href = window.URL.createObjectURL(xhr.response)
+            link.download = fileName
+            link.click()
+            this.$message.success('下载成功')
+            body.removeChild(link)
+            window.URL.revokeObjectURL(link.href)
+          }
+        }
+
+        xhr.send()
+      },
+      // 打开选择用户信息
+      openUser(multiple, property, label) {
+        this.multiple = multiple
+        this.property = property
+        this.label = label
+        if (this.form[property].length) {
+          this.$refs.user.ids = this.form[property]
+        } else if (this.form[property]) {
+          this.$refs.user.ids = [this.form[property]]
+        } else {
+          this.$refs.user.ids = []
+        }
+        this.$refs.user.open()
+      },
+      // 获取用户信息
+      getUser(userList, property, label) {
+        this.form[label] = userList.map((item) => item.nickName).join()
+        if (this.multiple) {
+          this.form[property] = userList.map((item) => item.id)
+        } else {
+          this.form[property] = userList[0] ? userList[0].id : ''
+        }
+        this.$forceUpdate()
+      },
+      async getOrderDetails() {
+        this.products = []
+        this.allProducts = []
+        this.deliverProducts = []
+        this.installProducts = []
+        this.selfProducts = []
+        this.productEditable = false
+        const [err, res] = await to(orderWorkApi.getDeliverOrder({ id: this.orderId }))
+        if (err) return
+        if (res.code == 200 && res.data) {
+          this.allProducts = res.data.product
+        }
+        for (let p of this.allProducts) {
+          p = JSON.parse(JSON.stringify(p))
+          if (p.isDeliver != '20') {
+            this.deliverProducts.push(p)
+          }
+          // 10发货任务单/20组装任务单/30部署安装单
+          if (
+            (p.deliverProgressId && p.deliverProgressId != 0 && this.form.progressType == '10') ||
+            (p.assembleProgressId && p.assembleProgressId != 0 && this.form.progressType == '20') ||
+            (p.installProgressId && p.installProgressId != 0 && this.form.progressType == '30')
+          ) {
+            this.selfProducts.push(p)
+          }
+          if (p.isComplete == '20') {
+            this.installProducts.push(p)
+          }
+        }
+        this.$forceUpdate()
+        if (this.workId != 0) {
+          this.products = this.selfProducts
+        } else {
+          if (this.form.progressType == '10') {
+            this.productEditable = true
+            this.products = this.deliverProducts
+          } else if (this.form.progressType == '30') {
+            this.products = this.installProducts
+          }
+        }
+      },
     },
     },
   }
   }
 </script>
 </script>

+ 188 - 0
src/views/work/deliver/components/inspect.vue

@@ -0,0 +1,188 @@
+<template>
+  <el-dialog :title="title" :visible.sync="dialogFormVisible" width="500px">
+    <el-form ref="form" label-position="top" :model="form" :rules="rules">
+      <el-row :gutter="20">
+        <el-col :span="24">
+          <el-form-item label="附件" prop="fileUrl">
+            <el-upload
+              ref="uploadRef"
+              action="#"
+              :before-upload="
+                (file) => {
+                  return beforeAvatarUpload(file)
+                }
+              "
+              :http-request="uploadRequest"
+              :limit="1">
+              <el-button size="mini" type="primary">点击上传</el-button>
+            </el-upload>
+            <el-button v-show="form.fileUrl != ''" @click="showFile(form.fileUrl)">查看</el-button>
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="选择到货日期" prop="date">
+            <el-date-picker
+              v-model="form.date"
+              placeholder="请选择日期"
+              style="width: 100%"
+              type="date"
+              value-format="yyyy-MM-dd HH:mm:ss" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <template #footer>
+      <el-button @click="dialogFormVisible = false">取 消</el-button>
+      <el-button type="primary" @click="inspect">确 定</el-button>
+    </template>
+  </el-dialog>
+</template>
+
+<script>
+  import deliverWorkApi from '@/api/work/deliverWork'
+  import to from 'await-to-js'
+  import axios from 'axios'
+  import asyncUploadFile from '@/utils/uploadajax'
+
+  export default {
+    name: 'Inspect',
+    components: {},
+    props: {
+      // orderStatusOptions: {
+      //   type: Array,
+      //   default: () => [],
+      // },
+    },
+    data() {
+      return {
+        form: {
+          date: '',
+          fileUrl: '',
+          fileName: '',
+          remark: '',
+        },
+        progress: {},
+        rules: {
+          fileUrl: [{ required: true, message: '不能为空', trigger: ['blur', 'change'] }],
+          date: [{ required: true, message: '不能为空', trigger: ['blur', 'change'] }],
+        },
+        dialogFormVisible: false,
+        planId: 0,
+        title: '',
+        fileSettings: {
+          // 文件配置信息
+          fileSize: 52428800,
+          fileTypes: '.doc,.docx,.zip,.xls,.xlsx,.rar,.jpg,.jpeg,.gif,.png,.jfif,.txt',
+          pictureSize: 52428800,
+          pictureTypes: '.jpg,.jpeg,.gif,.png,.jfif,.txt',
+          types: '.doc,.docx,.zip,.xls,.xlsx,.rar,.jpg,.jpeg,.gif,.png,.jfif,.mp4,.txt',
+          videoSize: 104857600,
+          videoType: '.mp4',
+        },
+      }
+    },
+    mounted() {},
+    methods: {
+      // 打开弹窗
+      open(row) {
+        this.title = '验收'
+        this.progress = row
+        this.form.date = ''
+        this.form.fileUrl = ''
+        this.form.fileName = ''
+        this.form.remark = ''
+        if (this.$refs['form']) {
+          this.$refs['form'].resetFields()
+        }
+        if (this.$refs.uploadRef) {
+          this.$refs.uploadRef.clearFiles() //去掉文件列表
+        }
+        this.dialogFormVisible = true
+      },
+      // 上传附件
+      beforeAvatarUpload(file) {
+        let flag1 = file.size < this.fileSettings.fileSize
+        if (!flag1) {
+          this.$message.warning('文件过大,请重新选择!')
+          return false
+        }
+        let flag2 = this.fileSettings.fileTypes.split(',').includes('.' + file.name.split('.').pop())
+        if (!flag2) {
+          this.$message.warning('文件类型不符合,请重新选择!')
+          return false
+        }
+        return true
+      },
+      // 上传
+      uploadRequest(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(() => {
+                _this.form.fileName = option.file.name
+                _this.form.fileUrl = `${process.env.VUE_APP_PROTOCOL}${res.data.publicUrl}/${res.data.fid}` // 资料存储url
+              })
+            } else {
+              _this.$message({
+                type: 'warning',
+                message: '未上传成功!请刷新界面重新上传!',
+              })
+            }
+          })
+          .catch(function () {
+            _this.$message({
+              type: 'warning',
+              message: '未上传成功!请重新上传!',
+            })
+          })
+      },
+      // 查看附件
+      showFile(url) {
+        let fileName = this.form.fileName
+        const xhr = new XMLHttpRequest()
+        xhr.open('GET', url, true)
+        xhr.responseType = 'blob' // 通过文件下载url拿到对应的blob对象
+        xhr.onload = () => {
+          if (xhr.status === 200) {
+            let link = document.createElement('a')
+            let body = document.querySelector('body')
+            link.href = window.URL.createObjectURL(xhr.response)
+            link.download = fileName
+            link.click()
+            this.$message.success('下载成功')
+            body.removeChild(link)
+            window.URL.revokeObjectURL(link.href)
+          }
+        }
+
+        xhr.send()
+      },
+      // 完成
+      async inspect() {
+        this.$refs['form'].validate(async (valid) => {
+          if (valid) {
+            // 10发货任务单/20组装任务单/30部署安装单
+            const [err, res] = await to(
+              deliverWorkApi.inspectGoods({
+                id: this.progress.id,
+                arrivalTime: this.form.date,
+                fileUrl: this.form.fileUrl,
+                fileName: this.form.fileName,
+              })
+            )
+            if (err) return
+            if (res.code == 200) {
+              this.$baseMessage(res.msg, 'success', 'vab-hey-message-success')
+              this.$emit('fetch-data')
+            }
+            this.dialogFormVisible = false
+          }
+        })
+      },
+    },
+  }
+</script>

+ 79 - 0
src/views/work/deliver/components/start.vue

@@ -0,0 +1,79 @@
+<template>
+  <el-dialog title="启动" :visible.sync="dialogFormVisible" @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="requiredDeliveryTime">
+            <el-date-picker
+              v-model="form.requiredDeliveryTime"
+              placeholder="要求发货时间"
+              type="date"
+              value-format="yyyy-MM-dd HH:mm:ss" />
+          </el-form-item>
+          <el-form-item label="收货信息" prop="receivingInfo">
+            <el-input v-model="form.receivingInfo" placeholder="收货信息" :rows="5" show-word-limit type="textarea" />
+          </el-form-item>
+          <el-form-item label="特殊要求说明" prop="specialRequirements">
+            <el-input
+              v-model="form.specialRequirements"
+              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 deliverApi from '@/api/work/deliver'
+
+  export default {
+    name: 'WorkOrderFeedback',
+    data() {
+      return {
+        form: {
+          orderId: '',
+          requiredDeliveryTime: '',
+          receivingInfo: '',
+          specialRequirements: '',
+        },
+        rules: {
+          requiredDeliveryTime: [{ required: true, message: '不能为空', trigger: ['blur', 'change'] }],
+          receivingInfo: [{ required: true, message: '不能为空', trigger: ['blur', 'change'] }],
+        },
+        dialogFormVisible: false,
+      }
+    },
+    mounted() {},
+    methods: {
+      showEdit(row) {
+        this.form.orderId = row.id
+        this.form.requiredDeliveryTime = ''
+        this.form.receivingInfo = ''
+        this.form.specialRequirements = ''
+        this.dialogFormVisible = true
+      },
+      close() {
+        this.$refs['form'].resetFields()
+        this.dialogFormVisible = false
+      },
+      save() {
+        this.$refs['form'].validate(async (valid) => {
+          if (valid) {
+            const { msg } = await deliverApi.start(this.form)
+            this.$baseMessage(msg, 'success', 'vab-hey-message-success')
+            this.$emit('fetch-data')
+            this.close()
+          }
+        })
+      },
+    },
+  }
+</script>

+ 4 - 4
src/views/work/deliver/components/updateUser.vue

@@ -1,8 +1,8 @@
 <template>
 <template>
-  <el-dialog title="更新成员信息" :visible.sync="dialogFormVisible" @close="close">
+  <el-dialog title="更新成员信息" :visible.sync="dialogFormVisible" width="33%" @close="close">
     <el-form ref="form" label-position="top" :model="form" :rules="rules">
     <el-form ref="form" label-position="top" :model="form" :rules="rules">
       <el-row :gutter="20">
       <el-row :gutter="20">
-        <el-col :span="12">
+        <!-- <el-col :span="12">
           <el-form-item label="项目经理" prop="projectManId">
           <el-form-item label="项目经理" prop="projectManId">
             <el-input
             <el-input
               v-model="form.projectManName"
               v-model="form.projectManName"
@@ -10,8 +10,8 @@
               suffix-icon="el-icon-search"
               suffix-icon="el-icon-search"
               @focus="handleSelectUser('projectManId', 'projectManName')" />
               @focus="handleSelectUser('projectManId', 'projectManName')" />
           </el-form-item>
           </el-form-item>
-        </el-col>
-        <el-col :span="12">
+        </el-col> -->
+        <el-col :span="24">
           <el-form-item label="交付经理" prop="deliverManId">
           <el-form-item label="交付经理" prop="deliverManId">
             <el-input
             <el-input
               v-model="form.deliverManName"
               v-model="form.deliverManName"

+ 47 - 3
src/views/work/deliver/index.vue

@@ -67,12 +67,23 @@
           <span v-else-if="item.prop === 'createdTime'">
           <span v-else-if="item.prop === 'createdTime'">
             {{ parseTime(row.createdTime, '{y}-{m}-{d}') }}
             {{ parseTime(row.createdTime, '{y}-{m}-{d}') }}
           </span>
           </span>
+          <span v-else-if="item.prop === 'requiredDeliveryTime'">
+            {{ parseTime(row.requiredDeliveryTime, '{y}-{m}-{d}') }}
+          </span>
           <span v-else>{{ row[item.prop] }}</span>
           <span v-else>{{ row[item.prop] }}</span>
         </template>
         </template>
       </el-table-column>
       </el-table-column>
-      <el-table-column align="center" fixed="right" label="操作" width="90">
+      <el-table-column align="center" fixed="right" label="操作" width="120">
         <template #default="{ row }">
         <template #default="{ row }">
-          <el-button type="text" @click="handleUpdateUser(row)">成员</el-button>
+          <el-button
+            v-if="row.orderType == '20' && row.orderStatus == 10 && userId == row.saleId"
+            type="text"
+            @click="handleStart(row)">
+            启动
+          </el-button>
+          <el-button v-if="row.orderType != '20' && !row.deliverManName" type="text" @click="handleUpdateUser(row)">
+            成员
+          </el-button>
           <el-button v-if="row.orderStatus != 20" type="text" @click="handleFinish(row)">完成</el-button>
           <el-button v-if="row.orderStatus != 20" type="text" @click="handleFinish(row)">完成</el-button>
         </template>
         </template>
       </el-table-column>
       </el-table-column>
@@ -95,6 +106,8 @@
     <finish ref="finish" @fetch-data="restFetchData" />
     <finish ref="finish" @fetch-data="restFetchData" />
     <!-- 更新项目经理交付经理 -->
     <!-- 更新项目经理交付经理 -->
     <update-user ref="updateUser" @fetch-data="restFetchData" />
     <update-user ref="updateUser" @fetch-data="restFetchData" />
+    <!-- 交付工单启动 -->
+    <start ref="startOrder" @fetch-data="restFetchData" />
   </div>
   </div>
 </template>
 </template>
 
 
@@ -103,11 +116,13 @@
   import deliverApi from '@/api/work/deliver'
   import deliverApi from '@/api/work/deliver'
   import TableTool from '@/components/table/TableTool'
   import TableTool from '@/components/table/TableTool'
   import Finish from './components/finish'
   import Finish from './components/finish'
+  import start from './components/start'
   import UpdateUser from './components/updateUser'
   import UpdateUser from './components/updateUser'
+  import { mapGetters } from 'vuex'
 
 
   export default {
   export default {
     name: 'WorkOrder',
     name: 'WorkOrder',
-    components: { TableTool, Finish, UpdateUser },
+    components: { TableTool, Finish, start, UpdateUser },
     data() {
     data() {
       return {
       return {
         activeName: 'first',
         activeName: 'first',
@@ -171,6 +186,26 @@
             width: '120px',
             width: '120px',
             prop: 'product',
             prop: 'product',
           },
           },
+          {
+            label: '产品',
+            width: '120px',
+            prop: 'products',
+          },
+          {
+            label: '要求发货时间',
+            width: '120px',
+            prop: 'requiredDeliveryTime',
+          },
+          {
+            label: '收货信息',
+            width: '120px',
+            prop: 'receivingInfo',
+          },
+          {
+            label: '特殊要求说明',
+            width: '120px',
+            prop: 'specialRequirements',
+          },
           {
           {
             label: '完成信息',
             label: '完成信息',
             width: 'auto',
             width: 'auto',
@@ -186,6 +221,11 @@
         productLineOptions: [],
         productLineOptions: [],
       }
       }
     },
     },
+    computed: {
+      ...mapGetters({
+        userId: 'user/id',
+      }),
+    },
     watch: {
     watch: {
       showColumns: function () {
       showColumns: function () {
         this.$nextTick(() => this.$refs.table.doLayout())
         this.$nextTick(() => this.$refs.table.doLayout())
@@ -225,6 +265,10 @@
         }
         }
         this.$nextTick(() => this.$refs.table.doLayout())
         this.$nextTick(() => this.$refs.table.doLayout())
       },
       },
+      // 启动
+      handleStart(row) {
+        this.$refs['startOrder'].showEdit(row)
+      },
       handleFinish(row) {
       handleFinish(row) {
         this.$refs['finish'].showEdit(row)
         this.$refs['finish'].showEdit(row)
       },
       },

+ 188 - 16
src/views/work/deliver/plan.vue

@@ -79,18 +79,35 @@
               <el-form-item>
               <el-form-item>
                 <el-button icon="el-icon-search" type="primary" @click="fetchWorkList">查询</el-button>
                 <el-button icon="el-icon-search" type="primary" @click="fetchWorkList">查询</el-button>
                 <el-button icon="el-icon-refresh-right" @click="reset">重置</el-button>
                 <el-button icon="el-icon-refresh-right" @click="reset">重置</el-button>
+                <el-button @click="back">返回</el-button>
               </el-form-item>
               </el-form-item>
             </el-form>
             </el-form>
           </vab-query-form-top-panel>
           </vab-query-form-top-panel>
           <vab-query-form-left-panel>
           <vab-query-form-left-panel>
             <el-button
             <el-button
-              v-show="workOrderStatus != 20 && curPlanStatus != 30"
+              v-show="workOrderStatus != 20 && curPlanStatus != 30 && orderType == '10'"
               v-permissions="['order:delivery:work:add']"
               v-permissions="['order:delivery:work:add']"
               icon="el-icon-plus"
               icon="el-icon-plus"
               type="primary"
               type="primary"
-              @click="openAddWork">
+              @click="openAddWork('')">
               新建工作项
               新建工作项
             </el-button>
             </el-button>
+            <el-button
+              v-show="workOrderStatus != 20 && curPlanStatus != 30 && orderType == '20'"
+              v-permissions="['order:delivery:work:adddeliver']"
+              icon="el-icon-plus"
+              type="primary"
+              @click="openAddWork('10')">
+              生成发货任务单
+            </el-button>
+            <el-button
+              v-show="workOrderStatus != 20 && curPlanStatus != 30 && orderType == '20'"
+              v-permissions="['order:delivery:work:addinstall']"
+              icon="el-icon-plus"
+              type="primary"
+              @click="openAddWork('30')">
+              生成部署安装单
+            </el-button>
           </vab-query-form-left-panel>
           </vab-query-form-left-panel>
           <vab-query-form-right-panel>
           <vab-query-form-right-panel>
             <table-tool :columns="columns" :show-columns.sync="showColumns" table-type="deliveryPlanTable" />
             <table-tool :columns="columns" :show-columns.sync="showColumns" table-type="deliveryPlanTable" />
@@ -133,7 +150,7 @@
                 </el-select>
                 </el-select>
               </span>
               </span>
               <span v-else-if="item.prop === 'progressStatus'">
               <span v-else-if="item.prop === 'progressStatus'">
-                {{ plasnStatusObj[row.progressStatus] }}
+                {{ progressStatusObj[row.progressStatus] }}
               </span>
               </span>
               <span v-else-if="item.prop === 'startDate'">
               <span v-else-if="item.prop === 'startDate'">
                 {{ parseTime(row.startDate, '{y}-{m}-{d}') }}
                 {{ parseTime(row.startDate, '{y}-{m}-{d}') }}
@@ -147,26 +164,91 @@
               <span v-else-if="item.prop === 'reaEndDate'">
               <span v-else-if="item.prop === 'reaEndDate'">
                 {{ parseTime(row.reaEndDate, '{y}-{m}-{d}') }}
                 {{ parseTime(row.reaEndDate, '{y}-{m}-{d}') }}
               </span>
               </span>
+              <span v-else-if="item.prop == 'progressType'">
+                {{ getProgressType(row.progressType) }}
+              </span>
               <span v-else>{{ row[item.prop] }}</span>
               <span v-else>{{ row[item.prop] }}</span>
             </template>
             </template>
           </el-table-column>
           </el-table-column>
           <el-table-column align="center" fixed="right" label="操作" show-overflow-tooltip width="120">
           <el-table-column align="center" fixed="right" label="操作" show-overflow-tooltip width="120">
             <template #default="{ row }">
             <template #default="{ row }">
               <el-button
               <el-button
-                v-if="row.progressStatus == 10 && workOrderStatus != 20 && curPlanStatus != 30"
+                v-if="
+                  row.progressStatus == 10 &&
+                  workOrderStatus != 20 &&
+                  curPlanStatus != 30 &&
+                  userId == row.principalPersonId
+                "
                 type="text"
                 type="text"
                 @click="handleStartWork(row)">
                 @click="handleStartWork(row)">
                 开始
                 开始
               </el-button>
               </el-button>
               <el-button
               <el-button
-                v-if="row.progressStatus == 20 && workOrderStatus != 20 && curPlanStatus != 30"
+                v-if="
+                  row.progressStatus == 20 &&
+                  row.deliverStatus == '20' &&
+                  row.progressType == '10' &&
+                  userId == row.principalPersonId
+                "
+                type="text"
+                @click="handleDeliverGoods(row)">
+                发货
+              </el-button>
+              <el-button
+                v-if="
+                  row.progressStatus == 20 && row.deliverStatus == '30' && row.progressType == '10' && userId == saleId
+                "
+                type="text"
+                @click="handleInspectGoods(row)">
+                验收
+              </el-button>
+              <el-button
+                v-if="
+                  row.progressStatus == 20 &&
+                  row.deliverStatus == '40' &&
+                  row.progressType == '10' &&
+                  userId == row.principalPersonId
+                "
+                type="text"
+                @click="handleConfirmArrival(row)">
+                确认到货
+              </el-button>
+              <el-button
+                v-if="
+                  row.progressStatus == 20 &&
+                  workOrderStatus != 20 &&
+                  curPlanStatus != 30 &&
+                  row.progressType == '' &&
+                  userId == row.principalPersonId
+                "
+                type="text"
+                @click="handleFinishWork(row)">
+                完成
+              </el-button>
+              <el-button
+                v-if="
+                  row.progressStatus == 20 &&
+                  row.deliverStatus == '60' &&
+                  row.progressType == '10' &&
+                  userId == row.principalPersonId
+                "
                 type="text"
                 type="text"
                 @click="handleFinishWork(row)">
                 @click="handleFinishWork(row)">
                 完成
                 完成
               </el-button>
               </el-button>
-              <el-button v-show="workOrderStatus != 20 && curPlanStatus != 30" type="text" @click="handleDelete(row)">
-                删除
+              <el-button
+                v-if="row.progressStatus == 20 && row.progressType == '20' && userId == row.principalPersonId"
+                type="text"
+                @click="handleComplete(row)">
+                完成
+              </el-button>
+              <el-button
+                v-if="row.progressStatus == 20 && row.progressType == '30' && userId == row.principalPersonId"
+                type="text"
+                @click="handleComplete(row)">
+                完成
               </el-button>
               </el-button>
+              <!-- <el-button v-show="row.progressStatus == 10" type="text" @click="handleDelete(row)">删除</el-button> -->
             </template>
             </template>
           </el-table-column>
           </el-table-column>
           <template #empty>
           <template #empty>
@@ -185,6 +267,12 @@
       <edit-plan ref="plan" @fetch-data="fetchPlanList" />
       <edit-plan ref="plan" @fetch-data="fetchPlanList" />
       <edit-work ref="work" @fetch-data="fetchWorkListPage1" />
       <edit-work ref="work" @fetch-data="fetchWorkListPage1" />
       <select-status ref="status" @fetch-data="fetchPlanList" />
       <select-status ref="status" @fetch-data="fetchPlanList" />
+      <!-- 完成 -->
+      <completeProgress ref="complete" @fetch-data="fetchWorkListPage1" />
+      <!-- 发货 -->
+      <deliver ref="deliver" @fetch-data="fetchPlanList" />
+      <!-- 验收 -->
+      <inspect ref="inspect" @fetch-data="fetchWorkListPage1" />
     </div>
     </div>
   </div>
   </div>
 </template>
 </template>
@@ -198,11 +286,18 @@
   import EditWork from '@/views/work/deliver/components/editWork'
   import EditWork from '@/views/work/deliver/components/editWork'
   import selectStatus from './components/selectStatus'
   import selectStatus from './components/selectStatus'
   import to from 'await-to-js'
   import to from 'await-to-js'
+  import completeProgress from '@/views/work/deliver/components/completeProgress'
+  import deliver from '@/views/work/deliver/components/deliver'
+  import inspect from '@/views/work/deliver/components/inspect'
+  import { mapGetters } from 'vuex'
+
   export default {
   export default {
     name: 'Product',
     name: 'Product',
-    components: { EditPlan, EditWork, TableTool, selectStatus },
+    components: { EditPlan, EditWork, TableTool, selectStatus, completeProgress, deliver, inspect },
     data() {
     data() {
       return {
       return {
+        orderType: '',
+        saleId: '',
         planList: [], //左侧工单列表
         planList: [], //左侧工单列表
         curPlanId: -1,
         curPlanId: -1,
         tabaleList: [],
         tabaleList: [],
@@ -211,6 +306,11 @@
           20: '已开始',
           20: '已开始',
           30: '已关闭',
           30: '已关闭',
         },
         },
+        progressStatusObj: {
+          10: '未开始',
+          20: '进行中',
+          30: '已完成',
+        },
         progressLevelOptions: {
         progressLevelOptions: {
           10: '最高',
           10: '最高',
           20: '普通',
           20: '普通',
@@ -237,18 +337,30 @@
             disableCheck: true,
             disableCheck: true,
           },
           },
           {
           {
-            label: '任务内容',
-            prop: 'progressContext',
-            minWidth: 'auto',
+            label: '任务类型',
+            width: '120px',
+            prop: 'progressType',
             sortable: false,
             sortable: false,
-            disableCheck: true,
           },
           },
+          // {
+          //   label: '任务内容',
+          //   prop: 'progressContext',
+          //   minWidth: 'auto',
+          //   sortable: false,
+          //   disableCheck: true,
+          // },
           {
           {
             label: '优先级',
             label: '优先级',
             width: '120px',
             width: '120px',
             prop: 'progressLevel',
             prop: 'progressLevel',
             sortable: false,
             sortable: false,
           },
           },
+          {
+            label: '负责人',
+            width: '120px',
+            prop: 'principalPerson',
+            sortable: false,
+          },
           {
           {
             label: '状态',
             label: '状态',
             width: '120px',
             width: '120px',
@@ -298,6 +410,11 @@
         workOrderStatus: 0,
         workOrderStatus: 0,
       }
       }
     },
     },
+    computed: {
+      ...mapGetters({
+        userId: 'user/id',
+      }),
+    },
     watch: {
     watch: {
       showColumns: function () {
       showColumns: function () {
         this.$nextTick(() => this.$refs.table.doLayout())
         this.$nextTick(() => this.$refs.table.doLayout())
@@ -309,6 +426,58 @@
       this.fetchPlanList()
       this.fetchPlanList()
     },
     },
     methods: {
     methods: {
+      // 返回
+      back() {
+        this.$router.push({
+          name: 'DeliveryWorkOrder',
+          // params: this.$route.params,
+        })
+      },
+      // 获取任务类型
+      getProgressType(type) {
+        if (type == '') {
+          return '软件任务单'
+        } else if (type == '10') {
+          return '发货任务单'
+        } else if (type == '20') {
+          return '组装任务单'
+        } else if (type == '30') {
+          return '部署安装单'
+        }
+        return '未知类型'
+      },
+      // 打开组装完成弹窗
+      handleComplete(row) {
+        this.$refs.complete.open(row)
+      },
+      // 发货
+      handleDeliverGoods(row) {
+        this.$refs.deliver.open(row)
+      },
+      // 验收
+      handleInspectGoods(row) {
+        this.$refs.inspect.open(row)
+      },
+      // 确认到货
+      async handleConfirmArrival(row) {
+        this.$prompt('你确定货物已到达吗', '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+        })
+          .then(async ({ value }) => {
+            // 当用户点击确定按钮时,执行的逻辑
+            const [err, res] = await to(deliverWorkApi.confirmArrival({ id: row.id, remark: value }))
+            if (err) return
+            if (res.code == 200) {
+              this.$baseMessage(res.msg, 'success', 'vab-hey-message-success')
+              this.fetchWorkList()
+            }
+          })
+          .catch(() => {
+            // 当用户点击取消按钮时,执行的逻辑
+            console.log('取消输入')
+          })
+      },
       openChangeStatus(v) {
       openChangeStatus(v) {
         if (this.workOrderStatus == 20 || v.planStatus == 30) return
         if (this.workOrderStatus == 20 || v.planStatus == 30) return
         this.$refs.status.open(v.id)
         this.$refs.status.open(v.id)
@@ -350,13 +519,12 @@
         this.$refs.plan.open(id)
         this.$refs.plan.open(id)
       },
       },
       // 新增工作项
       // 新增工作项
-      openAddWork() {
-        this.$refs.work.open(this.curPlanId)
+      openAddWork(type) {
+        this.$refs.work.open(this.curPlanId, parseInt(this.id), type, true)
       },
       },
       //工作项详情
       //工作项详情
       handleWorkDetail(row) {
       handleWorkDetail(row) {
-        if (this.workOrderStatus == 20 || this.curPlanStatus == 30 || row.progressStatus == 30) return
-        this.$refs['work'].open(this.planId, row)
+        this.$refs['work'].open(this.planId, parseInt(this.id), '', row.progressStatus != 30, row)
       },
       },
       // 开始工作项
       // 开始工作项
       async handleStartWork(row) {
       async handleStartWork(row) {
@@ -438,10 +606,14 @@
         }
         }
       },
       },
       async getOrderDetails() {
       async getOrderDetails() {
+        this.saleId = ''
+        this.orderType = ''
         const [err, res] = await to(orderWorkApi.getDeliverOrder({ id: this.id }))
         const [err, res] = await to(orderWorkApi.getDeliverOrder({ id: this.id }))
         if (err) return
         if (err) return
         if (res.code == 200 && res.data) {
         if (res.code == 200 && res.data) {
           this.workOrderStatus = res.data.orderStatus || 10
           this.workOrderStatus = res.data.orderStatus || 10
+          this.saleId = res.data.saleId
+          this.orderType = res.data.orderType
         }
         }
       },
       },
       // 查询工作项
       // 查询工作项

+ 468 - 0
src/views/work/deliver/progress.vue

@@ -0,0 +1,468 @@
+<template>
+  <div class="list-container">
+    <vab-query-form>
+      <vab-query-form-top-panel>
+        <el-form ref="queryForm" :inline="true" :model="queryForm" @submit.native.prevent>
+          <el-form-item prop="progressTitle">
+            <el-input v-model="queryForm.progressTitle" placeholder="任务标题" @keyup.enter.native="restFetchData" />
+          </el-form-item>
+          <el-form-item prop="progressType">
+            <el-select
+              v-model="queryForm.progressType"
+              clearable
+              placeholder="任务类型"
+              style="width: 100%"
+              @keyup.enter.native="restFetchData">
+              <el-option label="发货任务单" value="10" />
+              <el-option label="组装任务单" value="20" />
+              <el-option label="部署安装单" value="30" />
+            </el-select>
+          </el-form-item>
+          <el-form-item prop="progressStatus">
+            <el-select
+              v-model="queryForm.progressStatus"
+              clearable
+              placeholder="任务状态"
+              style="width: 100%"
+              @keyup.enter.native="restFetchData">
+              <el-option label="未开始" value="10" />
+              <el-option label="进行中" value="20" />
+              <el-option label="已完成" value="30" />
+            </el-select>
+          </el-form-item>
+          <el-form-item>
+            <el-button icon="el-icon-search" type="primary" @click="restFetchData">查询</el-button>
+            <el-button icon="el-icon-refresh-right" @click="reset">重置</el-button>
+          </el-form-item>
+        </el-form>
+      </vab-query-form-top-panel>
+      <vab-query-form-left-panel :span="12" />
+      <vab-query-form-right-panel :span="12">
+        <table-tool :columns="columns" :show-columns.sync="showColumns" table-type="ProgressTable" />
+      </vab-query-form-right-panel>
+    </vab-query-form>
+
+    <el-table ref="table" v-loading="listLoading" border :data="list" :height="$baseTableHeight(2)">
+      <el-table-column align="center" label="序号" show-overflow-tooltip width="80">
+        <template #default="{ $index }">
+          {{ $index + 1 }}
+        </template>
+      </el-table-column>
+      <el-table-column
+        v-for="(item, index) in showColumns"
+        :key="index"
+        align="center"
+        :label="item.label"
+        :min-width="item.minWidth"
+        :prop="item.prop"
+        show-overflow-tooltip
+        :sortable="item.sortable"
+        :width="item.width">
+        <template #default="{ row }">
+          <el-button
+            v-if="item.prop === 'progressTitle'"
+            style="font-size: 14px"
+            type="text"
+            @click="handleWorkDetail(row)">
+            {{ row.progressTitle }}
+          </el-button>
+          <span v-else-if="item.prop === 'progressLevel'">
+            <el-select
+              v-model="row.progressLevel"
+              :disabled="row.progressStatus == 30"
+              placeholder="请选择"
+              @change="changeprogressLevel($event, row)">
+              <el-option label="最高" value="10" />
+              <el-option label="普通" value="20" />
+              <el-option label="较低" value="30" />
+            </el-select>
+          </span>
+          <span v-else-if="item.prop === 'progressStatus'">
+            {{ progressStatusObj[row.progressStatus] }}
+          </span>
+          <span v-else-if="item.prop === 'startDate'">
+            {{ parseTime(row.startDate, '{y}-{m}-{d}') }}
+          </span>
+          <span v-else-if="item.prop === 'endDate'">
+            {{ parseTime(row.endDate, '{y}-{m}-{d}') }}
+          </span>
+          <span v-else-if="item.prop === 'reaStartDate'">
+            {{ parseTime(row.reaStartDate, '{y}-{m}-{d}') }}
+          </span>
+          <span v-else-if="item.prop === 'reaEndDate'">
+            {{ parseTime(row.reaEndDate, '{y}-{m}-{d}') }}
+          </span>
+          <span v-else-if="item.prop == 'progressType'">
+            {{ getProgressType(row.progressType) }}
+          </span>
+          <span v-else>{{ row[item.prop] }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column align="center" fixed="right" label="操作" show-overflow-tooltip width="120">
+        <template #default="{ row }">
+          <el-button
+            v-if="row.progressStatus == 10 && userId == row.principalPersonId"
+            type="text"
+            @click="handleStartWork(row)">
+            开始
+          </el-button>
+          <el-button
+            v-if="
+              row.progressStatus == 20 &&
+              row.deliverStatus == '20' &&
+              row.progressType == '10' &&
+              userId == row.principalPersonId
+            "
+            type="text"
+            @click="handleDeliverGoods(row)">
+            发货
+          </el-button>
+          <el-button
+            v-if="row.progressStatus == 20 && row.deliverStatus == '30' && row.progressType == '10' && userId == saleId"
+            type="text"
+            @click="handleInspectGoods(row)">
+            验收
+          </el-button>
+          <el-button
+            v-if="
+              row.progressStatus == 20 &&
+              row.deliverStatus == '40' &&
+              row.progressType == '10' &&
+              userId == row.principalPersonId
+            "
+            type="text"
+            @click="handleConfirmArrival(row)">
+            确认到货
+          </el-button>
+          <el-button
+            v-if="row.progressStatus == 20 && row.progressType == '' && userId == row.principalPersonId"
+            type="text"
+            @click="handleFinishWork(row)">
+            完成
+          </el-button>
+          <el-button
+            v-if="
+              row.progressStatus == 20 &&
+              row.deliverStatus == '60' &&
+              row.progressType == '10' &&
+              userId == row.principalPersonId
+            "
+            type="text"
+            @click="handleFinishWork(row)">
+            完成
+          </el-button>
+          <el-button
+            v-if="row.progressStatus == 20 && row.progressType == '20' && userId == row.principalPersonId"
+            type="text"
+            @click="handleComplete(row)">
+            完成
+          </el-button>
+          <el-button
+            v-if="row.progressStatus == 20 && row.progressType == '30' && userId == row.principalPersonId"
+            type="text"
+            @click="handleComplete(row)">
+            完成
+          </el-button>
+          <!-- <el-button v-show="row.progressStatus == 10" type="text" @click="handleDelete(row)">删除</el-button> -->
+        </template>
+      </el-table-column>
+      <template #empty>
+        <el-image class="vab-data-empty" :src="require('@/assets/empty_images/data_empty.png')" />
+      </template>
+    </el-table>
+
+    <el-pagination
+      background
+      :current-page="queryForm.pageNum"
+      :layout="layout"
+      :page-size="queryForm.pageSize"
+      :total="total"
+      @current-change="handleCurrentChange"
+      @size-change="handleSizeChange" />
+    <!-- 完成 -->
+    <completeProgress ref="complete" @fetch-data="fetchData" />
+    <!-- 发货 -->
+    <deliver ref="deliver" @fetch-data="fetchData" />
+    <!-- 验收 -->
+    <inspect ref="inspect" @fetch-data="fetchData" />
+    <!-- 编辑、详情 -->
+    <edit-work ref="work" @fetch-data="fetchData" />
+  </div>
+</template>
+
+<script>
+  import to from 'await-to-js'
+  import TableTool from '@/components/table/TableTool'
+  import deliverWorkApi from '@/api/work/deliverWork'
+  import { mapGetters } from 'vuex'
+  import completeProgress from '@/views/work/deliver/components/completeProgress'
+  import deliver from '@/views/work/deliver/components/deliver'
+  import inspect from '@/views/work/deliver/components/inspect'
+  import EditWork from '@/views/work/deliver/components/editWork'
+
+  export default {
+    name: 'Progress',
+    components: { TableTool, completeProgress, deliver, inspect, EditWork },
+    data() {
+      return {
+        progressStatusObj: {
+          10: '未开始',
+          20: '进行中',
+          30: '已完成',
+        },
+        layout: 'total, sizes, prev, pager, next, jumper',
+        queryForm: {
+          progressTitle: '',
+          progressType: '',
+          progressStatus: '',
+          pageNum: 1,
+          pageSize: 10,
+          isPrincipalPerson: '1',
+        },
+        total: 0,
+        listLoading: false,
+        list: [],
+        showColumns: [],
+        columns: [
+          {
+            label: '任务标题',
+            width: '160px',
+            prop: 'progressTitle',
+            sortable: false,
+            disableCheck: true,
+          },
+          {
+            label: '任务类型',
+            width: '120px',
+            prop: 'progressType',
+            sortable: false,
+          },
+          // {
+          //   label: '任务内容',
+          //   prop: 'progressContext',
+          //   minWidth: 'auto',
+          //   sortable: false,
+          //   disableCheck: true,
+          // },
+          {
+            label: '优先级',
+            width: '120px',
+            prop: 'progressLevel',
+            sortable: false,
+          },
+          {
+            label: '负责人',
+            width: '120px',
+            prop: 'principalPerson',
+            sortable: false,
+          },
+          {
+            label: '状态',
+            width: '120px',
+            prop: 'progressStatus',
+            sortable: false,
+          },
+          {
+            label: '计划开始时间',
+            width: '160px',
+            prop: 'startDate',
+            sortable: false,
+          },
+
+          {
+            label: '计划结束时间',
+            width: '160px',
+            prop: 'endDate',
+            sortable: false,
+          },
+          {
+            label: '实际开始时间',
+            width: '160px',
+            prop: 'reaStartDate',
+            sortable: false,
+          },
+
+          {
+            label: '实际结束时间',
+            width: '160px',
+            prop: 'reaEndDate',
+            sortable: false,
+          },
+          {
+            label: '备注',
+            width: 'auto',
+            prop: 'remark',
+            sortable: false,
+          },
+        ],
+      }
+    },
+    computed: {
+      ...mapGetters({
+        userId: 'user/id',
+      }),
+    },
+    watch: {
+      showColumns: function () {
+        this.$nextTick(() => this.$refs.table.doLayout())
+      },
+    },
+    activated() {
+      this.fetchData()
+    },
+    mounted() {
+      this.fetchData()
+    },
+
+    methods: {
+      restFetchData() {
+        this.queryForm.pageNum = 1
+        this.fetchData()
+      },
+      async fetchData() {
+        this.listLoading = true
+        const params = { ...this.queryForm }
+        const [err, res] = await to(deliverWorkApi.list({ ...params }))
+        this.listLoading = false
+        if (err) return (this.listLoading = false)
+        if (res.code == 200 && res.data) {
+          this.list = res.data.list || []
+          this.total = res.data.total
+        }
+        this.$nextTick(() => this.$refs.table.doLayout())
+      },
+      reset() {
+        this.queryForm = {
+          progressTitle: '',
+          progressType: '',
+          progressStatus: '',
+          pageNum: 1,
+          pageSize: 10,
+          isPrincipalPerson: '1',
+        }
+        this.fetchData()
+      },
+      handleSizeChange(val) {
+        this.queryForm.pageSize = val
+        this.fetchData()
+      },
+      handleCurrentChange(val) {
+        this.queryForm.pageNum = val
+        this.fetchData()
+      },
+      //工作项详情
+      handleWorkDetail(row) {
+        this.$refs['work'].open(row.planId, row.deliverOrderId, '', row.progressStatus != 30, row)
+      },
+      // 获取任务类型
+      getProgressType(type) {
+        if (type == '') {
+          return '软件任务单'
+        } else if (type == '10') {
+          return '发货任务单'
+        } else if (type == '20') {
+          return '组装任务单'
+        } else if (type == '30') {
+          return '部署安装单'
+        }
+        return '未知类型'
+      },
+      // 开始工作项
+      async handleStartWork(row) {
+        this.$prompt('你确定要开始当前任务吗', '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+        })
+          .then(async ({ value }) => {
+            // 当用户点击确定按钮时,执行的逻辑
+            const [err, res] = await to(deliverWorkApi.startWork({ id: row.id, remark: value }))
+            if (err) return
+            if (res.code == 200) {
+              this.$baseMessage(res.msg, 'success', 'vab-hey-message-success')
+              this.fetchData()
+            }
+          })
+          .catch(() => {
+            // 当用户点击取消按钮时,执行的逻辑
+            console.log('取消输入')
+          })
+      },
+      // 打开组装完成弹窗
+      handleComplete(row) {
+        this.$refs.complete.open(row)
+      },
+      // 发货
+      handleDeliverGoods(row) {
+        this.$refs.deliver.open(row)
+      },
+      // 验收
+      handleInspectGoods(row) {
+        this.$refs.inspect.open(row)
+      },
+      // 确认到货
+      async handleConfirmArrival(row) {
+        this.$prompt('你确定货物已到达吗', '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+        })
+          .then(async ({ value }) => {
+            // 当用户点击确定按钮时,执行的逻辑
+            const [err, res] = await to(deliverWorkApi.confirmArrival({ id: row.id, remark: value }))
+            if (err) return
+            if (res.code == 200) {
+              this.$baseMessage(res.msg, 'success', 'vab-hey-message-success')
+              this.fetchData()
+            }
+          })
+          .catch(() => {
+            // 当用户点击取消按钮时,执行的逻辑
+            console.log('取消输入')
+          })
+      },
+      // 完成工作项
+      async handleFinishWork(row) {
+        this.$prompt('你确定要完成当前任务吗', '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+        })
+          .then(async ({ value }) => {
+            // 当用户点击确定按钮时,执行的逻辑
+            console.log('输入的值为:', value)
+            const [err, res] = await to(deliverWorkApi.finishWork({ id: row.id, remark: value }))
+            if (err) return
+            if (res.code == 200) {
+              this.$baseMessage(res.msg, 'success', 'vab-hey-message-success')
+              this.fetchData()
+            }
+          })
+          .catch(() => {
+            // 当用户点击取消按钮时,执行的逻辑
+            console.log('取消输入')
+          })
+      },
+      handleDelete(row) {
+        this.$baseConfirm('你确定要删除当前项吗', null, async () => {
+          const { msg } = await deliverWorkApi.delete({ id: [row.id] })
+          this.$baseMessage(msg, 'success', 'vab-hey-message-success')
+          await this.fetchData()
+        })
+      },
+      async changeprogressLevel(val, row) {
+        const params = {
+          id: row.id,
+          progressLevel: val,
+        }
+        const [err, res] = await to(deliverWorkApi.update(params))
+        if (err) return
+        if (res.code == 200) {
+          this.$baseMessage(res.msg, 'success', 'vab-hey-message-success')
+        }
+        this.fetchData()
+      },
+    },
+  }
+</script>
+
+<style lang="scss" scoped>
+  $base: '.list';
+</style>