Explorar o código

Merge branch 'dev' of 21.tcp.vip.cpolar.cn:hzy-starrysky/zkhx/gubersail/gubersail-platform-ui into dev

zdd hai 1 mes
pai
achega
2152d07b0e

+ 153 - 0
src/api/announcement/category.js

@@ -0,0 +1,153 @@
+/**
+ * 公告分类管理API
+ * @description 提供公告分类的增删改查功能
+ * @author AI Assistant
+ * @version 1.0.0
+ */
+import request from '@/router/axios';
+
+/**
+ * 分类数据类型定义
+ * @typedef {Object} CategoryItem
+ * @property {number} id - 分类ID
+ * @property {string} name - 分类名称
+ * @property {number} sortOrder - 排序
+ * @property {number} orgId - 组织ID
+ * @property {string} orgCode - 组织编码
+ * @property {string} orgName - 组织名称
+ * @property {number} isSystem - 是否系统分类 (0-否, 1-是)
+ * @property {string} remark - 备注
+ * @property {number} createUser - 创建用户ID
+ * @property {number} createDept - 创建部门ID
+ * @property {string|null} createTime - 创建时间
+ * @property {number|null} updateUser - 更新用户ID
+ * @property {string|null} updateTime - 更新时间
+ * @property {number} status - 状态 (0-禁用, 1-启用)
+ * @property {number} isDeleted - 是否删除 (0-否, 1-是)
+ */
+
+/**
+ * 新增分类请求参数类型
+ * @typedef {Object} AddCategoryParams
+ * @property {number} createDept - 创建部门ID
+ * @property {number} createUser - 创建用户ID
+ * @property {string} name - 分类名称
+ * @property {string} orgCode - 组织编码
+ * @property {number} orgId - 组织ID
+ * @property {string} orgName - 组织名称
+ * @property {string} [remark] - 备注
+ * @property {number} [sortOrder] - 排序
+ */
+
+/**
+ * 更新分类请求参数类型
+ * @typedef {AddCategoryParams & {id: number}} UpdateCategoryParams
+ */
+
+/**
+ * API响应类型
+ * @typedef {Object} ApiResponse
+ * @property {number} code - 响应码
+ * @property {boolean} success - 是否成功
+ * @property {*} data - 响应数据
+ * @property {string} msg - 响应消息
+ */
+
+/**
+ * 获取分类列表
+ * @returns {Promise<ApiResponse<Array<CategoryItem>>>} 分类列表响应
+ */
+export const getCategoryList = () => {
+  return request({
+    url: '/blade-factory/api/notice/category/list',
+    method: 'get'
+  })
+}
+
+/**
+ * 新增分类
+ * @param {AddCategoryParams} params - 分类信息
+ * @param {number} params.createDept - 创建部门ID
+ * @param {number} params.createUser - 创建用户ID
+ * @param {string} params.name - 分类名称
+ * @param {string} params.orgCode - 组织编码
+ * @param {number} params.orgId - 组织ID
+ * @param {string} params.orgName - 组织名称
+ * @param {string} [params.remark=''] - 备注
+ * @param {number} [params.sortOrder=0] - 排序
+ * @returns {Promise<ApiResponse<null>>} 操作结果
+ */
+export const addCategory = (params) => {
+  return request({
+    url: '/blade-factory/api/notice/category/add',
+    method: 'post',
+    data: {
+      sortOrder: 0,
+      ...params
+    }
+  })
+}
+
+/**
+ * 更新分类
+ * @param {UpdateCategoryParams} params - 分类信息(包含id)
+ * @param {number} params.id - 分类ID
+ * @param {string} params.name - 分类名称
+ * @param {string} [params.remark] - 备注
+ * @param {number} [params.sortOrder] - 排序
+ * @returns {Promise<ApiResponse<null>>} 操作结果
+ */
+export const updateCategory = (params) => {
+  return request({
+    url: '/blade-factory/api/notice/category/update',
+    method: 'post',
+    data: params
+  })
+}
+
+/**
+ * 删除分类
+ * @param {string|number} ids - 分类ID,多个用逗号分隔
+ * @returns {Promise<ApiResponse<null>>} 操作结果
+ */
+export const removeCategory = (ids) => {
+  return request({
+    url: '/blade-factory/api/notice/category/remove',
+    method: 'post',
+    params: {
+      ids: String(ids)
+    }
+  })
+}
+
+/**
+ * 获取分类详情
+ * @param {number} id - 分类ID
+ * @returns {Promise<ApiResponse<CategoryItem>>} 分类详情
+ */
+export const getCategoryDetail = (id) => {
+  return request({
+    url: '/blade-factory/api/notice/category/detail',
+    method: 'get',
+    params: {
+      id
+    }
+  })
+}
+
+/**
+ * 更新分类状态
+ * @param {number} id - 分类ID
+ * @param {number} status - 状态 (0-禁用, 1-启用)
+ * @returns {Promise<ApiResponse<null>>} 操作结果
+ */
+export const updateCategoryStatus = (id, status) => {
+  return request({
+    url: '/blade-factory/api/notice/category/status',
+    method: 'post',
+    params: {
+      id,
+      status
+    }
+  })
+}

+ 2 - 2
src/api/announcement/index.js

@@ -64,10 +64,10 @@ export const getBrandList = () => {
   })
 }
 
-// 获取分类列表
+// 获取分类列表 - 更新为使用新的分类接口
 export const getCategoryList = () => {
   return request({
-    url: '/api/blade-system/category/list',
+    url: '/blade-factory/api/notice/category/list',
     method: 'get'
   })
 }

+ 16 - 1
src/router/views/index.js

@@ -30,13 +30,28 @@ export default [{
     path: '/announcement',
     component: Layout,
     redirect: '/announcement/index',
+    meta: {
+        title: '公告管理',
+        icon: 'el-icon-bell'
+    },
     children: [{
         path: 'index',
         name: '公告管理',
         meta: {
             keepAlive: true,
+            title: '公告管理',
+            icon: 'el-icon-document'
         },
-        component: () => import( /* webpackChunkName: "views" */ '@/views/announcement/index')
+        component: () => import( /* webpackChunkName: "announcement" */ '@/views/announcement/index')
+    }, {
+        path: 'category',
+        name: '分类管理',
+        meta: {
+            keepAlive: true,
+            title: '分类管理',
+            icon: 'el-icon-folder'
+        },
+        component: () => import( /* webpackChunkName: "announcement" */ '@/views/announcement/category')
     }]
 }, {
     path: '/forecast',

+ 570 - 0
src/views/announcement/category.vue

@@ -0,0 +1,570 @@
+<template>
+  <div>
+    <basic-container>
+      <avue-crud
+        :option="option"
+        :table-loading="loading"
+        :data="data"
+        ref="crud"
+        v-model="form"
+        :permission="permissionList"
+        :before-open="beforeOpen"
+        :before-close="beforeClose"
+        @row-del="rowDel"
+        @row-update="rowUpdate"
+        @row-save="rowSave"
+        @search-change="searchChange"
+        @search-reset="searchReset"
+        @selection-change="selectionChange"
+        @refresh-change="refreshChange"
+        @on-load="onLoad"
+      >
+        <template slot="menuLeft">
+          <el-button
+            type="danger"
+            size="small"
+            icon="el-icon-delete"
+            v-if="permission.category_delete"
+            plain
+            @click="handleDelete"
+          >
+            删除
+          </el-button>
+        </template>
+
+        <template slot-scope="{ row }" slot="status">
+          <el-switch
+            v-model="row.status"
+            :active-value="1"
+            :inactive-value="0"
+            active-color="#13ce66"
+            inactive-color="#ff4949"
+            @change="handleStatusChange(row)"
+            :disabled="!permission.category_edit"
+          >
+          </el-switch>
+        </template>
+
+        <template slot-scope="{ row }" slot="isSystem">
+          <el-tag :type="row.isSystem ? 'warning' : 'success'">
+            {{ row.isSystem ? '系统分类' : '自定义分类' }}
+          </el-tag>
+        </template>
+      </avue-crud>
+    </basic-container>
+  </div>
+</template>
+
+<script>
+/**
+ * 公告分类管理页面
+ * @description 提供公告分类的完整CRUD功能,包括状态管理
+ * @author AI Assistant
+ * @version 1.0.0
+ */
+import {
+  getCategoryList,
+  addCategory,
+  updateCategory,
+  removeCategory,
+  getCategoryDetail,
+  updateCategoryStatus
+} from "@/api/announcement/category";
+import { mapGetters } from "vuex";
+
+/**
+ * 分类数据类型定义
+ * @typedef {Object} CategoryItem
+ * @property {number} id - 分类ID
+ * @property {string} name - 分类名称
+ * @property {number} sortOrder - 排序
+ * @property {number} orgId - 组织ID
+ * @property {string} orgCode - 组织编码
+ * @property {string} orgName - 组织名称
+ * @property {number} isSystem - 是否系统分类 (0-否, 1-是)
+ * @property {string} remark - 备注
+ * @property {number} createUser - 创建用户ID
+ * @property {number} createDept - 创建部门ID
+ * @property {string|null} createTime - 创建时间
+ * @property {number|null} updateUser - 更新用户ID
+ * @property {string|null} updateTime - 更新时间
+ * @property {number} status - 状态 (0-禁用, 1-启用)
+ * @property {number} isDeleted - 是否删除 (0-否, 1-是)
+ */
+
+/**
+ * 分类表单数据类型
+ * @typedef {Object} CategoryForm
+ * @property {number} [id] - 分类ID(编辑时存在)
+ * @property {string} name - 分类名称
+ * @property {number} sortOrder - 排序
+ * @property {number} orgId - 组织ID
+ * @property {string} orgCode - 组织编码
+ * @property {string} orgName - 组织名称
+ * @property {string} remark - 备注
+ * @property {number} status - 状态
+ */
+
+/**
+ * 查询参数类型
+ * @typedef {Object} QueryParams
+ * @property {string} [name] - 分类名称
+ * @property {string} [orgName] - 组织名称
+ * @property {number} [status] - 状态
+ */
+
+export default {
+  name: "CategoryManagement",
+
+  data() {
+    return {
+      /** @type {CategoryForm} 表单数据 */
+      form: {},
+
+      /** @type {Array<CategoryItem>} 选中的行数据 */
+      selectionList: [],
+
+      /** @type {QueryParams} 查询条件 */
+      query: {},
+
+      /** @type {boolean} 表格加载状态 */
+      loading: true,
+
+      /** @type {Array<CategoryItem>} 表格数据 */
+      data: [],
+
+      /** @type {Object} 表格配置选项 */
+      option: {
+        height: 'auto',
+        calcHeight: 30,
+        tip: false,
+        searchShow: true,
+        searchMenuSpan: 6,
+        border: true,
+        index: true,
+        selection: true,
+        viewBtn: true,
+        dialogClickModal: false,
+        column: [
+          {
+            label: "分类名称",
+            prop: "name",
+            search: true,
+            rules: [
+              {
+                required: true,
+                message: "请输入分类名称",
+                trigger: "blur"
+              },
+              {
+                min: 2,
+                max: 50,
+                message: "分类名称长度在2到50个字符",
+                trigger: "blur"
+              }
+            ]
+          },
+          {
+            label: "组织名称",
+            prop: "orgName",
+            search: true,
+            rules: [
+              {
+                required: true,
+                message: "请输入组织名称",
+                trigger: "blur"
+              }
+            ]
+          },
+          {
+            label: "组织编码",
+            prop: "orgCode",
+            rules: [
+              {
+                required: true,
+                message: "请输入组织编码",
+                trigger: "blur"
+              },
+              {
+                pattern: /^[A-Z0-9_]+$/,
+                message: "组织编码只能包含大写字母、数字和下划线",
+                trigger: "blur"
+              }
+            ]
+          },
+          {
+            label: "组织ID",
+            prop: "orgId",
+            type: "number",
+            rules: [
+              {
+                required: true,
+                message: "请输入组织ID",
+                trigger: "blur"
+              }
+            ]
+          },
+          {
+            label: "排序",
+            prop: "sortOrder",
+            type: "number",
+            value: 0,
+            rules: [
+              {
+                type: "number",
+                min: 0,
+                max: 9999,
+                message: "排序值范围为0-9999",
+                trigger: "blur"
+              }
+            ]
+          },
+          {
+            label: "状态",
+            prop: "status",
+            type: "select",
+            slot: true,
+            dicData: [
+              {
+                label: "启用",
+                value: 1
+              },
+              {
+                label: "禁用",
+                value: 0
+              }
+            ],
+            search: true,
+            value: 1
+          },
+          {
+            label: "分类类型",
+            prop: "isSystem",
+            slot: true,
+            addDisplay: false,
+            editDisplay: false
+          },
+          {
+            label: "备注",
+            prop: "remark",
+            type: "textarea",
+            span: 24,
+            hide: true,
+            rules: [
+              {
+                max: 500,
+                message: "备注不能超过500个字符",
+                trigger: "blur"
+              }
+            ]
+          },
+          {
+            label: "创建时间",
+            prop: "createTime",
+            type: "datetime",
+            format: "yyyy-MM-dd HH:mm:ss",
+            valueFormat: "yyyy-MM-dd HH:mm:ss",
+            addDisplay: false,
+            editDisplay: false,
+            width: 180
+          }
+        ]
+      }
+    };
+  },
+
+  computed: {
+    ...mapGetters(["permission", "userInfo"]),
+
+    /**
+     * 权限列表配置
+     * @returns {Object} 权限配置对象
+     */
+    permissionList() {
+      return {
+        addBtn: this.vaildData(this.permission.category_add, false),
+        viewBtn: this.vaildData(this.permission.category_view, false),
+        delBtn: this.vaildData(this.permission.category_delete, false),
+        editBtn: this.vaildData(this.permission.category_edit, false)
+      };
+    },
+
+    /**
+     * 表格行主键
+     * @returns {string} 主键字段名
+     */
+    ids() {
+      const ids = [];
+      this.selectionList.forEach(ele => {
+        ids.push(ele.id);
+      });
+      return ids.join(",");
+    }
+  },
+
+  methods: {
+    /**
+     * 删除选中的分类
+     * @description 批量删除选中的分类
+     */
+    async handleDelete() {
+      if (this.selectionList.length === 0) {
+        this.$message.warning("请选择至少一条数据");
+        return;
+      }
+
+      // 检查是否包含系统分类
+      const hasSystemCategory = this.selectionList.some(item => item.isSystem === 1);
+      if (hasSystemCategory) {
+        this.$message.error("系统分类不能删除");
+        return;
+      }
+
+      try {
+        await this.$confirm("确定将选择数据删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        });
+        
+        await removeCategory(this.ids);
+        
+        this.onLoad();
+        this.$message({
+          type: "success",
+          message: "操作成功!"
+        });
+        this.$refs.crud.toggleSelection();
+      } catch (error) {
+        this.$message({
+          type: "info",
+          message: "已取消删除"
+        });
+      }
+    },
+
+    /**
+     * 状态变更处理
+     * @param {CategoryItem} row - 行数据
+     */
+    async handleStatusChange(row) {
+      const statusText = row.status === 1 ? '启用' : '禁用';
+      
+      try {
+        await this.$confirm(`确定${statusText}该分类吗?`, {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        });
+        
+        await updateCategoryStatus(row.id, row.status);
+        
+        this.$message({
+          type: "success",
+          message: `${statusText}成功!`
+        });
+      } catch (error) {
+        // 恢复原状态
+        row.status = row.status === 1 ? 0 : 1;
+        this.$message({
+          type: "info",
+          message: "已取消操作"
+        });
+      }
+    },
+
+    /**
+     * 表单打开前的回调
+     * @param {Function} done - 完成回调
+     * @param {string} type - 操作类型 (add/edit/view)
+     */
+    async beforeOpen(done, type) {
+      if (["edit", "view"].includes(type)) {
+        try {
+          const res = await getCategoryDetail(this.form.id);
+          this.form = res.data.data;
+        } catch (error) {
+          console.error('获取分类详情失败:', error);
+        }
+      } else if (type === "add") {
+        // 新增时设置默认值
+        this.form = {
+          createDept: this.userInfo.deptId || 1,
+          createUser: this.userInfo.userId || 1,
+          orgId: 1,
+          orgCode: "ORG_0001",
+          orgName: "库比森",
+          sortOrder: 0,
+          status: 1,
+          remark: ""
+        };
+      }
+      done();
+    },
+
+    /**
+     * 表单关闭前的回调
+     * @param {Function} done - 完成回调
+     */
+    beforeClose(done) {
+      this.form = {};
+      done();
+    },
+
+    /**
+     * 行删除回调
+     * @param {CategoryItem} row - 行数据
+     * @param {number} index - 行索引
+     */
+    async rowDel(row, index) {
+      if (row.isSystem === 1) {
+        this.$message.error("系统分类不能删除");
+        return;
+      }
+
+      try {
+        await this.$confirm("确定将选择数据删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        });
+        
+        await removeCategory(row.id);
+        
+        this.onLoad();
+        this.$message({
+          type: "success",
+          message: "操作成功!"
+        });
+      } catch (error) {
+        console.error('删除分类失败:', error);
+      }
+    },
+
+    /**
+     * 行更新回调
+     * @param {CategoryForm} row - 行数据
+     * @param {number} index - 行索引
+     * @param {Function} done - 完成回调
+     * @param {Function} loading - 加载状态回调
+     */
+    async rowUpdate(row, index, done, loading) {
+      try {
+        await updateCategory(row);
+        
+        this.onLoad();
+        this.$message({
+          type: "success",
+          message: "操作成功!"
+        });
+        done();
+      } catch (error) {
+        console.error('更新分类失败:', error);
+        loading();
+      }
+    },
+
+    /**
+     * 行保存回调
+     * @param {CategoryForm} row - 行数据
+     * @param {Function} done - 完成回调
+     * @param {Function} loading - 加载状态回调
+     */
+    async rowSave(row, done, loading) {
+      try {
+        await addCategory(row);
+        
+        this.onLoad();
+        this.$message({
+          type: "success",
+          message: "操作成功!"
+        });
+        done();
+      } catch (error) {
+        console.error('新增分类失败:', error);
+        loading();
+      }
+    },
+
+    /**
+     * 搜索条件变化回调
+     * @param {QueryParams} params - 搜索参数
+     * @param {Function} done - 完成回调
+     */
+    searchChange(params, done) {
+      this.query = params;
+      this.onLoad(params);
+      done();
+    },
+
+    /**
+     * 搜索重置回调
+     */
+    searchReset() {
+      this.query = {};
+      this.onLoad();
+    },
+
+    /**
+     * 选择变化回调
+     * @param {Array<CategoryItem>} list - 选中的行数据列表
+     */
+    selectionChange(list) {
+      this.selectionList = list;
+    },
+
+    /**
+     * 清空选择
+     */
+    selectionClear() {
+      this.selectionList = [];
+      this.$refs.crud.toggleSelection();
+    },
+
+    /**
+     * 刷新回调
+     */
+    refreshChange() {
+      this.onLoad(this.query);
+    },
+
+    /**
+     * 加载数据
+     * @param {QueryParams} params - 查询参数
+     */
+    async onLoad(params = {}) {
+      this.loading = true;
+      
+      try {
+        const res = await getCategoryList(Object.assign(params, this.query));
+        const data = res.data.data;
+        this.data = Array.isArray(data) ? data : [];
+        this.selectionClear();
+      } catch (error) {
+        console.error('加载分类列表失败:', error);
+        this.data = [];
+      } finally {
+        this.loading = false;
+      }
+    }
+  },
+
+  /**
+   * 组件挂载后初始化数据
+   */
+  mounted() {
+    this.onLoad();
+  }
+};
+</script>
+
+<style scoped>
+/* 组件样式 */
+.el-tag {
+  margin-right: 8px;
+}
+
+.el-switch {
+  margin: 0;
+}
+</style>

+ 188 - 10
src/views/announcement/index.vue

@@ -43,24 +43,83 @@
 import { getList, remove, update, add, getAnnouncement, getDealerList, getBrandList, getCategoryList } from "@/api/announcement";
 import { mapGetters } from "vuex";
 
+/**
+ * @typedef {Object} AnnouncementItem
+ * @property {number} id - 公告ID
+ * @property {string} title - 公告标题
+ * @property {string} customerCode - 客户编号
+ * @property {string} publishTime - 发布时间
+ * @property {number} dealerId - 经销商ID
+ * @property {string} dealerName - 经销商名称
+ * @property {number} brandId - 品牌ID
+ * @property {string} brandName - 品牌名称
+ * @property {number} categoryId - 分类ID
+ * @property {string} categoryName - 分类名称
+ * @property {string} roleType - 角色类型
+ * @property {string} content - 公告内容
+ */
+
+/**
+ * @typedef {Object} OptionItem
+ * @property {number} id - 选项ID
+ * @property {string} dealerName - 经销商名称
+ * @property {string} brandName - 品牌名称
+ * @property {string} categoryName - 分类名称
+ * @property {number} value - 选项值
+ * @property {string} label - 选项标签
+ */
+
+/**
+ * @typedef {Object} PageInfo
+ * @property {number} pageSize - 每页大小
+ * @property {number} currentPage - 当前页码
+ * @property {number} total - 总记录数
+ */
+
+/**
+ * @typedef {Object} QueryParams
+ * @property {string} [title] - 公告标题
+ * @property {string} [customerCode] - 客户编号
+ * @property {Array<string>} [publishTime] - 发布时间范围
+ * @property {number} [dealerId] - 经销商ID
+ * @property {number} [brandId] - 品牌ID
+ * @property {number} [categoryId] - 分类ID
+ * @property {string} [roleType] - 角色类型
+ */
+
+/**
+ * 公告管理组件
+ * @component AnnouncementIndex
+ */
 export default {
     name: 'AnnouncementIndex',
     data() {
         return {
+            /** @type {AnnouncementItem} 表单数据 */
             form: {},
+            /** @type {QueryParams} 查询参数 */
             query: {},
+            /** @type {boolean} 加载状态 */
             loading: true,
+            /** @type {boolean} 详情对话框显示状态 */
             detailVisible: false,
+            /** @type {AnnouncementItem} 当前查看的详情数据 */
             currentDetail: {},
+            /** @type {PageInfo} 分页信息 */
             page: {
                 pageSize: 10,
                 currentPage: 1,
                 total: 0
             },
+            /** @type {Array<AnnouncementItem>} 选中的数据列表 */
             selectionList: [],
+            /** @type {Array<OptionItem>} 经销商选项列表 */
             dealerOptions: [],
+            /** @type {Array<OptionItem>} 品牌选项列表 */
             brandOptions: [],
-            categoryOptions: [], // 添加分类选项数组
+            /** @type {Array<OptionItem>} 分类选项列表 */
+            categoryOptions: [],
+            /** @type {Object} 表格配置选项 */
             option: {
                 height: 'auto',
                 calcHeight: 30,
@@ -207,11 +266,16 @@ export default {
                     },
                 ]
             },
+            /** @type {Array<AnnouncementItem>} 表格数据 */
             data: []
         };
     },
     computed: {
         ...mapGetters(["permission"]),
+        /**
+         * 权限列表
+         * @returns {Object} 权限配置对象
+         */
         permissionList() {
             return {
                 addBtn: this.vaildData(this.permission.announcement_add, false),
@@ -220,6 +284,10 @@ export default {
                 editBtn: this.vaildData(this.permission.announcement_edit, false)
             };
         },
+        /**
+         * 选中的ID字符串
+         * @returns {string} 逗号分隔的ID字符串
+         */
         ids() {
             let ids = [];
             this.selectionList.forEach(ele => {
@@ -234,22 +302,45 @@ export default {
         this.loadCategoryOptions(); // 添加分类加载
     },
     methods: {
-        // 加载分类选项
+        /**
+         * 加载分类选项
+         * @async
+         * @returns {Promise<void>}
+         */
         async loadCategoryOptions() {
             try {
                 const res = await getCategoryList();
-                this.categoryOptions = res.data.data || [];
+                // 根据新接口返回的数据结构进行转换
+                const categoryData = res.data.data || [];
+                
+                // 将接口返回的数据转换为页面所需的格式
+                this.categoryOptions = categoryData
+                    .filter(item => item.status === 1 && item.isDeleted === 0) // 只显示启用且未删除的分类
+                    .map(item => ({
+                        id: item.id,
+                        name: item.name,
+                        categoryName: item.name, // 兼容原有字段名
+                        value: item.id,
+                        label: item.name,
+                        orgId: item.orgId,
+                        orgName: item.orgName,
+                        isSystem: item.isSystem,
+                        sortOrder: item.sortOrder
+                    }))
+                    .sort((a, b) => a.sortOrder - b.sortOrder); // 按排序字段排序
+                
                 const categoryColumn = this.option.column.find(col => col.prop === 'categoryId');
                 if (categoryColumn) {
                     categoryColumn.dicData = this.categoryOptions;
                 }
             } catch (error) {
+                console.error('加载分类选项失败:', error);
                 // 如果接口不存在,使用模拟数据
                 this.categoryOptions = [
-                    { id: 1, categoryName: '系统公告', value: 1, label: '系统公告' },
-                    { id: 2, categoryName: '产品公告', value: 2, label: '产品公告' },
-                    { id: 3, categoryName: '活动公告', value: 3, label: '活动公告' },
-                    { id: 4, categoryName: '维护公告', value: 4, label: '维护公告' }
+                    { id: 1, name: '系统公告', categoryName: '系统公告', value: 1, label: '系统公告', isSystem: 1, sortOrder: 0 },
+                    { id: 2, name: '产品公告', categoryName: '产品公告', value: 2, label: '产品公告', isSystem: 0, sortOrder: 1 },
+                    { id: 3, name: '活动公告', categoryName: '活动公告', value: 3, label: '活动公告', isSystem: 0, sortOrder: 2 },
+                    { id: 4, name: '维护公告', categoryName: '维护公告', value: 4, label: '维护公告', isSystem: 0, sortOrder: 3 }
                 ];
                 const categoryColumn = this.option.column.find(col => col.prop === 'categoryId');
                 if (categoryColumn) {
@@ -257,12 +348,20 @@ export default {
                 }
             }
         },
-        // 查看详情
+        /**
+         * 查看详情
+         * @param {AnnouncementItem} row - 行数据
+         * @returns {void}
+         */
         viewDetail(row) {
             this.currentDetail = row;
             this.detailVisible = true;
         },
-        // 加载经销商选项
+        /**
+         * 加载经销商选项
+         * @async
+         * @returns {Promise<void>}
+         */
         async loadDealerOptions() {
             try {
                 const res = await getDealerList();
@@ -284,7 +383,11 @@ export default {
                 }
             }
         },
-        // 加载品牌选项
+        /**
+         * 加载品牌选项
+         * @async
+         * @returns {Promise<void>}
+         */
         async loadBrandOptions() {
             try {
                 const res = await getBrandList();
@@ -306,6 +409,14 @@ export default {
                 }
             }
         },
+        /**
+         * 保存行数据
+         * @async
+         * @param {AnnouncementItem} row - 行数据
+         * @param {Function} done - 完成回调
+         * @param {Function} loading - 加载回调
+         * @returns {Promise<void>}
+         */
         async rowSave(row, done, loading) {
             try {
                 await add(row);
@@ -320,6 +431,15 @@ export default {
                 loading();
             }
         },
+        /**
+         * 更新行数据
+         * @async
+         * @param {AnnouncementItem} row - 行数据
+         * @param {number} index - 行索引
+         * @param {Function} done - 完成回调
+         * @param {Function} loading - 加载回调
+         * @returns {Promise<void>}
+         */
         async rowUpdate(row, index, done, loading) {
             try {
                 await update(row);
@@ -334,6 +454,12 @@ export default {
                 loading();
             }
         },
+        /**
+         * 删除行数据
+         * @async
+         * @param {AnnouncementItem} row - 行数据
+         * @returns {Promise<void>}
+         */
         async rowDel(row) {
             try {
                 await this.$confirm("确定将选择数据删除?", {
@@ -352,23 +478,47 @@ export default {
                 console.log(error);
             }
         },
+        /**
+         * 重置搜索
+         * @returns {void}
+         */
         searchReset() {
             this.query = {};
             this.onLoad(this.page);
         },
+        /**
+         * 搜索变化
+         * @param {QueryParams} params - 搜索参数
+         * @param {Function} done - 完成回调
+         * @returns {void}
+         */
         searchChange(params, done) {
             this.query = params;
             this.page.currentPage = 1;
             this.onLoad(this.page, params);
             done();
         },
+        /**
+         * 选择变化
+         * @param {Array<AnnouncementItem>} list - 选中的数据列表
+         * @returns {void}
+         */
         selectionChange(list) {
             this.selectionList = list;
         },
+        /**
+         * 清空选择
+         * @returns {void}
+         */
         selectionClear() {
             this.selectionList = [];
             this.$refs.crud.toggleSelection();
         },
+        /**
+         * 批量删除
+         * @async
+         * @returns {Promise<void>}
+         */
         async handleDelete() {
             if (this.selectionList.length === 0) {
                 this.$message.warning("请选择至少一条数据");
@@ -392,6 +542,13 @@ export default {
                 console.log(error);
             }
         },
+        /**
+         * 打开前回调
+         * @async
+         * @param {Function} done - 完成回调
+         * @param {string} type - 操作类型
+         * @returns {Promise<void>}
+         */
         async beforeOpen(done, type) {
             if (["edit", "view"].includes(type)) {
                 try {
@@ -403,15 +560,36 @@ export default {
             }
             done();
         },
+        /**
+         * 当前页变化
+         * @param {number} currentPage - 当前页码
+         * @returns {void}
+         */
         currentChange(currentPage) {
             this.page.currentPage = currentPage;
         },
+        /**
+         * 页大小变化
+         * @param {number} pageSize - 页大小
+         * @returns {void}
+         */
         sizeChange(pageSize) {
             this.page.pageSize = pageSize;
         },
+        /**
+         * 刷新变化
+         * @returns {void}
+         */
         refreshChange() {
             this.onLoad(this.page, this.query);
         },
+        /**
+         * 加载数据
+         * @async
+         * @param {PageInfo} page - 分页信息
+         * @param {QueryParams} [params={}] - 查询参数
+         * @returns {Promise<void>}
+         */
         async onLoad(page, params = {}) {
             const { publishTime } = this.query;
             let values = {