From 3ac279c9df7181c9f21d35a689a321b990b87b22 Mon Sep 17 00:00:00 2001
From: doum <doum>
Date: 星期一, 08 六月 2026 17:42:33 +0800
Subject: [PATCH] aaa

---
 company_admin/src/views/business/category.vue |  309 ++++++++++++++++++++++++---------------------------
 1 files changed, 146 insertions(+), 163 deletions(-)

diff --git a/company_admin/src/views/business/category.vue b/company_admin/src/views/business/category.vue
index a4314ff..0971b55 100644
--- a/company_admin/src/views/business/category.vue
+++ b/company_admin/src/views/business/category.vue
@@ -1,170 +1,153 @@
 <template>
-    <TableLayout :permissions="['business:category:query']">
-      <!-- 鎼滅储琛ㄥ崟 -->
-      <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
-        <el-form-item label="绫诲埆鍚嶇О" prop="name">
-          <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ョ被鍒悕绉�" @keypress.enter.native="search"></el-input>
-        </el-form-item>
-        <el-form-item label="绫诲瀷" prop="type">
-          <el-select v-model="searchForm.type" clearable placeholder="璇烽�夋嫨">
-            <el-option
-              v-for="item in typeList"
-              :key="item.id"
-              :label="item.name"
-              :value="item.id">
-            </el-option>
-          </el-select>
-        </el-form-item>
-        <section>
-          <el-button type="primary" @click="search">鎼滅储</el-button>
-          <!-- <el-button type="primary" :loading="isWorking.export" v-permissions="['business:category:exportExcel']" @click="exportExcel">瀵煎嚭</el-button> -->
-          <el-button @click="reset">閲嶇疆</el-button>
-        </section>
-      </el-form>
-      <!-- 琛ㄦ牸鍜屽垎椤� -->
-      <template v-slot:table-wrap>
-        <ul class="toolbar" v-permissions="['business:category:create']">
-          <li><el-button type="primary" @click="$refs.operaCategoryWindow.open('鏂板缓绫诲埆')" icon="el-icon-plus" v-permissions="['business:category:create']">鏂板缓</el-button></li>
-        </ul>
-        <el-table
-          v-loading="isWorking.search"
-          :data="tableData.list"
-          stripe
-          border
-          :header-cell-style="rowStyle"
-          :cell-style="rowStyle"
-        >
-          <el-table-column prop="imgurl" label="鍥炬爣" min-width="100px">
-            <template slot-scope="{row}">
-                <el-image
-                v-if="row.imgurl"
-                style="width: 70px; height: 70px"
-                :src="row.prefixUrl + row.imgurl"
-                :preview-src-list="[row.prefixUrl + row.imgurl]"
-                fit="cover"></el-image>
+  <TableLayout :permissions="['business:category:query']">
+    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+      <el-form-item label="绫诲埆鍚嶇О" prop="name">
+        <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ョ被鍒悕绉�" @keypress.enter.native="loadTree"></el-input>
+      </el-form-item>
+      <el-form-item label="绫诲瀷" prop="type">
+        <el-select v-model="searchForm.type" clearable placeholder="璇烽�夋嫨">
+          <el-option v-for="item in typeList" :key="item.id" :label="item.name" :value="item.id"></el-option>
+        </el-select>
+      </el-form-item>
+      <section>
+        <el-button type="primary" @click="loadTree">鎼滅储</el-button>
+        <el-button @click="resetSearch">閲嶇疆</el-button>
+      </section>
+    </el-form>
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:category:create']">
+        <li><el-button type="primary" @click="$refs.operaCategoryWindow.open('鏂板缓绫诲埆')" icon="el-icon-plus">鏂板缓涓�绾х被鍒�</el-button></li>
+      </ul>
+      <el-table
+        v-loading="loading"
+        :data="tableData"
+        :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
+        row-key="id"
+        stripe
+        border
+        default-expand-all
+        :header-cell-style="rowStyle"
+        :cell-style="rowStyle"
+      >
+        <el-table-column prop="imgurl" label="鍥炬爣" min-width="90px">
+          <template slot-scope="{row}">
+            <el-image v-if="row.imgurl" style="width: 50px; height: 50px" :src="categoryImgUrl(row)" fit="cover"></el-image>
+          </template>
+        </el-table-column>
+        <el-table-column prop="name" label="绫诲埆鍚嶇О" min-width="140px">
+          <template slot-scope="{row}">
+            <span v-if="row.parentId">鈹� {{ row.name }}</span>
+            <span v-else>{{ row.name }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="绾у埆" min-width="80px">
+          <template slot-scope="{row}">{{ row.parentId ? '浜岀骇绫诲埆' : '涓�绾х被鍒�' }}</template>
+        </el-table-column>
+        <el-table-column prop="sortnum" label="鎺掑簭鐮�" min-width="80px"></el-table-column>
+        <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="140px"></el-table-column>
+        <el-table-column prop="status" label="鐘舵��" min-width="80px">
+          <template slot-scope="{row}">
+            <el-switch v-model="row.status" @change="changeStatus(row)" :active-value="0" :inactive-value="1" />
+          </template>
+        </el-table-column>
+        <el-table-column label="鎿嶄綔" min-width="220px" fixed="right">
+          <template slot-scope="{row}">
+            <template v-if="!row.parentId">
+              <el-button type="text" @click="edit(row.id)" v-permissions="['business:category:update']">缂栬緫</el-button>
+              <el-button type="text" @click="$refs.operaSubCategoryWindow.open('鏂板缓瀛愮被鍒�', row)" v-permissions="['business:category:create']">鏂板瀛愮被鍒�</el-button>
+              <el-button type="text" class="btn-delete" icon="el-icon-delete" @click="deleteParent(row)" v-permissions="['business:category:delete']">鍒犻櫎</el-button>
             </template>
-          </el-table-column>
-          <el-table-column prop="name" label="绫诲埆鍚嶇О" min-width="100px"></el-table-column>
-          <el-table-column prop="categoryName" label="绫诲瀷" min-width="100px">
-            <template slot-scope="{row}">
-              <span v-if="row.type == 0">鑷缓</span>
-              <span v-else>鎷夊彇</span>
+            <template v-else>
+              <el-button type="text" @click="$refs.operaSubCategoryWindow.open('缂栬緫瀛愮被鍒�', { id: row.parentId }, row)" v-permissions="['business:category:update']">缂栬緫</el-button>
+              <el-button type="text" class="btn-delete" icon="el-icon-delete" @click="deleteSub(row)" v-permissions="['business:category:delete']">鍒犻櫎</el-button>
             </template>
-          </el-table-column>
-          <el-table-column prop="sortnum" label="鎺掑簭鐮�(鍗囧簭)" min-width="100px"></el-table-column>
-          <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
-          <el-table-column prop="status" label="鐘舵��" min-width="100px">
-            <template slot-scope="{row}">
-                <el-switch
-                    v-model="row.status"
-                    @change="changeStatus(row)"
-                    active-color="#13ce66"
-                    inactive-color="#ff4949"
-                    :active-value="0"
-                    :inactive-value="1">
-                </el-switch>
-            </template>
-          </el-table-column>
-          <el-table-column
-            v-if="containPermissions(['business:category:update', 'business:category:delete'])"
-            label="鎿嶄綔"
-            min-width="120"
-            fixed="right"
-          >
-            <template slot-scope="{row}">
-              <el-button type="text" @click="edit(row.id)" icon="el-icon-edit" v-permissions="['business:category:update']">缂栬緫</el-button>
-              <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:category:delete']">鍒犻櫎</el-button>
-            </template>
-          </el-table-column>
-        </el-table>
-        <pagination
-          @size-change="handleSizeChange"
-          @current-change="handlePageChange"
-          :pagination="tableData.pagination"
-        >
-        </pagination>
-      </template>
-      <!-- 鏂板缓/淇敼 -->
-      <OperaCategoryWindow ref="operaCategoryWindow" @success="handlePageChange"/>
-    </TableLayout>
-  </template>
-  
-  <script>
-  import BaseTable from '@/components/base/BaseTable'
-  import TableLayout from '@/layouts/TableLayout'
-  import Pagination from '@/components/common/Pagination'
-  import OperaCategoryWindow from '@/components/business/OperaCategoryWindow'
-  import { queryById, updateDisableById } from '@/api/business/category.js'
-  export default {
-    name: 'Category',
-    extends: BaseTable,
-    components: { TableLayout, Pagination, OperaCategoryWindow },
-    data () {
-      return {
-        // 鎼滅储
-        searchForm: {
-          name: '',
-          type: ''
-        },
-        typeList: [
-          { name: '鑷缓', id: 0 },
-          { name: '鎷夊彇', id: 1 }
-        ]
-      }
+          </template>
+        </el-table-column>
+      </el-table>
+    </template>
+    <OperaCategoryWindow ref="operaCategoryWindow" @success="loadTree"/>
+    <OperaSubCategoryWindow ref="operaSubCategoryWindow" @success="loadTree"/>
+  </TableLayout>
+</template>
+
+<script>
+import TableLayout from '@/layouts/TableLayout'
+import OperaCategoryWindow from '@/components/business/OperaCategoryWindow'
+import OperaSubCategoryWindow from '@/components/business/OperaSubCategoryWindow'
+import { fetchTree, queryById, updateDisableById, deleteById, deleteSub as deleteSubApi } from '@/api/business/category.js'
+
+export default {
+  name: 'Category',
+  components: { TableLayout, OperaCategoryWindow, OperaSubCategoryWindow },
+  data () {
+    return {
+      loading: false,
+      tableData: [],
+      searchForm: { name: '', type: '' },
+      typeList: [{ name: '鑷畾涔�', id: 0 }, { name: '绯荤粺', id: 1 }]
+    }
+  },
+  created () {
+    this.loadTree()
+  },
+  methods: {
+    rowStyle () { return 'text-align:center' },
+    categoryImgUrl (row) {
+      if (!row.imgurl) return ''
+      if (row.imgurl.indexOf('http') === 0) return row.imgurl
+      return (row.prefixUrl || '') + row.imgurl
     },
-    created () {
-      this.config({
-        module: '绫诲埆',
-        api: '/business/category',
-        'field.id': 'id',
-        'field.main': 'name'
-      })
-      this.search()
-    },
-    methods: {
-      rowStyle() {
-      return "text-align:center";
-    },
-      changeStatus(item) {
-        updateDisableById({
-          id: item.id,
-          status: item.status
-        }).then(res => {
-          this.$tip.apiSuccess('鏇存柊鎴愬姛')
-        }).finally(() => {
-          // this.search()
+    loadTree () {
+      this.loading = true
+      fetchTree(this.searchForm).then(res => {
+        this.tableData = (res || []).map(p => {
+          const prefixUrl = p.prefixUrl || ''
+          const children = (p.children || []).map(c => ({
+            ...c,
+            parentId: c.parentId != null ? c.parentId : p.id,
+            prefixUrl: c.prefixUrl || prefixUrl
+          }))
+          return { ...p, children }
         })
-      },
-      edit(id) {
-        queryById(id)
-          .then(res => {
-            let obj = {
-              id,
-              name: res.name,
-              attrFirst: res.attrFirst,
-              attrFirstList: res.attrFirstList,
-              attrSecond: res.attrSecond,
-              attrSecondList: res.attrSecondList,
-              sortnum: res.sortnum,
-              paramList: res.paramList,
-              imgurl: res.imgurl,
-              budgetList: res.budgetList,
-              type: res.type,
-              platCateId: res.platCateId,
-              tableData: res.paramList.map(item => {
-                return {
-                  name: item.name,
-                  isselect: item.isselect,
-                  isshow: item.isshow
-                }
-              }),
-              fileList: res.imgurl ? [{ url: res.prefixUrl + res.imgurl }] : []
-            }
-            console.log(obj)
-            this.$refs.operaCategoryWindow.open('缂栬緫绫诲埆', obj)
-          })
-      }
+      }).finally(() => { this.loading = false })
+    },
+    resetSearch () {
+      this.searchForm = { name: '', type: '' }
+      this.loadTree()
+    },
+    changeStatus (item) {
+      updateDisableById({ id: item.id, status: item.status }).then(() => {
+        this.$message.success('鏇存柊鎴愬姛')
+      })
+    },
+    edit (id) {
+      queryById(id).then(res => {
+        const obj = {
+          id, name: res.name, sortnum: res.sortnum, paramList: res.paramList,
+          imgurl: res.imgurl, budgetList: res.budgetList.length > 0 ? res.budgetList : [{ maxamount: '', minamount: '' }],
+          type: res.type, platCateId: res.platCateId,
+          tableData: res.paramList.map(item => ({ id: item.id, name: item.name, isselect: item.isselect, isshow: item.isshow })),
+          fileList: res.imgurl ? [{ url: res.prefixUrl + res.imgurl }] : []
+        }
+        this.$refs.operaCategoryWindow.open('缂栬緫绫诲埆', obj)
+      })
+    },
+    deleteParent (row) {
+      this.$confirm(`纭鍒犻櫎銆�${row.name}銆�?`, '鎻愮ず').then(() => {
+        deleteById(row.id).then(() => {
+          this.$message.success('鍒犻櫎鎴愬姛')
+          this.loadTree()
+        })
+      })
+    },
+    deleteSub (row) {
+      this.$confirm(`纭鍒犻櫎瀛愮被鍒��${row.name}銆�?`, '鎻愮ず').then(() => {
+        deleteSubApi(row.id).then(() => {
+          this.$message.success('鍒犻櫎鎴愬姛')
+          this.loadTree()
+        })
+      })
     }
   }
-  </script>
-  
\ No newline at end of file
+}
+</script>

--
Gitblit v1.9.3