order.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514
  1. /**
  2. * @fileoverview 订单管理相关常量定义和类型定义
  3. * @description 定义订单类型、订单状态、订单明细状态等枚举值、常量和工具函数
  4. */
  5. /**
  6. * 订单类型枚举
  7. * @readonly
  8. */
  9. export const ORDER_TYPES = Object.freeze({
  10. /** 未知类型 */
  11. UNKNOWN: 0,
  12. /** 普通订单 */
  13. NORMAL: 1
  14. })
  15. /**
  16. * 订单类型枚举(订单表单模块兼容性别名)
  17. * @readonly
  18. * @enum {number}
  19. */
  20. export const OrderType = ORDER_TYPES
  21. /**
  22. * 订单状态枚举
  23. * @readonly
  24. */
  25. export const ORDER_STATUS = Object.freeze({
  26. /** 草稿 */
  27. DRAFT: 0,
  28. /** 已提交/待审核 */
  29. SUBMITTED: 1,
  30. /** 已确认/已审核 */
  31. CONFIRMED: 2,
  32. /** 部分发货/已发货 */
  33. PARTIAL_SHIPPED: 3,
  34. /** 已完成 */
  35. COMPLETED: 4,
  36. /** 已取消 */
  37. CANCELLED: 5
  38. })
  39. /**
  40. * 订单状态枚举(订单表单模块兼容性别名)
  41. * @readonly
  42. * @enum {number}
  43. */
  44. export const OrderStatus = {
  45. /** 草稿 */
  46. DRAFT: ORDER_STATUS.DRAFT,
  47. /** 待审核 */
  48. PENDING: ORDER_STATUS.SUBMITTED,
  49. /** 已审核 */
  50. APPROVED: ORDER_STATUS.CONFIRMED,
  51. /** 已发货 */
  52. SHIPPED: ORDER_STATUS.PARTIAL_SHIPPED,
  53. /** 已完成 */
  54. COMPLETED: ORDER_STATUS.COMPLETED,
  55. /** 已取消 */
  56. CANCELLED: ORDER_STATUS.CANCELLED
  57. }
  58. /**
  59. * 订单明细状态枚举
  60. * @readonly
  61. */
  62. export const ORDER_ITEM_STATUS = Object.freeze({
  63. /** 未确认 */
  64. UNCONFIRMED: 0,
  65. /** 已确认 */
  66. CONFIRMED: 1,
  67. /** 部分发货 */
  68. PARTIAL_SHIPPED: 2,
  69. /** 已完成 */
  70. COMPLETED: 3
  71. })
  72. /**
  73. * 物料明细状态枚举(订单表单模块兼容性别名)
  74. * @description 对应数据库item_status字段:0未确认 1已确认 2部分发货 3已完成
  75. * @readonly
  76. */
  77. export const MaterialDetailStatus = ORDER_ITEM_STATUS
  78. /**
  79. * 物料明细数据来源枚举
  80. * @readonly
  81. * @enum {string}
  82. */
  83. export const MaterialDetailDataSource = {
  84. /** 远程加载的数据(从订单获取) */
  85. REMOTE: 'REMOTE',
  86. /** 用户导入的数据 */
  87. IMPORTED: 'IMPORTED'
  88. }
  89. /**
  90. * 订单类型配置映射
  91. * @readonly
  92. * @type {Record<number, {readonly label: string, readonly type: string, readonly color: string}>}
  93. */
  94. export const ORDER_TYPE_CONFIG = {
  95. [ORDER_TYPES.UNKNOWN]: {
  96. label: '未知类型',
  97. type: 'info',
  98. color: '#909399'
  99. },
  100. [ORDER_TYPES.NORMAL]: {
  101. label: '普通订单',
  102. type: 'primary',
  103. color: '#409EFF'
  104. }
  105. }
  106. /**
  107. * 订单状态配置映射
  108. * @readonly
  109. * @type {Record<number, {readonly label: string, readonly type: string, readonly color: string}>}
  110. */
  111. export const ORDER_STATUS_CONFIG = {
  112. [ORDER_STATUS.DRAFT]: {
  113. label: '草稿',
  114. type: 'info',
  115. color: '#909399'
  116. },
  117. [ORDER_STATUS.SUBMITTED]: {
  118. label: '待审核',
  119. type: 'warning',
  120. color: '#E6A23C'
  121. },
  122. [ORDER_STATUS.CONFIRMED]: {
  123. label: '已审核',
  124. type: 'primary',
  125. color: '#409EFF'
  126. },
  127. [ORDER_STATUS.PARTIAL_SHIPPED]: {
  128. label: '已发货',
  129. type: 'warning',
  130. color: '#E6A23C'
  131. },
  132. [ORDER_STATUS.COMPLETED]: {
  133. label: '已完成',
  134. type: 'success',
  135. color: '#67C23A'
  136. },
  137. [ORDER_STATUS.CANCELLED]: {
  138. label: '已取消',
  139. type: 'danger',
  140. color: '#F56C6C'
  141. }
  142. }
  143. /**
  144. * 订单明细状态配置映射
  145. * @readonly
  146. * @type {Record<number, {readonly label: string, readonly type: string, readonly color: string}>}
  147. */
  148. export const ORDER_ITEM_STATUS_CONFIG = {
  149. [ORDER_ITEM_STATUS.UNCONFIRMED]: {
  150. label: '未确认',
  151. type: 'warning',
  152. color: '#E6A23C'
  153. },
  154. [ORDER_ITEM_STATUS.CONFIRMED]: {
  155. label: '已确认',
  156. type: 'primary',
  157. color: '#409EFF'
  158. },
  159. [ORDER_ITEM_STATUS.PARTIAL_SHIPPED]: {
  160. label: '部分发货',
  161. type: 'warning',
  162. color: '#E6A23C'
  163. },
  164. [ORDER_ITEM_STATUS.COMPLETED]: {
  165. label: '已完成',
  166. type: 'success',
  167. color: '#67C23A'
  168. }
  169. }
  170. /**
  171. * 订单类型选项数据
  172. * @readonly
  173. * @type {Array<{readonly label: string, readonly value: typeof ORDER_TYPES[keyof typeof ORDER_TYPES]}>}
  174. */
  175. export const ORDER_TYPE_OPTIONS = [
  176. { label: '未知类型', value: ORDER_TYPES.UNKNOWN },
  177. { label: '普通订单', value: ORDER_TYPES.NORMAL }
  178. ]
  179. /**
  180. * 订单状态选项数据
  181. * @readonly
  182. * @type {Array<{readonly label: string, readonly value:typeof ORDER_STATUS[keyof typeof ORDER_STATUS]}>}
  183. */
  184. export const ORDER_STATUS_OPTIONS = [
  185. { label: '草稿', value: ORDER_STATUS.DRAFT },
  186. { label: '已提交', value: ORDER_STATUS.SUBMITTED },
  187. { label: '已确认', value: ORDER_STATUS.CONFIRMED },
  188. { label: '部分发货', value: ORDER_STATUS.PARTIAL_SHIPPED },
  189. { label: '已完成', value: ORDER_STATUS.COMPLETED },
  190. { label: '已取消', value: ORDER_STATUS.CANCELLED }
  191. ]
  192. /**
  193. * 订单明细状态选项数据
  194. * @readonly
  195. * @type {ReadonlyArray<{readonly label: string, readonly value: typeof ORDER_ITEM_STATUS[keyof typeof ORDER_ITEM_STATUS]}>}
  196. */
  197. export const ORDER_ITEM_STATUS_OPTIONS = [
  198. { label: '未确认', value: ORDER_ITEM_STATUS.UNCONFIRMED },
  199. { label: '已确认', value: ORDER_ITEM_STATUS.CONFIRMED },
  200. { label: '部分发货', value: ORDER_ITEM_STATUS.PARTIAL_SHIPPED },
  201. { label: '已完成', value: ORDER_ITEM_STATUS.COMPLETED }
  202. ]
  203. /**
  204. * 物料明细状态选项列表(订单表单模块兼容性别名)
  205. * @readonly
  206. * @type {ReadonlyArray<{readonly label: string, readonly value: number}>}
  207. */
  208. export const MATERIAL_DETAIL_STATUS_OPTIONS = ORDER_ITEM_STATUS_OPTIONS
  209. /**
  210. * 默认分页配置
  211. * @readonly
  212. * @type {{readonly current: number, readonly pageSize: number, readonly total: number, readonly showSizeChanger: boolean, readonly showQuickJumper: boolean, readonly showTotal: (total: number, range: [number, number]) => string}}
  213. */
  214. export const DEFAULT_PAGINATION_CONFIG = {
  215. current: 1,
  216. pageSize: 10,
  217. total: 0,
  218. showSizeChanger: true,
  219. showQuickJumper: true,
  220. showTotal: (total, range) => `第 ${range[0]}-${range[1]} 条/共 ${total} 条`
  221. }
  222. // ==================== 工具函数 ====================
  223. /**
  224. * 获取订单类型标签
  225. * @param {1} orderType - 订单类型值
  226. * @returns {'普通订单' | '未知类型'} 订单类型标签
  227. */
  228. export function getOrderTypeLabel(orderType) {
  229. const config = ORDER_TYPE_CONFIG[orderType]
  230. return config ? config.label : '未知类型'
  231. }
  232. /**
  233. * 获取订单类型Element UI标签类型
  234. * @param {typeof ORDER_TYPES[keyof typeof ORDER_TYPES]} orderType - 订单类型值
  235. * @returns {string} Element UI标签类型
  236. */
  237. export function getOrderTypeTagType(orderType) {
  238. const config = ORDER_TYPE_CONFIG[orderType]
  239. return config ? config.type : 'info'
  240. }
  241. /**
  242. * 获取订单类型颜色
  243. * @param {typeof ORDER_TYPES[keyof typeof ORDER_TYPES]} orderType - 订单类型值
  244. * @returns {string} 十六进制颜色值
  245. */
  246. export function getOrderTypeColor(orderType) {
  247. const config = ORDER_TYPE_CONFIG[orderType]
  248. return config ? config.color : '#909399'
  249. }
  250. /**
  251. * 获取订单状态标签
  252. * @param {typeof ORDER_STATUS[keyof typeof ORDER_STATUS]} status - 订单状态值
  253. * @returns {string} 订单状态标签
  254. */
  255. export function getOrderStatusLabel(status) {
  256. const config = ORDER_STATUS_CONFIG[status]
  257. return config ? config.label : '未知状态'
  258. }
  259. /**
  260. * 获取订单状态Element UI标签类型
  261. * @param {typeof ORDER_STATUS[keyof typeof ORDER_STATUS]} status - 订单状态值
  262. * @returns {string} Element UI标签类型
  263. */
  264. export function getOrderStatusTagType(status) {
  265. const config = ORDER_STATUS_CONFIG[status]
  266. return config ? config.type : 'info'
  267. }
  268. /**
  269. * 获取订单状态颜色
  270. * @param {typeof ORDER_STATUS[keyof typeof ORDER_STATUS]} status - 订单状态值
  271. * @returns {string} 十六进制颜色值
  272. */
  273. export function getOrderStatusColor(status) {
  274. const config = ORDER_STATUS_CONFIG[status]
  275. return config ? config.color : '#909399'
  276. }
  277. /**
  278. * 获取订单明细状态标签
  279. * @param {typeof ORDER_ITEM_STATUS[keyof typeof ORDER_ITEM_STATUS]} itemStatus - 订单明细状态值
  280. * @returns {string} 订单明细状态标签
  281. */
  282. export function getOrderItemStatusLabel(itemStatus) {
  283. const config = ORDER_ITEM_STATUS_CONFIG[itemStatus]
  284. return config ? config.label : '未知状态'
  285. }
  286. /**
  287. * 获取订单明细状态Element UI标签类型
  288. * @param {typeof ORDER_ITEM_STATUS[keyof typeof ORDER_ITEM_STATUS]} itemStatus - 订单明细状态值
  289. * @returns {string} Element UI标签类型
  290. */
  291. export function getOrderItemStatusTagType(itemStatus) {
  292. const config = ORDER_ITEM_STATUS_CONFIG[itemStatus]
  293. return config ? config.type : 'info'
  294. }
  295. /**
  296. * 获取订单明细状态颜色
  297. * @param {typeof ORDER_ITEM_STATUS[keyof typeof ORDER_ITEM_STATUS]} itemStatus - 订单明细状态值
  298. * @returns {string} 十六进制颜色值
  299. */
  300. export function getOrderItemStatusColor(itemStatus) {
  301. const config = ORDER_ITEM_STATUS_CONFIG[itemStatus]
  302. return config ? config.color : '#909399'
  303. }
  304. /**
  305. * 检查订单是否可以编辑
  306. * @param {typeof ORDER_STATUS[keyof typeof ORDER_STATUS]} status - 订单状态值
  307. * @returns {boolean} 是否可以编辑
  308. */
  309. export function isOrderEditable(status) {
  310. return status === ORDER_STATUS.DRAFT || status === ORDER_STATUS.SUBMITTED
  311. }
  312. /**
  313. * 检查订单是否可以取消
  314. * @param {typeof ORDER_STATUS[keyof typeof ORDER_STATUS]} status - 订单状态值
  315. * @returns {boolean} 是否可以取消
  316. */
  317. export function isOrderCancellable(status) {
  318. return status !== ORDER_STATUS.COMPLETED && status !== ORDER_STATUS.CANCELLED
  319. }
  320. /**
  321. * 检查订单明细是否可以编辑
  322. * @param {typeof ORDER_ITEM_STATUS[keyof typeof ORDER_ITEM_STATUS]} itemStatus - 订单明细状态值
  323. * @returns {boolean} 是否可以编辑
  324. */
  325. export function isOrderItemEditable(itemStatus) {
  326. return itemStatus === ORDER_ITEM_STATUS.UNCONFIRMED || itemStatus === ORDER_ITEM_STATUS.CONFIRMED
  327. }
  328. /**
  329. * 检查订单明细是否可以取消
  330. * @param {typeof ORDER_ITEM_STATUS[keyof typeof ORDER_ITEM_STATUS]} itemStatus - 订单明细状态值
  331. * @returns {boolean} 是否可以取消
  332. */
  333. export function isOrderItemCancellable(itemStatus) {
  334. return itemStatus !== ORDER_ITEM_STATUS.COMPLETED
  335. }
  336. // ==================== 发票相关常量 ====================
  337. /**
  338. * 发票类型枚举
  339. * @readonly
  340. * @enum {string}
  341. */
  342. export const INVOICE_TYPES = {
  343. /** 普通发票 */
  344. NORMAL: 'NORMAL',
  345. /** 专用发票 */
  346. SPECIAL: 'SPECIAL'
  347. }
  348. /**
  349. * 发票状态枚举
  350. * @readonly
  351. * @enum {number}
  352. */
  353. export const INVOICE_STATUS = {
  354. /** 待开票 */
  355. PENDING: 0,
  356. /** 已开票 */
  357. INVOICED: 1,
  358. /** 已红冲 */
  359. RED_FLUSHED: 2,
  360. /** 已作废 */
  361. VOIDED: 3
  362. }
  363. /**
  364. * 发票类型标签映射
  365. * @readonly
  366. * @type {Record<string, string>}
  367. */
  368. export const INVOICE_TYPE_LABELS = {
  369. [INVOICE_TYPES.NORMAL]: '普通发票',
  370. [INVOICE_TYPES.SPECIAL]: '专用发票'
  371. }
  372. /**
  373. * 发票状态标签映射
  374. * @readonly
  375. * @type {Record<number, string>}
  376. */
  377. export const INVOICE_STATUS_LABELS = {
  378. [INVOICE_STATUS.PENDING]: '待开票',
  379. [INVOICE_STATUS.INVOICED]: '已开票',
  380. [INVOICE_STATUS.RED_FLUSHED]: '已红冲',
  381. [INVOICE_STATUS.VOIDED]: '已作废'
  382. }
  383. /**
  384. * 发票类型标签类型映射(用于Element UI标签样式)
  385. * @readonly
  386. * @type {Record<string, string>}
  387. */
  388. export const INVOICE_TYPE_TAG_TYPES = {
  389. [INVOICE_TYPES.NORMAL]: 'info',
  390. [INVOICE_TYPES.SPECIAL]: 'success'
  391. }
  392. /**
  393. * 发票状态标签类型映射(用于Element UI标签样式)
  394. * @readonly
  395. * @type {Record<number, string>}
  396. */
  397. export const INVOICE_STATUS_TAG_TYPES = {
  398. [INVOICE_STATUS.PENDING]: 'warning',
  399. [INVOICE_STATUS.INVOICED]: 'success',
  400. [INVOICE_STATUS.RED_FLUSHED]: 'danger',
  401. [INVOICE_STATUS.VOIDED]: 'info'
  402. }
  403. /**
  404. * 发票类型选项数组(用于下拉选择)
  405. * @readonly
  406. * @type {Array<{label: string, value: string}>}
  407. */
  408. export const INVOICE_TYPE_OPTIONS = [
  409. { label: INVOICE_TYPE_LABELS[INVOICE_TYPES.NORMAL], value: INVOICE_TYPES.NORMAL },
  410. { label: INVOICE_TYPE_LABELS[INVOICE_TYPES.SPECIAL], value: INVOICE_TYPES.SPECIAL }
  411. ]
  412. /**
  413. * 发票状态选项数组(用于下拉选择)
  414. * @readonly
  415. * @type {Array<{label: string, value: number}>}
  416. */
  417. export const INVOICE_STATUS_OPTIONS = [
  418. { label: INVOICE_STATUS_LABELS[INVOICE_STATUS.PENDING], value: INVOICE_STATUS.PENDING },
  419. { label: INVOICE_STATUS_LABELS[INVOICE_STATUS.INVOICED], value: INVOICE_STATUS.INVOICED },
  420. { label: INVOICE_STATUS_LABELS[INVOICE_STATUS.RED_FLUSHED], value: INVOICE_STATUS.RED_FLUSHED },
  421. { label: INVOICE_STATUS_LABELS[INVOICE_STATUS.VOIDED], value: INVOICE_STATUS.VOIDED }
  422. ]
  423. /**
  424. * 获取发票类型标签文本
  425. * @param {string} type - 发票类型
  426. * @returns {string} 标签文本
  427. */
  428. export const getInvoiceTypeLabel = (type) => {
  429. return INVOICE_TYPE_LABELS[type] || '未知类型'
  430. }
  431. /**
  432. * 获取发票类型标签样式
  433. * @param {string} type - 发票类型
  434. * @returns {string} 标签样式类型
  435. */
  436. export const getInvoiceTypeTagType = (type) => {
  437. return INVOICE_TYPE_TAG_TYPES[type] || 'info'
  438. }
  439. /**
  440. * 获取发票状态标签文本
  441. * @param {number} status - 发票状态
  442. * @returns {string} 标签文本
  443. */
  444. export const getInvoiceStatusLabel = (status) => {
  445. return INVOICE_STATUS_LABELS[status] || '未知状态'
  446. }
  447. /**
  448. * 获取发票状态标签样式
  449. * @param {number} status - 发票状态
  450. * @returns {string} 标签样式类型
  451. */
  452. export const getInvoiceStatusTagType = (status) => {
  453. return INVOICE_STATUS_TAG_TYPES[status] || 'info'
  454. }
  455. /**
  456. * 验证发票类型是否有效
  457. * @param {string} type - 发票类型
  458. * @returns {boolean} 是否有效
  459. */
  460. export const isValidInvoiceType = (type) => {
  461. return Object.values(INVOICE_TYPES).includes(type)
  462. }
  463. /**
  464. * 验证发票状态是否有效
  465. * @param {number} status - 发票状态
  466. * @returns {boolean} 是否有效
  467. */
  468. export const isValidInvoiceStatus = (status) => {
  469. return Object.values(INVOICE_STATUS).includes(status)
  470. }