Browse Source

feat(营销活动): 添加营销活动管理相关常量及工具函数

yz 1 month ago
parent
commit
7410c7bb4a

+ 4 - 1
src/constants/index.js

@@ -15,4 +15,7 @@ export * from './complaint'
 export * from './image-store-apply'
 
 // 销售线索管理相关常量
-export * from './lead'
+export * from './lead'
+
+// 营销活动管理相关常量
+export * from './marketing-activity'

+ 384 - 0
src/constants/marketing-activity.js

@@ -0,0 +1,384 @@
+/**
+ * 营销活动管理相关常量定义
+ * @fileoverview 活动类型、审批状态等枚举值和工具函数
+ */
+
+/**
+ * 活动类型枚举
+ * @readonly
+ * @enum {string}
+ */
+export const ACTIVITY_TYPE = {
+  /** 促销活动 */
+  PROMOTION: '促销',
+  /** 新品推广 */
+  NEW_PRODUCT: '新品推广',
+  /** 其他活动 */
+  OTHER: '其他'
+}
+
+/**
+ * 审批状态枚举
+ * @readonly
+ * @enum {number}
+ */
+export const APPROVAL_STATUS = {
+  /** 待审批 */
+  PENDING: 0,
+  /** 已通过 */
+  APPROVED: 1,
+  /** 已拒绝 */
+  REJECTED: 2
+}
+
+/**
+ * 文件类型枚举
+ * @readonly
+ * @enum {string}
+ */
+export const FILE_TYPE = {
+  /** PDF文档 */
+  PDF: 'pdf',
+  /** Word文档 */
+  DOC: 'doc',
+  /** Word文档(新版) */
+  DOCX: 'docx',
+  /** Excel表格 */
+  XLS: 'xls',
+  /** Excel表格(新版) */
+  XLSX: 'xlsx',
+  /** PowerPoint演示文稿 */
+  PPT: 'ppt',
+  /** PowerPoint演示文稿(新版) */
+  PPTX: 'pptx',
+  /** JPEG图片 */
+  JPG: 'jpg',
+  /** JPEG图片 */
+  JPEG: 'jpeg',
+  /** PNG图片 */
+  PNG: 'png',
+  /** GIF图片 */
+  GIF: 'gif',
+  /** BMP图片 */
+  BMP: 'bmp',
+  /** 文本文件 */
+  TXT: 'txt',
+  /** ZIP压缩包 */
+  ZIP: 'zip',
+  /** RAR压缩包 */
+  RAR: 'rar',
+  /** 7Z压缩包 */
+  SEVEN_Z: '7z'
+}
+
+/**
+ * 活动类型配置映射
+ * @readonly
+ * @type {Record<string, {label: string, type: string, color: string}>}
+ */
+export const ACTIVITY_TYPE_CONFIG = {
+  [ACTIVITY_TYPE.PROMOTION]: {
+    label: '促销',
+    type: 'success',
+    color: '#67C23A'
+  },
+  [ACTIVITY_TYPE.NEW_PRODUCT]: {
+    label: '新品推广',
+    type: 'primary',
+    color: '#409EFF'
+  },
+  [ACTIVITY_TYPE.OTHER]: {
+    label: '其他',
+    type: 'info',
+    color: '#909399'
+  }
+}
+
+/**
+ * 审批状态配置映射
+ * @readonly
+ * @type {Record<number, {label: string, type: string, color: string}>}
+ */
+export const APPROVAL_STATUS_CONFIG = {
+  [APPROVAL_STATUS.PENDING]: {
+    label: '待审批',
+    type: 'warning',
+    color: '#E6A23C'
+  },
+  [APPROVAL_STATUS.APPROVED]: {
+    label: '已通过',
+    type: 'success',
+    color: '#67C23A'
+  },
+  [APPROVAL_STATUS.REJECTED]: {
+    label: '已拒绝',
+    type: 'danger',
+    color: '#F56C6C'
+  }
+}
+
+/**
+ * 文件类型图标映射
+ * @readonly
+ * @type {Record<string, string>}
+ */
+export const FILE_TYPE_ICON_CONFIG = {
+  [FILE_TYPE.PDF]: 'el-icon-document',
+  [FILE_TYPE.DOC]: 'el-icon-document',
+  [FILE_TYPE.DOCX]: 'el-icon-document',
+  [FILE_TYPE.XLS]: 'el-icon-s-grid',
+  [FILE_TYPE.XLSX]: 'el-icon-s-grid',
+  [FILE_TYPE.PPT]: 'el-icon-present',
+  [FILE_TYPE.PPTX]: 'el-icon-present',
+  [FILE_TYPE.JPG]: 'el-icon-picture',
+  [FILE_TYPE.JPEG]: 'el-icon-picture',
+  [FILE_TYPE.PNG]: 'el-icon-picture',
+  [FILE_TYPE.GIF]: 'el-icon-picture',
+  [FILE_TYPE.BMP]: 'el-icon-picture',
+  [FILE_TYPE.TXT]: 'el-icon-document',
+  [FILE_TYPE.ZIP]: 'el-icon-folder-opened',
+  [FILE_TYPE.RAR]: 'el-icon-folder-opened',
+  [FILE_TYPE.SEVEN_Z]: 'el-icon-folder-opened'
+}
+
+/**
+ * 活动类型选项数据
+ * @readonly
+ * @type {Array<{label: string, value: string}>}
+ */
+export const ACTIVITY_TYPE_OPTIONS = [
+  { label: '促销', value: ACTIVITY_TYPE.PROMOTION },
+  { label: '新品推广', value: ACTIVITY_TYPE.NEW_PRODUCT },
+  { label: '其他', value: ACTIVITY_TYPE.OTHER }
+]
+
+/**
+ * 审批状态选项数据
+ * @readonly
+ * @type {Array<{label: string, value: number}>}
+ */
+export const APPROVAL_STATUS_OPTIONS = [
+  { label: '待审批', value: APPROVAL_STATUS.PENDING },
+  { label: '已通过', value: APPROVAL_STATUS.APPROVED },
+  { label: '已拒绝', value: APPROVAL_STATUS.REJECTED }
+]
+
+/**
+ * 图片文件类型集合
+ * @readonly
+ * @type {Set<string>}
+ */
+export const IMAGE_FILE_TYPES = new Set([
+  FILE_TYPE.JPG,
+  FILE_TYPE.JPEG,
+  FILE_TYPE.PNG,
+  FILE_TYPE.GIF,
+  FILE_TYPE.BMP
+])
+
+// ==================== 工具函数 ====================
+
+/**
+ * 获取活动类型标签
+ * @param {string} activityType - 活动类型
+ * @returns {string} 活动类型标签
+ */
+export function getActivityTypeLabel(activityType) {
+    return (ACTIVITY_TYPE_CONFIG[activityType] && ACTIVITY_TYPE_CONFIG[activityType].label) || '未知类型'
+
+}
+
+/**
+ * 获取活动类型样式类型
+ * @param {string} activityType - 活动类型
+ * @returns {string} 样式类型
+ */
+export function getActivityTypeType(activityType) {
+    return (ACTIVITY_TYPE_CONFIG[activityType] && ACTIVITY_TYPE_CONFIG[activityType].type) || 'info'
+}
+
+/**
+ * 获取活动类型颜色
+ * @param {string} activityType - 活动类型
+ * @returns {string} 颜色值
+ */
+export function getActivityTypeColor(activityType) {
+    return (ACTIVITY_TYPE_CONFIG[activityType] && ACTIVITY_TYPE_CONFIG[activityType].color) || '#909399'
+}
+
+/**
+ * 获取审批状态标签
+ * @param {number} approvalStatus - 审批状态
+ * @returns {string} 审批状态标签
+ */
+export function getApprovalStatusLabel(approvalStatus) {
+    return (APPROVAL_STATUS_CONFIG[approvalStatus] && APPROVAL_STATUS_CONFIG[approvalStatus].label) || '未知状态'
+}
+
+/**
+ * 获取审批状态样式类型
+ * @param {number} approvalStatus - 审批状态
+ * @returns {string} 样式类型
+ */
+export function getApprovalStatusType(approvalStatus) {
+    return (APPROVAL_STATUS_CONFIG[approvalStatus] && APPROVAL_STATUS_CONFIG[approvalStatus].type) || 'info'
+}
+
+/**
+ * 获取审批状态颜色
+ * @param {number} approvalStatus - 审批状态
+ * @returns {string} 颜色值
+ */
+export function getApprovalStatusColor(approvalStatus) {
+    return (APPROVAL_STATUS_CONFIG[approvalStatus] && APPROVAL_STATUS_CONFIG[approvalStatus].color) || '#909399'
+}
+
+/**
+ * 获取文件类型图标
+ * @param {string} fileType - 文件类型
+ * @returns {string} 图标类名
+ */
+export function getFileTypeIcon(fileType) {
+  if (!fileType) return 'el-icon-document'
+  
+  const type = fileType.toLowerCase()
+  return FILE_TYPE_ICON_CONFIG[type] || 'el-icon-document'
+}
+
+/**
+ * 判断是否为图片文件
+ * @param {string} fileType - 文件类型
+ * @returns {boolean} 是否为图片文件
+ */
+export function isImageFile(fileType) {
+  if (!fileType) return false
+  
+  const type = fileType.toLowerCase()
+  return IMAGE_FILE_TYPES.has(type)
+}
+
+/**
+ * 验证活动类型是否有效
+ * @param {string} activityType - 活动类型
+ * @returns {boolean} 是否有效
+ */
+export function isValidActivityType(activityType) {
+  return Object.values(ACTIVITY_TYPE).includes(activityType)
+}
+
+/**
+ * 验证审批状态是否有效
+ * @param {number} approvalStatus - 审批状态
+ * @returns {boolean} 是否有效
+ */
+export function isValidApprovalStatus(approvalStatus) {
+  return Object.values(APPROVAL_STATUS).includes(approvalStatus)
+}
+
+/**
+ * 验证文件类型是否有效
+ * @param {string} fileType - 文件类型
+ * @returns {boolean} 是否有效
+ */
+export function isValidFileType(fileType) {
+  if (!fileType) return false
+  
+  const type = fileType.toLowerCase()
+  return Object.values(FILE_TYPE).includes(type)
+}
+
+/**
+ * 获取所有活动类型值
+ * @returns {string[]} 活动类型值数组
+ */
+export function getAllActivityTypeValues() {
+  return Object.values(ACTIVITY_TYPE)
+}
+
+/**
+ * 获取所有审批状态值
+ * @returns {number[]} 审批状态值数组
+ */
+export function getAllApprovalStatusValues() {
+  return Object.values(APPROVAL_STATUS)
+}
+
+/**
+ * 获取所有文件类型值
+ * @returns {string[]} 文件类型值数组
+ */
+export function getAllFileTypeValues() {
+  return Object.values(FILE_TYPE)
+}
+
+/**
+ * 判断活动是否可编辑
+ * @param {number} approvalStatus - 审批状态
+ * @returns {boolean} 是否可编辑
+ */
+export function isActivityEditable(approvalStatus) {
+  return approvalStatus === APPROVAL_STATUS.PENDING
+}
+
+/**
+ * 判断活动是否可审批
+ * @param {number} approvalStatus - 审批状态
+ * @returns {boolean} 是否可审批
+ */
+export function isActivityApprovable(approvalStatus) {
+  return approvalStatus === APPROVAL_STATUS.PENDING
+}
+
+/**
+ * 判断活动是否已完成审批
+ * @param {number} approvalStatus - 审批状态
+ * @returns {boolean} 是否已完成审批
+ */
+export function isActivityApprovalCompleted(approvalStatus) {
+  return approvalStatus === APPROVAL_STATUS.APPROVED || approvalStatus === APPROVAL_STATUS.REJECTED
+}
+
+/**
+ * 判断活动是否为促销类型
+ * @param {string} activityType - 活动类型
+ * @returns {boolean} 是否为促销类型
+ */
+export function isPromotionActivity(activityType) {
+  return activityType === ACTIVITY_TYPE.PROMOTION
+}
+
+/**
+ * 判断活动是否为新品推广类型
+ * @param {string} activityType - 活动类型
+ * @returns {boolean} 是否为新品推广类型
+ */
+export function isNewProductActivity(activityType) {
+  return activityType === ACTIVITY_TYPE.NEW_PRODUCT
+}
+
+/**
+ * 判断审批状态是否为通过
+ * @param {number} approvalStatus - 审批状态
+ * @returns {boolean} 是否为通过状态
+ */
+export function isApprovalApproved(approvalStatus) {
+  return approvalStatus === APPROVAL_STATUS.APPROVED
+}
+
+/**
+ * 判断审批状态是否为拒绝
+ * @param {number} approvalStatus - 审批状态
+ * @returns {boolean} 是否为拒绝状态
+ */
+export function isApprovalRejected(approvalStatus) {
+  return approvalStatus === APPROVAL_STATUS.REJECTED
+}
+
+/**
+ * 判断审批状态是否为待审批
+ * @param {number} approvalStatus - 审批状态
+ * @returns {boolean} 是否为待审批状态
+ */
+export function isApprovalPending(approvalStatus) {
+  return approvalStatus === APPROVAL_STATUS.PENDING
+}

+ 19 - 48
src/views/marketing-activity/mixins/marketingActivityIndex.js

@@ -12,6 +12,17 @@ import {
 } from '@/api/order/marketing-activity'
 import { formatFileSize } from '@/util/util'
 import { mapGetters } from 'vuex'
+import {
+    ACTIVITY_TYPE,
+    APPROVAL_STATUS,
+    FILE_TYPE,
+    ACTIVITY_TYPE_OPTIONS,
+    APPROVAL_STATUS_OPTIONS,
+    getApprovalStatusLabel,
+    getApprovalStatusType as getStatusType,
+    getFileTypeIcon as getFileIcon
+} from '@/constants/marketing-activity'
+import { getActivityTypeType, getApprovalStatusType } from '../../../constants'
 
 /**
  * 营销活动记录类型定义
@@ -241,13 +252,7 @@ export default {
                         minWidth: 100,
                         search: true,
                         type: 'select',
-                        dicData: [
-                            { label: '促销', value: '促销' },
-                            { label: '折扣', value: '折扣' },
-                            { label: '满减', value: '满减' },
-                            { label: '买赠', value: '买赠' },
-                            { label: '其他', value: '其他' }
-                        ]
+                        dicData: ACTIVITY_TYPE_OPTIONS
                     },
                     {
                         label: '活动时间',
@@ -271,11 +276,7 @@ export default {
                         slot: true,
                         search: true,
                         type: 'select',
-                        dicData: [
-                            { label: '待审批', value: 1 },
-                            { label: '审批通过', value: 2 },
-                            { label: '审批拒绝', value: 3 }
-                        ]
+                        dicData: APPROVAL_STATUS_OPTIONS
                     },
                     {
                         label: '审批人',
@@ -521,29 +522,7 @@ export default {
          * @returns {string} 图标类名
          */
         getFileTypeIcon(fileType) {
-            if (!fileType) return 'el-icon-document'
-
-            const type = fileType.toLowerCase()
-            const iconMap = {
-                pdf: 'el-icon-document',
-                doc: 'el-icon-document',
-                docx: 'el-icon-document',
-                xls: 'el-icon-s-grid',
-                xlsx: 'el-icon-s-grid',
-                ppt: 'el-icon-present',
-                pptx: 'el-icon-present',
-                jpg: 'el-icon-picture',
-                jpeg: 'el-icon-picture',
-                png: 'el-icon-picture',
-                gif: 'el-icon-picture',
-                bmp: 'el-icon-picture',
-                txt: 'el-icon-document',
-                zip: 'el-icon-folder-opened',
-                rar: 'el-icon-folder-opened',
-                '7z': 'el-icon-folder-opened'
-            }
-
-            return iconMap[type] || 'el-icon-document'
+            return getFileIcon(fileType)
         },
 
         /**
@@ -552,12 +531,7 @@ export default {
          * @returns {string} 状态文本
          */
         getApprovalStatusText(status) {
-            const statusMap = {
-                1: '待审批',
-                2: '审批通过',
-                3: '审批拒绝'
-            }
-            return statusMap[status] || '未知状态'
+            return getApprovalStatusLabel(status)
         },
 
         /**
@@ -566,12 +540,7 @@ export default {
          * @returns {string} 状态类型
          */
         getApprovalStatusType(status) {
-            const typeMap = {
-                1: 'warning',
-                2: 'success',
-                3: 'danger'
-            }
-            return typeMap[status] || 'info'
+            return getStatusType(status)
         },
 
         /**
@@ -704,7 +673,9 @@ export default {
                 approvalRemark: ''
             }
 
-            this.approvalDialog.title = approvalStatus === 2 ? '审批通过' : '审批拒绝'
+            this.approvalDialog.title = approvalStatus === APPROVAL_STATUS.APPROVED 
+                ? getApprovalStatusLabel(APPROVAL_STATUS.APPROVED)
+                : getApprovalStatusLabel(APPROVAL_STATUS.REJECTED)
             this.approvalDialog.visible = true
         },