Parcourir la source

修改新增地址 发货等

hurx il y a 3 mois
Parent
commit
891b71f6f3

+ 1 - 1
src/api/company/logisticsCompany/index.ts

@@ -1,6 +1,6 @@
 import request from '@/utils/request';
 import { AxiosPromise } from 'axios';
-import { LogisticsCompanyVO, LogisticsCompanyForm, LogisticsCompanyQuery } from '@/api/system/logisticsCompany/types';
+import { LogisticsCompanyVO, LogisticsCompanyForm, LogisticsCompanyQuery } from '@/api/company/logisticsCompany/types';
 
 /**
  * 查询物流公司列表

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

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { DeliverProductVO, DeliverProductForm, DeliverProductQuery } from '@/api/order/deliverProduct/types';
+
+/**
+ * 查询订单发货商品明细列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listDeliverProduct = (query?: DeliverProductQuery): AxiosPromise<DeliverProductVO[]> => {
+  return request({
+    url: '/order/deliverProduct/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询订单发货商品明细详细
+ * @param id
+ */
+export const getDeliverProduct = (id: string | number): AxiosPromise<DeliverProductVO> => {
+  return request({
+    url: '/order/deliverProduct/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增订单发货商品明细
+ * @param data
+ */
+export const addDeliverProduct = (data: DeliverProductForm) => {
+  return request({
+    url: '/order/deliverProduct',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改订单发货商品明细
+ * @param data
+ */
+export const updateDeliverProduct = (data: DeliverProductForm) => {
+  return request({
+    url: '/order/deliverProduct',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除订单发货商品明细
+ * @param id
+ */
+export const delDeliverProduct = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/order/deliverProduct/' + id,
+    method: 'delete'
+  });
+};

+ 135 - 0
src/api/order/deliverProduct/types.ts

@@ -0,0 +1,135 @@
+export interface DeliverProductVO {
+  /**
+   * 主键ID
+   */
+  id: string | number;
+
+  /**
+   * 发货单
+   */
+  deliverId: string | number;
+
+  /**
+   * 商品编号
+   */
+  productId: string | number;
+
+  productNo: string;
+
+  /**
+   * 商品名称
+   */
+  productName: string;
+
+  /**
+   * 商品单位
+   */
+  productUnitId: string | number;
+
+  /**
+   * 商品单位
+   */
+  productUnit: string;
+
+  /**
+   * 本次发货数量
+   */
+  deliverNum: number;
+
+  dataSource: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+}
+
+export interface DeliverProductForm extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 发货单
+   */
+  deliverId?: string | number;
+
+  /**
+   * 商品编号
+   */
+  productId?: string | number;
+
+  productNo?: string;
+
+  /**
+   * 商品名称
+   */
+  productName?: string;
+
+  /**
+   * 商品单位
+   */
+  productUnitId?: string | number;
+
+  /**
+   * 商品单位
+   */
+  productUnit?: string;
+
+  /**
+   * 本次发货数量
+   */
+  deliverNum?: number;
+
+  dataSource?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+}
+
+export interface DeliverProductQuery extends PageQuery {
+  /**
+   * 发货单
+   */
+  deliverId?: string | number;
+
+  /**
+   * 商品编号
+   */
+  productId?: string | number;
+
+  /**
+   * 商品名称
+   */
+  productName?: string;
+
+  /**
+   * 商品单位
+   */
+  productUnitId?: string | number;
+
+  /**
+   * 商品单位
+   */
+  productUnit?: string;
+
+  /**
+   * 本次发货数量
+   */
+  deliverNum?: number;
+
+  dataSource?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+  /**
+   * 日期范围参数
+   */
+  params?: any;
+}

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

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { OrderDeliverVO, OrderDeliverForm, OrderDeliverQuery } from '@/api/order/orderDeliver/types';
+
+/**
+ * 查询订单发货主列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listOrderDeliver = (query?: OrderDeliverQuery): AxiosPromise<OrderDeliverVO[]> => {
+  return request({
+    url: '/order/orderDeliver/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询订单发货主详细
+ * @param id
+ */
+export const getOrderDeliver = (id: string | number): AxiosPromise<OrderDeliverVO> => {
+  return request({
+    url: '/order/orderDeliver/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增订单发货主
+ * @param data
+ */
+export const addOrderDeliver = (data: OrderDeliverForm) => {
+  return request({
+    url: '/order/orderDeliver',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改订单发货主
+ * @param data
+ */
+export const updateOrderDeliver = (data: OrderDeliverForm) => {
+  return request({
+    url: '/order/orderDeliver',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除订单发货主
+ * @param id
+ */
+export const delOrderDeliver = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/order/orderDeliver/' + id,
+    method: 'delete'
+  });
+};

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

@@ -0,0 +1,243 @@
+export interface OrderDeliverVO {
+  /**
+   * 主键ID
+   */
+  id: string | number;
+
+  /**
+   * 订单id
+   */
+  orderId: string | number;
+
+  /**
+   * 订单编号
+   */
+  orderCode: string;
+
+  /**
+   * 物流包裹号
+   */
+  logisticPackNo: string;
+
+  /**
+   * 发货方式
+   */
+  deliverMethod: string;
+
+  /**
+   * 送货人姓名
+   */
+  deliverMan: string;
+
+  /**
+   * 送货人联系电话
+   */
+  phone: string;
+
+  /**
+   * 物流状态
+   */
+  logisticsStatus: string;
+
+  /**
+   * 发货备注
+   */
+  deliverRemark: string;
+
+  /**
+   * 装箱/验货备注
+   */
+  checklistRemark: string;
+
+  /**
+   * 承运物流公司
+   */
+  logisticsCompany: number;
+
+  /**
+   * 物流单号
+   */
+  logisticNo: string;
+
+  /**
+   * 包裹状态
+   */
+  logisticPackStatus: string;
+
+  /**
+   * 收货人电话
+   */
+  consigneePhone: string;
+
+  dataSource: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+
+  deliverProductList: any[];
+}
+
+export interface OrderDeliverForm extends BaseEntity {
+  /**
+   * 主键ID
+   */
+  id?: string | number;
+
+  /**
+   * 订单id
+   */
+  orderId?: string | number;
+
+  /**
+   * 订单编号
+   */
+  orderCode?: string;
+
+  /**
+   * 物流包裹号
+   */
+  logisticPackNo?: string;
+
+  /**
+   * 发货方式
+   */
+  deliverMethod?: string;
+
+  /**
+   * 送货人姓名
+   */
+  deliverMan?: string;
+
+  /**
+   * 送货人联系电话
+   */
+  phone?: string;
+
+  /**
+   * 物流状态
+   */
+  logisticsStatus?: string;
+
+  /**
+   * 发货备注
+   */
+  deliverRemark?: string;
+
+  /**
+   * 装箱/验货备注
+   */
+  checklistRemark?: string;
+
+  /**
+   * 承运物流公司
+   */
+  logisticsCompany?: number;
+
+  /**
+   * 物流单号
+   */
+  logisticNo?: string;
+
+  /**
+   * 包裹状态
+   */
+  logisticPackStatus?: string;
+
+  /**
+   * 收货人电话
+   */
+  consigneePhone?: string;
+
+  dataSource?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+
+  /**
+   * 订单商品明细列表
+   */
+  orderDeliverProducts?: any[];
+}
+
+export interface OrderDeliverQuery extends PageQuery {
+  /**
+   * 订单id
+   */
+  orderId?: string | number;
+
+  /**
+   * 订单编号
+   */
+  orderCode?: string;
+
+  /**
+   * 物流包裹号
+   */
+  logisticPackNo?: string;
+
+  /**
+   * 发货方式
+   */
+  deliverMethod?: string;
+
+  /**
+   * 送货人姓名
+   */
+  deliverMan?: string;
+
+  /**
+   * 送货人联系电话
+   */
+  phone?: string;
+
+  /**
+   * 物流状态
+   */
+  logisticsStatus?: string;
+
+  /**
+   * 发货备注
+   */
+  deliverRemark?: string;
+
+  /**
+   * 装箱/验货备注
+   */
+  checklistRemark?: string;
+
+  /**
+   * 承运物流公司
+   */
+  logisticsCompany?: number;
+
+  /**
+   * 物流单号
+   */
+  logisticNo?: string;
+
+  /**
+   * 包裹状态
+   */
+  logisticPackStatus?: string;
+
+  /**
+   * 收货人电话
+   */
+  consigneePhone?: string;
+
+  dataSource?: string;
+
+  /**
+   * 平台标识
+   */
+  platformCode?: string;
+
+  /**
+   * 日期范围参数
+   */
+  params?: any;
+}

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

@@ -61,3 +61,16 @@ export const delOrderMain = (id: string | number | Array<string | number>) => {
     method: 'delete'
   });
 };
+
+/**
+ * 查询数量
+ * @param query
+ * @returns {*}
+ */
+
+export const queryOrderStatusStats = () => {
+  return request({
+    url: '/order/orderMain/queryOrderStatusStats',
+    method: 'get'
+  });
+};

+ 20 - 13
src/api/order/orderMain/types.ts

@@ -29,6 +29,11 @@ export interface OrderMainVO {
    */
   customerId: string | number;
 
+  /**
+   * 客户编号
+   */
+  customerCode: string;
+
   /**
    * 用户ID(关联用户表)
    */
@@ -214,11 +219,6 @@ export interface OrderMainVO {
    */
   expenseType: string;
 
-  /**
-   * 客户编号
-   */
-  customerNo: string;
-
   /**
    * 用户编号
    */
@@ -229,12 +229,16 @@ export interface OrderMainVO {
    */
   status: string;
 
+  dataSource: string;
+
   /**
    * 备注
    */
   remark: string;
 
   orderProductList: any[];
+
+  deliverProductList: any[];
 }
 
 export interface OrderMainForm extends BaseEntity {
@@ -268,6 +272,11 @@ export interface OrderMainForm extends BaseEntity {
    */
   customerId?: string | number;
 
+  /**
+   * 客户编号
+   */
+  customerCode: string;
+
   /**
    * 用户ID(关联用户表)
    */
@@ -453,11 +462,6 @@ export interface OrderMainForm extends BaseEntity {
    */
   expenseType?: string;
 
-  /**
-   * 客户编号
-   */
-  customerNo?: string;
-
   /**
    * 用户编号
    */
@@ -473,6 +477,8 @@ export interface OrderMainForm extends BaseEntity {
    */
   remark?: string;
 
+  dataSource?: string;
+
   /**
    * 订单商品明细列表
    */
@@ -695,7 +701,8 @@ export interface OrderMainQuery extends PageQuery {
   /**
    * 客户编号
    */
-  customerNo?: string;
+
+  customerCode?: string;
 
   /**
    * 用户编号
@@ -712,10 +719,10 @@ export interface OrderMainQuery extends PageQuery {
    */
   platformCode?: string;
 
+  dataSource?: string;
+
   /**
    * 日期范围参数
    */
   params?: any;
-
-  orderSourse?: string;
 }

+ 6 - 0
src/api/order/orderProduct/types.ts

@@ -118,6 +118,8 @@ export interface OrderProductVO {
    */
   status: string;
 
+  dataSource: string;
+
   /**
    * 备注
    */
@@ -240,6 +242,8 @@ export interface OrderProductForm extends BaseEntity {
    */
   status?: string;
 
+  dataSource?: string;
+
   /**
    * 备注
    */
@@ -357,6 +361,8 @@ export interface OrderProductQuery extends PageQuery {
    */
   status?: string;
 
+  dataSource?: string;
+
   /**
    * 平台标识
    */

+ 8 - 37
src/views/order/orderMain/components/chooseAddress.vue

@@ -34,6 +34,7 @@ import { ShippingAddressVO, ShippingAddressQuery } from '@/api/customer/customer
 interface Props {
   modelValue: boolean;
   customerId?: string | number;
+  addressList?: ShippingAddressVO[];
 }
 
 interface Emits {
@@ -45,52 +46,22 @@ const props = defineProps<Props>();
 const emit = defineEmits<Emits>();
 
 const visible = ref(false);
-const addressList = ref<ShippingAddressVO[]>([]);
 const selectedAddressId = ref<string | number>('');
 const selectedAddress = ref<ShippingAddressVO | null>(null);
 
-// 监听 modelValue 变化
+// 监听 modelValue 变化,同步到 visible
 watch(
   () => props.modelValue,
-  (val) => {
-    visible.value = val;
-    if (val && props.customerId) {
-      loadAddressList();
-    }
+  (newVal) => {
+    visible.value = newVal;
   },
   { immediate: true }
 );
 
-// 监听 customerId 变化
-watch(
-  () => props.customerId,
-  (val) => {
-    if (val && visible.value) {
-      loadAddressList();
-    }
-  }
-);
-
-// 加载地址列表
-const loadAddressList = async () => {
-  if (!props.customerId) {
-    addressList.value = [];
-    return;
-  }
-
-  try {
-    const queryParams: ShippingAddressQuery = {
-      customerId: props.customerId,
-      pageNum: 1,
-      pageSize: 100
-    };
-    const res = await listShippingAddress(queryParams);
-    addressList.value = res.rows || [];
-  } catch (error) {
-    console.error('加载地址列表失败:', error);
-    addressList.value = [];
-  }
-};
+// 监听 visible 变化,同步到 modelValue
+watch(visible, (newVal) => {
+  emit('update:modelValue', newVal);
+});
 
 // 选中行变化
 const handleCurrentChange = (row: ShippingAddressVO | null) => {

+ 13 - 2
src/views/order/orderMain/components/chooseProduct.vue

@@ -79,8 +79,8 @@
       :total="total"
       :page-sizes="[10, 20, 50, 100]"
       layout="total, sizes, prev, pager, next, jumper"
-      @size-change="handleQuery"
-      @current-change="handleQuery"
+      @size-change="handleSizeChange"
+      @current-change="handleCurrentChange"
       class="mt-4"
     />
   </el-dialog>
@@ -181,6 +181,17 @@ const handleQuery = () => {
   loadProductList();
 };
 
+// 分页大小变化
+const handleSizeChange = () => {
+  queryParams.value.pageNum = 1;
+  loadProductList();
+};
+
+// 页码变化
+const handleCurrentChange = () => {
+  loadProductList();
+};
+
 // 添加商品
 const handleAddProduct = (product: BaseVO) => {
   emit('confirm', product);

+ 40 - 6
src/views/order/orderMain/index.vue

@@ -294,7 +294,7 @@
     </div>
 
     <!-- 选择地址对话框 -->
-    <ChooseAddress v-model="showAddressDialog" :customer-id="form.customerId" @confirm="handleAddressConfirm" />
+    <ChooseAddress v-model="showAddressDialog" :customer-id="form.customerId" :address-list="addressList" @confirm="handleAddressConfirm" />
 
     <!-- 添加地址对话框 -->
     <AddAddress v-model="showAddAddressDialog" :customer-id="form.customerId" @success="handleAddAddressSuccess" />
@@ -315,7 +315,8 @@ import { listWarehouse, getWarehouse } from '@/api/company/warehouse';
 import { WarehouseVO, WarehouseQuery } from '@/api/company/warehouse/types';
 import { listCustomerInfo, getCustomerInfo } from '@/api/customer/customerFile/customerInfo';
 import { CustomerInfoVO, CustomerInfoQuery, CustomerInfoForm } from '@/api/customer/customerFile/customerInfo/types';
-import { ShippingAddressVO } from '@/api/customer/customerFile/shippingAddress/types';
+import { listShippingAddress } from '@/api/customer/customerFile/shippingAddress';
+import { ShippingAddressVO, ShippingAddressQuery } from '@/api/customer/customerFile/shippingAddress/types';
 import ChooseAddress from './components/chooseAddress.vue';
 import AddAddress from './components/addressDialog.vue';
 import ChooseProduct from './components/chooseProduct.vue';
@@ -395,6 +396,8 @@ const customerLoading = ref(false);
 // 客户部门列表
 const customerDeptList = ref<CustomerDeptVO[]>([]);
 
+const addressList = ref<ShippingAddressVO[]>([]);
+
 // 收货地址显示信息(仅用于显示,不提交)
 const addressDisplay = ref({
   receiverName: '',
@@ -425,11 +428,12 @@ const initFormData: OrderMainForm = {
   subOrderNo: undefined,
   companyId: undefined,
   customerId: undefined,
+  customerCode: undefined,
   userId: undefined,
   shippingAddressId: undefined,
   purchaseReason: undefined,
   invoiceType: undefined,
-  payType: undefined,
+  payType: '0',
   warehouseId: undefined,
   creditLimit: undefined,
   expectedDeliveryTime: undefined,
@@ -462,7 +466,6 @@ const initFormData: OrderMainForm = {
   productCode: undefined,
   cancelReason: undefined,
   expenseType: undefined,
-  customerNo: undefined,
   userNo: undefined,
   status: undefined,
   remark: undefined,
@@ -482,6 +485,7 @@ const data = reactive<PageData<OrderMainForm, OrderMainQuery>>({
     subOrderNo: undefined,
     companyId: undefined,
     customerId: undefined,
+    customerCode: undefined,
     userId: undefined,
     shippingAddressId: undefined,
 
@@ -510,6 +514,7 @@ watch(
     if (newVal !== oldVal) {
       // 清空客户选择和相关信息
       form.value.customerId = undefined;
+      form.value.customerCode = undefined;
       customerList.value = [];
       customerDeptList.value = [];
       form.value.creditLimit = undefined;
@@ -595,6 +600,7 @@ const submitForm = () => {
       try {
         // 组装订单商品明细数据
         const orderProductList = productList.value.map((product) => ({
+          productId: product.id,
           productNo: product.productCode, // 产品编号
           productName: product.productName, // 产品名称
           productUnit: product.unit, // 产品单位
@@ -609,6 +615,11 @@ const submitForm = () => {
           status: '0' // 状态(0正常)
         }));
 
+        if (form.value.payType == '0') {
+          //如果选项信用支付  则订单状态为待发货
+          form.value.orderStatus = '2';
+        }
+
         // 组装提交数据
         const submitData = {
           ...form.value,
@@ -627,7 +638,7 @@ const submitForm = () => {
 
         proxy?.$modal.msgSuccess('操作成功');
         // 可以在这里添加跳转逻辑,比如返回列表页
-        router.push('/order-manage/order-list');
+        router.push('/order-center/order-list');
       } catch (error) {
         console.error('提交订单失败:', error);
         proxy?.$modal.msgError('提交订单失败,请检查数据后重试');
@@ -689,6 +700,7 @@ const handleAddProduct = () => {
 const handleProductConfirm = (product: BaseVO) => {
   // 将商品添加到商品列表,按照新的字段映射
   const newProduct = {
+    id: product.id,
     productCode: product.productNo, // 产品编码
     productImage: product.productImage, // 商品图片
     productName: product.itemName, // 产品信息
@@ -818,7 +830,7 @@ const handleCustomerChange = async (customerId: string | number) => {
     // 获取客户详情
     const res = await getCustomerInfo(customerId);
     const customerInfo = res.data;
-
+    form.value.customerCode = customerInfo.customerNo;
     // 填充客户相关信息
     if (customerInfo.customerSalesInfoVo) {
       const salesInfo = customerInfo.customerSalesInfoVo;
@@ -831,6 +843,9 @@ const handleCustomerChange = async (customerId: string | number) => {
 
     // 获取客户部门列表
     await getCustomerDeptList(customerId);
+
+    // 获取客户收货地址列表
+    await loadAddressList(customerId);
   } catch (error) {
     console.error('获取客户详情失败:', error);
   }
@@ -849,6 +864,25 @@ const getCustomerDeptList = async (customerId: string | number) => {
   }
 };
 
+// 加载地址列表
+const loadAddressList = async (customerId: string | number) => {
+  if (!customerId) {
+    addressList.value = [];
+    return;
+  }
+  try {
+    const queryParams: any = {
+      customerId: customerId
+    };
+    const res = await listShippingAddress(queryParams);
+    addressList.value = res.rows || [];
+    console.log(addressList.value);
+  } catch (error) {
+    console.error('加载地址列表失败:', error);
+    addressList.value = [];
+  }
+};
+
 onMounted(() => {
   getCompanyList();
   getWarehouseList();

+ 388 - 0
src/views/order/saleOrder/deliverDialog.vue

@@ -0,0 +1,388 @@
+<template>
+  <el-dialog :model-value="modelValue" title="发货" width="1200px" @update:model-value="handleDialogChange" @open="handleOpen" @close="handleClose">
+    <el-form :model="form" :rules="rules" ref="formRef" label-width="120px">
+      <el-row :gutter="20">
+        <el-col :span="12">
+          <el-form-item label="订单编号" prop="orderCode">
+            <el-input v-model="form.orderCode" disabled />
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12" v-if="form.deliverMethod === '0'">
+          <el-form-item label="送货人" prop="deliverMan">
+            <el-input v-model="form.deliverMan" placeholder="请输入送货人姓名" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12" v-if="form.deliverMethod === '1'">
+          <el-form-item label="物流公司名称" prop="logisticsCompany">
+            <el-select v-model="form.logisticsCompany" placeholder="请选择" style="width: 100%" filterable>
+              <el-option v-for="company in logisticsCompanyList" :key="company.id" :label="company.logisticsName" :value="company.id" />
+            </el-select>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row :gutter="20">
+        <el-col :span="12">
+          <el-form-item v-if="form.deliverMethod === '1'" label="物流单号" prop="logisticNo">
+            <el-input v-model="form.logisticNo" placeholder="请输入物流单号" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="发货方式" prop="deliverMethod">
+            <el-radio-group v-model="form.deliverMethod">
+              <el-radio v-for="dict in deliver_method" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row :gutter="20">
+        <el-col :span="12" v-if="form.deliverMethod === '1'">
+          <el-form-item label="收货人手机" prop="consigneePhone">
+            <el-input v-model="form.consigneePhone" placeholder="请输入收货人手机" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12" v-if="form.deliverMethod === '0'">
+          <el-form-item label="手机号码" prop="phone">
+            <el-input v-model="form.phone" placeholder="请输入手机号码" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row :gutter="20">
+        <el-col :span="24">
+          <el-form-item label="发货备注" prop="deliverRemark">
+            <el-input v-model="form.deliverRemark" type="textarea" :rows="3" placeholder="请输入内容" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+
+    <!-- 商品列表 -->
+    <el-table :data="productList" border style="width: 100%" max-height="600px">
+      <el-table-column prop="productNo" label="产品编号" width="100" />
+      <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="200" show-overflow-tooltip />
+      <el-table-column prop="categoryName" label="类别" width="120" />
+      <el-table-column prop="productUnit" label="单位" width="80" />
+      <el-table-column prop="orderQuantity" label="商品总数" width="100" />
+      <el-table-column prop="quantitySent" label="已发货数量" width="100" />
+      <el-table-column prop="unsentQuantity" label="未发货数量" width="100" />
+      <el-table-column label="发货数量">
+        <template #default="scope">
+          <el-input-number
+            v-model="scope.row.deliverNum"
+            :min="0"
+            :max="scope.row.unsentQuantity"
+            :precision="0"
+            size="small"
+            :controls="false"
+            style="width: 100%"
+            @change="handleDeliveryQuantityChange(scope.$index)"
+          />
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" width="100" fixed="right" align="center">
+        <template #default="scope">
+          <el-button link type="danger" size="small" @click="handleDeleteProduct(scope.$index)">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <!-- 分页 -->
+    <el-pagination
+      v-model:current-page="queryParams.pageNum"
+      v-model:page-size="queryParams.pageSize"
+      :total="total"
+      :page-sizes="[20, 50, 100]"
+      layout="total, sizes, prev, pager, next, jumper"
+      @size-change="handleSizeChange"
+      @current-change="handleCurrentChange"
+      class="mt-4"
+    />
+
+    <template #footer>
+      <div class="dialog-footer">
+        <el-button @click="handleCancel">取消</el-button>
+        <el-button type="primary" :loading="submitLoading" @click="handleSubmit">确认</el-button>
+      </div>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup lang="ts">
+import { ref, reactive, computed, onMounted } from 'vue';
+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 { listLogisticsCompany } from '@/api/company/logisticsCompany';
+import { LogisticsCompanyVO } from '@/api/company/logisticsCompany/types';
+import { addOrderDeliver } from '@/api/order/orderDeliver';
+import { OrderDeliverVO, OrderDeliverForm } from '@/api/order/orderDeliver/types';
+import { ElMessage } from 'element-plus';
+
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { deliver_method } = toRefs<any>(proxy?.useDict('deliver_method'));
+
+interface Props {
+  modelValue: boolean;
+  orderId?: string | number;
+  orderNo?: string;
+}
+
+interface Emits {
+  (e: 'update:modelValue', value: boolean): void;
+  (e: 'success'): void;
+}
+
+const props = defineProps<Props>();
+const emit = defineEmits<Emits>();
+
+const formRef = ref();
+const submitLoading = ref(false);
+const productList = ref<any[]>([]);
+const total = ref(0);
+
+// 物流公司列表
+const logisticsCompanyList = ref<LogisticsCompanyVO[]>([]);
+
+// 查询参数
+const queryParams = ref({
+  pageNum: 1,
+  pageSize: 20,
+  orderId: undefined as string | number | undefined
+});
+
+// 表单数据
+const form = reactive<OrderDeliverForm>({
+  orderId: undefined,
+  orderCode: '',
+  logisticPackNo: '',
+  deliverMethod: '1',
+  deliverMan: '',
+  phone: '',
+  logisticsStatus: '',
+  deliverRemark: '',
+  checklistRemark: '',
+  logisticsCompany: undefined,
+  logisticNo: '',
+  logisticPackStatus: '',
+  consigneePhone: '',
+  remark: '',
+  orderDeliverProducts: []
+});
+
+// 动态校验规则
+const rules = computed(() => {
+  const baseRules: any = {
+    deliverMethod: [{ required: true, message: '请选择发货方式', trigger: 'change' }]
+  };
+
+  // 第三方物流(deliverMethod === '1')
+  if (form.deliverMethod === '1') {
+    baseRules.logisticsCompany = [{ required: true, message: '请选择物流公司', trigger: 'change' }];
+    baseRules.logisticNo = [{ required: true, message: '请输入物流单号', trigger: 'blur' }];
+    baseRules.consigneePhone = [
+      { required: true, message: '请输入收货人手机', trigger: 'blur' },
+      { pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号码', trigger: 'blur' }
+    ];
+  }
+
+  // 自有物流(deliverMethod === '0')
+  if (form.deliverMethod === '0') {
+    baseRules.deliverMan = [{ required: true, message: '请输入送货人姓名', trigger: 'blur' }];
+    baseRules.phone = [
+      { required: true, message: '请输入手机号码', trigger: 'blur' },
+      { pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号码', trigger: 'blur' }
+    ];
+  }
+
+  return baseRules;
+});
+
+// 对话框状态变化
+const handleDialogChange = (val: boolean) => {
+  emit('update:modelValue', val);
+};
+
+// 对话框打开时触发
+const handleOpen = () => {
+  resetForm();
+  if (props.orderId) {
+    form.orderId = props.orderId;
+    form.orderCode = props.orderNo || '';
+    queryParams.value.orderId = props.orderId;
+    loadProductList();
+  }
+};
+
+// 对话框关闭时触发
+const handleClose = () => {
+  resetForm();
+};
+
+// 重置表单
+const resetForm = () => {
+  form.orderId = undefined;
+  form.orderCode = '';
+  form.logisticsCompany = undefined;
+  form.logisticNo = '';
+  form.deliverMethod = '1';
+  form.deliverMan = '';
+  form.phone = '';
+  form.consigneePhone = '';
+  form.deliverRemark = '';
+  productList.value = [];
+  queryParams.value.pageNum = 1;
+  formRef.value?.clearValidate();
+};
+
+// 加载商品列表
+const loadProductList = async () => {
+  try {
+    const res = await getOrderMain(props.orderId);
+    console.log(res.data.orderProductList);
+
+    // 为每个商品添加发货数量字段,默认为未发货数量
+    productList.value = (res.data.orderProductList || []).map((item: OrderProductVO) => ({
+      ...item,
+      deliverNum: 0,
+      productNo: item.productNo,
+      productId: item.productId,
+      productUnitId: item.productUnit
+    }));
+    total.value = res.data.orderProductList.length || 0;
+  } catch (error) {
+    console.error('加载商品列表失败:', error);
+    ElMessage.error('加载商品列表失败');
+    productList.value = [];
+    total.value = 0;
+  }
+};
+
+// 加载物流公司列表
+const loadLogisticsCompanyList = async () => {
+  try {
+    const res = await listLogisticsCompany({
+      isShow: '0',
+      pageNum: 1,
+      pageSize: 1000
+    });
+    logisticsCompanyList.value = res.rows || [];
+  } catch (error) {
+    console.error('加载物流公司列表失败:', error);
+    logisticsCompanyList.value = [];
+  }
+};
+
+// 发货数量变化
+const handleDeliveryQuantityChange = (index: number) => {
+  const product = productList.value[index];
+  if (product) {
+    // 确保发货数量不超过未发货数量
+    if (product.deliverNum > product.unsentQuantity) {
+      product.deliverNum = product.unsentQuantity;
+      ElMessage.warning('发货数量不能大于未发货数量');
+    }
+    // 确保发货数量不小于0
+    if (product.deliverNum < 0) {
+      product.deliverNum = 0;
+    }
+  }
+};
+
+// 删除商品
+const handleDeleteProduct = (index: number) => {
+  productList.value.splice(index, 1);
+};
+
+// 分页大小变化
+const handleSizeChange = () => {
+  queryParams.value.pageNum = 1;
+  loadProductList();
+};
+
+// 页码变化
+const handleCurrentChange = () => {
+  loadProductList();
+};
+
+// 取消
+const handleCancel = () => {
+  emit('update:modelValue', false);
+};
+
+// 提交
+const handleSubmit = async () => {
+  try {
+    // 验证表单
+    await formRef.value?.validate();
+
+    // 验证是否有发货商品
+    const deliveryProducts = productList.value.filter((item) => item.deliverNum > 0);
+    if (deliveryProducts.length === 0) {
+      ElMessage.warning('请至少选择一个商品进行发货');
+      return;
+    }
+
+    submitLoading.value = true;
+
+    // 组装发货数据
+    const deliveryData: OrderDeliverForm = {
+      orderId: form.orderId,
+      orderCode: form.orderCode,
+      logisticsCompany: form.logisticsCompany,
+      logisticNo: form.logisticNo,
+      deliverMethod: form.deliverMethod,
+      deliverMan: form.deliverMan,
+      phone: form.phone,
+      consigneePhone: form.consigneePhone,
+      deliverRemark: form.deliverRemark,
+      orderDeliverProducts: deliveryProducts.map((item) => ({
+        productId: item.productId,
+        productNo: item.productNo,
+        productName: item.productName,
+        productUnitId: item.productUnitId,
+        productUnit: item.productUnit,
+        deliverNum: item.deliverNum
+      }))
+    };
+
+    // 调用发货API
+    await addOrderDeliver(deliveryData);
+
+    ElMessage.success('发货成功');
+    emit('success');
+    emit('update:modelValue', false);
+  } catch (error) {
+    console.error('发货失败:', error);
+    if (error !== false) {
+      // 不是表单验证失败
+      ElMessage.error('发货失败,请重试');
+    }
+  } finally {
+    submitLoading.value = false;
+  }
+};
+
+// 组件挂载时加载物流公司列表
+onMounted(() => {
+  loadLogisticsCompanyList();
+});
+</script>
+
+<style scoped lang="scss">
+.mt-4 {
+  margin-top: 16px;
+}
+
+.dialog-footer {
+  display: flex;
+  justify-content: flex-end;
+  gap: 10px;
+}
+</style>

+ 102 - 25
src/views/order/saleOrder/index.vue

@@ -7,15 +7,15 @@
             <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="customerNo">
-              <el-input v-model="queryParams.customerNo" placeholder="请输入订单编号" clearable @keyup.enter="handleQuery" />
+            <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="customerNo">
-              <el-input v-model="queryParams.customerName" placeholder="请输入订单编号" clearable @keyup.enter="handleQuery" />
+            <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="orderSourse">
-              <el-select v-model="queryParams.orderSourse" placeholder="请选择订单状态" clearable>
-                <el-option v-for="dict in order_sourse" :key="dict.value" :label="dict.label" :value="dict.value" />
+            <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">
@@ -25,11 +25,11 @@
             </el-form-item>
 
             <el-form-item label="提交时间" prop="orderTime">
-              <el-date-picker clearable v-model="queryParams.orderTime" type="date" value-format="YYYY-MM-DD" placeholder="请选择下单时间" />
+              <el-date-picker clearable v-model="queryParams.orderTime" type="daterange" value-format="YYYY-MM-DD" placeholder="请选择下单时间" />
             </el-form-item>
 
             <el-form-item>
-              <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+              <el-button type="primary" icon="Search" @click="handleQuery()">搜索</el-button>
               <el-button icon="Refresh" @click="resetQuery">重置</el-button>
             </el-form-item>
           </el-form>
@@ -40,7 +40,7 @@
     <el-card shadow="never">
       <template #header>
         <el-row :gutter="10" class="mb8">
-          <el-col :span="10"> 销售订单信息列表 </el-col>
+          <el-col :span="15"> 销售订单信息列表 </el-col>
           <el-col :span="1.5">
             <el-button type="primary" plain>关闭订单</el-button>
           </el-col>
@@ -51,22 +51,37 @@
             <el-button type="primary" plain>导出订单</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button type="primary" plain>全部订单</el-button>
+            <el-button
+              :type="queryParams.orderStatus === undefined ? 'primary' : ''"
+              :plain="queryParams.orderStatus !== undefined"
+              @click="handleQuery()"
+              >全部订单{{ orderStatusStats.totalCount }}</el-button
+            >
           </el-col>
           <el-col :span="1.5">
-            <el-button type="primary" plain>待付款</el-button>
+            <el-button :type="queryParams.orderStatus === '0' ? 'primary' : ''" :plain="queryParams.orderStatus !== '0'" @click="handleQuery('0')"
+              >待付款{{ orderStatusStats.pendingPaymentCount }}</el-button
+            >
           </el-col>
           <el-col :span="1.5">
-            <el-button type="primary" plain>待发货</el-button>
+            <el-button :type="queryParams.orderStatus === '2' ? 'primary' : ''" :plain="queryParams.orderStatus !== '2'" @click="handleQuery('2')"
+              >待发货{{ orderStatusStats.pendingShipmentCount }}</el-button
+            >
           </el-col>
           <el-col :span="1.5">
-            <el-button type="primary" plain>已发货</el-button>
+            <el-button :type="queryParams.orderStatus === '4' ? 'primary' : ''" :plain="queryParams.orderStatus !== '4'" @click="handleQuery('4')"
+              >已发货{{ orderStatusStats.shippedCount }}</el-button
+            >
           </el-col>
           <el-col :span="1.5">
-            <el-button type="primary" plain>已完成</el-button>
+            <el-button :type="queryParams.orderStatus === '5' ? 'primary' : ''" :plain="queryParams.orderStatus !== '5'" @click="handleQuery('5')"
+              >已完成{{ orderStatusStats.completedCount }}</el-button
+            >
           </el-col>
           <el-col :span="1.5">
-            <el-button type="primary" plain>已关闭</el-button>
+            <el-button :type="queryParams.orderStatus === '6' ? 'primary' : ''" :plain="queryParams.orderStatus !== '6'" @click="handleQuery('6')"
+              >已关闭{{ orderStatusStats.closedCount }}</el-button
+            >
           </el-col>
         </el-row>
       </template>
@@ -75,7 +90,7 @@
         <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="customerNo" />
+        <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">
@@ -98,21 +113,40 @@
 
         <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
           <template #default="scope">
-            <el-tooltip content="修改" placement="top">
-              <el-button link type="primary" @click="handleReview(scope.row)">查看订单信息</el-button>
-            </el-tooltip>
+            <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 === '2' || scope.row.orderStatus === '3'" @click="handleDeliver(scope.row)"
+              >发货</el-button
+            >
+            <el-button
+              link
+              type="primary"
+              v-if="scope.row.orderStatus === '2' || scope.row.orderStatus === '3' || scope.row.orderStatus === '4' || scope.row.orderStatus === '5'"
+              @click="handleReview(scope.row)"
+              >查看订单信息</el-button
+            >
+            <el-button link type="primary" v-if="scope.row.orderStatus === '4' || scope.row.orderStatus === '5'">查看物流</el-button>
+            <el-button
+              link
+              type="primary"
+              v-if="scope.row.orderStatus === '0' || scope.row.orderStatus === '3' || scope.row.orderStatus === '4' || scope.row.orderStatus === '5'"
+              >取消订单</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 } from '@/api/order/orderMain';
+import { listOrderMain, getOrderMain, delOrderMain, addOrderMain, updateOrderMain, queryOrderStatusStats } from '@/api/order/orderMain';
 import { OrderMainVO, OrderMainQuery, OrderMainForm } from '@/api/order/orderMain/types';
+import DeliverDialog from './deliverDialog.vue';
 
 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'));
@@ -129,11 +163,25 @@ const router = useRouter();
 const queryFormRef = ref<ElFormInstance>();
 const orderMainFormRef = ref<ElFormInstance>();
 
+// 发货对话框
+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,
@@ -141,6 +189,7 @@ const initFormData: OrderMainForm = {
   subOrderNo: undefined,
   companyId: undefined,
   customerId: undefined,
+  customerCode: undefined,
   userId: undefined,
   shippingAddressId: undefined,
   purchaseReason: undefined,
@@ -178,7 +227,6 @@ const initFormData: OrderMainForm = {
   productCode: undefined,
   cancelReason: undefined,
   expenseType: undefined,
-  customerNo: undefined,
   userNo: undefined,
   status: undefined,
   remark: undefined,
@@ -194,6 +242,7 @@ const data = reactive<PageData<OrderMainForm, OrderMainQuery>>({
     shipmentNo: undefined,
     subOrderNo: undefined,
     companyId: undefined,
+    customerCode: undefined,
     customerId: undefined,
     userId: undefined,
     shippingAddressId: undefined,
@@ -232,7 +281,6 @@ const data = reactive<PageData<OrderMainForm, OrderMainQuery>>({
     productCode: undefined,
     cancelReason: undefined,
     expenseType: undefined,
-    customerNo: undefined,
     orderSourse: undefined,
     status: undefined,
     platformCode: undefined,
@@ -261,6 +309,12 @@ const getList = async () => {
   orderMainList.value = res.rows;
   total.value = res.total;
   loading.value = false;
+  queryOrderStatusStatsMethod();
+};
+
+const queryOrderStatusStatsMethod = async () => {
+  const res = await queryOrderStatusStats();
+  orderStatusStats.value = res as any;
 };
 
 /** 取消按钮 */
@@ -276,7 +330,12 @@ const reset = () => {
 };
 
 /** 搜索按钮操作 */
-const handleQuery = () => {
+const handleQuery = (orderStatus?: string) => {
+  if (orderStatus) {
+    queryParams.value.orderStatus = orderStatus;
+  } else {
+    queryParams.value.orderStatus = undefined;
+  }
   queryParams.value.pageNum = 1;
   getList();
 };
@@ -296,11 +355,25 @@ const handleSelectionChange = (selection: OrderMainVO[]) => {
 
 const handleReview = (row?: OrderMainVO) => {
   router.push({
-    path: '/order-manage/order-sendDetail',
+    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();
@@ -351,4 +424,8 @@ const handleExport = () => {
 onMounted(() => {
   getList();
 });
+
+onActivated(() => {
+  getList();
+});
 </script>

+ 63 - 21
src/views/order/saleOrder/sendDetail.vue

@@ -153,29 +153,33 @@
         <el-table-column prop="payableAmount" label="应付款金额" align="center" />
       </el-table>
     </el-card>
-
+    <!-- 发货对话框 -->
+    <DeliverDialog v-model="showDeliverDialog" :order-id="currentOrderId" :order-no="currentOrderNo" @success="handleDeliverSuccess" />
     <!-- 发货信息 -->
-    <el-card shadow="never" class="mb-2" v-show="totalQuantitySent > 0">
+    <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>
         </div>
       </template>
-      <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>
+      <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>
+        </div>
+        <el-table :data="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-table border style="width: 100%">
-        <el-table-column label="产品编号" align="center" />
-        <el-table-column label="商品名称" align="center" />
-        <el-table-column label="单位" align="center" />
-        <el-table-column label="发货数量" align="center" />
-      </el-table>
     </el-card>
 
     <!-- A10备货信息 -->
@@ -209,11 +213,13 @@
 
 <script setup name="SendDetail" lang="ts">
 import { ref, computed, onMounted } from 'vue';
+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 { getShippingAddress } from '@/api/customer/customerFile/shippingAddress';
 import { ShippingAddressVO } from '@/api/customer/customerFile/shippingAddress/types';
 import { getWarehouse } from '@/api/company/warehouse';
@@ -250,9 +256,19 @@ const invoiceTypeInfo = ref<InvoiceTypeVO>({} as InvoiceTypeVO);
 // 商品明细列表
 const productList = ref<OrderProductVO[]>([]);
 
+const deliverProductList = ref<DeliverProductVO[]>([]);
+
 // 收货地址信息
 const shippingAddress = ref<ShippingAddressVO>({} as ShippingAddressVO);
 
+// 发货对话框
+const showDeliverDialog = ref(false);
+const currentOrderId = ref<string | number>();
+const currentOrderNo = ref<string>();
+
+/** 发货成功回调 */
+const handleDeliverSuccess = () => {};
+
 // 计算商品总数(所有商品的采购数量之和)
 const totalQuantity = computed(() => {
   return productList.value.reduce((sum, item) => {
@@ -276,14 +292,21 @@ const getOrderDetail = async () => {
   }
 
   try {
-    const res = await getOrderMain(orderId);
+    const res = await getOrderMain(orderId as any);
     orderDetail.value = res.data;
 
     // 获取商品明细
     if (orderDetail.value.orderProductList) {
       productList.value = orderDetail.value.orderProductList;
     } else if (orderDetail.value.id) {
-      await getProductList(orderDetail.value.id);
+      await getProductList(orderDetail.value);
+    }
+
+    // 获取发货商品明细
+    if (orderDetail.value.deliverProductList) {
+      deliverProductList.value = orderDetail.value.deliverProductList;
+    } else if (orderDetail.value.id) {
+      await getDeliverProductList(orderDetail.value);
     }
 
     // 获取收货地址
@@ -316,16 +339,35 @@ const getOrderDetail = async () => {
   }
 };
 
+/** 发货按钮操作 */
+const handleAddDeliver = (row?: OrderMainVO) => {
+  if (!row?.id) {
+    proxy?.$modal.msgWarning('订单ID不能为空');
+    return;
+  }
+  currentOrderId.value = row.id;
+  currentOrderNo.value = row.orderNo;
+  showDeliverDialog.value = true;
+};
+
 // 获取商品明细列表
-const getProductList = async (orderId: string | number) => {
+const getProductList = async (orderDetail: OrderMainVO) => {
   try {
-    const res = await listOrderProduct({ orderId: orderId });
-    productList.value = res.rows || [];
+    productList.value = orderDetail.orderProductList || [];
   } catch (error) {
     console.error('获取商品明细失败:', error);
   }
 };
 
+// 获取发货商品明细列表
+const getDeliverProductList = async (orderDetail: OrderMainVO) => {
+  try {
+    deliverProductList.value = orderDetail.deliverProductList || [];
+  } catch (error) {
+    console.error('获取发货商品明细失败:', error);
+  }
+};
+
 // 获取收货地址详情
 const getShippingAddressDetail = async (addressId: string | number) => {
   try {