فهرست منبع

新增退货 订单分配等

hurx 3 ماه پیش
والد
کامیت
87eea92741
35فایلهای تغییر یافته به همراه5655 افزوده شده و 15 حذف شده
  1. 74 0
      src/api/company/comCurrency/index.ts
  2. 105 0
      src/api/company/comCurrency/types.ts
  3. 74 0
      src/api/company/revenueExpense/index.ts
  4. 135 0
      src/api/company/revenueExpense/types.ts
  5. 75 0
      src/api/order/orderAssignmentLog/index.ts
  6. 162 0
      src/api/order/orderAssignmentLog/types.ts
  7. 26 0
      src/api/order/orderMain/index.ts
  8. 24 0
      src/api/order/orderMain/types.ts
  9. 63 0
      src/api/order/orderReturn/index.ts
  10. 566 0
      src/api/order/orderReturn/types.ts
  11. 63 0
      src/api/order/orderReturnItem/index.ts
  12. 170 0
      src/api/order/orderReturnItem/types.ts
  13. 75 0
      src/api/order/returnReason/index.ts
  14. 110 0
      src/api/order/returnReason/types.ts
  15. 63 0
      src/api/order/revenueDetail/index.ts
  16. 215 0
      src/api/order/revenueDetail/types.ts
  17. 75 0
      src/api/order/revenueHeader/index.ts
  18. 247 0
      src/api/order/revenueHeader/types.ts
  19. 74 0
      src/api/order/workSlipType/index.ts
  20. 110 0
      src/api/order/workSlipType/types.ts
  21. 213 0
      src/views/order/assignmentLog/index.vue
  22. 202 0
      src/views/order/expense/index.vue
  23. 181 0
      src/views/order/orderAssignment/assignmentDialog.vue
  24. 418 0
      src/views/order/orderAssignment/index.vue
  25. 226 0
      src/views/order/orderAssignment/splitAssignDialog.vue
  26. 368 0
      src/views/order/orderDeliver/index.vue
  27. 0 1
      src/views/order/orderMain/components/addressDialog.vue
  28. 3 4
      src/views/order/orderMain/components/chooseProduct.vue
  29. 3 1
      src/views/order/orderMain/index.vue
  30. 283 0
      src/views/order/orderReturn/index.vue
  31. 265 0
      src/views/order/orderReturn/returnDetail.vue
  32. 571 0
      src/views/order/revenueHeader/add.vue
  33. 291 0
      src/views/order/revenueHeader/index.vue
  34. 114 7
      src/views/order/saleOrder/index.vue
  35. 11 2
      src/views/order/saleOrder/sendDetail.vue

+ 74 - 0
src/api/company/comCurrency/index.ts

@@ -0,0 +1,74 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { ComCurrencyVO, ComCurrencyForm, ComCurrencyQuery } from '@/api/company/comCurrency/types';
+
+/**
+ * 查询交易币别配置列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listComCurrency = (query?: ComCurrencyQuery): AxiosPromise<ComCurrencyVO[]> => {
+  return request({
+    url: '/system/comCurrency/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询交易币别配置详细
+ * @param id
+ */
+export const getComCurrency = (id: string | number): AxiosPromise<ComCurrencyVO> => {
+  return request({
+    url: '/system/comCurrency/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增交易币别配置
+ * @param data
+ */
+export const addComCurrency = (data: ComCurrencyForm) => {
+  return request({
+    url: '/system/comCurrency',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改交易币别配置
+ * @param data
+ */
+export const updateComCurrency = (data: ComCurrencyForm) => {
+  return request({
+    url: '/system/comCurrency',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除交易币别配置
+ * @param id
+ */
+export const delComCurrency = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/system/comCurrency/' + id,
+    method: 'delete'
+  });
+};
+export function changeStatus(id: string | number, isShow: string) {
+  const data = {
+    id,
+    isShow
+  };
+  return request({
+    url: '/system/comCurrency/changeStatus',
+    method: 'put',
+    data: data
+  });
+}

+ 105 - 0
src/api/company/comCurrency/types.ts

@@ -0,0 +1,105 @@
+export interface ComCurrencyVO {
+  /**
+   * 主键ID
+   */
+  id: string | number;
+
+  /**
+   * 货币编码
+   */
+  currencyCode: string;
+
+  /**
+   * 货币名称
+   */
+  currencyName: string;
+
+  /**
+   * 是否显示(0-显示,1-不显示)
+   */
+  isShow: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+}
+
+export interface ComCurrencyForm extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 货币编码
+   */
+  currencyCode?: string;
+
+  /**
+   * 货币名称
+   */
+  currencyName?: string;
+
+  /**
+   * 是否显示(0-显示,1-不显示)
+   */
+  isShow?: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+}
+
+export interface ComCurrencyQuery extends PageQuery {
+  /**
+   * 货币编码
+   */
+  currencyCode?: string;
+
+  /**
+   * 货币名称
+   */
+  currencyName?: string;
+
+  /**
+   * 是否显示(0-显示,1-不显示)
+   */
+  isShow?: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 日期范围参数
+   */
+  params?: any;
+}

+ 74 - 0
src/api/company/revenueExpense/index.ts

@@ -0,0 +1,74 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { RevenueExpenseVO, RevenueExpenseForm, RevenueExpenseQuery } from '@/api/company/revenueExpense/types';
+
+/**
+ * 查询收入费用设定列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listRevenueExpense = (query?: RevenueExpenseQuery): AxiosPromise<RevenueExpenseVO[]> => {
+  return request({
+    url: '/system/revenueExpense/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询收入费用设定详细
+ * @param id
+ */
+export const getRevenueExpense = (id: string | number): AxiosPromise<RevenueExpenseVO> => {
+  return request({
+    url: '/system/revenueExpense/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增收入费用设定
+ * @param data
+ */
+export const addRevenueExpense = (data: RevenueExpenseForm) => {
+  return request({
+    url: '/system/revenueExpense',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改收入费用设定
+ * @param data
+ */
+export const updateRevenueExpense = (data: RevenueExpenseForm) => {
+  return request({
+    url: '/system/revenueExpense',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除收入费用设定
+ * @param id
+ */
+export const delRevenueExpense = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/system/revenueExpense/' + id,
+    method: 'delete'
+  });
+};
+export function changeStatus(id: string | number, isShow: string) {
+  const data = {
+    id,
+    isShow
+  };
+  return request({
+    url: '/system/revenueExpense/changeStatus',
+    method: 'put',
+    data: data
+  });
+}

+ 135 - 0
src/api/company/revenueExpense/types.ts

@@ -0,0 +1,135 @@
+export interface RevenueExpenseVO {
+  /**
+   * 主键ID
+   */
+  id: string | number;
+
+  /**
+   * 编码
+   */
+  revenueCode: string;
+
+  /**
+   * 费用名称
+   */
+  revenueName: string;
+
+  /**
+   * 费用类(0 是  1否)
+   */
+  expenseFlag: string;
+
+  /**
+   * 收入类(0 是  1否)
+   */
+  revenueFlag: string;
+
+  /**
+   * 是否显示(0-显示,1-不显示)
+   */
+  isShow: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+}
+
+export interface RevenueExpenseForm extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 编码
+   */
+  revenueCode?: string;
+
+  /**
+   * 费用名称
+   */
+  revenueName?: string;
+
+  /**
+   * 费用类(0 是  1否)
+   */
+  expenseFlag?: string;
+
+  /**
+   * 收入类(0 是  1否)
+   */
+  revenueFlag?: string;
+
+  /**
+   * 是否显示(0-显示,1-不显示)
+   */
+  isShow?: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+}
+
+export interface RevenueExpenseQuery extends PageQuery {
+  /**
+   * 编码
+   */
+  revenueCode?: string;
+
+  /**
+   * 费用名称
+   */
+  revenueName?: string;
+
+  /**
+   * 费用类(0 是  1否)
+   */
+  expenseFlag?: string;
+
+  /**
+   * 收入类(0 是  1否)
+   */
+  revenueFlag?: string;
+
+  /**
+   * 是否显示(0-显示,1-不显示)
+   */
+  isShow?: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 日期范围参数
+   */
+  params?: any;
+}

+ 75 - 0
src/api/order/orderAssignmentLog/index.ts

@@ -0,0 +1,75 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { OrderAssignmentVO, OrderAssignmentForm, OrderAssignmentQuery, OrderSplitAssignForm } from '@/api/order/orderAssignmentLog/types';
+
+/**
+ * 查询订单分配记录列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listOrderAssignment = (query?: OrderAssignmentQuery): AxiosPromise<OrderAssignmentVO[]> => {
+  return request({
+    url: '/order/orderAssignment/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询订单分配记录详细
+ * @param id
+ */
+export const getOrderAssignment = (id: string | number): AxiosPromise<OrderAssignmentVO> => {
+  return request({
+    url: '/order/orderAssignment/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增订单分配记录------整单
+ * @param data
+ */
+export const addOrderAssignment = (data: OrderAssignmentForm) => {
+  return request({
+    url: '/order/orderAssignment',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 新增订单分配记录------拆单
+ * @param data
+ */
+export const addOrderSplitAssign = (data: OrderSplitAssignForm) => {
+  return request({
+    url: '/order/orderAssignment/splitAssign',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改订单分配记录
+ * @param data
+ */
+export const updateOrderAssignment = (data: OrderAssignmentForm) => {
+  return request({
+    url: '/order/orderAssignment',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除订单分配记录
+ * @param id
+ */
+export const delOrderAssignment = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/order/orderAssignment/' + id,
+    method: 'delete'
+  });
+};

+ 162 - 0
src/api/order/orderAssignmentLog/types.ts

@@ -0,0 +1,162 @@
+export interface OrderAssignmentVO {
+  /**
+   * 主键ID
+   */
+  id: string | number;
+
+  /**
+   * 订单ID,关联订单表
+   */
+  orderId: string | number;
+
+  /**
+   * 分配前平台
+   */
+  platformBefore: string;
+
+  /**
+   * 分配后平台
+   */
+  platformAfter: string;
+
+  /**
+   * 分配人
+   */
+  assignedBy: number;
+
+  /**
+   * 分配时间
+   */
+  assignTime: string;
+
+  /**
+   * 分配类型:手动/自动
+   */
+  assignType: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status: string;
+
+  /**
+   * 分配原因
+   */
+  remark: string;
+}
+
+export interface OrderAssignmentForm extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 订单ID,关联订单表
+   */
+  orderId?: string | number;
+
+  orderNo?: string;
+
+  /**
+   * 分配前平台
+   */
+  platformBefore?: string;
+
+  /**
+   * 分配后平台
+   */
+  platformAfter?: string;
+
+  /**
+   * 分配人
+   */
+  assignedBy?: number;
+
+  /**
+   * 分配时间
+   */
+  assignTime?: string;
+
+  /**
+   * 分配类型:手动/自动
+   */
+  assignType?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 分配原因
+   */
+  remark?: string;
+
+  platformCode?: string;
+
+  orderIds?: string;
+}
+
+export interface OrderSplitAssignForm extends BaseEntity {
+  /**
+   * 订单ID,关联订单表
+   */
+  orderId?: string | number;
+
+  itemRules?: Array<OrderProductAssignRule>;
+
+  remark?: string;
+}
+export interface OrderProductAssignRule {
+  itemId?: string | number;
+
+  targetPlatform?: string;
+}
+
+export interface OrderAssignmentQuery extends PageQuery {
+  /**
+   * 订单ID,关联订单表
+   */
+  orderId?: string | number;
+
+  /**
+   * 分配前平台
+   */
+  platformBefore?: string;
+
+  /**
+   * 分配后平台
+   */
+  platformAfter?: string;
+
+  /**
+   * 分配人
+   */
+  assignedBy?: number;
+
+  /**
+   * 分配时间
+   */
+  assignTime?: string;
+
+  /**
+   * 分配类型:手动/自动
+   */
+  assignType?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+  /**
+   * 日期范围参数
+   */
+  params?: any;
+}

+ 26 - 0
src/api/order/orderMain/index.ts

@@ -16,6 +16,20 @@ export const listOrderMain = (query?: OrderMainQuery): AxiosPromise<OrderMainVO[
   });
   });
 };
 };
 
 
+/**
+ * 查询分配订单信息列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listOrderAssignment = (query?: OrderMainQuery): AxiosPromise<OrderMainVO[]> => {
+  return request({
+    url: '/order/orderMain/assignmentList',
+    method: 'get',
+    params: query
+  });
+};
+
 /**
 /**
  * 查询订单主信息详细
  * 查询订单主信息详细
  * @param id
  * @param id
@@ -74,3 +88,15 @@ export const queryOrderStatusStats = () => {
     method: 'get'
     method: 'get'
   });
   });
 };
 };
+
+export function changeCheckStatus(id: string | number, checkStatus: string) {
+  const data = {
+    id,
+    checkStatus
+  };
+  return request({
+    url: '/order/orderMain/checkStatus',
+    method: 'put',
+    data: data
+  });
+}

+ 24 - 0
src/api/order/orderMain/types.ts

@@ -229,13 +229,21 @@ export interface OrderMainVO {
    */
    */
   status: string;
   status: string;
 
 
+  platformCode: string;
+
   dataSource: string;
   dataSource: string;
 
 
+  isSplitChild: string;
+
   /**
   /**
    * 备注
    * 备注
    */
    */
   remark: string;
   remark: string;
 
 
+  checkStatus: string;
+
+  assignmentStatus: string;
+
   orderProductList: any[];
   orderProductList: any[];
 
 
   deliverProductList: any[];
   deliverProductList: any[];
@@ -472,6 +480,8 @@ export interface OrderMainForm extends BaseEntity {
    */
    */
   status?: string;
   status?: string;
 
 
+  isSplitChild: string;
+
   /**
   /**
    * 备注
    * 备注
    */
    */
@@ -479,6 +489,10 @@ export interface OrderMainForm extends BaseEntity {
 
 
   dataSource?: string;
   dataSource?: string;
 
 
+  checkStatus?: string;
+
+  assignmentStatus?: string;
+
   /**
   /**
    * 订单商品明细列表
    * 订单商品明细列表
    */
    */
@@ -603,11 +617,15 @@ export interface OrderMainQuery extends PageQuery {
    */
    */
   orderSource?: string;
   orderSource?: string;
 
 
+  customerName?: string;
+
   /**
   /**
    * 订单状态
    * 订单状态
    */
    */
   orderStatus?: string;
   orderStatus?: string;
 
 
+  orderStatuses?: string;
+
   /**
   /**
    * 下单时间
    * 下单时间
    */
    */
@@ -721,6 +739,12 @@ export interface OrderMainQuery extends PageQuery {
 
 
   dataSource?: string;
   dataSource?: string;
 
 
+  isSplitChild?: string;
+
+  checkStatus?: string;
+
+  assignmentStatus?: string;
+
   /**
   /**
    * 日期范围参数
    * 日期范围参数
    */
    */

+ 63 - 0
src/api/order/orderReturn/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { OrderReturnVO, OrderReturnForm, OrderReturnQuery } from '@/api/order/orderReturn/types';
+
+/**
+ * 查询退货主列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listOrderReturn = (query?: OrderReturnQuery): AxiosPromise<OrderReturnVO[]> => {
+  return request({
+    url: '/order/orderReturn/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询退货主详细
+ * @param id
+ */
+export const getOrderReturn = (id: string | number): AxiosPromise<OrderReturnVO> => {
+  return request({
+    url: '/order/orderReturn/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增退货主
+ * @param data
+ */
+export const addOrderReturn = (data: OrderReturnForm) => {
+  return request({
+    url: '/order/orderReturn',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改退货主
+ * @param data
+ */
+export const updateOrderReturn = (data: OrderReturnForm) => {
+  return request({
+    url: '/order/orderReturn',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除退货主
+ * @param id
+ */
+export const delOrderReturn = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/order/orderReturn/' + id,
+    method: 'delete'
+  });
+};

+ 566 - 0
src/api/order/orderReturn/types.ts

@@ -0,0 +1,566 @@
+export interface OrderReturnVO {
+  /**
+   * 主键ID
+   */
+  id: string | number;
+
+  /**
+   * 原订单id
+   */
+  orderId: string | number;
+
+  /**
+   * 原订单编号
+   */
+  orderNo: string;
+
+  /**
+   * 售后服务类型(如:退货、换货、仅退款等)
+   */
+  serviceType: string;
+
+  /**
+   * 退货申请时间
+   */
+  returnTime: string;
+
+  /**
+   * 退货单号
+   */
+  returnNo: string;
+
+  /**
+   * 客户编号
+   */
+  customerId: string | number;
+
+  /**
+   * 客户编号
+   */
+  customerNo: string;
+
+  /**
+   * 客户姓名
+   */
+  customerName: string;
+
+  /**
+   * 售后金额
+   */
+  afterSaleAmount: number;
+
+  /**
+   * 退货订单状态
+   */
+  returnStatus: string;
+
+  /**
+   * 退货商品总数量
+   */
+  returnProductNum: number;
+
+  /**
+   * 处理完成时间
+   */
+  processingTime: string;
+
+  /**
+   * 退货原因id
+   */
+  returnReasonId: string | number;
+
+  /**
+   * 退货原因
+   */
+  returnReason: string;
+
+  /**
+   * 问题描述
+   */
+  problemDescription: string;
+
+  /**
+   * 凭证图片URL
+   */
+  voucherPhoto: string;
+
+  /**
+   * 运费金额
+   */
+  shippingFee: number;
+
+  /**
+   * 是否承担运费
+   */
+  isShippingFee: string;
+
+  /**
+   * 原订单总金额
+   */
+  orderAmount: number;
+
+  /**
+   * 实际退款金额
+   */
+  returnAmount: number;
+
+  /**
+   * 售后备注
+   */
+  afterSalesRemarks: string;
+
+  /**
+   * 退货方式(如:上门取件、自行寄回)
+   */
+  returnMethod: string;
+
+  /**
+   * 取件人姓名
+   */
+  chargebackName: string;
+
+  /**
+   * 取件联系电话
+   */
+  chargebackPhone: string;
+
+  /**
+   * 预约取件时间
+   */
+  chargebackPickupTime: string;
+
+  /**
+   * 取件省
+   */
+  chargebackProvincial: string;
+
+  /**
+   * 取件市
+   */
+  chargebackCity: string;
+
+  /**
+   * 取件区/县
+   */
+  chargebackCounty: string;
+
+  /**
+   * 取件区/县
+   */
+  provincialCityCounty: string;
+
+  /**
+   * 取件详细地址
+   */
+  chargebackAddress: string;
+
+  /**
+   * 推送状态(如:0-未推送, 1-已推送)
+   */
+  pushStatus: string;
+
+  /**
+   * 物流公司id
+   */
+  logisticsId: string | number;
+
+  /**
+   * 物流公司名称
+   */
+  logisticsName: string;
+
+  /**
+   * 物流单号
+   */
+  logisticsNo: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status: string;
+
+  createTime: string;
+
+  orderReturnItemList: any[];
+
+  /**
+   * 备注
+   */
+  remark: string;
+}
+
+export interface OrderReturnForm extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 原订单id
+   */
+  orderId?: string | number;
+
+  /**
+   * 原订单编号
+   */
+  orderNo?: string;
+
+  /**
+   * 售后服务类型(如:退货、换货、仅退款等)
+   */
+  serviceType?: string;
+
+  /**
+   * 退货申请时间
+   */
+  returnTime?: string;
+
+  /**
+   * 退货单号
+   */
+  returnNo?: string;
+
+  /**
+   * 客户编号
+   */
+  customerId?: string | number;
+
+  /**
+   * 客户编号
+   */
+  customerNo?: string;
+
+  /**
+   * 客户姓名
+   */
+  customerName?: string;
+
+  /**
+   * 售后金额
+   */
+  afterSaleAmount?: number;
+
+  /**
+   * 退货订单状态
+   */
+  returnStatus?: string;
+
+  /**
+   * 退货商品总数量
+   */
+  returnProductNum?: number;
+
+  /**
+   * 处理完成时间
+   */
+  processingTime?: string;
+
+  /**
+   * 退货原因id
+   */
+  returnReasonId?: string | number;
+
+  /**
+   * 退货原因
+   */
+  returnReason?: string;
+
+  /**
+   * 问题描述
+   */
+  problemDescription?: string;
+
+  /**
+   * 凭证图片URL
+   */
+  voucherPhoto?: string;
+
+  /**
+   * 运费金额
+   */
+  shippingFee?: number;
+
+  /**
+   * 是否承担运费
+   */
+  isShippingFee?: string;
+
+  /**
+   * 原订单总金额
+   */
+  orderAmount?: number;
+
+  /**
+   * 实际退款金额
+   */
+  returnAmount?: number;
+
+  /**
+   * 售后备注
+   */
+  afterSalesRemarks?: string;
+
+  /**
+   * 退货方式(如:上门取件、自行寄回)
+   */
+  returnMethod?: string;
+
+  /**
+   * 取件人姓名
+   */
+  chargebackName?: string;
+
+  /**
+   * 取件联系电话
+   */
+  chargebackPhone?: string;
+
+  /**
+   * 预约取件时间
+   */
+  chargebackPickupTime?: string;
+
+  /**
+   * 取件省
+   */
+  chargebackProvincial?: string;
+
+  /**
+   * 取件市
+   */
+  chargebackCity?: string;
+
+  /**
+   * 取件区/县
+   */
+  chargebackCounty?: string;
+
+  /**
+   * 取件区/县
+   */
+  provincialCityCounty?: string;
+
+  /**
+   * 取件详细地址
+   */
+  chargebackAddress?: string;
+
+  /**
+   * 推送状态(如:0-未推送, 1-已推送)
+   */
+  pushStatus?: string;
+
+  /**
+   * 物流公司id
+   */
+  logisticsId?: string | number;
+
+  /**
+   * 物流公司名称
+   */
+  logisticsName?: string;
+
+  /**
+   * 物流单号
+   */
+  logisticsNo?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+
+  orderReturnItemList?: any[];
+}
+
+export interface OrderReturnQuery extends PageQuery {
+  /**
+   * 原订单id
+   */
+  orderId?: string | number;
+
+  /**
+   * 原订单编号
+   */
+  orderNo?: string;
+
+  /**
+   * 售后服务类型(如:退货、换货、仅退款等)
+   */
+  serviceType?: string;
+
+  /**
+   * 退货申请时间
+   */
+  returnTime?: string;
+
+  /**
+   * 退货单号
+   */
+  returnNo?: string;
+
+  /**
+   * 客户编号
+   */
+  customerId?: string | number;
+
+  /**
+   * 客户编号
+   */
+  customerNo?: string;
+
+  /**
+   * 客户姓名
+   */
+  customerName?: string;
+
+  /**
+   * 售后金额
+   */
+  afterSaleAmount?: number;
+
+  /**
+   * 退货订单状态
+   */
+  returnStatus?: string;
+
+  /**
+   * 退货商品总数量
+   */
+  returnProductNum?: number;
+
+  /**
+   * 处理完成时间
+   */
+  processingTime?: string;
+
+  /**
+   * 退货原因id
+   */
+  returnReasonId?: string | number;
+
+  /**
+   * 退货原因
+   */
+  returnReason?: string;
+
+  /**
+   * 问题描述
+   */
+  problemDescription?: string;
+
+  /**
+   * 凭证图片URL
+   */
+  voucherPhoto?: string;
+
+  /**
+   * 运费金额
+   */
+  shippingFee?: number;
+
+  /**
+   * 是否承担运费
+   */
+  isShippingFee?: string;
+
+  /**
+   * 原订单总金额
+   */
+  orderAmount?: number;
+
+  /**
+   * 实际退款金额
+   */
+  returnAmount?: number;
+
+  /**
+   * 售后备注
+   */
+  afterSalesRemarks?: string;
+
+  /**
+   * 退货方式(如:上门取件、自行寄回)
+   */
+  returnMethod?: string;
+
+  /**
+   * 取件人姓名
+   */
+  chargebackName?: string;
+
+  /**
+   * 取件联系电话
+   */
+  chargebackPhone?: string;
+
+  /**
+   * 预约取件时间
+   */
+  chargebackPickupTime?: string;
+
+  /**
+   * 取件省
+   */
+  chargebackProvincial?: string;
+
+  /**
+   * 取件市
+   */
+  chargebackCity?: string;
+
+  /**
+   * 取件区/县
+   */
+  chargebackCounty?: string;
+
+  /**
+   * 取件区/县
+   */
+  provincialCityCounty?: string;
+
+  /**
+   * 取件详细地址
+   */
+  chargebackAddress?: string;
+
+  /**
+   * 推送状态(如:0-未推送, 1-已推送)
+   */
+  pushStatus?: string;
+
+  /**
+   * 物流公司id
+   */
+  logisticsId?: string | number;
+
+  /**
+   * 物流公司名称
+   */
+  logisticsName?: string;
+
+  /**
+   * 物流单号
+   */
+  logisticsNo?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+  /**
+   * 日期范围参数
+   */
+  params?: any;
+}

+ 63 - 0
src/api/order/orderReturnItem/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { OrderReturnItemVO, OrderReturnItemForm, OrderReturnItemQuery } from '@/api/order/orderReturnItem/types';
+
+/**
+ * 查询退货商品明细列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listOrderReturnItem = (query?: OrderReturnItemQuery): AxiosPromise<OrderReturnItemVO[]> => {
+  return request({
+    url: '/order/orderReturnItem/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询退货商品明细详细
+ * @param id
+ */
+export const getOrderReturnItem = (id: string | number): AxiosPromise<OrderReturnItemVO> => {
+  return request({
+    url: '/order/orderReturnItem/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增退货商品明细
+ * @param data
+ */
+export const addOrderReturnItem = (data: OrderReturnItemForm) => {
+  return request({
+    url: '/order/orderReturnItem',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改退货商品明细
+ * @param data
+ */
+export const updateOrderReturnItem = (data: OrderReturnItemForm) => {
+  return request({
+    url: '/order/orderReturnItem',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除退货商品明细
+ * @param id
+ */
+export const delOrderReturnItem = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/order/orderReturnItem/' + id,
+    method: 'delete'
+  });
+};

+ 170 - 0
src/api/order/orderReturnItem/types.ts

@@ -0,0 +1,170 @@
+export interface OrderReturnItemVO {
+  /**
+   * 主键ID
+   */
+  id: string | number;
+
+  /**
+   * 关联的退货单ID
+   */
+  returnId: string | number;
+
+  /**
+   * 原订单明细ID
+   */
+  orderProductId: string | number;
+
+  /**
+   * 商品SKU编码
+   */
+  productSku: string;
+
+  /**
+   * 商品名称
+   */
+  productName: string;
+
+  /**
+   * 本次退货数量
+   */
+  returnQuantity: number;
+
+  /**
+   * 商品单价
+   */
+  unitPrice: number;
+
+  /**
+   * 该项退货总金额
+   */
+  totalAmount: number;
+
+  /**
+   * 该商品的具体退货原因
+   */
+  reasonDetail: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+}
+
+export interface OrderReturnItemForm extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 关联的退货单ID
+   */
+  returnId?: string | number;
+
+  /**
+   * 原订单明细ID
+   */
+  orderProductId?: string | number;
+
+  /**
+   * 商品SKU编码
+   */
+  productSku?: string;
+
+  /**
+   * 商品名称
+   */
+  productName?: string;
+
+  /**
+   * 本次退货数量
+   */
+  returnQuantity?: number;
+
+  /**
+   * 商品单价
+   */
+  unitPrice?: number;
+
+  /**
+   * 该项退货总金额
+   */
+  totalAmount?: number;
+
+  /**
+   * 该商品的具体退货原因
+   */
+  reasonDetail?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+}
+
+export interface OrderReturnItemQuery extends PageQuery {
+  /**
+   * 关联的退货单ID
+   */
+  returnId?: string | number;
+
+  /**
+   * 原订单明细ID
+   */
+  orderProductId?: string | number;
+
+  /**
+   * 商品SKU编码
+   */
+  productSku?: string;
+
+  /**
+   * 商品名称
+   */
+  productName?: string;
+
+  /**
+   * 本次退货数量
+   */
+  returnQuantity?: number;
+
+  /**
+   * 商品单价
+   */
+  unitPrice?: number;
+
+  /**
+   * 该项退货总金额
+   */
+  totalAmount?: number;
+
+  /**
+   * 该商品的具体退货原因
+   */
+  reasonDetail?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+  /**
+   * 日期范围参数
+   */
+  params?: any;
+}

+ 75 - 0
src/api/order/returnReason/index.ts

@@ -0,0 +1,75 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { ReturnReasonVO, ReturnReasonForm, ReturnReasonQuery } from '@/api/order/returnReason/types';
+
+/**
+ * 查询退货原因列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listReturnReason = (query?: ReturnReasonQuery): AxiosPromise<ReturnReasonVO[]> => {
+  return request({
+    url: '/system/returnReason/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询退货原因详细
+ * @param id
+ */
+export const getReturnReason = (id: string | number): AxiosPromise<ReturnReasonVO> => {
+  return request({
+    url: '/system/returnReason/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增退货原因
+ * @param data
+ */
+export const addReturnReason = (data: ReturnReasonForm) => {
+  return request({
+    url: '/system/returnReason',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改退货原因
+ * @param data
+ */
+export const updateReturnReason = (data: ReturnReasonForm) => {
+  return request({
+    url: '/system/returnReason',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除退货原因
+ * @param id
+ */
+export const delReturnReason = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/system/returnReason/' + id,
+    method: 'delete'
+  });
+};
+
+export function changeStatus(id: string | number, isShow: string) {
+  const data = {
+    id,
+    isShow
+  };
+  return request({
+    url: '/system/returnReason/changeStatus',
+    method: 'put',
+    data: data
+  });
+}

+ 110 - 0
src/api/order/returnReason/types.ts

@@ -0,0 +1,110 @@
+export interface ReturnReasonVO {
+  /**
+   * 主键ID
+   */
+  id: string | number;
+
+  /**
+   * 退货原因编号
+   */
+  returnReasonCode: string;
+
+  /**
+   * 退货原因
+   */
+  returnReasonName: string;
+
+  /**
+   * 是否显示
+   */
+  isShow: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+}
+
+export interface ReturnReasonForm extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 退货原因编号
+   */
+  returnReasonCode?: string;
+
+  /**
+   * 退货原因
+   */
+  returnReasonName?: string;
+
+  /**
+   * 是否显示
+   */
+  isShow?: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+}
+
+export interface ReturnReasonQuery extends PageQuery {
+  /**
+   * 退货原因编号
+   */
+  returnReasonCode?: string;
+
+  /**
+   * 退货原因
+   */
+  returnReasonName?: string;
+
+  /**
+   * 是否显示
+   */
+  isShow?: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+  /**
+   * 日期范围参数
+   */
+  params?: any;
+}

+ 63 - 0
src/api/order/revenueDetail/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { RevenueDetailVO, RevenueDetailForm, RevenueDetailQuery } from '@/api/order/revenueDetail/types';
+
+/**
+ * 查询收入单明细列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listRevenueDetail = (query?: RevenueDetailQuery): AxiosPromise<RevenueDetailVO[]> => {
+  return request({
+    url: '/order/revenueDetail/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询收入单明细详细
+ * @param id
+ */
+export const getRevenueDetail = (id: string | number): AxiosPromise<RevenueDetailVO> => {
+  return request({
+    url: '/order/revenueDetail/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增收入单明细
+ * @param data
+ */
+export const addRevenueDetail = (data: RevenueDetailForm) => {
+  return request({
+    url: '/order/revenueDetail',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改收入单明细
+ * @param data
+ */
+export const updateRevenueDetail = (data: RevenueDetailForm) => {
+  return request({
+    url: '/order/revenueDetail',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除收入单明细
+ * @param id
+ */
+export const delRevenueDetail = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/order/revenueDetail/' + id,
+    method: 'delete'
+  });
+};

+ 215 - 0
src/api/order/revenueDetail/types.ts

@@ -0,0 +1,215 @@
+export interface RevenueDetailVO {
+  /**
+   * 主键ID
+   */
+  id: string | number;
+
+  /**
+   * 关联的收入单id
+   */
+  orderRevenueId: string | number;
+
+  /**
+   * 收入类型ID
+   */
+  revenueId: string | number;
+
+  /**
+   * 收入明细编号
+   */
+  revenueCode: string;
+
+  /**
+   * 税率编码
+   */
+  taxRateCode: string;
+
+  /**
+   * 总金额
+   */
+  totalAmount: number;
+
+  /**
+   * 单价
+   */
+  unitPrice: number;
+
+  /**
+   * 数量
+   */
+  quantity: number;
+
+  /**
+   * 平台分账金额
+   */
+  platformAmount: number;
+
+  /**
+   * 平台单价
+   */
+  platformPrice: number;
+
+  /**
+   * 订单类型
+   */
+  orderType: string;
+
+  /**
+   * 明细附件文件路径
+   */
+  revFile: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+}
+
+export interface RevenueDetailForm extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 关联的收入单id
+   */
+  orderRevenueId?: string | number;
+
+  /**
+   * 收入类型ID
+   */
+  revenueId?: string | number;
+
+  /**
+   * 收入明细编号
+   */
+  revenueCode?: string;
+
+  /**
+   * 税率编码
+   */
+  taxRateCode?: string;
+
+  /**
+   * 总金额
+   */
+  totalAmount?: number;
+
+  /**
+   * 单价
+   */
+  unitPrice?: number;
+
+  /**
+   * 数量
+   */
+  quantity?: number;
+
+  /**
+   * 平台分账金额
+   */
+  platformAmount?: number;
+
+  /**
+   * 平台单价
+   */
+  platformPrice?: number;
+
+  /**
+   * 订单类型
+   */
+  orderType?: string;
+
+  /**
+   * 明细附件文件路径
+   */
+  revFile?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+}
+
+export interface RevenueDetailQuery extends PageQuery {
+  /**
+   * 关联的收入单id
+   */
+  orderRevenueId?: string | number;
+
+  /**
+   * 收入类型ID
+   */
+  revenueId?: string | number;
+
+  /**
+   * 收入明细编号
+   */
+  revenueCode?: string;
+
+  /**
+   * 税率编码
+   */
+  taxRateCode?: string;
+
+  /**
+   * 总金额
+   */
+  totalAmount?: number;
+
+  /**
+   * 单价
+   */
+  unitPrice?: number;
+
+  /**
+   * 数量
+   */
+  quantity?: number;
+
+  /**
+   * 平台分账金额
+   */
+  platformAmount?: number;
+
+  /**
+   * 平台单价
+   */
+  platformPrice?: number;
+
+  /**
+   * 订单类型
+   */
+  orderType?: string;
+
+  /**
+   * 明细附件文件路径
+   */
+  revFile?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+  /**
+   * 日期范围参数
+   */
+  params?: any;
+}

+ 75 - 0
src/api/order/revenueHeader/index.ts

@@ -0,0 +1,75 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { RevenueHeaderVO, RevenueHeaderForm, RevenueHeaderQuery } from '@/api/order/revenueHeader/types';
+
+/**
+ * 查询收入单主列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listRevenueHeader = (query?: RevenueHeaderQuery): AxiosPromise<RevenueHeaderVO[]> => {
+  return request({
+    url: '/order/revenueHeader/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询收入单主详细
+ * @param id
+ */
+export const getRevenueHeader = (id: string | number): AxiosPromise<RevenueHeaderVO> => {
+  return request({
+    url: '/order/revenueHeader/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增收入单主
+ * @param data
+ */
+export const addRevenueHeader = (data: RevenueHeaderForm) => {
+  return request({
+    url: '/order/revenueHeader',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改收入单主
+ * @param data
+ */
+export const updateRevenueHeader = (data: RevenueHeaderForm) => {
+  return request({
+    url: '/order/revenueHeader',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除收入单主
+ * @param id
+ */
+export const delRevenueHeader = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/order/revenueHeader/' + id,
+    method: 'delete'
+  });
+};
+
+export function changeStatus(id: string | number, status: string) {
+  const data = {
+    id,
+    status
+  };
+  return request({
+    url: '/order/revenueHeader/changeStatus',
+    method: 'put',
+    data: data
+  });
+}

+ 247 - 0
src/api/order/revenueHeader/types.ts

@@ -0,0 +1,247 @@
+export interface RevenueHeaderVO {
+  /**
+   * 主键ID
+   */
+  id: string | number;
+
+  /**
+   * 收入大类
+   */
+  revenueType: string;
+
+  /**
+   * 收入单号
+   */
+  orderRevenueCode: string;
+
+  /**
+   * 关联的主订单号
+   */
+  incomeOrderCode: string;
+
+  /**
+   * 其他收入子类型
+   */
+  otherRevenueType: string;
+
+  /**
+   * 客户id
+   */
+  customerId: string | number;
+
+  /**
+   * 客户名称
+   */
+  customerName: string;
+
+  /**
+   * 供应商id
+   */
+  supplierId: string | number;
+
+  /**
+   * 是否含税
+   */
+  isPrwTax: string;
+
+  /**
+   * 币种
+   */
+  currencyId: string | number;
+
+  /**
+   * 推送状态
+   */
+  pushStatus: string;
+
+  /**
+   * 附件文件路径或URL
+   */
+  orderFile: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+
+  orderRevenueDetailList: any[];
+}
+
+export interface RevenueHeaderForm extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 收入大类
+   */
+  revenueType?: string;
+
+  /**
+   * 收入单号
+   */
+  orderRevenueCode?: string;
+
+  /**
+   * 关联的主订单号
+   */
+  incomeOrderCode?: string;
+
+  /**
+   * 其他收入子类型
+   */
+  otherRevenueType?: string;
+
+  /**
+   * 客户id
+   */
+  customerId?: string | number;
+
+  /**
+   * 客户名称
+   */
+  customerName?: string;
+
+  /**
+   * 供应商id
+   */
+  supplierId?: string | number;
+
+  /**
+   * 是否含税
+   */
+  isPrwTax?: string;
+
+  /**
+   * 币种
+   */
+  currencyId?: string | number;
+
+  /**
+   * 推送状态
+   */
+  pushStatus?: string;
+
+  /**
+   * 附件文件路径或URL
+   */
+  orderFile?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+
+  companyId?: string | number;
+
+  companyName?: string;
+
+  dataSource?: string;
+
+  businessStaff?: string;
+
+  businessDept?: string;
+
+  customerService?: string;
+
+  customerCode?: string;
+
+  supplierName?: string;
+
+  orderRevenueDetails?: any[];
+}
+
+export interface RevenueHeaderQuery extends PageQuery {
+  /**
+   * 收入大类
+   */
+  revenueType?: string;
+
+  /**
+   * 收入单号
+   */
+  orderRevenueCode?: string;
+
+  /**
+   * 关联的主订单号
+   */
+  incomeOrderCode?: string;
+
+  /**
+   * 其他收入子类型
+   */
+  otherRevenueType?: string;
+
+  /**
+   * 客户id
+   */
+  customerId?: string | number;
+
+  /**
+   * 客户名称
+   */
+  customerName?: string;
+
+  /**
+   * 供应商id
+   */
+  supplierId?: string | number;
+
+  /**
+   * 是否含税
+   */
+  isPrwTax?: string;
+
+  /**
+   * 币种
+   */
+  currencyId?: string | number;
+
+  /**
+   * 推送状态
+   */
+  pushStatus?: string;
+
+  /**
+   * 附件文件路径或URL
+   */
+  orderFile?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+  searchValue?: string;
+
+  createTime?: string;
+
+  businessStaff?: string;
+
+  businessDept?: string;
+
+  customerService?: string;
+
+  customerCode?: string;
+
+  /**
+   * 日期范围参数
+   */
+  params?: any;
+}

+ 74 - 0
src/api/order/workSlipType/index.ts

@@ -0,0 +1,74 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { WorkSlipTypeVO, WorkSlipTypeForm, WorkSlipTypeQuery } from '@/api/order/workSlipType/types';
+
+/**
+ * 查询工单类型列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listWorkSlipType = (query?: WorkSlipTypeQuery): AxiosPromise<WorkSlipTypeVO[]> => {
+  return request({
+    url: '/system/workSlipType/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询工单类型详细
+ * @param id
+ */
+export const getWorkSlipType = (id: string | number): AxiosPromise<WorkSlipTypeVO> => {
+  return request({
+    url: '/system/workSlipType/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增工单类型
+ * @param data
+ */
+export const addWorkSlipType = (data: WorkSlipTypeForm) => {
+  return request({
+    url: '/system/workSlipType',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改工单类型
+ * @param data
+ */
+export const updateWorkSlipType = (data: WorkSlipTypeForm) => {
+  return request({
+    url: '/system/workSlipType',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除工单类型
+ * @param id
+ */
+export const delWorkSlipType = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/system/workSlipType/' + id,
+    method: 'delete'
+  });
+};
+export function changeStatus(id: string | number, isShow: string) {
+  const data = {
+    id,
+    isShow
+  };
+  return request({
+    url: '/system/workSlipType/changeStatus',
+    method: 'put',
+    data: data
+  });
+}

+ 110 - 0
src/api/order/workSlipType/types.ts

@@ -0,0 +1,110 @@
+export interface WorkSlipTypeVO {
+  /**
+   * 主键ID
+   */
+  id: string | number;
+
+  /**
+   * 工单类型编号
+   */
+  workSlipTypeCode: string;
+
+  /**
+   * 工单类型名称
+   */
+  workSlipTypeName: string;
+
+  /**
+   * 是否显示
+   */
+  isShow: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+}
+
+export interface WorkSlipTypeForm extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 工单类型编号
+   */
+  workSlipTypeCode?: string;
+
+  /**
+   * 工单类型名称
+   */
+  workSlipTypeName?: string;
+
+  /**
+   * 是否显示
+   */
+  isShow?: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+}
+
+export interface WorkSlipTypeQuery extends PageQuery {
+  /**
+   * 工单类型编号
+   */
+  workSlipTypeCode?: string;
+
+  /**
+   * 工单类型名称
+   */
+  workSlipTypeName?: string;
+
+  /**
+   * 是否显示
+   */
+  isShow?: string;
+
+  /**
+   * 数据来源
+   */
+  dataSource?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+  /**
+   * 日期范围参数
+   */
+  params?: any;
+}

+ 213 - 0
src/views/order/assignmentLog/index.vue

@@ -0,0 +1,213 @@
+<template>
+  <div class="p-2">
+    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+      <div v-show="showSearch" class="mb-[10px]">
+        <el-card shadow="hover">
+          <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="100px">
+            <el-form-item label="分配前平台" prop="platformBefore">
+              <el-select v-model="queryParams.platformBefore" clearable>
+                <el-option v-for="dict in sys_platform_code" :key="dict.value" :label="dict.label" :value="dict.value" />
+              </el-select>
+            </el-form-item>
+            <el-form-item label="分配后平台" prop="platformAfter">
+              <el-select v-model="queryParams.platformAfter" clearable>
+                <el-option v-for="dict in sys_platform_code" :key="dict.value" :label="dict.label" :value="dict.value" />
+              </el-select>
+            </el-form-item>
+            <el-form-item label="分配时间" prop="dateRange">
+              <el-date-picker v-model="dateRange" type="daterange" range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间" />
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+              <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+            </el-form-item>
+          </el-form>
+        </el-card>
+      </div>
+    </transition>
+
+    <el-card shadow="never">
+      <template #header>
+        <el-row :gutter="10" class="mb8"> <el-col :span="18"> 订单分配记录 </el-col></el-row>
+      </template>
+
+      <el-table v-loading="loading" border :data="orderAssignmentList" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column label="订单编号" align="center" prop="orderNo" />
+        <el-table-column label="分配前平台" align="center" prop="platformBefore" />
+        <el-table-column label="分配后平台" align="center" prop="platformAfter" />
+        <el-table-column label="分配时间" align="center" prop="assignTime" width="180">
+          <template #default="scope">
+            <span>{{ scope.row.assignTime }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="分配类型" align="center" prop="assignType">
+          <template #default="scope">
+            <dict-tag :options="order_assign_type" :value="scope.row.assignType" />
+          </template>
+        </el-table-column>
+        <el-table-column label="分配原因" align="center" prop="remark" />
+      </el-table>
+
+      <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+    </el-card>
+    <!-- 添加或修改订单分配记录对话框 -->
+    <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> </el-dialog>
+  </div>
+</template>
+
+<script setup name="OrderAssignment" lang="ts">
+import { listOrderAssignment, getOrderAssignment, addOrderAssignment, updateOrderAssignment } from '@/api/order/orderAssignmentLog';
+import { OrderAssignmentVO, OrderAssignmentQuery, OrderAssignmentForm } from '@/api/order/orderAssignmentLog/types';
+
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { sys_platform_code, order_assign_type } = toRefs<any>(proxy?.useDict('sys_platform_code', 'order_assign_type'));
+const orderAssignmentList = ref<OrderAssignmentVO[]>([]);
+const buttonLoading = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref<Array<string | number>>([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+const dateRange = ref<[DateModelType, DateModelType]>(['', '']);
+const queryFormRef = ref<ElFormInstance>();
+const orderAssignmentFormRef = ref<ElFormInstance>();
+
+const dialog = reactive<DialogOption>({
+  visible: false,
+  title: ''
+});
+
+const initFormData: OrderAssignmentForm = {
+  id: undefined,
+  orderId: undefined,
+  platformBefore: undefined,
+  platformAfter: undefined,
+  assignedBy: undefined,
+  assignTime: undefined,
+  assignType: undefined,
+  status: undefined,
+  remark: undefined
+};
+const data = reactive<PageData<OrderAssignmentForm, OrderAssignmentQuery>>({
+  form: { ...initFormData },
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    orderId: undefined,
+    platformBefore: undefined,
+    platformAfter: undefined,
+    assignedBy: undefined,
+    assignTime: undefined,
+    assignType: undefined,
+    status: undefined,
+    platformCode: undefined,
+    params: {}
+  },
+  rules: {
+    platformAfter: [{ required: true, message: '分配后平台不能为空', trigger: 'blur' }]
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询订单分配记录列表 */
+const getList = async () => {
+  loading.value = true;
+  const res = await listOrderAssignment(proxy?.addDateRange(queryParams.value, dateRange.value));
+  orderAssignmentList.value = res.rows;
+  total.value = res.total;
+  loading.value = false;
+};
+
+/** 取消按钮 */
+const cancel = () => {
+  reset();
+  dialog.visible = false;
+};
+
+/** 表单重置 */
+const reset = () => {
+  form.value = { ...initFormData };
+  orderAssignmentFormRef.value?.resetFields();
+};
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.value.pageNum = 1;
+  getList();
+};
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  dateRange.value = ['', ''];
+  queryFormRef.value?.resetFields();
+  handleQuery();
+};
+
+/** 多选框选中数据 */
+const handleSelectionChange = (selection: OrderAssignmentVO[]) => {
+  ids.value = selection.map((item) => item.id);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+};
+
+/** 新增按钮操作 */
+const handleAdd = () => {
+  reset();
+  dialog.visible = true;
+  dialog.title = '添加订单分配记录';
+};
+
+/** 修改按钮操作 */
+const handleUpdate = async (row?: OrderAssignmentVO) => {
+  reset();
+  const _id = row?.id || ids.value[0];
+  const res = await getOrderAssignment(_id);
+  Object.assign(form.value, res.data);
+  dialog.visible = true;
+  dialog.title = '修改订单分配记录';
+};
+
+/** 提交按钮 */
+const submitForm = () => {
+  orderAssignmentFormRef.value?.validate(async (valid: boolean) => {
+    if (valid) {
+      buttonLoading.value = true;
+      if (form.value.id) {
+        await updateOrderAssignment(form.value).finally(() => (buttonLoading.value = false));
+      } else {
+        await addOrderAssignment(form.value).finally(() => (buttonLoading.value = false));
+      }
+      proxy?.$modal.msgSuccess('操作成功');
+      dialog.visible = false;
+      await getList();
+    }
+  });
+};
+
+/** 删除按钮操作 */
+// const handleDelete = async (row?: OrderAssignmentVO) => {
+//   const _ids = row?.id || ids.value;
+//   await proxy?.$modal.confirm('是否确认删除订单分配记录编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
+//   await delOrderAssignment(_ids);
+//   proxy?.$modal.msgSuccess('删除成功');
+//   await getList();
+// };
+
+/** 导出按钮操作 */
+const handleExport = () => {
+  proxy?.download(
+    'order/orderAssignment/export',
+    {
+      ...queryParams.value
+    },
+    `orderAssignment_${new Date().getTime()}.xlsx`
+  );
+};
+
+onMounted(() => {
+  getList();
+});
+</script>

+ 202 - 0
src/views/order/expense/index.vue

@@ -0,0 +1,202 @@
+<template>
+  <div class="p-2">
+    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+      <div v-show="showSearch" class="mb-[10px]">
+        <el-card shadow="hover">
+          <el-form ref="queryFormRef" :model="queryParams" :inline="true">
+            <el-form-item label="单据编号" prop="orderRevenueCode">
+              <el-input v-model="queryParams.orderRevenueCode" placeholder="请输入单据编号" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="单据日期" prop="createTime">
+              <el-input v-model="queryParams.createTime" placeholder="请选择单据日期" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="关键字" prop="searchValue">
+              <el-input v-model="queryParams.searchValue" placeholder="供应商名称/编号" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+              <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+            </el-form-item>
+          </el-form>
+        </el-card>
+      </div>
+    </transition>
+
+    <el-card shadow="never">
+      <template #header>
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="22"> 费用单信息列表 </el-col>
+        </el-row>
+      </template>
+
+      <el-table v-loading="loading" border :data="revenueHeaderList" @selection-change="handleSelectionChange">
+        <el-table-column label="单据日期" align="center" prop="createTime">
+          <template #default="scope">
+            <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="单据编号" align="center" prop="orderRevenueCode" />
+        <el-table-column label="供应商" align="center" prop="supplierName" />
+        <el-table-column label="产品经理" align="center" prop="" />
+        <el-table-column label="采购员" align="center" prop="" />
+        <el-table-column label="含税金额" align="center" prop="totalAmount">
+          <template #default="scope">
+            <span>{{ Number(scope.row.totalAmount || 0).toFixed(2) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="备注" align="center" prop="remark" />
+        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+          <template #default="scope">
+            <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['order:revenueHeader:edit']">编辑</el-button>
+            <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['order:revenueHeader:remove']">删除</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+    </el-card>
+    <!-- 添加或修改收入单主对话框 -->
+  </div>
+</template>
+
+<script setup name="RevenueHeader" lang="ts">
+import { listRevenueHeader, delRevenueHeader } from '@/api/order/revenueHeader';
+import { RevenueHeaderVO, RevenueHeaderQuery, RevenueHeaderForm } from '@/api/order/revenueHeader/types';
+
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { sys_platform_yes_no, check_status, revenue_type } = toRefs<any>(proxy?.useDict('sys_platform_yes_no', 'check_status', 'revenue_type'));
+
+const revenueHeaderList = ref<RevenueHeaderVO[]>([]);
+const buttonLoading = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref<Array<string | number>>([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+const router = useRouter();
+const queryFormRef = ref<ElFormInstance>();
+const revenueHeaderFormRef = ref<ElFormInstance>();
+
+const dialog = reactive<DialogOption>({
+  visible: false,
+  title: ''
+});
+
+const initFormData: RevenueHeaderForm = {
+  id: undefined,
+  revenueType: undefined,
+  orderRevenueCode: undefined,
+  incomeOrderCode: undefined,
+  otherRevenueType: undefined,
+  customerId: undefined,
+  supplierId: undefined,
+  isPrwTax: undefined,
+  currencyId: undefined,
+  pushStatus: undefined,
+  orderFile: undefined,
+  status: undefined,
+  remark: undefined
+};
+const data = reactive<PageData<RevenueHeaderForm, RevenueHeaderQuery>>({
+  form: { ...initFormData },
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    revenueType: '1',
+    orderRevenueCode: undefined,
+    incomeOrderCode: undefined,
+    otherRevenueType: undefined,
+    customerId: undefined,
+    supplierId: undefined,
+    isPrwTax: undefined,
+    currencyId: undefined,
+    pushStatus: undefined,
+    orderFile: undefined,
+    status: undefined,
+    platformCode: undefined,
+    params: {}
+  },
+  rules: {}
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询收入单主列表 */
+const getList = async () => {
+  loading.value = true;
+  const res = await listRevenueHeader(queryParams.value);
+  revenueHeaderList.value = res.rows;
+  total.value = res.total;
+  loading.value = false;
+};
+
+/** 取消按钮 */
+const cancel = () => {
+  reset();
+  dialog.visible = false;
+};
+
+/** 表单重置 */
+const reset = () => {
+  form.value = { ...initFormData };
+  revenueHeaderFormRef.value?.resetFields();
+};
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.value.pageNum = 1;
+  getList();
+};
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value?.resetFields();
+  handleQuery();
+};
+
+/** 多选框选中数据 */
+const handleSelectionChange = (selection: RevenueHeaderVO[]) => {
+  ids.value = selection.map((item) => item.id);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+};
+
+/** 修改按钮操作 */
+const handleUpdate = async (row?: RevenueHeaderVO) => {
+  reset();
+  const _id = row?.id || ids.value[0];
+  router.push({
+    path: '/order-center/order-revenue-add',
+    query: { revenueType: row.revenueType, id: _id }
+  });
+};
+
+/** 删除按钮操作 */
+const handleDelete = async (row?: RevenueHeaderVO) => {
+  const _ids = row?.id || ids.value;
+  await proxy?.$modal.confirm('是否确认删除收入单主编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
+  await delRevenueHeader(_ids);
+  proxy?.$modal.msgSuccess('删除成功');
+  await getList();
+};
+
+/** 导出按钮操作 */
+const handleExport = () => {
+  proxy?.download(
+    'order/revenueHeader/export',
+    {
+      ...queryParams.value
+    },
+    `revenueHeader_${new Date().getTime()}.xlsx`
+  );
+};
+
+onMounted(() => {
+  getList();
+});
+
+onActivated(() => {
+  getList();
+});
+</script>

+ 181 - 0
src/views/order/orderAssignment/assignmentDialog.vue

@@ -0,0 +1,181 @@
+<template>
+  <el-drawer v-model="drawer.visible" :title="drawer.title" size="500px" direction="rtl" :before-close="handleClose">
+    <div class="drawer-content">
+      <el-form ref="orderAssignmentFormRef" :model="form" :rules="rules" label-width="120px">
+        <el-form-item label="订单编号" v-if="form.orderNo">
+          <span class="form-value">{{ form.orderNo }}</span>
+        </el-form-item>
+
+        <el-form-item label="订单数量" v-if="orderCount > 1">
+          <span class="form-value">{{ orderCount }} 个订单</span>
+        </el-form-item>
+
+        <el-divider v-if="form.platformCode" />
+
+        <el-form-item label="当前平台" v-if="form.platformCode">
+          <dict-tag :options="sys_platform_code" :value="form.platformCode" />
+        </el-form-item>
+
+        <el-form-item label="分配后平台" prop="platformAfter">
+          <el-select v-model="form.platformAfter" placeholder="请选择平台" style="width: 100%" filterable clearable>
+            <el-option v-for="dict in sys_platform_code" :key="dict.value" :label="dict.label" :value="dict.value" />
+          </el-select>
+        </el-form-item>
+
+        <el-divider content-position="left">分配原因</el-divider>
+
+        <el-form-item label-width="0" prop="remark">
+          <el-input v-model="form.remark" type="textarea" :rows="6" placeholder="请输入分配原因(选填)" maxlength="500" show-word-limit />
+        </el-form-item>
+      </el-form>
+    </div>
+
+    <template #footer>
+      <div class="drawer-footer">
+        <el-button @click="cancel">取 消</el-button>
+        <el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
+      </div>
+    </template>
+  </el-drawer>
+</template>
+
+<style scoped lang="scss">
+.drawer-content {
+  padding: 0 20px 20px;
+  height: calc(100% - 60px);
+  overflow-y: auto;
+}
+
+.drawer-footer {
+  display: flex;
+  justify-content: flex-end;
+  gap: 10px;
+  padding: 10px 20px;
+  border-top: 1px solid #e4e7ed;
+}
+
+.form-value {
+  font-weight: 500;
+  color: #303133;
+  font-size: 14px;
+}
+
+:deep(.el-divider__text) {
+  font-weight: 600;
+  font-size: 14px;
+}
+
+:deep(.el-form-item__label) {
+  font-weight: 500;
+}
+</style>
+<script setup name="OrderAssignmentDialog" lang="ts">
+import { getOrderAssignment, addOrderAssignment, updateOrderAssignment } from '@/api/order/orderAssignmentLog';
+import { OrderAssignmentForm } from '@/api/order/orderAssignmentLog/types';
+
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { sys_platform_code } = toRefs<any>(proxy?.useDict('sys_platform_code'));
+
+const emit = defineEmits(['success']);
+
+const buttonLoading = ref(false);
+const orderAssignmentFormRef = ref<ElFormInstance>();
+const orderCount = ref(0); // 订单数量
+
+const drawer = reactive<DialogOption>({
+  visible: false,
+  title: ''
+});
+
+const initFormData: OrderAssignmentForm = {
+  id: undefined,
+  orderId: undefined,
+  orderIds: undefined,
+  orderNo: undefined,
+  platformBefore: undefined,
+  platformAfter: undefined,
+  assignedBy: undefined,
+  assignTime: undefined,
+  assignType: '0',
+  status: undefined,
+  remark: undefined
+};
+
+const data = reactive<PageData<OrderAssignmentForm, any>>({
+  form: { ...initFormData },
+  queryParams: {},
+  rules: {
+    platformAfter: [{ required: true, message: '分配后平台不能为空', trigger: 'blur' }]
+  }
+});
+
+const { form, rules } = toRefs(data);
+
+/** 打开对话框 */
+const open = async (orderIds: Array<string | number>, orderNo?: string, platformCode?: string) => {
+  reset();
+  drawer.visible = true;
+  drawer.title = orderIds.length > 1 ? '批量整单分配' : '整单分配';
+
+  form.value.orderNo = orderNo;
+  form.value.platformCode = platformCode;
+  orderCount.value = orderIds.length;
+
+  // 如果是单个订单,可以查询已有的分配信息
+  if (orderIds.length === 1) {
+    try {
+      form.value.orderIds = orderIds[0] as string;
+    } catch (error) {}
+  } else {
+    // 批量分配
+    form.value.orderIds = orderIds.join(',');
+  }
+};
+
+/** 表单重置 */
+const reset = () => {
+  form.value = { ...initFormData };
+  orderAssignmentFormRef.value?.resetFields();
+};
+
+/** 取消按钮 */
+const cancel = () => {
+  drawer.visible = false;
+  reset();
+};
+
+/** 关闭前的回调 */
+const handleClose = (done: () => void) => {
+  if (buttonLoading.value) {
+    return;
+  }
+  done();
+  reset();
+};
+
+/** 提交按钮 */
+const submitForm = () => {
+  orderAssignmentFormRef.value?.validate(async (valid: boolean) => {
+    if (valid) {
+      buttonLoading.value = true;
+      try {
+        if (form.value.id) {
+          await updateOrderAssignment(form.value);
+          proxy?.$modal.msgSuccess('修改成功');
+        } else {
+          await addOrderAssignment(form.value);
+          proxy?.$modal.msgSuccess('分配成功');
+        }
+        drawer.visible = false;
+        emit('success');
+      } finally {
+        buttonLoading.value = false;
+      }
+    }
+  });
+};
+
+defineExpose({
+  open
+});
+</script>

+ 418 - 0
src/views/order/orderAssignment/index.vue

@@ -0,0 +1,418 @@
+<template>
+  <div class="p-2">
+    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+      <div v-show="showSearch" class="mb-[10px]">
+        <el-card shadow="hover">
+          <el-form ref="queryFormRef" :model="queryParams" :inline="true">
+            <el-form-item label="订单编号" prop="orderNo">
+              <el-input v-model="queryParams.orderNo" placeholder="请输入订单编号" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="客户编号" prop="customerCode">
+              <el-input v-model="queryParams.customerCode" placeholder="请输入客户编号" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="客户名称" prop="customerName">
+              <el-input v-model="queryParams.customerName" placeholder="请输入客户名称" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="订单来源" prop="orderSource">
+              <el-select v-model="queryParams.orderSource" placeholder="请选择订单来源" clearable>
+                <el-option v-for="dict in order_source" :key="dict.value" :label="dict.label" :value="dict.value" />
+              </el-select>
+            </el-form-item>
+            <!-- <el-form-item label="订单状态" prop="orderStatus">
+              <el-select v-model="queryParams.orderStatus" placeholder="请选择订单状态" clearable>
+                <el-option v-for="dict in order_status" :key="dict.value" :label="dict.label" :value="dict.value" />
+              </el-select>
+            </el-form-item> -->
+
+            <el-form-item label="提交时间" prop="dateRange">
+              <el-date-picker v-model="dateRange" type="daterange" range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间" />
+            </el-form-item>
+
+            <el-form-item>
+              <el-button type="primary" icon="Search" @click="handleQuery()">搜索</el-button>
+              <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+            </el-form-item>
+          </el-form>
+        </el-card>
+      </div>
+    </transition>
+
+    <el-card shadow="never">
+      <template #header>
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="18"> 订单分配列表 </el-col>
+          <el-col :span="1.5">
+            <el-button type="primary" :disabled="!ids.length" plain @click="handleAssignment(null)">批量整单分配</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="primary" :disabled="!ids.length" plain>关闭订单</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="primary" :disabled="!ids.length" plain>删除订单</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="primary" :disabled="!ids.length" plain>导出订单</el-button>
+          </el-col>
+        </el-row>
+      </template>
+
+      <el-table v-loading="loading" border :data="orderMainList" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column label="订单时间" align="center" prop="orderTime" />
+        <el-table-column label="订单编号" align="center" prop="orderNo" />
+        <el-table-column label="客户编号" align="center" prop="customerCode" />
+        <el-table-column label="订单总金额" align="center" prop="totalAmount" />
+        <el-table-column label="支付方式" align="center" prop="payType">
+          <template #default="scope">
+            <dict-tag :options="pay_method" :value="scope.row.payType" />
+          </template>
+        </el-table-column>
+        <el-table-column label="业务员" align="center" prop="businessStaff" />
+        <el-table-column label="客服" align="center" prop="customerService" />
+        <el-table-column label="归属部门" align="center" prop="businessDept" />
+        <el-table-column label="订单来源" align="center" prop="orderSource">
+          <template #default="scope">
+            <dict-tag :options="order_source" :value="scope.row.orderSource" />
+          </template>
+        </el-table-column>
+        <el-table-column label="分配状态" align="center" prop="assignmentStatus">
+          <template #default="scope">
+            <dict-tag :options="order_assignment_status" :value="scope.row.assignmentStatus" />
+          </template>
+        </el-table-column>
+        <el-table-column label="当前平台" align="center" prop="platformCode">
+          <template #default="scope">
+            <dict-tag :options="sys_platform_code" :value="scope.row.platformCode" />
+          </template>
+        </el-table-column>
+
+        <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="180">
+          <template #default="scope">
+            <el-button link type="primary" @click="handleReview(scope.row)">查看</el-button>
+            <el-button
+              link
+              type="primary"
+              v-if="scope.row.checkStatus == '1' && scope.row.assignmentStatus == '0'"
+              @click="handleAssignment(scope.row)"
+              >订单分配</el-button
+            >
+            <el-button
+              link
+              type="primary"
+              v-if="scope.row.checkStatus == '1' && scope.row.assignmentStatus == '1'"
+              @click="handleAssignment(scope.row)"
+              >重新分配</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+    </el-card>
+
+    <!-- 订单分配对话框 -->
+    <assignment-dialog ref="assignmentDialogRef" @success="getList" />
+    <!-- 拆单分配对话框 -->
+    <split-assign-dialog ref="splitAssignDialogRef" @success="getList" />
+  </div>
+</template>
+
+<script setup name="OrderAssignment" lang="ts">
+import { listOrderAssignment, getOrderMain, delOrderMain } from '@/api/order/orderMain';
+import { OrderMainVO, OrderMainQuery, OrderMainForm } from '@/api/order/orderMain/types';
+import AssignmentDialog from './assignmentDialog.vue';
+import SplitAssignDialog from './splitAssignDialog.vue';
+import { ElMessageBox } from 'element-plus';
+import { h } from 'vue';
+
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { order_assignment_status, order_check_status, pay_method, order_source, sys_platform_code } = toRefs<any>(
+  proxy?.useDict('order_assignment_status', 'order_check_status', 'pay_method', 'order_source', 'sys_platform_code')
+);
+
+const orderMainList = ref<OrderMainVO[]>([]);
+const buttonLoading = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref<Array<string | number>>([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+const router = useRouter();
+const queryFormRef = ref<ElFormInstance>();
+const orderMainFormRef = ref<ElFormInstance>();
+const assignmentDialogRef = ref<InstanceType<typeof AssignmentDialog>>();
+const splitAssignDialogRef = ref<InstanceType<typeof SplitAssignDialog>>();
+const assignTypeValue = ref('1'); // 分配类型选择值
+
+const dateRange = ref<[DateModelType, DateModelType]>(['', '']);
+const dialog = reactive<DialogOption>({
+  visible: false,
+  title: ''
+});
+
+const initFormData: OrderMainForm = {
+  id: undefined,
+  orderNo: undefined,
+  shipmentNo: undefined,
+  subOrderNo: undefined,
+  companyId: undefined,
+  customerId: undefined,
+  customerCode: undefined,
+  userId: undefined,
+  shippingAddressId: undefined,
+  purchaseReason: undefined,
+  invoiceType: undefined,
+  payType: undefined,
+  warehouseId: undefined,
+  creditLimit: undefined,
+  expectedDeliveryTime: undefined,
+  businessStaff: undefined,
+  customerService: undefined,
+  businessDept: undefined,
+  userDept: undefined,
+  productQuantity: undefined,
+  shippingFee: undefined,
+  totalAmount: undefined,
+  payableAmount: undefined,
+  paymentStatus: undefined,
+  orderSource: undefined,
+  orderStatus: undefined,
+  orderTime: undefined,
+  confirmTime: undefined,
+  shippingTime: undefined,
+  receivingTime: undefined,
+  shippedQuantity: undefined,
+  unshippedQuantity: undefined,
+  packageCount: undefined,
+  signedQuantity: undefined,
+  afterSaleCompleted: undefined,
+  afterSalePending: undefined,
+  deliveryDesc: undefined,
+  pushStatus: undefined,
+  attachmentPath: undefined,
+  deliveryType: undefined,
+  orderCategory: undefined,
+  productCode: undefined,
+  cancelReason: undefined,
+  expenseType: undefined,
+  userNo: undefined,
+  status: undefined,
+  remark: undefined,
+  orderProductBos: [],
+  customerSalesInfoVo: {}
+};
+const data = reactive<PageData<OrderMainForm, OrderMainQuery>>({
+  form: { ...initFormData },
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    checkStatus: '1',
+    orderNo: undefined,
+    shipmentNo: undefined,
+    subOrderNo: undefined,
+    companyId: undefined,
+    customerCode: undefined,
+    customerId: undefined,
+    userId: undefined,
+    payType: undefined,
+    warehouseId: undefined,
+    expectedDeliveryTime: undefined,
+    businessStaff: undefined,
+    customerService: undefined,
+    businessDept: undefined,
+    productQuantity: undefined,
+    totalAmount: undefined,
+    payableAmount: undefined,
+    paymentStatus: undefined,
+    orderSource: undefined,
+    orderStatus: undefined,
+    orderTime: undefined,
+    confirmTime: undefined,
+    status: undefined,
+    isSplitChild: '1',
+    params: {}
+  },
+  rules: {}
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询订单主信息列表 */
+const getList = async () => {
+  loading.value = true;
+  const res = await listOrderAssignment(proxy?.addDateRange(queryParams.value, dateRange.value));
+  orderMainList.value = res.rows;
+  total.value = res.total;
+  loading.value = false;
+};
+
+/** 取消按钮 */
+const cancel = () => {
+  reset();
+  dialog.visible = false;
+};
+
+/** 表单重置 */
+const reset = () => {
+  form.value = { ...initFormData };
+  orderMainFormRef.value?.resetFields();
+};
+
+/** 搜索按钮操作 */
+const handleQuery = (orderStatus?: string) => {
+  if (orderStatus) {
+    queryParams.value.orderStatus = orderStatus;
+  } else {
+    queryParams.value.orderStatus = undefined;
+  }
+  queryParams.value.pageNum = 1;
+  getList();
+};
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  dateRange.value = ['', ''];
+  queryFormRef.value?.resetFields();
+  handleQuery();
+};
+
+/** 多选框选中数据 */
+const handleSelectionChange = (selection: OrderMainVO[]) => {
+  ids.value = selection.map((item) => item.id);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+};
+
+const handleReview = (row?: OrderMainVO) => {
+  router.push({
+    path: '/order-center/order-sendDetail',
+    query: { id: row.id }
+  });
+};
+
+/** 订单分配按钮操作 */
+const handleAssignment = async (row?: OrderMainVO | null) => {
+  let orderIds: Array<string | number>;
+  let orderNo: string | undefined;
+  let platformCode: string | undefined;
+
+  if (row) {
+    // 单个订单分配 - 弹出选择框
+    orderIds = [row.id];
+    orderNo = row.orderNo;
+    platformCode = row.platformCode;
+
+    // 弹出选择整单/拆单分配的对话框
+    try {
+      assignTypeValue.value = '1'; // 重置为整单分配
+      await ElMessageBox({
+        title: '选择分配方式',
+        message: h('div', { style: 'padding: 10px 0' }, [
+          h('p', { style: 'margin-bottom: 15px; font-size: 14px' }, '请选择分配方式:'),
+          h('div', { style: 'display: flex; flex-direction: column; gap: 12px' }, [
+            h(
+              'label',
+              {
+                style: 'display: flex; align-items: center; cursor: pointer; font-size: 14px',
+                onClick: () => {
+                  assignTypeValue.value = '1';
+                  const radio = document.querySelector('input[name="assignType"][value="1"]') as HTMLInputElement;
+                  if (radio) radio.checked = true;
+                }
+              },
+              [
+                h('input', {
+                  type: 'radio',
+                  name: 'assignType',
+                  value: '1',
+                  checked: true,
+                  style: 'margin-right: 8px; cursor: pointer',
+                  onChange: () => {
+                    assignTypeValue.value = '1';
+                  }
+                }),
+                h('span', null, '整单分配')
+              ]
+            ),
+            h(
+              'label',
+              {
+                style: 'display: flex; align-items: center; cursor: pointer; font-size: 14px',
+                onClick: () => {
+                  assignTypeValue.value = '2';
+                  const radio = document.querySelector('input[name="assignType"][value="2"]') as HTMLInputElement;
+                  if (radio) radio.checked = true;
+                }
+              },
+              [
+                h('input', {
+                  type: 'radio',
+                  name: 'assignType',
+                  value: '2',
+                  style: 'margin-right: 8px; cursor: pointer',
+                  onChange: () => {
+                    assignTypeValue.value = '2';
+                  }
+                }),
+                h('span', null, '拆单分配')
+              ]
+            )
+          ])
+        ]),
+        showCancelButton: true,
+        confirmButtonText: '确定',
+        cancelButtonText: '取消'
+      });
+
+      // 根据选择打开对应的对话框
+      if (assignTypeValue.value === '1') {
+        // 整单分配
+        assignmentDialogRef.value?.open(orderIds, orderNo, platformCode);
+      } else {
+        // 拆单分配
+        splitAssignDialogRef.value?.open(orderIds[0]);
+      }
+    } catch (error) {
+      // 用户取消
+      return;
+    }
+  } else {
+    // 批量分配 - 只支持整单分配
+    if (!ids.value || ids.value.length === 0) {
+      proxy?.$modal.msgWarning('请选择要分配的订单');
+      return;
+    }
+    orderIds = ids.value;
+    assignmentDialogRef.value?.open(orderIds, undefined, platformCode);
+  }
+};
+
+/** 删除按钮操作 */
+const handleDelete = async (row?: OrderMainVO) => {
+  const _ids = row?.id || ids.value;
+  await proxy?.$modal.confirm('是否确认删除订单主信息编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
+  await delOrderMain(_ids);
+  proxy?.$modal.msgSuccess('删除成功');
+  await getList();
+};
+
+/** 导出按钮操作 */
+const handleExport = () => {
+  proxy?.download(
+    'order/orderMain/export',
+    {
+      ...queryParams.value
+    },
+    `orderMain_${new Date().getTime()}.xlsx`
+  );
+};
+
+onMounted(() => {
+  getList();
+});
+
+onActivated(() => {
+  getList();
+});
+</script>

+ 226 - 0
src/views/order/orderAssignment/splitAssignDialog.vue

@@ -0,0 +1,226 @@
+<template>
+  <el-drawer v-model="drawer.visible" :title="drawer.title" size="70%" direction="rtl" :before-close="handleClose">
+    <div class="drawer-content">
+      <el-form ref="splitAssignFormRef" :model="form" label-width="100px">
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="订单编号">
+              <span class="form-value">{{ orderInfo.orderNo }}</span>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="当前平台">
+              <dict-tag :options="sys_platform_code" :value="orderInfo.platformCode" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-divider content-position="left">商品列表</el-divider>
+
+        <el-form-item label-width="0">
+          <el-table :data="form.productList" border style="width: 100%" max-height="500">
+            <el-table-column type="index" label="序号" width="60" align="center" />
+            <el-table-column label="商品图片" width="100" align="center">
+              <template #default="scope">
+                <el-image
+                  v-if="scope.row.productImage"
+                  :src="scope.row.productImage"
+                  style="width: 60px; height: 60px"
+                  fit="cover"
+                  :preview-src-list="[scope.row.productImage]"
+                />
+                <span v-else style="color: #999">暂无图片</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="商品编号" prop="productNo" width="140" align="center" />
+            <el-table-column label="商品名称" prop="productName" show-overflow-tooltip />
+            <el-table-column label="数量" prop="orderQuantity" width="100" align="center" />
+            <el-table-column label="单价" prop="orderPrice" width="120" align="center">
+              <template #default="scope">
+                <span>¥{{ scope.row.orderPrice }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="小计" width="120" align="center">
+              <template #default="scope">
+                <span style="color: #f56c6c; font-weight: bold">¥{{ (scope.row.orderPrice * scope.row.orderQuantity).toFixed(2) }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="分配平台" align="center" fixed="right">
+              <template #default="scope">
+                <el-select v-model="scope.row.targetPlatform" placeholder="请选择平台" style="width: 100%">
+                  <el-option v-for="dict in sys_platform_code" :key="dict.value" :label="dict.label" :value="dict.value" />
+                </el-select>
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-form-item>
+
+        <el-divider content-position="left">分配原因</el-divider>
+
+        <el-form-item label-width="0" prop="remark">
+          <el-input v-model="form.remark" type="textarea" :rows="4" placeholder="请输入分配原因(选填)" maxlength="500" show-word-limit />
+        </el-form-item>
+      </el-form>
+    </div>
+
+    <template #footer>
+      <div class="drawer-footer">
+        <el-button @click="cancel">取 消</el-button>
+        <el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
+      </div>
+    </template>
+  </el-drawer>
+</template>
+
+<style scoped lang="scss">
+.drawer-content {
+  padding: 0 20px 20px;
+  height: calc(100% - 60px);
+  overflow-y: auto;
+}
+
+.drawer-footer {
+  display: flex;
+  justify-content: flex-end;
+  gap: 10px;
+  padding: 10px 20px;
+  border-top: 1px solid #e4e7ed;
+}
+
+.form-value {
+  font-weight: 500;
+  color: #303133;
+}
+
+:deep(.el-divider__text) {
+  font-weight: 600;
+  font-size: 14px;
+}
+</style>
+
+<script setup name="SplitAssignDialog" lang="ts">
+import { getOrderMain } from '@/api/order/orderMain';
+import { addOrderSplitAssign } from '@/api/order/orderAssignmentLog';
+import { OrderSplitAssignForm, OrderProductAssignRule } from '@/api/order/orderAssignmentLog/types';
+
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { sys_platform_code } = toRefs<any>(proxy?.useDict('sys_platform_code'));
+
+const emit = defineEmits(['success']);
+
+const buttonLoading = ref(false);
+const splitAssignFormRef = ref<ElFormInstance>();
+
+const drawer = reactive<DialogOption>({
+  visible: false,
+  title: '拆单分配'
+});
+
+const orderInfo = ref<any>({
+  orderNo: '',
+  id: undefined,
+  platformCode: ''
+});
+
+const form = reactive({
+  productList: [] as any[],
+  remark: ''
+});
+
+/** 打开对话框 */
+const open = async (orderId: string | number) => {
+  reset();
+  drawer.visible = true;
+
+  try {
+    // 获取订单详情
+    const res = await getOrderMain(orderId);
+    orderInfo.value = {
+      orderNo: res.data.orderNo,
+      id: res.data.id,
+      platformCode: res.data.platformCode
+    };
+    console.log(res);
+
+    // 加载订单商品列表
+    if (res.data.orderProductList && res.data.orderProductList.length > 0) {
+      form.productList = res.data.orderProductList.map((item: any) => ({
+        ...item,
+        itemId: item.id, // 商品行ID
+        targetPlatform: '' // 初始化分配平台为空
+      }));
+    } else {
+      proxy?.$modal.msgWarning('该订单没有商品信息');
+      drawer.visible = false;
+    }
+  } catch (error) {
+    proxy?.$modal.msgError('获取订单信息失败');
+    drawer.visible = false;
+  }
+};
+
+/** 表单重置 */
+const reset = () => {
+  form.productList = [];
+  form.remark = '';
+  orderInfo.value = {
+    orderNo: '',
+    id: undefined,
+    platformCode: ''
+  };
+};
+
+/** 取消按钮 */
+const cancel = () => {
+  drawer.visible = false;
+  reset();
+};
+
+/** 关闭前的回调 */
+const handleClose = (done: () => void) => {
+  if (buttonLoading.value) {
+    return;
+  }
+  done();
+  reset();
+};
+
+/** 提交按钮 */
+const submitForm = async () => {
+  // 验证每个商品都选择了平台
+  const unassignedProducts = form.productList.filter((item) => !item.targetPlatform);
+  if (unassignedProducts.length > 0) {
+    proxy?.$modal.msgWarning('请为所有商品选择分配平台');
+    return;
+  }
+
+  buttonLoading.value = true;
+  try {
+    // 组装数据结构
+    const submitData: OrderSplitAssignForm = {
+      orderId: orderInfo.value.id,
+      itemRules: form.productList.map(
+        (product): OrderProductAssignRule => ({
+          itemId: product.itemId,
+          targetPlatform: product.targetPlatform
+        })
+      ),
+      remark: form.remark
+    };
+
+    // 调用拆单分配接口
+    await addOrderSplitAssign(submitData);
+    proxy?.$modal.msgSuccess('拆单分配成功');
+    drawer.visible = false;
+    emit('success');
+  } catch (error) {
+    proxy?.$modal.msgError('拆单分配失败');
+  } finally {
+    buttonLoading.value = false;
+  }
+};
+
+defineExpose({
+  open
+});
+</script>

+ 368 - 0
src/views/order/orderDeliver/index.vue

@@ -0,0 +1,368 @@
+<template>
+  <div class="p-2">
+    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+      <div v-show="showSearch" class="mb-[10px]">
+        <el-card shadow="hover">
+          <el-form ref="queryFormRef" :model="queryParams" :inline="true">
+            <el-form-item label="订单编号" prop="orderNo">
+              <el-input v-model="queryParams.orderNo" placeholder="请输入订单编号" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="客户编号" prop="customerCode">
+              <el-input v-model="queryParams.customerCode" placeholder="请输入客户编号" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="客户名称" prop="customerName">
+              <el-input v-model="queryParams.customerName" placeholder="请输入客户名称" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="订单来源" prop="orderSource">
+              <el-select v-model="queryParams.orderSource" placeholder="请选择订单来源" clearable>
+                <el-option v-for="dict in order_source" :key="dict.value" :label="dict.label" :value="dict.value" />
+              </el-select>
+            </el-form-item>
+            <!-- <el-form-item label="订单状态" prop="orderStatus">
+              <el-select v-model="queryParams.orderStatus" placeholder="请选择订单状态" clearable>
+                <el-option v-for="dict in order_status" :key="dict.value" :label="dict.label" :value="dict.value" />
+              </el-select>
+            </el-form-item> -->
+            <el-form-item label="业务员" prop="">
+              <el-select v-model="queryParams.orderStatus" placeholder="请选择业务员" clearable> </el-select>
+            </el-form-item>
+            <el-form-item label="部门" prop="">
+              <el-select v-model="queryParams.orderStatus" placeholder="请选择部门" clearable> </el-select>
+            </el-form-item>
+            <el-form-item label="提交时间" prop="createTime">
+              <el-date-picker v-model="dateRange" type="daterange" range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间" />
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" icon="Search" @click="handleQuery()">搜索</el-button>
+              <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+            </el-form-item>
+          </el-form>
+        </el-card>
+      </div>
+    </transition>
+
+    <el-card shadow="never">
+      <template #header>
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="19"> 发货单信息列表 </el-col>
+          <el-col :span="1.5">
+            <el-button type="primary" plain>关闭订单</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="primary" plain>删除订单</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="primary" plain>导出订单</el-button>
+          </el-col>
+        </el-row>
+      </template>
+
+      <el-table v-loading="loading" border :data="orderMainList" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column label="发货单编号" align="center" prop="deliverCode" />
+        <el-table-column label="订单编号" align="center" prop="orderNo" />
+        <el-table-column label="客户名称" align="center" prop="customerName" />
+        <el-table-column label="发货时间" align="center" prop="deliverTime" />
+        <el-table-column label="签收时间" align="center" prop="deliverTime" />
+        <el-table-column label="发货方式" align="center" prop="deliverMethod">
+          <template #default="scope">
+            <dict-tag :options="deliver_method" :value="scope.row.deliverMethod" />
+          </template>
+        </el-table-column>
+        <el-table-column label="包裹状态" align="center" prop="orderStatus">
+          <template #default="scope">
+            <dict-tag :options="order_status" :value="scope.row.orderStatus" />
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+          <template #default="scope">
+            <el-button link type="primary" @click="handleDeliver(scope.row)">发货</el-button>
+            <el-button link type="primary" @click="handleReview(scope.row)">查看发货信息</el-button>
+            <el-button link type="primary">取消订单</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+    </el-card>
+
+    <!-- 发货对话框 -->
+    <DeliverDialog v-model="showDeliverDialog" :order-id="currentOrderId" :order-no="currentOrderNo" @success="handleDeliverSuccess" />
+  </div>
+</template>
+
+<script setup name="OrderMain" lang="ts">
+import { listOrderMain, getOrderMain, delOrderMain, addOrderMain, updateOrderMain, queryOrderStatusStats } from '@/api/order/orderMain';
+import { OrderMainVO, OrderMainQuery, OrderMainForm } from '@/api/order/orderMain/types';
+import DeliverDialog from '../saleOrder/deliverDialog.vue';
+
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { order_status, fee_type, pay_method, order_source, deliver_method } = toRefs<any>(
+  proxy?.useDict('order_status', 'fee_type', 'pay_method', 'order_source', 'deliver_method')
+);
+
+const orderMainList = ref<OrderMainVO[]>([]);
+const buttonLoading = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref<Array<string | number>>([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+const router = useRouter();
+const queryFormRef = ref<ElFormInstance>();
+const orderMainFormRef = ref<ElFormInstance>();
+const dateRange = ref<[DateModelType, DateModelType]>(['', '']);
+
+// 发货对话框
+const showDeliverDialog = ref(false);
+const currentOrderId = ref<string | number>();
+const currentOrderNo = ref<string>();
+
+const dialog = reactive<DialogOption>({
+  visible: false,
+  title: ''
+});
+
+const orderStatusStats = ref({
+  pendingPaymentCount: 0, // 待支付
+  pendingShipmentCount: 0, // 待发货
+  shippedCount: 0, // 已发货(发货完成)
+  completedCount: 0, // 已完成
+  closedCount: 0, // 已关闭
+  totalCount: 0 // 全部订单
+});
+
+const initFormData: OrderMainForm = {
+  id: undefined,
+  orderNo: undefined,
+  shipmentNo: undefined,
+  subOrderNo: undefined,
+  companyId: undefined,
+  customerId: undefined,
+  customerCode: undefined,
+  userId: undefined,
+  shippingAddressId: undefined,
+  purchaseReason: undefined,
+  invoiceType: undefined,
+  payType: undefined,
+  warehouseId: undefined,
+  creditLimit: undefined,
+  expectedDeliveryTime: undefined,
+  businessStaff: undefined,
+  customerService: undefined,
+  businessDept: undefined,
+  userDept: undefined,
+  productQuantity: undefined,
+  shippingFee: undefined,
+  totalAmount: undefined,
+  payableAmount: undefined,
+  paymentStatus: undefined,
+  orderSource: undefined,
+  orderStatus: undefined,
+  orderTime: undefined,
+  confirmTime: undefined,
+  shippingTime: undefined,
+  receivingTime: undefined,
+  shippedQuantity: undefined,
+  unshippedQuantity: undefined,
+  packageCount: undefined,
+  signedQuantity: undefined,
+  afterSaleCompleted: undefined,
+  afterSalePending: undefined,
+  deliveryDesc: undefined,
+  pushStatus: undefined,
+  attachmentPath: undefined,
+  deliveryType: undefined,
+  orderCategory: undefined,
+  productCode: undefined,
+  cancelReason: undefined,
+  expenseType: undefined,
+  userNo: undefined,
+  status: undefined,
+  remark: undefined,
+  orderProductBos: [],
+  customerSalesInfoVo: {}
+};
+const data = reactive<PageData<OrderMainForm, OrderMainQuery>>({
+  form: { ...initFormData },
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    orderNo: undefined,
+    shipmentNo: undefined,
+    subOrderNo: undefined,
+    companyId: undefined,
+    customerCode: undefined,
+    customerId: undefined,
+    userId: undefined,
+    purchaseReason: undefined,
+    invoiceType: undefined,
+    payType: undefined,
+    warehouseId: undefined,
+    creditLimit: undefined,
+    expectedDeliveryTime: undefined,
+    businessStaff: undefined,
+    customerService: undefined,
+    businessDept: undefined,
+    userDept: undefined,
+    paymentStatus: undefined,
+    orderSource: undefined,
+    orderStatus: undefined,
+    orderStatuses: '2,3',
+    orderTime: undefined,
+    confirmTime: undefined,
+    shippingTime: undefined,
+    receivingTime: undefined,
+    deliveryType: undefined,
+    orderCategory: undefined,
+    productCode: undefined,
+    expenseType: undefined,
+    status: undefined,
+    platformCode: undefined,
+    params: {}
+  },
+  rules: {
+    customerId: [{ required: true, message: '客户ID不能为空', trigger: 'blur' }],
+    payType: [{ required: true, message: '支付方式不能为空', trigger: 'change' }],
+    warehouseId: [{ required: true, message: '发货仓库不能为空', trigger: 'change' }],
+    expectedDeliveryTime: [{ required: true, message: '预计送达时间不能为空', trigger: 'blur' }],
+    shippingFee: [{ required: true, message: '运费不能为空', trigger: 'blur' }],
+    confirmTime: [{ required: true, message: '确认时间不能为空', trigger: 'blur' }],
+    shippingTime: [{ required: true, message: '发货时间不能为空', trigger: 'blur' }],
+    receivingTime: [{ required: true, message: '收货时间不能为空', trigger: 'blur' }],
+    cancelReason: [{ required: true, message: '取消或异常原因不能为空', trigger: 'blur' }],
+    expenseType: [{ required: true, message: '费用类型不能为空', trigger: 'change' }]
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询订单主信息列表 */
+const getList = async () => {
+  loading.value = true;
+  const res = await listOrderMain(proxy?.addDateRange(queryParams.value, dateRange.value));
+  orderMainList.value = res.rows;
+  total.value = res.total;
+  loading.value = false;
+  queryOrderStatusStatsMethod();
+};
+
+const queryOrderStatusStatsMethod = async () => {
+  const res = await queryOrderStatusStats();
+  orderStatusStats.value = res as any;
+};
+
+/** 取消按钮 */
+const cancel = () => {
+  reset();
+  dialog.visible = false;
+};
+
+/** 表单重置 */
+const reset = () => {
+  form.value = { ...initFormData };
+  orderMainFormRef.value?.resetFields();
+};
+
+/** 搜索按钮操作 */
+const handleQuery = (orderStatus?: string) => {
+  if (orderStatus) {
+    queryParams.value.orderStatus = orderStatus;
+  } else {
+    queryParams.value.orderStatus = undefined;
+  }
+  queryParams.value.pageNum = 1;
+  getList();
+};
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  dateRange.value = ['', ''];
+  queryFormRef.value?.resetFields();
+  handleQuery();
+};
+
+/** 多选框选中数据 */
+const handleSelectionChange = (selection: OrderMainVO[]) => {
+  ids.value = selection.map((item) => item.id);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+};
+
+const handleReview = (row?: OrderMainVO) => {
+  router.push({
+    path: '/order-center/order-sendDetail',
+    query: { id: row.id }
+  });
+};
+
+/** 发货按钮操作 */
+const handleDeliver = (row?: OrderMainVO) => {
+  if (!row?.id) {
+    proxy?.$modal.msgWarning('订单ID不能为空');
+    return;
+  }
+  currentOrderId.value = row.id;
+  currentOrderNo.value = row.orderNo;
+  showDeliverDialog.value = true;
+};
+
+/** 发货成功回调 */
+const handleDeliverSuccess = () => {};
+
+/** 修改按钮操作 */
+const handleUpdate = async (row?: OrderMainVO) => {
+  reset();
+  const _id = row?.id || ids.value[0];
+  const res = await getOrderMain(_id);
+  Object.assign(form.value, res.data);
+  dialog.visible = true;
+  dialog.title = '修改订单主信息';
+};
+
+/** 提交按钮 */
+const submitForm = () => {
+  orderMainFormRef.value?.validate(async (valid: boolean) => {
+    if (valid) {
+      buttonLoading.value = true;
+      if (form.value.id) {
+        await updateOrderMain(form.value).finally(() => (buttonLoading.value = false));
+      } else {
+        await addOrderMain(form.value).finally(() => (buttonLoading.value = false));
+      }
+      proxy?.$modal.msgSuccess('操作成功');
+      dialog.visible = false;
+      await getList();
+    }
+  });
+};
+
+/** 删除按钮操作 */
+const handleDelete = async (row?: OrderMainVO) => {
+  const _ids = row?.id || ids.value;
+  await proxy?.$modal.confirm('是否确认删除订单主信息编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
+  await delOrderMain(_ids);
+  proxy?.$modal.msgSuccess('删除成功');
+  await getList();
+};
+
+/** 导出按钮操作 */
+const handleExport = () => {
+  proxy?.download(
+    'order/orderMain/export',
+    {
+      ...queryParams.value
+    },
+    `orderMain_${new Date().getTime()}.xlsx`
+  );
+};
+
+onMounted(() => {
+  getList();
+});
+
+onActivated(() => {
+  getList();
+});
+</script>

+ 0 - 1
src/views/order/orderMain/components/addressDialog.vue

@@ -157,7 +157,6 @@ const handleSubmit = async () => {
 
 
     submitLoading.value = true;
     submitLoading.value = true;
     await addShippingAddress(form.value);
     await addShippingAddress(form.value);
-    proxy?.$modal.msgSuccess('操作成功');
     emit('success');
     emit('success');
     handleClose();
     handleClose();
   } catch (error) {
   } catch (error) {

+ 3 - 4
src/views/order/orderMain/components/chooseProduct.vue

@@ -56,7 +56,7 @@
         <template #default="scope"> {{ scope.row.taxRate }}% </template>
         <template #default="scope"> {{ scope.row.taxRate }}% </template>
       </el-table-column>
       </el-table-column>
       <el-table-column prop="unit" label="单位" width="80" />
       <el-table-column prop="unit" label="单位" width="80" />
-      <el-table-column prop="certificatePrice" label="最低售价" width="100" />
+      <el-table-column prop="minSellingPrice" label="最低售价" width="100" />
       <el-table-column prop="minOrderQuantity" label="起订量" width="100" />
       <el-table-column prop="minOrderQuantity" label="起订量" width="100" />
       <el-table-column prop="unitPrice" label="含税单价" width="100" />
       <el-table-column prop="unitPrice" label="含税单价" width="100" />
       <el-table-column prop="productStatus" label="商品状态" width="100">
       <el-table-column prop="productStatus" label="商品状态" width="100">
@@ -76,10 +76,9 @@
     <el-pagination
     <el-pagination
       v-model:current-page="queryParams.pageNum"
       v-model:current-page="queryParams.pageNum"
       v-model:page-size="queryParams.pageSize"
       v-model:page-size="queryParams.pageSize"
+      :page-sizes="[10, 20, 30, 50]"
       :total="total"
       :total="total"
-      :page-sizes="[10, 20, 50, 100]"
-      layout="total, sizes, prev, pager, next, jumper"
-      @size-change="handleSizeChange"
+      layout="prev, next"
       @current-change="handleCurrentChange"
       @current-change="handleCurrentChange"
       class="mt-4"
       class="mt-4"
     />
     />

+ 3 - 1
src/views/order/orderMain/index.vue

@@ -688,6 +688,8 @@ const addAddress = () => {
 
 
 /** 添加地址成功回调 */
 /** 添加地址成功回调 */
 const handleAddAddressSuccess = () => {
 const handleAddAddressSuccess = () => {
+  // 获取客户收货地址列表
+  loadAddressList(form.value.customerId);
   proxy?.$modal.msgSuccess('添加地址成功');
   proxy?.$modal.msgSuccess('添加地址成功');
 };
 };
 
 
@@ -707,7 +709,7 @@ const handleProductConfirm = (product: BaseVO) => {
     taxRate: product.taxRate || 0, // 税率
     taxRate: product.taxRate || 0, // 税率
     unit: product.unitId, // 单位
     unit: product.unitId, // 单位
     price: product.standardPrice || 0, // 单价(使用平档价)
     price: product.standardPrice || 0, // 单价(使用平档价)
-    certificatePrice: product.certificatePrice || 0, // 最低售价
+    certificatePrice: product.minSellingPrice || 0, // 最低售价
     minOrderQuantity: product.minOrderQuantity || 1, // 起订量
     minOrderQuantity: product.minOrderQuantity || 1, // 起订量
     unitPrice: product.certificatePrice || 0, // 含税单价(默认使用最低售价)
     unitPrice: product.certificatePrice || 0, // 含税单价(默认使用最低售价)
     quantity: product.minOrderQuantity || 1, // 数量(默认使用起订量)
     quantity: product.minOrderQuantity || 1, // 数量(默认使用起订量)

+ 283 - 0
src/views/order/orderReturn/index.vue

@@ -0,0 +1,283 @@
+<template>
+  <div class="p-2">
+    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+      <div v-show="showSearch" class="mb-[10px]">
+        <el-card shadow="hover">
+          <el-form ref="queryFormRef" :model="queryParams" :inline="true">
+            <el-form-item label="退货原因" prop="returnReasonId">
+              <el-select v-model="queryParams.returnReasonId" placeholder="请选择退货原因" clearable>
+                <el-option v-for="reason in returnReasonList" :key="reason.id" :label="reason.returnReasonName" :value="reason.id" />
+              </el-select>
+            </el-form-item>
+            <el-form-item label="订单状态" prop="returnStatus">
+              <el-select v-model="queryParams.returnStatus" placeholder="请选择订单状态" clearable>
+                <el-option v-for="dict in return_order_status" :key="dict.value" :label="dict.label" :value="dict.value" />
+              </el-select>
+            </el-form-item>
+            <el-form-item label="提交时间" prop="dateRange">
+              <el-date-picker v-model="dateRange" type="daterange" range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间" />
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+              <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+            </el-form-item>
+          </el-form>
+        </el-card>
+      </div>
+    </transition>
+
+    <el-card shadow="never">
+      <template #header>
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="19"> 退货单信息列表 </el-col>
+          <el-col :span="1.5">
+            <el-button type="primary" plain>关闭订单</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="primary" plain>删除订单</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="primary" plain>导出订单</el-button>
+          </el-col>
+        </el-row>
+      </template>
+
+      <el-table v-loading="loading" border :data="orderReturnList" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column label="订单时间" align="center" prop="createTime" width="180">
+          <template #default="scope">
+            <span>{{ scope.row.createTime }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="售后单号" align="center" prop="returnNo" />
+        <el-table-column label="售后类型" align="center" prop="serviceType">
+          <template #default="scope">
+            <dict-tag :options="return_type" :value="scope.row.serviceType" />
+          </template>
+        </el-table-column>
+        <el-table-column label="客户编号" align="center" prop="customerNo" />
+        <el-table-column label="客户姓名" align="center" prop="customerName" />
+        <el-table-column label="售后金额" align="center" prop="afterSaleAmount" />
+        <el-table-column label="订单状态" align="center" prop="returnStatus">
+          <template #default="scope">
+            <dict-tag :options="return_order_status" :value="scope.row.returnStatus" />
+          </template>
+        </el-table-column>
+        <el-table-column label="退货原因" align="center" prop="returnReason" />
+        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+          <template #default="scope">
+            <el-button link type="primary" icon="Edit" @click="handleReview(scope.row)" v-hasPermi="['order:orderReturn:edit']"
+              >查看退货信息</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+    </el-card>
+  </div>
+</template>
+
+<script setup name="OrderReturn" lang="ts">
+import { listOrderReturn, getOrderReturn, delOrderReturn, addOrderReturn, updateOrderReturn } from '@/api/order/orderReturn';
+import { OrderReturnVO, OrderReturnQuery, OrderReturnForm } from '@/api/order/orderReturn/types';
+import { listReturnReason } from '@/api/order/returnReason';
+import { ReturnReasonVO } from '@/api/order/returnReason/types';
+
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { return_order_status, return_type } = toRefs<any>(proxy?.useDict('return_order_status', 'return_type'));
+
+const orderReturnList = ref<OrderReturnVO[]>([]);
+const returnReasonList = ref<ReturnReasonVO[]>([]);
+const buttonLoading = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref<Array<string | number>>([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+const dateRange = ref<[DateModelType, DateModelType]>(['', '']);
+
+const queryFormRef = ref<ElFormInstance>();
+const orderReturnFormRef = ref<ElFormInstance>();
+const router = useRouter();
+const dialog = reactive<DialogOption>({
+  visible: false,
+  title: ''
+});
+
+const initFormData: OrderReturnForm = {
+  id: undefined,
+  orderId: undefined,
+  orderNo: undefined,
+  serviceType: undefined,
+  returnTime: undefined,
+  returnNo: undefined,
+  customerId: undefined,
+  customerNo: undefined,
+  customerName: undefined,
+  afterSaleAmount: undefined,
+  returnStatus: undefined,
+  returnProductNum: undefined,
+  processingTime: undefined,
+  returnReasonId: undefined,
+  returnReason: undefined,
+  problemDescription: undefined,
+  voucherPhoto: undefined,
+  shippingFee: undefined,
+  isShippingFee: undefined,
+  orderAmount: undefined,
+  returnAmount: undefined,
+  afterSalesRemarks: undefined,
+  returnMethod: undefined,
+  chargebackName: undefined,
+  chargebackPhone: undefined,
+  chargebackPickupTime: undefined,
+  chargebackProvincial: undefined,
+  chargebackCity: undefined,
+  chargebackCounty: undefined,
+  provincialCityCounty: undefined,
+  chargebackAddress: undefined,
+  pushStatus: undefined,
+  logisticsId: undefined,
+  logisticsName: undefined,
+  logisticsNo: undefined,
+  status: undefined,
+  remark: undefined
+};
+const data = reactive<PageData<OrderReturnForm, OrderReturnQuery>>({
+  form: { ...initFormData },
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    orderId: undefined,
+    orderNo: undefined,
+    serviceType: undefined,
+    returnNo: undefined,
+    customerId: undefined,
+    customerNo: undefined,
+    customerName: undefined,
+    returnStatus: undefined,
+    processingTime: undefined,
+    returnReasonId: undefined,
+    returnReason: undefined,
+    pushStatus: undefined,
+    status: undefined,
+    params: {}
+  },
+  rules: {}
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询退货主列表 */
+const getList = async () => {
+  loading.value = true;
+  const res = await listOrderReturn(proxy?.addDateRange(queryParams.value, dateRange.value));
+  orderReturnList.value = res.rows;
+  total.value = res.total;
+  loading.value = false;
+};
+
+/** 取消按钮 */
+const cancel = () => {
+  reset();
+  dialog.visible = false;
+};
+
+/** 表单重置 */
+const reset = () => {
+  form.value = { ...initFormData };
+  orderReturnFormRef.value?.resetFields();
+};
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.value.pageNum = 1;
+  getList();
+};
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  dateRange.value = ['', ''];
+  queryFormRef.value?.resetFields();
+  handleQuery();
+};
+
+/** 多选框选中数据 */
+const handleSelectionChange = (selection: OrderReturnVO[]) => {
+  ids.value = selection.map((item) => item.id);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+};
+
+/** 新增按钮操作 */
+const handleAdd = () => {
+  reset();
+  dialog.visible = true;
+  dialog.title = '添加退货主';
+};
+
+const handleReview = (row?: OrderReturnVO) => {
+  router.push({
+    path: '/order-center/return-detail',
+    query: { id: row.id }
+  });
+};
+
+/** 提交按钮 */
+const submitForm = () => {
+  orderReturnFormRef.value?.validate(async (valid: boolean) => {
+    if (valid) {
+      buttonLoading.value = true;
+      if (form.value.id) {
+        await updateOrderReturn(form.value).finally(() => (buttonLoading.value = false));
+      } else {
+        await addOrderReturn(form.value).finally(() => (buttonLoading.value = false));
+      }
+      proxy?.$modal.msgSuccess('操作成功');
+      dialog.visible = false;
+      await getList();
+    }
+  });
+};
+
+/** 删除按钮操作 */
+const handleDelete = async (row?: OrderReturnVO) => {
+  const _ids = row?.id || ids.value;
+  await proxy?.$modal.confirm('是否确认删除退货主编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
+  await delOrderReturn(_ids);
+  proxy?.$modal.msgSuccess('删除成功');
+  await getList();
+};
+
+/** 导出按钮操作 */
+const handleExport = () => {
+  proxy?.download(
+    'order/orderReturn/export',
+    {
+      ...queryParams.value
+    },
+    `orderReturn_${new Date().getTime()}.xlsx`
+  );
+};
+
+// 加载退货原因列表
+const loadReturnReasonList = async () => {
+  try {
+    const res = await listReturnReason({
+      pageNum: 1,
+      pageSize: 1000
+    });
+    returnReasonList.value = res.rows || [];
+  } catch (error) {
+    console.error('加载退货原因列表失败:', error);
+    returnReasonList.value = [];
+  }
+};
+
+onMounted(() => {
+  getList();
+  loadReturnReasonList();
+});
+</script>

+ 265 - 0
src/views/order/orderReturn/returnDetail.vue

@@ -0,0 +1,265 @@
+<template>
+  <div class="app-container">
+    <el-card shadow="never" class="mb-2">
+      <!-- 订单信息 -->
+      <el-descriptions title="订单信息" :column="2" border class="custom-descriptions">
+        <!-- 第一行 -->
+        <el-descriptions-item label="申请时间">{{ orderDetail.createTime }}</el-descriptions-item>
+        <el-descriptions-item label="申请单号">{{ orderDetail.returnNo }}</el-descriptions-item>
+
+        <!-- 第二行 -->
+        <el-descriptions-item label="订单编号">{{ orderDetail.orderNo }}</el-descriptions-item>
+        <el-descriptions-item label="订单状态">
+          <dict-tag :options="return_order_status" :value="orderDetail.returnStatus" />
+        </el-descriptions-item>
+
+        <!-- 第三行 -->
+        <el-descriptions-item label="退货金额">{{ orderDetail.afterSaleAmount }}</el-descriptions-item>
+        <el-descriptions-item label="售后完成时间">{{ orderDetail.processingTime }}</el-descriptions-item>
+
+        <!-- 第四行 -->
+        <el-descriptions-item label="售后处理方式"> <dict-tag :options="return_type" :value="orderDetail.serviceType" /></el-descriptions-item>
+        <el-descriptions-item label="退货原因">{{ orderDetail.returnReason }}</el-descriptions-item>
+
+        <!-- 以下每项独占一行(span=2) -->
+        <el-descriptions-item label="问题描述" :span="2">
+          {{ orderDetail.problemDescription || '无' }}
+        </el-descriptions-item>
+
+        <el-descriptions-item label="售后备注" :span="2">
+          {{ orderDetail.remark || '无' }}
+        </el-descriptions-item>
+
+        <el-descriptions-item label="凭证照片" :span="2">
+          <div v-if="orderDetail.voucherPhoto && orderDetail.voucherPhoto.length > 0">
+            <el-image
+              v-for="(url, index) in orderDetail.voucherPhoto"
+              :key="index"
+              :src="url"
+              :preview-src-list="orderDetail.voucherPhoto.split(',')"
+              style="width: 80px; height: 80px; margin-right: 8px; object-fit: cover"
+              fit="cover"
+              :initial-index="index"
+            />
+          </div>
+          <span v-else>无</span>
+        </el-descriptions-item>
+      </el-descriptions>
+    </el-card>
+
+    <!-- 商品明细 -->
+    <el-card shadow="never" class="mb-2">
+      <template #header>
+        <span>商品明细</span>
+      </template>
+      <el-table :data="productList" border style="width: 100%">
+        <el-table-column prop="productNo" label="商品编号" />
+        <el-table-column label="商品图片" width="100">
+          <template #default="scope">
+            <el-image v-if="scope.row.productImage" :src="scope.row.productImage" style="width: 60px; height: 60px" fit="cover" />
+            <span v-else>暂无图片</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="productName" label="商品名称" min-width="150" />
+        <el-table-column prop="productUnit" label="产品类别" />
+        <el-table-column prop="productUnit" label="单位" />
+        <el-table-column prop="unitPrice" label="单价" />
+        <el-table-column prop="returnQuantity" label="退货数量" />
+        <el-table-column prop="totalAmount" label="金额" />
+      </el-table>
+    </el-card>
+    <div class="mt-2 text-right" style="margin-right: 20px">
+      <span
+        >商品数:{{ totalQuantity }}, 合计金额<span style="color: #f56c6c">{{ totalAmount }}</span></span
+      >
+    </div>
+    <!-- 信息汇总 -->
+    <el-card shadow="never" class="mb-2">
+      <template #header>
+        <div class="card-header">
+          <span>信息汇总</span>
+        </div>
+      </template>
+
+      <el-table :data="summaryData" border style="width: 100%">
+        <el-table-column prop="" label="签收数量" align="center" />
+        <el-table-column prop="" label="已售后数量" align="center" />
+        <el-table-column prop="" label="售后数量" align="center" />
+        <el-table-column prop="" label="退回运费" align="center" />
+        <el-table-column prop="" label="订单总金额" align="center" />
+        <el-table-column prop="" label="退货总金额" align="center" />
+      </el-table>
+    </el-card>
+
+    <!-- 底部按钮 -->
+    <div class="text-center mt-4">
+      <el-button @click="goBack">返回</el-button>
+    </div>
+  </div>
+</template>
+
+<script setup name="ReturnDetail" lang="ts">
+import { ref, computed, onMounted } from 'vue';
+import { useRoute, useRouter } from 'vue-router';
+import { getOrderReturn } from '@/api/order/orderReturn';
+import { OrderReturnVO } from '@/api/order/orderReturn/types';
+import { OrderReturnItemVO } from '@/api/order/orderReturnItem/types';
+import { getCustomerInfo } from '@/api/customer/customerFile/customerInfo';
+import { CustomerInfoVO } from '@/api/customer/customerFile/customerInfo/types';
+
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { return_order_status, return_type, fee_type, pay_method } = toRefs<any>(
+  proxy?.useDict('return_order_status', 'return_type', 'fee_type', 'pay_method')
+);
+const route = useRoute();
+const router = useRouter();
+
+// 订单详情
+const orderDetail = ref<OrderReturnVO>({} as OrderReturnVO);
+
+// 客户信息
+const customerInfo = ref<CustomerInfoVO>({} as CustomerInfoVO);
+
+// 商品明细列表
+const productList = ref<OrderReturnItemVO[]>([]);
+
+// 计算商品总数(所有商品的采购数量之和)
+const totalQuantity = computed(() => {
+  return productList.value.reduce((sum, item) => {
+    return sum + (Number(item.returnQuantity) || 0);
+  }, 0);
+});
+
+// 获取订单详情
+const getOrderDetail = async () => {
+  const orderId = route.query.id || route.params.id;
+  if (!orderId) {
+    proxy?.$modal.msgError('订单ID不能为空');
+    return;
+  }
+
+  try {
+    const res = await getOrderReturn(orderId as any);
+    orderDetail.value = res.data;
+
+    // 获取商品明细
+    if (orderDetail.value.orderReturnItemList) {
+      productList.value = orderDetail.value.orderReturnItemList;
+    } else if (orderDetail.value.id) {
+      await getProductList(orderDetail.value);
+    }
+
+    // 获取客户信息
+    if (orderDetail.value.customerId) {
+      await getCustomerDetail(orderDetail.value.customerId);
+    }
+  } catch (error) {
+    console.error('获取订单详情失败:', error);
+    proxy?.$modal.msgError('获取订单详情失败');
+  }
+};
+
+// 获取商品明细列表
+const getProductList = async (orderDetail: OrderReturnVO) => {
+  try {
+    productList.value = orderDetail.orderReturnItemList || [];
+  } catch (error) {
+    console.error('获取商品明细失败:', error);
+  }
+};
+
+// 计算商品总金额(所有商品的小计之和)
+const totalAmount = computed(() => {
+  return productList.value.reduce((sum, item) => {
+    return sum + (Number(item.totalAmount) || 0);
+  }, 0);
+});
+
+// 计算应付款金额(订单总金额 + 运费)
+const payableAmount = computed(() => {
+  const shipping = Number(orderDetail.value.shippingFee) || 0;
+  return totalAmount.value + shipping;
+});
+// 汇总数据(用于表格显示)
+const summaryData = computed(() => {
+  return [
+    {
+      quantity: totalQuantity.value,
+      shippingFee: `¥${(Number(orderDetail.value.shippingFee) || 0).toFixed(2)}`,
+      totalAmount: `¥${totalAmount.value.toFixed(2)}`,
+      payableAmount: `¥${payableAmount.value.toFixed(2)}`
+    }
+  ];
+});
+
+// 获取客户详情
+const getCustomerDetail = async (customerId: string | number) => {
+  try {
+    const res = await getCustomerInfo(customerId);
+    customerInfo.value = res.data;
+  } catch (error) {
+    console.error('获取客户信息失败:', error);
+  }
+};
+
+// 字典label工具
+function getDictLabel(dictList: any[], value: string) {
+  if (!dictList || !Array.isArray(dictList)) return value || '--';
+  const found = dictList.find((item) => item.value === value);
+  return found ? found.label : value || '--';
+}
+
+// 返回
+const goBack = () => {
+  router.back();
+};
+
+// 打印
+const handlePrint = () => {
+  window.print();
+};
+
+onMounted(() => {
+  getOrderDetail();
+});
+</script>
+
+<style scoped lang="scss">
+.mb-2 {
+  margin-bottom: 16px;
+}
+
+.mt-4 {
+  margin-top: 32px;
+}
+
+.text-center {
+  text-align: center;
+}
+
+.detail-item {
+  padding: 8px 0;
+  line-height: 1.8;
+
+  .label {
+    color: #909399;
+    margin-right: 8px;
+  }
+}
+
+:deep(.custom-descriptions .el-descriptions__label) {
+  width: 160px;
+  /* 可选:强制不换行 */
+  white-space: nowrap;
+}
+:deep(.custom-descriptions .el-descriptions__content) {
+  /* 内容区域自动占剩余空间 */
+  flex: 1;
+}
+
+@media print {
+  .el-button {
+    display: none;
+  }
+}
+</style>

+ 571 - 0
src/views/order/revenueHeader/add.vue

@@ -0,0 +1,571 @@
+<template>
+  <div class="p-2">
+    <!-- 页面标题 -->
+    <el-card shadow="never" class="mb-2">
+      <div class="flex justify-between items-center">
+        <div class="flex items-center">
+          <el-button link @click="handleBack" class="mr-2">
+            <el-icon class="mr-1"><ArrowLeft /></el-icon>
+            返回
+          </el-button>
+          <span class="text-lg font-bold">{{ pageTitle }}</span>
+        </div>
+        <el-button type="primary" @click="submitForm" :loading="buttonLoading">保存</el-button>
+      </div>
+    </el-card>
+
+    <!-- 基本信息 -->
+    <el-card shadow="never" class="mb-2">
+      <el-form ref="revenueHeaderFormRef" :model="form" :rules="rules" label-width="120px">
+        <el-row :gutter="20" v-if="form.revenueType == '0'">
+          <el-col :span="8">
+            <el-form-item label="客户编号:" prop="customerCode">
+              <el-select
+                v-model="form.customerCode"
+                placeholder="请输入客户编号"
+                style="width: 100%"
+                filterable
+                remote
+                :remote-method="handleSearchCustomer"
+                :loading="customerSearchLoading"
+                @change="handleCustomerChange"
+                clearable
+              >
+                <el-option
+                  v-for="customer in filteredCustomerList"
+                  :key="customer.id"
+                  :label="`${customer.customerNo} - ${customer.customerName}`"
+                  :value="customer.customerNo"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="收入单类型:" prop="revenueType">
+              <el-select v-model="form.revenueType" placeholder="请选择" style="width: 100%" disabled>
+                <el-option v-for="dict in revenue_type" :key="dict.value" :label="dict.label" :value="dict.value" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="所属公司:" prop="companyName">
+              <el-input v-model="form.companyName" disabled />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20" v-if="form.revenueType == '1'">
+          <el-col :span="8">
+            <el-form-item label="收入单类型:" prop="revenueType">
+              <el-select v-model="form.revenueType" placeholder="请选择" style="width: 100%" disabled>
+                <el-option v-for="dict in revenue_type" :key="dict.value" :label="dict.label" :value="dict.value" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="所属公司:" prop="companyName">
+              <el-input v-model="form.companyName" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="供应商:" prop="supplierName">
+              <el-select
+                v-model="form.supplierName"
+                placeholder="请输入供应商名称"
+                style="width: 100%"
+                filterable
+                remote
+                :remote-method="handleSearchCustomer"
+                :loading="customerSearchLoading"
+                @change="handleCustomerChange"
+                clearable
+              >
+                <el-option
+                  v-for="customer in filteredCustomerList"
+                  :key="customer.id"
+                  :label="`${customer.customerNo} - ${customer.customerName}`"
+                  :value="customer.customerNo"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :span="8">
+            <el-form-item label="业务部门:" prop="businessDept">
+              <el-input v-model="form.businessDept" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="客服人员:" prop="customerService">
+              <el-input v-model="form.customerService" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="业务员:" prop="businessStaff">
+              <el-input v-model="form.businessStaff" disabled />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row :gutter="20">
+          <el-col :span="8">
+            <el-form-item label="是否含税:" prop="isPrwTax">
+              <el-radio-group v-model="form.isPrwTax">
+                <el-radio v-for="dict in sys_platform_yes_no" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="交易币别:" prop="currencyId">
+              <el-select v-model="form.currencyId" placeholder="请选择" style="width: 100%" clearable>
+                <el-option v-for="currency in currencyList" :key="currency.id" :label="currency.currencyName" :value="currency.id" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="16">
+            <el-form-item label="备注:" prop="remark">
+              <el-input v-model="form.remark" type="textarea" :min="3" placeholder="请输入备注" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </el-card>
+
+    <!-- 其他信息 -->
+    <el-card shadow="never">
+      <template #header>
+        <div class="flex justify-between items-center">
+          <span>其他信息:</span>
+          <el-button type="primary" plain @click="handleAddDetail">新增</el-button>
+        </div>
+        <div style="margin-left: 60px">
+          <span>总计:{{ totalAmount.toFixed(2) }}</span>
+        </div>
+      </template>
+
+      <el-table :data="detailList" border style="width: 100%">
+        <el-table-column label="费用类型" min-width="150" align="center">
+          <template #default="scope">
+            <el-select v-model="scope.row.revenueId" placeholder="请选择" style="width: 100%">
+              <el-option v-for="item in feeTypeList" :key="item.id" :label="`${item.revenueCode},${item.revenueName}`" :value="item.id" />
+            </el-select>
+          </template>
+        </el-table-column>
+        <el-table-column label="数量" min-width="120" align="center">
+          <template #default="scope">
+            <el-input-number
+              v-model="scope.row.quantity"
+              :precision="0"
+              :controls="false"
+              style="width: 100%"
+              placeholder="请输入"
+              @change="handleQuantityOrPriceChange(scope.$index)"
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="单价" min-width="120" align="center">
+          <template #default="scope">
+            <el-input-number
+              v-model="scope.row.unitPrice"
+              :precision="2"
+              :controls="false"
+              style="width: 100%"
+              placeholder="请输入"
+              @change="handleQuantityOrPriceChange(scope.$index)"
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="总金额" min-width="120" align="center">
+          <template #default="scope">
+            <el-input-number
+              v-model="scope.row.totalAmount"
+              :precision="2"
+              :controls="false"
+              style="width: 100%"
+              placeholder="请输入"
+              @change="calculateTotal"
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="备注" min-width="150" align="center">
+          <template #default="scope">
+            <el-input v-model="scope.row.remark" placeholder="请输入" />
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" width="80" fixed="right" align="center">
+          <template #default="scope">
+            <el-button link type="danger" @click="handleDeleteDetail(scope.$index)">删除</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </el-card>
+  </div>
+</template>
+<script setup lang="ts">
+import { useRouter } from 'vue-router';
+import { listRevenueHeader, getRevenueHeader, addRevenueHeader, updateRevenueHeader } from '@/api/order/revenueHeader';
+import { RevenueHeaderVO, RevenueHeaderQuery, RevenueHeaderForm } from '@/api/order/revenueHeader/types';
+import { listCustomerInfo, getCustomerInfo } from '@/api/customer/customerFile/customerInfo';
+import { CustomerInfoVO } from '@/api/customer/customerFile/customerInfo/types';
+import { listRevenueExpense } from '@/api/company/revenueExpense';
+import { RevenueExpenseVO } from '@/api/company/revenueExpense/types';
+import { listComCurrency } from '@/api/company/comCurrency';
+import { ComCurrencyVO } from '@/api/company/comCurrency/types';
+import { getCompany } from '@/api/company/company';
+
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { sys_platform_yes_no, check_status, revenue_type } = toRefs<any>(proxy?.useDict('sys_platform_yes_no', 'check_status', 'revenue_type'));
+const router = useRouter();
+const route = useRoute();
+
+const revenueHeaderFormRef = ref();
+const buttonLoading = ref(false);
+const customerList = ref<CustomerInfoVO[]>([]);
+const filteredCustomerList = ref<CustomerInfoVO[]>([]);
+const customerSearchLoading = ref(false);
+const feeTypeList = ref<RevenueExpenseVO[]>([]);
+const currencyList = ref<ComCurrencyVO[]>([]);
+
+// 防抖定时器
+let searchTimer: NodeJS.Timeout | null = null;
+const detailList = ref<any[]>([]);
+
+// 计算总金额
+const totalAmount = computed(() => {
+  return detailList.value.reduce((sum, item) => {
+    const amount = Number(item.totalAmount) || 0;
+    return sum + amount;
+  }, 0);
+});
+
+// 表单初始数据
+const initFormData: RevenueHeaderForm = {
+  id: undefined,
+  revenueType: '收入申请',
+  orderRevenueCode: undefined,
+  incomeOrderCode: undefined,
+  otherRevenueType: undefined,
+  customerId: undefined,
+  customerCode: undefined,
+  supplierId: undefined,
+  isPrwTax: '0',
+  currencyId: undefined,
+  pushStatus: undefined,
+  orderFile: undefined,
+  status: undefined,
+  remark: undefined,
+  companyId: undefined,
+  businessDept: undefined,
+  customerService: undefined,
+  businessStaff: undefined,
+  createTime: new Date().toISOString().split('T')[0],
+  orderRevenueDetails: []
+};
+
+const data = reactive<PageData<RevenueHeaderForm, RevenueHeaderQuery>>({
+  form: { ...initFormData },
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    revenueType: undefined,
+    orderRevenueCode: undefined,
+    incomeOrderCode: undefined,
+    otherRevenueType: undefined,
+    customerId: undefined,
+    supplierId: undefined,
+    isPrwTax: undefined,
+    currencyId: undefined,
+    pushStatus: undefined,
+    orderFile: undefined,
+    status: undefined,
+    platformCode: undefined,
+    params: {}
+  },
+  rules: {
+    revenueType: [{ required: true, message: '收入单类型不能为空', trigger: 'change' }],
+    customerCode: [{ required: true, message: '客户编号不能为空', trigger: 'blur' }],
+    companyId: [{ required: true, message: '所属公司不能为空', trigger: 'change' }],
+    currencyId: [{ required: true, message: '交易币别不能为空', trigger: 'change' }],
+    isPrwTax: [{ required: true, message: '是否含税不能为空', trigger: 'change' }]
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+// 防抖搜索客户
+const handleSearchCustomer = (query: string) => {
+  if (searchTimer) {
+    clearTimeout(searchTimer);
+  }
+
+  if (!query) {
+    filteredCustomerList.value = [];
+    return;
+  }
+
+  customerSearchLoading.value = true;
+
+  searchTimer = setTimeout(async () => {
+    try {
+      const res = await listCustomerInfo({
+        customerNo: query,
+        pageNum: 1,
+        pageSize: 10
+      });
+      filteredCustomerList.value = res.rows || [];
+    } catch (error) {
+      console.error('搜索客户失败:', error);
+      filteredCustomerList.value = [];
+    } finally {
+      customerSearchLoading.value = false;
+    }
+  }, 500);
+};
+
+// 客户选择变化
+const handleCustomerChange = async (customerNo: string) => {
+  if (!customerNo) {
+    // 清空相关字段
+    form.value.customerId = undefined;
+    form.value.customerName = '';
+    form.value.companyName = '';
+    form.value.businessDept = '';
+    form.value.customerService = '';
+    form.value.businessStaff = '';
+    return;
+  }
+
+  try {
+    // 从筛选列表中找到选中的客户
+    const selectedCustomer = filteredCustomerList.value.find((c) => c.customerNo === customerNo);
+    if (!selectedCustomer) return;
+
+    // 获取客户详细信息
+    const res = await getCustomerInfo(selectedCustomer.id);
+    const customerInfo = res.data;
+
+    // 填充客户信息
+    form.value.customerId = customerInfo.id;
+    form.value.customerName = customerInfo.customerName;
+
+    // 从客户销售信息中获取业务信息
+    if (customerInfo.customerSalesInfoVo) {
+      const salesInfo = customerInfo.customerSalesInfoVo;
+      form.value.businessStaff = salesInfo.businessStaffName || '';
+      form.value.customerService = salesInfo.customerServiceName || '';
+      form.value.businessDept = salesInfo.businessDeptName || '';
+    }
+
+    // 获取所属公司信息
+    if (customerInfo.belongCompanyId) {
+      try {
+        const companyRes = await getCompany(customerInfo.belongCompanyId);
+        form.value.companyName = companyRes.data.companyName || '';
+        form.value.companyId = customerInfo.belongCompanyId;
+      } catch (error) {
+        console.error('获取公司信息失败:', error);
+      }
+    }
+  } catch (error) {
+    console.error('获取客户信息失败:', error);
+    ElMessage.error('获取客户信息失败');
+  }
+};
+
+// 加载费用类型列表
+const loadFeeTypeList = async () => {
+  try {
+    // 根据revenueType决定查询条件
+    const queryParams: any = {
+      isShow: '0',
+      pageNum: 1,
+      pageSize: 1000
+    };
+
+    if (form.value.revenueType === '0') {
+      // 收入申请:查询收入类
+      queryParams.revenueFlag = '0';
+    } else if (form.value.revenueType === '1') {
+      // 费用申请:查询费用类
+      queryParams.expenseFlag = '0';
+    }
+
+    const res = await listRevenueExpense(queryParams);
+    feeTypeList.value = res.rows || [];
+  } catch (error) {
+    console.error('加载费用类型列表失败:', error);
+    feeTypeList.value = [];
+  }
+};
+
+// 加载币种列表
+const loadCurrencyList = async () => {
+  try {
+    const res = await listComCurrency({
+      isShow: '0',
+      pageNum: 1,
+      pageSize: 1000
+    });
+    currencyList.value = res.rows || [];
+  } catch (error) {
+    console.error('加载币种列表失败:', error);
+    currencyList.value = [];
+  }
+};
+
+// 新增明细行
+const handleAddDetail = () => {
+  detailList.value.push({
+    revenueId: undefined,
+    quantity: 0,
+    unitPrice: 0,
+    totalAmount: 0,
+    remark: ''
+  });
+};
+
+// 数量或单价变化时自动计算总金额
+const handleQuantityOrPriceChange = (index: number) => {
+  const detail = detailList.value[index];
+  if (detail) {
+    const quantity = Number(detail.quantity) || 0;
+    const unitPrice = Number(detail.unitPrice) || 0;
+    detail.totalAmount = quantity * unitPrice;
+  }
+};
+
+// 删除明细行
+const handleDeleteDetail = (index: number) => {
+  detailList.value.splice(index, 1);
+};
+
+// 计算总金额(手动触发)
+const calculateTotal = () => {
+  // 触发计算属性重新计算
+};
+
+// 提交表单
+const submitForm = async () => {
+  try {
+    await revenueHeaderFormRef.value?.validate();
+
+    // 验证是否有明细数据
+    if (!detailList.value || detailList.value.length === 0) {
+      ElMessage.warning('请至少添加一条其他信息');
+      return;
+    }
+
+    buttonLoading.value = true;
+
+    // 组装明细数据到 orderRevenueDetails
+    form.value.orderRevenueDetails = detailList.value.map((detail) => ({
+      revenueId: detail.revenueId,
+      quantity: detail.quantity,
+      unitPrice: detail.unitPrice,
+      totalAmount: detail.totalAmount,
+      remark: detail.remark
+    }));
+
+    // 调用保存接口
+    if (form.value.id) {
+      await updateRevenueHeader(form.value);
+    } else {
+      await addRevenueHeader(form.value);
+    }
+
+    ElMessage.success('保存成功');
+    // 跳转回列表页
+    router.push('/order-center/order-revenue');
+  } catch (error) {
+    console.error('保存失败:', error);
+    if (error !== false) {
+      ElMessage.error('保存失败,请检查数据后重试');
+    }
+  } finally {
+    buttonLoading.value = false;
+  }
+};
+
+// 返回按钮
+const handleBack = () => {
+  router.back();
+};
+
+// 取消
+const cancel = () => {
+  router.back();
+};
+
+// 页面标题
+const pageTitle = computed(() => {
+  const isEdit = !!route.query.id;
+  if (isEdit) {
+    return form.value.revenueType === '1' ? '编辑费用申请单' : '编辑收入申请单';
+  }
+  return form.value.revenueType === '1' ? '新增费用申请单' : '新增收入申请单';
+});
+
+// 加载订单详情
+const loadOrderDetail = async (id: string | number) => {
+  try {
+    const res = await getRevenueHeader(id);
+    const data = res.data;
+
+    // 填充表单数据
+    Object.assign(form.value, data);
+
+    // 填充明细列表
+    if (data.orderRevenueDetailList && data.orderRevenueDetailList.length > 0) {
+      detailList.value = data.orderRevenueDetailList.map((item: any) => ({
+        revenueId: item.revenueId,
+        quantity: item.quantity || 0,
+        unitPrice: item.unitPrice || 0,
+        totalAmount: item.totalAmount || 0,
+        remark: item.remark || ''
+      }));
+    }
+  } catch (error) {
+    console.error('加载订单详情失败:', error);
+    ElMessage.error('加载订单详情失败');
+  }
+};
+
+// 组件挂载时加载数据
+onMounted(async () => {
+  // 从路由参数获取revenueType和id
+  const revenueType = route.query.revenueType as string;
+  const orderId = route.query.id as string;
+
+  if (revenueType) {
+    form.value.revenueType = revenueType;
+  } else {
+    // 默认为收入申请
+    form.value.revenueType = '0';
+  }
+
+  // 加载基础数据
+  await loadFeeTypeList();
+  await loadCurrencyList();
+
+  // 如果有id,说明是编辑模式,加载订单详情
+  if (orderId) {
+    await loadOrderDetail(orderId);
+  } else {
+    // 新增模式,默认添加一个空行
+    handleAddDetail();
+  }
+});
+</script>
+
+<style scoped lang="scss">
+.mb-2 {
+  margin-bottom: 16px;
+}
+
+.mt-4 {
+  margin-top: 16px;
+}
+</style>

+ 291 - 0
src/views/order/revenueHeader/index.vue

@@ -0,0 +1,291 @@
+<template>
+  <div class="p-2">
+    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+      <div v-show="showSearch" class="mb-[10px]">
+        <el-card shadow="hover">
+          <el-form ref="queryFormRef" :model="queryParams" :inline="true">
+            <el-form-item label="关键字" prop="searchValue">
+              <el-input v-model="queryParams.searchValue" placeholder="客户名称/编号" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="单据日期" prop="createTime">
+              <el-input v-model="queryParams.createTime" placeholder="请选择单据日期" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="单据编号" prop="orderRevenueCode">
+              <el-input v-model="queryParams.orderRevenueCode" placeholder="请输入单据编号" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="业务员" prop="businessStaff">
+              <el-input v-model="queryParams.businessStaff" placeholder="请输入业务员" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="客服" prop="customerService">
+              <el-input v-model="queryParams.customerService" placeholder="请输入客服" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="关联费用" prop="isPrwTax">
+              <el-select v-model="queryParams.isPrwTax" clearable>
+                <el-option v-for="dict in sys_platform_yes_no" :key="dict.value" :label="dict.label" :value="dict.value" />
+              </el-select>
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+              <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+            </el-form-item>
+          </el-form>
+        </el-card>
+      </div>
+    </transition>
+
+    <el-card shadow="never">
+      <template #header>
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="22"> 收入申请单信息列表 </el-col>
+          <el-col :span="1.5">
+            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['order:revenueHeader:add']">新增</el-button>
+          </el-col>
+        </el-row>
+      </template>
+
+      <el-table v-loading="loading" border :data="revenueHeaderList" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column label="单据日期" align="center" prop="createTime">
+          <template #default="scope">
+            <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="单据编号" align="center" prop="orderRevenueCode" />
+        <el-table-column label="客户名称" align="center" prop="customerName" />
+        <el-table-column label="业务员" align="center" prop="businessStaff" />
+        <el-table-column label="客服" align="center" prop="customerService" />
+        <el-table-column label="备注" align="center" prop="remark" />
+        <el-table-column label="是否关联" align="center" prop="isPrwTax">
+          <template #default="scope">
+            <dict-tag :options="sys_platform_yes_no" :value="scope.row.isPrwTax" />
+          </template>
+        </el-table-column>
+        <el-table-column label="审核状态" align="center" prop="status">
+          <template #default="scope">
+            <dict-tag :options="check_status" :value="scope.row.status" />
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+          <template #default="scope">
+            <el-button
+              link
+              type="primary"
+              icon="Edit"
+              @click="handleAudit(scope.row)"
+              v-if="scope.row.status == '0'"
+              v-hasPermi="['order:revenueHeader:edit']"
+              >审核</el-button
+            >
+            <el-button link type="primary" icon="Edit" @click="handleExpenseApply(scope.row)" v-hasPermi="['order:revenueHeader:edit']"
+              >费用申请</el-button
+            >
+            <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['order:revenueHeader:edit']">编辑</el-button>
+            <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['order:revenueHeader:remove']">删除</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+    </el-card>
+    <!-- 添加或修改收入单主对话框 -->
+  </div>
+</template>
+
+<script setup name="RevenueHeader" lang="ts">
+import {
+  listRevenueHeader,
+  getRevenueHeader,
+  delRevenueHeader,
+  addRevenueHeader,
+  updateRevenueHeader,
+  changeStatus
+} from '@/api/order/revenueHeader';
+import { RevenueHeaderVO, RevenueHeaderQuery, RevenueHeaderForm } from '@/api/order/revenueHeader/types';
+
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { sys_platform_yes_no, check_status, revenue_type } = toRefs<any>(proxy?.useDict('sys_platform_yes_no', 'check_status', 'revenue_type'));
+
+const revenueHeaderList = ref<RevenueHeaderVO[]>([]);
+const buttonLoading = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref<Array<string | number>>([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+const router = useRouter();
+const queryFormRef = ref<ElFormInstance>();
+const revenueHeaderFormRef = ref<ElFormInstance>();
+
+const dialog = reactive<DialogOption>({
+  visible: false,
+  title: ''
+});
+
+const initFormData: RevenueHeaderForm = {
+  id: undefined,
+  revenueType: undefined,
+  orderRevenueCode: undefined,
+  incomeOrderCode: undefined,
+  otherRevenueType: undefined,
+  customerId: undefined,
+  supplierId: undefined,
+  isPrwTax: undefined,
+  currencyId: undefined,
+  pushStatus: undefined,
+  orderFile: undefined,
+  status: undefined,
+  remark: undefined
+};
+const data = reactive<PageData<RevenueHeaderForm, RevenueHeaderQuery>>({
+  form: { ...initFormData },
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    revenueType: '0',
+    orderRevenueCode: undefined,
+    incomeOrderCode: undefined,
+    otherRevenueType: undefined,
+    customerId: undefined,
+    supplierId: undefined,
+    isPrwTax: undefined,
+    currencyId: undefined,
+    pushStatus: undefined,
+    orderFile: undefined,
+    status: undefined,
+    platformCode: undefined,
+    params: {}
+  },
+  rules: {
+    customerId: [{ required: true, message: '客户id不能为空', trigger: 'blur' }]
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询收入单主列表 */
+const getList = async () => {
+  loading.value = true;
+  const res = await listRevenueHeader(queryParams.value);
+  revenueHeaderList.value = res.rows;
+  total.value = res.total;
+  loading.value = false;
+};
+
+/** 取消按钮 */
+const cancel = () => {
+  reset();
+  dialog.visible = false;
+};
+
+/** 表单重置 */
+const reset = () => {
+  form.value = { ...initFormData };
+  revenueHeaderFormRef.value?.resetFields();
+};
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.value.pageNum = 1;
+  getList();
+};
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value?.resetFields();
+  handleQuery();
+};
+
+/** 多选框选中数据 */
+const handleSelectionChange = (selection: RevenueHeaderVO[]) => {
+  ids.value = selection.map((item) => item.id);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+};
+
+/** 新增按钮操作 */
+const handleAdd = () => {
+  router.push({
+    path: '/order-center/order-revenue-add',
+    query: { revenueType: '0' } // 收入申请
+  });
+};
+
+/** 费用申请按钮操作 */
+const handleExpenseApply = (row?: RevenueHeaderVO) => {
+  router.push({
+    path: '/order-center/order-revenue-add',
+    query: { revenueType: '1' } // 费用申请
+  });
+};
+
+/** 修改按钮操作 */
+const handleUpdate = async (row?: RevenueHeaderVO) => {
+  reset();
+  const _id = row?.id || ids.value[0];
+  router.push({
+    path: '/order-center/order-revenue-add',
+    query: { revenueType: row.revenueType, id: _id }
+  });
+};
+
+/** 审核按钮操作 */
+const handleAudit = async (row: RevenueHeaderVO) => {
+  try {
+    await proxy?.$modal.confirm('是否确认审核该收入单?');
+
+    // 更新状态为已审核
+    await changeStatus(row.id, '1');
+
+    proxy?.$modal.msgSuccess('审核成功');
+    await getList();
+  } catch (error) {
+    console.error('审核失败:', error);
+  }
+};
+
+/** 提交按钮 */
+const submitForm = () => {
+  revenueHeaderFormRef.value?.validate(async (valid: boolean) => {
+    if (valid) {
+      buttonLoading.value = true;
+      if (form.value.id) {
+        await updateRevenueHeader(form.value).finally(() => (buttonLoading.value = false));
+      } else {
+        await addRevenueHeader(form.value).finally(() => (buttonLoading.value = false));
+      }
+      proxy?.$modal.msgSuccess('操作成功');
+      dialog.visible = false;
+      await getList();
+    }
+  });
+};
+
+/** 删除按钮操作 */
+const handleDelete = async (row?: RevenueHeaderVO) => {
+  const _ids = row?.id || ids.value;
+  await proxy?.$modal.confirm('是否确认删除收入单主编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
+  await delRevenueHeader(_ids);
+  proxy?.$modal.msgSuccess('删除成功');
+  await getList();
+};
+
+/** 导出按钮操作 */
+const handleExport = () => {
+  proxy?.download(
+    'order/revenueHeader/export',
+    {
+      ...queryParams.value
+    },
+    `revenueHeader_${new Date().getTime()}.xlsx`
+  );
+};
+
+onMounted(() => {
+  getList();
+});
+
+onActivated(() => {
+  getList();
+});
+</script>

+ 114 - 7
src/views/order/saleOrder/index.vue

@@ -14,7 +14,7 @@
               <el-input v-model="queryParams.customerName" placeholder="请输入客户名称" clearable @keyup.enter="handleQuery" />
               <el-input v-model="queryParams.customerName" placeholder="请输入客户名称" clearable @keyup.enter="handleQuery" />
             </el-form-item>
             </el-form-item>
             <el-form-item label="订单来源" prop="orderSource">
             <el-form-item label="订单来源" prop="orderSource">
-              <el-select v-model="queryParams.orderSource" placeholder="请选择订单状态" clearable>
+              <el-select v-model="queryParams.orderSource" placeholder="请选择订单来源" clearable>
                 <el-option v-for="dict in order_source" :key="dict.value" :label="dict.label" :value="dict.value" />
                 <el-option v-for="dict in order_source" :key="dict.value" :label="dict.label" :value="dict.value" />
               </el-select>
               </el-select>
             </el-form-item>
             </el-form-item>
@@ -25,7 +25,7 @@
             </el-form-item>
             </el-form-item>
 
 
             <el-form-item label="提交时间" prop="orderTime">
             <el-form-item label="提交时间" prop="orderTime">
-              <el-date-picker clearable v-model="queryParams.orderTime" type="daterange" value-format="YYYY-MM-DD" placeholder="请选择下单时间" />
+              <el-date-picker v-model="dateRange" type="daterange" range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间" />
             </el-form-item>
             </el-form-item>
 
 
             <el-form-item>
             <el-form-item>
@@ -105,6 +105,11 @@
             <dict-tag :options="order_source" :value="scope.row.orderSource" />
             <dict-tag :options="order_source" :value="scope.row.orderSource" />
           </template>
           </template>
         </el-table-column>
         </el-table-column>
+        <el-table-column label="审核状态" align="center" prop="checkStatus">
+          <template #default="scope">
+            <dict-tag :options="order_check_status" :value="scope.row.checkStatus" />
+          </template>
+        </el-table-column>
         <el-table-column label="订单状态" align="center" prop="orderStatus">
         <el-table-column label="订单状态" align="center" prop="orderStatus">
           <template #default="scope">
           <template #default="scope">
             <dict-tag :options="order_status" :value="scope.row.orderStatus" />
             <dict-tag :options="order_status" :value="scope.row.orderStatus" />
@@ -114,6 +119,7 @@
         <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
           <template #default="scope">
           <template #default="scope">
             <el-button link type="primary" v-if="scope.row.orderStatus === '0'" @click="handleReview(scope.row)">查看</el-button>
             <el-button link type="primary" v-if="scope.row.orderStatus === '0'" @click="handleReview(scope.row)">查看</el-button>
+            <el-button link type="primary" v-if="scope.row.checkStatus === '0'" @click="handleCheck(scope.row)">审核</el-button>
             <el-button link type="primary" v-if="scope.row.orderStatus === '2' || scope.row.orderStatus === '3'" @click="handleDeliver(scope.row)"
             <el-button link type="primary" v-if="scope.row.orderStatus === '2' || scope.row.orderStatus === '3'" @click="handleDeliver(scope.row)"
               >发货</el-button
               >发货</el-button
             >
             >
@@ -144,12 +150,24 @@
 </template>
 </template>
 
 
 <script setup name="OrderMain" lang="ts">
 <script setup name="OrderMain" lang="ts">
-import { listOrderMain, getOrderMain, delOrderMain, addOrderMain, updateOrderMain, queryOrderStatusStats } from '@/api/order/orderMain';
+import {
+  listOrderMain,
+  getOrderMain,
+  delOrderMain,
+  addOrderMain,
+  updateOrderMain,
+  queryOrderStatusStats,
+  changeCheckStatus
+} from '@/api/order/orderMain';
 import { OrderMainVO, OrderMainQuery, OrderMainForm } from '@/api/order/orderMain/types';
 import { OrderMainVO, OrderMainQuery, OrderMainForm } from '@/api/order/orderMain/types';
 import DeliverDialog from './deliverDialog.vue';
 import DeliverDialog from './deliverDialog.vue';
+import { ElMessageBox } from 'element-plus';
+import { h } from 'vue';
 
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
-const { order_status, fee_type, pay_method, order_source } = toRefs<any>(proxy?.useDict('order_status', 'fee_type', 'pay_method', 'order_source'));
+const { order_status, order_check_status, pay_method, order_source } = toRefs<any>(
+  proxy?.useDict('order_status', 'order_check_status', 'pay_method', 'order_source')
+);
 
 
 const orderMainList = ref<OrderMainVO[]>([]);
 const orderMainList = ref<OrderMainVO[]>([]);
 const buttonLoading = ref(false);
 const buttonLoading = ref(false);
@@ -162,11 +180,13 @@ const total = ref(0);
 const router = useRouter();
 const router = useRouter();
 const queryFormRef = ref<ElFormInstance>();
 const queryFormRef = ref<ElFormInstance>();
 const orderMainFormRef = ref<ElFormInstance>();
 const orderMainFormRef = ref<ElFormInstance>();
+const checkStatusValue = ref('1'); // 审核状态选择值
 
 
 // 发货对话框
 // 发货对话框
 const showDeliverDialog = ref(false);
 const showDeliverDialog = ref(false);
 const currentOrderId = ref<string | number>();
 const currentOrderId = ref<string | number>();
 const currentOrderNo = ref<string>();
 const currentOrderNo = ref<string>();
+const dateRange = ref<[DateModelType, DateModelType]>(['', '']);
 
 
 const dialog = reactive<DialogOption>({
 const dialog = reactive<DialogOption>({
   visible: false,
   visible: false,
@@ -281,7 +301,6 @@ const data = reactive<PageData<OrderMainForm, OrderMainQuery>>({
     productCode: undefined,
     productCode: undefined,
     cancelReason: undefined,
     cancelReason: undefined,
     expenseType: undefined,
     expenseType: undefined,
-    orderSourse: undefined,
     status: undefined,
     status: undefined,
     platformCode: undefined,
     platformCode: undefined,
     params: {}
     params: {}
@@ -305,7 +324,7 @@ const { queryParams, form, rules } = toRefs(data);
 /** 查询订单主信息列表 */
 /** 查询订单主信息列表 */
 const getList = async () => {
 const getList = async () => {
   loading.value = true;
   loading.value = true;
-  const res = await listOrderMain(queryParams.value);
+  const res = await listOrderMain(proxy?.addDateRange(queryParams.value, dateRange.value));
   orderMainList.value = res.rows;
   orderMainList.value = res.rows;
   total.value = res.total;
   total.value = res.total;
   loading.value = false;
   loading.value = false;
@@ -342,6 +361,7 @@ const handleQuery = (orderStatus?: string) => {
 
 
 /** 重置按钮操作 */
 /** 重置按钮操作 */
 const resetQuery = () => {
 const resetQuery = () => {
+  dateRange.value = ['', ''];
   queryFormRef.value?.resetFields();
   queryFormRef.value?.resetFields();
   handleQuery();
   handleQuery();
 };
 };
@@ -360,6 +380,91 @@ const handleReview = (row?: OrderMainVO) => {
   });
   });
 };
 };
 
 
+/** 审核按钮操作 */
+const handleCheck = async (row?: OrderMainVO) => {
+  const oldValue = row.checkStatus; // 保存旧值
+
+  // 弹出审核选择对话框
+  try {
+    await ElMessageBox({
+      title: '审核',
+      message: h('div', { style: 'padding: 10px 0' }, [
+        h('p', { style: 'margin-bottom: 15px; font-size: 14px' }, '请选择审核结果:'),
+        h('div', { style: 'display: flex; flex-direction: column; gap: 12px' }, [
+          h(
+            'label',
+            {
+              style: 'display: flex; align-items: center; cursor: pointer; font-size: 14px',
+              onClick: () => {
+                checkStatusValue.value = '1';
+                const radio = document.querySelector('input[name="checkStatus"][value="1"]') as HTMLInputElement;
+                if (radio) radio.checked = true;
+              }
+            },
+            [
+              h('input', {
+                type: 'radio',
+                name: 'checkStatus',
+                value: '1',
+                checked: true,
+                style: 'margin-right: 8px; cursor: pointer',
+                onChange: () => {
+                  checkStatusValue.value = '1';
+                }
+              }),
+              h('span', null, '审核通过')
+            ]
+          ),
+          h(
+            'label',
+            {
+              style: 'display: flex; align-items: center; cursor: pointer; font-size: 14px',
+              onClick: () => {
+                checkStatusValue.value = '2';
+                const radio = document.querySelector('input[name="checkStatus"][value="2"]') as HTMLInputElement;
+                if (radio) radio.checked = true;
+              }
+            },
+            [
+              h('input', {
+                type: 'radio',
+                name: 'checkStatus',
+                value: '2',
+                style: 'margin-right: 8px; cursor: pointer',
+                onChange: () => {
+                  checkStatusValue.value = '2';
+                }
+              }),
+              h('span', null, '驳回')
+            ]
+          )
+        ])
+      ]),
+      showCancelButton: true,
+      confirmButtonText: '确定',
+      cancelButtonText: '取消',
+      beforeClose: (action, instance, done) => {
+        if (action === 'confirm') {
+          done();
+        } else {
+          done();
+        }
+      }
+    });
+
+    // 调用接口,传入用户选择的值
+    await changeCheckStatus(row.id, checkStatusValue.value);
+    getList();
+    proxy?.$modal.msgSuccess('操作成功');
+  } catch (error) {
+    // 用户取消或操作失败
+    if (error !== 'cancel' && error !== 'close') {
+      row.checkStatus = oldValue; // 失败回滚
+      proxy?.$modal.msgError('操作失败,请重试');
+    }
+  }
+};
+
 /** 发货按钮操作 */
 /** 发货按钮操作 */
 const handleDeliver = (row?: OrderMainVO) => {
 const handleDeliver = (row?: OrderMainVO) => {
   if (!row?.id) {
   if (!row?.id) {
@@ -372,7 +477,9 @@ const handleDeliver = (row?: OrderMainVO) => {
 };
 };
 
 
 /** 发货成功回调 */
 /** 发货成功回调 */
-const handleDeliverSuccess = () => {};
+const handleDeliverSuccess = () => {
+  getList();
+};
 
 
 /** 修改按钮操作 */
 /** 修改按钮操作 */
 const handleUpdate = async (row?: OrderMainVO) => {
 const handleUpdate = async (row?: OrderMainVO) => {

+ 11 - 2
src/views/order/saleOrder/sendDetail.vue

@@ -2,7 +2,7 @@
   <div class="app-container">
   <div class="app-container">
     <el-card shadow="never" class="mb-2">
     <el-card shadow="never" class="mb-2">
       <!-- 订单信息 -->
       <!-- 订单信息 -->
-      <el-descriptions title="订单信息" :column="2" border>
+      <el-descriptions title="订单信息" :column="2" border class="custom-descriptions">
         <el-descriptions-item label="订单编号">{{ orderDetail.orderNo }}</el-descriptions-item>
         <el-descriptions-item label="订单编号">{{ orderDetail.orderNo }}</el-descriptions-item>
         <el-descriptions-item label="发货单编号">{{ orderDetail.shipmentNo }}</el-descriptions-item>
         <el-descriptions-item label="发货单编号">{{ orderDetail.shipmentNo }}</el-descriptions-item>
         <el-descriptions-item label="订单总金额">{{ orderDetail.totalAmount }}</el-descriptions-item>
         <el-descriptions-item label="订单总金额">{{ orderDetail.totalAmount }}</el-descriptions-item>
@@ -206,7 +206,6 @@
     <!-- 底部按钮 -->
     <!-- 底部按钮 -->
     <div class="text-center mt-4">
     <div class="text-center mt-4">
       <el-button @click="goBack">返回</el-button>
       <el-button @click="goBack">返回</el-button>
-      <el-button type="primary" @click="handlePrint">打印</el-button>
     </div>
     </div>
   </div>
   </div>
 </template>
 </template>
@@ -487,6 +486,16 @@ onMounted(() => {
   }
   }
 }
 }
 
 
+:deep(.custom-descriptions .el-descriptions__label) {
+  width: 160px;
+  /* 可选:强制不换行 */
+  white-space: nowrap;
+}
+:deep(.custom-descriptions .el-descriptions__content) {
+  /* 内容区域自动占剩余空间 */
+  flex: 1;
+}
+
 @media print {
 @media print {
   .el-button {
   .el-button {
     display: none;
     display: none;