Browse Source

no message

linwenxin 1 năm trước cách đây
mục cha
commit
136b232a82
27 tập tin đã thay đổi với 4252 bổ sung4 xóa
  1. 27 0
      src/App.vue
  2. 103 0
      src/views/workOrder/workOrderPool/detail.vue
  3. 720 0
      src/views/workOrder/workOrderPool/detailModule/CompletionDetails/index.vue
  4. 152 0
      src/views/workOrder/workOrderPool/detailModule/Evaluation/index.vue
  5. 124 0
      src/views/workOrder/workOrderPool/detailModule/OperationDetail/index.vue
  6. 578 0
      src/views/workOrder/workOrderPool/detailModule/Payment/index.vue
  7. 35 0
      src/views/workOrder/workOrderPool/detailModule/workOrderInfo/buttons/activate.vue
  8. 16 0
      src/views/workOrder/workOrderPool/detailModule/workOrderInfo/buttons/button_mixin.js
  9. 29 0
      src/views/workOrder/workOrderPool/detailModule/workOrderInfo/buttons/closeButton.vue
  10. 80 0
      src/views/workOrder/workOrderPool/detailModule/workOrderInfo/buttons/closeOrder.vue
  11. 121 0
      src/views/workOrder/workOrderPool/detailModule/workOrderInfo/buttons/cloudCall.vue
  12. 71 0
      src/views/workOrder/workOrderPool/detailModule/workOrderInfo/buttons/commitSave.vue
  13. 32 0
      src/views/workOrder/workOrderPool/detailModule/workOrderInfo/buttons/commitTempSave.vue
  14. 93 0
      src/views/workOrder/workOrderPool/detailModule/workOrderInfo/buttons/copyInfo.vue
  15. 125 0
      src/views/workOrder/workOrderPool/detailModule/workOrderInfo/buttons/processFeedback.vue
  16. 90 0
      src/views/workOrder/workOrderPool/detailModule/workOrderInfo/buttons/rejectOrder.vue
  17. 87 0
      src/views/workOrder/workOrderPool/detailModule/workOrderInfo/buttons/void.vue
  18. 182 0
      src/views/workOrder/workOrderPool/detailModule/workOrderInfo/index.vue
  19. 297 0
      src/views/workOrder/workOrderPool/detailModule/workOrderInfo/mixins/basicInfo.js
  20. 148 0
      src/views/workOrder/workOrderPool/detailModule/workOrderInfo/mixins/dispatchInfo.js
  21. 18 0
      src/views/workOrder/workOrderPool/detailModule/workOrderInfo/mixins/otherInfo.js
  22. 130 0
      src/views/workOrder/workOrderPool/detailModule/workOrderInfo/mixins/pandanxinxi.js
  23. 29 0
      src/views/workOrder/workOrderPool/detailModule/workOrderInfo/mixins/productColumns.js
  24. 114 0
      src/views/workOrder/workOrderPool/detailModule/workOrderInfo/mixins/serviceInfo.js
  25. 626 0
      src/views/workOrder/workOrderPool/detailModule/workOrderInfo/mixins/workOrderLogic.js
  26. 25 0
      src/views/workOrder/workOrderPool/detailModule/workOrderInfo/mixins/workOrderSelectData.js
  27. 200 4
      src/views/workOrder/workOrderPool/index.vue

+ 27 - 0
src/App.vue

@@ -92,6 +92,33 @@ export default {
     background: #fff !important;
   }
 }
+.cartographer_big {
+  .el-dialog__wrapper {
+    width: 100% !important;
+    height: calc(100% - 5px) !important;
+    position: absolute !important;
+    top: 5px !important;
+  }
+  .el-dialog {
+    margin: 0 !important;
+    width: 100%;
+    height: 100%;
+  }
+  .el-dialog__body {
+    width: 100%;
+    height: calc(100% - 55px);
+    position: relative;
+    box-sizing: border-box;
+    padding: 0px;
+    overflow-y: auto;
+  }
+  .el-dialog__headerbtn{
+    z-index: 99999 !important;
+  }
+  .el-dialog__footer{
+    background: #fff !important;
+  }
+}
 .custom-tree-node{
   .el-input__inner{
       border: none !important;

+ 103 - 0
src/views/workOrder/workOrderPool/detail.vue

@@ -0,0 +1,103 @@
+<template>
+  <div class="yemiansize">
+    <el-tabs v-model="activeName" type="card" :lazy="true" @tab-click="handleClick">
+      <el-tab-pane label="工单信息" name="workOrderInfo" key="workOrderInfo"> </el-tab-pane>
+      <el-tab-pane label="操作明细" name="operationDetails" key="operationDetails"> </el-tab-pane>
+      <el-tab-pane label="完工明细" name="detailsCompletion" key="detailsCompletion"></el-tab-pane>
+      <el-tab-pane :label="`支付费用(${payAmount})`" name="payFee" key="payFee"></el-tab-pane>
+      <el-tab-pane label="评价信息" name="xdyEvaluationInfo" key="xdyEvaluationInfo"> </el-tab-pane>
+    </el-tabs>
+    <div class="view_div">
+      <div :style="{
+        height: activeName === 'workOrderInfo' ? '100%' : '0px',
+        overflow: activeName === 'workOrderInfo' ? '' : 'hidden'
+      }">
+        <workOrderInfo :id="id" ref="workOrderInfo" @updateOrderType="getOrderType" />
+      </div>
+      <OperationDetail v-if="activeName == 'operationDetails'" ref="operationDetails" />
+      <CompletionDetails v-if="activeName == 'detailsCompletion'" ref="detailsCompletion" />
+      <Payment v-if="activeName == 'payFee'" ref="payFee" />
+      <Evaluation v-if="activeName == 'xdyEvaluationInfo'" ref="xdyEvaluationInfo" />
+    </div>
+  </div>
+</template>
+
+<script>
+import workOrderInfo from './detailModule/workOrderInfo/index.vue'
+import OperationDetail from './detailModule/OperationDetail/index.vue'
+import CompletionDetails from './detailModule/CompletionDetails/index.vue'
+import Payment from './detailModule/Payment/index.vue'
+import Evaluation from './detailModule/Evaluation/index.vue'
+// import { getOrderPayOutlayAmount } from '@/api/detailModule'
+export default {
+  components: {
+    workOrderInfo,
+    OperationDetail,
+    CompletionDetails,
+    Payment,
+    Evaluation,
+  },
+  props: {
+    id: {
+      type: [String, Number],
+      default: null
+    },
+  },
+  data() {
+    return {
+      activeName: this.$route.query.activeName || 'workOrderInfo',
+      valve: null, // 阀门
+      orderType: -1,
+      payAmount: 0
+    }
+  },
+  methods: {
+    getOrderType(val) {
+      this.orderType = val
+    },
+    handleClick(tab, event) {
+      // 初始化加载组件数据
+      // 工单类型 orderType
+      // tabs 类型
+      // if (this.valve !== tab.name) {
+      //   this.$nextTick(() => {
+      //     // 支付费用总金额
+      //     const tabs = {
+      //       payFee: () => this.getOrderPayOutlayAmount()
+      //     }
+      //     tabs[tab.name] && tabs[tab.name]()
+
+      //     const callback = this.$refs[tab.name]?.init
+      //     if (callback && typeof callback === 'function') {
+      //       callback(this.id, this.$refs['workOrderInfo']?.orderInfo, this.orderType)
+      //     }
+      //   })
+      // }
+      // this.valve = tab.name
+    },
+    getOrderPayOutlayAmount() {
+      getOrderPayOutlayAmount({ orderBaseId: this.id }).then(res => {
+        this.payAmount = res.data
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.yemiansize {
+  height: calc(100vh - 140px) !important;
+  overflow: hidden;
+
+  ::v-deep .el-tabs:nth-child(1) {
+    &>.el-tabs__header:nth-child(1) {
+      margin-bottom: 0 !important;
+    }
+  }
+
+  .view_div {
+    height: calc(100% - 42px) !important;
+    overflow-y: auto;
+  }
+}
+</style>

+ 720 - 0
src/views/workOrder/workOrderPool/detailModule/CompletionDetails/index.vue

@@ -0,0 +1,720 @@
+<template>
+  <div>
+    <zj-form-container style="margin-bottom:40px">
+      <!-- 完工明细 -->
+      <zj-form-module v-if="!look" title="完工明细">
+        <zj-table
+          ref="tableEl"
+          :isDrop="true"
+          :columns="completionDetailColumns"
+          :tableData="completionDetailData"
+          :tableAttributes="{
+            border: true
+          }"
+        ></zj-table>
+        <div class="fr">
+          <el-pagination
+            @size-change="handleSizeChange"
+            @current-change="handleCurrentChange"
+            :current-page="pageNum"
+            :page-sizes="[10, 20, 30, 50]"
+            :page-size="pageSize"
+            layout="total, sizes, prev, pager, next, jumper"
+            :total="listTotal"
+          ></el-pagination>
+        </div>
+      </zj-form-module>
+      <!-- 内外机条码信息 -->
+      <zj-form-module v-if="look" title="内外机条码信息" class="header_right_btn">
+        <div slot="header" class="btn">
+          <el-button v-if="orderDetailFiles.length" type="primary" size="mini" @click="imgVisible = true"> 预览图片 </el-button>
+        </div>
+        <zj-table
+          ref="tableEl"
+          :isDrop="true"
+          :columns="barcodeColumns"
+          :tableData="barcodeData"
+          :tableAttributes="{
+            border: true
+          }"
+        ></zj-table>
+      </zj-form-module>
+      <!-- 图片采集信息 -->
+      <zj-form-module v-if="look" title="图片采集信息">
+        <div class="imgCJ">
+          <div v-for="(v, i) in orderDetailFiles" :key="i">
+            <el-image
+              v-if="checkFileType(v.filePath) !=='mp4'"
+              style="width: 210px; height: 280px"
+              :src="$imageUrl + v.filePath"
+              :preview-src-list="[$imageUrl + v.filePath]"
+            >
+              <div slot="error" style="height: 100%; display: flex; justify-content: center; align-items: center">
+                <i>暂无图片</i>
+              </div>
+            </el-image>
+            <video v-else width="210" height="280" controls>
+              <source :src="$imageUrl + v.filePath" />
+            </video>
+            <div class="imgTitle">
+              {{ v.fileName  }}
+            </div>
+          </div>
+        </div>
+      </zj-form-module>
+      <!-- 其他信息 -->
+      <zj-form-module
+        v-if="look"
+        title="其他信息"
+        label-width="120px"
+        :formData="formData"
+        :formItems="otherFormItems"
+        :column="1"
+      >
+      </zj-form-module>
+    </zj-form-container>
+    <div v-if="look" class="fixBtnStyle">
+      <el-button size="mini" type="info" @click="look = false">关闭</el-button>
+      <el-button v-if="isCancel && $restrict('discardCollectionData')" size="mini" @click="handlerCancelData" type="primary"
+        >作废采集数据</el-button
+      >
+    </div>
+    <el-dialog
+      title="图片预览"
+      :visible.sync="imgVisible"
+      :close-on-click-modal="false"
+      :modal-append-to-body="false"
+      width="50%"
+      top="8vh"
+      @close="imgVisible = false"
+    >
+      <div>
+        <div class="box">
+          <div style="min-height: 200px;" class="flex" v-for="(v, i) in orderDetailFiles" :key="i">
+            <el-image
+            v-if="checkFileType(v.filePath) !=='mp4'"
+            style="width: 720px; height: auto"
+              :src="$imageUrl + v.filePath"
+              :preview-src-list="[$imageUrl + v.filePath]"
+            >
+              <div slot="error" style="width: 720px;height: auto; display: flex; justify-content: center; align-items: center">
+                <i>暂无图片</i>
+              </div>
+            </el-image>
+            <video v-else  width="720" height="960" controls>
+              <source :src="$imageUrl + v.filePath" />
+            </video>
+            <div class="imgTitle" style="    flex: 0 0 200px; margin-right: 20px; color: #f00">
+              {{ v.fileName }}
+              <div style=" margin-top: 20px;">
+                  <span v-if="v.fileType == 1">内机条码: {{ v.code }}</span>
+                  <span v-if="v.fileType == 3">外机机条码: {{ v.code }}</span>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+//完工明细--------------------------------------------
+// import otherMixin from '../createWorker/mixin/otherMixin'
+// import {
+//   orderInstallOverList,
+//   orderInstallOverDetail,
+//   orderRepairOverDetail,
+//   orderCancelInstallGatherDetail
+// } from '@/api/detailModule'
+export default {
+  // mixins: [otherMixin],
+  props: {},
+  filters: {
+    imgTitleChange(value) {
+      let data = [
+        {
+          type: 1,
+          title: '内机'
+        },
+        {
+          type: 2,
+          title: '上墙图片'
+        },
+        {
+          type: 3,
+          title: '外机'
+        },
+        {
+          type: 4,
+          title: '内机其他'
+        },
+        {
+          type: 5,
+          title: '外机其他'
+        },
+        {
+          type: 6,
+          title: '旧机内机整机图片'
+        },
+        {
+          type: 7,
+          title: '旧机外机整机图片'
+        },
+        {
+          type: 8,
+          title: '定位确认书'
+        },
+        {
+          type: 9,
+          title: '室外机固定图'
+        },
+        {
+          type: 10,
+          title: '冷凝水管软接图'
+        },
+        {
+          type: 11,
+          title: '外机电源接线图'
+        },
+        {
+          type: 12,
+          title: '外机出管处封堵图'
+        },
+        {
+          type: 13,
+          title: '室内机安装图'
+        },
+        {
+          type: 14,
+          title: '冷凝水管通气孔图'
+        },
+        {
+          type: 15,
+          title: '室内机走管图'
+        },
+        {
+          type: 16,
+          title: '抽真空保压图片'
+        },
+        {
+          type: 17,
+          title: '电子清单'
+        },
+        {
+          type: 18,
+          title: '安装完成图片'
+        },
+        {
+          type: 19,
+          title: '验收报告'
+        },
+        {
+          type: 20,
+          title: '故障位置图'
+        }
+      ]
+      for (const key in data) {
+        if (data[key].type == value) {
+          return data[key].title
+        }
+      }
+    }
+  },
+  data() {
+    return {
+      look: false,
+      barcodeData: [],
+      formData: {
+        bracket: '',
+        pipe: '',
+        swithFlag: '',
+        highAltitude: '',
+        hole: ''
+      },
+      formRules: {},
+      pageSize: 15,
+      pageNum: 1,
+      listTotal: 0,
+      completionDetailData: [],
+      orderDetailFiles: [],
+      orderType: '',
+      orderId: '',
+      orderDetailId: '', //工单采集明细id
+      isCancel: false,
+      dispatchStatus: '',
+      imgVisible: false,
+      status:  null
+    }
+  },
+  computed: {
+    completionDetailColumns() {
+      return [
+        {
+          columnAttributes: {
+            width: 130,
+            fixed: 'left',
+            align: 'center',
+            label: '操作',
+            prop: 'teamWorkerName'
+          },
+          render: (h, { row, column, $index }) => {
+            return (
+              <div style="">
+                <el-button
+                  size="mini"
+                  type="text"
+                  onClick={async () => {
+                    this.look = true
+                    this.isCancel = row.status != 2 && this.dispatchStatus !== 'YBWG' ? true : false
+                    this.getListDetail(row.id, this.orderType)
+                  }}
+                >
+                  查看
+                </el-button>
+                {row.status == 1 ? (
+                  <el-button size="mini" type="text" onClick={async () => {}}>
+                    结算单
+                  </el-button>
+                ) : null}
+                {row.status == 1 && this.$restrict('discardCollectionData') ? (
+                  <el-popconfirm
+                    style="margin-left:10px"
+                    onConfirm={async () => {
+                      this.orderDetailId = row.id
+                      this.handlerCancel()
+                    }}
+                    title="是否确定需要作废该项内容?"
+                  >
+                    <el-button slot="reference" size="mini" type="text">
+                      作废
+                    </el-button>
+                  </el-popconfirm>
+                ) : null}
+              </div>
+            )
+          }
+        },
+        {
+          columnAttributes: {
+            label: '结算状态',
+            prop: 'isSettle'
+          },
+          render: (h, { row, column, $index }) => {
+            return <div style="padding-left:6px">{row.isSettle == 'NO' ? '否' : '是'}</div>
+          }
+        },
+        {
+          columnAttributes: {
+            label: '转结标签',
+            prop: ''
+          }
+        },
+        {
+          columnAttributes: {
+            label: '产品信息',
+            prop: 'productName',
+            width: 130
+          }
+        },
+        {
+          columnAttributes: {
+            label: '内机条码',
+            prop: 'insideCode',
+            width: 130
+          }
+        },
+        {
+          columnAttributes: {
+            label: '外机条码',
+            prop: 'outCode',
+            width: 130
+          }
+        },
+        {
+          columnAttributes: {
+            label: '操作内容',
+            prop: 'type'
+          },
+          render: (h, { row, column, $index }) => {
+            return (
+              <div style="padding-left:6px">
+                {row.type == 'ALL'
+                  ? '一体机'
+                  : row.type == 'INSIDE'
+                  ? '内机'
+                  : row.type == 'OUT'
+                  ? '外机'
+                  : row.type == 'INSIDE_OUT'
+                  ? '一内一外'
+                  : ''}
+              </div>
+            )
+          }
+        },
+        {
+          columnAttributes: {
+            label: '采集人',
+            prop: 'operatorName'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '大小工',
+            prop: '',
+            width: 180
+          },
+          render: (h, { row, column, $index }) => {
+            return (
+              <div style="padding-left:6px">
+                {row.mainWorkerName}{row.assistWorkerName?',': ''}{row.assistWorkerName}
+              </div>
+            )
+          }
+        },
+        {
+          columnAttributes: {
+            label: '状态',
+            prop: 'status'
+          },
+          render: (h, { row, column, $index }) => {
+            return (
+              <div style="padding-left:6px">
+                {row.status == 0
+                  ? '未采集'
+                  : row.status == 1
+                  ? '已采集'
+                  : row.status == 2
+                  ? '作废'
+                  : row.status == 3
+                  ? '临时保存'
+                  : ''}
+              </div>
+            )
+          }
+        },
+        {
+          columnAttributes: {
+            label: '采集时间',
+            prop: 'firstTime'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '采集来源',
+            prop: 'detailSource'
+          },
+          render: (h, { row, column, $index }) => {
+            return (
+              <div style="padding-left:6px">
+                {row.detailSource == 0 ? '总部' : row.detailSource == 2 ? '家盛茂' : '广佛'}
+              </div>
+            )
+          }
+        },
+        {
+          columnAttributes: {
+            label: '提交采集时地址',
+            width: 130,
+            prop: 'latLngAddress'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '最后采集图片时(总部结算-GPS定位地址)',
+            width: 260,
+            prop: 'gpsAddress'
+          }
+        }
+      ]
+    },
+    barcodeColumns() {
+      return [
+        {
+          columnAttributes: {
+            label: '序号',
+            prop: ''
+          },
+          render: (h, { row, column, index }) => {
+            return <div style="padding-left:6px">{index + 1}</div>
+          }
+        },
+        {
+          columnAttributes: {
+            label: '条码',
+            prop: ''
+          },
+          render: (h, { row, column, $index }) => {
+            return (
+              <div style="padding-left:6px">
+                {row.type == 1 ? '内机条码' : row.type == 2 ? '外机条码' : ''} {row.code}
+              </div>
+            )
+          }
+        },
+        // {
+        //   columnAttributes: {
+        //     label: '外机条码',
+        //     prop: 'brandName'
+        //   }
+        // },
+        {
+          columnAttributes: {
+            label: '开机密码',
+            prop: 'insidePassword'
+          }
+        },
+        ...(()=>{
+          return [3,4].includes(this.status) ?[{
+          columnAttributes: {
+            label: '图片',
+            prop: ''
+          },
+          render: (h, { row, column, $index }) => {
+            return (
+              <div style="padding-left:6px">
+              <el-image
+              style="width: 210px; height: 280px"
+              src={ row.path ? this.$imageUrl + row.path : ''}
+              preview-src-list={ row.path ? [this.$imageUrl + row.path] : []}
+              >
+              <div slot="error" style="height: 100%; display: flex; justify-content: center; align-items: center">
+                <i>暂无图片</i>
+              </div>
+              </el-image>
+              </div>
+            )
+          }
+        }] : []
+        })()
+
+      ]
+    },
+    otherFormItems() {
+      return [
+        {
+          name: 'el-input',
+          md: 6,
+          options: [],
+          attributes: { disabled: false },
+          formItemAttributes: { label: '支架', prop: 'bracket' }
+        },
+        {
+          name: 'el-input',
+          md: 6,
+          options: [],
+          attributes: { disabled: false },
+          formItemAttributes: { label: '加长管', prop: 'pipe' }
+        },
+        {
+          name: 'el-input',
+          md: 6,
+          options: [],
+          attributes: { disabled: false },
+          formItemAttributes: { label: '空气开关', prop: 'swithFlag' }
+        },
+        {
+          name: 'el-input',
+          md: 6,
+          options: [],
+          attributes: { disabled: false },
+          formItemAttributes: { label: '高空作业', prop: 'highAltitude' }
+        },
+        {
+          name: 'el-input',
+          md: 6,
+          options: [],
+          attributes: { disabled: false },
+          formItemAttributes: { label: '一次性成型墙孔', prop: 'hole' }
+        },
+        {
+          name: 'el-input',
+          md: 24,
+          options: [],
+          attributes: { disabled: false, type: 'textarea' },
+          formItemAttributes: { label: '备注', prop: 'remark' }
+        }
+      ]
+    }
+  },
+  methods: {
+    // 检查文件类型
+    checkFileType(url) {
+      return url.substring(url.lastIndexOf('.') + 1)
+    },
+    //作废采集数据
+    handlerCancelData(){
+       this.$confirm('此操作将作废已采集数据, 是否继续?', '提示', {
+          confirmButtonText: '是',
+          cancelButtonText: '否',
+          type: 'warning',
+          closeOnClickModal:false,
+          closeOnPressEscape:false,
+          showClose:false
+        }).then(() => {
+          this.handlerCancel()
+        }).catch(() => {
+
+        });
+    },
+    async handlerCancel() {
+      let params = {
+        orderBaseId: this.orderId,
+        orderDetailId: this.orderDetailId
+      }
+      await orderCancelInstallGatherDetail(params)
+      this.$message.success('作废采集成功')
+      this.look = false
+      this.isCancel = false
+      this.getDetail(this.orderId, this.orderType)
+    },
+    handleSizeChange(val) {
+      this.pageSize = val
+      this.pageNum = 1
+      this.getDetail(this.orderId, this.orderType)
+    },
+    handleCurrentChange(val) {
+      this.pageNum = val
+      this.getDetail(this.orderId, this.orderType)
+    },
+    //完工详情
+    async getListDetail(id, orderType) {
+      if (orderType == 'INSTALL' || orderType === 'RECOVERY') {
+        this.orderDetailId = id //工单采集明细id
+        let { data } = await orderInstallOverDetail({ id })
+          const neiji = []
+          const waiji = []
+          const neijiqit = []
+          const waijiqit = []
+          const caiji = []
+          const qit = []
+          const tshjazqrs = []
+        for (let index = 0; index < data.orderDetailFiles.length; index++) {
+          const el = data.orderDetailFiles[index]
+            if (el.fileType == 1) {
+              el.code =  data.orderInstallDetailCodes.find(k=>k.type == 1)?.code
+              neiji.push(el)
+            }
+            if (el.fileType == 3) {
+              el.code =  data.orderInstallDetailCodes.find(k=>k.type == 2)?.code
+              waiji.push(el)
+            }
+            if (el.fileType == 4) {
+              neijiqit.push(el)
+            }
+            if (el.fileType == 5) {
+              waijiqit.push(el)
+            }
+            if (![1,3,4,5,21,44].includes(el.fileType)) {
+              caiji.push(el)
+            }
+            if (el.fileType == 21) {
+              qit.push(el)
+            }
+            if(el.fileType == 44){
+              tshjazqrs.push(el)
+            }
+        }
+        this.orderDetailFiles = [...neiji,...waiji,...neijiqit,...waijiqit,...caiji,...qit,...tshjazqrs]
+        
+        data.orderInstallDetailCodes.forEach(v=>{
+          v.insidePassword = data.insidePassword
+        })
+        this.barcodeData = data.orderInstallDetailCodes
+        this.formData = {
+          bracket: data.bracket,
+          pipe: data.pipe,
+          swithFlag: data.swithFlag,
+          highAltitude: data.highAltitude,
+          hole: data.hole,
+          remark: data.remark
+        }
+      }
+      if (orderType == 'REPAIR') {
+        let { data } = await orderRepairOverDetail({ id })
+      }
+    },
+    //完工明细
+    async getDetail(orderBaseId, type) {
+      let params = {
+        orderBaseId,
+        pageSize: this.pageSize,
+        pageNum: this.pageNum
+      }
+
+      if (type == 'INSTALL' || type === 'RECOVERY') {
+        let { data } = await orderInstallOverList(params)
+        this.completionDetailData = data.records
+        this.listTotal = data.total
+      }
+    },
+
+    init(id, params, status) {
+      this.orderType = params.orderType
+      this.dispatchStatus = params.dispatchStatus
+      this.orderId = id
+      this.status = status
+      this.getDetail(this.orderId, this.orderType)
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.fixBtnStyle{
+  position:fixed;
+  bottom:0;
+  z-index: 2000;
+  padding: 10px 0 30px;
+  width:calc(100vw - 120px);
+  background-color:#fff
+}
+::v-deep .header_right_btn {
+  .el-card__header {
+    div[class='zj-page-container zj-page-container-row'] {
+      align-items: center;
+    }
+  }
+}
+.btn {
+  float: right;
+}
+.flex {
+  display: flex;
+  flex-direction: row-reverse;
+  align-items: center;
+  justify-content: flex-end;
+  margin-left: 40px;
+  padding-bottom: 30px;
+}
+
+.box{
+  height: calc(100vh - 84px);
+  padding-bottom: 84px;
+  overflow-y: auto
+}
+::v-deep .el-dialog__wrapper{
+  position: absolute;
+  top: 0;
+  left: 0;
+}
+::v-deep .el-dialog{
+  margin: 0 auto !important;
+  width: 100% !important;
+  height: 100% !important;
+  overflow: hidden;
+}
+.imgCJ {
+  display: flex;
+  justify-content: flex-start;
+  flex-wrap: wrap;
+  > div {
+    flex: 0 calc((100% - 210px)/6);
+    margin-right: 23px;
+  }
+  .imgTitle {
+    font-size: 14px;
+    margin: 10px 0 20px;
+  }
+}
+</style>

+ 152 - 0
src/views/workOrder/workOrderPool/detailModule/Evaluation/index.vue

@@ -0,0 +1,152 @@
+<template>
+  <zj-form-container>
+    <zj-form-module title="评价信息">
+      <zj-table
+        ref="tableEl"
+        :is-drop="true"
+        :columns="evaluationColumns"
+        :table-data="evaluationData"
+        :table-attributes="{
+          border: true
+        }"
+      />
+    </zj-form-module>
+  </zj-form-container>
+</template>
+
+<script>
+// import { orderAppraiseList } from '@/api/workOrderEvaluation'
+export default {
+  data() {
+    return {
+      evaluationData: []
+    }
+  },
+  computed: {
+    evaluationColumns() {
+      return [
+        {
+          columnAttributes: {
+            label: '工程师信息',
+            prop: 'workerName'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '用户昵称',
+            prop: 'userName'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '手机号码',
+            prop: 'userPhone'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '产品大类',
+            prop: 'mainName'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '评价类型',
+            prop: 'type'
+          },
+          render: (h, { column, row, index }) => {
+            const type= {
+              1:"首次", 2:"24小时内", 3:"24小时外"
+            }[row.type] || ''
+            return (
+              <div style="padding-left:10px">
+                {type}
+              </div>
+            )
+          }
+        },
+
+        {
+          columnAttributes: {
+            label: '评价内容',
+            prop: 'appraiseContent',
+            'min-width': 180
+          }
+        },
+        {
+          columnAttributes: {
+            label: '服务商网点说明情况',
+            prop: 'websitRemark',
+            'min-width': 180
+          }
+        },
+        {
+          columnAttributes: {
+            label: '跟进人',
+            prop: 'rvisitNickName'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '总包服务商复核情况',
+            prop: 'reCheckRemark',
+            'min-width': 180
+          }
+        },
+
+        {
+          columnAttributes: {
+            label: '评价来源',
+            prop: 'sourceText'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '状态',
+            prop: 'appraiseStatus'
+          },
+          render: (h, { column, row, index }) => {
+            const appraiseStatus= {
+              A:"满意", B:"一般", C:"不满意", N:"未评价", O:"其他"
+            }[row.appraiseStatus] || ''
+            return (
+              <div style="padding-left:10px">
+                {appraiseStatus}
+              </div>
+            )
+          }
+        },
+        {
+          columnAttributes: {
+            label: '创建时间',
+            prop: 'createTime',
+            'min-width': 180
+          }
+        }
+      ]
+    }
+  },
+  methods: {
+    init(id, params) {
+      this.getOrderAppraiseList(id)
+    },
+    getOrderAppraiseList(id) {
+      orderAppraiseList({
+        pageNum: 1,
+        pageSize: -1,
+        params: [
+          {
+            param: 'a.order_base_id',
+            compare: 'like',
+            value: id
+          }
+        ]
+      }).then(res => {
+        this.evaluationData = res.data.records
+      })
+    }
+  }
+}
+</script>
+
+<style></style>

+ 124 - 0
src/views/workOrder/workOrderPool/detailModule/OperationDetail/index.vue

@@ -0,0 +1,124 @@
+<template>
+  <zj-form-container>
+    <zj-form-module title="操作明细">
+      <zj-table
+        ref="tableEl"
+        :isDrop="true"
+        :columns="operationDetailColumns"
+        :tableData="operationDetailData"
+        :tableAttributes="{
+          border: true
+        }"
+      ></zj-table>
+    </zj-form-module>
+  </zj-form-container>
+</template>
+
+<script>
+//操作明细--------------------------------------------
+// import { getInstallOperatorList, getRepairOperatorList } from '@/api/detailModule'
+
+export default {
+  data() {
+    return {
+      operationDetailData: []
+    }
+  },
+  computed: {
+    operationDetailColumns() {
+      return [
+        {
+          columnAttributes: {
+            label: '操作类别',
+            prop: 'type'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '操作内容',
+            prop: 'content'
+          }
+        },
+        // {
+        //   columnAttributes: {
+        //     label: '最后操作时间',
+        //     prop: 'updateTime'
+        //   }
+        // },
+        {
+          columnAttributes: {
+            label: '操作人',
+            prop: 'operator'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '操作网点',
+            prop: 'operateWebsit'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '反馈结果',
+            prop: 'feedback'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '附件',
+            prop: 'fileUrl',
+            width: 100
+          },
+          render: (h, { row, index }) => {
+            return (
+              <div style={{ padding: '0 6px' }}>
+                {row.filePath ? (
+                  <el-button
+                    type="text"
+                    onClick={() => {
+                      window.open(this.$xdocUrl + encodeURIComponent(this.$imageUrl + row.fileUrl))
+                    }}
+                  >
+                    在线查看附件
+                  </el-button>
+                ) : (
+                  '无'
+                )}
+              </div>
+            )
+          }
+        },
+        {
+          columnAttributes: {
+            label: '操作时间',
+            prop: 'createTime'
+          }
+        }
+      ]
+    }
+  },
+  methods: {
+    init(id, params) {
+      this.getList(id, this.filterFn(params.orderType))
+    },
+    filterFn(type) {
+      if (type === 'INSTALL' || type === 'RECOVERY') {
+        return getInstallOperatorList
+      } else {
+        return getRepairOperatorList
+      }
+    },
+    getList(id, fn) {
+      fn({
+        orderBaseId: id,
+        pageNum: 1,
+        pageSize: -1
+      }).then(res => {
+        this.operationDetailData = res.data.records
+      })
+    }
+  }
+}
+</script>
+
+<style></style>

+ 578 - 0
src/views/workOrder/workOrderPool/detailModule/Payment/index.vue

@@ -0,0 +1,578 @@
+<template>
+  <zj-form-container>
+    <!-- 支付费用-安装 -->
+    <zj-form-module v-if="~[1, 2, 3, 4].indexOf(this.orderType)" title="支付费用">
+      <zj-table
+        ref="tableEl"
+        :is-drop="true"
+        :columns="paymentColumns"
+        :table-data="paymentData"
+        :table-attributes="{
+          border: true
+        }"
+      />
+      <el-dialog
+        :modal="true"
+        title="服务支付工单(商品详情)"
+        :visible.sync="installDialog"
+        width="60%"
+        :show-close="true"
+        :close-on-click-modal="false"
+        :modal-append-to-body="false"
+      >
+        <zj-table
+          ref="tableEl"
+          :is-drop="true"
+          :columns="installColumns"
+          :table-data="installTableData"
+          :table-attributes="{
+            border: true
+          }"
+        />
+      </el-dialog>
+    </zj-form-module>
+    <!-- 支付费用-维修/移机 -->
+    <zj-form-module v-else title="支付费用">
+      <div class="ZF_header">维修费用信息</div>
+      <el-descriptions class="margin-top" :column="3" :border="true" :label-style="{ width: '140px' }">
+        <!-- <el-descriptions-item>
+          <template slot="label"> 网点名称 </template>
+          {{ info.websitName }}
+        </el-descriptions-item>
+        <el-descriptions-item>
+          <template slot="label"> 工单号 </template>
+          {{ info.orderBaseId }}
+        </el-descriptions-item> -->
+        <el-descriptions-item>
+          <template slot="label"> 流水号 </template>
+          {{ info.orderPayStreamWaterId }}
+        </el-descriptions-item>
+        <el-descriptions-item>
+          <template slot="label"> 操作者名称 </template>
+          {{ info.updateBy }}
+        </el-descriptions-item>
+        <el-descriptions-item>
+          <template slot="label"> 操作者编号 </template>
+          {{ info.insureName }}
+        </el-descriptions-item>
+        <el-descriptions-item>
+          <template slot="label"> 支付方式 </template>
+          微信支付
+        </el-descriptions-item>
+        <el-descriptions-item>
+          <template slot="label"> 客户名称 </template>
+          {{ info.customerName }}
+        </el-descriptions-item>
+        <el-descriptions-item>
+          <template slot="label"> 电话号码 </template>
+          {{ info.customerMobile }}
+        </el-descriptions-item>
+        <el-descriptions-item>
+          <template slot="label"> 支付状态 </template>
+          {{ info.isPay === 'YES' ? '是' : '否' }}
+        </el-descriptions-item>
+        <el-descriptions-item>
+          <template slot="label"> 支付总金额 </template>
+          {{ info.payValue }}
+        </el-descriptions-item>
+        <el-descriptions-item>
+          <template slot="label"> 总手续费 </template>
+          {{ (info.chargeValue || 0) * (info.qty || 0) }}
+        </el-descriptions-item>
+        <el-descriptions-item>
+          <template slot="label"> 支付时间 </template>
+          {{ info.payTime }}
+        </el-descriptions-item>
+        <el-descriptions-item v-if="~[6].indexOf(this.orderType)">
+          <template slot="label"> 移机类型 </template>
+          {{ info.insureName }}
+        </el-descriptions-item>
+        <el-descriptions-item>
+          <template v-if="~[6].indexOf(this.orderType)" slot="label"> 匹数 </template>
+          {{ info.insureName }}
+        </el-descriptions-item>
+      </el-descriptions>
+      <br>
+      <div class="ZF_header">支付明细</div>
+      <zj-table
+        ref="tableEl"
+        :is-drop="true"
+        :columns="repairPaymentColumns"
+        :table-data="repairPaymentData"
+        :table-attributes="{
+          border: true
+        }"
+      />
+      <!--  -->
+      <!-- <zj-table
+        v-if="~[6].indexOf(this.orderType)"
+        ref="tableEl"
+        :is-drop="true"
+        :columns="washPaymentColumns"
+        :table-data="washPaymentData"
+        :table-attributes="{
+          border: true
+        }"
+      /> -->
+      <br>
+      <el-descriptions class="margin-top" :column="1" :border="false" :label-style="{ width: '140px' }">
+        <el-descriptions-item>
+          <template slot="label"> 收费单据 </template>
+          <div v-if="info.fileUrl.length > 0">
+            <el-image
+              v-for="v in info.fileUrl"
+              :key="v.fileUrl"
+              style="width: 210px; height: 130px; margin-right: 10px"
+              :src="$imageUrl + v.fileUrl"
+              :preview-src-list="[$imageUrl + v.fileUrl]"
+            >
+              <div slot="error" style="height: 100%; display: flex; justify-content: center; align-items: center">
+                <i>暂无图片</i>
+              </div>
+            </el-image>
+          </div>
+        </el-descriptions-item>
+        <el-descriptions-item>
+          <template slot="label"> 备注 </template>
+          <el-input v-model="info.remark" type="textarea" disabled />
+        </el-descriptions-item>
+      </el-descriptions>
+      <el-descriptions
+        v-if="~[6].indexOf(this.orderType)"
+        class="margin-top"
+        :column="2"
+        :border="false"
+        :label-style="{ width: '140px' }"
+      >
+        <el-descriptions-item>
+          <template slot="label"> 支付状态 </template>
+          {{ info.isPay === 'YES'? '是':'否'}}
+        </el-descriptions-item>
+        <el-descriptions-item>
+          <template slot="label"> 支付时间 </template>
+          {{ info.payTime }}
+        </el-descriptions-item>
+        <el-descriptions-item>
+          <template slot="label"> 商户交易号 </template>
+          {{ info.outTradeNo }}
+        </el-descriptions-item>
+        <el-descriptions-item>
+          <template slot="label"> 第三方交易号 </template>
+          {{ info.transactionId }}
+        </el-descriptions-item>
+      </el-descriptions>
+      <br>
+      <div class="ZF_header">交易记录</div>
+      <zj-table
+        ref="tableEl"
+        :is-drop="true"
+        :columns="repairBusinessColumns"
+        :table-data="repairBusinessData"
+        :table-attributes="{
+          border: true
+        }"
+      />
+    </zj-form-module>
+  </zj-form-container>
+</template>
+
+<script>
+// import { getOrderPayOutlayList, getOrderPayOutlayFileList, getOrderPayOutlayDetail } from '@/api/detailModule'
+export default {
+  data() {
+    return {
+      installDialog: false,
+      installTableData: [],
+      info: {
+        websitName: '',
+        orderBaseId: '',
+        updateBy: '',
+        updateByNumber: '',
+        customerName: '',
+        customerMobile: '',
+        payValue: '',
+        chargeValue: '',
+        remark: '',
+        payTime: '',
+        // websitName:'',
+        // websitName:'',
+        // websitName:'',
+        // websitName:'',
+        fileUrl: [],
+        qty: ''
+      },
+      paymentData: [],
+      repairPaymentData: [],
+      repairBusinessData: [],
+      washPaymentData: [],
+      orderType: ''
+    }
+  },
+  computed: {
+    paymentColumns() {
+      return [
+        // {
+        //   columnAttributes: {
+        //     label: 'ID',
+        //     prop: 'orderBaseId',
+        //     width: 200
+        //   }
+        // },
+        {
+          columnAttributes: {
+            label: '辅材单号',
+            prop: 'outTradeNo',
+            width: 200
+          }
+        },
+        {
+          columnAttributes: {
+            label: '支付商户单号',
+            prop: 'outTradeNo',
+            width: 200
+          }
+        },
+        {
+          columnAttributes: {
+            label: '操作网点',
+            prop: 'websitName'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '操作人',
+            prop: 'createBy'
+          }
+        },
+        // {
+        //   columnAttributes: {
+        //     label: '是否被删除',
+        //     prop: 'flag'
+        //   }
+        // },
+        {
+          columnAttributes: {
+            label: '支付状态',
+            prop: 'isPay'
+          },
+          render: (h, { row, column, $index }) => {
+            return (
+              <div style='padding-left:6px'>{row.isPay == 'YES' ? '已支付' : row.isPay == 'NO' ? '未支付' : ''}</div>
+            )
+          }
+        },
+        {
+          columnAttributes: {
+            label: '支付时间',
+            prop: 'payTime'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '金额',
+            prop: 'payValue'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '商品详情',
+            prop: 'brandName'
+          },
+          render: (h, { row, column, $index }) => {
+            return (
+              <div style=''>
+                {' '}
+                <el-button
+                  size='mini'
+                  type='text'
+                  onClick={async() => {
+                    this.installDialog = true
+                    this.getOrderPayOutlayDetail(row.orderBaseId, row.orderPayRecordId, 'INSTALL')
+                  }}
+                >
+                  查看详情
+                </el-button>
+              </div>
+            )
+          }
+        },
+        {
+          columnAttributes: {
+            label: '备注',
+            prop: 'remark'
+          }
+        }
+      ]
+    },
+    installColumns() {
+      return [
+        {
+          columnAttributes: {
+            label: '商品ID',
+            prop: 'orderBaseId',
+            width: 200
+          }
+        },
+        {
+          columnAttributes: {
+            label: '商品名称',
+            prop: 'goodsName'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '数量',
+            prop: 'qty'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '单价',
+            prop: 'price'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '小计',
+            prop: 'totalAmount'
+          }
+        }
+      ]
+    },
+    repairPaymentColumns() {
+      return [
+        {
+          columnAttributes: {
+            label: '费用项目',
+            prop: 'goodsName'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '收取费用',
+            prop: 'totalAmount'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '手续费',
+            prop: 'chargeValue'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '单价',
+            prop: 'price'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '数量',
+            prop: 'qty'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '总手续费',
+            prop: ''
+          },
+          render: (h, { row, column, $index }) => {
+            return (
+              <div>{+row.chargeValue * +row.qty}</div>
+            )
+          }
+        },
+      ]
+    },
+    repairBusinessColumns() {
+      return [
+        // {
+        //   columnAttributes: {
+        //     label: 'ID',
+        //     prop: 'orderBaseId'
+        //   }
+        // },
+        {
+          columnAttributes: {
+            label: '交易类型',
+            prop: 'tradeType'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '交易金额',
+            prop: 'payValue'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '原工单流水',
+            prop: 'payValue'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '商户交易号',
+            prop: 'outTradeNo'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '第三方交易号',
+            prop: 'transactionId'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '交易状态',
+            prop: 'isPay'
+          },
+          render: (h, { row, column, $index }) => {
+            return (
+              <div style='padding-left:6px'>{row.isPay == 'YES' ? '已支付' : row.isPay == 'NO' ? '未支付' : ''}</div>
+            )
+          }
+        },
+        {
+          columnAttributes: {
+            label: '交易时间',
+            prop: 'payTime'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '创建时间',
+            prop: 'createTime'
+          }
+        }
+        // {
+        //   columnAttributes: {
+        //     label: '操作',
+        //     prop: 'brandName'
+        //   },
+        //   render: (h, { row, column, $index }) => {
+        //     return (
+        //       <div style="">
+        //         <el-button
+        //           size="mini"
+        //           type="text"
+        //           onClick={async () => {
+        //             this.installDialog = true
+        //             this.getOrderPayOutlayDetail(row.orderBaseId, row.outTradeNo, 'REPAIR')
+        //             this.getOrderPayOutlayFileList(row.orderBaseId, row.outTradeNo)
+        //           }}
+        //         >
+        //           查看详情
+        //         </el-button>
+        //       </div>
+        //     )
+        //   }
+        // }
+      ]
+    },
+    washPaymentColumns() {
+      return [
+        {
+          columnAttributes: {
+            label: '清洗费用名称',
+            prop: 'goodsName'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '单价',
+            prop: 'price'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '数量',
+            prop: 'qty'
+          }
+        },
+        // {
+        //   columnAttributes: {
+        //     label: '单位',
+        //     prop: 'brandName'
+        //   }
+        // },
+        {
+          columnAttributes: {
+            label: '收取总费用',
+            prop: 'totalAmount'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '清洗手续费',
+            prop: 'chargeValue'
+          }
+        }
+      ]
+    }
+  },
+
+  methods: {
+    init(id, params, orderType) {
+      this.orderType = orderType
+      this.getOrderPayOutlayList(id)
+    },
+    getOrderPayOutlayList(id, type) {
+      getOrderPayOutlayList({ orderBaseId: id }).then(res => {
+        if (~[1, 2, 3, 4].indexOf(this.orderType)) {
+          this.paymentData = res.data.filter(k => k.isPay === 'YES')
+        } else {
+          this.repairBusinessData = res.data.filter(k => k.isPay === 'YES')
+          if (this.repairBusinessData && this.repairBusinessData.length) {
+            this.info.websitName = this.repairBusinessData[0].websitName
+            this.info.orderBaseId = this.repairBusinessData[0].orderBaseId
+            this.info.updateBy = this.repairBusinessData[0].updateBy
+            this.info.updateByNumber = this.repairBusinessData[0].updateByNumber
+            this.info.customerName = this.repairBusinessData[0].customerName
+            this.info.customerMobile = this.repairBusinessData[0].customerMobile
+            this.info.payValue = this.repairBusinessData[0].payValue
+            this.info.payTime = this.repairBusinessData[0].payTime
+            this.info.chargeValue = this.repairBusinessData[0].chargeValue
+            this.info.qty = this.repairBusinessData[0].qty
+
+            this.info.remark = this.repairBusinessData[0].remark
+            this.info.isPay = this.repairBusinessData[0].isPay
+            this.info.outTradeNo = this.repairBusinessData[0].outTradeNo
+            this.info.transactionId = this.repairBusinessData[0].transactionId
+
+            this.getOrderPayOutlayDetail(id, this.repairBusinessData[0].orderPayRecordId)
+            this.getOrderPayOutlayFileList(id, this.repairBusinessData[0].outTradeNo)
+          }
+        }
+      })
+    },
+    getOrderPayOutlayFileList(orderBaseId, outTradeNo) {
+      getOrderPayOutlayFileList({ orderBaseId, outTradeNo }).then(res => {
+        if (~[6].indexOf(this.orderType)) {
+          this.info.fileUrl = res.data ? res.data : []
+        } else {
+          this.info.fileUrl = res.data ? [res.data[0].fileUrl] : ''
+        }
+      })
+    },
+    getOrderPayOutlayDetail(orderBaseId, orderPayRecordId, type) {
+      // {/* INSTALL=安装单 REPAIR=维修单*/}
+      getOrderPayOutlayDetail({ orderPayRecordId }).then(res => {
+        if (~[1, 2, 3, 4].indexOf(this.orderType)) {
+          this.installTableData = res.data
+        } else {
+          this.repairPaymentData = res.data
+        }
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.ZF_header {
+  font-size: 14px;
+  margin: 0px 0 8px;
+}
+</style>
+.

+ 35 - 0
src/views/workOrder/workOrderPool/detailModule/workOrderInfo/buttons/activate.vue

@@ -0,0 +1,35 @@
+<template>
+  <div class="withinLine">
+    <el-button @click="activate" type="primary" size="mini">激活工单</el-button>
+  </div>
+</template>
+
+<script>
+import buttonMixin from './button_mixin.js'
+import { MessageBox } from '@zjlib/element-ui2'
+export default {
+  mixins: [buttonMixin],
+  methods: {
+    activate() {
+      MessageBox.confirm('是否确定激活工单', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.withinLine {
+  display: inline-block;
+  ::v-deep .el-button {
+    margin-left: 0;
+    margin-right: 10px;
+    margin-bottom: 10px;
+  }
+}
+</style>

+ 16 - 0
src/views/workOrder/workOrderPool/detailModule/workOrderInfo/buttons/button_mixin.js

@@ -0,0 +1,16 @@
+export default {
+  props: {
+    orderInfo: {
+      type: Object,
+      default: () => ({})
+    },
+    orderType: {
+      type: Number,
+      default: null
+    },
+    options: {
+      type: Object,
+      default: () => ({})
+    }
+  }
+}

+ 29 - 0
src/views/workOrder/workOrderPool/detailModule/workOrderInfo/buttons/closeButton.vue

@@ -0,0 +1,29 @@
+<template>
+  <div class="withinLine">
+    <el-button type="info" size="mini" @click="clone">关闭</el-button>
+  </div>
+</template>
+
+<script>
+import { EventBus } from '@/utils/eventBus'
+import buttonMixin from './button_mixin.js'
+export default {
+  mixins: [buttonMixin],
+  methods: {
+    clone() {
+      EventBus.$emit('handleOrderClone')
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.withinLine {
+  display: inline-block;
+  ::v-deep .el-button {
+    margin-left: 0;
+    margin-right: 10px;
+    margin-bottom: 10px;
+  }
+}
+</style>

+ 80 - 0
src/views/workOrder/workOrderPool/detailModule/workOrderInfo/buttons/closeOrder.vue

@@ -0,0 +1,80 @@
+<template>
+  <div class="withinLine">
+    <el-button type="primary" size="mini" @click="closeOrder">关闭工单</el-button>
+    <el-dialog
+      title="关闭工单"
+      width="800px"
+      :visible.sync="dialogVisible"
+      :modal-append-to-body="false"
+      :append-to-body="true"
+      :before-close="handleClose"
+    >
+      <div>
+        <h2 style="color: red">注意:工单异常关闭,将无法转结算。</h2>
+        <p>平台信息编号: {{ orderInfo.id }}</p>
+      </div>
+      <el-form ref="closeOrder" size="mini" :model="sendEngineersform" label-width="100px" label-position="left">
+        <el-form-item
+          label="审批意见"
+          prop="remark"
+          :rows="5"
+          :rules="[{ required: true, message: '请输入', trigger: 'blur' }]"
+        >
+          <el-input type="textarea" v-model="sendEngineersform.remark"></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button size="mini" @click="handleClose">取 消</el-button>
+        <el-button size="mini" type="primary" @click="sub">确 定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import buttonMixin from './button_mixin.js'
+export default {
+  mixins: [buttonMixin],
+  data() {
+    return {
+      dialogVisible: false,
+      sendEngineersform: {
+        orderBaseId: '',
+        remark: ''
+      }
+    }
+  },
+  methods: {
+    closeOrder() {
+      this.dialogVisible = true
+      this.sendEngineersform.orderBaseId = this.orderInfo.id
+    },
+    sub() {
+      this.$refs.closeOrder.validate(valid => {
+        if (valid) {
+          
+        } else {
+          this.$message({
+            type: 'warning',
+            message: '审批意见'
+          })
+        }
+      })
+    },
+    handleClose() {
+      Object.assign(this.$data, this.$options.data())
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.withinLine {
+  display: inline-block;
+  ::v-deep .el-button {
+    margin-left: 0;
+    margin-right: 10px;
+    margin-bottom: 10px;
+  }
+}
+</style>

+ 121 - 0
src/views/workOrder/workOrderPool/detailModule/workOrderInfo/buttons/cloudCall.vue

@@ -0,0 +1,121 @@
+<template>
+  <div class="withinLine_cloud_call">
+    <i class="el-icon-phone" @click="letClick" @contextmenu.prevent.stop="rigClick"></i>
+    <el-dialog
+      :modal="true"
+      title="设置联通云呼登入名"
+      :visible.sync="dialogbol"
+      width="700px"
+      :show-close="false"
+      :close-on-click-modal="false"
+      :modal-append-to-body="true"
+      :append-to-body="true"
+    >
+      <el-form :model="form" :rules="formRules" ref="ruleForm" label-width="130px" label-position="top">
+        <el-form-item label="联通云呼登录名" prop="unicomIntegratedId">
+          <el-input style="width: 300px" v-model="form.unicomIntegratedId"></el-input>
+        </el-form-item>
+        <el-form-item label="联通云呼-接听方式" prop="unicomIntegratedType">
+          <el-radio-group v-model="form.unicomIntegratedType">
+            <el-radio label="ExtenType">支持三种方式</el-radio>
+            <el-radio label="Local">直线方式</el-radio>
+            <el-radio label="sip">软电话</el-radio>
+            <el-radio label="gateway">语音网关/IP话机</el-radio>
+          </el-radio-group>
+          <div>
+            (<span style="color: red">选择任意一种成功即可,不成功就换个方式试试</span
+            >)对应云呼平台登录界面选择的接听方式。
+          </div>
+          <div>(按对方平台说的两个地方都选择IP话机,可以不需要每天都登录)</div>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button size="mini" @click="Cancel">取 消</el-button>
+        <el-button size="mini" @click="Confirm" type="primary">确 定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    orderBaseId: {
+      type: [String, Number],
+      default: ''
+    },
+    phone: {
+      type: [String, Number],
+      default: ''
+    }
+  },
+
+  data() {
+    return {
+      dialogbol: false,
+      form: {
+        unicomIntegratedId: '',
+        unicomIntegratedType: ''
+      },
+      formRules: {
+        unicomIntegratedId: [{ required: true, message: '请输入', trigger: 'blur' }],
+        unicomIntegratedType: [{ required: true, message: '请选择', trigger: 'change' }]
+      }
+    }
+  },
+  methods: {
+    letClick() {
+      if (this.phone) {
+       
+      } else {
+        this.$message({
+          type: 'warning',
+          message: '请先选择工程师'
+        })
+        return
+      }
+    },
+    rigClick() {
+      var { unicomIntegratedId, unicomIntegratedType } = JSON.parse(localStorage.getItem('supply_user'))
+      this.form.unicomIntegratedId = unicomIntegratedId || ''
+      this.form.unicomIntegratedType = unicomIntegratedType || ''
+      this.dialogbol = true
+    },
+    Cancel() {
+      this.dialogbol = false
+    },
+    Confirm() {
+      this.$refs.ruleForm.validate(valid => {
+        if (valid) {
+ 
+        } else {
+          console.log('error submit!!')
+          return false
+        }
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss">
+.el-input-group__append {
+  position: relative !important;
+}
+.withinLine_cloud_call {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  .el-icon-phone {
+    width: 100%;
+    height: 100%;
+    display: inline-block;
+    text-align: center;
+    line-height: 26px;
+    background-color: #409eff !important;
+    color: #fff !important;
+  }
+}
+</style>

+ 71 - 0
src/views/workOrder/workOrderPool/detailModule/workOrderInfo/buttons/commitSave.vue

@@ -0,0 +1,71 @@
+<template>
+  <div class="withinLine">
+    <el-button type="primary" size="mini" @click="save">{{
+      orderInfo.orderStatus == 'A1101' || !orderInfo.orderStatus ? '下派工单' : '保存'
+    }}</el-button>
+  </div>
+</template>
+
+<script>
+import buttonMixin from './button_mixin.js'
+import { EventBus } from '@/utils/eventBus'
+export default {
+  mixins: [buttonMixin],
+  props: {
+    cp_gpsAddress: {
+      type: String,
+      default: ''
+    }
+  },
+  methods: {
+    save() {
+      if (this.orderInfo.userAttrId === '1' && this.orderInfo.saleTypeId === '3' && this.orderType === 4) {
+        this.$message.error('用户属性为家庭用户,销售类型不能为工程机')
+        return
+      }
+      function appointVjy(v, name) {
+        if (v.$parent[name]) {
+          return v.$parent[name]
+        } else {
+          return appointVjy(v.$parent, name)
+        }
+      }
+      var tijiao = () => {
+        var { id, createBy, updateBy, updateTime, createTime, ...orderInstall } = this.orderInfo.orderInstall
+        var { id, createBy, updateBy, updateTime, createTime, ...orderRepair } = this.orderInfo.orderRepair
+        
+        // ----------------------------------
+      }
+      appointVjy(
+        this,
+        'vjy'
+      )(() => {
+        if (this.cp_gpsAddress !== this.orderInfo.gpsAddress && this.orderInfo.gpsAddress !== this.orderInfo.address) {
+          this.$confirm('定位地址已更新,是否修改详情地址!', '提示', {
+            confirmButtonText: '去修改',
+            cancelButtonText: '继续提交',
+            type: 'warning'
+          })
+            .then(res => {})
+            .catch(() => {
+              tijiao()
+            })
+        } else {
+          tijiao()
+        }
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.withinLine {
+  display: inline-block;
+  ::v-deep .el-button {
+    margin-left: 0;
+    margin-right: 10px;
+    margin-bottom: 10px;
+  }
+}
+</style>

+ 32 - 0
src/views/workOrder/workOrderPool/detailModule/workOrderInfo/buttons/commitTempSave.vue

@@ -0,0 +1,32 @@
+<template>
+  <div class="withinLine">
+    <el-button type="primary" size="mini" @click="save">临时保存</el-button>
+  </div>
+</template>
+
+<script>
+import buttonMixin from './button_mixin.js'
+import { EventBus } from '@/utils/eventBus'
+export default {
+  mixins: [buttonMixin],
+  methods: {
+    save() {
+      var { id, updateTime, ...orderInstall } = this.orderInfo.orderInstall
+      var { id, updateTime, ...orderRepair } = this.orderInfo.orderRepair
+      
+      // ---------------------------------
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.withinLine {
+  display: inline-block;
+  ::v-deep .el-button {
+    margin-left: 0;
+    margin-right: 10px;
+    margin-bottom: 10px;
+  }
+}
+</style>

+ 93 - 0
src/views/workOrder/workOrderPool/detailModule/workOrderInfo/buttons/copyInfo.vue

@@ -0,0 +1,93 @@
+<template>
+  <el-button v-if="btnys" :class="columnCopyClass" type="info" size="mini">{{ text }}</el-button>
+  <div v-else class="withinLine">
+    <el-button :class="columnCopyClass" type="primary" size="mini">{{ text }}</el-button>
+  </div>
+</template>
+
+<script>
+import buttonMixin from './button_mixin.js'
+import ClipboardJS from 'clipboard'
+var nrBR = `
+`
+export default {
+  mixins: [buttonMixin],
+  props: {
+    text: {
+      type: String,
+      default: ''
+    },
+    columnCopyClass: {
+      type: String,
+      default: 'columnCopyClass_cp'
+    },
+    info: {
+      type: Array,
+      default: () => []
+    },
+    cpText: {
+      type: String,
+      default: ''
+    },
+    btnys: {
+      type: Boolean,
+      default: false
+    }
+  },
+  mounted() {
+    this.textCopy()
+  },
+  beforeDestroy() {
+    if (this.clipboard?.listener?.destroy) {
+      this.clipboard.listener.destroy()
+    }
+  },
+  methods: {
+    // 组装复制内容
+    cpFormInfo() {
+      if (this.cpText) {
+        return this.cpText
+      }
+      return this.info.map(item => {
+        return `${item.formItemAttributes.label}: ${
+          item.getValue
+            ? item.getValue() || ''
+            : item.formItemAttributes.prop && item.formItemAttributes.prop !== '_'
+            ? item.options && this.orderInfo[item.formItemAttributes.prop]
+              ? item.options.find(val => val.value === this.orderInfo[item.formItemAttributes.prop])?.label || ''
+              : this.orderInfo[item.formItemAttributes.prop] || ''
+            : ''
+        }`
+      }).join(nrBR)
+    },
+    // 绑定复制功能
+    textCopy() {
+      this.$nextTick(() => {
+        if (this.clipboard?.listener?.destroy) {
+          this.clipboard.listener.destroy()
+        }
+        this.clipboard = new ClipboardJS(`.${this.columnCopyClass}`, {
+          text: this.cpFormInfo
+        })
+        this.clipboard.on('success', () => {
+          this.$message({
+            type: 'success',
+            message: '复制成功'
+          })
+        })
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.withinLine {
+  display: inline-block;
+  ::v-deep .el-button {
+    margin-left: 0;
+    margin-right: 10px;
+    margin-bottom: 10px;
+  }
+}
+</style>

+ 125 - 0
src/views/workOrder/workOrderPool/detailModule/workOrderInfo/buttons/processFeedback.vue

@@ -0,0 +1,125 @@
+<template>
+  <div class="withinLine">
+    <el-button type="primary" size="mini" @click="open">{{ resultCodeName }}</el-button>
+    <el-dialog
+      title="过程反馈"
+      :visible.sync="dialogVisible"
+      :append-to-body="true"
+      :before-close="handleClose"
+      :close-on-click-modal="false"
+      width="750px"
+    >
+      <zj-page-container direction="row">
+        <zj-page-fill>
+          <div style="width: 100%; box-sizing: border-box; padding: 0 10px">
+            <zj-form
+              v-if="dialogVisible"
+              ref="formRef"
+              :formData="form"
+              :formItems="formItems"
+              :formRules="formRules"
+            />
+          </div>
+        </zj-page-fill>
+      </zj-page-container>
+      <span slot="footer" class="dialog-footer">
+        <el-button size="mini" @click="handleClose">取 消</el-button>
+        <el-button size="mini" type="primary" @click="sub">提交</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import buttonMixin from './button_mixin.js'
+import ClipboardJS from 'clipboard'
+export default {
+  mixins: [buttonMixin],
+  props: {
+    resultCode_: {
+      type: String,
+      default: ''
+    },
+    resultCodeName: {
+      type: String,
+      default: '过程反馈'
+    }
+  },
+  data() {
+    return {
+      tableData: [],
+      dialogVisible: false,
+      PROCESS_DELAY_TYPE: [],
+      form: {
+        remark: '',
+        appointmentTime: '',
+        message: '',
+        isTriggerMessage: '',
+        fileUrl: '',
+        delayType: '',
+        items: [],
+        resultCode: this.resultCode_
+      },
+      optionsList: [],
+      userMobile: [],
+      formRules: {
+        resultCode: [{ required: true, message: '请选择', trigger: 'blur' }],
+        materialProvide: [{ required: true, message: '请选择', trigger: 'blur' }],
+        waitApplyCode: [{ required: true, message: '请输入', trigger: 'blur' }],
+        waitMaterialCode: [{ required: true, message: '请输入', trigger: 'blur' }],
+        qualityFeedbackCode: [{ required: true, message: '请输入', trigger: 'blur' }],
+        feedbackTime: [{ required: true, message: '请选择', trigger: 'blur' }],
+        receiveNumber: [{ required: true, message: '请选择', trigger: 'blur' }]
+      },
+      scripFeedbackList: []
+    }
+  },
+  computed: {
+    // 用户信息
+    userInfo() {
+      return JSON.parse(localStorage.getItem('supply_user'))
+    },
+    formItems() {
+return []
+    }
+  },
+  methods: {
+    open() {
+      this.dialogVisible = true
+    },
+    sub() {
+      this.$refs.formRef.validate(valid => {
+        if (valid) {
+          
+        }
+      })
+    },
+    handleClose() {
+      this.dialogVisible = false
+      Object.assign(this.$data, this.$options.data())
+      this.form.resultCode = this.resultCode_
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+::v-deep .el-date-editor.el-input,
+.el-date-editor.el-input__inner {
+  width: 100%;
+}
+.xijiezhanshi {
+  width: 100%;
+  display: flex;
+  justify-content: space-between;
+  margin-bottom: 5px;
+}
+.withinLine {
+  display: inline-block;
+  ::v-deep .el-button {
+    margin-left: 0;
+    margin-right: 10px;
+    margin-bottom: 10px;
+  }
+}
+</style>

+ 90 - 0
src/views/workOrder/workOrderPool/detailModule/workOrderInfo/buttons/rejectOrder.vue

@@ -0,0 +1,90 @@
+<template>
+  <div class="withinLine">
+    <el-button type="primary" size="mini" @click="open">驳回</el-button>
+    <el-dialog
+      :modal="true"
+      title="驳回"
+      :visible.sync="dialogVisible"
+      width="50%"
+      :show-close="false"
+      :close-on-click-modal="false"
+      :modal-append-to-body="false"
+      append-to-body
+      destroy-on-close
+    >
+      <div>
+        <el-row>
+          <el-col :xs="24" :sm="24" :lg="12">平台信息编号:{{ orderInfo.id || '' }}</el-col>
+          <el-col :xs="24" :sm="24" :lg="12">报完工师傅:{{ orderInfo.workerName || '' }}</el-col>
+        </el-row>
+        <br />
+        <el-form ref="form" size="mini" :rules="formRules" label-position="top" :model="form" label-width="80px">
+          <el-form-item label="备注" prop="remark">
+            <el-input type="textarea" :rows="3" placeholder="请输入内容" v-model="form.remark"> </el-input>
+          </el-form-item>
+        </el-form>
+      </div>
+      <div slot="footer" class="dialog-footer">
+        <el-button size="mini" @click="handleCancel">取 消</el-button>
+        <el-button size="mini" @click="handleConfirm" type="primary">确 定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import buttonMixin from './button_mixin.js'
+export default {
+  mixins: [buttonMixin],
+  components: {},
+  props: {},
+  data() {
+    return {
+      form: {
+        remark: ''
+      },
+      formRules: {
+        remark: [{ required: true, message: '请选择', trigger: 'change' }]
+      },
+      dialogVisible: false
+    }
+  },
+  created() {},
+  watch: {},
+  computed: {},
+  methods: {
+    open() {
+      this.dialogVisible = true
+    },
+    handleCancel() {
+      this.form.remark = ''
+      this.dialogVisible = false
+    },
+    handleConfirm() {
+      this.$refs.form.validate(async valid => {
+        if (valid) {
+          let params = {
+            orderBaseId: this.orderInfo.id,
+            remark: this.form.remark
+          }
+         
+        } else {
+          this.$message.error('* 代表必填必选项,请检查')
+          return false
+        }
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.withinLine {
+  display: inline-block;
+  ::v-deep .el-button {
+    margin-left: 0;
+    margin-right: 10px;
+    margin-bottom: 10px;
+  }
+}
+</style>

+ 87 - 0
src/views/workOrder/workOrderPool/detailModule/workOrderInfo/buttons/void.vue

@@ -0,0 +1,87 @@
+<template>
+  <div class="withinLine">
+    <el-button type="primary" size="mini" @click="open">作废</el-button>
+    <el-dialog
+      title="作废"
+      :visible.sync="dialogVisible"
+      :append-to-body="true"
+      width="500px"
+      :before-close="handleClose"
+    >
+      <el-form ref="form" size="mini" :model="form" label-width="80px">
+        <el-form-item
+          label="备注内容"
+          prop="cancelRemark"
+          :rules="[{ required: true, message: '请输入', trigger: 'blur' }]"
+        >
+          <el-input type="textarea" :rows="3" placeholder="请输入内容" v-model="form.cancelRemark"> </el-input>
+        </el-form-item>
+        <el-form-item
+          label="作废原因"
+          prop="cancelReason"
+          :rules="[{ required: true, message: '请选择', trigger: 'blur' }]"
+        >
+          <el-select v-model="form.cancelReason" placeholder="请选择">
+            <el-option
+              v-for="(item, index) in ORDER_CANCEL_REASON"
+              :key="index"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button size="mini" @click="handleClose">取 消</el-button>
+        <el-button size="mini" type="primary" @click="sub">提交</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import buttonMixin from './button_mixin.js'
+export default {
+  mixins: [buttonMixin],
+  data() {
+    return {
+      dialogVisible: false,
+      form: {},
+      ORDER_CANCEL_REASON: []
+    }
+  },
+  methods: {
+    open() {
+      if (this.orderInfo.orderStatus === 'A13081' || this.orderInfo.orderStatus === 'A1308') {
+        this.$message.error('已作废工单,不可再作废')
+        return
+      }
+
+      this.dialogVisible = true
+    },
+    sub() {
+      this.$refs.form.validate(valid => {
+        if (valid) {
+
+        }
+      })
+    },
+    handleClose() {
+      this.dialogVisible = false
+      Object.assign(this.$data, this.$options.data())
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.withinLine {
+  display: inline-block;
+  ::v-deep .el-button {
+    margin-left: 0;
+    margin-right: 10px;
+    margin-bottom: 10px;
+  }
+}
+</style>

+ 182 - 0
src/views/workOrder/workOrderPool/detailModule/workOrderInfo/index.vue

@@ -0,0 +1,182 @@
+<template>
+  <zj-page-container>
+    <zj-page-fill class="neibuview">
+      <zj-form-container ref="formRef" :form-data="orderInfo" :form-rules="formRules"
+        :form-attributes="{ size: 'mini' }">
+        <!-- 派工信息 创建不需要 -->
+        <zj-form-module title="派工信息" label-width="68px" :form-data="orderInfo"
+          :form-items="dispatchInfo">
+          <div slot="internal-bottom">
+            <copy-info text="复制工单信息" :info="dispatchInfo" :order-info="orderInfo" />
+          </div>
+          <div slot="right" style="width: 55%; position: relative">
+            <div class="pgxxTable">
+              <zj-table key="paigongxinxitable" :columns="pgxxColumns" :table-data="pgxxTableData" :table-attributes="{
+                height: '100%',
+                border: true
+              }" />
+            </div>
+          </div>
+        </zj-form-module>
+        <!-- 基本信息 -->
+        <zj-form-module title="基本信息" label-width="100px" :form-data="orderInfo"
+          :form-items="basicInfo" />
+        <!-- 服务信息 -->
+        <zj-form-module title="服务信息" label-width="100px" :form-data="orderInfo"
+          :form-items="serviceInfo" />
+        <!-- 产品信息 -->
+        <zj-form-module
+          :title="`<span style='color:red'>*</span> ${orderInfo.serviceCategoryId == 1 ? '产品信息' : '服务内容'}`"
+          :form-data="orderInfo" :form-items="product">
+        </zj-form-module>
+        <!-- 其它信息 -->
+        <zj-form-module title="其它信息" label-width="80px" :form-data="orderInfo"
+          :form-items="otherInfo" />
+        <!-- 派单信息 -->
+        <zj-form-module label-width="100px" title="派单信息" :form-data="orderInfo"
+          :form-items="pandanxinxi" />
+      </zj-form-container>
+    </zj-page-fill>
+    <!-- 操作按钮 -->
+    <div>
+      <div style="box-sizing: border-box;padding: 10px 10px 0;" v-if="id">
+        <!-- 关闭 -->
+        <close-button :options="options" />
+        <!-- 临时保存 -->
+        <commit-temp-save v-if="~btnRestrict.indexOf(25)" :order-info="orderInfo"
+          :order-type="orderType" :options="options" @upoptions="upoptions" />
+        <!-- 关闭工单 -->
+        <close-order v-if="~btnRestrict.indexOf(1)" :order-info="{ ...orderInfo }"
+          :order-type="orderType" :options="options" @upoptions="upoptions" />
+        <!-- 过程反馈 -->
+        <process-feedback v-if="~btnRestrict.indexOf(11)" :order-info="orderInfo"
+          :order-type="orderType" @upoptions="upoptions" />
+        <!-- 驳回 -->
+        <div class="withinLine">
+          <rejectOrder v-if="~btnRestrict.indexOf(13)" :order-info="orderInfo"
+            @upoptions="upoptions" />
+        </div>
+        <!-- 备注 -->
+        <process-feedback v-if="~btnRestrict.indexOf(14) " :order-info="orderInfo"
+          :order-type="orderType" resultCode_="999" resultCodeName="备注" @upoptions="upoptions" />
+        <!-- 作废 -->
+        <void-view v-if="~btnRestrict.indexOf(15)" :order-info="orderInfo" :order-type="orderType"
+          @upoptions="upoptions" />
+        <!-- 激活工单 -->
+        <activate v-if="~btnRestrict.indexOf(16)" :order-info="orderInfo"
+          :order-type="orderType" @upoptions="upoptions" />
+      </div>
+      <div style="box-sizing: border-box;padding: 10px 10px 0;" v-else>
+        <!-- 关闭 -->
+        <close-button :options="options" />
+        <!-- 临时保存 -->
+        <commit-temp-save :order-info="orderInfo"
+          :order-type="orderType" :options="options" @upoptions="upoptions" />
+        <!-- 下派工单 -->
+        <commit-save :order-info="orderInfo" :order-type="orderType"
+          :options="options" :cp_gpsAddress="cp_gpsAddress" @upoptions="upoptions" />
+      </div>
+    </div>
+  </zj-page-container>
+</template>
+
+<script>
+import workOrderSelectData from './mixins/workOrderSelectData.js'
+import workOrderLogic from './mixins/workOrderLogic.js'
+import basicInfo from './mixins/basicInfo.js'
+import dispatchInfo from './mixins/dispatchInfo.js'
+import otherInfo from './mixins/otherInfo.js'
+import productColumns from './mixins/productColumns.js'
+import serviceInfo from './mixins/serviceInfo.js'
+import pandanxinxi from './mixins/pandanxinxi.js'
+import commitSave from './buttons/commitSave.vue'
+import commitTempSave from './buttons/commitTempSave.vue'
+import voidView from './buttons/void.vue'
+import processFeedback from './buttons/processFeedback.vue'
+import closeButton from './buttons/closeButton.vue'
+import copyInfo from './buttons/copyInfo.vue'
+import closeOrder from './buttons/closeOrder.vue'
+import activate from './buttons/activate.vue'
+import rejectOrder from './buttons/rejectOrder.vue'
+
+export default {
+  components: {
+    activate,
+    closeOrder,
+    commitSave,
+    commitTempSave,
+    voidView,
+    processFeedback,
+    closeButton,
+    copyInfo,
+    rejectOrder,
+  },
+  mixins: [
+    workOrderSelectData,
+    workOrderLogic,
+    basicInfo,
+    dispatchInfo,
+    otherInfo,
+    productColumns,
+    serviceInfo,
+    pandanxinxi,
+  ],
+  methods: {
+    upoptions() {
+      
+    },
+    vjy(cb) {
+      this.$refs.formRef.validate((valid, invalidFields, errLabels) => {
+        if (valid) {
+          cb && cb()
+        }
+      })
+    },
+    appointVjy(arr, cb) {
+      this.$refs.formRef.validateField_fx(
+        arr,
+        (valid, invalidFields, errLabels) => {
+          if (valid) {
+            cb && cb()
+          }
+        }
+      )
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.neibuview {
+  box-sizing: border-box;
+  padding-left: 16px;
+  ::v-deep .zj-page-fill-scroll {
+    box-sizing: border-box;
+    padding-right: 16px;
+    &>div:nth-child(1){
+      margin-top: 20px;
+    }
+    &::-webkit-scrollbar {
+      // width: 0px !important;
+    }
+  }
+}
+
+.pgxxTable {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  right: 0;
+}
+
+.withinLine {
+  display: inline-block;
+
+  ::v-deep .el-button {
+    margin-left: 0;
+    margin-right: 10px;
+    margin-bottom: 10px;
+  }
+}
+</style>

+ 297 - 0
src/views/workOrder/workOrderPool/detailModule/workOrderInfo/mixins/basicInfo.js

@@ -0,0 +1,297 @@
+import { lbsAmapRegion } from '@/api/common.js'
+import geographicalPosi from '@/components/geographicalPosi/index.vue'
+export default {
+  data() {
+    return { provinceList: [], cityList: [], areaList: [], streetList: [], centerDialogVisible: false, selListData: [] }
+  },
+  computed: {
+    // 基本信息数据模型
+    basicInfo() {
+      return [
+        {
+          isShow: this.formOptions.userName.isShow,
+          name: 'el-input',
+          md: 6,
+          attributes: { disabled: !this.formOptions.userName.isEdit, placeholder: '请输入' },
+          formItemAttributes: {
+            label: '客户名称',
+            prop: 'userName',
+            rules: this.formOptions.userName.isRules
+          }
+        },
+        {
+          isShow: this.formOptions.linkName.isShow,
+          name: 'el-input',
+          md: 6,
+          attributes: { disabled: !this.formOptions.linkName.isEdit, placeholder: '请输入' },
+          formItemAttributes: {
+            label: '联系人',
+            prop: 'linkName',
+            rules: this.formOptions.linkName.isRules
+          }
+        },
+        {
+          isShow: this.formOptions.userMobile.isShow,
+          name: 'el-input',
+          md: 6,
+          attributes: { disabled: !this.formOptions.userMobile.isEdit, placeholder: '请输入' },
+          formItemAttributes: {
+            label: '客户电话',
+            prop: 'userMobile',
+            rules: this.formOptions.userMobile.isRules
+          }
+        },
+        {
+          isShow: this.formOptions.userMobile2.isShow,
+          name: 'el-input',
+          md: 6,
+          attributes: { disabled: !this.formOptions.userMobile2.isEdit, placeholder: '请输入' },
+          formItemAttributes: {
+            label: '客户电话2',
+            prop: 'userMobile2',
+            rules: this.formOptions.userMobile2.isRules
+          }
+        },
+        {
+          isShow: this.formOptions.gpsAddress.isShow,
+          name: 'el-select',
+          md: 7,
+          formItemAttributes: {
+            label: '客户地址', //省
+            prop: 'provinceId',
+            rules: this.formOptions.gpsAddress.isRules,
+            errLabel: '省'
+          },
+          options: this.provinceList.map((v, i) => ({ value: v.lbsId, label: v.name })),
+          attributes: { disabled: true, clearable: true, filterable: true, placeholder: '请选择' },
+          events: {
+            change: () => {
+              // 获取省名称
+              this.orderInfo.province = this.provinceList.find(item => item.lbsId === val).name
+              // 清除市区街道以及详细地址数据
+              this.delDataK(1)
+              lbsAmapRegion({ parentLbsId: val }).then(res => {
+                this.cityList = res.data
+              })
+            }
+          }
+        },
+        {
+          isShow: this.formOptions.gpsAddress.isShow,
+          name: 'el-select',
+          md: 5,
+          formItemAttributes: {
+            'label-width': '0px',
+            label: '', //市
+            prop: 'cityId',
+            rules: this.formOptions.gpsAddress.isRules,
+            errLabel: '市'
+          },
+          options: this.cityList.map((v, i) => ({ value: v.lbsId, label: v.name })),
+          attributes: { disabled: true, clearable: true, filterable: true, placeholder: '请选择' },
+          events: {
+            change: () => {
+              // 获取市名称
+              this.orderInfo.city = this.cityList.find(item => item.lbsId === val).name
+              // 清除区街道以及详细地址数据
+              this.delDataK(2)
+              lbsAmapRegion({ parentLbsId: val }).then(res => {
+                this.areaList = res.data
+              })
+            }
+          }
+        },
+        {
+          isShow: this.formOptions.gpsAddress.isShow,
+          name: 'el-select',
+          md: 5,
+          formItemAttributes: {
+            'label-width': '0px',
+            label: '', //区
+            prop: 'areaId',
+            rules: this.formOptions.gpsAddress.isRules,
+            errLabel: '区'
+          },
+          options: this.areaList.map((v, i) => ({ value: v.lbsId, label: v.name })),
+          attributes: { disabled: true, clearable: true, filterable: true, placeholder: '请选择' },
+          events: {
+            change: () => {
+              // 获取区名称
+              this.orderInfo.area = this.areaList.find(item => item.lbsId === val).name
+              // 清除街道以及详细地址数据
+              this.delDataK(3)
+              lbsAmapRegion({ parentLbsId: val }).then(res => {
+                this.streetList = res.data
+              })
+            }
+          }
+        },
+        {
+          isShow: this.formOptions.gpsAddress.isShow,
+          name: 'el-select',
+          md: 5,
+          formItemAttributes: {
+            'label-width': '0px',
+            label: '', //街道
+            prop: 'streetId',
+            rules: this.formOptions.gpsAddress.isRules,
+            errLabel: '街道'
+          },
+          options: this.streetList.map((v, i) => ({ value: v.lbsId, label: v.name })),
+          attributes: { disabled: true, clearable: true, filterable: true, placeholder: '请选择' },
+          events: {
+            change: () => {
+              // 获取街道名称
+              this.orderInfo.street = this.streetList.find(item => item.lbsId === val).name
+              // 清除详细地址数据
+              this.delDataK(4)
+            }
+          }
+        },
+        {
+          isShow: this.formOptions.gpsAddress.isShow,
+          name: 'slot-component',
+          md: 2,
+          formItemAttributes: {
+            'label-width': '0px'
+          },
+          render: (h, { props }) => {
+            var { formData } = props
+            return (
+              <geographicalPosi
+                disabled={!this.formOptions.gpsAddress.isEdit}
+                formData={formData}
+                onSelectPosi={data => {
+                  // 获取经纬度
+                  formData.lng = data.center[0]
+                  formData.lat = data.center[1]
+                  // 获取定位的省市区街道
+                  var { province, city, district, township } = data.data.addressComponent
+                  // 获取选中省名称id
+                  var { lbsId, name } = this.provinceList.find(item => item.name === province)
+                  formData.provinceId = lbsId
+                  formData.province = name
+                  // 请求市选项
+                  lbsAmapRegion({ parentLbsId: formData.provinceId }).then(res => {
+                    // 赋值市选项
+                    this.cityList = res.data
+                    // 获取选中市名称id
+                    var { lbsId, name } = res.data.find(item => item.name === city)
+                    formData.cityId = lbsId
+                    formData.city = name
+                    // 请求区选项
+                    lbsAmapRegion({ parentLbsId: formData.cityId }).then(res => {
+                      // 赋值区选项
+                      this.areaList = res.data
+                      // 获取选中区名称id
+                      var { lbsId, name } = res.data.find(item => item.name === district)
+                      formData.areaId = lbsId
+                      formData.area = name
+                      // 请求街道选项
+                      lbsAmapRegion({ parentLbsId: formData.areaId }).then(res => {
+                        // 赋值街道选项
+                        this.streetList = res.data
+                        // 获取选中街道名称id
+                        var { lbsId, name } = res.data.find(item => item.name === township)
+                        formData.streetId = lbsId
+                        formData.street = name
+                        // 赋值GPS详细地址
+                        formData.gpsAddress = data.name
+                        // 如果手动填写详细地址没有值时,赋值GPS地址
+                        if (!formData.address) {
+                          // formData.address = data.name
+                        }
+                      })
+                    })
+                  })
+                }}
+              />
+            )
+          }
+        },
+        {
+          isShow: this.formOptions.gpsAddress.isShow,
+          name: 'el-input',
+          md: 13,
+          formItemAttributes: { label: '', prop: 'gpsAddress', rules: this.formOptions.gpsAddress.isRules },
+          attributes: { disabled: true, placeholder: 'GPS地址' }
+        },
+        {
+          isShow:this.formOptions.address.isShow,
+          name: 'el-input',
+          md: 11,
+          formItemAttributes: { label: '', prop: 'address', 'label-width': '0px', rules:this.formOptions.address.isRules },
+          attributes: { disabled: !this.formOptions.address.isEdit , placeholder: '详细地址' }
+        },
+      ]
+    }
+  },
+  watch: {
+    initBool(newVal) {
+      if (newVal) {
+        // 初始化请求省市区街道下拉选项数据
+        lbsAmapRegion().then(res => {
+          this.provinceList = res.data
+          // 创建工单时获取ip地址定位赋值
+          if (!this.id && this.$IpAdd.province) {
+            var item = this.provinceList.find(item => item.name === this.$IpAdd.province)
+            if (item) {
+              this.orderInfo.provinceId = item.lbsId
+              this.orderInfo.province = item.name
+            }
+          }
+          if (this.orderInfo.provinceId) {
+            lbsAmapRegion({ parentLbsId: this.orderInfo.provinceId }).then(res => {
+              this.cityList = res.data
+              // 创建工单时获取ip地址定位赋值
+              if (!this.id && this.$IpAdd.city) {
+                var item2 = this.cityList.find(item => item.name === this.$IpAdd.city)
+                if (item2) {
+                  this.orderInfo.cityId = item2.lbsId
+                  this.orderInfo.city = item2.name
+                }
+              }
+              if (this.orderInfo.cityId) {
+                lbsAmapRegion({ parentLbsId: this.orderInfo.cityId }).then(res => {
+                  this.areaList = res.data
+                })
+              }
+              if (this.orderInfo.areaId) {
+                lbsAmapRegion({ parentLbsId: this.orderInfo.areaId }).then(res => {
+                  this.streetList = res.data
+                })
+              }
+            })
+          }
+        })
+      }
+    }
+  },
+  methods: {
+    delDataK(num) {
+      if (num <= 1) {
+        // 删除市
+        this.orderInfo.cityId = ''
+        this.orderInfo.city = ''
+        // 删除市选项
+        this.cityList = []
+      }
+      if (num <= 2) {
+        // 删除区
+        this.orderInfo.areaId = ''
+        this.orderInfo.area = ''
+        // 删除区选项
+        this.areaList = []
+      }
+      if (num <= 3) {
+        // 删除街道
+        this.orderInfo.streetId = ''
+        this.orderInfo.street = ''
+        // 删除街道选项
+        this.streetList = []
+      }
+      // 删除gps地址
+      this.orderInfo.gpsAddress = ''
+    }
+  }
+}

+ 148 - 0
src/views/workOrder/workOrderPool/detailModule/workOrderInfo/mixins/dispatchInfo.js

@@ -0,0 +1,148 @@
+import copyInfo from '../buttons/copyInfo.vue'
+export default {
+  data() {
+    return {
+      // 派工信息列表
+      pgxxColumns: [
+        {
+          columnAttributes: {
+            label: '操作类别',
+            prop: 'type',
+            width: 140
+          }
+        },
+        {
+          columnAttributes: {
+            label: '操作内容',
+            prop: 'content'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '附件',
+            prop: 'fileUrl',
+            width: 100
+          },
+          render: (h, { row, index }) => {
+            return (
+              <div style={{ padding: '0 6px' }}>
+                {row.fileUrl ? (
+                  <div>
+                    <el-button
+                      type="text"
+                      onClick={() => {
+                        window.open(this.$xdocUrl + encodeURIComponent(this.$imageUrl + row.fileUrl))
+                      }}
+                    >
+                      在线查看附件
+                    </el-button>
+                    <br />
+                    <el-button
+                      type="text"
+                      onClick={() => {
+                        window.open(this.$imageUrl + row.fileUrl)
+                      }}
+                    >
+                      下载附件
+                    </el-button>
+                  </div>
+                ) : (
+                  '无'
+                )}
+              </div>
+            )
+          }
+        },
+        {
+          columnAttributes: {
+            label: '最后操作时间',
+            prop: 'createTime',
+            width: 140
+          }
+        },
+        {
+          columnAttributes: {
+            label: '操作人',
+            prop: 'operator',
+            width: 140
+          }
+        }
+      ],
+      pgxxTableData: []
+    }
+  },
+  computed: {
+    // 派工信息
+    dispatchInfo() {
+      return [
+        {
+          name: 'el-input',
+          md: 24,
+          attributes: { disabled: true, placeholder: '请输入' },
+          formItemAttributes: { label: '工单单号', prop: 'id' },
+          append: (h, { props, onInput }) => {
+            var { value } = props
+            return <copyInfo
+              btnys={true}
+              slot="append"
+              text="复制"
+              columnCopyClass="columnCopyClass_cp_888"
+              cpText={value}
+            ></copyInfo>
+          }
+        },
+        {
+          name: 'slot-component',
+          md: 24,
+          attributes: { disabled: true, placeholder: '请输入' },
+          formItemAttributes: { label: '网点信息', prop: 'createWebsitName' },
+          render: (h, { props, onInput }) => {
+            var { formData } = props
+            return (
+              <el-input
+                value={`(${formData.createWebsitId || ''})-${formData.createWebsitName || ''}`}
+                disabled={true}
+                size="mini"
+                placeholder="请输入"
+              ></el-input>
+            )
+          },
+          getValue: () => {
+            return `${this.orderInfo.createWebsitName}  ${this.orderInfo.createWebsitId}`
+          }
+        },
+        {
+          name: 'el-select',
+          options: [],
+          md: 24,
+          attributes: { disabled: true, placeholder: '请选择' },
+          formItemAttributes: { label: '派工状态', prop: 'dispatchStatus' }
+        },
+        {
+          name: 'el-input',
+          md: 24,
+          attributes: { disabled: true, placeholder: '请输入' },
+          formItemAttributes: { label: '创建时间', prop: 'appraiseContent' }
+        },
+        {
+          name: 'el-input',
+          md: 24,
+          attributes: { disabled: true, placeholder: '请输入' },
+          formItemAttributes: { label: '派单时间', prop: 'appraiseContent' }
+        },
+        {
+          name: 'el-input',
+          md: 24,
+          attributes: { disabled: true, placeholder: '请输入' },
+          formItemAttributes: { label: '接单时间', prop: 'appraiseContent' }
+        },
+      ]
+    }
+  },
+  methods: {
+    // 获取操作记录
+    getCaozuojil() {
+
+    }
+  }
+}

+ 18 - 0
src/views/workOrder/workOrderPool/detailModule/workOrderInfo/mixins/otherInfo.js

@@ -0,0 +1,18 @@
+export default {
+  data() {
+    return {}
+  },
+  computed: {
+    otherInfo() {
+      return [
+        {
+          isShow: this.formOptions.remark.isShow,
+          name: 'el-input',
+          md: 24,
+          attributes: { disabled: !this.formOptions.remark.isEdit, type: 'textarea', rows: 3, placeholder: '请输入' },
+          formItemAttributes: { label: '备注', prop: 'remark', rules: this.formOptions.remark.isRules }
+        }
+      ]
+    }
+  }
+}

+ 130 - 0
src/views/workOrder/workOrderPool/detailModule/workOrderInfo/mixins/pandanxinxi.js

@@ -0,0 +1,130 @@
+export default {
+  data() {
+    return {
+      customerWebsitRelaList: [],
+      orderColumns: [
+        {
+          columnAttributes: {
+            label: '信息编号',
+            prop: 'pgid'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '工单类型',
+            prop: 'orderSmallType'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '工程师',
+            prop: 'workerName'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '客户名称',
+            prop: 'userName'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '客户电话',
+            prop: 'userMobile'
+          }
+        },
+        {
+          columnAttributes: {
+            minWidth: '200px',
+            label: '客户地址(点击文字查看更新)',
+            prop: 'address'
+          }
+        }
+      ],
+      engineerListColumns: [
+        {
+          columnAttributes: {
+            label: '工程师类型',
+            prop: 'workerType'
+          },
+          render: (h, { row, column, index }) => {
+            return (
+              <div style="padding-left:10px">
+                {row.workerType === 'MASTER' ? '主要工程师' : row.workerType === 'SLAVE' ? '辅助工程师' : ''}
+              </div>
+            )
+          }
+        },
+        {
+          columnAttributes: {
+            label: '工程师信息',
+            prop: 'workerName'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '联系电话',
+            prop: 'mobile'
+          },
+          render: (h, { row, column, index }) => {
+            return <div style="padding-left:10px">{row.workerMobile || row.mobile}</div>
+          }
+        },
+        {
+          columnAttributes: {
+            label: '今日未完工数',
+            prop: 'todayUndone'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '总未完工数',
+            prop: 'totalUndone'
+          }
+        }
+      ]
+    }
+  },
+  computed: {
+    pandanxinxi() {
+      return [
+        {
+          isShow: this.formOptions.websitId.isShow,
+          name: 'el-select',
+          options: [],
+          md: 6,
+          attributes: { disabled: this.formOptions.websitId.isEdit, placeholder: '请选择' },
+          formItemAttributes: { label: '网点名称', prop: 'websitId',rules: this.formOptions.websitId.isRules, }
+        },
+        {
+          isShow: this.formOptions.orderWorkers.isShow,
+          name: 'slot-component',
+          md: 24,
+          attributes: { disabled: this.formOptions.orderWorkers.isEdit },
+          formItemAttributes: {
+            label: '工程师',
+            prop: 'orderWorkers',
+            rules: this.formOptions.orderWorkers.isRules,
+            errLabel: '工程师'
+          },
+          render: (h, { props }) => {
+            var { formData } = props
+            return (
+              <div>
+                <zj-table
+                  ref="tableEl"
+                  isDrop={true}
+                  columns={this.engineerListColumns}
+                  tableData={this.orderInfo.orderWorkers}
+                ></zj-table>
+              </div>
+            )
+          }
+        }
+      ]
+    }
+  },
+  methods: {
+    
+  }
+}

+ 29 - 0
src/views/workOrder/workOrderPool/detailModule/workOrderInfo/mixins/productColumns.js

@@ -0,0 +1,29 @@
+export default {
+  data() {
+    return {
+      productColumns:[]
+    }
+  },
+  computed: {
+    product() {
+      return [{
+        name: 'slot-component',
+        md: 24,
+        formItemAttributes: {
+          label: '',
+          'label-width': '0px',
+          prop: 'orderProductList',
+          errLabel: '产品信息'
+        },
+        render: (h, { props }) => {
+          return (
+            <zj-table key="chanpinxinxitable" columns={this.productColumns} table-data={this.orderInfo.orderProductList} />
+          )
+        }
+      }]
+    },
+  },
+  methods: {
+    
+  }
+}

+ 114 - 0
src/views/workOrder/workOrderPool/detailModule/workOrderInfo/mixins/serviceInfo.js

@@ -0,0 +1,114 @@
+export default {
+  data() {
+    return {
+      customerOptions: [],
+      BRAND: [],
+      SaleTypeList: [],
+      SON_TYPE: [],
+      orderTypeData: [],
+      demandTypeData: [],
+      demandSmallTypeData: [],
+      MAIN_TYPE2: [],
+      serviceCategory: [],
+    }
+  },
+  computed: {
+    serviceInfo() {
+      return [
+        {
+          isShow: this.formOptions.orderType.isShow,
+          name: 'zj-select',
+          md: 6,
+          options: this.orderTypeData,
+          attributes: {
+            selectFirstOne: true,
+            fillMode: 0,
+            placeholder: '请选择',
+            disabled: !this.formOptions.orderType.isEdit,
+            clearable: true,
+            filterable: true
+          },
+          formItemAttributes: {
+            label: '工单类型',
+            prop: 'orderType',
+            rules: this.formOptions.orderType.isRules
+          }
+        },
+
+        {
+          isShow: this.formOptions.infoSourceId.isShow,
+          name: 'el-select',
+          md: 6,
+          options: this.SOURCE,
+          attributes: {
+            disabled: !this.formOptions.infoSourceId.isEdit,
+            placeholder: '请选择',
+            clearable: true,
+            filterable: true
+          },
+          formItemAttributes: {
+            label: '消息来源',
+            prop: 'infoSourceId',
+            rules: this.formOptions.infoSourceId.isRules
+          }
+        },
+        {
+          isShow: this.formOptions.infoChannelId.isShow,
+          name: 'el-select',
+          md: 6,
+          options: this.CHANNEL,
+          attributes: {
+            disabled: !this.formOptions.infoChannelId.isEdit,
+            placeholder: '请选择',
+            clearable: true,
+            filterable: true
+          },
+          formItemAttributes: {
+            label: '消息渠道',
+            prop: 'infoChannelId',
+            rules: this.formOptions.infoChannelId.isRules
+          }
+        },
+
+        {
+          isShow: this.formOptions.expectArrivalTime.isShow,
+          name: 'slot-component',
+          md: 6,
+          formItemAttributes: {
+            'label-width': '110px',
+            label: '预计到货时间',
+            prop: 'expectArrivalTime',
+            rules: this.formOptions.expectArrivalTime.isRules
+          },
+          render: (h, { props }) => {
+            var { formData } = props
+            return <el-date-picker
+            style="width:100%"
+            placeholder="选择日期时间"
+            type="datetime"
+            valueFormat="yyyy-MM-dd HH:mm:ss"
+            disabled={!this.formOptions.expectArrivalTime.isEdit}
+            value={formData.expectArrivalTime}
+            onInput={val => {
+              formData.expectArrivalTime = val
+              this.orderInfo.expectTime = ''
+              this.orderInfo.expectStartTime = ''
+              this.orderInfo.expectEndTime = ''
+            }}
+            pickerOptions={{
+              disabledDate: time => {
+                let myDate = new Date(formData.buyTime || '')
+                let _beforeDay = myDate.setDate(new Date(formData.buyTime || '').getDate())
+                return time.getTime() < _beforeDay
+              }
+            }}
+          ></el-date-picker>
+          }
+        },
+      ]
+    }
+  },
+  methods: {
+
+  }
+}

+ 626 - 0
src/views/workOrder/workOrderPool/detailModule/workOrderInfo/mixins/workOrderLogic.js

@@ -0,0 +1,626 @@
+var initdata_ = {
+  websitId_qdUse: '',
+  //基本信息
+  userName: '',
+  linkName: '',
+  userMobile: '',
+  userMobile2: '',
+  userAttrId: '1',
+  userAttr: '',
+  vip: '',
+  areaCode: '',
+  telPhone: '',
+  province: '',
+  provinceId: '',
+  city: '',
+  cityId: '',
+  area: '',
+  areaId: '',
+  street: '',
+  streetId: '',
+  address: '',
+  gpsAddress: '',
+  lat: '',
+  lng: '',
+  //服务信息
+  serviceCategoryId: '',
+  orderType: '',
+  orderSmallType: '',
+  brandId: '',
+  productBrandId: '',
+  mainId: '',
+  mainName: '',
+  zbSaleWebsitId: '', //总包商户参数
+  saleWebsitId: '',
+  saleWebsitName: '',
+  saleNo: '',
+  saleTypeId: '',
+  saleType: '',
+  saleLinkName: '',
+  saleLinkPhone: '',
+  infoSourceId: '2002',
+  infoChannelId: '101',
+  crossNo: '',
+  buyTime: '',
+  marketActivityId: '',
+  marketActivityName: '',
+  invoiceNo: '',
+  expectStartTime: '',
+  expectEndTime: '',
+  uploadFlag: true,
+  isOnsiteCharges: 'NO',
+  // 时间
+  expectTime: '',
+  //其他信息
+  remark: '',
+  //特殊要求
+  labels1: [],
+  labels2: [],
+  //派单信息
+  dispatchFlag: '',
+  websitId: '',
+  appointmentTime: '',
+  orderWorkers: [],
+  orderBaseRelaList: [],
+  orderProductList: [],
+  orderCleanItems: [],
+  orderMaterialList: [],
+  orderRepair: {
+    demandTypeId: '',
+    demandTypeName: '',
+    demandSmallTypeId: '',
+    demandSmallTypeName: '',
+    isOnsiteCharges: 'NO'
+  },
+  orderInstall: {
+    expectArrivalTime: '',
+    //其他信息
+    bracket: '',
+    pipe: '',
+    swithFlag: '',
+    highAltitude: '',
+    hole: '',
+    // 商城信息
+    shopOrderNo: '',
+    shopFlag: '',
+    shopNo: '',
+    shopName: '',
+    shopOrderPhone: '',
+    shopNewRetail: '',
+    enginName: '',
+    enginNo: '',
+    enginAdvanceType: '',
+    enginMaterialSupply1: ''
+  }
+}
+
+export default {
+  props: {
+    id: {
+      type: [String, Number],
+      default: null
+    },
+    options: {
+      type: Object,
+      default: () => ({})
+    },
+    createWorkerData: {
+      type: Object,
+      default: null
+    },
+    isEnginInfo: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+      orderInfo: {},
+      initBool: false,
+      userNameFocu: false,
+      linkNameFocu: false,
+      cp_gpsAddress: ''
+    }
+  },
+  watch: {
+    orderType(newVal, oldVal) {
+      this.$emit('updateOrderType', newVal)
+    },
+  },
+  computed: {
+    // 用户信息
+    userInfo() {
+      return JSON.parse(localStorage.getItem('supply_user'))
+    },
+    // 判断工单状态
+    orderType() {
+      if (this.orderInfo) {
+        
+      }
+      return -1
+    },
+    // 处理操作按钮是否可以操作
+    btnRestrict() {
+      return [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30]
+    },
+    // 处理每个字段是否可编辑
+    formOptions() {
+      return {
+        // 基础信息--------------------
+        // 客户名称
+        userName: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 联系人
+        linkName: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 客户电话
+        userMobile: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 客户电话2
+        userMobile2: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 用户属性,总包服务商和平台超管可以编辑
+        userAttrId: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // vip等级
+        vip: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 区号
+        areaCode: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 固话
+        telPhone: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        gpsAddress: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 详细地址
+        address: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        orderWorkers: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 定位获取地址功能
+        geographicalPosi: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 商城信息-------------------
+        // 工单行号
+        shopOrderNo: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 电商标识
+        shopFlag: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 店铺编号
+        shopNo: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 店铺名称
+        shopName: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 下单电话
+        shopOrderPhone: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 是否新零售
+        shopNewRetail: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 其它信息------------------------
+        // 支架
+        bracket: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 加长管
+        pipe: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 空气开关
+        swithFlag: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 高空作业
+        highAltitude: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 一次性成型墙孔
+        hole: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 备注
+        remark: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 派单信息-----------------------------
+        // 派工方式
+        dispatchFlag: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 服务商网点
+        websitId: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 预约上门日期
+        appointmentTime: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 添加修改工程师
+        dispatched: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 产品信息-------------------------------
+        // 新增,报完工前并且没有作废没有关闭可以修改
+        addProductInfo: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 删除,报完工前并且没有作废没有关闭可以修改
+        delProduct: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 编辑,报完工前并且没有作废没有关闭可以修改
+        endProductInfo: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 故障信息-------------------------------
+        // 新增,报完工前并且没有作废没有关闭可以修改
+        addmalfunctionInfo: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 删除,报完工前并且没有作废没有关闭可以修改
+        delmalfunction: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 编辑,报完工前并且没有作废没有关闭可以修改
+        endmalfunctionInfo: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 清洗信息-------------------------------
+        // 新增,报完工前并且没有作废没有关闭可以修改
+        addcleanseInfo: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 删除,报完工前并且没有作废没有关闭可以修改
+        delcleanse: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 编辑,报完工前并且没有作废没有关闭可以修改
+        endcleanseInfo: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 服务信息--------------------------------
+        // 总包商户
+        brandId: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 商户网点
+        saleWebsitId: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 服务类目
+        serviceCategoryId: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 工单类型
+        orderType: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 工单小类
+        orderSmallType: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        //
+        demandTypeId: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        //
+        demandSmallTypeId: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 品牌
+        productBrandId: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 产品大类
+        mainId: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 销售单号
+        saleNo: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 销售类型
+        saleTypeId: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 销售联系人
+        saleLinkName: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 销售联系人电话
+        saleLinkPhone: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 消息来源
+        infoSourceId: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 消息渠道
+        infoChannelId: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 跨区编号
+        crossNo: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 购买时间
+        buyTime: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 营销活动
+        marketActivityId: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 发票号码
+        invoiceNo: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 用户期望上门时间
+        expectTime: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 妥投时间
+        properVoteTime: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        //预计到货时间
+        expectArrivalTime:{
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 首次上门预约日期
+        firstAppointmentTime: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 是否上传总部
+        uploadFlag: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 是否现场收费
+        isOnsiteCharges: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 是否脱机采集
+        isOfflineWorker: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 特殊技能标签---------------------------------
+        // 技能要求
+        labels1: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 特殊标签
+        labels2: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        enginName: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        enginNo: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 垫装类型
+        enginAdvanceType: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+        // 辅材提供方
+        enginMaterialSupply1: {
+          isEdit:true,
+          isShow:true,
+          isRules:[]
+        },
+      }
+    },
+    // 表单校验规则
+    formRules() {
+      return {}
+    }
+  },
+  methods: {
+    // 获取工单详情
+    getorderDetail(cb) {
+      if (this.id) {
+        // 编辑详情
+        orderDetail({
+          id: this.id
+        }).then(res => {
+          this.orderInfo = {
+            websitId_qdUse: this.orderInfo?.websitId_qdUse || '',
+            ...res.data,
+            // 用户期望上门时间转换
+            expectTime: (() => {
+              if (res.data.expectStartTime && res.data.expectEndTime) {
+                var [day1, tim1] = res.data.expectStartTime?.split(' ')
+                return `${day1} ${tim1}`
+              } else {
+                return ''
+              }
+            })(),
+            orderBaseRelaList: res.data.orderBaseRela ? [res.data.orderBaseRela] : [],
+            orderMaterialList: res.data.orderMaterialList || res.data.orderMaterials || [],
+            // 特殊要求数据转换
+            labels1: res.data.orderLabels ? res.data.orderLabels.map(item => item.label) : [],
+            labels2: res.data.orderLabels ? res.data.orderLabels.map(item => item.label) : [],
+            isEnginInfo: this.isEnginInfo,
+            uploadFlagRe: res.data.uploadFlag,
+            isOnsiteChargesRe: res.data?.orderRepair?.isOnsiteCharges
+          }
+          if (!this.cp_gpsAddress) {
+            this.cp_gpsAddress = this.orderInfo.gpsAddress
+          }
+          cb && cb()
+        })
+      } else {
+        // 创建工单
+        this.orderInfo = Object.assign({}, initdata_, {
+          buyTime: new Date().Format('yyyy-MM-dd 00:00:00'),
+          ...(() => {
+            if (this.isService && !this.isZbService) {
+              return { dispatchFlag: 'D', websitId: this.userInfo.websitId }
+            }
+            return { dispatchFlag: 'A' }
+          })()
+        })
+        if (!this.cp_gpsAddress) {
+          this.cp_gpsAddress = this.orderInfo.gpsAddress
+        }
+      }
+    }
+  }
+}

+ 25 - 0
src/views/workOrder/workOrderPool/detailModule/workOrderInfo/mixins/workOrderSelectData.js

@@ -0,0 +1,25 @@
+export default {
+  data() {
+    return {
+      // 工单流程状态
+      orderStatusList: [],
+      // 营销活动
+      marketActivity: [],
+      // 技能标签
+      skillLabel: [],
+      // 特殊标签
+      messengerTable: [],
+      // 商户列表
+      customerPageList: [],
+      // 用户属性
+      USER_ATTR: [],
+      // 用户等级
+      USER_LEVEL: [],
+      SOURCE: [],
+      CHANNEL: []
+    }
+  },
+  watch: {
+    
+  }
+}

+ 200 - 4
src/views/workOrder/workOrderPool/index.vue

@@ -1,20 +1,216 @@
 <template>
-	<div>工单池</div>
+  <!-- 工单池 -->
+  <template-page ref="pageRef" :getList="getList" :operation="operation" :exportList="exportList"
+    :optionsEvensGroup="optionsEvensGroup" :columnParsing="columnParsing" :tableAttributes="tableAttributes"
+    :tableEvents="tableEvents" :moreParameters="moreParameters" :screeningAnalysis="screeningAnalysis"
+    :filterMethod="filterMethod">
+    <!-- 创建工单 -->
+    <div class="cartographer_big">
+      <el-dialog title="创建工单" width="100%" :modal="false" :visible.sync="createFormBool" :before-close="handleClose">
+        <workOrderInfo v-if="createFormBool" />
+      </el-dialog>
+    </div>
+    <!-- 工单详情 -->
+    <div class="cartographer_big">
+      <el-dialog title="工单详情" width="100%" :modal="false" :visible.sync="detailFormBool" :before-close="handleClose">
+        <Detail v-if="detailFormBool" :id="id" />
+      </el-dialog>
+    </div>
+    <!-- 批量预约/改约 -->
+    <!-- <div class="cartographer_big">
+      <el-dialog title="批量预约" width="100%" :modal="false" :visible.sync="false" :before-close="() => { }">
+      </el-dialog>
+    </div> -->
+    <!-- 批量派工/改派 -->
+    <!-- <div class="cartographer_big">
+      <el-dialog title="批量派工" width="100%" :modal="false" :visible.sync="false" :before-close="() => { }">
+      </el-dialog>
+    </div> -->
+  </template-page>
 </template>
 
 <script>
+import TemplatePage from '@/components/template/template-page-1.vue'
+import { EventBus } from '@/utils/eventBus'
+import import_mixin from '@/components/template/import_mixin.js'
+import workOrderInfo from './detailModule/workOrderInfo/index.vue'
+import Detail from './detail'
 export default {
+  components: {
+    TemplatePage,
+    workOrderInfo,
+    Detail,
+  },
+  mixins: [import_mixin],
   data() {
     return {
-   
+      id: this.$route.query.id || '',
+      // 创建表单
+      createFormBool:false,
+      // 详情
+      detailFormBool:false,
+      // 表格属性
+      tableAttributes: {
+        // 启用勾选列
+        selectColumn: true
+      },
+      // 表格事件
+      tableEvents: {
+        'selection-change': this.selectionChange
+      },
+      recordSelected: [],
     }
   },
-
+  computed: {
+    moreParameters() {
+      return [
+        {
+          name: '工单类型',
+          key: 'orderType',
+          value: '',
+          conditions: []
+        },
+        {
+          name: '工单状态',
+          key: 'orderStatusParam',
+          value: '',
+          conditions: []
+        }
+      ]
+    },
+    // 用户信息
+    userInfo() {
+      return JSON.parse(localStorage.getItem('supply_user'))
+    },
+    // 事件组合
+    optionsEvensGroup() {
+      return [
+        [
+          [
+            {
+              name: '创建工单',
+              click: () => {
+                this.detailFormBool = true
+              }
+            },
+          ],
+          [
+            {
+              name: '批量操作',
+              click: () => { }
+            },
+            {
+              name: '批量下派工程师',
+              click: () => {
+                
+              }
+            },
+            {
+              name: '批量改约',
+              click: () => {
+                
+              }
+            },
+          ],
+        ]
+      ]
+    }
+  },
+  created() {
+    EventBus.$on('workOrderClone', val => {
+    })
+    EventBus.$on('handleOrderClone', () => {
+    })
+  },
   methods: {
- 
+    screeningAnalysis(jname, val) {
+      if (jname == 'orderFlags') {
+        return (val || []).map(item => item.tagName).join(',')
+      } else {
+        return val
+      }
+    },
+    filterMethod(value, row, column) {
+      if (column['property'] == 'orderFlags') {
+        return (row[column['property']] || []).map(item => item.tagName).join(',') === value
+      }
+      return row[column['property']] === value
+    },
+    
+    handleClose() {
+      // this.$router.push({
+      //   name: "workOrderPool",
+      //   params: {},
+      //   query: {}
+      // })
+      this.$nextTick(() => {
+        this.createFormBool = false
+        this.detailFormBool = false
+        this.$refs?.pageRef?.refreshList()
+      })
+    },
+
+    // 列表请求函数
+    getList(p) {
+      try {
+        this.pcs = JSON.parse(JSON.stringify(p))
+        return null
+      } catch (err) {
+      } finally {
+        this.$nextTick(() => {
+          
+        })
+      }
+    },
+    // 列表导出函数
+    exportList(){},
+    // 表格列解析渲染数据更改
+    columnParsing(item, defaultData) {
+      return defaultData
+    },
+    // 监听勾选变化
+    selectionChange(data) {
+      this.recordSelected = data
+    },
+    operation() {
+
+    }
   }
 }
 </script>
 
+<style>
+#pane-workOrderInfo {
+  width: 100%;
+  height: 100%;
+}
+</style>
 <style lang="scss" scoped>
+.worker {
+  display: flex;
+  justify-content: space-between;
+
+  .worker_left {
+    font-size: 12px;
+    font-weight: 400;
+    text-align: left;
+    color: #666;
+    line-height: 28px;
+    margin-right: 10px;
+  }
+
+  .worker_right {
+    flex: 1;
+
+    ::v-deep .el-button {
+      margin: 0 10px 10px 0px;
+    }
+  }
+}
+
+.creatOrderPopuc {
+  ::v-deep &>.zj-page-container {
+    height: calc(100vh - 165px) !important;
+  }
+}
 </style>