diff --git a/bms-front/src/constants/ar/enums.js b/bms-front/src/constants/ar/enums.js new file mode 100644 index 00000000..727645f0 --- /dev/null +++ b/bms-front/src/constants/ar/enums.js @@ -0,0 +1,145 @@ +/** + * 应收模块业务枚举。 + * + *
value 必须与后端和数据库保存的英文编码保持一致,label 是面向用户的中文解释, + * type 用于统一 Element Plus 标签颜色。
+ */ + +/** 应收账单生命周期状态。 */ +export const AR_BILL_STATUS = Object.freeze({ + DRAFT: 'DRAFT', // 草稿:已生成,待确认 + CONFIRMED: 'CONFIRMED', // 已确认:正式应收,待核销 + PARTIAL_WRITTEN_OFF: 'PARTIAL_WRITTEN_OFF', // 部分核销:已核销部分金额 + WRITTEN_OFF: 'WRITTEN_OFF', // 已核销:账单金额全部核销 + VOID: 'VOID' // 已作废:账单失效,来源订单可重新出账 +}) + +export const AR_BILL_STATUS_OPTIONS = Object.freeze([ + { label: '草稿', value: AR_BILL_STATUS.DRAFT }, + { label: '已确认', value: AR_BILL_STATUS.CONFIRMED }, + { label: '部分核销', value: AR_BILL_STATUS.PARTIAL_WRITTEN_OFF }, + { label: '已核销', value: AR_BILL_STATUS.WRITTEN_OFF }, + { label: '已作废', value: AR_BILL_STATUS.VOID } +]) + +export const AR_BILL_STATUS_TYPES = Object.freeze({ + [AR_BILL_STATUS.DRAFT]: 'info', + [AR_BILL_STATUS.CONFIRMED]: 'primary', + [AR_BILL_STATUS.PARTIAL_WRITTEN_OFF]: 'warning', + [AR_BILL_STATUS.WRITTEN_OFF]: 'success', + [AR_BILL_STATUS.VOID]: 'danger' +}) + +/** 日志状态变化的兼容展示。日志是通用表,除账单状态外还可能保留历史收款状态。 */ +export const AR_LOG_STATUS_OPTIONS = Object.freeze([ + ...AR_BILL_STATUS_OPTIONS, + { label: '已登记(历史收款)', value: 'REGISTERED' }, + { label: '有效(余额核销)', value: 'EFFECTIVE' }, + { label: '已取消/已反核销', value: 'CANCELLED' } +]) + +/** 客户余额核销单状态。 */ +export const AR_BALANCE_WRITEOFF_STATUS = Object.freeze({ + EFFECTIVE: 'EFFECTIVE', // 有效:已扣减客户余额并完成核销 + CANCELLED: 'CANCELLED' // 已反核销:已回补客户余额 +}) + +export const AR_BALANCE_WRITEOFF_STATUS_OPTIONS = Object.freeze([ + { label: '有效', value: AR_BALANCE_WRITEOFF_STATUS.EFFECTIVE }, + { label: '已反核销', value: AR_BALANCE_WRITEOFF_STATUS.CANCELLED } +]) + +export const AR_BALANCE_WRITEOFF_STATUS_TYPES = Object.freeze({ + [AR_BALANCE_WRITEOFF_STATUS.EFFECTIVE]: 'success', + [AR_BALANCE_WRITEOFF_STATUS.CANCELLED]: 'info' +}) + +/** 账单导出文件状态。 */ +export const AR_EXPORT_STATUS = Object.freeze({ + PROCESSING: 'PROCESSING', // 生成中:文件尚未生成完成 + SUCCESS: 'SUCCESS', // 成功:文件可以下载 + FAILED: 'FAILED' // 失败:文件生成失败 +}) + +export const AR_EXPORT_STATUS_OPTIONS = Object.freeze([ + { label: '生成中', value: AR_EXPORT_STATUS.PROCESSING }, + { label: '成功', value: AR_EXPORT_STATUS.SUCCESS }, + { label: '失败', value: AR_EXPORT_STATUS.FAILED } +]) + +export const AR_EXPORT_STATUS_TYPES = Object.freeze({ + [AR_EXPORT_STATUS.PROCESSING]: 'warning', + [AR_EXPORT_STATUS.SUCCESS]: 'success', + [AR_EXPORT_STATUS.FAILED]: 'danger' +}) + +/** 应收日志关联的业务对象类型。 */ +export const AR_LOG_OBJECT_TYPE = Object.freeze({ + BILL: 'BILL', // 应收账单 + EXPORT: 'EXPORT', // 账单导出文件 + BALANCE_WRITEOFF: 'BALANCE_WRITEOFF' // 客户余额核销单 +}) + +export const AR_LOG_OBJECT_TYPE_OPTIONS = Object.freeze([ + { label: '应收账单', value: AR_LOG_OBJECT_TYPE.BILL }, + { label: '账单导出', value: AR_LOG_OBJECT_TYPE.EXPORT }, + { label: '余额核销', value: AR_LOG_OBJECT_TYPE.BALANCE_WRITEOFF } +]) + +/** 应收日志记录的业务操作类型。 */ +export const AR_LOG_OPERATION_TYPE = Object.freeze({ + CREATE: 'CREATE', // 生成正式账单成功 + GENERATE: 'GENERATE', // 生成账单前校验或生成失败 + CONFIRM: 'CONFIRM', // 确认草稿账单 + VOID: 'VOID', // 作废账单 + EXPORT: 'EXPORT', // 生成账单导出文件 + BALANCE_WRITEOFF: 'BALANCE_WRITEOFF', // 使用客户余额核销账单 + CANCEL_BALANCE_WRITEOFF: 'CANCEL_BALANCE_WRITEOFF' // 取消余额核销并回补余额 +}) + +export const AR_LOG_OPERATION_TYPE_OPTIONS = Object.freeze([ + { label: '生成账单', value: AR_LOG_OPERATION_TYPE.CREATE }, + { label: '生成账单校验', value: AR_LOG_OPERATION_TYPE.GENERATE }, + { label: '确认账单', value: AR_LOG_OPERATION_TYPE.CONFIRM }, + { label: '作废账单', value: AR_LOG_OPERATION_TYPE.VOID }, + { label: '导出账单', value: AR_LOG_OPERATION_TYPE.EXPORT }, + { label: '余额核销', value: AR_LOG_OPERATION_TYPE.BALANCE_WRITEOFF }, + { label: '取消余额核销', value: AR_LOG_OPERATION_TYPE.CANCEL_BALANCE_WRITEOFF } +]) + +/** 应收日志产生来源。 */ +export const AR_LOG_OPERATION_SOURCE = Object.freeze({ + WEB: 'WEB', // 网页端操作 + API: 'API', // 系统接口调用 + JOB: 'JOB', // 定时任务或后台作业 + IMPORT: 'IMPORT' // 数据导入 +}) + +export const AR_LOG_OPERATION_SOURCE_OPTIONS = Object.freeze([ + { label: '网页端', value: AR_LOG_OPERATION_SOURCE.WEB }, + { label: '接口', value: AR_LOG_OPERATION_SOURCE.API }, + { label: '定时任务', value: AR_LOG_OPERATION_SOURCE.JOB }, + { label: '数据导入', value: AR_LOG_OPERATION_SOURCE.IMPORT } +]) + +/** 应收日志执行结果。 */ +export const AR_LOG_RESULT = Object.freeze({ + SUCCESS: 'SUCCESS', // 操作成功 + FAILED: 'FAILED' // 操作失败 +}) + +export const AR_LOG_RESULT_OPTIONS = Object.freeze([ + { label: '成功', value: AR_LOG_RESULT.SUCCESS }, + { label: '失败', value: AR_LOG_RESULT.FAILED } +]) + +export const AR_LOG_RESULT_TYPES = Object.freeze({ + [AR_LOG_RESULT.SUCCESS]: 'success', + [AR_LOG_RESULT.FAILED]: 'danger' +}) + +/** 从枚举选项中取得中文名称,未知值保留原编码便于排查数据。 */ +export function arEnumLabel(options, value) { + if (value === null || value === undefined || value === '') return '-' + return options.find(item => item.value === value)?.label || value +}