business.ts 23 KB

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