hurx hai 4 días
pai
achega
42d043257c

+ 2 - 0
src/api/order/orderDeliver/types.ts

@@ -82,6 +82,8 @@ export interface OrderDeliverVO {
   remark: string;
 
   deliverProductList: any[];
+
+  deliverCode?: string;
 }
 
 export interface OrderDeliverForm extends BaseEntity {

+ 80 - 29
src/api/order/orderMain/types.ts

@@ -9,16 +9,28 @@ export interface OrderMainVO {
    */
   orderNo: string;
 
-  /**
-   * 发货单号
-   */
-  shipmentNo: string;
+  parentOrderId: string | number;
+
+  parentOrderNo: string;
+
+  subOrderId: string | number;
 
   /**
    * 子订单编号
    */
   subOrderNo: string;
 
+  currentLevel: number;
+
+  orderType: string;
+
+  shipmentsType: string;
+
+  /**
+   * 发货单号
+   */
+  shipmentNo: string;
+
   /**
    * 所属公司
    */
@@ -29,13 +41,13 @@ export interface OrderMainVO {
    */
   customerId: string | number;
 
+  customerName: string;
+
   /**
    * 客户编号
    */
   customerCode: string;
 
-  customerName: string;
-
   /**
    * 用户ID(关联用户表)
    */
@@ -96,26 +108,13 @@ export interface OrderMainVO {
    */
   userDept: string;
 
+  userDeptName: string;
+
   /**
    * 商品总数量
    */
   productQuantity: number;
 
-  /**
-   * 商品种数
-   */
-  productTotal: number;
-
-  /**
-   * 已分配数量
-   */
-  assigned: number;
-
-  /**
-   * 未分配数量
-   */
-  unassigned: number;
-
   /**
    * 运费(元)
    */
@@ -252,6 +251,21 @@ export interface OrderMainVO {
 
   isSplitChild: string;
 
+  /**
+   * 商品种数
+   */
+  productTotal: number;
+
+  /**
+   * 已分配数量
+   */
+  assigned: number;
+
+  /**
+   * 未分配数量
+   */
+  unassigned: number;
+
   /**
    * 备注
    */
@@ -259,6 +273,10 @@ export interface OrderMainVO {
 
   checkStatus: string;
 
+  assigneeRemark: string;
+
+  assigneeName: string;
+
   assignmentStatus: string;
 
   orderProductList: any[];
@@ -277,16 +295,28 @@ export interface OrderMainForm extends BaseEntity {
    */
   orderNo?: string;
 
-  /**
-   * 发货单号
-   */
-  shipmentNo?: string;
+  parentOrderId?: string | number;
+
+  parentOrderNo?: string;
+
+  subOrderId?: string | number;
 
   /**
    * 子订单编号
    */
   subOrderNo?: string;
 
+  currentLevel?: number;
+
+  orderType?: string;
+
+  shipmentsType?: string;
+
+  /**
+   * 发货单号
+   */
+  shipmentNo?: string;
+
   /**
    * 所属公司
    */
@@ -297,6 +327,8 @@ export interface OrderMainForm extends BaseEntity {
    */
   customerId?: string | number;
 
+  customerName?: string;
+
   /**
    * 客户编号
    */
@@ -337,6 +369,10 @@ export interface OrderMainForm extends BaseEntity {
    */
   creditLimit?: number;
 
+  temporaryQuota?: number;
+
+  remainingQuota?: number;
+
   /**
    * 预计送达时间
    */
@@ -524,16 +560,29 @@ export interface OrderMainQuery extends PageQuery {
    */
   orderNo?: string;
 
-  /**
-   * 发货单号
-   */
-  shipmentNo?: string;
+  parentOrderId?: string | number;
+
+  parentOrderNo?: string;
+
+  subOrderId?: string | number;
 
   /**
    * 子订单编号
    */
   subOrderNo?: string;
 
+  currentLevel?: number;
+
+  currentLevelStr?: string;
+
+  orderType?: string;
+
+  shipmentsType?: string;
+  /**
+   * 发货单号
+   */
+  shipmentNo?: string;
+
   /**
    * 所属公司
    */
@@ -762,6 +811,8 @@ export interface OrderMainQuery extends PageQuery {
 
   assignmentStatus?: string;
 
+  assigneeType?: string;
+
   /**
    * 日期范围参数
    */

+ 123 - 0
src/api/order/orderMainCrrcExt/index.ts

@@ -0,0 +1,123 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { OrderMainCrrcExtVO, OrderMainCrrcExtForm, OrderMainCrrcExtQuery } from '@/api/order/orderMainCrrcExt/types';
+
+/**
+ * 查询中车电子商城订单扩展列表
+ * @param query
+ * @returns {*}
+ */
+export const listOrderMainCrrcExt = (query?: OrderMainCrrcExtQuery): AxiosPromise<OrderMainCrrcExtVO[]> => {
+  return request({
+    url: '/order/mainCrrcExt/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询中车电子商城订单扩展详细
+ * @param id
+ */
+export const getOrderMainCrrcExt = (id: string | number): AxiosPromise<OrderMainCrrcExtVO> => {
+  return request({
+    url: '/order/mainCrrcExt/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增中车电子商城订单扩展
+ * @param data
+ */
+export const addOrderMainCrrcExt = (data: OrderMainCrrcExtForm) => {
+  return request({
+    url: '/order/mainCrrcExt',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改中车电子商城订单扩展
+ * @param data
+ */
+export const updateOrderMainCrrcExt = (data: OrderMainCrrcExtForm) => {
+  return request({
+    url: '/order/mainCrrcExt',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除中车电子商城订单扩展
+ * @param id
+ */
+export const delOrderMainCrrcExt = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/order/mainCrrcExt/' + id,
+    method: 'delete'
+  });
+};
+
+/**
+ * 导出中车电子商城订单扩展
+ * @param query
+ */
+export const exportOrderMainCrrcExt = (query?: OrderMainCrrcExtQuery) => {
+  return request({
+    url: '/order/mainCrrcExt/export',
+    method: 'post',
+    params: query
+  });
+};
+
+/**
+ * 一键确定订单
+ * @param orderIds 订单ID列表,多个用逗号分隔
+ */
+export const oneKeyConfirmOrder = (orderIds: string) => {
+  return request({
+    url: '/order/mainCrrcExt/oneKeyConfirmOrder/' + orderIds,
+    method: 'post'
+  });
+};
+
+/**
+ * 导入订单发货数据
+ * @param file 导入文件
+ */
+export const importDeliverData = (file: File) => {
+  const formData = new FormData();
+  formData.append('file', file);
+  return request({
+    url: '/order/mainCrrcExt/importDeliverData',
+    method: 'post',
+    data: formData,
+    headers: {
+      'Content-Type': 'multipart/form-data'
+    }
+  });
+};
+
+/**
+ * 获取订单发货导入模板
+ */
+export const importDeliverTemplate = () => {
+  return request({
+    url: '/order/mainCrrcExt/importDeliverTemplate',
+    method: 'post',
+    responseType: 'blob'
+  });
+};
+/**
+ * 导出发货信息
+ */
+export const exportOrderDeliverInfo = () => {
+  return request({
+    url: '/order/mainCrrcExt/exportOrderDeliverInfo',
+    method: 'post',
+    responseType: 'blob'
+  });
+};

+ 534 - 0
src/api/order/orderMainCrrcExt/types.ts

@@ -0,0 +1,534 @@
+/**
+ * 中车电子商城订单扩展 VO
+ */
+export interface OrderMainCrrcExtVO {
+  /**
+   * 主键ID,建议与 order_main.id 保持一致(一对一)
+   */
+  id: string | number;
+
+  /**
+   * 中车电子商城订单号(orderNo),幂等判断关键字段
+   */
+  crrcOrderNo: string;
+
+  /**
+   * 采购平台订单号(purchaserOrderNo),中车内部采购系统订单编号
+   */
+  purchaserOrderNo: string;
+
+  /**
+   * 订单类型(preOrder):0普通订单 1预购单 2预存单
+   */
+  preOrder: number;
+
+  /**
+   * 中车订单状态(orderStatus),原始状态值,做状态映射用
+   */
+  crrcOrderStatus: string;
+
+  /**
+   * 电商系统订单号(mallOrderNo),中车确认接单后返回
+   */
+  mallOrderNo: string;
+
+  /**
+   * 收货人姓名(name)
+   */
+  receiverName: string;
+
+  /**
+   * 一级地址编码:收货人省份地址编码
+   */
+  provinceId: string;
+
+  /**
+   * 省名称
+   */
+  provinceName: string;
+
+  /**
+   * 二级地址编码:收货人市级地址编码
+   */
+  cityId: string;
+
+  /**
+   * 市名称
+   */
+  cityName: string;
+
+  /**
+   * 三级地址编码:收货人县(区)级地址编码
+   */
+  countyId: string;
+
+  /**
+   * 区名称
+   */
+  countyName: string;
+
+  /**
+   * 四级地址编码:收货人乡镇地址编码(如果该地区有四级地址,则必须传递四级地址,没有四级地址则传 0)
+   */
+  townId: string;
+
+  /**
+   * 乡镇名称
+   */
+  townName: string;
+
+  /**
+   * 收货详细地址(address)
+   */
+  detailAddress: string;
+
+  /**
+   * 邮编(zip)
+   */
+  zip: string;
+
+  /**
+   * 收货人手机号(mobile)
+   */
+  mobile: string;
+
+  /**
+   * 收货人座机号(phone)
+   */
+  phone: string;
+
+  /**
+   * 收货人邮箱(email)
+   */
+  email: string;
+
+  /**
+   * 下单人姓名(buyer)
+   */
+  buyerName: string;
+
+  /**
+   * 下单人手机号(buyerMobile)
+   */
+  buyerMobile: string;
+
+  /**
+   * 采购单位名称(purchaserName)
+   */
+  purchaserName: string;
+
+  /**
+   * 采购部门名称(purchaserDeptName),多级结构字符串
+   */
+  purchaserDeptName: string;
+
+  /**
+   * 支付方式(paymentType):01账期 02按单 03混合支付
+   */
+  paymentType: string;
+
+  /**
+   * 支付渠道(payClient):1微信 2支付宝
+   */
+  payClient: string;
+
+  /**
+   * 支付流水号(paySerialNum)
+   */
+  paySerialNum: string;
+
+  /**
+   * 账期支付金额(payAccount),混合支付时必填
+   */
+  payAccount: number;
+
+  /**
+   * 现金支付金额(payMoney),混合支付时必填
+   */
+  payMoney: number;
+
+  /**
+   * 预存款支付金额(payPrestore)
+   */
+  payPrestore: number;
+
+  /**
+   * 是否需要发货凭证(voucher):0否 1货物照片
+   */
+  voucher: string;
+
+  /**
+   * 中车订单创建时间(orderTime),格式YYYY-MM-DD HH:MM:SS
+   */
+  orderTime: string;
+
+  /**
+   * 中车接口原始返回JSON报文(留存做审计与问题排查)
+   */
+  rawJson: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status: string;
+
+  /**
+   * 分配原因
+   */
+  remark: string;
+}
+
+/**
+ * 中车电子商城订单扩展 BO
+ */
+export interface OrderMainCrrcExtForm extends BaseEntity {
+  /**
+   * 主键ID,建议与 order_main.id 保持一致(一对一)
+   */
+  id?: string | number;
+
+  /**
+   * 中车电子商城订单号(orderNo),幂等判断关键字段
+   */
+  crrcOrderNo?: string;
+
+  /**
+   * 采购平台订单号(purchaserOrderNo),中车内部采购系统订单编号
+   */
+  purchaserOrderNo?: string;
+
+  /**
+   * 订单类型(preOrder):0普通订单 1预购单 2预存单
+   */
+  preOrder?: number;
+
+  /**
+   * 中车订单状态(orderStatus),原始状态值,做状态映射用
+   */
+  crrcOrderStatus?: string;
+
+  /**
+   * 电商系统订单号(mallOrderNo),中车确认接单后返回
+   */
+  mallOrderNo?: string;
+
+  /**
+   * 收货人姓名(name)
+   */
+  receiverName?: string;
+
+  /**
+   * 一级地址编码:收货人省份地址编码
+   */
+  provinceId?: string;
+
+  /**
+   * 省名称
+   */
+  provinceName?: string;
+
+  /**
+   * 二级地址编码:收货人市级地址编码
+   */
+  cityId?: string;
+
+  /**
+   * 市名称
+   */
+  cityName?: string;
+
+  /**
+   * 三级地址编码:收货人县(区)级地址编码
+   */
+  countyId?: string;
+
+  /**
+   * 区名称
+   */
+  countyName?: string;
+
+  /**
+   * 四级地址编码:收货人乡镇地址编码(如果该地区有四级地址,则必须传递四级地址,没有四级地址则传 0)
+   */
+  townId?: string;
+
+  /**
+   * 乡镇名称
+   */
+  townName?: string;
+
+  /**
+   * 收货详细地址(address)
+   */
+  detailAddress?: string;
+
+  /**
+   * 邮编(zip)
+   */
+  zip?: string;
+
+  /**
+   * 收货人手机号(mobile)
+   */
+  mobile?: string;
+
+  /**
+   * 收货人座机号(phone)
+   */
+  phone?: string;
+
+  /**
+   * 收货人邮箱(email)
+   */
+  email?: string;
+
+  /**
+   * 下单人姓名(buyer)
+   */
+  buyerName?: string;
+
+  /**
+   * 下单人手机号(buyerMobile)
+   */
+  buyerMobile?: string;
+
+  /**
+   * 采购单位名称(purchaserName)
+   */
+  purchaserName?: string;
+
+  /**
+   * 采购部门名称(purchaserDeptName),多级结构字符串
+   */
+  purchaserDeptName?: string;
+
+  /**
+   * 支付方式(paymentType):01账期 02按单 03混合支付
+   */
+  paymentType?: string;
+
+  /**
+   * 支付渠道(payClient):1微信 2支付宝
+   */
+  payClient?: string;
+
+  /**
+   * 支付流水号(paySerialNum)
+   */
+  paySerialNum?: string;
+
+  /**
+   * 账期支付金额(payAccount),混合支付时必填
+   */
+  payAccount?: number;
+
+  /**
+   * 现金支付金额(payMoney),混合支付时必填
+   */
+  payMoney?: number;
+
+  /**
+   * 预存款支付金额(payPrestore)
+   */
+  payPrestore?: number;
+
+  /**
+   * 是否需要发货凭证(voucher):0否 1货物照片
+   */
+  voucher?: string;
+
+  /**
+   * 中车订单创建时间(orderTime),格式YYYY-MM-DD HH:MM:SS
+   */
+  orderTime?: string;
+
+  /**
+   * 中车接口原始返回JSON报文(留存做审计与问题排查)
+   */
+  rawJson?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 分配原因
+   */
+  remark?: string;
+}
+
+/**
+ * 中车电子商城订单扩展查询参数
+ */
+export interface OrderMainCrrcExtQuery extends PageQuery {
+  /**
+   * 中车电子商城订单号(orderNo),幂等判断关键字段
+   */
+  crrcOrderNo?: string;
+
+  /**
+   * 采购平台订单号(purchaserOrderNo),中车内部采购系统订单编号
+   */
+  purchaserOrderNo?: string;
+
+  /**
+   * 订单类型(preOrder):0普通订单 1预购单 2预存单
+   */
+  preOrder?: number;
+
+  /**
+   * 中车订单状态(orderStatus),原始状态值,做状态映射用
+   */
+  crrcOrderStatus?: string;
+
+  /**
+   * 电商系统订单号(mallOrderNo),中车确认接单后返回
+   */
+  mallOrderNo?: string;
+
+  /**
+   * 收货人姓名(name)
+   */
+  receiverName?: string;
+
+  /**
+   * 一级地址编码:收货人省份地址编码
+   */
+  provinceId?: string;
+
+  /**
+   * 省名称
+   */
+  provinceName?: string;
+
+  /**
+   * 二级地址编码:收货人市级地址编码
+   */
+  cityId?: string;
+
+  /**
+   * 市名称
+   */
+  cityName?: string;
+
+  /**
+   * 三级地址编码:收货人县(区)级地址编码
+   */
+  countyId?: string;
+
+  /**
+   * 区名称
+   */
+  countyName?: string;
+
+  /**
+   * 四级地址编码:收货人乡镇地址编码(如果该地区有四级地址,则必须传递四级地址,没有四级地址则传 0)
+   */
+  townId?: string;
+
+  /**
+   * 乡镇名称
+   */
+  townName?: string;
+
+  /**
+   * 收货详细地址(address)
+   */
+  detailAddress?: string;
+
+  /**
+   * 邮编(zip)
+   */
+  zip?: string;
+
+  /**
+   * 收货人手机号(mobile)
+   */
+  mobile?: string;
+
+  /**
+   * 收货人座机号(phone)
+   */
+  phone?: string;
+
+  /**
+   * 收货人邮箱(email)
+   */
+  email?: string;
+
+  /**
+   * 下单人姓名(buyer)
+   */
+  buyerName?: string;
+
+  /**
+   * 下单人手机号(buyerMobile)
+   */
+  buyerMobile?: string;
+
+  /**
+   * 采购单位名称(purchaserName)
+   */
+  purchaserName?: string;
+
+  /**
+   * 采购部门名称(purchaserDeptName),多级结构字符串
+   */
+  purchaserDeptName?: string;
+
+  /**
+   * 支付方式(paymentType):01账期 02按单 03混合支付
+   */
+  paymentType?: string;
+
+  /**
+   * 支付渠道(payClient):1微信 2支付宝
+   */
+  payClient?: string;
+
+  /**
+   * 支付流水号(paySerialNum)
+   */
+  paySerialNum?: string;
+
+  /**
+   * 账期支付金额(payAccount),混合支付时必填
+   */
+  payAccount?: number;
+
+  /**
+   * 现金支付金额(payMoney),混合支付时必填
+   */
+  payMoney?: number;
+
+  /**
+   * 预存款支付金额(payPrestore)
+   */
+  payPrestore?: number;
+
+  /**
+   * 是否需要发货凭证(voucher):0否 1货物照片
+   */
+  voucher?: string;
+
+  /**
+   * 中车订单创建时间(orderTime),格式YYYY-MM-DD HH:MM:SS
+   */
+  orderTime?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 分配原因
+   */
+  remark?: string;
+
+  /**
+   * 日期范围参数
+   */
+  params?: any;
+}

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

@@ -0,0 +1,75 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { OrderStatusLogVO, OrderStatusLogForm, OrderStatusLogQuery } from '@/api/order/orderStatusLog/types';
+
+/**
+ * 查询订单状态流转记录列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listOrderStatusLog = (query?: OrderStatusLogQuery): AxiosPromise<OrderStatusLogVO[]> => {
+  return request({
+    url: '/order/orderStatusLog/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询订单状态流转记录详细
+ * @param id
+ */
+export const getOrderStatusLog = (id: string | number): AxiosPromise<OrderStatusLogVO> => {
+  return request({
+    url: '/order/orderStatusLog/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增订单状态流转记录
+ * @param data
+ */
+export const addOrderStatusLog = (data: OrderStatusLogForm) => {
+  return request({
+    url: '/order/orderStatusLog',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改订单状态流转记录
+ * @param data
+ */
+export const updateOrderStatusLog = (data: OrderStatusLogForm) => {
+  return request({
+    url: '/order/orderStatusLog',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除订单状态流转记录
+ * @param id
+ */
+export const delOrderStatusLog = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/order/orderStatusLog/' + id,
+    method: 'delete'
+  });
+};
+
+/**
+ * 查询最新状态流转记录
+ * @param data
+ */
+export const selectNewOneLog = (data: OrderStatusLogForm) => {
+  return request({
+    url: '/order/orderStatusLog/selectNewOne',
+    method: 'post',
+    data: data
+  });
+};

+ 219 - 0
src/api/order/orderStatusLog/types.ts

@@ -0,0 +1,219 @@
+export interface OrderStatusLogVO {
+  /**
+   * 主键ID
+   */
+  id: string | number;
+
+  /**
+   * 订单编号
+   */
+  orderNo: string;
+
+  /**
+   * 订单ID (关联订单主表)
+   */
+  orderId: string | number;
+
+  /**
+   * 客户编号
+   */
+  customerNo: string;
+
+  /**
+   * 客户ID (关联客户主表)
+   */
+  customerId: string | number;
+
+  /**
+   * 状态类型(发货方式)
+   */
+  deliverMethod: string;
+
+  /**
+   * 状态名称
+   */
+  statusName: string;
+
+  /**
+   * 驳回原因
+   */
+  turnDown: string;
+
+  /**
+   * 图片路径 (多张逗号分隔或JSON)
+   */
+  images: string;
+
+  /**
+   * 图片路径 (多张逗号分隔或JSON)Url
+   */
+  imagesUrl: string;
+  /**
+   * 物流单号
+   */
+  logisticNos: string;
+
+  /**
+   * 下一审批人
+   */
+  nextApprover: string;
+
+  /**
+   * 是否审批流程中 (1:否, 0:是)
+   */
+  isApprovalProcess: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+}
+
+export interface OrderStatusLogForm extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 订单编号
+   */
+  orderNo?: string;
+
+  /**
+   * 订单ID (关联订单主表)
+   */
+  orderId?: string | number;
+
+  /**
+   * 客户编号
+   */
+  customerNo?: string;
+
+  /**
+   * 客户ID (关联客户主表)
+   */
+  customerId?: string | number;
+
+  /**
+   * 状态类型(发货方式)
+   */
+  deliverMethod?: string;
+
+  /**
+   * 状态名称
+   */
+  statusName?: string;
+
+  /**
+   * 驳回原因
+   */
+  turnDown?: string;
+
+  /**
+   * 图片路径 (多张逗号分隔或JSON)
+   */
+  images?: string;
+
+  /**
+   * 物流单号
+   */
+  logisticNos?: string;
+
+  /**
+   * 下一审批人
+   */
+  nextApprover?: string;
+
+  /**
+   * 是否审批流程中 (1:否, 0:是)
+   */
+  isApprovalProcess?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+}
+
+export interface OrderStatusLogQuery extends PageQuery {
+  /**
+   * 订单编号
+   */
+  orderNo?: string;
+
+  /**
+   * 订单ID (关联订单主表)
+   */
+  orderId?: string | number;
+
+  /**
+   * 客户编号
+   */
+  customerNo?: string;
+
+  /**
+   * 客户ID (关联客户主表)
+   */
+  customerId?: string | number;
+
+  /**
+   * 状态类型(发货方式)
+   */
+  deliverMethod?: string;
+
+  /**
+   * 状态名称
+   */
+  statusName?: string;
+
+  /**
+   * 驳回原因
+   */
+  turnDown?: string;
+
+  /**
+   * 图片路径 (多张逗号分隔或JSON)
+   */
+  images?: string;
+
+  /**
+   * 物流单号
+   */
+  logisticNos?: string;
+
+  /**
+   * 下一审批人
+   */
+  nextApprover?: string;
+
+  /**
+   * 是否审批流程中 (1:否, 0:是)
+   */
+  isApprovalProcess?: string;
+
+  /**
+   * 状态(0正常 1停用)
+   */
+  status?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+  /**
+   * 日期范围参数
+   */
+  params?: any;
+}

+ 32 - 28
src/views/order/saleOrder/index.vue

@@ -46,50 +46,46 @@
 
     <el-card shadow="never">
       <template #header>
-        <el-row :gutter="10" class="mb8">
-          <el-col :span="13"> 销售订单信息列表 </el-col>
-          <el-col :span="1.5">
+        <el-row :gutter="10" class="mb8" type="flex" justify="space-between" align="middle">
+          <span style="font-size: 16px; font-weight: 500">自营订单信息列表</span>
+
+          <div style="display: flex; flex-wrap: nowrap; gap: 10px">
+            <!-- <el-button type="primary" @click="handleBatchConfirm()" :disabled="!ids.length" plain>批量确认订单</el-button> -->
+            <!-- <el-button type="primary" @click="showImportDialog = true" plain>导入发货</el-button> -->
+            <!-- <el-button type="primary" @click="handleExportDeliver()" :loading="exportDeliverLoading" plain>导出发货单</el-button> -->
             <el-button type="primary" @click="handleCloseOrder()" :disabled="!ids.length" plain>关闭订单</el-button>
-          </el-col>
-          <el-col :span="1.5">
             <el-button type="primary" @click="handleDelete()" :disabled="!ids.length" plain>删除订单</el-button>
-          </el-col>
-          <el-col :span="1.5">
-            <el-button type="primary" plain :disabled="!ids.length">导出订单</el-button>
-          </el-col>
-          <el-col :span="1.5">
+            <el-button type="primary" :disabled="!ids.length" plain>导出订单</el-button>
             <el-button
               :type="queryParams.orderStatus === undefined ? 'primary' : ''"
               :plain="queryParams.orderStatus !== undefined"
               @click="handleQuery()"
-              >全部订单{{ orderStatusStats.totalCount }}</el-button
+              >全部订单</el-button
             >
-          </el-col>
-          <el-col :span="1.5">
+            <!-- 全部订单{{ orderStatusStats.totalCount }}</el-button
+            > -->
+
             <el-button :type="queryParams.orderStatus === '0' ? 'primary' : ''" :plain="queryParams.orderStatus !== '0'" @click="handleQuery('0')"
-              >待付款{{ orderStatusStats.pendingPaymentCount }}</el-button
+              >待付款</el-button
             >
-          </el-col>
-          <el-col :span="1.5">
+            <!-- {{ orderStatusStats.pendingPaymentCount }} -->
             <el-button :type="queryParams.orderStatus === '2' ? 'primary' : ''" :plain="queryParams.orderStatus !== '2'" @click="handleQuery('2')"
-              >待发货{{ orderStatusStats.pendingShipmentCount }}</el-button
+              >待发货</el-button
             >
-          </el-col>
-          <el-col :span="1.5">
+            <!-- {{ orderStatusStats.pendingShipmentCount }} -->
             <el-button :type="queryParams.orderStatus === '4' ? 'primary' : ''" :plain="queryParams.orderStatus !== '4'" @click="handleQuery('4')"
-              >已发货{{ orderStatusStats.shippedCount }}</el-button
+              >已发货</el-button
             >
-          </el-col>
-          <el-col :span="1.5">
+            <!-- {{ orderStatusStats.shippedCount }} -->
             <el-button :type="queryParams.orderStatus === '5' ? 'primary' : ''" :plain="queryParams.orderStatus !== '5'" @click="handleQuery('5')"
-              >已完成{{ orderStatusStats.completedCount }}</el-button
+              >已完成</el-button
             >
-          </el-col>
-          <el-col :span="1.5">
+            <!-- {{ orderStatusStats.completedCount }} -->
             <el-button :type="queryParams.orderStatus === '6' ? 'primary' : ''" :plain="queryParams.orderStatus !== '6'" @click="handleQuery('6')"
-              >已关闭{{ orderStatusStats.closedCount }}</el-button
+              >已关闭</el-button
             >
-          </el-col>
+            <!-- {{ orderStatusStats.closedCount }} -->
+          </div>
         </el-row>
       </template>
 
@@ -98,6 +94,11 @@
         <el-table-column label="订单时间" align="center" prop="orderTime" :resizable="false" />
         <el-table-column label="订单编号" align="center" prop="orderNo" :resizable="false" />
         <el-table-column label="客户编号" align="center" prop="customerCode" :resizable="false" />
+        <el-table-column label="客户名称" align="center" prop="customerName" :resizable="false">
+          <template #default="scope">
+            <span>{{ scope.row.customerName || '--' }}</span>
+          </template>
+        </el-table-column>
         <el-table-column label="订单总金额" align="center" prop="totalAmount" :resizable="false" />
         <el-table-column label="支付方式" align="center" prop="payType" :resizable="false">
           <template #default="scope">
@@ -301,6 +302,9 @@ const data = reactive<PageData<OrderMainForm, OrderMainQuery>>({
     expenseType: undefined,
     status: undefined,
     platformCode: undefined,
+    dataSource: '1',
+    currentLevelStr: '1',
+
     params: {}
   },
   rules: {
@@ -624,7 +628,7 @@ const getButtonsByStatus = (orderStatus: string, checkStatus: string): ActionBut
 
   // 非已取消和已关闭状态:显示取消订单按钮
   if (orderStatus !== OrderStatus.CANCELLED && orderStatus !== OrderStatus.CLOSED) {
-    buttons.push({ label: '取消订单', handler: handleCancel });
+    // buttons.push({ label: '取消订单', handler: handleCancel });
   }
 
   return buttons;

+ 683 - 0
src/views/order/saleOrder/indexProject.vue

@@ -0,0 +1,683 @@
+<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="orderTime">
+              <el-date-picker
+                v-model="dateRange"
+                type="daterange"
+                range-separator="至"
+                start-placeholder="开始时间"
+                end-placeholder="结束时间"
+                value-format="YYYY-MM-DD"
+              />
+            </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" type="flex" justify="space-between" align="middle">
+          <span style="font-size: 16px; font-weight: 500">项目订单信息列表</span>
+
+          <div style="display: flex; flex-wrap: nowrap; gap: 10px">
+            <!-- <el-button type="primary" @click="handleBatchConfirm()" :disabled="!ids.length" plain>批量确认订单</el-button> -->
+            <!-- <el-button type="primary" @click="showImportDialog = true" plain>导入发货</el-button> -->
+            <!-- <el-button type="primary" @click="handleExportDeliver()" :loading="exportDeliverLoading" plain>导出发货单</el-button> -->
+            <el-button type="primary" @click="handleCloseOrder()" :disabled="!ids.length" plain>关闭订单</el-button>
+            <el-button type="primary" @click="handleDelete()" :disabled="!ids.length" plain>删除订单</el-button>
+            <el-button type="primary" :disabled="!ids.length" plain>导出订单</el-button>
+            <el-button
+              :type="queryParams.orderStatus === undefined ? 'primary' : ''"
+              :plain="queryParams.orderStatus !== undefined"
+              @click="handleQuery()"
+              >全部订单</el-button
+            >
+            <!-- 全部订单{{ orderStatusStats.totalCount }}</el-button
+            > -->
+
+            <el-button :type="queryParams.orderStatus === '0' ? 'primary' : ''" :plain="queryParams.orderStatus !== '0'" @click="handleQuery('0')"
+              >待付款</el-button
+            >
+            <!-- {{ orderStatusStats.pendingPaymentCount }} -->
+            <el-button :type="queryParams.orderStatus === '2' ? 'primary' : ''" :plain="queryParams.orderStatus !== '2'" @click="handleQuery('2')"
+              >待发货</el-button
+            >
+            <!-- {{ orderStatusStats.pendingShipmentCount }} -->
+            <el-button :type="queryParams.orderStatus === '4' ? 'primary' : ''" :plain="queryParams.orderStatus !== '4'" @click="handleQuery('4')"
+              >已发货</el-button
+            >
+            <!-- {{ orderStatusStats.shippedCount }} -->
+            <el-button :type="queryParams.orderStatus === '5' ? 'primary' : ''" :plain="queryParams.orderStatus !== '5'" @click="handleQuery('5')"
+              >已完成</el-button
+            >
+            <!-- {{ orderStatusStats.completedCount }} -->
+            <el-button :type="queryParams.orderStatus === '6' ? 'primary' : ''" :plain="queryParams.orderStatus !== '6'" @click="handleQuery('6')"
+              >已关闭</el-button
+            >
+            <!-- {{ orderStatusStats.closedCount }} -->
+          </div>
+        </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" :resizable="false" />
+        <el-table-column label="订单编号" align="center" prop="orderNo" :resizable="false" />
+        <el-table-column label="平台\项目订单号" align="center" prop="projectOrderNo">
+          <template #default="scope">
+            <span>{{ scope.row._crrcOrderNo || '' }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="客户编号" align="center" prop="customerCode" :resizable="false">
+          <template #default="scope">
+            <span>{{ scope.row.customerCode || '--' }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="客户名称" align="center" prop="customerName" :resizable="false">
+          <template #default="scope">
+            <span>{{ scope.row.customerName || '--' }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="订单总金额" align="center" prop="totalAmount" :resizable="false" />
+        <!-- <el-table-column label="支付方式" align="center" prop="payType" :resizable="false">
+          <template #default="scope">
+            <dict-tag :options="pay_method" :value="scope.row.payType" />
+          </template>
+        </el-table-column>
+        <el-table-column label="业务员" align="center" prop="businessStaff" :resizable="false" />
+        <el-table-column label="客服" align="center" prop="customerService" :resizable="false" />
+        <el-table-column label="归属部门" align="center" prop="businessDept" :resizable="false" /> -->
+        <el-table-column label="订单来源" align="center" prop="orderSource" :resizable="false">
+          <template #default="scope">
+            <dict-tag :options="order_source" :value="scope.row.orderSource" :resizable="false" />
+          </template>
+        </el-table-column>
+        <el-table-column label="所属项目" align="center" prop="dataSource">
+          <template #default="scope">
+            {{ scope.row.dataSource == 'zhongche' ? '中车' : '--' }}
+          </template>
+        </el-table-column>
+        <el-table-column label="审核状态" align="center" prop="checkStatus" :resizable="false">
+          <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" :resizable="false">
+          <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" :resizable="false">
+          <template #default="scope">
+            <template v-for="btn in getActionButtons(scope.row)" :key="btn.label">
+              <el-button link type="primary" @click="btn.handler(scope.row)">{{ btn.label }}</el-button>
+            </template>
+          </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" />
+
+    <!-- 物流详情对话框 -->
+    <LogisticsDetail v-model="showLogisticsDialog" :order-id="logisticsOrderId" />
+  </div>
+</template>
+
+<script setup name="OrderMain" lang="ts">
+import {
+  listOrderMain,
+  getOrderMain,
+  delOrderMain,
+  addOrderMain,
+  closeOrderMain,
+  updateOrderMain,
+  queryOrderStatusStats,
+  changeStatus,
+  changeCheckStatus
+} from '@/api/order/orderMain';
+import { getOrderMainCrrcExt } from '@/api/order/orderMainCrrcExt';
+import { OrderMainVO, OrderMainQuery, OrderMainForm } from '@/api/order/orderMain/types';
+import DeliverDialog from './deliverDialog.vue';
+import LogisticsDetail from './logisticsDetail.vue';
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+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 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 checkStatusValue = ref('1'); // 审核状态选择值
+
+// 发货对话框
+const showDeliverDialog = ref(false);
+const currentOrderId = ref<string | number>();
+const currentOrderNo = ref<string>();
+const dateRange = ref<[DateModelType, DateModelType]>(['', '']);
+
+const showLogisticsDialog = ref(false);
+const logisticsOrderId = ref<string | number>();
+
+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,
+  isSplitChild: 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,
+    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,
+    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,
+    status: undefined,
+    platformCode: undefined,
+    dataSource: '2', //查询项目订单
+    currentLevelStr: '1',
+    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));
+  const rows = res.rows;
+  await fetchCrrcOrderNos(rows);
+  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 handleCloseOrder = async (row?: OrderMainVO) => {
+  const _ids = row?.id || ids.value;
+  await proxy?.$modal.confirm('是否确认关闭订单主信息编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
+  await closeOrderMain(_ids);
+  proxy?.$modal.msgSuccess('关闭成功');
+  await getList();
+};
+
+// 批量获取平台订单号
+const fetchCrrcOrderNos = async (rows: OrderMainVO[]) => {
+  const results = await Promise.allSettled(
+    rows.map((row) => {
+      const id = row.parentOrderId || row.id;
+      if (!id) return Promise.resolve(null);
+      return getOrderMainCrrcExt(id);
+    })
+  );
+  rows.forEach((row, i) => {
+    const result = results[i];
+    if (result.status === 'fulfilled') {
+      (row as any)._crrcOrderNo = result.value?.data?.crrcOrderNo || '';
+    } else {
+      (row as any)._crrcOrderNo = '';
+    }
+  });
+};
+
+/** 取消按钮 */
+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 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 handleCancel = async (row?: OrderMainVO) => {
+  const oldValue = row.checkStatus; // 保存旧值
+
+  // 弹出审核选择对话框
+  try {
+    // 调用接口,传入用户选择的值
+    await changeStatus(row.id, '7');
+    getList();
+    proxy?.$modal.msgSuccess('操作成功');
+  } catch (error) {
+    // 用户取消或操作失败
+    if (error !== 'cancel' && error !== 'close') {
+      row.checkStatus = oldValue; // 失败回滚
+      proxy?.$modal.msgError('操作失败,请重试');
+    }
+  }
+};
+
+/** 发货按钮操作 */
+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 = () => {
+  getList();
+};
+
+/** 查看物流按钮操作 */
+const handleViewLogistics = (row?: OrderMainVO) => {
+  if (!row?.id) {
+    proxy?.$modal.msgWarning('订单ID不能为空');
+    return;
+  }
+  logisticsOrderId.value = row.id;
+  showLogisticsDialog.value = true;
+};
+
+/** 修改按钮操作 */
+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(
+    'system/orderMain/export',
+    {
+      ...queryParams.value
+    },
+    `orderMain_${new Date().getTime()}.xlsx`
+  );
+};
+
+// 订单状态枚举
+enum OrderStatus {
+  PENDING_PAYMENT = '0', // 待支付
+  PENDING_CONFIRM = '1', // 待确认
+  PENDING_SHIPMENT = '2', // 待发货
+  PARTIAL_SHIPMENT = '3', // 部分发货
+  SHIPMENT_COMPLETED = '4', // 发货完成
+  COMPLETED = '5', // 已完成
+  CLOSED = '6', // 已关闭
+  CANCELLED = '7' // 已取消
+}
+
+// 审核状态枚举
+enum CheckStatus {
+  PENDING = '0', // 待审核
+  APPROVED = '1', // 审核通过
+  REJECTED = '2' // 已驳回
+}
+
+// 按钮配置类型
+interface ActionButton {
+  label: string;
+  handler: (row: OrderMainVO) => void;
+}
+
+// 按钮配置映射:根据订单状态和审核状态返回可用按钮
+const getButtonsByStatus = (orderStatus: string, checkStatus: string): ActionButton[] => {
+  const buttons: ActionButton[] = [];
+
+  // 待支付状态:显示查看按钮
+  if (orderStatus === OrderStatus.PENDING_PAYMENT) {
+    buttons.push({ label: '查看', handler: handleReview });
+  }
+
+  // 待审核:显示审核按钮
+  // if (checkStatus === CheckStatus.PENDING) {
+  //   buttons.push({ label: '审核', handler: handleCheck });
+  // }
+
+  // 待发货或部分发货:显示发货按钮
+  if (orderStatus === OrderStatus.PENDING_SHIPMENT || orderStatus === OrderStatus.PARTIAL_SHIPMENT) {
+    // buttons.push({ label: '发货', handler: handleDeliver });
+  }
+
+  // 待发货、部分发货、发货完成、已完成:显示查看订单信息按钮
+  if (
+    [OrderStatus.PENDING_SHIPMENT, OrderStatus.PARTIAL_SHIPMENT, OrderStatus.SHIPMENT_COMPLETED, OrderStatus.COMPLETED].includes(
+      orderStatus as OrderStatus
+    )
+  ) {
+    buttons.push({ label: '查看订单信息', handler: handleReview });
+  }
+
+  // 发货完成或已完成:显示查看物流按钮
+  if (orderStatus === OrderStatus.SHIPMENT_COMPLETED || orderStatus === OrderStatus.COMPLETED) {
+    buttons.push({ label: '查看物流', handler: handleViewLogistics });
+  }
+
+  // 非已取消和已关闭状态:显示取消订单按钮
+  if (orderStatus !== OrderStatus.CANCELLED && orderStatus !== OrderStatus.CLOSED) {
+    // buttons.push({ label: '取消订单', handler: handleCancel });
+  }
+
+  return buttons;
+};
+
+// 根据订单状态获取可用的操作按钮
+const getActionButtons = (row: OrderMainVO): ActionButton[] => {
+  return getButtonsByStatus(row.orderStatus, row.checkStatus);
+};
+
+onMounted(() => {
+  getList();
+});
+
+onActivated(() => {
+  getList();
+});
+</script>

+ 118 - 28
src/views/order/saleOrder/logisticsDetail.vue

@@ -1,5 +1,5 @@
 <template>
-  <el-dialog v-model="visible" title="物流信息" width="700px" :before-close="handleClose">
+  <el-drawer v-model="visible" title="物流信息" size="38%" direction="rtl" :before-close="handleClose" :close-on-click-modal="true">
     <div class="logistics-detail">
       <div class="section-title">单号查询</div>
 
@@ -9,8 +9,8 @@
             <el-option
               v-for="item in logisticsList"
               :key="item.id"
-              :label="`${item.logisticNo},${getDictLabel(deliver_method, item.deliverMethod)}`"
-              :value="item.logisticNo"
+              :label="`${item.logisticNo || item.deliverCode},${getDictLabel(deliver_method, item.deliverMethod)}`"
+              :value="item.logisticNo || item.deliverCode"
             />
           </el-select>
         </el-form-item>
@@ -21,11 +21,31 @@
       <el-timeline v-if="logisticsInfo.length > 0">
         <el-timeline-item v-for="(item, index) in logisticsInfo" :key="index" :timestamp="item.time" placement="top">
           <div class="timeline-content">
-            <div class="timeline-status">{{ index }}</div>
+            <div class="timeline-status">{{ index + 1 }}</div>
             <div class="timeline-detail">
               <div>{{ item.time }}</div>
               <div>{{ item.location }}</div>
               <div>{{ item.status }}</div>
+              <div v-if="item.imagesUrl" class="timeline-images">
+                <div class="image-label">签收图片:</div>
+                <div class="image-list">
+                  <el-image
+                    v-for="(url, imgIndex) in item.imagesUrl.split(',')"
+                    :key="imgIndex"
+                    :src="url"
+                    :preview-src-list="item.imagesUrl.split(',')"
+                    :initial-index="imgIndex"
+                    fit="cover"
+                    class="sign-image"
+                  >
+                    <template #error>
+                      <div class="image-error">
+                        <el-icon><Picture /></el-icon>
+                      </div>
+                    </template>
+                  </el-image>
+                </div>
+              </div>
             </div>
           </div>
         </el-timeline-item>
@@ -33,13 +53,14 @@
 
       <el-empty v-else description="暂无物流信息" />
     </div>
-  </el-dialog>
+  </el-drawer>
 </template>
 
 <script setup lang="ts">
 import { listOrderDeliver, queryTrack } from '@/api/order/orderDeliver';
 import { OrderDeliverVO } from '@/api/order/orderDeliver/types';
-
+import { listOrderStatusLog } from '@/api/order/orderStatusLog';
+import { Picture } from '@element-plus/icons-vue';
 interface Props {
   modelValue: boolean;
   orderId?: string | number;
@@ -49,6 +70,7 @@ interface LogisticsInfo {
   time: string;
   location: string;
   status: string;
+  imagesUrl: string;
 }
 
 const props = defineProps<Props>();
@@ -88,7 +110,7 @@ const loadLogisticsList = async () => {
     logisticsList.value = res.rows || [];
 
     if (logisticsList.value.length > 0) {
-      form.value.selectedLogisticNo = logisticsList.value[0].logisticNo;
+      form.value.selectedLogisticNo = logisticsList.value[0].logisticNo || logisticsList.value[0].deliverCode;
       handleLogisticNoChange(form.value.selectedLogisticNo);
     }
   } catch (error) {
@@ -98,29 +120,60 @@ const loadLogisticsList = async () => {
 
 const handleLogisticNoChange = async (logisticNo: string) => {
   const selected = logisticsList.value.find((item) => item.logisticNo === logisticNo);
-  if (!selected) return;
-
   try {
-    const res = await queryTrack({
-      logisticNo: logisticNo,
-      pageNum: 1,
-      pageSize: 100
-    });
+    if (selected) {
+      const res = await queryTrack({
+        logisticNo: logisticNo,
+        logisticsCompanyCode: selected.logisticsCompanyCode,
+        //先使用送货人手机号其实应该是收货人手机号
+        phone: selected.consigneePhone,
+        pageNum: 1,
+        pageSize: 100
+      });
+      // 1. 兼容处理:有些接口返回在 res.data,有些可能直接是 res
+      const dataList = res.data || [];
+      if (Array.isArray(dataList) && dataList.length > 0) {
+        logisticsInfo.value = dataList.map((item: any) => {
+          // 2. 核心修复:精准匹配时间字段
+          // 顺丰用 'time',韵达用 'ftime'。
+          // 优先取 ftime (韵达标准),如果没有则取 time (顺丰标准)
+          const displayTime = item.ftime || item.time || item.acceptTime || '';
 
-    if (res.data && Array.isArray(res.data) && res.data.length > 0) {
-      logisticsInfo.value = res.data.map((item: any) => ({
-        time: item.acceptTime || item.time || '',
-        location: selected.orderCode ? `${selected.orderCode}` : '',
-        status: item.context || ''
-      }));
+          return {
+            time: displayTime,
+            // 3. 建议:保留原始状态字段,方便后续筛选(如"已签收")
+            status: item.context || item.content || '',
+            // 4. 建议:如果有地址字段,也可以映射进来,没有则保持订单号
+            location: item.location || (selected.orderCode ? `${selected.orderCode}` : ''),
+            imagesUrl: ''
+          };
+        });
+      }
     } else {
-      logisticsInfo.value = [
-        {
-          time: (selected as any).createTime || '',
-          location: selected.orderCode ? `${selected.orderCode}` : '',
-          status: '已下单'
-        }
-      ];
+      await listOrderStatusLog({
+        orderId: props.orderId,
+        logisticNos: form.value.selectedLogisticNo,
+        logisticsCompanyCode: selected?.logisticsCompanyCode,
+        pageNum: 1,
+        pageSize: 100
+      }).then((res) => {
+        logisticsInfo.value = res.rows.map((item: any) => {
+          return {
+            time: item.createTime,
+            location: item.orderCode ? `${item.orderCode}` : '',
+            status: item.statusName,
+            imagesUrl: item.imagesUrl
+          };
+        });
+      });
+
+      // logisticsInfo.value = [
+      //   {
+      //     time: (selected as any).createTime || '',
+      //     location: selected.orderCode ? `${selected.orderCode}` : '',
+      //     status: '已下单'
+      //   }
+      // ];
     }
   } catch (error) {
     console.error('Failed to query track:', error);
@@ -128,7 +181,8 @@ const handleLogisticNoChange = async (logisticNo: string) => {
       {
         time: (selected as any).createTime || '',
         location: selected.orderCode ? `${selected.orderCode}` : '',
-        status: '已下单'
+        status: '已下单',
+        imagesUrl: ''
       }
     ];
   }
@@ -186,6 +240,42 @@ const handleClose = () => {
           margin-bottom: 0;
         }
       }
+
+      .timeline-images {
+        margin-top: 8px;
+        padding-top: 8px;
+        border-top: 1px dashed #dcdfe6;
+
+        .image-label {
+          font-size: 13px;
+          color: #909399;
+          margin-bottom: 6px;
+        }
+
+        .image-list {
+          display: flex;
+          flex-wrap: wrap;
+          gap: 8px;
+
+          .sign-image {
+            width: 60px;
+            height: 60px;
+            border-radius: 4px;
+            border: 1px solid #dcdfe6;
+            cursor: pointer;
+
+            .image-error {
+              width: 100%;
+              height: 100%;
+              display: flex;
+              align-items: center;
+              justify-content: center;
+              background-color: #f5f7fa;
+              color: #c0c4cc;
+            }
+          }
+        }
+      }
     }
   }
 

+ 262 - 30
src/views/order/saleOrder/sendDetail.vue

@@ -4,6 +4,8 @@
       <!-- 订单信息 -->
       <el-descriptions title="订单信息" :column="2" border class="custom-descriptions">
         <el-descriptions-item label="订单编号">{{ orderDetail.orderNo }}</el-descriptions-item>
+        <el-descriptions-item label="关联单号">{{ orderDetail.parentOrderNo }}</el-descriptions-item>
+        <el-descriptions-item label="项目/平台订单号" v-if="crrcExtInfo.crrcOrderNo">{{ crrcExtInfo.crrcOrderNo }}</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="支付状态">
@@ -14,13 +16,13 @@
         </el-descriptions-item>
         <el-descriptions-item label="下单时间">{{ orderDetail.orderTime }}</el-descriptions-item>
         <el-descriptions-item label="确认时间">{{ orderDetail.confirmTime }}</el-descriptions-item>
-        <el-descriptions-item label="发货时间">{{ orderDetail.shippingTime }}</el-descriptions-item>
+        <!-- <el-descriptions-item label="发货时间">{{ orderDetail.shippingTime }}</el-descriptions-item> -->
         <el-descriptions-item label="签收时间">{{ orderDetail.receivingTime }}</el-descriptions-item>
       </el-descriptions>
     </el-card>
 
     <!-- 订单详情信息 -->
-    <el-card shadow="never" class="mb-2">
+    <el-card shadow="never" class="mb-2" v-if="!orderDetail.dataSource">
       <template #header>
         <span>订单基本信息</span>
       </template>
@@ -36,7 +38,7 @@
           </div>
           <div class="detail-item">
             <span class="label">发票类型:</span>
-            <span>{{ invoiceTypeInfo.invoiceTypeNo || '--' }},{{ invoiceTypeInfo.invoiceTypeName || '--' }}</span>
+            <span>{{ orderDetail.invoiceType }}</span>
           </div>
           <div class="detail-item">
             <span class="label">发货仓库:</span>
@@ -50,6 +52,10 @@
             <span class="label">订单备注:</span>
             <span>{{ orderDetail.remark }}</span>
           </div>
+          <div class="detail-item">
+            <span class="label">分配备注:</span>
+            <span>{{ orderDetail.assigneeRemark }}</span>
+          </div>
           <div class="detail-item">
             <span class="label">附件:</span>
             <span>{{ orderDetail.attachmentPath || '' }}</span>
@@ -75,8 +81,8 @@
         </el-col>
         <el-col :span="8">
           <div class="detail-item">
-            <span class="label">所属项目</span>
-            <span>{{ '--' }}</span>
+            <span class="label">所属项目</span>
+            <span>{{ orderDetail.dataSource == 'zhongche' ? '中车' : '--' }}</span>
           </div>
           <div class="detail-item">
             <span class="label">业务部门:</span>
@@ -84,7 +90,7 @@
           </div>
           <div class="detail-item">
             <span class="label">下单部门:</span>
-            <span>{{ orderDetail.userDept }}</span>
+            <span>{{ orderDetail.userDeptName }}</span>
           </div>
           <div class="detail-item">
             <span class="label">订单状态:</span>
@@ -95,7 +101,7 @@
     </el-card>
 
     <!-- 收货信息 -->
-    <el-card shadow="never" class="mb-2">
+    <el-card shadow="never" class="mb-2" v-if="!orderDetail.dataSource">
       <template #header>
         <span>收货信息</span>
       </template>
@@ -106,6 +112,27 @@
       </el-descriptions>
     </el-card>
 
+    <!-- 项目订单扩展信息 -->
+    <el-card v-if="orderDetail.dataSource" shadow="never" class="mb-2">
+      <template #header>
+        <span>项目订单扩展信息</span>
+      </template>
+      <el-descriptions :column="3" border class="custom-descriptions">
+        <el-descriptions-item label="收货人">{{ crrcExtInfo.receiverName || '--' }}</el-descriptions-item>
+        <el-descriptions-item label="收货人手机号" :span="2">{{ crrcExtInfo.mobile || '--' }}</el-descriptions-item>
+        <el-descriptions-item label="收货人邮箱">{{ crrcExtInfo.email || '--' }}</el-descriptions-item>
+        <el-descriptions-item label="收货地址" :span="2">
+          {{ crrcExtInfo.provinceName || '' }}-{{ crrcExtInfo.cityName || '' }}-{{ crrcExtInfo.countyName || '' }}-{{ crrcExtInfo.townName || '' }}-{{
+            crrcExtInfo.detailAddress || ''
+          }}
+        </el-descriptions-item>
+        <el-descriptions-item label="下单人姓名">{{ crrcExtInfo.buyerName || '--' }}</el-descriptions-item>
+        <el-descriptions-item label="下单人手机号" :span="2">{{ crrcExtInfo.buyerMobile || '--' }}</el-descriptions-item>
+        <el-descriptions-item label="采购单位名称" :span="3">{{ crrcExtInfo.purchaserName || '--' }}</el-descriptions-item>
+        <el-descriptions-item label="采购部门名称" :span="3">{{ crrcExtInfo.purchaserDeptName || '--' }}</el-descriptions-item>
+      </el-descriptions>
+    </el-card>
+
     <!-- 商品明细 -->
     <el-card shadow="never" class="mb-2">
       <template #header>
@@ -133,9 +160,9 @@
         <el-table-column prop="unsentQuantity" label="未发货数量" />
       </el-table>
     </el-card>
-    <div class="mt-2 text-right">
+    <div class="mt-2 text-right" style="margin-right: 8px; margin-bottom: 10px">
       <span
-        >商品数:{{ totalQuantity }}, 其中有<span style="color: #f56c6c">{{ totalQuantitySent }}已经发货</span></span
+        >商品数:{{ totalQuantity }} , 其中有 <span style="color: #f56c6c">{{ totalQuantitySent }} 已经发货</span></span
       >
     </div>
     <!-- 信息汇总 -->
@@ -154,32 +181,56 @@
       </el-table>
     </el-card>
     <!-- 发货对话框 -->
-    <DeliverDialog v-model="showDeliverDialog" :order-id="currentOrderId" :order-no="currentOrderNo" @success="handleDeliverSuccess" />
+    <DeliverDialog
+      v-model="showDeliverDialog"
+      :order-id="currentOrderId"
+      :order-no="currentOrderNo"
+      :operate-type="operateType"
+      @success="handleDeliverSuccess"
+    />
+
+    <!-- 编辑发货信息对话框 -->
+    <!-- <EditDeliverDialog v-model="showEditDeliverDialog" :deliver-id="editDeliverId" @success="handleDeliverSuccess" /> -->
     <!-- 发货信息 -->
     <el-card shadow="never" class="mb-2" v-show="orderDetail.orderStatus != '0'">
       <template #header>
         <div class="card-header">
-          <span>发货信息:共{{ 0 }}个包裹</span>
-          <el-button type="primary" style="float: right" @click="handleAddDeliver(orderDetail)">添加发货信息</el-button>
+          <span>发货信息:共{{ orderDeliverList.length }}个包裹</span>
+          <!-- <el-button type="primary" v-if="orderDetail.orderStatus == '2' || orderDetail.orderStatus == '3'" @click="handleAddDeliver(orderDetail)"
+            >添加发货信息</el-button
+          > -->
         </div>
       </template>
-      <div v-show="totalQuantitySent > 0">
-        <div style="white-space: nowrap" class="mb-2">
-          <span style="margin-right: 16px">发货单号:--</span>
-          <span style="margin-right: 16px">发货时间:--</span>
-          <span style="margin-right: 16px">发货方式:--</span>
-          <span style="margin-right: 16px">送货人:--</span>
-          <span style="margin-right: 16px">手机:--</span>
-          <span style="margin-right: 16px">物流状态:--</span>
-          <span>发货备注:--</span>
+      <el-card v-for="deliver in orderDeliverList" :key="deliver.id">
+        <div class="mb-2" style="background: #f3f3f3; padding: 10px">
+          <el-row :gutter="20" justify="space-between" align="middle">
+            <el-col :span="18">
+              <div style="display: flex; flex-wrap: wrap; gap: 16px">
+                <span>发货单号:{{ (deliver as any).deliverCode || '--' }}</span>
+                <span>发货时间:{{ (deliver as any).createTime || '--' }}</span>
+                <span>发货方式:{{ getDictLabel(deliver_method, deliver.deliverMethod || '--') }}</span>
+                <span v-if="deliver.deliverMethod == '0'">收货人:{{ deliver.deliverMan || '--' }}</span>
+                <span>手机:{{ deliver.phone || deliver.consigneePhone }}</span>
+                <span style="margin-left: 30px" v-if="deliver.deliverMethod == '1'">物流单号:{{ deliver.logisticNo || '--' }}</span>
+                <span style="margin-left: 20px">发货备注:{{ deliver.deliverRemark || '--' }}</span>
+              </div>
+            </el-col>
+            <el-col :span="6">
+              <div style="text-align: right">
+                <el-button type="primary" @click="handleEditDeliver(deliver)">编辑发货信息</el-button>
+                <el-button type="primary" v-if="deliver.deliverMethod == '0'" @click="handleEditLogistics(deliver)">变更物流状态</el-button>
+                <el-button type="primary" @click="handleViewLogistics(orderDetail)">查看物流</el-button>
+              </div>
+            </el-col>
+          </el-row>
         </div>
-        <el-table :data="deliverProductList" border style="width: 100%">
+        <el-table :data="deliver.deliverProductList" border style="width: 100%">
           <el-table-column label="产品编号" prop="productNo" align="center" />
           <el-table-column label="商品名称" prop="productName" align="center" />
           <el-table-column label="单位" prop="productUnit" align="center" />
           <el-table-column label="发货数量" prop="deliverNum" align="center" />
         </el-table>
-      </div>
+      </el-card>
     </el-card>
 
     <!-- A10备货信息 -->
@@ -207,6 +258,8 @@
     <div class="text-center mt-4">
       <el-button @click="goBack">返回</el-button>
     </div>
+    <!-- 物流详情对话框 -->
+    <LogisticsDetail v-model="showLogisticsDialog" :order-id="logisticsOrderId" />
   </div>
 </template>
 
@@ -216,8 +269,12 @@ import DeliverDialog from './deliverDialog.vue';
 import { useRoute, useRouter } from 'vue-router';
 import { getOrderMain } from '@/api/order/orderMain';
 import { OrderMainVO } from '@/api/order/orderMain/types';
+import { listOrderProduct } from '@/api/order/orderProduct';
 import { OrderProductVO } from '@/api/order/orderProduct/types';
 import { DeliverProductVO } from '@/api/order/deliverProduct/types';
+import { listOrderDeliver } from '@/api/order/orderDeliver';
+import { OrderDeliverVO } from '@/api/order/orderDeliver/types';
+import { listDeliverProduct } from '@/api/order/deliverProduct';
 import { getShippingAddress } from '@/api/customer/customerFile/shippingAddress';
 import { ShippingAddressVO } from '@/api/customer/customerFile/shippingAddress/types';
 import { getWarehouse } from '@/api/company/warehouse';
@@ -228,10 +285,14 @@ import { getCustomerInfo } from '@/api/customer/customerFile/customerInfo';
 import { CustomerInfoVO } from '@/api/customer/customerFile/customerInfo/types';
 import { getInvoiceType } from '@/api/customer/invoiceType';
 import { InvoiceTypeVO } from '@/api/customer/invoiceType/types';
-
+import { selectNewOneLog } from '@/api/order/orderStatusLog';
+import { getDept } from '@/api/system/dept';
+import { getOrderMainCrrcExt } from '@/api/order/orderMainCrrcExt';
+import { OrderMainCrrcExtVO } from '@/api/order/orderMainCrrcExt/types';
+import LogisticsDetail from './logisticsDetail.vue';
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
-const { order_status, payment_status, fee_type, pay_method } = toRefs<any>(
-  proxy?.useDict('order_status', 'payment_status', 'fee_type', 'pay_method')
+const { order_status, payment_status, fee_type, pay_method, deliver_method } = toRefs<any>(
+  proxy?.useDict('order_status', 'payment_status', 'fee_type', 'pay_method', 'deliver_method')
 );
 const route = useRoute();
 const router = useRouter();
@@ -254,18 +315,37 @@ const invoiceTypeInfo = ref<InvoiceTypeVO>({} as InvoiceTypeVO);
 // 商品明细列表
 const productList = ref<OrderProductVO[]>([]);
 
+// 发货包裹列表
+const orderDeliverList = ref<OrderDeliverVO[]>([]);
 const deliverProductList = ref<DeliverProductVO[]>([]);
 
 // 收货地址信息
 const shippingAddress = ref<ShippingAddressVO>({} as ShippingAddressVO);
 
+// 中车订单扩展信息
+const crrcExtInfo = ref<OrderMainCrrcExtVO>({} as OrderMainCrrcExtVO);
+
+const operateType = ref('add');
+
 // 发货对话框
 const showDeliverDialog = ref(false);
 const currentOrderId = ref<string | number>();
 const currentOrderNo = ref<string>();
 
+// 编辑发货对话框
+const showEditDeliverDialog = ref(false);
+const editDeliverId = ref<string | number>();
+
+const showLogisticsDialog = ref(false);
+const logisticsOrderId = ref<string | number>();
+
+// 订单状态日志抽屉
+const statusLogDrawerRef = ref<any>(null);
+
 /** 发货成功回调 */
-const handleDeliverSuccess = () => {};
+const handleDeliverSuccess = () => {
+  getOrderDetail();
+};
 
 // 计算商品总数(所有商品的采购数量之和)
 const totalQuantity = computed(() => {
@@ -281,6 +361,28 @@ const totalQuantitySent = computed(() => {
   }, 0);
 });
 
+// 计算发货单编号列表(从 orderDeliverList 中提取 deliverCode 用逗号拼接)
+const shipmentNoList = computed(() => {
+  if (!orderDeliverList.value || orderDeliverList.value.length === 0) {
+    return orderDetail.value.shipmentNo || '--';
+  }
+  const deliverCodes = orderDeliverList.value
+    .map((deliver) => (deliver as any).deliverCode)
+    .filter((code) => code)
+    .join(',');
+  return deliverCodes || '--';
+});
+
+// 获取部门详细信息
+const getDeptDetail = async (deptId: string) => {
+  try {
+    const res = await getDept(deptId);
+    return res.data?.deptName || deptId;
+  } catch (error) {
+    return deptId;
+  }
+};
+
 // 获取订单详情
 const getOrderDetail = async () => {
   const orderId = route.query.id || route.params.id;
@@ -307,6 +409,11 @@ const getOrderDetail = async () => {
       await getDeliverProductList(orderDetail.value);
     }
 
+    // 获取发货单及关联的物流商品信息
+    if (orderDetail.value.id) {
+      await getOrderDeliverListData(orderDetail.value.id);
+    }
+
     // 获取收货地址
     if (orderDetail.value.shippingAddressId) {
       await getShippingAddressDetail(orderDetail.value.shippingAddressId);
@@ -326,11 +433,32 @@ const getOrderDetail = async () => {
     if (orderDetail.value.customerId) {
       await getCustomerDetail(orderDetail.value.customerId);
     }
+    if (orderDetail.value.userDept) {
+      orderDetail.value.userDeptName = await getDeptDetail(orderDetail.value.userDept);
+    }
 
-    // 获取发票类型信息
-    if (orderDetail.value.invoiceType) {
-      await getInvoiceTypeDetail(orderDetail.value.invoiceType);
+    // 获取中车订单扩展信息
+    //如果data.parentOrderId存在,则使用data.parentOrderId查询,否则使用data.id查询
+    if (orderDetail.value.parentOrderId) {
+      try {
+        const extRes = await getOrderMainCrrcExt(orderDetail.value.parentOrderId);
+        crrcExtInfo.value = extRes.data || ({} as OrderMainCrrcExtVO);
+      } catch (error) {
+        console.error('获取中车订单扩展信息失败:', error);
+      }
+    } else if (orderDetail.value.id) {
+      try {
+        const extRes = await getOrderMainCrrcExt(orderDetail.value.id);
+        crrcExtInfo.value = extRes.data || ({} as OrderMainCrrcExtVO);
+      } catch (error) {
+        console.error('获取中车订单扩展信息失败:', error);
+      }
     }
+
+    // 获取发票类型信息
+    // if (orderDetail.value.invoiceType) {
+    //   await getInvoiceTypeDetail(orderDetail.value.invoiceType);
+    // }
   } catch (error) {
     console.error('获取订单详情失败:', error);
     proxy?.$modal.msgError('获取订单详情失败');
@@ -343,11 +471,64 @@ const handleAddDeliver = (row?: OrderMainVO) => {
     proxy?.$modal.msgWarning('订单ID不能为空');
     return;
   }
+  operateType.value = 'add';
   currentOrderId.value = row.id;
   currentOrderNo.value = row.orderNo;
   showDeliverDialog.value = true;
 };
 
+/** 编辑发货信息操作 */
+const handleEditDeliver = (deliver: any) => {
+  if (!deliver?.id) {
+    proxy?.$modal.msgWarning('发货信息ID不能为空');
+    return;
+  }
+  editDeliverId.value = deliver.id;
+  showEditDeliverDialog.value = true;
+};
+
+const handleViewLogistics = (row?: OrderMainVO) => {
+  if (!row?.id) {
+    proxy?.$modal.msgWarning('订单ID不能为空');
+    return;
+  }
+  logisticsOrderId.value = row.id;
+
+  showLogisticsDialog.value = true;
+};
+
+/** 变更物流状态 */
+const handleEditLogistics = async (row?: any) => {
+  if (!row?.orderId) {
+    proxy?.$modal.msgWarning('订单ID不能为空');
+    return;
+  }
+
+  // 补充客户信息
+  row.customerId = orderDetail.value.customerId;
+  row.customerNo = orderDetail.value.customerCode;
+
+  let currentOrderStatus = '';
+
+  try {
+    const res = await selectNewOneLog({
+      orderId: row.orderId,
+      customerId: row.customerId,
+      logisticNos: row.deliverCode
+    });
+
+    if (res.code == 200 && res.data) {
+      row.images = res.data.images;
+      currentOrderStatus = res.data.statusName || '';
+    }
+  } catch (error) {
+    console.error('查询物流失败:', error);
+  }
+
+  // 4. 使用获取到的状态打开弹窗
+  statusLogDrawerRef.value?.openDrawer(row, currentOrderStatus);
+};
+
 // 获取商品明细列表
 const getProductList = async (orderDetail: OrderMainVO) => {
   try {
@@ -366,6 +547,31 @@ const getDeliverProductList = async (orderDetail: OrderMainVO) => {
   }
 };
 
+// 获取发货单列表
+const getOrderDeliverListData = async (orderId: string | number) => {
+  try {
+    const res = await listOrderDeliver({ orderId, pageNum: 1, pageSize: 100 });
+    const deliverList = (res as any).rows || res.data || [];
+
+    // 为每条发货记录获取商品明细
+    for (const deliver of deliverList) {
+      if (deliver.id) {
+        try {
+          const productRes = await listDeliverProduct({ deliverId: deliver.id, pageNum: 1, pageSize: 100 });
+          deliver.deliverProductList = (productRes as any).rows || productRes.data || [];
+        } catch (error) {
+          console.error(`获取发货单${deliver.id}的商品明细失败:`, error);
+          deliver.deliverProductList = [];
+        }
+      }
+    }
+
+    orderDeliverList.value = deliverList;
+  } catch (error) {
+    console.error('获取发货单列表失败:', error);
+  }
+};
+
 // 获取收货地址详情
 const getShippingAddressDetail = async (addressId: string | number) => {
   try {
@@ -376,6 +582,16 @@ const getShippingAddressDetail = async (addressId: string | number) => {
   }
 };
 
+// 获取中车订单扩展信息
+const getCrrcExtDetail = async (orderId: string | number) => {
+  try {
+    const res = await getOrderMainCrrcExt(orderId);
+    crrcExtInfo.value = res.data || ({} as OrderMainCrrcExtVO);
+  } catch (error) {
+    console.error('获取中车订单扩展信息失败:', error);
+  }
+};
+
 // 计算商品总金额(所有商品的小计之和)
 const totalAmount = computed(() => {
   return productList.value.reduce((sum, item) => {
@@ -460,6 +676,15 @@ const handlePrint = () => {
 onMounted(() => {
   getOrderDetail();
 });
+// 监听路由 query 中的 id 变化
+watch(
+  () => route.query.id, // 监听 id 的变化
+  (newOrderId) => {
+    if (newOrderId) {
+      getOrderDetail();
+    }
+  }
+);
 </script>
 
 <style scoped lang="scss">
@@ -495,6 +720,13 @@ onMounted(() => {
   flex: 1;
 }
 
+.card-header {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  min-height: 40px;
+}
+
 @media print {
   .el-button {
     display: none;