From f5ec875275b0a783186a147e780bc03d96a91f57 Mon Sep 17 00:00:00 2001
From: jiangping <jp@doumee.com>
Date: 星期二, 08 四月 2025 11:24:13 +0800
Subject: [PATCH] 代码初始化

---
 admin/src/views/business/categoryDbhType.vue                                   |  158 +++++
 admin/src/components/common/Tree.vue                                           |   55 -
 admin/src/views/business/categorySheLocaltion.vue                              |  158 +++++
 server/src/main/java/com/doumee/api/business/CategoryController.java           |   10 
 admin/src/views/business/categorySheType.vue                                   |  158 +++++
 admin/src/views/business/categoryDcaProblem.vue                                |  194 ++++++
 admin/src/api/business/category.js                                             |    6 
 admin/src/components/business/OperaCategoryWindow.vue                          |  144 +++-
 admin/src/views/business/companyMember.vue                                     |    1 
 server/src/main/java/com/doumee/dao/business/model/Category.java               |   22 
 admin/src/views/business/categoryDcaLocaltion.vue                              |  158 +++++
 admin/src/views/business/categoryDbhLocaltion.vue                              |  158 +++++
 server/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java |  167 +++++
 server/src/main/java/com/doumee/service/business/CategoryService.java          |    2 
 server/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java  |    2 
 admin/src/components/base/BaseTable.vue                                        |   15 
 server/src/main/java/com/doumee/dao/business/vo/CategoryTree.java              |   89 +++
 admin/src/components/business/OperaCategoryDcaProblemWindow.vue                |  149 +++++
 server/src/main/java/com/doumee/dao/business/CategoryMapper.java               |    3 
 19 files changed, 1,543 insertions(+), 106 deletions(-)

diff --git a/admin/src/api/business/category.js b/admin/src/api/business/category.js
index 70202b0..2872408 100644
--- a/admin/src/api/business/category.js
+++ b/admin/src/api/business/category.js
@@ -6,7 +6,11 @@
     trim: true
   })
 }
-
+export function treeList (data) {
+  return request.post('/business/category/tree', data, {
+    trim: true
+  })
+}
 // 瀵煎嚭Excel
 export function exportExcel (data) {
   return request.post('/business/category/exportExcel', data, {
diff --git a/admin/src/components/base/BaseTable.vue b/admin/src/components/base/BaseTable.vue
index 79e9171..515df9e 100644
--- a/admin/src/components/base/BaseTable.vue
+++ b/admin/src/components/base/BaseTable.vue
@@ -1,6 +1,6 @@
 <script>
 import BasePage from './BasePage'
-import {mapState} from "vuex";
+import { isFunction } from 'element-ui'
 
 export default {
   name: 'BaseTable',
@@ -102,6 +102,9 @@
       this.$refs.searchForm.resetFields()
       this.search()
     },
+    refresh () {
+     window.location.reload()
+    },
     /**
      * 椤靛閲忓彉鏇村鐞嗭紙鍒囨崲椤靛閲忔椂瑙﹀彂锛�
      *
@@ -166,7 +169,7 @@
      * @param row 琛屽璞�
      * @param childConfirm 鍒犻櫎瀛愯妭鐐规椂鏄惁杩涜浜屾纭
      */
-    deleteById (row, childConfirm = true) {
+    deleteById (row, childConfirm = true, call) {
       this.__checkApi()
       let message = `纭鍒犻櫎${this.module}鍚�?`
       if (childConfirm && row.children != null && row.children.length > 0) {
@@ -178,6 +181,9 @@
           this.api.deleteById(row[this.configData['field.id']])
             .then(() => {
               this.__afterDelete()
+              if (call) {
+                call()
+              }
             })
             .catch(e => {
               this.$tip.apiFailed(e)
@@ -193,7 +199,7 @@
      *
      * @param childConfirm 鍒犻櫎瀛愯妭鐐规椂鏄惁杩涜浜屾纭
      */
-    deleteByIdInBatch (childConfirm = true) {
+    deleteByIdInBatch (childConfirm = true, call) {
       this.__checkApi()
       if (this.tableData.selectedRows.length === 0) {
         this.$tip.warning('璇疯嚦灏戦�夋嫨涓�鏉℃暟鎹�')
@@ -217,6 +223,9 @@
           this.api.deleteByIdInBatch(this.tableData.selectedRows.map(row => row[this.configData['field.id']]).join(','))
             .then(() => {
               this.__afterDelete(this.tableData.selectedRows.length)
+              if (call) {
+                call()
+              }
             })
             .catch(e => {
               this.$tip.apiFailed(e)
diff --git a/admin/src/components/business/OperaCategoryDcaProblemWindow.vue b/admin/src/components/business/OperaCategoryDcaProblemWindow.vue
new file mode 100644
index 0000000..5453131
--- /dev/null
+++ b/admin/src/components/business/OperaCategoryDcaProblemWindow.vue
@@ -0,0 +1,149 @@
+<template>
+  <GlobalWindow
+    :title="title"
+    :visible.sync="visible"
+    :confirm-working="isWorking"
+    @confirm="confirm"
+  >
+    <el-form :model="form" ref="form" :rules="rules">
+      <el-form-item label="鍚嶇О" prop="name">
+        <el-input v-model="form.name" placeholder="璇疯緭鍏ュ悕绉�" v-trim/>
+      </el-form-item>
+      <el-form-item label="閫夋嫨鐖剁骇" prop="parentId">
+        <el-cascader  v-model="form.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="sortnum">
+        <el-input v-model="form.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜锛堝崌搴忥級" v-trim/>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="remark">
+        <el-input v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ娉�" v-trim/>
+      </el-form-item>
+    </el-form>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaCategoryWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        name: '',
+        type: '',
+        remark: '',
+        categoryList: [],
+        sortnum: null,
+        parentId: null
+      },
+      categoryprops: {
+        label: 'name',
+        value: 'id',
+        checkStrictly: true,
+        lazyLoad: this.lazyLoad
+      },
+      categorys: [],
+      // 楠岃瘉瑙勫垯
+      rules: {
+        name: [{ required: true, message: '璇疯緭鍏ュ悕绉�', trigger: 'blur' }]
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/category',
+      'field.id': 'id'
+    })
+  },
+  methods: {
+    handleChangeCategory (value) {
+      if (this.form.categoryList && this.form.categoryList.length >= 1) {
+        this.form.parentId = this.form.categoryList[this.form.categoryList.length - 1]
+      }
+      if (!this.form.categoryList || this.form.categoryList.length == 0 || this.form.categoryList.length == 1) {
+        this.form.type = 4
+      } else {
+        this.form.type = 6
+      }
+    },
+    getTreeData (data) {
+      if (!data) {
+        return data
+      }
+      for (let i = 0; i < data.length; i++) {
+        console.log(data)
+        if (data[i].childList) {
+          if (data[i].childList.length < 1) {
+            data[i].childList = [] // children鑻ヤ负绌烘暟缁勶紝鍒欏皢children璁句负undefined
+            data[i].childern = [] // children鑻ヤ负绌烘暟缁勶紝鍒欏皢children璁句负undefined
+          } else {
+            this.getTreeData(data[i].childList) // children鑻ヤ笉涓虹┖鏁扮粍锛屽垯缁х画 閫掑綊璋冪敤 鏈柟娉�
+          }
+        }
+      }
+      return data
+    },
+    open (title, target, categorys, categoryType, parentIdPath) {
+      this.title = title
+      this.categorys = categorys || []
+      this.categorys = this.getTreeData(this.categorys)
+      console.log(this.categorys)
+      this.visible = true
+      this.form = {
+        id: null,
+        name: '',
+        type: '',
+        categoryList: [],
+        sortnum: null,
+        remark: '',
+        parentId: null
+      }
+      this.form.type = categoryType
+      // 鏂板缓
+      var that = this
+      if (target == null) {
+        this.$nextTick(() => {
+          this.$refs.form.resetFields()
+          this.form[this.configData['field.id']] = null
+          this.form.categoryList = []
+          if (parentIdPath && parentIdPath != null) {
+            var array = parentIdPath.split('/')
+            array.forEach(item => {
+              if (item && item != null && item !== '') {
+                that.form.categoryList.push(parseInt(item))
+              }
+            })
+            that.handleChangeCategory()
+          }
+        })
+        return
+      }
+      // 缂栬緫
+      this.$nextTick(() => {
+        for (const key in this.form) {
+          this.form[key] = target[key]
+        }
+        this.form.categoryList = []
+        if (target.parentId && target.idParentPath) {
+          var array = target.idParentPath.split('/')
+          array.forEach(item => {
+            if (item && item != null && item !== '') {
+              that.form.categoryList.push(parseInt(item))
+            }
+          })
+        }
+      })
+    }
+  }
+}
+</script>
diff --git a/admin/src/components/business/OperaCategoryWindow.vue b/admin/src/components/business/OperaCategoryWindow.vue
index d119f6d..181d604 100644
--- a/admin/src/components/business/OperaCategoryWindow.vue
+++ b/admin/src/components/business/OperaCategoryWindow.vue
@@ -6,47 +6,22 @@
     @confirm="confirm"
   >
     <el-form :model="form" ref="form" :rules="rules">
-      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
-        <el-input v-model="form.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" v-trim/>
-      </el-form-item>
-      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
-        <el-date-picker v-model="form.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�"></el-date-picker>
-      </el-form-item>
-      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
-        <el-input v-model="form.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" v-trim/>
-      </el-form-item>
-      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
-        <el-date-picker v-model="form.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�"></el-date-picker>
-      </el-form-item>
-      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
-        <el-input v-model="form.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" v-trim/>
-      </el-form-item>
       <el-form-item label="鍚嶇О" prop="name">
         <el-input v-model="form.name" placeholder="璇疯緭鍏ュ悕绉�" v-trim/>
       </el-form-item>
-      <el-form-item label="澶囨敞" prop="remark">
-        <el-input v-model="form.remark" placeholder="璇疯緭鍏ュ娉�" v-trim/>
-      </el-form-item>
-      <el-form-item label="鐘舵�� 0鍚敤 1绂佺敤" prop="status">
-        <el-input v-model="form.status" placeholder="璇疯緭鍏ョ姸鎬� 0鍚敤 1绂佺敤" v-trim/>
+      <el-form-item label="閫夋嫨鐖剁骇" prop="parentId">
+        <el-cascader  v-model="form.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="sortnum">
-        <el-input v-model="form.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" v-trim/>
+        <el-input v-model="form.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜锛堝崌搴忥級" v-trim/>
       </el-form-item>
-      <el-form-item label="鍥炬爣" prop="imgurl">
-        <el-input v-model="form.imgurl" placeholder="璇疯緭鍏ュ浘鏍�" v-trim/>
-      </el-form-item>
-      <el-form-item label="绫诲瀷 0SHE浼ゅ绫诲瀷 1瀹夊叏椋庨櫓浼ゅ绫诲瀷 2瀹夊叏椋庨櫓鍙戠敓鍦扮偣 3DCA浣嶇疆 4DCA闂 5SHE椋庨櫓鍦扮偣" prop="type">
-        <el-input v-model="form.type" placeholder="璇疯緭鍏ョ被鍨� 0SHE浼ゅ绫诲瀷 1瀹夊叏椋庨櫓浼ゅ绫诲瀷 2瀹夊叏椋庨櫓鍙戠敓鍦扮偣 3DCA浣嶇疆 4DCA闂 5SHE椋庨櫓鍦扮偣" v-trim/>
-      </el-form-item>
-      <el-form-item label="鐖剁骇缂栫爜锛堣嚜鍏宠仈锛�" prop="parentId">
-        <el-input v-model="form.parentId" placeholder="璇疯緭鍏ョ埗绾х紪鐮侊紙鑷叧鑱旓級" v-trim/>
-      </el-form-item>
-      <el-form-item label="鍚嶇О璺緞" prop="namePath">
-        <el-input v-model="form.namePath" placeholder="璇疯緭鍏ュ悕绉拌矾寰�" v-trim/>
-      </el-form-item>
-      <el-form-item label="缂栫爜璺緞" prop="idPath">
-        <el-input v-model="form.idPath" placeholder="璇疯緭鍏ョ紪鐮佽矾寰�" v-trim/>
+      <el-form-item label="澶囨敞" prop="remark">
+        <el-input v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ娉�" v-trim/>
       </el-form-item>
     </el-form>
   </GlobalWindow>
@@ -64,23 +39,23 @@
       // 琛ㄥ崟鏁版嵁
       form: {
         id: null,
-        creator: '',
-        createDate: '',
-        editor: '',
-        editDate: '',
-        isdeleted: '',
         name: '',
-        remark: '',
-        status: '',
-        sortnum: '',
-        imgurl: '',
         type: '',
-        parentId: '',
-        namePath: '',
-        idPath: ''
+        remark: '',
+        categoryList: [],
+        sortnum: null,
+        parentId: null
       },
+      categoryprops: {
+        label: 'name',
+        value: 'id',
+        checkStrictly: true,
+        lazyLoad: this.lazyLoad
+      },
+      categorys: [],
       // 楠岃瘉瑙勫垯
       rules: {
+        name: [{ required: true, message: '璇疯緭鍏ュ悕绉�', trigger: 'blur' }]
       }
     }
   },
@@ -89,6 +64,81 @@
       api: '/business/category',
       'field.id': 'id'
     })
+  },
+  methods: {
+    handleChangeCategory (value) {
+      if (this.form.categoryList && this.form.categoryList.length >= 1) {
+        this.form.parentId = this.form.categoryList[this.form.categoryList.length - 1]
+      }
+    },
+    getTreeData (data) {
+      if (!data) {
+        return data
+      }
+      for (let i = 0; i < data.length; i++) {
+        console.log(data)
+        if (data[i].childList) {
+          if (data[i].childList.length < 1) {
+            data[i].childList = [] // children鑻ヤ负绌烘暟缁勶紝鍒欏皢children璁句负undefined
+            data[i].childern = [] // children鑻ヤ负绌烘暟缁勶紝鍒欏皢children璁句负undefined
+          } else {
+            this.getTreeData(data[i].childList) // children鑻ヤ笉涓虹┖鏁扮粍锛屽垯缁х画 閫掑綊璋冪敤 鏈柟娉�
+          }
+        }
+      }
+      return data
+    },
+    open (title, target, categorys, categoryType, parentIdPath) {
+      this.title = title
+      this.categorys = categorys || []
+      this.categorys = this.getTreeData(this.categorys)
+      console.log(this.categorys)
+      this.visible = true
+      this.form = {
+        id: null,
+        name: '',
+        type: '',
+        remark: '',
+        categoryList: [],
+        sortnum: null,
+        parentId: null
+      }
+      this.form.type = categoryType
+      // 鏂板缓
+      var that = this
+      if (target == null) {
+        this.$nextTick(() => {
+          this.$refs.form.resetFields()
+          this.form[this.configData['field.id']] = null
+          this.form.categoryList = []
+          if (parentIdPath && parentIdPath != null) {
+            var array = parentIdPath.split('/')
+            array.forEach(item => {
+              if (item && item != null && item !== '') {
+                that.form.categoryList.push(parseInt(item))
+              }
+            })
+            that.handleChangeCategory()
+          }
+        })
+        return
+      }
+      // 缂栬緫
+      this.$nextTick(() => {
+        for (const key in this.form) {
+          this.form[key] = target[key]
+        }
+        this.form.categoryList = []
+        if (target.parentId && target.idParentPath) {
+          var array = target.idParentPath.split('/')
+          array.forEach(item => {
+            if (item && item != null && item !== '') {
+              that.form.categoryList.push(parseInt(item))
+            }
+          })
+        }
+      })
+    }
   }
 }
 </script>
diff --git a/admin/src/components/common/Tree.vue b/admin/src/components/common/Tree.vue
index 5d6fd7b..b522403 100644
--- a/admin/src/components/common/Tree.vue
+++ b/admin/src/components/common/Tree.vue
@@ -2,16 +2,14 @@
     <div class="tree">
         <div v-for="(item, index) of list" :key="index" @click.stop="clickIten(item)">
             <div class="tree_item">
-                <i class="el-icon-caret-bottom" :class="{ 'activeColor': item.fsStatus === 1 }" v-show="item.fsStatus === 1 && item.childList.length > 0"></i>
+                <i class="el-icon-caret-bottom" :class="{ 'activeColor': item.actived === 1 }" v-show="item.fsStatus === 1 && item.childList.length > 0"></i>
                 <i class="el-icon-caret-right color" v-show="item.childList.length > 0 && (item.fsStatus === 0 || !item.fsStatus)"></i>
-                <div class="tree_item_label long-title-style" :title="item.name" :class="{ 'activeColor': item.fsDate === 1 && item.childList.length === 0 }">{{ item.name }}</div>
-                <!--                <i class="el-icon-caret-bottom" :class="{ 'activeColor': item[defaultProps.status] }" v-show="item[defaultProps.status] && item[defaultProps.children]"></i>-->
-<!--                <i class="el-icon-caret-right color" v-show="item[defaultProps.children] && !item[defaultProps.status]"></i>-->
-<!--                <div class="tree_item_label long-title-style" :title="item[defaultProps.name]" :class="{ 'activeColor': item[defaultProps.status] && !item[defaultProps.children] }">{{ item[defaultProps.name] }}</div>-->
+                <div class="tree_item_label long-title-style" :title="item.name" :class="{ 'activeColor':  item.actived === 1 }">{{ item.name }}</div>
             </div>
             <div class="tree_childern" v-show="item.fsStatus === 1">
                 <tree
                   :list="item.childList"
+                  :alllist="alllist"
                   :defaultProps="defaultProps"
                   @callback="callback"
                 />
@@ -27,6 +25,11 @@
   name: 'tree',
   props: {
     list: {
+      type: Array,
+      required: false,
+      default: () => []
+    },
+    alllist: {
       type: Array,
       required: false,
       default: () => []
@@ -55,45 +58,33 @@
     }
   },
   methods: {
+    listForList(){
+      // console.log('===============================',this.alllist)
+    },
     // 鐐瑰嚮褰撳墠椤�
     clickIten (item) {
-      // item[this.defaultProps.status] = !item[this.defaultProps.status]
-      // this.list.forEach(subItem => {
-      //   if ((subItem[this.defaultProps.id] !== item[this.defaultProps.id] && subItem[this.defaultProps.status]) || (this.list.length === 1 && subItem[this.defaultProps.status] === false)) {
-      //     subItem[this.defaultProps.status] = false
-      //     if (subItem[this.defaultProps.children]) {
-      //       this.recursion(subItem[this.defaultProps.children])
-      //     }
-      //   }
-      // })
-      // if (this.tempItem['id'] === item[this.defaultProps.id]) {
-      //   this.tempItem = {
-      //     id: null,
-      //     name: null,
-      //     erpId: null
-      //   }
-      // } else {
-      //   this.tempItem.id = item[this.defaultProps.id]
-      //   this.tempItem.name = item[this.defaultProps.name]
-      //   this.tempItem.erpId = item['erpId']
-      // }
-      // item.fsDate === 0 || !item.fsDate ? item.fsDate = 1 : item.fsDate = 0
+      // this.listForList()
       const fsDate = item.fsDate === 0 || !item.fsDate ? 1 : 0
-      this.list.forEach(i => {
+      this.alllist.forEach(i => {
         i.fsDate = 0
+        i.actived = 0
+        this.recursion1(i.childList)
       })
       item.fsDate = fsDate
+      item.actived = 1
       if (item.childList.length > 0) {
         item.fsStatus === 0 || !item.fsStatus ? item.fsStatus = 1 : item.fsStatus = 0
       }
       this.$emit('callback', item, item)
     },
-    // 閫掑綊鏂规硶
-    recursion (children) {
+    recursion1 (children) {
+      if (!children || children.length === 0){
+        return
+      }
       children.forEach(item => {
-        item.fsDate = 0
-        if (item.childList.length > 0) {
-          this.recursion(item.childList)
+        item.actived = 0
+        if (item.childList && item.childList.length > 0) {
+          this.recursion1(item.childList)
         }
         // item[this.defaultProps.status] = false
         // if (item[this.defaultProps.children]) {
diff --git a/admin/src/views/business/categoryDbhLocaltion.vue b/admin/src/views/business/categoryDbhLocaltion.vue
new file mode 100644
index 0000000..9ef4df0
--- /dev/null
+++ b/admin/src/views/business/categoryDbhLocaltion.vue
@@ -0,0 +1,158 @@
+<template>
+  <TableLayout1 :permissions="['business:category:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <div ref="QueryFormRef" slot="search-form">
+      <el-form ref="searchForm" :model="searchForm"  inline>
+        <el-form-item label="鍚嶇О" prop="name">
+          <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ュ悕绉�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <section>
+          <el-button type="primary" @click="search">鎼滅储</el-button>
+          <el-button type="primary" @click="refresh">鏄剧ず椤跺眰</el-button>
+          <el-button @click="reset">閲嶇疆</el-button>
+        </section>
+      </el-form>
+    </div>
+    <template v-slot:menu>
+      <div
+        style="width: 100%; height: 50px; background: rgba(242, 242, 242, 1); line-height: 50px; text-align: center; font-size: 14px;">
+        璺岀粖婊戦闄╁彂鐢熷湴鐐�</div>
+      <div style="width: 100%; height: calc(100vh - 170px); overflow-y: scroll;">
+        <Tree :list="treeList" :alllist="treeList"  :defaultProps="{ name: 'name', status: 'fsStatus', children: 'childList', id: 'id' }"
+          @callback="callback" />
+      </div>
+    </template>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar"  v-if="containPermissions(['business:category:create', 'business:category:delete' ])" >
+        <li><el-button type="primary"
+                       @click="$refs.operaCategoryWindow.open('鏂板缓DCA浜嬩欢浣嶇疆淇℃伅', null,categoryList ,searchForm.type,searchForm.parentIdPath)" icon="el-icon-plus"
+                       v-permissions="['business:category:create']">鏂板缓</el-button></li>
+        <li><el-button type="danger" @click="deleteByIdInBatch(true,getfindTreePage)" icon="el-icon-delete" v-permissions="['business:category:delete']">鎵归噺鍒犻櫎</el-button></li>
+      </ul>
+      <el-table   v-loading="isWorking.search" :data="tableData.list" stripe @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="name" label="鍚嶇О" min-width="100px"></el-table-column>
+        <el-table-column prop="parentName" label="鐖剁骇" min-width="150px"></el-table-column>
+        <el-table-column prop="editorName" label="鎿嶄綔浜�" min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏈�鍚庢搷浣滄椂闂�" min-width="150px"></el-table-column>
+        <el-table-column v-if="containPermissions(['business:category:update', 'business:category:delete' ])" label="鎿嶄綔" min-width="280">
+          <template slot-scope="{row}">
+            <el-button type="text" icon="el-icon-edit" @click="$refs.operaCategoryWindow.open('缂栬緫DCA浜嬩欢浣嶇疆淇℃伅', row, categoryList,searchForm.type)"  v-permissions="['business:category:update']">缂栬緫</el-button>
+            <el-button type="text" icon="el-icon-delete" @click="deleteById(row,true, getfindTreePage)" style="color: red"  v-permissions="['business:category:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="tableData.pagination">
+      </pagination>
+      <OperaCategoryWindow ref="operaCategoryWindow" @success="handlePageChangeDo"/>
+    </template>
+  </TableLayout1>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout1 from '@/layouts/TableLayout1'
+import OperaCategoryWindow from '@/components/business/OperaCategoryWindow'
+import Pagination from '@/components/common/Pagination'
+import Tree from '@/components/common/Tree'
+import { treeList } from '@/api/business/category'
+export default {
+  name: 'categorySheType',
+  extends: BaseTable,
+  components: { TableLayout1, Pagination, Tree, OperaCategoryWindow },
+  data () {
+    return {
+      TreeList: [],
+      // 鎼滅储
+      searchForm: {
+        name: '',
+        keyword: '',
+        type: 2,
+        isRoot: 1,
+        parentId: '',
+        parentIdPath: null
+      },
+      loading: false,
+      heading: false,
+      working: false,
+      treeList: [],
+      categoryList: []
+    }
+  },
+  created () {
+    this.config({
+      module: '璺岀粖婊戦闄╁彂鐢熷湴鐐�',
+      api: '/business/category',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    // this.search()
+    this.getfindTreePage()
+  },
+  methods: {
+    handlePageChangeDo () {
+      this.searchForm.isRoot = 1
+      this.searchForm.parentId = null
+      this.getfindTreePage()
+      this.handlePageChange()
+    },
+    // 鑾峰彇缁勭粐鏍�
+    getfindTreePage () {
+      treeList({ type: this.searchForm.type })
+        .then(res => {
+          if (res && res.length > 0) {
+            res[0].fsStatus = 1
+            // var tree= [{id:null, name:'椤剁骇', childList:res,fsStatus:1}]
+            this.treeList = res
+            this.search()
+            this.categoryList = 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
+      })
+    },
+    callback (row) {
+      console.log(row)
+      this.searchForm.isRoot = null
+      this.searchForm.parentId = row.id
+      this.searchForm.parentIdPath = row.idPath
+      this.search()
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.box {
+  width: 100%;
+  display: flex;
+  align-items: center;
+
+  .box_menu {
+    width: 100px;
+    height: 100%;
+    flex-shrink: 0;
+  }
+
+  .box_tab {
+    flex: 1;
+    height: 100%;
+  }
+}
+</style>
diff --git a/admin/src/views/business/categoryDbhType.vue b/admin/src/views/business/categoryDbhType.vue
new file mode 100644
index 0000000..c483c46
--- /dev/null
+++ b/admin/src/views/business/categoryDbhType.vue
@@ -0,0 +1,158 @@
+<template>
+  <TableLayout1 :permissions="['business:category:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <div ref="QueryFormRef" slot="search-form">
+      <el-form ref="searchForm" :model="searchForm"  inline>
+        <el-form-item label="鍚嶇О" prop="name">
+          <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ュ悕绉�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <section>
+          <el-button type="primary" @click="search">鎼滅储</el-button>
+          <el-button type="primary" @click="refresh">鏄剧ず椤跺眰</el-button>
+          <el-button @click="reset">閲嶇疆</el-button>
+        </section>
+      </el-form>
+    </div>
+    <template v-slot:menu>
+      <div
+        style="width: 100%; height: 50px; background: rgba(242, 242, 242, 1); line-height: 50px; text-align: center; font-size: 14px;">
+        璺岀粖婊戦闄╃被鍨�</div>
+      <div style="width: 100%; height: calc(100vh - 170px); overflow-y: scroll;">
+        <Tree :list="treeList" :alllist="treeList"  :defaultProps="{ name: 'name', status: 'fsStatus', children: 'childList', id: 'id' }"
+          @callback="callback" />
+      </div>
+    </template>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar"  v-if="containPermissions(['business:category:create', 'business:category:delete' ])" >
+        <li><el-button type="primary"
+                       @click="$refs.operaCategoryWindow.open('鏂板缓璺岀粖婊戦闄╃被鍨�', null,categoryList ,searchForm.type,searchForm.parentIdPath)" icon="el-icon-plus"
+                       v-permissions="['business:category:create']">鏂板缓</el-button></li>
+        <li><el-button type="danger" @click="deleteByIdInBatch(true,getfindTreePage)" icon="el-icon-delete" v-permissions="['business:category:delete']">鎵归噺鍒犻櫎</el-button></li>
+      </ul>
+      <el-table   v-loading="isWorking.search" :data="tableData.list" stripe @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="name" label="鍚嶇О" min-width="100px"></el-table-column>
+        <el-table-column prop="parentName" label="鐖剁骇" min-width="150px"></el-table-column>
+        <el-table-column prop="editorName" label="鎿嶄綔浜�" min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏈�鍚庢搷浣滄椂闂�" min-width="150px"></el-table-column>
+        <el-table-column v-if="containPermissions(['business:category:update', 'business:category:delete' ])" label="鎿嶄綔" min-width="280">
+          <template slot-scope="{row}">
+            <el-button type="text" icon="el-icon-edit" @click="$refs.operaCategoryWindow.open('缂栬緫璺岀粖婊戦闄╃被鍨�', row, categoryList,searchForm.type)"  v-permissions="['business:category:update']">缂栬緫</el-button>
+            <el-button type="text" icon="el-icon-delete" @click="deleteById(row,true, getfindTreePage)" style="color: red"  v-permissions="['business:category:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="tableData.pagination">
+      </pagination>
+      <OperaCategoryWindow ref="operaCategoryWindow" @success="handlePageChangeDo"/>
+    </template>
+  </TableLayout1>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout1 from '@/layouts/TableLayout1'
+import OperaCategoryWindow from '@/components/business/OperaCategoryWindow'
+import Pagination from '@/components/common/Pagination'
+import Tree from '@/components/common/Tree'
+import { treeList } from '@/api/business/category'
+export default {
+  name: 'categorySheType',
+  extends: BaseTable,
+  components: { TableLayout1, Pagination, Tree, OperaCategoryWindow },
+  data () {
+    return {
+      TreeList: [],
+      // 鎼滅储
+      searchForm: {
+        name: '',
+        keyword: '',
+        type: 1,
+        parentId: '',
+        isRoot: 1,
+        parentIdPath: null
+      },
+      loading: false,
+      heading: false,
+      working: false,
+      treeList: [],
+      categoryList: []
+    }
+  },
+  created () {
+    this.config({
+      module: '璺岀粖婊戦闄╃被鍨嬮厤缃�',
+      api: '/business/category',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    // this.search()
+    this.getfindTreePage()
+  },
+  methods: {
+    handlePageChangeDo () {
+      this.searchForm.parentId = null
+      this.searchForm.isRoot = 1
+      this.getfindTreePage()
+      this.handlePageChange()
+    },
+    // 鑾峰彇缁勭粐鏍�
+    getfindTreePage () {
+      treeList({ type: this.searchForm.type })
+        .then(res => {
+          if (res && res.length > 0) {
+            res[0].fsStatus = 1
+            // var tree= [{id:null, name:'椤剁骇', childList:res,fsStatus:1}]
+            this.treeList = res
+            this.search()
+            this.categoryList = 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
+      })
+    },
+    callback (row) {
+      console.log(row)
+      this.searchForm.isRoot = null
+      this.searchForm.parentId = row.id
+      this.searchForm.parentIdPath = row.idPath
+      this.search()
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.box {
+  width: 100%;
+  display: flex;
+  align-items: center;
+
+  .box_menu {
+    width: 100px;
+    height: 100%;
+    flex-shrink: 0;
+  }
+
+  .box_tab {
+    flex: 1;
+    height: 100%;
+  }
+}
+</style>
diff --git a/admin/src/views/business/categoryDcaLocaltion.vue b/admin/src/views/business/categoryDcaLocaltion.vue
new file mode 100644
index 0000000..16d83c9
--- /dev/null
+++ b/admin/src/views/business/categoryDcaLocaltion.vue
@@ -0,0 +1,158 @@
+<template>
+  <TableLayout1 :permissions="['business:category:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <div ref="QueryFormRef" slot="search-form">
+      <el-form ref="searchForm" :model="searchForm"  inline>
+        <el-form-item label="鍚嶇О" prop="name">
+          <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ュ悕绉�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <section>
+          <el-button type="primary" @click="search">鎼滅储</el-button>
+          <el-button type="primary" @click="refresh">鏄剧ず椤跺眰</el-button>
+          <el-button @click="reset">閲嶇疆</el-button>
+        </section>
+      </el-form>
+    </div>
+    <template v-slot:menu>
+      <div
+        style="width: 100%; height: 50px; background: rgba(242, 242, 242, 1); line-height: 50px; text-align: center; font-size: 14px;">
+        DCA浜嬩欢浣嶇疆</div>
+      <div style="width: 100%; height: calc(100vh - 170px); overflow-y: scroll;">
+        <Tree :list="treeList" :alllist="treeList"  :defaultProps="{ name: 'name', status: 'fsStatus', children: 'childList', id: 'id' }"
+          @callback="callback" />
+      </div>
+    </template>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar"  v-if="containPermissions(['business:category:create', 'business:category:delete' ])" >
+        <li><el-button type="primary"
+                       @click="$refs.operaCategoryWindow.open('鏂板缓DCA浜嬩欢浣嶇疆淇℃伅', null,categoryList ,searchForm.type,searchForm.parentIdPath)" icon="el-icon-plus"
+                       v-permissions="['business:category:create']">鏂板缓</el-button></li>
+        <li><el-button type="danger" @click="deleteByIdInBatch(true,getfindTreePage)" icon="el-icon-delete" v-permissions="['business:category:delete']">鎵归噺鍒犻櫎</el-button></li>
+      </ul>
+      <el-table   v-loading="isWorking.search" :data="tableData.list" stripe @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="name" label="鍚嶇О" min-width="100px"></el-table-column>
+        <el-table-column prop="parentName" label="鐖剁骇" min-width="150px"></el-table-column>
+        <el-table-column prop="editorName" label="鎿嶄綔浜�" min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏈�鍚庢搷浣滄椂闂�" min-width="150px"></el-table-column>
+        <el-table-column v-if="containPermissions(['business:category:update', 'business:category:delete' ])" label="鎿嶄綔" min-width="280">
+          <template slot-scope="{row}">
+            <el-button type="text" icon="el-icon-edit" @click="$refs.operaCategoryWindow.open('缂栬緫DCA浜嬩欢浣嶇疆淇℃伅', row, categoryList,searchForm.type)"  v-permissions="['business:category:update']">缂栬緫</el-button>
+            <el-button type="text" icon="el-icon-delete" @click="deleteById(row,true, getfindTreePage)" style="color: red"  v-permissions="['business:category:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="tableData.pagination">
+      </pagination>
+      <OperaCategoryWindow ref="operaCategoryWindow" @success="handlePageChangeDo"/>
+    </template>
+  </TableLayout1>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout1 from '@/layouts/TableLayout1'
+import OperaCategoryWindow from '@/components/business/OperaCategoryWindow'
+import Pagination from '@/components/common/Pagination'
+import Tree from '@/components/common/Tree'
+import { treeList } from '@/api/business/category'
+export default {
+  name: 'categorySheType',
+  extends: BaseTable,
+  components: { TableLayout1, Pagination, Tree, OperaCategoryWindow },
+  data () {
+    return {
+      TreeList: [],
+      // 鎼滅储
+      searchForm: {
+        name: '',
+        keyword: '',
+        type: 3,
+        isRoot: 1,
+        parentId: '',
+        parentIdPath: null
+      },
+      loading: false,
+      heading: false,
+      working: false,
+      treeList: [],
+      categoryList: []
+    }
+  },
+  created () {
+    this.config({
+      module: 'DCA浜嬩欢浣嶇疆淇℃伅',
+      api: '/business/category',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    // this.search()
+    this.getfindTreePage()
+  },
+  methods: {
+    handlePageChangeDo () {
+      this.searchForm.isRoot = 1
+      this.searchForm.parentId = null
+      this.getfindTreePage()
+      this.handlePageChange()
+    },
+    // 鑾峰彇缁勭粐鏍�
+    getfindTreePage () {
+      treeList({ type: this.searchForm.type })
+        .then(res => {
+          if (res && res.length > 0) {
+            res[0].fsStatus = 1
+            // var tree= [{id:null, name:'椤剁骇', childList:res,fsStatus:1}]
+            this.treeList = res
+            this.search()
+            this.categoryList = 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
+      })
+    },
+    callback (row) {
+      console.log(row)
+      this.searchForm.isRoot = null
+      this.searchForm.parentId = row.id
+      this.searchForm.parentIdPath = row.idPath
+      this.search()
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.box {
+  width: 100%;
+  display: flex;
+  align-items: center;
+
+  .box_menu {
+    width: 100px;
+    height: 100%;
+    flex-shrink: 0;
+  }
+
+  .box_tab {
+    flex: 1;
+    height: 100%;
+  }
+}
+</style>
diff --git a/admin/src/views/business/categoryDcaProblem.vue b/admin/src/views/business/categoryDcaProblem.vue
new file mode 100644
index 0000000..1149c72
--- /dev/null
+++ b/admin/src/views/business/categoryDcaProblem.vue
@@ -0,0 +1,194 @@
+<template>
+  <TableLayout1 :permissions="['business:category:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <div ref="QueryFormRef" slot="search-form">
+      <el-form ref="searchForm" :model="searchForm"  inline>
+        <el-form-item label="鍚嶇О" prop="name">
+          <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ュ悕绉�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <section>
+          <el-button type="primary" @click="search">鎼滅储</el-button>
+          <el-button type="primary" @click="refresh">鏄剧ず椤跺眰</el-button>
+          <el-button @click="reset">閲嶇疆</el-button>
+        </section>
+      </el-form>
+    </div>
+    <template v-slot:menu>
+      <div
+        style="width: 100%; height: 50px; background: rgba(242, 242, 242, 1); line-height: 50px; text-align: center; font-size: 14px;">
+        DCA涓婚</div>
+      <div style="width: 100%; height: calc(100vh - 170px); overflow-y: scroll;">
+        <Tree :list="treeList" :alllist="treeList"  :defaultProps="{ name: 'name', status: 'fsStatus', children: 'childList', id: 'id' }"
+          @callback="callback" />
+      </div>
+    </template>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar"  v-if="containPermissions(['business:category:create', 'business:category:delete' ])" >
+        <li><el-button type="primary"
+                       @click="$refs.operaCategoryWindow.open('鏂板缓DCA涓婚鍜岃瀵熼」', null,categoryList ,4,searchForm.parentIdPath)" icon="el-icon-plus"
+                       v-permissions="['business:category:create']">鏂板缓</el-button></li>
+        <li><el-button type="danger" @click="deleteByIdInBatch(true,getfindTreePage)" icon="el-icon-delete" v-permissions="['business:category:delete']">鎵归噺鍒犻櫎</el-button></li>
+      </ul>
+      <el-table   v-loading="isWorking.search" :data="tableData.list" stripe @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="name" label="鍚嶇О" min-width="100px"></el-table-column>
+        <el-table-column prop="parentName" label="鎵�灞炵埗绾�" min-width="150px"></el-table-column>
+        <el-table-column prop="parentName" label="閰嶇疆绫诲瀷" min-width="150px">
+          <template slot-scope="{row}">
+            <span v-if="row.type == 6" >瑙傚療椤�</span>
+            <span v-else-if="level == 0" >涓�绾т富棰�</span>
+            <span v-else-if="level == 1" >浜岀骇涓婚</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="editorName" label="鎿嶄綔浜�" min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏈�鍚庢搷浣滄椂闂�" min-width="150px"></el-table-column>
+        <el-table-column prop="remark" label="澶囨敞" min-width="100px"></el-table-column>
+        <el-table-column v-if="containPermissions(['business:category:update', 'business:category:delete' ])" label="鎿嶄綔" min-width="280">
+          <template slot-scope="{row}">
+            <el-button type="text" icon="el-icon-edit" @click="$refs.operaCategoryWindow.open('缂栬緫DCA涓婚鍜岃瀵熼」', row, categoryList,row.type)"  v-permissions="['business:category:update']">缂栬緫</el-button>
+            <el-button type="text" icon="el-icon-delete" @click="deleteById(row,true, getfindTreePage)" style="color: red"  v-permissions="['business:category:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="tableData.pagination">
+      </pagination>
+      <OperaCategoryDcaProblemWindow ref="operaCategoryWindow" @success="handlePageChangeDo"/>
+    </template>
+  </TableLayout1>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout1 from '@/layouts/TableLayout1'
+import OperaCategoryDcaProblemWindow from '@/components/business/OperaCategoryDcaProblemWindow'
+import Pagination from '@/components/common/Pagination'
+import Tree from '@/components/common/Tree'
+import { treeList } from '@/api/business/category'
+export default {
+  name: 'categorySheType',
+  extends: BaseTable,
+  components: { TableLayout1, Pagination, Tree, OperaCategoryDcaProblemWindow },
+  data () {
+    return {
+      TreeList: [],
+      level: 1,
+      // 鎼滅储
+      searchForm: {
+        name: '',
+        keyword: '',
+        type: 4,
+        parentId: '',
+        isRoot: 1,
+        parentIdPath: null
+      },
+      loading: false,
+      heading: false,
+      working: false,
+      treeList: [],
+      categoryList: []
+    }
+  },
+  created () {
+    this.config({
+      module: 'DCA涓婚鍜岃瀵熼」',
+      api: '/business/category',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    // this.search()
+    this.getfindTreePage()
+  },
+  methods: {
+    handlePageChangeDo () {
+      this.searchForm.isRoot = 1
+      this.searchForm.level = 1
+      this.searchForm.type = 4
+      this.searchForm.parentId = null
+      this.getfindTreePage()
+      this.handlePageChange()
+    },
+    initTwoLevelList (res) {
+      return res.map(item => {
+        if (item && item.childList && item.childList.length > 0) {
+          item.childList.forEach(item1 => {
+            item1.childList = []
+            item1.level = 2
+          })
+        }
+        const newItem = { ...item, level: 1 }
+        if (newItem) {
+          newItem.children = newItem.childList
+        }
+        if (item.childList && item.childList.length === 0) {
+          this.$delete(newItem, 'children')
+        }
+        return newItem
+      })
+    },
+    // 鑾峰彇缁勭粐鏍�
+    getfindTreePage () {
+      treeList({ type: 4 })
+        .then(res => {
+          if (res && res.length > 0) {
+            res[0].fsStatus = 1
+            // var tree= [{id:null, name:'椤剁骇', childList:res,fsStatus:1}]
+            this.treeList = this.initTwoLevelList(res)
+            this.search()
+            this.categoryList = this.getCategoryTree(this.treeList)
+          }
+        })
+    },
+    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
+      })
+    },
+    callback (row) {
+      console.log(row)
+      this.searchForm.parentId = row.id
+      this.searchForm.isRoot = null
+      this.searchForm.parentIdPath = row.idPath
+      this.level= row.level
+      if (row.level === 2) {
+        this.searchForm.type = 6
+      } else {
+        this.searchForm.type = 4
+      }
+      this.search()
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.box {
+  width: 100%;
+  display: flex;
+  align-items: center;
+
+  .box_menu {
+    width: 100px;
+    height: 100%;
+    flex-shrink: 0;
+  }
+
+  .box_tab {
+    flex: 1;
+    height: 100%;
+  }
+}
+</style>
diff --git a/admin/src/views/business/categorySheLocaltion.vue b/admin/src/views/business/categorySheLocaltion.vue
new file mode 100644
index 0000000..4437fdc
--- /dev/null
+++ b/admin/src/views/business/categorySheLocaltion.vue
@@ -0,0 +1,158 @@
+<template>
+  <TableLayout1 :permissions="['business:category:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <div ref="QueryFormRef" slot="search-form">
+      <el-form ref="searchForm" :model="searchForm"  inline>
+        <el-form-item label="鍚嶇О" prop="name">
+          <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ュ悕绉�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <section>
+          <el-button type="primary" @click="search">鎼滅储</el-button>
+          <el-button type="primary" @click="refresh">鏄剧ず椤跺眰</el-button>
+          <el-button @click="reset">閲嶇疆</el-button>
+        </section>
+      </el-form>
+    </div>
+    <template v-slot:menu>
+      <div
+        style="width: 100%; height: 50px; background: rgba(242, 242, 242, 1); line-height: 50px; text-align: center; font-size: 14px;">
+        SHE浜嬩欢鍙戠敓鍦扮偣</div>
+      <div style="width: 100%; height: calc(100vh - 170px); overflow-y: scroll;">
+        <Tree :list="treeList" :alllist="treeList"  :defaultProps="{ name: 'name', status: 'fsStatus', children: 'childList', id: 'id' }"
+          @callback="callback" />
+      </div>
+    </template>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar"  v-if="containPermissions(['business:category:create', 'business:category:delete' ])" >
+        <li><el-button type="primary"
+                       @click="$refs.operaCategoryWindow.open('鏂板缓SHE浜嬩欢鍙戠敓鍦扮偣', null,categoryList ,searchForm.type,searchForm.parentIdPath)" icon="el-icon-plus"
+                       v-permissions="['business:category:create']">鏂板缓</el-button></li>
+        <li><el-button type="danger" @click="deleteByIdInBatch(true,getfindTreePage)" icon="el-icon-delete" v-permissions="['business:category:delete']">鎵归噺鍒犻櫎</el-button></li>
+      </ul>
+      <el-table   v-loading="isWorking.search" :data="tableData.list" stripe @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="name" label="鍚嶇О" min-width="100px"></el-table-column>
+        <el-table-column prop="parentName" label="鐖剁骇" min-width="150px"></el-table-column>
+        <el-table-column prop="editorName" label="鎿嶄綔浜�" min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏈�鍚庢搷浣滄椂闂�" min-width="150px"></el-table-column>
+        <el-table-column v-if="containPermissions(['business:category:update', 'business:category:delete' ])" label="鎿嶄綔" min-width="280">
+          <template slot-scope="{row}">
+            <el-button type="text" icon="el-icon-edit" @click="$refs.operaCategoryWindow.open('缂栬緫SHE浜嬩欢鍙戠敓鍦扮偣', row, categoryList,searchForm.type)"  v-permissions="['business:category:update']">缂栬緫</el-button>
+            <el-button type="text" icon="el-icon-delete" @click="deleteById(row,true, getfindTreePage)" style="color: red"  v-permissions="['business:category:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="tableData.pagination">
+      </pagination>
+      <OperaCategoryWindow ref="operaCategoryWindow" @success="handlePageChangeDo"/>
+    </template>
+  </TableLayout1>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout1 from '@/layouts/TableLayout1'
+import OperaCategoryWindow from '@/components/business/OperaCategoryWindow'
+import Pagination from '@/components/common/Pagination'
+import Tree from '@/components/common/Tree'
+import { treeList } from '@/api/business/category'
+export default {
+  name: 'categorySheType',
+  extends: BaseTable,
+  components: { TableLayout1, Pagination, Tree, OperaCategoryWindow },
+  data () {
+    return {
+      TreeList: [],
+      // 鎼滅储
+      searchForm: {
+        name: '',
+        keyword: '',
+        type: 5,
+        parentId: '',
+        isRoot: 1,
+        parentIdPath: null
+      },
+      loading: false,
+      heading: false,
+      working: false,
+      treeList: [],
+      categoryList: []
+    }
+  },
+  created () {
+    this.config({
+      module: 'SHE浜嬩欢鍙戠敓鍦扮偣',
+      api: '/business/category',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    // this.search()
+    this.getfindTreePage()
+  },
+  methods: {
+    handlePageChangeDo () {
+      this.searchForm.isRoot = 1
+      this.searchForm.parentId = null
+      this.getfindTreePage()
+      this.handlePageChange()
+    },
+    // 鑾峰彇缁勭粐鏍�
+    getfindTreePage () {
+      treeList({ type: this.searchForm.type })
+        .then(res => {
+          if (res && res.length > 0) {
+            res[0].fsStatus = 1
+            // var tree= [{id:null, name:'椤剁骇', childList:res,fsStatus:1}]
+            this.treeList = res
+            this.search()
+            this.categoryList = 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
+      })
+    },
+    callback (row) {
+      console.log(row)
+      this.searchForm.isRoot = null
+      this.searchForm.parentId = row.id
+      this.searchForm.parentIdPath = row.idPath
+      this.search()
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.box {
+  width: 100%;
+  display: flex;
+  align-items: center;
+
+  .box_menu {
+    width: 100px;
+    height: 100%;
+    flex-shrink: 0;
+  }
+
+  .box_tab {
+    flex: 1;
+    height: 100%;
+  }
+}
+</style>
diff --git a/admin/src/views/business/categorySheType.vue b/admin/src/views/business/categorySheType.vue
new file mode 100644
index 0000000..071108c
--- /dev/null
+++ b/admin/src/views/business/categorySheType.vue
@@ -0,0 +1,158 @@
+<template>
+  <TableLayout1 :permissions="['business:category:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <div ref="QueryFormRef" slot="search-form">
+      <el-form ref="searchForm" :model="searchForm"  inline>
+        <el-form-item label="鍚嶇О" prop="name">
+          <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ュ悕绉�" @keypress.enter.native="search"></el-input>
+        </el-form-item>
+        <section>
+          <el-button type="primary" @click="search">鎼滅储</el-button>
+          <el-button type="primary" @click="refresh">鏄剧ず椤跺眰</el-button>
+          <el-button @click="reset">閲嶇疆</el-button>
+        </section>
+      </el-form>
+    </div>
+    <template v-slot:menu>
+      <div
+        style="width: 100%; height: 50px; background: rgba(242, 242, 242, 1); line-height: 50px; text-align: center; font-size: 14px;">
+        浼ゅ绫诲瀷</div>
+      <div style="width: 100%; height: calc(100vh - 170px); overflow-y: scroll;">
+        <Tree :list="treeList" :alllist="treeList"  :defaultProps="{ name: 'name', status: 'fsStatus', children: 'childList', id: 'id' }"
+          @callback="callback" />
+      </div>
+    </template>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar"  v-if="containPermissions(['business:category:create', 'business:category:delete' ])" >
+        <li><el-button type="primary"
+                       @click="$refs.operaCategoryWindow.open('鏂板缓浼ゅ绫诲瀷', null,categoryList ,searchForm.type,searchForm.parentIdPath)" icon="el-icon-plus"
+                       v-permissions="['business:category:create']">鏂板缓</el-button></li>
+        <li><el-button type="danger" @click="deleteByIdInBatch(true,getfindTreePage)" icon="el-icon-delete" v-permissions="['business:category:delete']">鎵归噺鍒犻櫎</el-button></li>
+      </ul>
+      <el-table   v-loading="isWorking.search" :data="tableData.list" stripe @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="name" label="鍚嶇О" min-width="100px"></el-table-column>
+        <el-table-column prop="parentName" label="鐖剁骇" min-width="150px"></el-table-column>
+        <el-table-column prop="editorName" label="鎿嶄綔浜�" min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏈�鍚庢搷浣滄椂闂�" min-width="150px"></el-table-column>
+        <el-table-column v-if="containPermissions(['business:category:update', 'business:category:delete' ])" label="鎿嶄綔" min-width="280">
+          <template slot-scope="{row}">
+            <el-button type="text" icon="el-icon-edit" @click="$refs.operaCategoryWindow.open('缂栬緫浼ゅ椋庨櫓淇℃伅', row, categoryList,searchForm.type)"  v-permissions="['business:category:update']">缂栬緫</el-button>
+            <el-button type="text" icon="el-icon-delete" @click="deleteById(row,true, getfindTreePage)" style="color: red"  v-permissions="['business:category:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="tableData.pagination">
+      </pagination>
+      <OperaCategoryWindow ref="operaCategoryWindow" @success="handlePageChangeDo"/>
+    </template>
+  </TableLayout1>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout1 from '@/layouts/TableLayout1'
+import OperaCategoryWindow from '@/components/business/OperaCategoryWindow'
+import Pagination from '@/components/common/Pagination'
+import Tree from '@/components/common/Tree'
+import { treeList } from '@/api/business/category'
+export default {
+  name: 'categorySheType',
+  extends: BaseTable,
+  components: { TableLayout1, Pagination, Tree, OperaCategoryWindow },
+  data () {
+    return {
+      TreeList: [],
+      // 鎼滅储
+      searchForm: {
+        name: '',
+        keyword: '',
+        type: 0,
+        parentId: '',
+        isRoot: 1,
+        parentIdPath: null
+      },
+      loading: false,
+      heading: false,
+      working: false,
+      treeList: [],
+      categoryList: []
+    }
+  },
+  created () {
+    this.config({
+      module: '浼ゅ鍒嗙被閰嶇疆',
+      api: '/business/category',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    // this.search()
+    this.getfindTreePage()
+  },
+  methods: {
+    handlePageChangeDo () {
+      this.searchForm.parentId = null
+      this.searchForm.isRoot = 1
+      this.getfindTreePage()
+      this.handlePageChange()
+    },
+    // 鑾峰彇缁勭粐鏍�
+    getfindTreePage () {
+      treeList({ type: this.searchForm.type })
+        .then(res => {
+          if (res && res.length > 0) {
+            res[0].fsStatus = 1
+            // var tree= [{id:null, name:'椤剁骇', childList:res,fsStatus:1}]
+            this.treeList = res
+            this.search()
+            this.categoryList = 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
+      })
+    },
+    callback (row) {
+      console.log(row)
+      this.searchForm.isRoot = null
+      this.searchForm.parentId = row.id
+      this.searchForm.parentIdPath = row.idPath
+      this.search()
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.box {
+  width: 100%;
+  display: flex;
+  align-items: center;
+
+  .box_menu {
+    width: 100px;
+    height: 100%;
+    flex-shrink: 0;
+  }
+
+  .box_tab {
+    flex: 1;
+    height: 100%;
+  }
+}
+</style>
diff --git a/admin/src/views/business/companyMember.vue b/admin/src/views/business/companyMember.vue
index 3b135f6..47db257 100644
--- a/admin/src/views/business/companyMember.vue
+++ b/admin/src/views/business/companyMember.vue
@@ -93,7 +93,6 @@
     })
     // this.search()
     this.getfindCompanyTreePage()
-    this.getPositionList()
   },
   methods: {
     // 鑾峰彇缁勭粐鏍�
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 f06804a..ccf5c99 100644
--- a/server/src/main/java/com/doumee/api/business/CategoryController.java
+++ b/server/src/main/java/com/doumee/api/business/CategoryController.java
@@ -7,6 +7,7 @@
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.model.PageData;
 import com.doumee.dao.business.model.Category;
+import com.doumee.dao.business.model.Company;
 import com.doumee.service.business.CategoryService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -82,4 +83,13 @@
     public ApiResponse findById(@PathVariable Integer id) {
         return ApiResponse.success(categoryService.findById(id));
     }
+
+
+    @ApiOperation("鍒嗙被鏍戞煡璇�")
+    @PostMapping("/tree")
+    @RequiresPermissions("business:category:query")
+    public ApiResponse<List<Category>> tree (@RequestBody Category param){
+        return ApiResponse.success(categoryService.treeList(param));
+    }
+
 }
diff --git a/server/src/main/java/com/doumee/dao/business/CategoryMapper.java b/server/src/main/java/com/doumee/dao/business/CategoryMapper.java
index 824f9b1..b1039f7 100644
--- a/server/src/main/java/com/doumee/dao/business/CategoryMapper.java
+++ b/server/src/main/java/com/doumee/dao/business/CategoryMapper.java
@@ -2,11 +2,12 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.doumee.dao.business.model.Category;
+import com.github.yulichang.base.MPJBaseMapper;
 
 /**
  * @author 姹熻箘韫�
  * @since 2025/04/02 17:49
  */
-public interface CategoryMapper extends BaseMapper<Category> {
+public interface CategoryMapper extends MPJBaseMapper<Category> {
 
 }
diff --git a/server/src/main/java/com/doumee/dao/business/model/Category.java b/server/src/main/java/com/doumee/dao/business/model/Category.java
index eab4464..7bb953a 100644
--- a/server/src/main/java/com/doumee/dao/business/model/Category.java
+++ b/server/src/main/java/com/doumee/dao/business/model/Category.java
@@ -1,5 +1,6 @@
 package com.doumee.dao.business.model;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.doumee.core.annotation.excel.ExcelExportColumn;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -9,6 +10,7 @@
 import lombok.Data;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import java.util.Date;
+import java.util.List;
 
 /**
  * 鍒嗙被淇℃伅琛�
@@ -67,8 +69,8 @@
     @ExcelExportColumn(name="鍥炬爣")
     private String imgurl;
 
-    @ApiModelProperty(value = "绫诲瀷 0SHE浼ゅ绫诲瀷 1瀹夊叏椋庨櫓浼ゅ绫诲瀷 2瀹夊叏椋庨櫓鍙戠敓鍦扮偣 3DCA浣嶇疆 4DCA闂 5SHE椋庨櫓鍦扮偣", example = "1")
-    @ExcelExportColumn(name="绫诲瀷 0SHE浼ゅ绫诲瀷 1瀹夊叏椋庨櫓浼ゅ绫诲瀷 2瀹夊叏椋庨櫓鍙戠敓鍦扮偣 3DCA浣嶇疆 4DCA闂 5SHE椋庨櫓鍦扮偣")
+    @ApiModelProperty(value = "绫诲瀷 0SHE浼ゅ绫诲瀷 1璺岀粖婊戜激瀹崇被鍨� 2璺岀粖婊戝彂鐢熷湴鐐� 3DCA浣嶇疆 4DCA涓婚 5SHE椋庨櫓鍦扮偣 6DCA瑙傚療椤�", example = "1")
+    @ExcelExportColumn(name="绫诲瀷 0SHE浼ゅ绫诲瀷 1璺岀粖婊戜激瀹崇被鍨� 2璺岀粖婊戝彂鐢熷湴鐐� 3DCA浣嶇疆 4DCA涓婚 5SHE椋庨櫓鍦扮偣 6DCA瑙傚療椤�")
     private Integer type;
 
     @ApiModelProperty(value = "鐖剁骇缂栫爜锛堣嚜鍏宠仈锛�", example = "1")
@@ -82,5 +84,19 @@
     @ApiModelProperty(value = "缂栫爜璺緞")
     @ExcelExportColumn(name="缂栫爜璺緞")
     private String idPath;
-
+    @ApiModelProperty(value = "涓婄骇鍚嶇О")
+    @TableField(exist = false)
+    private String parentName;
+    @ApiModelProperty(value = "鎿嶄綔浜哄悕瀛�")
+    @TableField(exist = false)
+    private String editorName;
+    @ApiModelProperty(value = "鎿嶄綔浜哄悕瀛�")
+    @TableField(exist = false)
+    private String idParentPath;
+    @ApiModelProperty(value = "鏄惁鏍硅妭鐐� 0鍚� 1鏄�")
+    @TableField(exist = false)
+    private Integer isRoot;
+    @ApiModelProperty(value = "鎿嶄綔浜哄悕瀛�")
+    @TableField(exist = false)
+    private List<Category> childList;
 }
diff --git a/server/src/main/java/com/doumee/dao/business/vo/CategoryTree.java b/server/src/main/java/com/doumee/dao/business/vo/CategoryTree.java
new file mode 100644
index 0000000..4a00088
--- /dev/null
+++ b/server/src/main/java/com/doumee/dao/business/vo/CategoryTree.java
@@ -0,0 +1,89 @@
+package com.doumee.dao.business.vo;
+
+import com.doumee.dao.business.model.Category;
+import com.doumee.dao.business.model.Company;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2023/7/13 10:40
+ */
+public class CategoryTree {
+
+    // 淇濆瓨鍙備笌鏋勫缓鏍戝舰鐨勬墍鏈夋暟鎹紙閫氬父鏁版嵁搴撴煡璇㈢粨鏋滐級
+    public List<Category> nodeList = new ArrayList<>();
+
+
+    /**
+     *  鏋勯�犳柟娉�
+     *  @param nodeList 灏嗘暟鎹泦鍚堣祴鍊肩粰nodeList锛屽嵆鎵�鏈夋暟鎹綔涓烘墍鏈夎妭鐐广��
+     */
+    public CategoryTree(List<Category> nodeList){
+        this.nodeList = nodeList;
+    }
+
+
+    /**
+     *   鑾峰彇闇�鏋勫缓鐨勬墍鏈夋牴鑺傜偣锛堥《绾ц妭鐐癸級 "0"
+     *   @return 鎵�鏈夋牴鑺傜偣List闆嗗悎
+     */
+    public List<Category> getRootNode(){
+        // 淇濆瓨鎵�鏈夋牴鑺傜偣锛堟墍鏈夋牴鑺傜偣鐨勬暟鎹級
+        List<Category> rootNodeList = new ArrayList<>();
+        // treeNode锛氭煡璇㈠嚭鐨勬瘡涓�鏉℃暟鎹紙鑺傜偣锛�
+        for (Category treeNode : nodeList){
+            // 鍒ゆ柇褰撳墠鑺傜偣鏄惁涓烘牴鑺傜偣锛屾澶勬敞鎰忥細鑻arentId绫诲瀷鏄疭tring锛屽垯瑕侀噰鐢╡quals()鏂规硶鍒ゆ柇銆�
+                if (Objects.isNull(treeNode.getParentId())) {
+                    // 鏄紝娣诲姞
+                    rootNodeList.add(treeNode);
+            }
+        }
+        return rootNodeList;
+    }
+
+
+    /**
+     *  鏍规嵁姣忎竴涓《绾ц妭鐐癸紙鏍硅妭鐐癸級杩涜鏋勫缓鏍戝舰缁撴瀯
+     *  @return  鏋勫缓鏁存5鏍�
+     */
+    public List<Category> buildTree(){
+        // treeNodes锛氫繚瀛樹竴涓《绾ц妭鐐规墍鏋勫缓鍑烘潵鐨勫畬鏁存爲褰�
+        List<Category> treeNodes = new ArrayList<Category>();
+        // getRootNode()锛氳幏鍙栨墍鏈夌殑鏍硅妭鐐�
+        for (Category treeRootNode : getRootNode()) {
+            // 灏嗛《绾ц妭鐐硅繘琛屾瀯寤哄瓙鏍�
+            treeRootNode = buildChildTree(treeRootNode);
+            // 瀹屾垚涓�涓《绾ц妭鐐规墍鏋勫缓鐨勬爲褰紝澧炲姞杩涙潵
+            treeNodes.add(treeRootNode);
+        }
+        return treeNodes;
+    }
+
+    /**
+     *  閫掑綊-----鏋勫缓瀛愭爲褰㈢粨鏋�
+     *  @param  pNode 鏍硅妭鐐癸紙椤剁骇鑺傜偣锛�
+     *  @return 鏁存5鏍�
+     */
+    public Category buildChildTree(Category pNode){
+        List<Category> childTree = new ArrayList<>();
+        // nodeList锛氭墍鏈夎妭鐐归泦鍚堬紙鎵�鏈夋暟鎹級
+        for (Category treeNode : nodeList) {
+            // 鍒ゆ柇褰撳墠鑺傜偣鐨勭埗鑺傜偣ID鏄惁绛変簬鏍硅妭鐐圭殑ID锛屽嵆褰撳墠鑺傜偣涓哄叾涓嬬殑瀛愯妭鐐�
+            if (!Objects.isNull(treeNode.getParentId())&&treeNode.getParentId().equals(pNode.getId())) {
+                // 鍐嶉�掑綊杩涜鍒ゆ柇褰撳墠鑺傜偣鐨勬儏鍐碉紝璋冪敤鑷韩鏂规硶
+                childTree.add(buildChildTree(treeNode));
+            }
+        }
+        // for寰幆缁撴潫锛屽嵆鑺傜偣涓嬫病鏈変换浣曡妭鐐癸紝鏍戝舰鏋勫缓缁撴潫锛岃缃爲缁撴灉
+        pNode.setChildList(childTree);
+        return pNode;
+    }
+
+
+}
diff --git a/server/src/main/java/com/doumee/service/business/CategoryService.java b/server/src/main/java/com/doumee/service/business/CategoryService.java
index bc36c83..3a378bf 100644
--- a/server/src/main/java/com/doumee/service/business/CategoryService.java
+++ b/server/src/main/java/com/doumee/service/business/CategoryService.java
@@ -94,4 +94,6 @@
      * @return long
      */
     long count(Category category);
+
+    List<Category> treeList(Category param );
 }
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 9dbee6a..ce07a05 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
@@ -1,20 +1,34 @@
 package com.doumee.service.business.impl;
 
+import com.doumee.core.constants.Constants;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.model.LoginUserInfo;
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Utils;
 import com.doumee.dao.business.CategoryMapper;
 import com.doumee.dao.business.model.Category;
+import com.doumee.dao.business.model.Company;
+import com.doumee.dao.business.model.Managers;
+import com.doumee.dao.business.vo.CategoryTree;
+import com.doumee.dao.business.vo.CompanyTree;
+import com.doumee.dao.system.model.SystemUser;
 import com.doumee.service.business.CategoryService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.SecurityUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
+import java.util.Date;
 import java.util.List;
+import java.util.UUID;
 
 /**
  * 鍒嗙被淇℃伅琛⊿ervice瀹炵幇
@@ -29,13 +43,57 @@
 
     @Override
     public Integer create(Category category) {
+        if(StringUtils.isBlank(category.getName())){
+            throw  new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        if(category.getType()==null){
+            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "瀵逛笉璧凤紝缁勭粐绫诲瀷涓嶆纭紝璇锋寜瑕佹眰濉啓~");
+        }
+  /*      //鏌ヨ鍚嶇О涓嶈兘閲嶅
+        if(categoryMapper.selectCount(new QueryWrapper<Category>().lambda()
+                .eq(Category::getName,category.getName())
+                .eq(Category::getIsdeleted,Constants.ZERO)) >0){
+            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "瀵逛笉璧凤紝鍚嶇О涓嶈兘閲嶅~");
+        }*/
+        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+        category.setIdPath(category.getId()+"/");//鍚嶇О璺緞
+        category.setNamePath(category.getName());//鍚嶇О璺緞
+        String idPath = "";
+        if(category.getParentId() !=null){
+            Category parent = findById(category.getParentId());
+            if(parent == null || Constants.equalsInteger(parent.getIsdeleted(),Constants.ONE)){
+                throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "瀵逛笉璧凤紝鐖剁骇淇℃伅涓嶅瓨鍦▇");
+            }
+
+            idPath = parent.getIdPath();
+            category.setIdPath(parent.getIdPath()+category.getId()+"/");
+            category.setNamePath(parent.getNamePath()+"/"+category.getName());
+        }
+        category.setCreateDate(new Date());
+        category.setCreator(user.getId());
+        category.setIsdeleted(Constants.ZERO);
+        category.setStatus(Constants.ZERO);
+        category.setEditDate(category.getCreateDate());
+        category.setEditor(category.getCreator());
         categoryMapper.insert(category);
+
+        Category com = new Category();
+        com.setId(category.getId());
+        com.setIdPath(idPath+category.getId()+"/");
+        categoryMapper.updateById(com);
         return category.getId();
+
     }
 
     @Override
     public void deleteById(Integer id) {
-        categoryMapper.deleteById(id);
+        Category model = new Category();
+        model.setId(id);
+        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+        model.setEditor(user.getId());
+        model.setEditDate(new Date());
+        model.setIsdeleted(Constants.ONE);
+        categoryMapper.updateById(model);
     }
 
     @Override
@@ -49,11 +107,43 @@
         if (CollectionUtils.isEmpty(ids)) {
             return;
         }
-        categoryMapper.deleteBatchIds(ids);
+        for(Integer id :ids){
+            deleteById(id);
+        }
     }
 
     @Override
     public void updateById(Category category) {
+        if( category.getId() == null){
+            throw  new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        category.setType(null);//绫诲瀷涓嶆敮鎸佷慨鏀�
+        Category model = categoryMapper.selectById(category.getId());
+        if(model ==null || Constants.equalsInteger(model.getIsdeleted(),Constants.ONE)) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+      /*  //鏌ヨ鍚嶇О涓嶈兘閲嶅
+        if(categoryMapper.selectCount(new QueryWrapper<Category>().lambda()
+                .eq(Category::getName,category.getName())
+                .eq(Category::getType,model.getType())
+                .ne(Category::getId,category.getId())
+                .eq(Category::getIsdeleted,Constants.ZERO)) >0){
+            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "瀵逛笉璧凤紝鍚嶇О涓嶈兘閲嶅~");
+        }*/
+        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+        category.setIdPath(category.getId()+"/");//鍚嶇О璺緞
+        category.setNamePath(category.getName());//鍚嶇О璺緞
+        if(category.getParentId() !=null ){
+            //濡傛灉鐖剁骇鍙戠敓鏀瑰彉
+            Category parent = findById(category.getParentId());
+            if(parent == null || Constants.equalsInteger(parent.getIsdeleted(),Constants.ONE)){
+                throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "瀵逛笉璧凤紝鐖剁骇淇℃伅涓嶅瓨鍦▇");
+            }
+            category.setIdPath(parent.getIdPath()+category.getId()+"/");
+            category.setNamePath(parent.getNamePath()+"/"+category.getName());
+        }
+        category.setEditDate(new Date());
+        category.setEditor(user.getId());
         categoryMapper.updateById(category);
     }
 
@@ -80,17 +170,47 @@
 
     @Override
     public List<Category> findList(Category category) {
-        QueryWrapper<Category> wrapper = new QueryWrapper<>(category);
-        return categoryMapper.selectList(wrapper);
+        MPJLambdaWrapper<Category> queryWrapper = new MPJLambdaWrapper<>();
+        queryWrapper.selectAll(Category.class);
+        queryWrapper.selectAs(SystemUser::getUsername,Category::getEditorName);
+        queryWrapper.select("t1.name",Category::getParentName);
+        queryWrapper.select("t1.id_path",Category::getIdParentPath);
+        queryWrapper.leftJoin(Category.class,Category::getId,Category::getParentId);
+        queryWrapper.leftJoin(SystemUser.class,SystemUser::getId,Category::getEditor);
+        queryWrapper.eq(category.getId() != null, Category::getId, category.getId())
+                .eq(category.getCreator() != null, Category::getCreator, category.getCreator())
+                .ge(category.getCreateDate() != null, Category::getCreateDate, Utils.Date.getStart(category.getCreateDate()))
+                .le(category.getCreateDate() != null, Category::getCreateDate, Utils.Date.getEnd(category.getCreateDate()))
+                .eq(category.getEditor() != null, Category::getEditor, category.getEditor())
+                .ge(category.getEditDate() != null, Category::getEditDate, Utils.Date.getStart(category.getEditDate()))
+                .le(category.getEditDate() != null, Category::getEditDate, Utils.Date.getEnd(category.getEditDate()))
+                .eq(category.getIsdeleted() != null, Category::getIsdeleted, category.getIsdeleted())
+                .like(category.getName() != null, Category::getName, category.getName())
+                .eq(category.getRemark() != null, Category::getRemark, category.getRemark())
+                .eq(category.getStatus() != null, Category::getStatus, category.getStatus())
+                .eq(category.getSortnum() != null, Category::getSortnum, category.getSortnum())
+                .eq(category.getImgurl() != null, Category::getImgurl, category.getImgurl())
+                .eq(category.getType() != null, Category::getType, category.getType())
+                .eq(category.getParentId() != null, Category::getParentId, category.getParentId())
+                .eq(category.getNamePath() != null, Category::getNamePath, category.getNamePath())
+                .eq(category.getIdPath() != null, Category::getIdPath, category.getIdPath())
+                .orderByAsc( Category::getSortnum);
+        return categoryMapper.selectJoinList(Category.class,queryWrapper);
     }
   
     @Override
     public PageData<Category> findPage(PageWrap<Category> pageWrap) {
         IPage<Category> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
-        QueryWrapper<Category> queryWrapper = new QueryWrapper<>();
         Utils.MP.blankToNull(pageWrap.getModel());
-        queryWrapper.lambda()
-                .eq(pageWrap.getModel().getId() != null, Category::getId, pageWrap.getModel().getId())
+        pageWrap.getModel().setIsdeleted(Constants.ZERO);
+        MPJLambdaWrapper<Category> queryWrapper = new MPJLambdaWrapper<>();
+        queryWrapper.selectAll(Category.class);
+        queryWrapper.selectAs(SystemUser::getUsername,Category::getEditorName);
+        queryWrapper.select("t1.name",Category::getParentName);
+        queryWrapper.select("t1.id_path",Category::getIdParentPath);
+        queryWrapper.leftJoin(Category.class,Category::getId,Category::getParentId);
+        queryWrapper.leftJoin(SystemUser.class,SystemUser::getId,Category::getEditor);
+        queryWrapper.eq(pageWrap.getModel().getId() != null, Category::getId, pageWrap.getModel().getId())
                 .eq(pageWrap.getModel().getCreator() != null, Category::getCreator, pageWrap.getModel().getCreator())
                 .ge(pageWrap.getModel().getCreateDate() != null, Category::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()))
                 .le(pageWrap.getModel().getCreateDate() != null, Category::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()))
@@ -98,24 +218,18 @@
                 .ge(pageWrap.getModel().getEditDate() != null, Category::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()))
                 .le(pageWrap.getModel().getEditDate() != null, Category::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()))
                 .eq(pageWrap.getModel().getIsdeleted() != null, Category::getIsdeleted, pageWrap.getModel().getIsdeleted())
-                .eq(pageWrap.getModel().getName() != null, Category::getName, pageWrap.getModel().getName())
+                .like(pageWrap.getModel().getName() != null, Category::getName, pageWrap.getModel().getName())
                 .eq(pageWrap.getModel().getRemark() != null, Category::getRemark, pageWrap.getModel().getRemark())
                 .eq(pageWrap.getModel().getStatus() != null, Category::getStatus, pageWrap.getModel().getStatus())
                 .eq(pageWrap.getModel().getSortnum() != null, Category::getSortnum, pageWrap.getModel().getSortnum())
                 .eq(pageWrap.getModel().getImgurl() != null, Category::getImgurl, pageWrap.getModel().getImgurl())
                 .eq(pageWrap.getModel().getType() != null, Category::getType, pageWrap.getModel().getType())
                 .eq(pageWrap.getModel().getParentId() != null, Category::getParentId, pageWrap.getModel().getParentId())
+                .isNull(pageWrap.getModel().getIsRoot() != null && pageWrap.getModel().getIsRoot().equals(Constants.ONE), Category::getParentId)
                 .eq(pageWrap.getModel().getNamePath() != null, Category::getNamePath, pageWrap.getModel().getNamePath())
                 .eq(pageWrap.getModel().getIdPath() != null, Category::getIdPath, pageWrap.getModel().getIdPath())
-        ;
-        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
-            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
-                queryWrapper.orderByDesc(sortData.getProperty());
-            } else {
-                queryWrapper.orderByAsc(sortData.getProperty());
-            }
-        }
-        return PageData.from(categoryMapper.selectPage(page, queryWrapper));
+                .orderByAsc( Category::getSortnum);
+        return PageData.from(categoryMapper.selectJoinPage(page,Category.class, queryWrapper));
     }
 
     @Override
@@ -123,4 +237,23 @@
         QueryWrapper<Category> wrapper = new QueryWrapper<>(category);
         return categoryMapper.selectCount(wrapper);
     }
+
+    @Override
+    public List<Category> treeList(Category param ) {
+        MPJLambdaWrapper<Category> queryWrapper = new MPJLambdaWrapper<>();
+        queryWrapper.selectAll(Category.class);
+        queryWrapper.selectAs(SystemUser::getUsername,Category::getEditorName);
+        queryWrapper.select("t1.name",Category::getParentName);
+        queryWrapper.select("t1.id_path",Category::getIdParentPath);
+        queryWrapper.leftJoin(Category.class,Category::getId,Category::getParentId);
+        queryWrapper.leftJoin(SystemUser.class,SystemUser::getId,Category::getEditor);
+        queryWrapper.eq(Category::getIsdeleted, Constants.ZERO);
+        queryWrapper.eq(Category::getType, param.getType());
+        queryWrapper.orderByAsc( Category::getSortnum);
+        List<Category> companyList = categoryMapper.selectJoinList(Category.class,queryWrapper);
+        CategoryTree treeBuild = new CategoryTree(companyList);
+        companyList = treeBuild.buildTree();
+        return companyList;
+    }
+
 }
diff --git a/server/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java b/server/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java
index 2403aa7..fe36d4b 100644
--- a/server/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java
+++ b/server/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java
@@ -148,7 +148,7 @@
     public List<Company> companyTree( ) {
         MPJLambdaWrapper<Company> queryWrapper = new MPJLambdaWrapper<>();
         queryWrapper.selectAll(Company.class);
-        queryWrapper.selectAs(SystemUser::getRealname,Company::getEditorName);
+        queryWrapper.selectAs(SystemUser::getUsername,Company::getEditorName);
         queryWrapper.select("t1.name",Company::getParentName);
         queryWrapper.select("t1.name_path",Company::getParentCompanyPath);
         queryWrapper.leftJoin(Company.class,Company::getId,Company::getParentId);

--
Gitblit v1.9.3