business.ts 23 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156
  1. import request from '@/utils/http'
  2. // =========================================
  3. // 订单管理 API
  4. // =========================================
  5. /**
  6. * 获取订单列表
  7. */
  8. export function fetchOrderList(params: {
  9. page?: number
  10. pageSize?: number
  11. keyword?: string
  12. status?: string
  13. orderStatus?: string
  14. deliveryStatus?: string
  15. payStatus?: string
  16. paymentMethod?: string
  17. regionId?: string
  18. clientId?: string
  19. startDate?: string
  20. endDate?: string
  21. }) {
  22. return request.get<{
  23. list: Api.Order.OrderItem[]
  24. total: number
  25. page: number
  26. pageSize: number
  27. totalPages: number
  28. }>({
  29. url: '/web/admin/orders',
  30. params
  31. })
  32. }
  33. /**
  34. * 获取订单详情
  35. */
  36. export function fetchOrderDetail(id: string) {
  37. return request.get<Api.Order.OrderDetail>({
  38. url: `/web/admin/orders/${id}`
  39. })
  40. }
  41. /**
  42. * 分配配送员
  43. */
  44. export function fetchAssignDelivery(data: {
  45. orderId: string
  46. deliverId: string
  47. deliveryDeadlineAt: string
  48. dispatchRemark?: string
  49. }) {
  50. return request.post({
  51. url: `/web/admin/orders/${data.orderId}/assign-deliverer`,
  52. params: {
  53. deliverId: data.deliverId,
  54. deliveryDeadlineAt: data.deliveryDeadlineAt,
  55. dispatchRemark: data.dispatchRemark || ''
  56. }
  57. })
  58. }
  59. /**
  60. * 审核取消订单
  61. */
  62. export function fetchReviewCancel(data: { orderId: string; approved: boolean; note?: string }) {
  63. return request.post({
  64. url: `/web/admin/orders/${data.orderId}/review-cancel`,
  65. params: { approved: data.approved, note: data.note }
  66. })
  67. }
  68. /**
  69. * 完结订单
  70. */
  71. export function fetchCompleteOrder(orderId: string) {
  72. return request.post({
  73. url: `/web/admin/orders/${orderId}/complete`
  74. })
  75. }
  76. /**
  77. * 取消订单
  78. */
  79. export function fetchCancelOrder(data: {
  80. orderId: string
  81. reason: string
  82. note?: string
  83. evidenceImageUrls?: string[]
  84. }) {
  85. return request.post({
  86. url: `/web/admin/orders/${data.orderId}/cancel`,
  87. params: {
  88. reason: data.reason,
  89. note: data.note,
  90. evidenceImageUrls: data.evidenceImageUrls || []
  91. }
  92. })
  93. }
  94. export function fetchOrderAdjusts(orderId: string) {
  95. return request.get({
  96. url: `/web/admin/orders/${orderId}/adjusts`
  97. })
  98. }
  99. /**
  100. * 运营调整订单(商品/地址)
  101. */
  102. export function fetchAdjustOrder(data: {
  103. orderId: string
  104. adjustments?: Array<{
  105. orderItemId: string
  106. adjustType: 'reduce' | 'delete' | 'substitute' | 'increase'
  107. newQuantity?: number
  108. newProductId?: string
  109. reason: string
  110. }>
  111. addressUpdate?: {
  112. deliveryAddress?: string
  113. contactPerson?: string
  114. contactPhone?: string
  115. reason?: string
  116. }
  117. }) {
  118. return request.post({
  119. url: `/web/admin/orders/${data.orderId}/adjust`,
  120. params: {
  121. adjustments: data.adjustments || [],
  122. addressUpdate: data.addressUpdate || undefined
  123. }
  124. })
  125. }
  126. /**
  127. * 获取可调整的订单列表
  128. */
  129. export function fetchAdjustableOrders(params?: { keyword?: string }) {
  130. return request.get({
  131. url: '/web/admin/orders/adjustable',
  132. params
  133. })
  134. }
  135. /**
  136. * 获取订单商品列表
  137. */
  138. export function fetchOrderItems(orderId: string) {
  139. return request.get({
  140. url: `/web/admin/orders/${orderId}/items`
  141. })
  142. }
  143. // =========================================
  144. // 配送任务管理 API
  145. // =========================================
  146. /**
  147. * 获取配送任务列表
  148. */
  149. export function fetchDeliveryList(params: {
  150. page?: number
  151. pageSize?: number
  152. keyword?: string
  153. status?: string
  154. regionId?: string
  155. deliverId?: string
  156. }) {
  157. return request.get<{
  158. list: Api.Delivery.DeliveryTask[]
  159. total: number
  160. page: number
  161. pageSize: number
  162. totalPages: number
  163. }>({
  164. url: '/web/delivery-tasks',
  165. params
  166. })
  167. }
  168. /**
  169. * 获取配送任务详情
  170. */
  171. export function fetchDeliveryDetail(id: string) {
  172. return request.get<Api.Delivery.DeliveryTaskDetail>({
  173. url: `/web/delivery-tasks/${id}`
  174. })
  175. }
  176. // =========================================
  177. // 配送时效预警 API
  178. // =========================================
  179. /**
  180. * 获取配送时效预警列表
  181. */
  182. export function fetchDeliveryWarningList(params: {
  183. page?: number
  184. pageSize?: number
  185. warningType?: string
  186. isResolved?: boolean
  187. regionId?: string
  188. }) {
  189. return request.get({
  190. url: '/web/admin/delivery-warning/list',
  191. params
  192. })
  193. }
  194. /**
  195. * 解决预警
  196. */
  197. export function fetchResolveWarning(id: string, note: string) {
  198. return request.post({
  199. url: `/web/admin/delivery-warning/handle/${id}`,
  200. params: { note }
  201. })
  202. }
  203. /**
  204. * 获取配送预警详情
  205. */
  206. export function fetchDeliveryWarningDetail(id: string) {
  207. return request.get({
  208. url: `/web/admin/delivery-warning/detail/${id}`
  209. })
  210. }
  211. // =========================================
  212. // 询价单管理 API
  213. // =========================================
  214. /**
  215. * 获取询价单列表
  216. */
  217. export function fetchInquiryList(params: {
  218. page?: number
  219. pageSize?: number
  220. keyword?: string
  221. status?: string
  222. regionId?: string
  223. }) {
  224. return request.get({
  225. url: '/web/admin/inquiries',
  226. params
  227. })
  228. }
  229. /**
  230. * 获取询价单详情
  231. */
  232. export function fetchInquiryDetail(id: string) {
  233. return request.get({
  234. url: `/web/admin/inquiries/${id}`
  235. })
  236. }
  237. /**
  238. * 更新询价单
  239. */
  240. export function fetchUpdateInquiry(
  241. id: string,
  242. data: Partial<{ title: string; remark: string; productIds: string[] }>
  243. ) {
  244. return request.put({
  245. url: `/web/admin/inquiries/${id}`,
  246. params: data
  247. })
  248. }
  249. /**
  250. * 创建询价单
  251. */
  252. export function fetchCreateInquiry(data: {
  253. title: string
  254. regionId: string
  255. productIds: string[]
  256. remark?: string
  257. }) {
  258. return request.post({
  259. url: '/web/admin/inquiries',
  260. params: data
  261. })
  262. }
  263. /**
  264. * 发布询价单
  265. */
  266. export function fetchPublishInquiry(id: string) {
  267. return request.post({
  268. url: `/web/admin/inquiries/${id}/publish`
  269. })
  270. }
  271. /**
  272. * 取消发布询价单
  273. */
  274. export function fetchUnpublishInquiry(id: string) {
  275. return request.post({
  276. url: `/web/admin/inquiries/${id}/unpublish`
  277. })
  278. }
  279. /**
  280. * 关闭询价单
  281. */
  282. export function fetchCloseInquiry(id: string) {
  283. return request.post({
  284. url: `/web/admin/inquiries/${id}/close`
  285. })
  286. }
  287. /**
  288. * 获取询价单列表(简单版)
  289. */
  290. export function fetchInquiryListSimple(params?: { status?: string }) {
  291. return request.get({
  292. url: '/web/admin/inquiries/simple',
  293. params
  294. })
  295. }
  296. // =========================================
  297. // 报价管理 API
  298. // =========================================
  299. /**
  300. * 获取报价列表
  301. */
  302. export function fetchQuotationList(params: {
  303. page?: number
  304. pageSize?: number
  305. inquiryId?: string
  306. status?: string
  307. regionId?: string
  308. }) {
  309. return request.get({
  310. url: '/web/admin/quotations',
  311. params
  312. })
  313. }
  314. /**
  315. * 获取报价详情
  316. */
  317. export function fetchQuotationDetail(id: string) {
  318. return request.get({
  319. url: `/web/admin/quotations/${id}`
  320. })
  321. }
  322. /**
  323. * 获取报价对比数据
  324. */
  325. export function fetchQuotationCompareData(inquiryId: string) {
  326. return request.get({
  327. url: '/web/admin/quotation-compare',
  328. params: { inquiryId }
  329. })
  330. }
  331. /**
  332. * 确认选择供应商报价
  333. */
  334. export function fetchConfirmQuotationSupplier(data: {
  335. inquiryId: string
  336. quotationId: string
  337. finalPriceItems?: Array<{
  338. productId: string
  339. price: number
  340. /** 本次发布时使用的临时调价系数(%),用于回显与二次调整 */
  341. pricingCoefficient?: number
  342. }>
  343. }) {
  344. return request.post({
  345. url: '/web/admin/quotations/confirm-supplier',
  346. data
  347. })
  348. }
  349. /**
  350. * 获取某询价单:各供应商最新一次报价(含未报价)
  351. */
  352. export function fetchLatestQuotationsBySupplier(inquiryId: string) {
  353. return request.get<{
  354. inquiryId: string
  355. regionId: string
  356. list: Array<{
  357. supplierId: string
  358. supplierName: string
  359. supplierPhone?: string
  360. quotation: null | {
  361. id: string
  362. status: string
  363. totalAmount: number
  364. submitTime?: string
  365. createAt?: string
  366. items: Array<{
  367. id: string
  368. productId: string
  369. productName?: string
  370. categoryName?: string
  371. unitId?: string
  372. unitName?: string
  373. measureValue?: number | null
  374. price: number
  375. }>
  376. }
  377. }>
  378. total: number
  379. }>({
  380. url: `/web/admin/inquiries/${inquiryId}/quotations/latest-by-supplier`
  381. })
  382. }
  383. /**
  384. * 获取某询价单:全部报价单历史(第三tab)
  385. */
  386. export function fetchQuotationHistoryByInquiry(params: {
  387. inquiryId: string
  388. page?: number
  389. pageSize?: number
  390. supplierId?: string
  391. status?: string
  392. startDate?: string
  393. endDate?: string
  394. }) {
  395. return request.get<{
  396. list: any[]
  397. total: number
  398. page: number
  399. pageSize: number
  400. totalPages: number
  401. }>({
  402. url: `/web/admin/inquiries/${params.inquiryId}/quotations/history`,
  403. params: {
  404. page: params.page,
  405. pageSize: params.pageSize,
  406. supplierId: params.supplierId,
  407. status: params.status,
  408. startDate: params.startDate,
  409. endDate: params.endDate
  410. }
  411. })
  412. }
  413. /**
  414. * 获取某询价单当前被选中的报价/价格明细
  415. */
  416. export function fetchSelectedQuotationByInquiry(inquiryId: string) {
  417. return request.get<any>({
  418. url: `/web/admin/inquiries/${inquiryId}/quotations/selected`
  419. })
  420. }
  421. // =========================================
  422. // 价格清单管理 API
  423. // =========================================
  424. /**
  425. * 获取价格清单列表
  426. */
  427. export function fetchPriceListList(params: {
  428. page?: number
  429. pageSize?: number
  430. regionId?: string
  431. status?: string
  432. }) {
  433. return request.get({
  434. url: '/web/admin/price-lists',
  435. params
  436. })
  437. }
  438. /**
  439. * 获取价格清单详情
  440. */
  441. export function fetchPriceListDetail(id: string) {
  442. return request.get({
  443. url: `/web/admin/price-lists/${id}`
  444. })
  445. }
  446. /**
  447. * 创建价格清单
  448. */
  449. export function fetchCreatePriceList(data: {
  450. regionId: string
  451. supplierId: string
  452. remark?: string
  453. }) {
  454. return request.post({
  455. url: '/web/admin/price-lists',
  456. params: data
  457. })
  458. }
  459. /**
  460. * 发布价格清单
  461. */
  462. export function fetchPublishPriceList(id: string) {
  463. return request.post({
  464. url: `/web/admin/price-lists/${id}/publish`
  465. })
  466. }
  467. // =========================================
  468. // 价格版本管理 API
  469. // =========================================
  470. /**
  471. * 获取价格版本列表
  472. */
  473. export function fetchPriceVersionList(params: {
  474. page?: number
  475. pageSize?: number
  476. regionId?: string
  477. supplierId?: string
  478. status?: string
  479. }) {
  480. return request.get({
  481. url: '/web/admin/price-versions',
  482. params
  483. })
  484. }
  485. /**
  486. * 获取价格版本详情
  487. */
  488. export function fetchPriceVersionDetail(id: string) {
  489. return request.get({
  490. url: `/web/admin/price-versions/${id}`
  491. })
  492. }
  493. /**
  494. * 创建价格版本
  495. */
  496. export function fetchCreatePriceVersion(data: {
  497. regionId: string
  498. supplierId: string
  499. effectiveTime?: string
  500. remark?: string
  501. }) {
  502. return request.post({
  503. url: '/web/admin/price-versions',
  504. params: data
  505. })
  506. }
  507. /**
  508. * 发布价格版本
  509. */
  510. export function fetchPublishPriceVersion(id: string) {
  511. return request.post({
  512. url: `/web/admin/price-versions/${id}/publish`
  513. })
  514. }
  515. /**
  516. * 禁用价格版本
  517. */
  518. export function fetchDisablePriceVersion(id: string) {
  519. return request.post({
  520. url: `/web/admin/price-versions/${id}/disable`
  521. })
  522. }
  523. /**
  524. * 版本对比
  525. */
  526. export function fetchComparePriceVersions(params: { versionIds: string[] }) {
  527. return request.get({
  528. url: '/web/admin/price-versions/compare',
  529. params: { versionIds: params.versionIds.join(',') }
  530. })
  531. }
  532. // =========================================
  533. // 结算管理 API
  534. // =========================================
  535. export function fetchClientSettlementOrderList(params: {
  536. page?: number
  537. pageSize?: number
  538. regionId?: string
  539. clientId?: string
  540. keyword?: string
  541. startDate?: string
  542. endDate?: string
  543. }) {
  544. return request.get<{
  545. list: any[]
  546. total: number
  547. page: number
  548. pageSize: number
  549. totalPages: number
  550. summary: {
  551. pendingAmount: number
  552. currentPageAmount: number
  553. }
  554. }>({
  555. url: '/web/admin/client-settlements/orders',
  556. params
  557. })
  558. }
  559. export function fetchSupplierSettlementOrderList(params: {
  560. page?: number
  561. pageSize?: number
  562. regionId?: string
  563. supplierId?: string
  564. keyword?: string
  565. startDate?: string
  566. endDate?: string
  567. }) {
  568. return request.get<{
  569. list: any[]
  570. total: number
  571. page: number
  572. pageSize: number
  573. totalPages: number
  574. summary: {
  575. pendingAmount: number
  576. currentPageAmount: number
  577. }
  578. }>({
  579. url: '/web/admin/supplier-settlements/orders',
  580. params
  581. })
  582. }
  583. /** 待结算页:已生成结算单的历史金额与历史订单笔数(与当前区域/客户或供应商筛选一致) */
  584. export function fetchClientSettlementHistorySummary(params: {
  585. regionId?: string
  586. clientId?: string
  587. }) {
  588. return request.get<{
  589. historicalSettledAmount: number
  590. historicalSettledOrderCount: number
  591. }>({
  592. url: '/web/admin/client-settlements/history-summary',
  593. params
  594. })
  595. }
  596. export function fetchSupplierSettlementHistorySummary(params: {
  597. regionId?: string
  598. supplierId?: string
  599. }) {
  600. return request.get<{
  601. historicalSettledAmount: number
  602. historicalSettledOrderCount: number
  603. }>({
  604. url: '/web/admin/supplier-settlements/history-summary',
  605. params
  606. })
  607. }
  608. export function fetchCreateClientSettlement(data: {
  609. selectionMode: 'ids' | 'allFiltered'
  610. orderIds?: string[]
  611. filters?: Record<string, any>
  612. excludedOrderIds?: string[]
  613. voucherUrls: string[]
  614. remark?: string
  615. }) {
  616. return request.post({
  617. url: '/web/admin/client-settlements',
  618. params: data
  619. })
  620. }
  621. export function fetchCreateSupplierSettlement(data: {
  622. selectionMode: 'ids' | 'allFiltered'
  623. orderIds?: string[]
  624. filters?: Record<string, any>
  625. excludedOrderIds?: string[]
  626. voucherUrls: string[]
  627. remark?: string
  628. }) {
  629. return request.post({
  630. url: '/web/admin/supplier-settlements',
  631. params: data
  632. })
  633. }
  634. /** 客户结算单(批次)列表 */
  635. export function fetchClientSettlementSheetList(params: {
  636. page?: number
  637. pageSize?: number
  638. regionId?: string
  639. clientId?: string
  640. settlementNo?: string
  641. startDate?: string
  642. endDate?: string
  643. }) {
  644. return request.get<{
  645. list: any[]
  646. total: number
  647. page: number
  648. pageSize: number
  649. totalPages: number
  650. }>({
  651. url: '/web/admin/client-settlements/sheets',
  652. params
  653. })
  654. }
  655. /** 客户结算单详情 */
  656. export function fetchClientSettlementSheetDetail(id: string) {
  657. return request.get<any>({
  658. url: `/web/admin/client-settlements/sheets/${id}`
  659. })
  660. }
  661. /** 更新客户结算单(备注/凭证,服务端写历史表) */
  662. export function fetchUpdateClientSettlementSheet(
  663. id: string,
  664. data: { remark?: string; voucherUrls?: string[] }
  665. ) {
  666. return request.put({
  667. url: `/web/admin/client-settlements/sheets/${id}`,
  668. params: data
  669. })
  670. }
  671. /** 供应商结算单(批次)列表 */
  672. export function fetchSupplierSettlementSheetList(params: {
  673. page?: number
  674. pageSize?: number
  675. regionId?: string
  676. supplierId?: string
  677. settlementNo?: string
  678. startDate?: string
  679. endDate?: string
  680. }) {
  681. return request.get<{
  682. list: any[]
  683. total: number
  684. page: number
  685. pageSize: number
  686. totalPages: number
  687. }>({
  688. url: '/web/admin/supplier-settlements/sheets',
  689. params
  690. })
  691. }
  692. /** 供应商结算单详情 */
  693. export function fetchSupplierSettlementSheetDetail(id: string) {
  694. return request.get<any>({
  695. url: `/web/admin/supplier-settlements/sheets/${id}`
  696. })
  697. }
  698. /** 更新供应商结算单(备注/凭证,服务端写历史表) */
  699. export function fetchUpdateSupplierSettlementSheet(
  700. id: string,
  701. data: { remark?: string; voucherUrls?: string[] }
  702. ) {
  703. return request.put({
  704. url: `/web/admin/supplier-settlements/sheets/${id}`,
  705. params: data
  706. })
  707. }
  708. /**
  709. * 获取结算列表
  710. */
  711. export function fetchSettlementList(params: {
  712. page?: number
  713. pageSize?: number
  714. status?: string
  715. regionId?: string
  716. clientId?: string
  717. }) {
  718. return request.get({
  719. url: '/web/admin/settlements',
  720. params
  721. })
  722. }
  723. /**
  724. * 确认结算
  725. */
  726. export function fetchConfirmSettlement(data: { settlementId: string; note?: string }) {
  727. return request.post({
  728. url: `/web/admin/settlements/${data.settlementId}/confirm`,
  729. params: { note: data.note }
  730. })
  731. }
  732. // =========================================
  733. // 退款管理 API
  734. // =========================================
  735. /**
  736. * 获取退款列表
  737. */
  738. export function fetchRefundList(params: {
  739. page?: number
  740. pageSize?: number
  741. status?: string
  742. orderId?: string
  743. }) {
  744. return request.get({
  745. url: '/web/admin/refunds',
  746. params
  747. })
  748. }
  749. /**
  750. * 获取退款详情
  751. */
  752. export function fetchRefundDetail(id: string) {
  753. return request.get({
  754. url: `/web/admin/refunds/${id}`
  755. })
  756. }
  757. /**
  758. * 处理退款
  759. */
  760. export function fetchProcessRefund(data: { refundId: string; approved: boolean; note?: string }) {
  761. return request.post({
  762. url: `/web/admin/refunds/${data.refundId}/process`,
  763. params: { approved: data.approved, note: data.note }
  764. })
  765. }
  766. // =========================================
  767. // 统计管理 API
  768. // =========================================
  769. /** 运营工作台 / 仪表盘接口返回(与后端 success data 一致,驼峰) */
  770. export interface WorkbenchDashboardData {
  771. todayOrderCount: number
  772. todayOrderAmount: number
  773. monthOrderCount: number
  774. monthOrderAmount: number
  775. pendingDeliveryCount: number
  776. completedOrderCount: number
  777. activePriceListCount: number
  778. customerCount: number
  779. supplierCount: number
  780. todayOrderCountHint?: string
  781. todayOrderAmountHint?: string
  782. deliveryWarningCount?: number
  783. recentOrders?: Array<{
  784. id: string
  785. orderNo: string
  786. clientName: string
  787. regionName: string
  788. totalAmount: number
  789. orderStatus: string
  790. cancelStatus?: string
  791. deliveryStatus?: string
  792. createAt?: string | null
  793. }>
  794. todoSnapshots?: Array<{
  795. type: string
  796. title: string
  797. count: number
  798. items: string[]
  799. }>
  800. }
  801. /**
  802. * 获取统计数据
  803. */
  804. export function fetchStatistics(params: {
  805. type?: string
  806. startDate?: string
  807. endDate?: string
  808. regionId?: string
  809. }) {
  810. return request.get({
  811. url: '/web/admin/statistics/dashboard',
  812. params
  813. })
  814. }
  815. /** 运营工作台专用:同 statistics/dashboard,带类型 */
  816. export function fetchWorkbenchDashboard(params?: { regionId?: string }) {
  817. return request.get<WorkbenchDashboardData>({
  818. url: '/web/admin/statistics/dashboard',
  819. params
  820. })
  821. }
  822. /** 按日订单趋势(与后端 `get_order_trend` 一致;金额单位:元) */
  823. export interface OrderTrendDayItem {
  824. date: string
  825. orderCount: number
  826. orderAmount: number
  827. }
  828. export function fetchOrderTrend(params?: { regionId?: string; days?: number }) {
  829. return request.get<OrderTrendDayItem[]>({
  830. url: '/web/admin/statistics/orders/trend',
  831. params: {
  832. regionId: params?.regionId,
  833. days: params?.days ?? 30
  834. }
  835. })
  836. }
  837. /** 今日各区域订单汇总(金额单位:元) */
  838. export interface TodayRegionOrderStatItem {
  839. regionId: string
  840. regionName: string
  841. orderCount: number
  842. orderAmount: number
  843. }
  844. export function fetchTodayOrdersByRegion(params?: { regionId?: string }) {
  845. return request.get<TodayRegionOrderStatItem[]>({
  846. url: '/web/admin/statistics/orders/today-by-region',
  847. params: {
  848. regionId: params?.regionId
  849. }
  850. })
  851. }
  852. /** 今日下单客户:金额(元) + 商品数量合计 */
  853. export interface TodayClientOrderStatItem {
  854. clientId: string
  855. clientName: string
  856. orderAmount: number
  857. productQuantity: number
  858. }
  859. export function fetchTodayOrdersByClient(params?: { regionId?: string; limit?: number }) {
  860. return request.get<TodayClientOrderStatItem[]>({
  861. url: '/web/admin/statistics/orders/today-by-client',
  862. params: {
  863. regionId: params?.regionId,
  864. limit: params?.limit ?? 30
  865. }
  866. })
  867. }
  868. /**
  869. * 获取 API 请求日志(中间件记录全量出入参)
  870. */
  871. export function fetchApiRequestLogList(params: {
  872. page?: number
  873. pageSize?: number
  874. httpMethod?: string
  875. statusCode?: number
  876. pathPrefix?: string
  877. keyword?: string
  878. startDate?: string
  879. endDate?: string
  880. }) {
  881. return request.get({
  882. url: '/web/admin/api-request-logs',
  883. params
  884. })
  885. }
  886. // =========================================
  887. // 发票管理 API
  888. // =========================================
  889. /**
  890. * 获取发票列表
  891. */
  892. export function fetchInvoiceList(params: {
  893. page?: number
  894. pageSize?: number
  895. invoiceNo?: string
  896. clientName?: string
  897. invoiceType?: string
  898. status?: string
  899. startDate?: string
  900. endDate?: string
  901. }) {
  902. return request.get({
  903. url: '/web/admin/invoice/list',
  904. params
  905. })
  906. }
  907. /**
  908. * 获取发票详情
  909. */
  910. export function fetchInvoiceDetail(id: string) {
  911. return request.get({
  912. url: `/web/admin/invoice/detail/${id}`
  913. })
  914. }
  915. /**
  916. * 创建发票
  917. */
  918. export function fetchCreateInvoice(data: {
  919. orderId: string
  920. invoiceType: string
  921. title: string
  922. taxRate?: number
  923. taxNo?: string
  924. bank?: string
  925. bankAccount?: string
  926. address?: string
  927. phone?: string
  928. remark?: string
  929. }) {
  930. return request.post({
  931. url: '/web/admin/invoice/create',
  932. params: data
  933. })
  934. }
  935. /**
  936. * 开具发票
  937. */
  938. export function fetchIssueInvoice(id: string, invoiceUrl?: string) {
  939. return request.post({
  940. url: `/web/admin/invoice/issue/${id}`,
  941. params: { invoiceUrl }
  942. })
  943. }
  944. /**
  945. * 作废发票
  946. */
  947. export function fetchVoidInvoice(id: string) {
  948. return request.post({
  949. url: `/web/admin/invoice/void/${id}`
  950. })
  951. }
  952. /**
  953. * 下载发票
  954. */
  955. export function fetchDownloadInvoice(id: string) {
  956. return request.get({
  957. url: `/api/invoice/download/${id}`
  958. })
  959. }
  960. // =========================================
  961. // 订单调整 API
  962. // =========================================
  963. /**
  964. * 获取订单调整列表
  965. */
  966. export function fetchOrderAdjustList(params: {
  967. page?: number
  968. pageSize?: number
  969. keyword?: string
  970. adjustType?: string
  971. startDate?: string
  972. endDate?: string
  973. }) {
  974. return request.post({
  975. url: '/web/admin/order-adjust/list',
  976. params
  977. })
  978. }
  979. /**
  980. * 获取订单调整详情
  981. */
  982. export function fetchOrderAdjustDetail(id: string) {
  983. return request.get({
  984. url: `/web/admin/order-adjust/detail/${id}`
  985. })
  986. }
  987. /**
  988. * 发起订单调整
  989. */
  990. export function fetchCreateOrderAdjust(data: {
  991. orderId: string
  992. adjustType: string
  993. productId: string
  994. afterQuantity?: number
  995. substituteProductId?: string
  996. newProductId?: string
  997. newQuantity?: number
  998. reason: string
  999. }) {
  1000. return request.post({
  1001. url: '/web/admin/order-adjust/create',
  1002. params: data
  1003. })
  1004. }
  1005. // =========================================
  1006. // 商品 API
  1007. // =========================================
  1008. /**
  1009. * 获取商品列表(用于替代/补录)
  1010. */
  1011. export function fetchProductListSimple(params?: { keyword?: string; categoryId?: string }) {
  1012. return request.get({
  1013. url: '/web/admin/products/simple',
  1014. params
  1015. })
  1016. }
  1017. /**
  1018. * 上传商品图片
  1019. */
  1020. export function fetchUploadProductImage(data: FormData) {
  1021. return request.post({
  1022. url: '/web/admin/products/upload-image',
  1023. data
  1024. })
  1025. }
  1026. /**
  1027. * 通用附件上传(multipart:business_type、business_id、file)
  1028. */
  1029. export function fetchUploadAttachment(data: FormData) {
  1030. return request.post<{
  1031. id: string
  1032. fileName: string
  1033. fileUrl: string
  1034. fileSize: number
  1035. fileSizeDisplay?: string
  1036. fileType?: string
  1037. }>({
  1038. url: '/web/admin/attachment/upload',
  1039. data
  1040. })
  1041. }
  1042. // =========================================
  1043. // 系统配置 API
  1044. // =========================================
  1045. /**
  1046. * 获取运营端系统设置(配送 / 订单,存于 biz_system_config)
  1047. */
  1048. export function fetchSystemConfig() {
  1049. return request.get({
  1050. url: '/web/admin/system-config/settings'
  1051. })
  1052. }
  1053. /**
  1054. * 更新运营端系统设置
  1055. */
  1056. export function fetchUpdateSystemConfig(data: Record<string, any>) {
  1057. return request.put({
  1058. url: '/web/admin/system-config/settings',
  1059. params: data
  1060. })
  1061. }