|
@@ -0,0 +1,217 @@
|
|
|
+/**
|
|
|
+ * 公告模块常量定义
|
|
|
+ * @fileoverview 包含公告相关的枚举值、映射关系和配置常量
|
|
|
+ */
|
|
|
+
|
|
|
+/**
|
|
|
+ * 角色类型枚举
|
|
|
+ * @typedef {1|2|4} RoleType
|
|
|
+ * - 1: 工厂
|
|
|
+ * - 2: 经销商
|
|
|
+ * - 4: 零售商
|
|
|
+ */
|
|
|
+
|
|
|
+/**
|
|
|
+ * 可见角色掩码类型 (位运算)
|
|
|
+ * @typedef {number} VisibleRolesMask
|
|
|
+ * 支持的值:1(工厂) | 2(经销商) | 4(零售商) 及其组合
|
|
|
+ * 例如:3(工厂+经销商), 5(工厂+零售商), 6(经销商+零售商), 7(全部)
|
|
|
+ */
|
|
|
+
|
|
|
+/**
|
|
|
+ * 公告状态枚举类型
|
|
|
+ * @typedef {0|1|2} AnnouncementStatus
|
|
|
+ * - 0: 草稿
|
|
|
+ * - 1: 已发布
|
|
|
+ * - 2: 已下架
|
|
|
+ */
|
|
|
+
|
|
|
+/**
|
|
|
+ * 角色选项类型定义
|
|
|
+ * @typedef {Object} RoleOption
|
|
|
+ * @property {string} label - 角色显示名称
|
|
|
+ * @property {RoleType} value - 角色值(位运算)
|
|
|
+ */
|
|
|
+
|
|
|
+/**
|
|
|
+ * 状态选项类型定义
|
|
|
+ * @typedef {Object} StatusOption
|
|
|
+ * @property {string} label - 状态显示名称
|
|
|
+ * @property {AnnouncementStatus} value - 状态值
|
|
|
+ */
|
|
|
+
|
|
|
+// ==================== 角色相关常量 ====================
|
|
|
+
|
|
|
+/**
|
|
|
+ * 角色枚举值
|
|
|
+ * @type {Object<string, RoleType>}
|
|
|
+ */
|
|
|
+export const ROLE_TYPES = {
|
|
|
+ FACTORY: 1, // 工厂
|
|
|
+ DEALER: 2, // 经销商
|
|
|
+ RETAILER: 4 // 零售商
|
|
|
+};
|
|
|
+
|
|
|
+/**
|
|
|
+ * 角色标签映射
|
|
|
+ * @type {Object<RoleType, string>}
|
|
|
+ */
|
|
|
+export const ROLE_LABELS = {
|
|
|
+ [ROLE_TYPES.FACTORY]: '工厂',
|
|
|
+ [ROLE_TYPES.DEALER]: '经销商',
|
|
|
+ [ROLE_TYPES.RETAILER]: '零售商'
|
|
|
+};
|
|
|
+
|
|
|
+/**
|
|
|
+ * 角色标签类型映射 (Element UI Tag类型)
|
|
|
+ * @type {Object<RoleType, string>}
|
|
|
+ */
|
|
|
+export const ROLE_TAG_TYPES = {
|
|
|
+ [ROLE_TYPES.FACTORY]: 'success', // 工厂 - 绿色
|
|
|
+ [ROLE_TYPES.DEALER]: 'warning', // 经销商 - 橙色
|
|
|
+ [ROLE_TYPES.RETAILER]: 'info' // 零售商 - 蓝色
|
|
|
+};
|
|
|
+
|
|
|
+/**
|
|
|
+ * 角色选项数据 (用于表单下拉框)
|
|
|
+ * @type {RoleOption[]}
|
|
|
+ */
|
|
|
+export const ROLE_OPTIONS = [
|
|
|
+ { label: ROLE_LABELS[ROLE_TYPES.FACTORY], value: ROLE_TYPES.FACTORY },
|
|
|
+ { label: ROLE_LABELS[ROLE_TYPES.DEALER], value: ROLE_TYPES.DEALER },
|
|
|
+ { label: ROLE_LABELS[ROLE_TYPES.RETAILER], value: ROLE_TYPES.RETAILER }
|
|
|
+];
|
|
|
+
|
|
|
+// ==================== 状态相关常量 ====================
|
|
|
+
|
|
|
+/**
|
|
|
+ * 公告状态枚举值
|
|
|
+ * @type {Object<string, AnnouncementStatus>}
|
|
|
+ */
|
|
|
+export const ANNOUNCEMENT_STATUS = {
|
|
|
+ DRAFT: 0, // 草稿
|
|
|
+ PUBLISHED: 1, // 已发布
|
|
|
+ ARCHIVED: 2 // 已下架
|
|
|
+};
|
|
|
+
|
|
|
+/**
|
|
|
+ * 状态标签映射
|
|
|
+ * @type {Object<AnnouncementStatus, string>}
|
|
|
+ */
|
|
|
+export const STATUS_LABELS = {
|
|
|
+ [ANNOUNCEMENT_STATUS.DRAFT]: '草稿',
|
|
|
+ [ANNOUNCEMENT_STATUS.PUBLISHED]: '已发布',
|
|
|
+ [ANNOUNCEMENT_STATUS.ARCHIVED]: '已下架'
|
|
|
+};
|
|
|
+
|
|
|
+/**
|
|
|
+ * 状态标签类型映射 (Element UI Tag类型)
|
|
|
+ * @type {Object<AnnouncementStatus, string>}
|
|
|
+ */
|
|
|
+export const STATUS_TAG_TYPES = {
|
|
|
+ [ANNOUNCEMENT_STATUS.DRAFT]: 'info', // 草稿 - 蓝色
|
|
|
+ [ANNOUNCEMENT_STATUS.PUBLISHED]: 'success', // 已发布 - 绿色
|
|
|
+ [ANNOUNCEMENT_STATUS.ARCHIVED]: 'danger' // 已下架 - 红色
|
|
|
+};
|
|
|
+
|
|
|
+/**
|
|
|
+ * 状态选项数据 (用于表单下拉框)
|
|
|
+ * @type {StatusOption[]}
|
|
|
+ */
|
|
|
+export const STATUS_OPTIONS = [
|
|
|
+ { label: STATUS_LABELS[ANNOUNCEMENT_STATUS.DRAFT], value: ANNOUNCEMENT_STATUS.DRAFT },
|
|
|
+ { label: STATUS_LABELS[ANNOUNCEMENT_STATUS.PUBLISHED], value: ANNOUNCEMENT_STATUS.PUBLISHED },
|
|
|
+ { label: STATUS_LABELS[ANNOUNCEMENT_STATUS.ARCHIVED], value: ANNOUNCEMENT_STATUS.ARCHIVED }
|
|
|
+];
|
|
|
+
|
|
|
+// ==================== 工具函数 ====================
|
|
|
+
|
|
|
+/**
|
|
|
+ * 获取角色标签文本
|
|
|
+ * @param {RoleType} roleValue - 角色值
|
|
|
+ * @returns {string} 角色标签文本
|
|
|
+ */
|
|
|
+export const getRoleLabel = (roleValue) => {
|
|
|
+ return ROLE_LABELS[roleValue] || '未知角色';
|
|
|
+};
|
|
|
+
|
|
|
+/**
|
|
|
+ * 获取角色标签类型
|
|
|
+ * @param {RoleType} roleValue - 角色值
|
|
|
+ * @returns {string} Element UI标签类型
|
|
|
+ */
|
|
|
+export const getRoleTagType = (roleValue) => {
|
|
|
+ return ROLE_TAG_TYPES[roleValue] || 'default';
|
|
|
+};
|
|
|
+
|
|
|
+/**
|
|
|
+ * 获取状态标签文本
|
|
|
+ * @param {AnnouncementStatus} statusValue - 状态值
|
|
|
+ * @returns {string} 状态标签文本
|
|
|
+ */
|
|
|
+export const getStatusLabel = (statusValue) => {
|
|
|
+ return STATUS_LABELS[statusValue] || '未知状态';
|
|
|
+};
|
|
|
+
|
|
|
+/**
|
|
|
+ * 获取状态标签类型
|
|
|
+ * @param {AnnouncementStatus} statusValue - 状态值
|
|
|
+ * @returns {string} Element UI标签类型
|
|
|
+ */
|
|
|
+export const getStatusTagType = (statusValue) => {
|
|
|
+ return STATUS_TAG_TYPES[statusValue] || 'default';
|
|
|
+};
|
|
|
+
|
|
|
+/**
|
|
|
+ * 计算角色掩码值 (位运算)
|
|
|
+ * @param {RoleType[]} selectedRoles - 选中的角色数组
|
|
|
+ * @returns {VisibleRolesMask} 角色掩码值
|
|
|
+ */
|
|
|
+export const calculateRolesMask = (selectedRoles) => {
|
|
|
+ if (!Array.isArray(selectedRoles) || selectedRoles.length === 0) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ return selectedRoles.reduce((mask, role) => mask | role, 0);
|
|
|
+};
|
|
|
+
|
|
|
+/**
|
|
|
+ * 解析角色掩码为角色数组
|
|
|
+ * @param {VisibleRolesMask|string} rolesMask - 角色掩码值
|
|
|
+ * @returns {RoleOption[]} 角色选项数组
|
|
|
+ */
|
|
|
+export const parseRolesMask = (rolesMask) => {
|
|
|
+ // 处理空值
|
|
|
+ if (!rolesMask && rolesMask !== 0) {
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+
|
|
|
+ // 转换为数字类型
|
|
|
+ const numericMask = typeof rolesMask === 'string' ? parseInt(rolesMask, 10) : rolesMask;
|
|
|
+
|
|
|
+ // 验证转换后的数字是否有效
|
|
|
+ if (typeof numericMask !== 'number' || isNaN(numericMask) || numericMask < 0) {
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+
|
|
|
+ return ROLE_OPTIONS.filter(role => (numericMask & role.value) === role.value);
|
|
|
+};
|
|
|
+
|
|
|
+/**
|
|
|
+ * 获取可见角色文本数组
|
|
|
+ * @param {VisibleRolesMask} visibleRoles - 可见角色掩码
|
|
|
+ * @returns {string[]} 角色文本数组
|
|
|
+ */
|
|
|
+export const getVisibleRolesTextArray = (visibleRoles) => {
|
|
|
+ const roles = parseRolesMask(visibleRoles);
|
|
|
+ return roles.map(role => role.label);
|
|
|
+};
|
|
|
+
|
|
|
+/**
|
|
|
+ * 获取可见角色文本 (逗号分隔)
|
|
|
+ * @param {VisibleRolesMask} visibleRoles - 可见角色掩码
|
|
|
+ * @returns {string} 角色文本字符串
|
|
|
+ */
|
|
|
+export const getVisibleRolesText = (visibleRoles) => {
|
|
|
+ const textArray = getVisibleRolesTextArray(visibleRoles);
|
|
|
+ return textArray.length > 0 ? textArray.join('、') : '无';
|
|
|
+};
|