hurx 1 өдөр өмнө
parent
commit
8c48b8c4e2

+ 314 - 0
src/views/order/checkOrder/addOrderStatusLogDrawer.vue

@@ -0,0 +1,314 @@
+<template>
+  <!-- 订单状态日志抽屉 -->
+  <el-drawer v-model="drawerVisible" title="变更物流状态" size="38%" :destroy-on-close="true" :close-on-click-modal="true">
+    <div class="status-log-container">
+      <el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
+        <el-form-item label="物流单号" prop="logisticNos">
+          <el-input v-model="form.logisticNos" disabled />
+        </el-form-item>
+
+        <el-form-item label="包裹单号" prop="packageNo">
+          <el-input v-model="form.packageNo" disabled />
+        </el-form-item>
+
+        <el-form-item label="所在状态" prop="statusName">
+          <el-select v-model="form.statusName" placeholder="请选择状态" style="width: 100%" @change="handleStatusChange">
+            <el-option
+              v-for="item in statusOptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+              :disabled="isStatusDisabled(item.value)"
+            />
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="发货人" prop="shipper">
+          <el-input v-model="form.shipper" disabled />
+        </el-form-item>
+
+        <el-form-item label="操作时间" prop="operateTime">
+          <el-date-picker v-model="form.operateTime" type="date" placeholder="请选择操作时间" style="width: 100%" />
+        </el-form-item>
+
+        <el-form-item label="快递员手机号" prop="courierPhone">
+          <el-input v-model="form.courierPhone" disabled />
+        </el-form-item>
+
+        <el-form-item label="上传图片" prop="images" v-if="form.statusName === '已签收'">
+          <div class="image-selector-wrapper">
+            <!-- 修改点 1: 使用 !selectedImages.length 替代 length === 0,并确保样式一致 -->
+            <div
+              v-if="!selectedImages || selectedImages.length === 0"
+              class="upload-box"
+              @click="showFileSelector = true"
+              style="
+                width: 150px;
+                height: 150px;
+                border: 2px dashed #d9d9d9;
+                border-radius: 4px;
+                display: flex;
+                align-items: center;
+                justify-content: center;
+                cursor: pointer;
+                transition: all 0.3s;
+              "
+            >
+              <div style="text-align: center; color: #8c939d">
+                <el-icon :size="40" style="margin-bottom: 8px">
+                  <Plus />
+                </el-icon>
+                <div style="font-size: 14px">点击上传</div>
+              </div>
+            </div>
+
+            <!-- 修改点 2: 列表渲染区域 -->
+            <div v-else class="selected-images-list">
+              <div
+                v-for="(img, index) in selectedImages"
+                :key="img.url || index"
+                style="position: relative; display: inline-block; margin: 0 8px 8px 0"
+              >
+                <!-- 确保 img.url 存在才渲染,防止报错 -->
+                <el-image
+                  v-if="img.url"
+                  :src="img.url"
+                  style="width: 150px; height: 150px"
+                  fit="cover"
+                  :preview-src-list="selectedImages.filter((i) => i.url).map((i) => i.url)"
+                />
+                <el-button
+                  type="danger"
+                  :icon="Delete"
+                  circle
+                  size="small"
+                  style="position: absolute; top: 5px; right: 5px; z-index: 10"
+                  @click="removeImage(index)"
+                />
+              </div>
+
+              <!-- 修改点 3: 如果未满 3 张,显示“继续添加”按钮 -->
+              <div
+                v-if="selectedImages.length < 3"
+                class="upload-box-more"
+                @click="showFileSelector = true"
+                style="
+                  width: 150px;
+                  height: 150px;
+                  border: 2px dashed #d9d9d9;
+                  border-radius: 4px;
+                  display: inline-flex;
+                  align-items: center;
+                  justify-content: center;
+                  cursor: pointer;
+                  transition: all 0.3s;
+                  vertical-align: top;
+                  background-color: #f5f7fa; /* 加个背景色区分 */
+                "
+              >
+                <el-icon :size="30" color="#8c939d">
+                  <Plus />
+                </el-icon>
+              </div>
+            </div>
+          </div>
+        </el-form-item>
+
+        <!-- 文件选择器 -->
+        <FileSelector v-model="showFileSelector" :multiple="true" :allowed-types="[1]" title="选择图片" @confirm="handleImagesSelected" />
+      </el-form>
+    </div>
+
+    <template #footer>
+      <div class="drawer-footer">
+        <el-button @click="closeDrawer">取消</el-button>
+        <el-button type="primary" @click="handleSubmit" :loading="submitLoading">保存</el-button>
+      </div>
+    </template>
+  </el-drawer>
+</template>
+
+<script setup name="AddOrderStatusLogDrawer" lang="ts">
+import { ref, reactive } from 'vue';
+import { ElMessage } from 'element-plus';
+import { Plus, Delete } from '@element-plus/icons-vue';
+import { addOrderStatusLog } from '@/api/order/orderStatusLog';
+import FileSelector from '@/components/FileSelector/index.vue';
+
+const drawerVisible = ref(false);
+const submitLoading = ref(false);
+const formRef = ref<any>(null);
+const showFileSelector = ref(false);
+const selectedImages = ref<any[]>([]);
+
+// 表单数据
+const form = reactive({
+  orderNo: '',
+  orderId: undefined as string | number | undefined,
+  customerNo: '',
+  customerId: undefined as string | number | undefined,
+  deliverMethod: '0',
+  statusName: '',
+  logisticNos: '',
+  packageNo: '',
+  shipper: '',
+  operateTime: '',
+  courierPhone: '',
+  images: '',
+  status: '0'
+});
+
+// 状态顺序定义
+const statusOrder = ['已下单', '已揽件', '运输中', '派件中', '已签收'];
+
+// 当前订单状态
+const currentStatus = ref('');
+
+// 状态选项
+const statusOptions = [
+  { label: '已下单', value: '已下单' },
+  { label: '已揽件', value: '已揽件' },
+  { label: '运输中', value: '运输中' },
+  { label: '派件中', value: '派件中' },
+  { label: '已签收', value: '已签收' }
+];
+const rules = {
+  statusName: [{ required: true, message: '请选择状态名称', trigger: 'change' }]
+};
+
+// 打开抽屉
+const openDrawer = (orderData?: any, currentOrderStatus?: string) => {
+  if (orderData) {
+    form.orderNo = orderData.orderNo || '';
+    form.orderId = orderData.orderId || '';
+    form.shipper = orderData.deliverMan || '';
+    form.courierPhone = orderData.phone || '';
+    form.packageNo = orderData.deliverCode || '';
+    form.logisticNos = orderData.deliverCode || '';
+    form.customerNo = orderData.customerNo || '';
+    form.customerId = orderData.customerId;
+    form.operateTime = orderData.createTime || '';
+    form.deliverMethod = orderData.deliverMethod || '0';
+    form.statusName = currentOrderStatus || '';
+    form.images = orderData.images || '';
+
+    selectedImages.value = [];
+    if (form.images) {
+      const urls = form.images.split(',');
+      selectedImages.value = urls.filter((u) => u && u.trim()).map((u) => ({ url: u.trim(), name: 'Image' }));
+    }
+
+    currentStatus.value = currentOrderStatus || '';
+  }
+  drawerVisible.value = true;
+};
+
+// 关闭抽屉
+const closeDrawer = () => {
+  drawerVisible.value = false;
+  resetForm();
+};
+
+// 判断是否禁用某个状态选项
+const isStatusDisabled = (statusValue: string) => {
+  if (!currentStatus.value) return false;
+  const currentIndex = statusOrder.indexOf(currentStatus.value);
+  const targetIndex = statusOrder.indexOf(statusValue);
+  // 如果目标状态在当前状态之前(索引更小),则禁用
+  return targetIndex < currentIndex;
+};
+
+// 重置表单
+const resetForm = () => {
+  form.statusName = '';
+  form.logisticNos = '';
+  form.packageNo = '';
+  form.orderId = undefined;
+  form.shipper = '';
+  form.operateTime = '';
+  form.courierPhone = '';
+  form.images = '';
+  selectedImages.value = [];
+  showFileSelector.value = false;
+  currentStatus.value = '';
+};
+
+// 处理选择的图片 (优化健壮性)
+const handleImagesSelected = (files: any[]) => {
+  if (!files || files.length === 0) {
+    showFileSelector.value = false;
+    return;
+  }
+
+  const remainingSlots = 3 - selectedImages.value.length;
+  if (remainingSlots <= 0) {
+    ElMessage.warning('最多上传 3 张图片');
+    showFileSelector.value = false;
+    return;
+  }
+
+  const filesToAdd = files.slice(0, remainingSlots);
+
+  // 映射为标准格式 { url, name }
+  const newItems = filesToAdd
+    .map((f) => ({
+      url: f.fileUrl || f.url || f.path, // 兼容多种返回字段
+      name: f.fileName || 'Image'
+    }))
+    .filter((item) => item.url); // 过滤掉没有 url 的无效项
+
+  if (newItems.length > 0) {
+    // 重新赋值数组以触发视图更新
+    selectedImages.value = [...selectedImages.value, ...newItems];
+    form.images = selectedImages.value.map((img) => img.url).join(',');
+  }
+
+  showFileSelector.value = false;
+};
+
+// 移除已选择的图片
+const removeImage = (index: number) => {
+  selectedImages.value.splice(index, 1);
+  form.images = selectedImages.value.map((img) => img.url).join(',');
+};
+
+// 状态变化处理
+const handleStatusChange = () => {
+  // 当状态变化时,如果不是已签收,清空图片
+  if (form.statusName !== '已签收') {
+    form.images = '';
+    selectedImages.value = [];
+  }
+};
+const handleSubmit = async () => {
+  await formRef.value?.validate();
+  submitLoading.value = true;
+  try {
+    await addOrderStatusLog(form);
+    ElMessage.success('保存成功');
+    closeDrawer();
+  } catch (error) {
+    console.error('保存失败:', error);
+    ElMessage.error('保存失败');
+  } finally {
+    submitLoading.value = false;
+  }
+};
+
+// 暴露方法给父组件
+defineExpose({
+  openDrawer
+});
+</script>
+
+<style scoped>
+.status-log-container {
+  padding: 20px;
+}
+
+.drawer-footer {
+  display: flex;
+  justify-content: flex-end;
+  gap: 12px;
+}
+</style>

+ 436 - 0
src/views/order/checkOrder/editDeliverDialog.vue

@@ -0,0 +1,436 @@
+<template>
+  <el-dialog
+    :model-value="modelValue"
+    title="编辑发货信息"
+    width="50%"
+    @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="logisticsCompanyId">
+            <el-select
+              v-model="form.logisticsCompanyId"
+              placeholder="请选择"
+              style="width: 100%"
+              filterable
+              @change="handleLogisticsCompanyChange"
+              disabled
+            >
+              <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="请输入物流单号" disabled />
+          </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" disabled>{{ 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="productUnit" label="单位" width="120" />
+      <el-table-column prop="orderPrice" label="商品单价" width="160" />
+      <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"
+            disabled
+            :controls="false"
+            style="width: 100%"
+            @change="handleDeliveryQuantityChange(scope.$index)"
+          />
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <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 { getOrderDeliver, addOrderDeliver, updateOrderDeliver } from '@/api/order/orderDeliver';
+import { OrderDeliverVO, OrderDeliverForm } from '@/api/order/orderDeliver/types';
+import { ElMessage } from 'element-plus';
+import { de } from 'element-plus/es/locale/index.mjs';
+
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { deliver_method } = toRefs<any>(proxy?.useDict('deliver_method'));
+
+interface Props {
+  modelValue: boolean;
+  orderId?: string | number;
+  orderNo?: string;
+  operateType?: string;
+  deliverId?: string | number;
+}
+
+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: '',
+  logisticsCompanyId: undefined,
+  logisticsCompanyCode: '',
+  logisticNo: '',
+  logisticPackStatus: '',
+  consigneePhone: '',
+  remark: '',
+  orderDeliverProducts: []
+});
+
+// 动态校验规则
+// 动态校验规则
+const rules = computed(() => {
+  const baseRules: any = {
+    deliverMethod: [{ required: true, message: '请选择发货方式', trigger: 'change' }]
+  };
+
+  // 第三方物流(deliverMethod === '1')
+  if (form.deliverMethod === '1') {
+    baseRules.logisticsCompanyId = [{ 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 = async () => {
+  resetForm();
+
+  // 如果传入deliverId,直接根据deliverId查询回显
+  if (props.deliverId) {
+    await loadDeliverInfoById(props.deliverId);
+  } else if (props.orderId) {
+    form.orderId = props.orderId;
+    form.orderCode = props.orderNo || '';
+    queryParams.value.orderId = props.orderId;
+    await loadProductList();
+  }
+};
+
+// 对话框关闭时触发
+const handleClose = () => {
+  resetForm();
+};
+
+// 重置表单
+const resetForm = () => {
+  form.orderId = undefined;
+  form.orderCode = '';
+  form.logisticsCompanyId = undefined;
+  form.logisticsCompanyCode = '';
+  form.logisticNo = '';
+  form.deliverMethod = '1';
+  form.deliverMan = '';
+  form.phone = '';
+  form.consigneePhone = '';
+  form.deliverRemark = '';
+  productList.value = [];
+  queryParams.value.pageNum = 1;
+  formRef.value?.clearValidate();
+};
+
+const handleLogisticsCompanyChange = (val: any) => {
+  const selectedCompany = logisticsCompanyList.value.find((item) => item.id === val);
+  if (selectedCompany) {
+    form.logisticsCompanyCode = selectedCompany.logisticsCode;
+  }
+};
+
+// 加载商品列表
+const loadProductList = async () => {
+  try {
+    const res = await getOrderMain(props.orderId);
+    // 为每个商品添加发货数量字段,默认为未发货数量
+    productList.value = (res.data.orderProductList || []).map((item: OrderProductVO) => ({
+      ...item,
+      deliverNum: 0,
+      productNo: item.productNo,
+      productId: item.productId,
+      orderPrice: item.orderPrice,
+      productUnit: item.productUnit,
+      productUnitId: item.productUnitId
+    }));
+    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 loadDeliverInfo = async () => {
+  try {
+    const res = await getOrderDeliver(props.orderId);
+    if (res.code === 200 && res.data) {
+      const deliverData = res.data;
+      form.logisticsCompanyId = deliverData.logisticsCompanyId;
+      form.logisticsCompanyCode = deliverData.logisticsCompanyCode;
+      form.logisticNo = deliverData.logisticNo;
+      form.deliverMethod = deliverData.deliverMethod || '1';
+      form.consigneePhone = deliverData.consigneePhone;
+      form.deliverRemark = deliverData.deliverRemark;
+    }
+  } catch (error) {
+    console.error('加载发货信息失败:', error);
+  }
+};
+
+// 根据deliverId加载发货信息
+const loadDeliverInfoById = async (deliverId: string | number) => {
+  try {
+    const res = await getOrderDeliver(deliverId);
+    if (res.code === 200 && res.data) {
+      const deliverData = res.data;
+      form.orderId = deliverData.orderId;
+      form.orderCode = deliverData.orderCode;
+      form.logisticsCompanyId = deliverData.logisticsCompanyId;
+      form.logisticsCompanyCode = deliverData.logisticsCompanyCode;
+      form.logisticNo = deliverData.logisticNo;
+      form.deliverMan = deliverData.deliverMan;
+      form.phone = deliverData.phone;
+      form.deliverMethod = deliverData.deliverMethod || '1';
+      form.consigneePhone = deliverData.consigneePhone;
+      form.deliverRemark = deliverData.deliverRemark;
+      productList.value = deliverData.deliverProductList;
+    }
+  } catch (error) {
+    console.error('加载发货信息失败:', error);
+    ElMessage.error('加载发货信息失败');
+  }
+};
+
+// 发货数量变化
+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 = {
+      id: props.deliverId,
+      orderId: form.orderId,
+      orderCode: form.orderCode,
+      logisticsCompanyId: form.logisticsCompanyId,
+      logisticsCompanyCode: form.logisticsCompanyCode,
+      logisticNo: form.logisticNo,
+      deliverMethod: form.deliverMethod,
+      deliverMan: form.deliverMan,
+      phone: form.phone,
+      consigneePhone: form.consigneePhone,
+      deliverRemark: form.deliverRemark
+    };
+
+    // 调用发货API
+    await updateOrderDeliver(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>

+ 3 - 1
src/views/order/saleOrder/sendDetail.vue

@@ -315,7 +315,9 @@ const logisticsOrderId = ref<string | number>();
 const statusLogDrawerRef = ref<any>(null);
 
 /** 发货成功回调 */
-const handleDeliverSuccess = () => {};
+const handleDeliverSuccess = () => {
+  getOrderDetail();
+};
 
 // 计算商品总数(所有商品的采购数量之和)
 const totalQuantity = computed(() => {