From d14d7109d6d8a3354577a5ae3ed7a8fd13d44e6c Mon Sep 17 00:00:00 2001
From: jiangping <jp@doumee.com>
Date: 星期四, 10 四月 2025 16:12:20 +0800
Subject: [PATCH] 代码初始化

---
 admin/src/api/business/category.js                                              |    5 
 admin/src/assets/style/variables.scss                                           |    8 
 admin/src/views/business/workorderShe.vue                                       |   12 
 admin/src/views/business/workorderDbh.vue                                       |  162 +++++++
 admin/src/components/business/OperaWorkorderDetailDcaWindow.vue                 |  494 +++++++++++++++++++++
 server/src/main/java/com/doumee/service/business/impl/WorkorderServiceImpl.java |    8 
 server/src/main/java/com/doumee/api/business/CategoryController.java            |    6 
 server/src/main/java/com/doumee/dao/business/model/Workorder.java               |    3 
 server/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java  |    1 
 admin/src/components/business/OperaWorkorderDetailSheWindow.vue                 |    6 
 admin/src/views/business/workorderDca.vue                                       |  154 ++++++
 admin/src/components/business/OperaWorkorderDetailDbhWindow.vue                 |  494 +++++++++++++++++++++
 12 files changed, 1,342 insertions(+), 11 deletions(-)

diff --git a/admin/src/api/business/category.js b/admin/src/api/business/category.js
index 2872408..d60d34e 100644
--- a/admin/src/api/business/category.js
+++ b/admin/src/api/business/category.js
@@ -6,6 +6,11 @@
     trim: true
   })
 }
+export function allList (data) {
+  return request.post('/business/category/list', data, {
+    trim: true
+  })
+}
 export function treeList (data) {
   return request.post('/business/category/tree', data, {
     trim: true
diff --git a/admin/src/assets/style/variables.scss b/admin/src/assets/style/variables.scss
index d57c715..fbeddb0 100644
--- a/admin/src/assets/style/variables.scss
+++ b/admin/src/assets/style/variables.scss
@@ -18,3 +18,11 @@
 // 瀛椾綋
 $font-color: #282828; // 棰滆壊
 $font-size: 12px; // 澶у皬
+
+
+.el-drawer__header {
+  color: #333333 !important;
+}
+.el-image-viewer__wrapper{
+  z-index: 3000 !important;
+}
diff --git a/admin/src/components/business/OperaWorkorderDetailDbhWindow.vue b/admin/src/components/business/OperaWorkorderDetailDbhWindow.vue
new file mode 100644
index 0000000..da58bc1
--- /dev/null
+++ b/admin/src/components/business/OperaWorkorderDetailDbhWindow.vue
@@ -0,0 +1,494 @@
+<template>
+  <GlobalWindow
+      :title="title"
+      width="85%"
+      :visible.sync="visible"
+      :confirm-working="isWorking"
+      @confirm="confirm">
+    <div class="modal_wrap">
+      <div class="modal_content">
+        <div class="header">
+          <img v-if="info.status == '3'" class="head_bg"
+               src="@/assets/task/bg_shenhe_fail@2x.png" alt="">
+          <img v-else-if="info.status == '4'" class="head_bg"
+               src="@/assets/task/bg_shenhe_pass@2x.png" alt="">
+          <img v-else class="head_bg" src="@/assets/task/bg_shenhe@2x.png" alt="">
+          <div class="left">
+            <div class="h1">{{ cateList[type] }}</div>
+            <div class="time">鎻愪氦鏃堕棿锛歿{ info.createDate }}</div>
+          </div>
+          <div class="right"  :class="{ scs: info.status == '3' || info.status == '4' || info.status == '5',  msg: info.status == '6' }">{{statusMap[info.status] }}</div>
+        </div>
+        <div class="info">
+          <div class="title">宸ュ崟淇℃伅</div>
+          <div class="list">
+            <div class="item">
+              <div class="label">鍛樺伐濮撳悕</div>
+              <div class="value">{{ info.memberName }} - {{ info.memberPhone || '[鏃犳墜鏈哄彿]' }}</div>
+            </div>
+            <div class="item">
+              <div class="label">鎵�灞為儴闂�</div>
+              <div class="value">{{ info.companyName }} </div>
+            </div>
+            <div class="item">
+              <div class="label">涓婃姤鏃堕棿</div>
+              <div class="value">{{ info.submitDate }}</div>
+            </div>
+            <div class="item">
+              <div class="label">鍙戠敓鏃堕棿</div>
+              <div class="value">{{ info.happenTime}}</div>
+            </div>
+            <div class="item">
+              <div class="label">椋庨櫓绫诲瀷</div>
+              <div class="value">{{ info.typeName }}</div>
+            </div>
+            <div class="item">
+              <div class="label">鍙戠敓鍦扮偣</div>
+              <div class="value">{{ info.locationName }}</div>
+            </div>
+            <div class="item">
+              <div class="label">椋庨櫓鎻忚堪</div>
+              <div class="value">{{ info.riskInfo }}</div>
+            </div>
+            <div class="item" style="width: 100%">
+              <div class="label">鍥剧墖</div>
+              <div class="value" v-if="info.multifileList ==null || !info.multifileList.length">鏃�</div>
+              <div class="value" v-if="info.multifileList !=null && info.multifileList.length">
+                <div v-for="item in info.multifileList" :key="item.id" style="display: inline;margin-right: 20px">
+                  <video
+                      v-if="item.fileurlFull && item.fileurlFull.endsWith('.mp4')"
+                      ref="videoRef"
+                      controls
+                      preload="auto"
+                      style="width: 80px;height: 80px;object-fit: contain;"
+                      :src="item.fileurlFull"
+                  />
+                  <el-image
+                      v-else-if="item.fileurlFull"
+                      style="width:80px; height: 80px"
+                      :src="item.fileurlFull"
+                      :preview-src-list="[item.fileurlFull]">
+                  </el-image>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="side" >
+        <div class="side_title">澶勭悊娴佺▼</div>
+        <div class="list" v-if=" info.logList != null && info.logList.length != 0
+        ">
+          <div class="item" v-for="(item, index) in info.logList" :key="item.id">
+            <div class="separate" v-if="index < info.logList.length - 1"></div>
+            <div class="info">
+              <img src="@/assets/icons/ic_dangqian.png" class="iconnew"  />
+              <div class="content">
+                <div class="line">
+                  <div class="name">{{ item.title }}</div>
+                </div>
+                <div class="line">
+                  <div class="company">
+                    鍛樺伐锛�<span>  {{ item.userName }} / {{item.companyName}}</span>
+                    <div style="display: block" >鏃堕棿锛�<span>{{item.createDate}}</span></div>
+                    <div class="dealinfo">
+                      <div style="display: block" v-if="item.param2" >澶勭悊浜猴細<span>{{item.param2}}</span></div>
+                      <div style="display: block" v-if="item.remark" >璇存槑锛�<span>{{item.remark}}</span></div>
+                      <div style="display: block;margin-top:10px"  v-if="item.multifileList !=null && item.multifileList.length">
+                        <div v-for="item in item.multifileList" :key="item.id" style="display: inline;margin-right: 5px">
+                          <video
+                              v-if="item.fileurlFull && item.fileurlFull.endsWith('.mp4')"
+                              ref="videoRef"
+                              controls
+                              preload="auto"
+                              style="width: 50px;height: 50px;object-fit: contain;"
+                              :src="item.fileurlFull"
+                          />
+                          <el-image
+                              v-else-if="item.fileurlFull"
+                              style="width:50px; height: 50px;"
+                              :src="item.fileurlFull"
+                              :preview-src-list="[item.fileurlFull]">
+                          </el-image>
+                        </div>
+                        </div>
+                    </div>
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <!--  -->
+    <template v-slot:footer>
+      <el-button @click="close">杩斿洖</el-button>
+    </template>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+import { getById } from '@/api/business/workorder'
+export default {
+  name: 'OperaWorkorderDetailDbhWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      id: '',
+      type: null,
+      title: '宸ュ崟璇︽儏',
+      info: {},
+      statusMap: {
+        0: '寰呭垎閰峎TS',
+        1: '寰呭垎閰嶄换鍔�',
+        2: '寰呭鐞�',
+        3: '宸茶В鍐�',
+        4: '宸茶В鍐�',
+        5: '宸茶В鍐�'
+      },
+      cateList: {
+        0: 'SHE浜嬩欢宸ュ崟',
+        1: '璺岀粖婊戜簨浠跺伐鍗�',
+        2: 'DCA浜嬩欢鎻愪氦璁板綍',
+        3: 'DCA浜嬩欢宸ュ崟'
+      }
+    }
+  },
+  methods: {
+    open (title, target) {
+      this.title = title
+      this.visible = true
+      this.info = target
+      this.getDetail()
+      this.type = this.info.type
+    },
+    close () {
+      this.visible = false
+    },
+    getDetail () {
+      getById(this.info.id).then(res => {
+        this.info = res
+        if (this.info.logList && this.info.logList.length > 0) {
+          this.info.logList.forEach(item => {
+            if (item.approveList && item.approveList.length == 1 && item.type !== 1) {
+              item.title = item.approveList[0].title
+              item.faceImg = item.approveList[0].faceImg
+              item.memberName = item.approveList[0].memberName
+              item.statusInfo = item.approveList[0].statusInfo
+              item.approveList = []
+            }
+          })
+        }
+      })
+    },
+    reject () { },
+    handleAvatarSuccess () { },
+    beforeAvatarUpload () { }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+@import "@/assets/style/variables.scss";
+
+.upload_box {
+  width: 84px;
+  height: 84px;
+  border-radius: 4px;
+  background-color: #f7f7f7;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  color: #999999;
+  border: 1px solid #e4e4e4;
+
+  .icon {
+    font-size: 24px;
+  }
+
+  .text {
+    font-size: 12px;
+  }
+}
+
+.side_title {
+  font-weight: 600;
+  font-size: 18px;
+  color: #111111;
+  margin-bottom: 20px;
+  margin-left: 20px;
+  margin-top: 20px;
+}
+
+.modal_wrap {
+  display: flex;
+  height: 100%;
+
+  .modal_content {
+    flex: 1;
+    padding: 0px 30px;
+    border-radius: 8px;
+    overflow: hidden;
+    height: 100%;
+
+    .title {
+      font-weight: 600;
+      font-size: 18px;
+      color: #333333;
+      margin-bottom: 20px;
+      margin-top: 30px;
+    }
+
+    .info {
+      .list {
+        display: flex;
+        flex-wrap: wrap;
+
+        .item {
+          display: flex;
+          width: 40%;
+          font-size: 14px;
+          margin-bottom: 20px;
+
+          &:nth-of-type(2n) {
+            width: 60%;
+          }
+
+          .label {
+            color: #888888;
+            width: 100px;
+          }
+
+          .value {
+            color: #111111;
+          }
+        }
+      }
+    }
+
+    .header {
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      vertical-align: center;
+      padding: 20px 30px;
+      margin: 0 -30px;
+      border-radius: 8px 8px 0 0;
+      position: relative;
+
+      .head_bg {
+        position: absolute;
+        width: 100%;
+        height: 100%;
+        left: 0;
+        top: 0;
+        z-index: 9;
+      }
+
+      .h1 {
+        font-weight: 600;
+        font-size: 22px;
+        color: #111111;
+        margin-bottom: 8px;
+      }
+
+      .time {
+        font-size: 14px;
+        color: #999999;
+      }
+
+      .right {
+        height: 40px;
+        font-size: 16px;
+        color: #ffffff;
+        line-height: 40px;
+        padding: 0 20px;
+        background: #207ff7;
+        box-shadow: 4px 4px 0px 0px rgba(32, 127, 247, 0.16);
+        border-radius: 16px 0px 16px 0px;
+        position: relative;
+        z-index: 99;
+      }
+
+      .scs {
+        background-color: #00BA67;
+      }
+
+      .msg {
+        background-color: #ED4545;
+      }
+    }
+
+    .table_info {
+      .name_wrap {
+        display: flex;
+        align-items: center;
+
+        .avatar {
+          width: 40px;
+          height: 40px;
+          border-radius: 50%;
+          margin-right: 12px;
+        }
+
+        .content {
+          .line {
+            display: flex;
+          }
+          .tag {
+            color: #b2cbf9;
+            border: 1px solid #b2cbf9;
+            padding: 0px 4px;
+            border-radius: 4px;
+            margin-left: 6px;
+          }
+        }
+      }
+    }
+  }
+
+  .side {
+    height: 100%;
+    width: 420px;
+    background: #ffffff;
+    border-left: 20px solid #f7f7f7;
+
+    .list {
+      .item {
+        padding: 8px 0;
+        position: relative;
+
+        .separate {
+          position: absolute;
+          border-left: 2px dashed #cccccc;
+          left: 31px;
+          height: calc(100% - 0px);
+          top: 30px;
+        }
+
+        .avatar {
+          width: 40px;
+          height: 40px;
+          border-radius: 50%;
+          margin: 0 12px 0 16px;
+          //border: 1px solid;
+        }
+
+        .childList {
+          display: flex;
+          flex-wrap: wrap;
+          margin-left: 100px;
+        }
+
+        .company {
+          font-size: 13px;
+          color: #888888;
+          width: calc(100% - 20px);
+          .status {
+            color: $primaryColor;
+          }
+         /* span{
+            color: black;
+          }*/
+          .dealinfo{
+            background-color: #f2f2f2;
+            padding: 8px;
+            display: block;
+            margin-top: 5px;
+            width: calc(100% - 20px);
+          }
+        }
+
+        .m_content {
+          display: flex;
+          flex-direction: column;
+          align-items: center;
+          justify-content: center;
+          margin-bottom: 4px;
+        }
+
+        .info {
+          display: flex;
+          /*align-items: center;*/
+          margin-left: 20px;
+
+          .icon {
+            position: relative;
+            z-index: 11;
+            color: #53b76f;
+            font-size: 24px;
+          }
+
+          .icon1 {
+            position: relative;
+            z-index: 11;
+            color: deepskyblue;
+            font-size: 24px;
+          }
+
+          .icon2 {
+            position: relative;
+            z-index: 11;
+            color: #dc362e;
+            font-size: 24px;
+          }
+
+          .iconnew {
+            width: 24px;
+            height: 24px;
+          }
+
+          .icon3 {
+            position: relative;
+            z-index: 11;
+            color: gray;
+            font-size: 24px;
+          }
+
+          .content {
+            flex: 1;
+
+            .line {
+              display: flex;
+              justify-content: space-between;
+              align-content: center;
+              margin-bottom: 6px;
+
+              .status {
+                color: #888888;
+              }
+
+              .padding {
+                color: $primaryColor;
+              }
+
+              .name {
+                font-weight: 600;
+                font-size: 16px;
+                color: #111111;
+              }
+
+              .time {
+                color: #888888;
+              }
+            }
+          }
+        }
+
+        .remark {
+          background: #f7f7f7;
+          border-radius: 4px;
+          padding: 13px 15px;
+          color: #666666;
+          margin-left: 100px;
+        }
+      }
+    }
+  }
+}
+</style>
diff --git a/admin/src/components/business/OperaWorkorderDetailDcaWindow.vue b/admin/src/components/business/OperaWorkorderDetailDcaWindow.vue
new file mode 100644
index 0000000..da58bc1
--- /dev/null
+++ b/admin/src/components/business/OperaWorkorderDetailDcaWindow.vue
@@ -0,0 +1,494 @@
+<template>
+  <GlobalWindow
+      :title="title"
+      width="85%"
+      :visible.sync="visible"
+      :confirm-working="isWorking"
+      @confirm="confirm">
+    <div class="modal_wrap">
+      <div class="modal_content">
+        <div class="header">
+          <img v-if="info.status == '3'" class="head_bg"
+               src="@/assets/task/bg_shenhe_fail@2x.png" alt="">
+          <img v-else-if="info.status == '4'" class="head_bg"
+               src="@/assets/task/bg_shenhe_pass@2x.png" alt="">
+          <img v-else class="head_bg" src="@/assets/task/bg_shenhe@2x.png" alt="">
+          <div class="left">
+            <div class="h1">{{ cateList[type] }}</div>
+            <div class="time">鎻愪氦鏃堕棿锛歿{ info.createDate }}</div>
+          </div>
+          <div class="right"  :class="{ scs: info.status == '3' || info.status == '4' || info.status == '5',  msg: info.status == '6' }">{{statusMap[info.status] }}</div>
+        </div>
+        <div class="info">
+          <div class="title">宸ュ崟淇℃伅</div>
+          <div class="list">
+            <div class="item">
+              <div class="label">鍛樺伐濮撳悕</div>
+              <div class="value">{{ info.memberName }} - {{ info.memberPhone || '[鏃犳墜鏈哄彿]' }}</div>
+            </div>
+            <div class="item">
+              <div class="label">鎵�灞為儴闂�</div>
+              <div class="value">{{ info.companyName }} </div>
+            </div>
+            <div class="item">
+              <div class="label">涓婃姤鏃堕棿</div>
+              <div class="value">{{ info.submitDate }}</div>
+            </div>
+            <div class="item">
+              <div class="label">鍙戠敓鏃堕棿</div>
+              <div class="value">{{ info.happenTime}}</div>
+            </div>
+            <div class="item">
+              <div class="label">椋庨櫓绫诲瀷</div>
+              <div class="value">{{ info.typeName }}</div>
+            </div>
+            <div class="item">
+              <div class="label">鍙戠敓鍦扮偣</div>
+              <div class="value">{{ info.locationName }}</div>
+            </div>
+            <div class="item">
+              <div class="label">椋庨櫓鎻忚堪</div>
+              <div class="value">{{ info.riskInfo }}</div>
+            </div>
+            <div class="item" style="width: 100%">
+              <div class="label">鍥剧墖</div>
+              <div class="value" v-if="info.multifileList ==null || !info.multifileList.length">鏃�</div>
+              <div class="value" v-if="info.multifileList !=null && info.multifileList.length">
+                <div v-for="item in info.multifileList" :key="item.id" style="display: inline;margin-right: 20px">
+                  <video
+                      v-if="item.fileurlFull && item.fileurlFull.endsWith('.mp4')"
+                      ref="videoRef"
+                      controls
+                      preload="auto"
+                      style="width: 80px;height: 80px;object-fit: contain;"
+                      :src="item.fileurlFull"
+                  />
+                  <el-image
+                      v-else-if="item.fileurlFull"
+                      style="width:80px; height: 80px"
+                      :src="item.fileurlFull"
+                      :preview-src-list="[item.fileurlFull]">
+                  </el-image>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="side" >
+        <div class="side_title">澶勭悊娴佺▼</div>
+        <div class="list" v-if=" info.logList != null && info.logList.length != 0
+        ">
+          <div class="item" v-for="(item, index) in info.logList" :key="item.id">
+            <div class="separate" v-if="index < info.logList.length - 1"></div>
+            <div class="info">
+              <img src="@/assets/icons/ic_dangqian.png" class="iconnew"  />
+              <div class="content">
+                <div class="line">
+                  <div class="name">{{ item.title }}</div>
+                </div>
+                <div class="line">
+                  <div class="company">
+                    鍛樺伐锛�<span>  {{ item.userName }} / {{item.companyName}}</span>
+                    <div style="display: block" >鏃堕棿锛�<span>{{item.createDate}}</span></div>
+                    <div class="dealinfo">
+                      <div style="display: block" v-if="item.param2" >澶勭悊浜猴細<span>{{item.param2}}</span></div>
+                      <div style="display: block" v-if="item.remark" >璇存槑锛�<span>{{item.remark}}</span></div>
+                      <div style="display: block;margin-top:10px"  v-if="item.multifileList !=null && item.multifileList.length">
+                        <div v-for="item in item.multifileList" :key="item.id" style="display: inline;margin-right: 5px">
+                          <video
+                              v-if="item.fileurlFull && item.fileurlFull.endsWith('.mp4')"
+                              ref="videoRef"
+                              controls
+                              preload="auto"
+                              style="width: 50px;height: 50px;object-fit: contain;"
+                              :src="item.fileurlFull"
+                          />
+                          <el-image
+                              v-else-if="item.fileurlFull"
+                              style="width:50px; height: 50px;"
+                              :src="item.fileurlFull"
+                              :preview-src-list="[item.fileurlFull]">
+                          </el-image>
+                        </div>
+                        </div>
+                    </div>
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <!--  -->
+    <template v-slot:footer>
+      <el-button @click="close">杩斿洖</el-button>
+    </template>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+import { getById } from '@/api/business/workorder'
+export default {
+  name: 'OperaWorkorderDetailDbhWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      id: '',
+      type: null,
+      title: '宸ュ崟璇︽儏',
+      info: {},
+      statusMap: {
+        0: '寰呭垎閰峎TS',
+        1: '寰呭垎閰嶄换鍔�',
+        2: '寰呭鐞�',
+        3: '宸茶В鍐�',
+        4: '宸茶В鍐�',
+        5: '宸茶В鍐�'
+      },
+      cateList: {
+        0: 'SHE浜嬩欢宸ュ崟',
+        1: '璺岀粖婊戜簨浠跺伐鍗�',
+        2: 'DCA浜嬩欢鎻愪氦璁板綍',
+        3: 'DCA浜嬩欢宸ュ崟'
+      }
+    }
+  },
+  methods: {
+    open (title, target) {
+      this.title = title
+      this.visible = true
+      this.info = target
+      this.getDetail()
+      this.type = this.info.type
+    },
+    close () {
+      this.visible = false
+    },
+    getDetail () {
+      getById(this.info.id).then(res => {
+        this.info = res
+        if (this.info.logList && this.info.logList.length > 0) {
+          this.info.logList.forEach(item => {
+            if (item.approveList && item.approveList.length == 1 && item.type !== 1) {
+              item.title = item.approveList[0].title
+              item.faceImg = item.approveList[0].faceImg
+              item.memberName = item.approveList[0].memberName
+              item.statusInfo = item.approveList[0].statusInfo
+              item.approveList = []
+            }
+          })
+        }
+      })
+    },
+    reject () { },
+    handleAvatarSuccess () { },
+    beforeAvatarUpload () { }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+@import "@/assets/style/variables.scss";
+
+.upload_box {
+  width: 84px;
+  height: 84px;
+  border-radius: 4px;
+  background-color: #f7f7f7;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  color: #999999;
+  border: 1px solid #e4e4e4;
+
+  .icon {
+    font-size: 24px;
+  }
+
+  .text {
+    font-size: 12px;
+  }
+}
+
+.side_title {
+  font-weight: 600;
+  font-size: 18px;
+  color: #111111;
+  margin-bottom: 20px;
+  margin-left: 20px;
+  margin-top: 20px;
+}
+
+.modal_wrap {
+  display: flex;
+  height: 100%;
+
+  .modal_content {
+    flex: 1;
+    padding: 0px 30px;
+    border-radius: 8px;
+    overflow: hidden;
+    height: 100%;
+
+    .title {
+      font-weight: 600;
+      font-size: 18px;
+      color: #333333;
+      margin-bottom: 20px;
+      margin-top: 30px;
+    }
+
+    .info {
+      .list {
+        display: flex;
+        flex-wrap: wrap;
+
+        .item {
+          display: flex;
+          width: 40%;
+          font-size: 14px;
+          margin-bottom: 20px;
+
+          &:nth-of-type(2n) {
+            width: 60%;
+          }
+
+          .label {
+            color: #888888;
+            width: 100px;
+          }
+
+          .value {
+            color: #111111;
+          }
+        }
+      }
+    }
+
+    .header {
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      vertical-align: center;
+      padding: 20px 30px;
+      margin: 0 -30px;
+      border-radius: 8px 8px 0 0;
+      position: relative;
+
+      .head_bg {
+        position: absolute;
+        width: 100%;
+        height: 100%;
+        left: 0;
+        top: 0;
+        z-index: 9;
+      }
+
+      .h1 {
+        font-weight: 600;
+        font-size: 22px;
+        color: #111111;
+        margin-bottom: 8px;
+      }
+
+      .time {
+        font-size: 14px;
+        color: #999999;
+      }
+
+      .right {
+        height: 40px;
+        font-size: 16px;
+        color: #ffffff;
+        line-height: 40px;
+        padding: 0 20px;
+        background: #207ff7;
+        box-shadow: 4px 4px 0px 0px rgba(32, 127, 247, 0.16);
+        border-radius: 16px 0px 16px 0px;
+        position: relative;
+        z-index: 99;
+      }
+
+      .scs {
+        background-color: #00BA67;
+      }
+
+      .msg {
+        background-color: #ED4545;
+      }
+    }
+
+    .table_info {
+      .name_wrap {
+        display: flex;
+        align-items: center;
+
+        .avatar {
+          width: 40px;
+          height: 40px;
+          border-radius: 50%;
+          margin-right: 12px;
+        }
+
+        .content {
+          .line {
+            display: flex;
+          }
+          .tag {
+            color: #b2cbf9;
+            border: 1px solid #b2cbf9;
+            padding: 0px 4px;
+            border-radius: 4px;
+            margin-left: 6px;
+          }
+        }
+      }
+    }
+  }
+
+  .side {
+    height: 100%;
+    width: 420px;
+    background: #ffffff;
+    border-left: 20px solid #f7f7f7;
+
+    .list {
+      .item {
+        padding: 8px 0;
+        position: relative;
+
+        .separate {
+          position: absolute;
+          border-left: 2px dashed #cccccc;
+          left: 31px;
+          height: calc(100% - 0px);
+          top: 30px;
+        }
+
+        .avatar {
+          width: 40px;
+          height: 40px;
+          border-radius: 50%;
+          margin: 0 12px 0 16px;
+          //border: 1px solid;
+        }
+
+        .childList {
+          display: flex;
+          flex-wrap: wrap;
+          margin-left: 100px;
+        }
+
+        .company {
+          font-size: 13px;
+          color: #888888;
+          width: calc(100% - 20px);
+          .status {
+            color: $primaryColor;
+          }
+         /* span{
+            color: black;
+          }*/
+          .dealinfo{
+            background-color: #f2f2f2;
+            padding: 8px;
+            display: block;
+            margin-top: 5px;
+            width: calc(100% - 20px);
+          }
+        }
+
+        .m_content {
+          display: flex;
+          flex-direction: column;
+          align-items: center;
+          justify-content: center;
+          margin-bottom: 4px;
+        }
+
+        .info {
+          display: flex;
+          /*align-items: center;*/
+          margin-left: 20px;
+
+          .icon {
+            position: relative;
+            z-index: 11;
+            color: #53b76f;
+            font-size: 24px;
+          }
+
+          .icon1 {
+            position: relative;
+            z-index: 11;
+            color: deepskyblue;
+            font-size: 24px;
+          }
+
+          .icon2 {
+            position: relative;
+            z-index: 11;
+            color: #dc362e;
+            font-size: 24px;
+          }
+
+          .iconnew {
+            width: 24px;
+            height: 24px;
+          }
+
+          .icon3 {
+            position: relative;
+            z-index: 11;
+            color: gray;
+            font-size: 24px;
+          }
+
+          .content {
+            flex: 1;
+
+            .line {
+              display: flex;
+              justify-content: space-between;
+              align-content: center;
+              margin-bottom: 6px;
+
+              .status {
+                color: #888888;
+              }
+
+              .padding {
+                color: $primaryColor;
+              }
+
+              .name {
+                font-weight: 600;
+                font-size: 16px;
+                color: #111111;
+              }
+
+              .time {
+                color: #888888;
+              }
+            }
+          }
+        }
+
+        .remark {
+          background: #f7f7f7;
+          border-radius: 4px;
+          padding: 13px 15px;
+          color: #666666;
+          margin-left: 100px;
+        }
+      }
+    }
+  }
+}
+</style>
diff --git a/admin/src/components/business/OperaWorkorderDetailSheWindow.vue b/admin/src/components/business/OperaWorkorderDetailSheWindow.vue
index f52b961..c1f46fd 100644
--- a/admin/src/components/business/OperaWorkorderDetailSheWindow.vue
+++ b/admin/src/components/business/OperaWorkorderDetailSheWindow.vue
@@ -27,6 +27,10 @@
               <div class="value">{{ info.memberName }} - {{ info.memberPhone || '[鏃犳墜鏈哄彿]' }}</div>
             </div>
             <div class="item">
+              <div class="label">鎵�灞為儴闂�</div>
+              <div class="value">{{ info.companyName }} </div>
+            </div>
+            <div class="item">
               <div class="label">涓婃姤鏃堕棿</div>
               <div class="value">{{ info.submitDate +' '}}</div>
             </div>
@@ -89,7 +93,7 @@
           </div>
         </div>
       </div>
-      <div class="side">
+      <div class="side" v-if="false">
         <div class="side_title">鎿嶄綔鍘嗗彶</div>
         <div class="list" v-if=" info.logList != null && info.logList.length != 0
         ">
diff --git a/admin/src/views/business/workorderDbh.vue b/admin/src/views/business/workorderDbh.vue
new file mode 100644
index 0000000..d1045e8
--- /dev/null
+++ b/admin/src/views/business/workorderDbh.vue
@@ -0,0 +1,162 @@
+<template>
+  <TableLayout :permissions="['business:workorder:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <div slot="search-form">
+      <el-form ref="searchForm" :model="searchForm" label-width="100px" inline>
+        <el-form-item label="椋庨櫓绫诲瀷" prop="typeId">
+          <el-cascader  v-model="searchForm.categoryList" :options="categorys" @change="handleChangeCategory" :show-all-levels="false"
+                        clearable filterable :props="categoryprops"  >
+            <template slot-scope="{ node, data }">
+              <span>{{ data.name }}</span> <!-- 鑷畾涔夋樉绀哄唴瀹� -->
+            </template>
+          </el-cascader>
+        </el-form-item>
+        <el-form-item label="涓婃姤浜哄憳" prop="memberName">
+          <el-input v-model="searchForm.memberName" clearable placeholder="浜哄憳濮撳悕鎴栨墜鏈哄彿" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <el-form-item label="宸ュ崟鍙�" prop="code">
+          <el-input v-model="searchForm.code" clearable placeholder="璇疯緭鍏ュ伐鍗曞彿" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <section>
+          <el-button type="primary" @click="search">鎼滅储</el-button>
+          <el-button @click="reset">閲嶇疆</el-button>
+        </section>
+      </el-form>
+    </div>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:workorder:exportExcel']">
+        <li> <el-button type="primary" :loading="isWorking.export" @click="exportExcel">瀵煎嚭</el-button></li>
+      </ul>
+      <el-table
+        :height="tableHeightNew"
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column prop="code"  label="宸ュ崟鍙�" min-width="150px" fixed>
+          <template slot-scope="{row}">
+            <span style="color: #2E68EC;cursor: pointer" @click="$refs.operaWorkorderWindow.open('SHE浜嬩欢宸ュ崟璇︽儏', row)" >{{ row.code || '-'}}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="typeName" label="浼ゅ绫诲瀷" min-width="100px"></el-table-column>
+        <el-table-column prop="memberName" label="涓婃姤浜哄憳" min-width="100px">
+          <template slot-scope="{row}">
+            <span v-if="row.memberPhone" >{{row.memberName}} - {{row.memberPhone }}</span>
+            <span v-else >{{row.memberName}} </span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="companyName" label="鎵�鍦ㄩ儴闂�" min-width="100px"></el-table-column>
+        <el-table-column prop="status" label="鐘舵��" min-width="100px">
+          <template slot-scope="{row}">
+            <span v-if="row.status ==0">寰呭鐞�</span>
+            <span v-else-if="row.status ==3 ||row.status ==4||row.status ==5">宸插鐞�</span>
+            <span v-else>澶勭悊涓�</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="submitDate" label="涓婃姤鏃堕棿" min-width="150px"></el-table-column>
+        <el-table-column prop="happenTime" label="鍙戠幇鏃堕棿" min-width="150px"></el-table-column>
+        <el-table-column prop="riskInfo" label="椋庨櫓鎻忚堪" min-width="100px"></el-table-column>
+        <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="150px"></el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:workorder:update', 'business:workorder:delete'])"
+          label="鎿嶄綔"
+          min-width="120"
+          fixed="right"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text" @click="$refs.operaWorkorderWindow.open('璺岀粖婊戜簨浠跺伐鍗曡鎯�', row)" icon="el-icon-zoom-out" >鏌ョ湅璇︽儏</el-button>
+          <!--<el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:workorder:delete']">鍒犻櫎</el-button>-->
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaWorkorderDetailDbhWindow ref="operaWorkorderWindow" @success="handlePageChange"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaWorkorderDetailDbhWindow from '@/components/business/OperaWorkorderDetailDbhWindow'
+import { treeList } from '@/api/business/category'
+export default {
+  name: 'Workorder',
+  extends: BaseTable,
+  components: {TableLayout, Pagination, OperaWorkorderDetailDbhWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        type: '3',
+        memberName: '',
+        memberCompanyId: '',
+        localtionId: '',
+        typeId: '',
+        code: '',
+        categoryList: []
+      },
+      categoryprops: {
+        label: 'name',
+        value: 'id',
+        checkStrictly: true,
+        lazyLoad: this.lazyLoad
+      },
+      categorys: []
+    }
+  },
+  created () {
+    this.config({
+      module: '宸ュ崟淇℃伅琛�',
+      api: '/business/workorder',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.loadCategorys()
+    this.search()
+  },
+  methods: {
+    handleChangeCategory (value) {
+      if (this.searchForm.categoryList && this.searchForm.categoryList.length >= 1) {
+        this.searchForm.typeId = this.searchForm.categoryList[this.searchForm.categoryList.length - 1]
+      }
+    },
+    loadCategorys () {
+      treeList({ type: 1})
+        .then(res => {
+          if (res && res.length > 0) {
+            res[0].fsStatus = 1
+            this.categorys = this.getCategoryTree(res)
+          }
+        })
+    },
+    getCategoryTree (tree) {
+      if (tree == null) {
+        return []
+      }
+      return tree.map(item => {
+        const newItem = { ...item }
+        if (newItem) {
+          newItem.children = newItem.childList
+        }
+        if (item.children && item.children.length === 0) {
+          this.$delete(newItem, 'children')
+        } else {
+          newItem.children = this.getCategoryTree(newItem.children)
+        }
+        // newItem.disabled = false
+        return newItem
+      })
+    }
+  }
+}
+</script>
diff --git a/admin/src/views/business/workorderDca.vue b/admin/src/views/business/workorderDca.vue
new file mode 100644
index 0000000..7fa3dd7
--- /dev/null
+++ b/admin/src/views/business/workorderDca.vue
@@ -0,0 +1,154 @@
+<template>
+  <TableLayout :permissions="['business:workorder:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <div slot="search-form">
+      <el-form ref="searchForm" :model="searchForm" label-width="100px" inline>
+        <el-form-item label="椋庨櫓绫诲瀷" prop="typeId">
+          <el-select v-model="searchForm.typeId">
+          <el-option  clearable filterable
+              v-for="item in categorys"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id">
+          </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="涓婃姤浜哄憳" prop="memberName">
+          <el-input v-model="searchForm.memberName" clearable placeholder="浜哄憳濮撳悕鎴栨墜鏈哄彿" @keypress.enter.native="search"></el-input>
+
+
+        </el-form-item>
+        <el-form-item label="宸ュ崟鍙�" prop="code">
+          <el-input v-model="searchForm.code" clearable placeholder="璇疯緭鍏ュ伐鍗曞彿" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <section>
+          <el-button type="primary" @click="search">鎼滅储</el-button>
+          <el-button @click="reset">閲嶇疆</el-button>
+        </section>
+      </el-form>
+    </div>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:workorder:exportExcel']">
+        <li> <el-button type="primary" :loading="isWorking.export" @click="exportExcel">瀵煎嚭</el-button></li>
+      </ul>
+      <el-table
+        :height="tableHeightNew"
+        v-loading="isWorking.search"
+        :data="tableData.list"
+        stripe
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column prop="code"  label="宸ュ崟鍙�" min-width="150px" fixed>
+          <template slot-scope="{row}">
+            <span style="color: #2E68EC;cursor: pointer" @click="$refs.operaWorkorderWindow.open('SHE浜嬩欢宸ュ崟璇︽儏', row)" >{{ row.code || '-'}}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="memberName" label="涓婃姤浜哄憳" min-width="100px">
+          <template slot-scope="{row}">
+            <span v-if="row.memberPhone" >{{row.memberName}} - {{row.memberPhone }}</span>
+            <span v-else >{{row.memberName}} </span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="companyName" label="鎵�鍦ㄩ儴闂�" min-width="100px"></el-table-column>
+        <el-table-column prop="status" label="鐘舵��" min-width="100px">
+          <template slot-scope="{row}">
+            <span v-if="row.status ==0">寰呭鐞�</span>
+            <span v-else-if="row.status ==3 ||row.status ==4||row.status ==5">宸插鐞�</span>
+            <span v-else>澶勭悊涓�</span>
+          </template>
+        </el-table-column>
+<!--
+        <el-table-column prop="typeName" label="DCA绫诲瀷" min-width="100px"></el-table-column>
+-->
+        <el-table-column prop="problemTitle" label="瑙傚療涓婚" min-width="150px"></el-table-column>
+        <el-table-column prop="dcaYesNum" label="瑙傚療椤圭粺璁�" min-width="150px">
+          <template slot-scope="{row}">
+            <span  style="color: #1562e2" >绗﹀悎锛歿{row.dcaYesNum}}  涓嶇鍚堬細{{row.dcaNoNum}}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="submitDate" label="涓婃姤鏃堕棿" min-width="150px"></el-table-column>
+        <el-table-column prop="happenTime" label="鍙戠幇鏃堕棿" min-width="150px"></el-table-column>
+        <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="150px"></el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:workorder:update', 'business:workorder:delete'])"
+          label="鎿嶄綔"
+          min-width="120"
+          fixed="right"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text" @click="$refs.operaWorkorderWindow.open('DCA浜嬩欢宸ュ崟璇︽儏', row)" icon="el-icon-zoom-out" >鏌ョ湅璇︽儏</el-button>
+          <!--<el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:workorder:delete']">鍒犻櫎</el-button>-->
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        @size-change="handleSizeChange"
+        @current-change="handlePageChange"
+        :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaWorkorderDetailDcaWindow ref="operaWorkorderWindow" @success="handlePageChange"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaWorkorderDetailDcaWindow from '@/components/business/OperaWorkorderDetailDcaWindow'
+import { allList } from '@/api/business/category'
+export default {
+  name: 'Workorder',
+  extends: BaseTable,
+  components: {TableLayout, Pagination, OperaWorkorderDetailDcaWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        type: '1',
+        memberName: '',
+        memberCompanyId: '',
+        localtionId: '',
+        typeId: '',
+        code: '',
+        categoryList: []
+      },
+      categoryprops: {
+        label: 'name',
+        value: 'id',
+        checkStrictly: true,
+        lazyLoad: this.lazyLoad
+      },
+      categorys: []
+    }
+  },
+  created () {
+    this.config({
+      module: '宸ュ崟淇℃伅琛�',
+      api: '/business/workorder',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.loadCategorys()
+    this.search()
+  },
+  methods: {
+    handleChangeCategory (value) {
+      if (this.searchForm.categoryList && this.searchForm.categoryList.length >= 1) {
+        this.searchForm.typeId = this.searchForm.categoryList[this.searchForm.categoryList.length - 1]
+      }
+    },
+    loadCategorys () {
+      allList({ type: 4, isRoot:1})
+        .then(res => {
+          if (res && res.length > 0) {
+            this.categorys = res
+          }
+        })
+    },
+  }
+}
+</script>
diff --git a/admin/src/views/business/workorderShe.vue b/admin/src/views/business/workorderShe.vue
index 0b601b6..deb3f7e 100644
--- a/admin/src/views/business/workorderShe.vue
+++ b/admin/src/views/business/workorderShe.vue
@@ -12,10 +12,12 @@
           </el-cascader>
         </el-form-item>
         <el-form-item label="涓婃姤浜哄憳" prop="memberName">
-          <el-input v-model="searchForm.memberName" placeholder="浜哄憳濮撳悕鎴栨墜鏈哄彿" @keypress.enter.native="search"></el-input>
+          <el-input v-model="searchForm.memberName" clearable placeholder="浜哄憳濮撳悕鎴栨墜鏈哄彿" @keypress.enter.native="search"></el-input>
+
+
         </el-form-item>
         <el-form-item label="宸ュ崟鍙�" prop="code">
-          <el-input v-model="searchForm.code" placeholder="璇疯緭鍏ュ伐鍗曞彿" @keypress.enter.native="search"></el-input>
+          <el-input v-model="searchForm.code" clearable placeholder="璇疯緭鍏ュ伐鍗曞彿" @keypress.enter.native="search"></el-input>
         </el-form-item>
         <section>
           <el-button type="primary" @click="search">鎼滅储</el-button>
@@ -45,14 +47,14 @@
         <el-table-column prop="status" label="鐘舵��" min-width="100px">
           <template slot-scope="{row}">
             <span v-if="row.status ==0">寰呭鐞�</span>
-            <span v-else-if="row.status ==4">宸插鐞�</span>
-            <span v-else-if="row.status ==3">宸插叧闂�</span>
+            <span v-else-if="row.status ==3 ||row.status ==4||row.status ==5">宸插鐞�</span>
             <span v-else>澶勭悊涓�</span>
           </template>
         </el-table-column>
         <el-table-column prop="memberName" label="涓婃姤浜哄憳" min-width="100px">
           <template slot-scope="{row}">
-            <span >{{row.memberName}} - {{row.memberPhone||''}}</span>
+            <span v-if="row.memberPhone" >{{row.memberName}} - {{row.memberPhone }}</span>
+            <span v-else >{{row.memberName}} </span>
           </template>
         </el-table-column>
         <el-table-column prop="companyName" label="鎵�鍦ㄩ儴闂�" min-width="100px"></el-table-column>
diff --git a/server/src/main/java/com/doumee/api/business/CategoryController.java b/server/src/main/java/com/doumee/api/business/CategoryController.java
index ccf5c99..1296aa0 100644
--- a/server/src/main/java/com/doumee/api/business/CategoryController.java
+++ b/server/src/main/java/com/doumee/api/business/CategoryController.java
@@ -69,6 +69,12 @@
     public ApiResponse<PageData<Category>> findPage (@RequestBody PageWrap<Category> pageWrap) {
         return ApiResponse.success(categoryService.findPage(pageWrap));
     }
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/list")
+    @RequiresPermissions("business:category:query")
+    public ApiResponse<List<Category>> findList (@RequestBody  Category pageWrap) {
+        return ApiResponse.success(categoryService.findList(pageWrap));
+    }
 
     @ApiOperation("瀵煎嚭Excel")
     @PostMapping("/exportExcel")
diff --git a/server/src/main/java/com/doumee/dao/business/model/Workorder.java b/server/src/main/java/com/doumee/dao/business/model/Workorder.java
index 1d7f413..3dcadd0 100644
--- a/server/src/main/java/com/doumee/dao/business/model/Workorder.java
+++ b/server/src/main/java/com/doumee/dao/business/model/Workorder.java
@@ -137,18 +137,15 @@
     @ApiModelProperty(value = "椋庨櫓鎻忚堪", example = "1")
     @ExcelExportColumn(name="椋庨櫓鎻忚堪")
     private String riskInfo;
-
     @ApiModelProperty(value = "褰撳墠鐗╀笟涓荤浼佷笟寰俊缂栫爜", example = "1")
     @ExcelExportColumn(name="褰撳墠鐗╀笟涓荤浼佷笟寰俊缂栫爜")
     private String managerId;
-
     @ApiModelProperty(value = "褰撳墠澶勭悊浜哄憳浼佷笟寰俊缂栫爜", example = "1")
     @ExcelExportColumn(name="褰撳墠澶勭悊浜哄憳浼佷笟寰俊缂栫爜")
     private String dealerId;
 
     @ApiModelProperty(value = "鍒嗛厤鏃堕棿")
     @ExcelExportColumn(name="鍒嗛厤鏃堕棿")
-
     private Date dispatchTime;
 
     @ApiModelProperty(value = "鍒嗛厤澶囨敞")
diff --git a/server/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java b/server/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
index e32f0ef..4edd8cb 100644
--- a/server/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
+++ b/server/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
@@ -199,6 +199,7 @@
                 .eq(category.getType() != null, Category::getType, category.getType())
                 .eq(category.getParentId() != null, Category::getParentId, category.getParentId())
                 .eq(category.getNamePath() != null, Category::getNamePath, category.getNamePath())
+                .isNull(category.getIsRoot() != null &&category.getIsRoot().equals(Constants.ONE), Category::getParentId)
                 .eq(category.getIdPath() != null, Category::getIdPath, category.getIdPath())
                 .orderByAsc( Category::getSortnum);
         return categoryMapper.selectJoinList(Category.class,queryWrapper);
diff --git a/server/src/main/java/com/doumee/service/business/impl/WorkorderServiceImpl.java b/server/src/main/java/com/doumee/service/business/impl/WorkorderServiceImpl.java
index c823afb..60995de 100644
--- a/server/src/main/java/com/doumee/service/business/impl/WorkorderServiceImpl.java
+++ b/server/src/main/java/com/doumee/service/business/impl/WorkorderServiceImpl.java
@@ -527,12 +527,16 @@
                 .eq(pageWrap.getModel().getProblemId() != null, Workorder::getProblemId, pageWrap.getModel().getProblemId())
                 .eq(pageWrap.getModel().getProblemInfo() != null, Workorder::getProblemInfo, pageWrap.getModel().getProblemInfo())
                 .eq(pageWrap.getModel().getLocationName() != null, Workorder::getLocationName, pageWrap.getModel().getLocationName())
-                .eq(pageWrap.getModel().getCode() != null, Workorder::getCode, pageWrap.getModel().getCode())
+                .like(pageWrap.getModel().getCode() != null, Workorder::getCode, pageWrap.getModel().getCode())
                 .eq(pageWrap.getModel().getDcaYesNum() != null, Workorder::getDcaYesNum, pageWrap.getModel().getDcaYesNum())
                 .eq(pageWrap.getModel().getDcaNoNum() != null, Workorder::getDcaNoNum, pageWrap.getModel().getDcaNoNum())
                 .eq(pageWrap.getModel().getDcaRecordId() != null, Workorder::getDcaRecordId, pageWrap.getModel().getDcaRecordId())
                 .eq(pageWrap.getModel().getDcaCsIds() != null, Workorder::getDcaCsIds, pageWrap.getModel().getDcaCsIds()) ;
-                queryWrapper.orderByDesc(Workorder::getCreateDate);
+        if (pageWrap.getModel().getMemberName() != null) {
+            queryWrapper.and( ms->ms.like(Member::getName,pageWrap.getModel().getMemberName())
+                    .or().like(Member::getPhone,pageWrap.getModel().getMemberName()) );
+        }
+        queryWrapper.orderByDesc(Workorder::getCreateDate);
         return PageData.from(workorderMapper.selectJoinPage(page,Workorder.class, queryWrapper));
     }
 

--
Gitblit v1.9.3