Эх сурвалжийг харах

Merge branch '订单挂起'

lxf 1 жил өмнө
parent
commit
c5dd4a5be8

+ 6 - 3
src/components/byForm/index.vue

@@ -406,10 +406,13 @@ const handleSubmit = async (onSubmit) => {
   }
 };
 const byform = ref(null); // 延迟使用,因为还没有返回跟挂载
+const resetFields = () => {
+  nextTick(() => {
+    proxy.$refs.byForm.resetFields();
+  });
+};
 onMounted(() => {});
-defineExpose({
-  handleSubmit,
-});
+defineExpose({ handleSubmit, resetFields });
 formDataInit();
 loadInit();
 </script>

+ 57 - 8
src/components/process/order.vue

@@ -77,6 +77,10 @@
                 <el-table-column label="产品" width="280">
                   <template #default="{ row }">
                     <div style="width: 100%">
+                      <div style="line-height: 35px" v-if="!formOption.disabled">
+                        <span style="color: black; font-weight: 700">库存数量: </span>
+                        <span>{{ item.inventoryQuantity }}</span>
+                      </div>
                       <div style="line-height: 35px">
                         <span style="color: black; font-weight: 700">商品名称: </span>
                         <span>{{ item.wlnSkuName }}</span>
@@ -239,8 +243,11 @@
                 <el-table-column label="包材配件/单品" min-width="600">
                   <template #default="{ row }">
                     <div style="width: 100%">
-                      <div style="margin-bottom: 10px" v-if="!formOption.disabled">
-                        <el-button type="primary" size="small" @click="clickPackingFittings(index)">选择包材配件</el-button>
+                      <div style="margin-bottom: 10px" v-if="!formOption.disabled || route.query.processType == 10">
+                        <el-form label-width="0" :model="formData.data" v-if="route.query.processType == 10">
+                          <el-button type="primary" size="small" @click="clickPackingFittings(index)">选择包材配件</el-button>
+                        </el-form>
+                        <el-button type="primary" size="small" @click="clickPackingFittings(index)" v-else>选择包材配件</el-button>
                       </div>
                       <el-table :data="row.orderSkuBomList" :row-style="{ height: '35px' }" header-row-class-name="tableHeader">
                         <el-table-column label="单价¥" width="70">
@@ -252,11 +259,29 @@
                         </el-table-column>
                         <el-table-column label="数量" width="90">
                           <template #default="props">
+                            <el-form label-width="0" :model="formData.data" v-if="route.query.processType == 10">
+                              <el-form-item
+                                :prop="'orderSkuList.' + index + '.orderSkuBomList.' + props.$index + '.quantity'"
+                                :rules="rules.quantity"
+                                :inline-message="true"
+                                style="width: 100%"
+                                :disabled="true">
+                                <el-input-number
+                                  onmousewheel="return false;"
+                                  v-model="props.row.quantity"
+                                  placeholder="数量"
+                                  style="width: 100%"
+                                  :controls="false"
+                                  :min="0" />
+                              </el-form-item>
+                            </el-form>
                             <el-form-item
+                              v-else
                               :prop="'orderSkuList.' + index + '.orderSkuBomList.' + props.$index + '.quantity'"
                               :rules="rules.quantity"
                               :inline-message="true"
-                              style="width: 100%">
+                              style="width: 100%"
+                              :disabled="true">
                               <el-input-number
                                 onmousewheel="return false;"
                                 v-model="props.row.quantity"
@@ -278,9 +303,12 @@
                             {{ moneyFormat(computeMoney(index, props.$index), 2) }}
                           </template>
                         </el-table-column>
-                        <el-table-column label="操作" align="center" fixed="right" width="60" v-if="!formOption.disabled">
+                        <el-table-column label="操作" align="center" fixed="right" width="60" v-if="!formOption.disabled || route.query.processType == 10">
                           <template #default="props">
-                            <el-button type="danger" @click="clickDeletePackingFittings(index, props.$index)" text>删除</el-button>
+                            <el-form label-width="0" :model="formData.data" v-if="route.query.processType == 10">
+                              <el-button type="danger" @click="clickDeletePackingFittings(index, props.$index)" text>删除</el-button>
+                            </el-form>
+                            <el-button type="danger" v-else @click="clickDeletePackingFittings(index, props.$index)" text>删除</el-button>
                           </template>
                         </el-table-column>
                       </el-table>
@@ -337,6 +365,7 @@
             <span style="font-weight: 700; color: #6c88f1; margin-left: 40px">包装人工费: ¥{{ moneyFormat(calculatedAmount("packingLabor"), 2) }}</span>
             <span style="font-weight: 700; color: #6c88f1; margin-left: 40px">包材费: ¥{{ moneyFormat(calculatedPackagingMaterialCost(), 2) }}</span>
             <span style="font-weight: 700; color: #6c88f1; margin-left: 40px">管理费: ¥{{ moneyFormat(calculatedAmount("managementFee"), 2) }}</span>
+            <span style="font-weight: 700; color: #6c88f1; margin-left: 40px">外箱包装费: ¥{{ moneyFormat(calculatedOuterBoxPackingFee(), 2) }}</span>
           </div>
           <div style="padding: 8px 0 0 0">
             <span style="font-weight: 700; color: red">订单总金额(含税): ¥{{ moneyFormat(calculatedTotalAmount(), 2) }}</span>
@@ -501,7 +530,7 @@ const formConfig = computed(() => {
       type: "select",
       label: "选择快递",
       prop: "expressDeliveryId",
-      data: [],
+      data: proxy.useUserStore().allDict["express_delivery"],
       itemWidth: 25,
       clearable: true,
     },
@@ -558,7 +587,7 @@ const rules = ref({
   consignee: [{ required: true, message: "请输入联系人", trigger: "blur" }],
   consigneeNumber: [{ required: true, message: "请输入联系电话", trigger: "blur" }],
   deliveryTime: [{ required: true, message: "请选择交货时间", trigger: "change" }],
-  //   expressDeliveryId: [{ required: true, message: "请选择快递", trigger: "change" }],
+  expressDeliveryId: [{ required: true, message: "请选择快递", trigger: "change" }],
   sourcePlatform: [{ required: true, message: "请选择店铺来源", trigger: "change" }],
   shopName: [{ required: true, message: "请选择店铺", trigger: "change" }],
   quantity: [{ required: true, message: "请输入数量", trigger: "blur" }],
@@ -652,7 +681,7 @@ const selectProduct = (row, SKU) => {
     ElMessage("添加失败");
   }
 };
-const pushProduct = (res, SKU, row) => {
+const pushProduct = async (res, SKU, row) => {
   let data = proxy.deepClone(res);
   let orderSkuBomList = [];
   if (data.skuSpecList && data.skuSpecList.length > 0) {
@@ -670,6 +699,10 @@ const pushProduct = (res, SKU, row) => {
       }
     }
   }
+  let inventoryQuantity = 0;
+  let getSkuInventoryQuantity = await proxy.post("/skuSpec/getSkuInventoryQuantity", { id: row.id }).then((resQuantity) => {
+    inventoryQuantity = resQuantity;
+  });
   formData.data.orderSkuList.push({
     wlnSkuName: SKU.name,
     skuId: row.skuId,
@@ -690,6 +723,7 @@ const pushProduct = (res, SKU, row) => {
     orderSkuBomList: orderSkuBomList,
     blueprint: row.designImgUrl,
     productionDocument: row.sharedFolder,
+    inventoryQuantity: inventoryQuantity,
   });
   ElMessage({ message: "添加成功", type: "success" });
 };
@@ -860,6 +894,7 @@ const calculatedTotalAmount = () => {
         calculatedAmount("deliveryMaterialsFee") +
         calculatedAmount("packingLabor") +
         calculatedAmount("managementFee") +
+        calculatedOuterBoxPackingFee() +
         calculatedPackagingMaterialCost()) *
         100
     ) / 100
@@ -942,6 +977,7 @@ const handleSubmit = async (flag) => {
         formData.data.deliveryMaterialsFee = calculatedAmount("deliveryMaterialsFee");
         formData.data.packingLabor = calculatedAmount("packingLabor");
         formData.data.managementFee = calculatedAmount("managementFee");
+        formData.data.outerBoxPackingFee = calculatedOuterBoxPackingFee();
         formData.data.packagingMaterialCost = calculatedPackagingMaterialCost();
         formData.data.totalAmount = calculatedTotalAmount();
         if (fileList.value && fileList.value.length > 0) {
@@ -1028,6 +1064,19 @@ const saveShippingPackage = (data) => {
   formData.data.orderPackageBomList = data.orderPackageBomList;
   formData.data.outerBoxSelfAdhesiveStickerFile = data.outerBoxSelfAdhesiveStickerFile;
 };
+const calculatedOuterBoxPackingFee = () => {
+  let money = 0;
+  if (formData.data.orderPackageBomList && formData.data.orderPackageBomList.length > 0) {
+    for (let i = 0; i < formData.data.orderPackageBomList.length; i++) {
+      if (formData.data.orderPackageBomList[i].internalSellingPrice && formData.data.orderPackageBomList[i].quantity) {
+        money = Number(
+          Math.round((money + formData.data.orderPackageBomList[i].internalSellingPrice * formData.data.orderPackageBomList[i].quantity) * 100) / 100
+        );
+      }
+    }
+  }
+  return money;
+};
 // 向父组件暴露
 defineExpose({ getFormData, handleSubmit, saveShippingPackage });
 </script>

+ 14 - 0
src/router/index.js

@@ -230,6 +230,20 @@ export const constantRoutes = [
       },
     ],
   },
+  {
+    path: "/production/shipment/unpack",
+    component: Layout,
+    redirect: "/production/shipment/unpack",
+    children: [
+      {
+        path: "/production/shipment/unpack",
+        name: "unpack",
+        component: () => import(/* webpackChunkName: "page" */ "@/views/production/shipment/print-order/unpack.vue"),
+        props: true,
+        meta: { title: "添加装箱" },
+      },
+    ],
+  },
 ];
 // 动态路由,基于用户权限动态去加载
 export const dynamicRoutes = [

+ 1 - 0
src/views/group/finance/check-bill/index.vue

@@ -69,6 +69,7 @@
               <el-table-column label="包装人工费 ¥" prop="packingLabor" align="right" width="110" />
               <el-table-column label="包材费 ¥" prop="packagingMaterialCost" align="right" width="100" />
               <el-table-column label="管理费 ¥" prop="managementFee" align="right" width="100" />
+              <el-table-column label="外箱包装费 ¥" prop="outerBoxPackingFee" align="right" width="110" />
               <el-table-column label="操作" align="center" fixed="right" width="60">
                 <template #default="{ $index }">
                   <el-button type="danger" @click="clickOrderDelete($index)" text>删除</el-button>

+ 8 - 2
src/views/group/finance/check-bill/printOrder.vue

@@ -253,14 +253,20 @@ const columns = computed(() => {
       width: 120,
     },
     {
-      dataKey: "total",
+      dataKey: "outerBoxPackingFee",
       key: "column-18",
+      title: "外箱包装费",
+      width: 120,
+    },
+    {
+      dataKey: "total",
+      key: "column-19",
       title: "合计",
       width: 120,
     },
   ];
 });
-const mergeColumnOne = [0, 1, 2, 18];
+const mergeColumnOne = [0, 1, 2, 18, 19];
 const mergeColumnTwo = [3, 4, 5, 16, 17];
 const Row = ({ rowData, cells }) => {
   if (rowData.indexOne > 1) {

+ 8 - 2
src/views/group/finance/summary/printOrder.vue

@@ -259,14 +259,20 @@ const columns = computed(() => {
       width: 120,
     },
     {
-      dataKey: "total",
+      dataKey: "outerBoxPackingFee",
       key: "column-18",
+      title: "外箱包装费",
+      width: 120,
+    },
+    {
+      dataKey: "total",
+      key: "column-19",
       title: "合计",
       width: 120,
     },
   ];
 });
-const mergeColumnOne = [0, 1, 2, 18];
+const mergeColumnOne = [0, 1, 2, 18, 19];
 const mergeColumnTwo = [3, 4, 5, 16, 17];
 const Row = ({ rowData, cells }) => {
   if (rowData.indexOne > 1) {

+ 13 - 0
src/views/group/order/already-removed/detail.vue

@@ -223,6 +223,7 @@
               <span style="font-weight: 700; color: #6c88f1; margin-left: 40px">包装人工费: ¥{{ moneyFormat(calculatedAmount("packingLabor"), 2) }}</span>
               <span style="font-weight: 700; color: #6c88f1; margin-left: 40px">包材费: ¥{{ moneyFormat(calculatedPackagingMaterialCost(), 2) }}</span>
               <span style="font-weight: 700; color: #6c88f1; margin-left: 40px">管理费: ¥{{ moneyFormat(calculatedAmount("managementFee"), 2) }}</span>
+              <span style="font-weight: 700; color: #6c88f1; margin-left: 40px">外箱包装费: ¥{{ moneyFormat(calculatedOuterBoxPackingFee(), 2) }}</span>
             </div>
             <div style="padding: 8px 0 0 0">
               <span style="font-weight: 700; color: red">订单总金额(含税): ¥{{ moneyFormat(calculatedTotalAmount(), 2) }}</span>
@@ -595,6 +596,7 @@ const calculatedTotalAmount = () => {
         calculatedAmount("deliveryMaterialsFee") +
         calculatedAmount("packingLabor") +
         calculatedAmount("managementFee") +
+        calculatedOuterBoxPackingFee() +
         calculatedPackagingMaterialCost()) *
         100
     ) / 100
@@ -618,6 +620,17 @@ const onSuccessFile = (any, UploadFile) => {
 const onPreviewFile = (file) => {
   window.open(file.raw.fileUrl, "_blank");
 };
+const calculatedOuterBoxPackingFee = () => {
+  let money = 0;
+  if (formData.data.orderPackageBomList && formData.data.orderPackageBomList.length > 0) {
+    for (let i = 0; i < formData.data.orderPackageBomList.length; i++) {
+      if (formData.data.orderPackageBomList[i].costPrice && formData.data.orderPackageBomList[i].quantity) {
+        money = Number(Math.round((money + formData.data.orderPackageBomList[i].costPrice * formData.data.orderPackageBomList[i].quantity) * 100) / 100);
+      }
+    }
+  }
+  return money;
+};
 </script>
 
 <style lang="scss" scoped>

+ 14 - 0
src/views/group/order/management/detail.vue

@@ -335,6 +335,7 @@
               <span style="font-weight: 700; color: #6c88f1; margin-left: 40px">包装人工费: ¥{{ moneyFormat(calculatedAmount("packingLabor"), 2) }}</span>
               <span style="font-weight: 700; color: #6c88f1; margin-left: 40px">包材费: ¥{{ moneyFormat(calculatedPackagingMaterialCost(), 2) }}</span>
               <span style="font-weight: 700; color: #6c88f1; margin-left: 40px">管理费: ¥{{ moneyFormat(calculatedAmount("managementFee"), 2) }}</span>
+              <span style="font-weight: 700; color: #6c88f1; margin-left: 40px">外箱包装费: ¥{{ moneyFormat(calculatedOuterBoxPackingFee(), 2) }}</span>
             </div>
             <div style="padding: 8px 0 0 0">
               <span style="font-weight: 700; color: red">订单总金额(含税): ¥{{ moneyFormat(calculatedTotalAmount(), 2) }}</span>
@@ -772,6 +773,7 @@ const submitChangePrice = () => {
         formData.data.deliveryMaterialsFee = calculatedAmount("deliveryMaterialsFee");
         formData.data.packingLabor = calculatedAmount("packingLabor");
         formData.data.managementFee = calculatedAmount("managementFee");
+        formData.data.outerBoxPackingFee = calculatedOuterBoxPackingFee();
         formData.data.packagingMaterialCost = calculatedPackagingMaterialCost();
         formData.data.totalAmount = calculatedTotalAmount();
         if (fileList.value && fileList.value.length > 0) {
@@ -983,6 +985,7 @@ const calculatedTotalAmount = () => {
         calculatedAmount("deliveryMaterialsFee") +
         calculatedAmount("packingLabor") +
         calculatedAmount("managementFee") +
+        calculatedOuterBoxPackingFee() +
         calculatedPackagingMaterialCost()) *
         100
     ) / 100
@@ -1006,6 +1009,17 @@ const onSuccessFile = (any, UploadFile) => {
 const onPreviewFile = (file) => {
   window.open(file.raw.fileUrl, "_blank");
 };
+const calculatedOuterBoxPackingFee = () => {
+  let money = 0;
+  if (formData.data.orderPackageBomList && formData.data.orderPackageBomList.length > 0) {
+    for (let i = 0; i < formData.data.orderPackageBomList.length; i++) {
+      if (formData.data.orderPackageBomList[i].costPrice && formData.data.orderPackageBomList[i].quantity) {
+        money = Number(Math.round((money + formData.data.orderPackageBomList[i].costPrice * formData.data.orderPackageBomList[i].quantity) * 100) / 100);
+      }
+    }
+  }
+  return money;
+};
 </script>
 
 <style lang="scss" scoped>

+ 72 - 4
src/views/group/order/management/index.vue

@@ -309,6 +309,17 @@ const config = computed(() => {
     },
     {
       attrs: {
+        label: "外箱包装费 ¥",
+        prop: "outerBoxPackingFee",
+        width: 120,
+        align: "right",
+      },
+      render(val) {
+        return proxy.moneyFormat(val);
+      },
+    },
+    {
+      attrs: {
         label: "交期",
         prop: "deliveryTime",
         width: 160,
@@ -347,7 +358,7 @@ const config = computed(() => {
     {
       attrs: {
         label: "操作",
-        width: 160,
+        width: 180,
         align: "center",
         fixed: "right",
       },
@@ -391,6 +402,32 @@ const config = computed(() => {
                 },
               }
             : {},
+          !props.selectStatus && row.status == 20
+            ? {
+                attrs: {
+                  label: "挂起",
+                  type: "primary",
+                  text: true,
+                },
+                el: "button",
+                click() {
+                  clickHangUp(row);
+                },
+              }
+            : {},
+          !props.selectStatus && row.status == 60
+            ? {
+                attrs: {
+                  label: "取消挂起",
+                  type: "primary",
+                  text: true,
+                },
+                el: "button",
+                click() {
+                  clickCancelHangUp(row);
+                },
+              }
+            : {},
           !props.selectStatus && row.status && row.status != 0
             ? {
                 attrs: {
@@ -481,10 +518,13 @@ const clickReset = () => {
 };
 const clickCode = (row) => {
   proxy.$router.replace({
-    path: "/order-detail",
+    path: "/platform_manage/process/processApproval",
     query: {
-      detailId: row.id,
-      text: "订单详情",
+      flowKey: "order",
+      flowName: "订单详情",
+      processType: "20",
+      id: row.id,
+      flowId: row.flowId,
       random: proxy.random(),
     },
   });
@@ -517,6 +557,34 @@ const clickDeleteTwo = (row) => {
     })
     .catch(() => {});
 };
+const clickHangUp = (row) => {
+  ElMessageBox.confirm("你是否确认此操作", "提示", {
+    confirmButtonText: "确定",
+    cancelButtonText: "取消",
+    type: "warning",
+  })
+    .then(() => {
+      proxy.post("/orderInfo/suspendOrder", { id: row.id }).then(() => {
+        ElMessage({ message: "操作成功", type: "success" });
+        getList();
+      });
+    })
+    .catch(() => {});
+};
+const clickCancelHangUp = (row) => {
+  ElMessageBox.confirm("你是否确认此操作", "提示", {
+    confirmButtonText: "确定",
+    cancelButtonText: "取消",
+    type: "warning",
+  })
+    .then(() => {
+      proxy.post("/orderInfo/cancelSuspendOrder", { id: row.id }).then(() => {
+        ElMessage({ message: "操作成功", type: "success" });
+        getList();
+      });
+    })
+    .catch(() => {});
+};
 const openLogs = ref(false);
 const loadingLogs = ref(false);
 const logsList = ref({

+ 11 - 0
src/views/group/order/product-management/index.vue

@@ -284,6 +284,17 @@ const config = computed(() => {
     },
     {
       attrs: {
+        label: "外箱包装费 ¥",
+        prop: "outerBoxPackingFee",
+        width: 120,
+        align: "right",
+      },
+      render(val) {
+        return proxy.moneyFormat(val);
+      },
+    },
+    {
+      attrs: {
         label: "下单时间",
         slot: "wlnCreateTime",
         width: 160,

+ 18 - 28
src/views/process/processApproval/index.vue

@@ -15,7 +15,15 @@
             type="primary"
             size="small"
             @click="clickViewPackaging()"
-            v-if="queryData.query.processType && ['10', '20'].includes(queryData.query.processType) && queryData.query.flowKey == 'order'"
+            v-if="queryData.query.processType && queryData.query.processType == '20' && queryData.query.flowKey == 'order'"
+            v-preReClick>
+            包装配置
+          </el-button>
+          <el-button
+            type="primary"
+            size="small"
+            @click="handlePackagingConfiguration()"
+            v-if="queryData.query.processType && queryData.query.processType == '10' && queryData.query.flowKey == 'order'"
             v-preReClick>
             包装配置
           </el-button>
@@ -32,9 +40,10 @@
         <Subscribe :queryData="detailsData.data" v-if="queryData.query.flowKey == 'apply_buy'" ref="makeDom"></Subscribe>
         <Purchase :queryData="detailsData.data" v-else-if="queryData.query.flowKey == 'purchase'" ref="makeDom"></Purchase>
         <Order :queryData="detailsData.data" v-else-if="queryData.query.flowKey == 'order'" ref="makeDom"></Order>
+<OrderDelete :queryData="detailsData.data" :recordList="recordList" v-else-if="queryData.query.flowKey == 'order_delete'" ref="makeDom"></OrderDelete>
+
         <ReturnGoods :queryData="detailsData.data" v-else-if="queryData.query.flowKey == 'purchase_return'" ref="makeDom"></ReturnGoods>
-        <OrderDelete :queryData="detailsData.data" :recordList="recordList" v-else-if="queryData.query.flowKey == 'order_delete'" ref="makeDom"></OrderDelete>
-      </div>
+</div>
       <div class="bottom" v-if="route.query.processType != 20">
         <div class="commons-title title">处理意见</div>
         <el-form :model="flowForm" :rules="flowRules" ref="flowFormDom">
@@ -45,14 +54,14 @@
             <el-button
               type="primary"
               v-if="(!queryData.query.processType || ['30', '40'].includes(queryData.query.processType)) && queryData.query.flowKey != 'purchase_return'"
-              @click="handleSaveDraft"
+              @click="handleSaveDraft()"
               v-preReClick>
               保存草稿
             </el-button>
             <el-button
               type="primary"
               v-if="(!queryData.query.processType || ['30', '40'].includes(queryData.query.processType)) && queryData.query.flowKey == 'order'"
-              @click="handlePackagingConfiguration"
+              @click="handlePackagingConfiguration()"
               v-preReClick>
               包装配置
             </el-button>
@@ -74,7 +83,7 @@
         </el-form-item>
         <el-form-item>
           <div style="width: 100%; text-align: center">
-            <el-button type="primary" @click="handleSelectUser" v-preReClick>提交</el-button>
+            <el-button type="primary" @click="handleSelectUser()" v-preReClick>提交</el-button>
           </div>
         </el-form-item>
       </el-form>
@@ -137,7 +146,6 @@
             <el-table-column label="品号" prop="code" width="160" />
             <el-table-column label="品名" prop="name" min-width="220" />
             <el-table-column label="销售单价" prop="internalSellingPrice" width="100" />
-            <el-table-column label="成本单价" prop="costPrice" width="100" />
             <el-table-column label="数量" width="120">
               <template #default="{ row, $index }">
                 <div class="shippingPackage">
@@ -163,11 +171,6 @@
                 {{ moneyFormat(computeMoney(row, "internalSellingPrice"), 2) }}
               </template>
             </el-table-column>
-            <el-table-column label="成本小计" width="120">
-              <template #default="{ row }">
-                {{ moneyFormat(computeMoney(row, "costPrice"), 2) }}
-              </template>
-            </el-table-column>
             <el-table-column label="操作" align="center" fixed="right" width="80">
               <template #default="{ $index }">
                 <el-button type="danger" @click="clickDelete($index)" text>删除</el-button>
@@ -184,7 +187,7 @@
                 v-if="formShippingPackage.data.outerBoxSelfAdhesiveStickerFile && formShippingPackage.data.outerBoxSelfAdhesiveStickerFile.fileUrl"
                 :src="formShippingPackage.data.outerBoxSelfAdhesiveStickerFile.fileUrl"
                 @click="openFile(formShippingPackage.data.outerBoxSelfAdhesiveStickerFile.fileUrl)" />
-              <div style="display: flex">
+              <div style="display: flex" v-if="route.query.processType != 10">
                 <el-upload
                   :show-file-list="false"
                   action="https://winfaster.obs.cn-south-1.myhuaweicloud.com"
@@ -243,18 +246,12 @@
           <el-table-column label="品号" prop="code" width="160" />
           <el-table-column label="品名" prop="name" min-width="220" />
           <el-table-column label="销售单价" prop="internalSellingPrice" width="100" />
-          <el-table-column label="成本单价" prop="costPrice" width="100" />
           <el-table-column label="数量" prop="quantity" width="120" />
           <el-table-column label="销售小计" width="120">
             <template #default="{ row }">
               {{ moneyFormat(computeMoney(row, "internalSellingPrice"), 2) }}
             </template>
           </el-table-column>
-          <el-table-column label="成本小计" width="120">
-            <template #default="{ row }">
-              {{ moneyFormat(computeMoney(row, "costPrice"), 2) }}
-            </template>
-          </el-table-column>
         </el-table>
         <div style="font-weight: 700; margin: 20px 0 10px 0">外箱不干胶图稿</div>
         <div style="display: flex; width: 100%">
@@ -294,9 +291,9 @@ import Order from "/src/components/process/order";
 import refreshStore from "/src/store/modules/refresh";
 import SelectBOM from "/src/views/group/BOM/management/index";
 import SelectAssembly from "/src/components/selectAssembly/index";
-import ReturnGoods from "/src/components/process/returnGoods.vue";
 // 删除订单
 import OrderDelete from "/src/components/process/order-delete";
+import ReturnGoods from "/src/components/process/returnGoods.vue";
 const typeName = ref({
   10: "(审批)",
   20: "(详情)",
@@ -307,8 +304,8 @@ const keyName = ref({
   apply_buy: "申购流程",
   purchase: "采购流程",
   order: "新建订单流程",
+order_delete: "订单删除流程",
   purchase_return: "采购退货流程",
-  order_delete: "订单删除流程",
 });
 const flowKeyCollect = reactive({
   apply_buy: {
@@ -329,10 +326,6 @@ const flowKeyCollect = reactive({
     add: "/orderInfo/add",
     detail: "/orderInfo/detail",
   },
-  purchase_return: {
-    backPath: "/group/purchase/return-goods",
-    detail: "/purchaseReturn/detail",
-  },
   order_delete: {
     backPath: "/subsidiary/order/subsidiary-order-management",
     edit: "/orderInfo/edit",
@@ -581,7 +574,6 @@ const selectExpressPacking = (data) => {
       bomSpecId: data.id,
       code: data.code,
       name: data.name,
-      costPrice: data.costPrice,
       internalSellingPrice: data.internalSellingPrice,
       quantity: undefined,
     });
@@ -591,7 +583,6 @@ const selectExpressPacking = (data) => {
         bomSpecId: data.id,
         code: data.code,
         name: data.name,
-        costPrice: data.costPrice,
         internalSellingPrice: data.internalSellingPrice,
         quantity: undefined,
       },
@@ -665,7 +656,6 @@ const selectAssembly = (item) => {
             bomSpecId: resItem.id,
             code: resItem.code,
             name: resItem.name,
-            costPrice: resItem.costPrice,
             internalSellingPrice: resItem.internalSellingPrice,
             quantity: undefined,
           };

+ 312 - 0
src/views/production/express-delivery/network-location/index.vue

@@ -0,0 +1,312 @@
+<template>
+  <div>
+    <el-card class="box-card">
+      <byTable
+        :source="sourceList.data"
+        :pagination="sourceList.pagination"
+        :config="config"
+        :loading="loading"
+        :searchConfig="searchConfig"
+        highlight-current-row
+        :action-list="[
+          {
+            text: '添加快递',
+            action: () => clickModal(),
+          },
+        ]"
+        @get-list="getList"
+        @clickReset="clickReset">
+        <template #address="{ item }">
+          <div>{{ item.province }},{{ item.city }},{{ item.district }},{{ item.address }}</div>
+        </template>
+      </byTable>
+    </el-card>
+
+    <el-dialog :title="modalType == 'add' ? '添加快递' : '编辑快递'" v-if="openDialog" v-model="openDialog" width="60%">
+      <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="submit"> </byForm>
+      <template #footer>
+        <el-button @click="openDialog = false" size="large">取 消</el-button>
+        <el-button type="primary" @click="submitForm()" size="large" v-preReClick>确 定</el-button>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import byTable from "/src/components/byTable/index";
+import byForm from "/src/components/byForm/index";
+import { ElMessage, ElMessageBox } from "element-plus";
+import { ref } from "vue";
+
+const { proxy } = getCurrentInstance();
+const sourceList = ref({
+  data: [],
+  pagination: {
+    total: 0,
+    pageNum: 1,
+    pageSize: 10,
+    expressageCode: "",
+  },
+});
+const loading = ref(false);
+const searchConfig = computed(() => {
+  return [
+    {
+      type: "input",
+      prop: "expressageCode",
+      label: "快递编码",
+    },
+  ];
+});
+const config = computed(() => {
+  return [
+    {
+      attrs: {
+        label: "快递名称",
+        prop: "expressage",
+        width: 160,
+      },
+    },
+    {
+      attrs: {
+        label: "打印机",
+        prop: "printer",
+        width: 140,
+      },
+    },
+    {
+      attrs: {
+        label: "快递网点",
+        prop: "branch",
+        width: 140,
+      },
+    },
+    {
+      attrs: {
+        label: "网点编码",
+        prop: "branchCode",
+        width: 140,
+      },
+    },
+    {
+      attrs: {
+        label: "快递编码",
+        prop: "expressageCode",
+        width: 140,
+      },
+    },
+    {
+      attrs: {
+        label: "联系人",
+        prop: "name",
+        width: 120,
+      },
+    },
+    {
+      attrs: {
+        label: "电话",
+        prop: "phone",
+        width: 140,
+      },
+    },
+    {
+      attrs: {
+        label: "发货地址",
+        slot: "address",
+        "min-width": 240,
+      },
+    },
+    {
+      attrs: {
+        label: "取号模式",
+        prop: "takeNum",
+        width: 120,
+      },
+      render(val) {
+        return proxy.dictKeyValue(val, proxy.useUserStore().allDict["take_num"]);
+      },
+    },
+    {
+      attrs: {
+        label: "操作",
+        width: 80,
+        align: "center",
+        fixed: "right",
+      },
+      renderHTML(row) {
+        return [
+          {
+            attrs: {
+              label: "编辑",
+              type: "primary",
+              text: true,
+            },
+            el: "button",
+            click() {
+              clickUpdate(row);
+            },
+          },
+        ];
+      },
+    },
+  ];
+});
+const getList = async (req, status) => {
+  if (status) {
+    sourceList.value.pagination = {
+      pageNum: sourceList.value.pagination.pageNum,
+      pageSize: sourceList.value.pagination.pageSize,
+    };
+  } else {
+    sourceList.value.pagination = { ...sourceList.value.pagination, ...req };
+  }
+  loading.value = true;
+  proxy.post("/expressDelivery/page", sourceList.value.pagination).then((res) => {
+    sourceList.value.data = res.rows;
+    sourceList.value.pagination.total = res.total;
+    setTimeout(() => {
+      loading.value = false;
+    }, 200);
+  });
+};
+getList();
+const clickReset = () => {
+  getList("", true);
+};
+const modalType = ref("add");
+const openDialog = ref(false);
+const submit = ref(null);
+const formOption = reactive({
+  inline: true,
+  labelWidth: "140px",
+  itemWidth: 100,
+  rules: [],
+  labelPosition: "right",
+});
+const formData = reactive({
+  data: {},
+});
+const formConfig = computed(() => {
+  return [
+    {
+      type: "input",
+      prop: "name",
+      label: "联系人",
+      itemType: "text",
+    },
+    {
+      type: "input",
+      prop: "name",
+      label: "电话",
+      itemType: "text",
+    },
+    {
+      type: "input",
+      prop: "province",
+      label: "省",
+      itemType: "text",
+    },
+    {
+      type: "input",
+      prop: "city",
+      label: "市",
+      itemType: "text",
+    },
+    {
+      type: "input",
+      prop: "district",
+      label: "区",
+      itemType: "text",
+    },
+    {
+      type: "input",
+      prop: "address",
+      label: "详细地址",
+      itemType: "text",
+    },
+    {
+      type: "input",
+      prop: "expressage",
+      label: "快递物流",
+      itemType: "text",
+    },
+    {
+      type: "input",
+      prop: "expressageCode",
+      label: "快递编码",
+      itemType: "text",
+    },
+    {
+      type: "input",
+      prop: "branch",
+      label: "快递网点",
+      itemType: "text",
+    },
+    {
+      type: "input",
+      prop: "branchCode",
+      label: "网点编码",
+      itemType: "text",
+    },
+    {
+      type: "input",
+      prop: "templateUrl",
+      label: "标准面单模板URL",
+      itemType: "text",
+    },
+    {
+      type: "input",
+      prop: "customTemplateUrl",
+      label: "自定义面单模板URL",
+      itemType: "text",
+    },
+    {
+      type: "select",
+      prop: "takeNum",
+      label: "取号模式",
+      data: proxy.useUserStore().allDict["take_num"],
+    },
+    {
+      type: "input",
+      prop: "printer",
+      label: "绑定打印机",
+      itemType: "text",
+    },
+  ];
+});
+const rules = ref({
+  name: [{ required: true, message: "请输入联系人", trigger: "blur" }],
+  phone: [{ required: true, message: "请输入电话", trigger: "blur" }],
+  takeNum: [{ required: true, message: "请选择取号模式", trigger: "change" }],
+});
+const clickModal = () => {
+  modalType.value = "add";
+  formData.data = {};
+  openDialog.value = true;
+};
+const submitForm = () => {
+  submit.value.handleSubmit(() => {
+    proxy.post("/expressDelivery/" + modalType.value, formData.data).then(() => {
+      ElMessage({
+        message: modalType.value == "add" ? "添加成功" : "编辑成功",
+        type: "success",
+      });
+      openDialog.value = false;
+      getList();
+    });
+  });
+};
+const clickUpdate = (row) => {
+  modalType.value = "edit";
+  proxy.post("/expressDelivery/detail", { id: row.id }).then((res) => {
+    formData.data = res;
+    openDialog.value = true;
+  });
+};
+</script>
+
+<style lang="scss" scoped>
+::v-deep(.el-input-number .el-input__inner) {
+  text-align: left;
+}
+</style>

+ 158 - 0
src/views/production/operation/overclaim/index.vue

@@ -0,0 +1,158 @@
+<template>
+  <el-card class="box-card">
+    <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="submit">
+      <template #productionCostList>
+        <div style="width: 100%">
+          <el-table :data="formData.data.productionCostList" :row-style="{ height: '35px' }" header-row-class-name="tableHeader">
+            <el-table-column label="SKU品号" prop="code" width="160" />
+            <el-table-column label="SKU品名" prop="name" min-width="220" />
+            <el-table-column label="BOM品号" prop="bomCode" width="160" />
+            <el-table-column label="订单数量" prop="orderQuantity" width="120" />
+            <el-table-column label="超领数量" width="160">
+              <template #default="{ row, $index }">
+                <el-form-item :prop="'productionCostList.' + $index + '.quantity'" :rules="rules.quantity" :inline-message="true" style="width: 100%">
+                  <el-input-number
+                    onmousewheel="return false;"
+                    v-model="row.quantity"
+                    placeholder="超领数量"
+                    style="width: 100%"
+                    :controls="false"
+                    :min="0"
+                    :precision="0"
+                    :max="row.orderQuantity" />
+                </el-form-item>
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+      </template>
+    </byForm>
+    <div style="text-align: center; margin: 10px">
+      <el-button @click="clickCancel()" size="large">重 置</el-button>
+      <el-button type="primary" @click="submitForm()" size="large" v-preReClick>提 交</el-button>
+    </div>
+  </el-card>
+</template>
+
+<script setup>
+import byForm from "/src/components/byForm/index";
+import { ElMessage } from "element-plus";
+
+const { proxy } = getCurrentInstance();
+const productionOrder = ref([]);
+const exceedReceiveReasonList = ref([
+  {
+    dictKey: 1,
+    dictValue: "制作损坏",
+  },
+  {
+    dictKey: 2,
+    dictValue: "裸垫质量不良",
+  },
+]);
+const getDemandData = () => {
+  proxy.post("/productionOrder/page", { pageNum: 1, pageSize: 9999, status: "30" }).then((res) => {
+    if (res.rows && res.rows.length > 0) {
+      productionOrder.value = productionOrder.value.concat(
+        res.rows.map((item) => {
+          return {
+            dictKey: item.orderId,
+            dictValue: item.code + " (" + item.wlnCode + ")",
+          };
+        })
+      );
+    }
+  });
+};
+getDemandData();
+const submit = ref(null);
+const formOption = reactive({
+  inline: true,
+  labelWidth: "120px",
+  itemWidth: 100,
+  rules: [],
+  labelPosition: "right",
+});
+const formData = reactive({
+  data: {
+    orderId: "",
+    exceedReceiveReason: "",
+    productionCostList: [],
+  },
+});
+const formConfig = computed(() => {
+  return [
+    {
+      type: "select",
+      label: "订单号",
+      prop: "orderId",
+      data: productionOrder.value,
+      itemWidth: 51,
+      fn: (val) => {
+        if (val) {
+          proxy.post("/productionExceedReceive/getOrderSkuList", { id: val }).then((res) => {
+            console.log(res);
+            if (res && res.length > 0) {
+              formData.data.productionCostList = res.map((item) => {
+                return {
+                  bomSpecId: item.bomSpecId,
+                  name: item.name,
+                  code: item.code,
+                  bomCode: item.bomCode,
+                  quantity: undefined,
+                  orderQuantity: item.quantity,
+                };
+              });
+            } else {
+              formData.data.productionCostList = [];
+            }
+          });
+        } else {
+          formData.data.productionCostList = [];
+        }
+      },
+    },
+    {
+      type: "select",
+      label: "超领原因",
+      prop: "exceedReceiveReason",
+      data: exceedReceiveReasonList.value,
+      itemWidth: 51,
+    },
+    {
+      type: "slot",
+      slotName: "productionCostList",
+      label: "订单商品",
+    },
+  ];
+});
+const rules = ref({
+  orderId: [{ required: true, message: "请选择订单号", trigger: "change" }],
+  exceedReceiveReason: [{ required: true, message: "请选择超领原因", trigger: "change" }],
+  quantity: [{ required: true, message: "请输入超领数量", trigger: "blur" }],
+});
+const submitForm = () => {
+  submit.value.handleSubmit(() => {
+    if (formData.data.productionCostList && formData.data.productionCostList.length > 0) {
+      proxy.post("/productionExceedReceive/exceedReceive", formData.data).then(() => {
+        ElMessage({ message: "选择完成", type: "success" });
+        clickCancel();
+      });
+    } else {
+      return ElMessage("请添加订单商品");
+    }
+  });
+};
+const clickCancel = () => {
+  formData.data = {
+    productionCostList: [],
+  };
+  submit.value.resetFields();
+};
+</script>
+
+<style lang="scss" scoped>
+::v-deep(.el-input-number .el-input__inner) {
+  text-align: left;
+}
+</style>

+ 731 - 0
src/views/production/shipment/print-order/index.vue

@@ -0,0 +1,731 @@
+<template>
+  <el-card class="box-card">
+    <byTable
+      :source="sourceList.data"
+      :pagination="sourceList.pagination"
+      :config="config"
+      :loading="loading"
+      :searchConfig="searchConfig"
+      highlight-current-row
+      :defaultExpandAll="true"
+      :table-events="{
+        select: selectRow,
+        'select-all': selectRow,
+      }"
+      :action-list="[
+        {
+          text: '拆分包裹',
+          action: () => clickUnpack(),
+        },
+        {
+          text: '合并订单',
+          action: () => clickMerge(),
+        },
+        {
+          text: '取消合并',
+          action: () => clickUnMerge(),
+        },
+        {
+          text: '修改收件信息',
+          action: () => clickModifyInformation(),
+        },
+        {
+          text: '修改快递',
+          action: () => clickModifiedExpress(),
+        },
+        {
+          text: '打印快递单',
+          action: () => clickPrint(),
+          type: 'warning',
+        },
+        {
+          text: '填写线下快递单号',
+          action: () => clickFillInExpressCode(),
+        },
+      ]"
+      @get-list="getList"
+      @clickReset="clickReset">
+      <template #typeExpand="{ item }">
+        <div class="remark" v-html="item.remark"></div>
+      </template>
+      <template #code="{ item }">
+        <div>
+          <a style="color: #409eff; cursor: pointer; word-break: break-all" @click="clickCode(item)">{{ item.code }}</a>
+        </div>
+      </template>
+      <template #groupOrderCodeList="{ item }">
+        <div>
+          <div v-if="item.groupOrderCodeList && item.groupOrderCodeList.length > 0">{{ item.groupOrderCodeList.join(",") }}</div>
+        </div>
+      </template>
+      <template #total="{ item }">
+        <div>
+          <a style="color: #409eff; cursor: pointer; word-break: break-all" @click="clickTotal(item)">{{ item.total }}</a>
+        </div>
+      </template>
+      <template #address="{ item }">
+        <div>{{ item.province }},{{ item.city }},{{ item.county }},{{ item.detailedAddress }}</div>
+      </template>
+    </byTable>
+
+    <el-dialog title="包裹规格数据" v-if="openTotal" v-model="openTotal" width="90%">
+      <PackTotal :rowData="rowData" @clickCancel="clickCancel"></PackTotal>
+    </el-dialog>
+
+    <el-dialog title="包裹图片" v-if="openPackagePicture" v-model="openPackagePicture" width="70%">
+      <div v-loading="loadingPackagePicture">
+        <el-upload
+          v-model:file-list="fileList"
+          action="https://winfaster.obs.cn-south-1.myhuaweicloud.com"
+          list-type="picture-card"
+          multiple
+          :data="uploadData"
+          :before-upload="beforeUpload"
+          :on-preview="onPreview">
+          <el-icon><Plus /></el-icon>
+        </el-upload>
+      </div>
+      <template #footer>
+        <el-button @click="openPackagePicture = false" size="large">取 消</el-button>
+        <el-button type="primary" @click="submitPicture()" size="large" v-preReClick>提 交</el-button>
+      </template>
+    </el-dialog>
+
+    <el-dialog title="合并订单" v-if="openMerge" v-model="openMerge" width="500">
+      <el-form :model="formMerge.data" :rules="rulesMerge" label-width="100px" ref="refMerge">
+        <el-form-item label="主订单号" prop="id">
+          <el-select v-model="formMerge.data.id" placeholder="请选择" style="width: 100%">
+            <el-option v-for="item in selectData" :key="item.id" :label="item.code" :value="item.id"> </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="合并订单号" prop="mergeIdList">
+          <el-select v-model="formMerge.data.mergeIdList" placeholder="请选择" style="width: 100%" multiple :disabled="!formMerge.data.id">
+            <el-option v-for="item in selectData.filter((item) => item.id !== formMerge.data.id)" :key="item.id" :label="item.code" :value="item.id" />
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button @click="openMerge = false" size="large">取 消</el-button>
+        <el-button type="primary" @click="submitMerge()" size="large" v-preReClick>提 交</el-button>
+      </template>
+    </el-dialog>
+
+    <el-dialog title="修改收件信息" v-if="openInformation" v-model="openInformation" width="600">
+      <el-form :model="formInformation.data" :rules="rulesInformation" label-width="120px" ref="refInformation">
+        <el-form-item label="省" prop="province">
+          <el-input v-model="formInformation.data.province" placeholder="请输入省" />
+        </el-form-item>
+        <el-form-item label="市" prop="city">
+          <el-input v-model="formInformation.data.city" placeholder="请输入市" />
+        </el-form-item>
+        <el-form-item label="区/县" prop="county">
+          <el-input v-model="formInformation.data.county" placeholder="请输入区/县" />
+        </el-form-item>
+        <el-form-item label="详细地址" prop="detailedAddress">
+          <el-input v-model="formInformation.data.detailedAddress" placeholder="请输入详细地址" />
+        </el-form-item>
+        <el-form-item label="收货人" prop="consignee">
+          <el-input v-model="formInformation.data.consignee" placeholder="请输入收货人" />
+        </el-form-item>
+        <el-form-item label="收货人电话" prop="consigneeNumber">
+          <el-input v-model="formInformation.data.consigneeNumber" placeholder="请输入收货人电话" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button @click="openInformation = false" size="large">取 消</el-button>
+        <el-button type="primary" @click="submitInformation()" size="large" v-preReClick>保 存</el-button>
+      </template>
+    </el-dialog>
+
+    <el-dialog title="修改快递" v-if="openExpress" v-model="openExpress" width="500">
+      <el-form :model="formExpress.data" :rules="rulesExpress" label-width="100px" ref="refExpress">
+        <el-form-item label="快递" prop="expressDeliveryId">
+          <el-select v-model="formExpress.data.expressDeliveryId" placeholder="请选择快递" style="width: 100%">
+            <el-option v-for="item in useUserStore().allDict['express_delivery']" :key="item.dictKey" :label="item.dictValue" :value="item.dictKey" />
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button @click="openExpress = false" size="large">取 消</el-button>
+        <el-button type="primary" @click="submitExpress()" size="large" v-preReClick>保 存</el-button>
+      </template>
+    </el-dialog>
+
+    <el-dialog title="修改快递" v-if="openExpressCode" v-model="openExpressCode" width="500">
+      <el-form :model="formExpressCode.data" :rules="rulesExpressCode" label-width="100px" ref="refExpressCode">
+        <el-form-item label="快递单号" prop="expressDeliveryCode">
+          <el-input v-model="formExpressCode.data.expressDeliveryCode" placeholder="请输入快递单号" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button @click="openExpressCode = false" size="large">取 消</el-button>
+        <el-button type="primary" @click="submitExpressCode()" size="large" v-preReClick>保 存</el-button>
+      </template>
+    </el-dialog>
+  </el-card>
+</template>
+
+<script setup>
+import byTable from "/src/components/byTable/index";
+import { ElMessage } from "element-plus";
+import PackTotal from "/src/views/production/shipment/print-order/packTotal.vue";
+
+const { proxy } = getCurrentInstance();
+const departmentList = ref([{ dictKey: "0", dictValue: "胜德体育" }]);
+const sourceList = ref({
+  data: [],
+  pagination: {
+    total: 0,
+    pageNum: 1,
+    pageSize: 10,
+    code: "",
+    departmentId: "",
+    expressDeliveryCode: "",
+    printStatus: "",
+    beginTime: "",
+    endTime: "",
+  },
+});
+const loading = ref(false);
+const searchConfig = computed(() => {
+  return [
+    {
+      type: "input",
+      prop: "code",
+      label: "订单号",
+    },
+    {
+      type: "select",
+      prop: "departmentId",
+      data: departmentList.value,
+      label: "事业部",
+    },
+    {
+      type: "input",
+      prop: "expressDeliveryCode",
+      label: "快递单号",
+    },
+    {
+      type: "select",
+      prop: "printStatus",
+      data: [
+        {
+          dictKey: "1",
+          dictValue: "是",
+        },
+        {
+          dictKey: "0",
+          dictValue: "否",
+        },
+      ],
+      label: "打印状态",
+    },
+    {
+      type: "date",
+      propList: ["beginTime", "endTime"],
+      label: "交期",
+    },
+  ];
+});
+const config = computed(() => {
+  return [
+    {
+      type: "expand",
+      attrs: {
+        label: " ",
+        slot: "typeExpand",
+        width: 50,
+      },
+    },
+    {
+      type: "selection",
+      attrs: {
+        checkAtt: "isCheck",
+      },
+    },
+    // {
+    //   attrs: {
+    //     label: "日期",
+    //     slot: "backupDateStr",
+    //     width: 220,
+    //     align: "center",
+    //   },
+    // },
+    {
+      attrs: {
+        label: "主订单号",
+        slot: "code",
+        width: 160,
+      },
+    },
+    {
+      attrs: {
+        label: "合并订单号",
+        slot: "groupOrderCodeList",
+        width: 160,
+      },
+    },
+    {
+      attrs: {
+        label: "总包裹数",
+        slot: "total",
+        width: 90,
+      },
+    },
+    {
+      attrs: {
+        label: "事业部",
+        prop: "departmentName",
+        width: 130,
+      },
+    },
+    {
+      attrs: {
+        label: "快递",
+        prop: "expressDeliveryName",
+        width: 130,
+      },
+    },
+    {
+      attrs: {
+        label: "快递单号",
+        prop: "expressDeliveryCode",
+        width: 130,
+      },
+    },
+    {
+      attrs: {
+        label: "店铺来源",
+        prop: "sourcePlatform",
+        width: 120,
+      },
+    },
+    {
+      attrs: {
+        label: "店铺名称",
+        prop: "shopName",
+        width: 140,
+      },
+    },
+    {
+      attrs: {
+        label: "下单时间",
+        prop: "createTime",
+        width: 160,
+        align: "center",
+      },
+    },
+    {
+      attrs: {
+        label: "交期",
+        prop: "deliveryTime",
+        width: 160,
+        align: "center",
+      },
+    },
+    {
+      attrs: {
+        label: "收货人",
+        prop: "consignee",
+        width: 120,
+      },
+    },
+    {
+      attrs: {
+        label: "收货人电话",
+        prop: "consigneeNumber",
+        width: 160,
+      },
+    },
+    {
+      attrs: {
+        label: "收货地址",
+        slot: "address",
+        width: 300,
+      },
+    },
+    {
+      attrs: {
+        label: "总净重(kg)",
+        prop: "totalNetWeight",
+        width: 120,
+        fixed: "right",
+      },
+    },
+    {
+      attrs: {
+        label: "总体积(m³)",
+        prop: "totalVolume",
+        width: 120,
+        fixed: "right",
+      },
+    },
+    {
+      attrs: {
+        label: "操作",
+        width: 100,
+        align: "center",
+        fixed: "right",
+      },
+      renderHTML(row) {
+        return [
+          {
+            attrs: {
+              label: "包裹图片",
+              type: "primary",
+              text: true,
+            },
+            el: "button",
+            click() {
+              clickPackagePicture(row);
+            },
+          },
+        ];
+      },
+    },
+  ];
+});
+const getDemandData = () => {
+  proxy.post("/department/page", { pageNum: 1, pageSize: 999 }).then((res) => {
+    if (res.rows && res.rows.length > 0) {
+      departmentList.value = departmentList.value.concat(
+        res.rows.map((item) => {
+          return {
+            dictKey: item.id,
+            dictValue: item.name,
+          };
+        })
+      );
+    }
+  });
+};
+getDemandData();
+const getList = async (req, status) => {
+  if (status) {
+    sourceList.value.pagination = {
+      pageNum: sourceList.value.pagination.pageNum,
+      pageSize: sourceList.value.pagination.pageSize,
+    };
+  } else {
+    sourceList.value.pagination = { ...sourceList.value.pagination, ...req };
+  }
+  loading.value = true;
+  proxy.post("/issueBill/page", sourceList.value.pagination).then((res) => {
+    if (res.rows && res.rows.length > 0) {
+      sourceList.value.data = res.rows.map((item) => {
+        return {
+          ...item,
+          isCheck: true,
+        };
+      });
+    } else {
+      sourceList.value.data = [];
+    }
+    sourceList.value.pagination.total = res.total;
+    setTimeout(() => {
+      loading.value = false;
+    }, 200);
+  });
+};
+getList();
+const clickReset = () => {
+  getList("", true);
+};
+const selectData = ref([]);
+const selectRow = (data) => {
+  selectData.value = data;
+};
+const clickCode = (row) => {
+  proxy.$router.replace({
+    path: "/order-detail",
+    query: {
+      detailId: row.id,
+      text: "订单详情",
+      random: proxy.random(),
+    },
+  });
+};
+const openTotal = ref(false);
+const rowData = ref({});
+const clickTotal = (item) => {
+  rowData.value = item;
+  openTotal.value = true;
+};
+const clickCancel = () => {
+  openTotal.value = false;
+};
+const openPackagePicture = ref(false);
+const loadingPackagePicture = ref(false);
+const fileList = ref([]);
+const clickPackagePicture = (item) => {
+  fileList.value = [];
+  rowData.value = item;
+  openPackagePicture.value = true;
+  loadingPackagePicture.value = true;
+  proxy.post("/fileInfo/getList", { businessIdList: [item.id] }).then(
+    (fileObj) => {
+      if (fileObj[item.id] && fileObj[item.id].length > 0) {
+        let file = fileObj[item.id].filter((item) => item.businessType == "2");
+        if (file && file.length > 0) {
+          fileList.value = file.map((item) => {
+            return {
+              raw: item,
+              name: item.fileName,
+              url: item.fileUrl,
+            };
+          });
+        } else {
+          fileList.value = [];
+        }
+      }
+      loadingPackagePicture.value = false;
+    },
+    (err) => {
+      console.log(err);
+      loadingPackagePicture.value = false;
+    }
+  );
+};
+const uploadData = ref({});
+const beforeUpload = async (file) => {
+  const res = await proxy.post("/fileInfo/getSing", { fileName: file.name });
+  uploadData.value = res.uploadBody;
+  file.id = res.id;
+  file.fileName = res.fileName;
+  file.fileUrl = res.fileUrl;
+  return true;
+};
+const onPreview = (file) => {
+  window.open(file.raw.fileUrl, "_blank");
+};
+const submitPicture = () => {
+  let packagePictureList = [];
+  if (fileList.value && fileList.value.length > 0) {
+    packagePictureList = fileList.value.map((item) => {
+      return {
+        id: item.raw.id,
+        fileName: item.raw.fileName,
+        fileUrl: item.raw.fileUrl,
+      };
+    });
+  }
+  loadingPackagePicture.value = true;
+  proxy.post("/issueBill/editPackagePicture", { id: rowData.value.id, packagePictureList: packagePictureList }).then(
+    () => {
+      openPackagePicture.value = false;
+      loadingPackagePicture.value = false;
+      ElMessage({ message: "提交成功", type: "success" });
+    },
+    (err) => {
+      console.log(err);
+      loadingPackagePicture.value = false;
+    }
+  );
+};
+const clickUnpack = () => {
+  if (selectData.value && selectData.value.length > 0) {
+    if (selectData.value.length > 1) {
+      return ElMessage("每次只能选一个");
+    }
+    proxy.$router.replace({
+      path: "/production/shipment/unpack",
+      query: {
+        id: selectData.value[0].id,
+      },
+    });
+  } else {
+    return ElMessage("请先选择需要拆分包裹的订单");
+  }
+};
+const openMerge = ref(false);
+const formMerge = reactive({
+  data: {
+    id: "",
+    mergeIdList: [],
+  },
+});
+const rulesMerge = ref({
+  id: [{ required: true, message: "请选择主订单", trigger: "change" }],
+  mergeIdList: [{ required: true, message: "请选择合并订单", trigger: "change" }],
+});
+const clickMerge = () => {
+  if (selectData.value && selectData.value.length > 1) {
+    for (let i = 0; i < selectData.value.length; i++) {
+      if (selectData.value[i].groupOrderCodeList && selectData.value[i].groupOrderCodeList.length > 0) {
+        return ElMessage("请选择未合并订单进行合并");
+      }
+    }
+    formMerge.data = {
+      id: "",
+      mergeIdList: [],
+    };
+    openMerge.value = true;
+  } else {
+    return ElMessage("请选择需要合并的订单");
+  }
+};
+const submitMerge = () => {
+  proxy.$refs.refMerge.validate((valid) => {
+    if (valid) {
+      proxy.post("/issueBill/merge", formMerge.data).then(() => {
+        openMerge.value = false;
+        ElMessage({ message: "提交成功", type: "success" });
+        getList();
+      });
+    }
+  });
+};
+const clickUnMerge = () => {
+  if (selectData.value && selectData.value.length > 0) {
+    if (selectData.value.length > 1) {
+      return ElMessage("每次只能选一个");
+    }
+    if (!(selectData.value[0].groupOrderCodeList && selectData.value[0].groupOrderCodeList.length > 0)) {
+      return ElMessage("该订单没有合并");
+    }
+    proxy.post("/issueBill/unmerge", { id: selectData.value[0].id }).then(() => {
+      ElMessage({ message: "取消合并成功", type: "success" });
+      getList();
+    });
+  } else {
+    return ElMessage("请先选择需要取消合并的订单");
+  }
+};
+const openInformation = ref(false);
+const formInformation = reactive({
+  data: {
+    id: "",
+    province: "",
+    city: "",
+    county: "",
+    detailedAddress: "",
+    consignee: "",
+    consigneeNumber: "",
+  },
+});
+const rulesInformation = ref({
+  province: [{ required: true, message: "请输入省", trigger: "blur" }],
+  city: [{ required: true, message: "请输入市", trigger: "blur" }],
+  county: [{ required: true, message: "请输入县", trigger: "blur" }],
+  detailedAddress: [{ required: true, message: "请输入详细地址", trigger: "blur" }],
+  consignee: [{ required: true, message: "请输入收货人", trigger: "blur" }],
+  consigneeNumber: [{ required: true, message: "请输入收货人电话", trigger: "blur" }],
+});
+const clickModifyInformation = () => {
+  if (selectData.value && selectData.value.length > 0) {
+    if (selectData.value.length > 1) {
+      return ElMessage("每次只能选一个");
+    }
+    formInformation.data = {
+      id: selectData.value[0].id,
+      province: selectData.value[0].province,
+      city: selectData.value[0].city,
+      county: selectData.value[0].county,
+      detailedAddress: selectData.value[0].detailedAddress,
+      consignee: selectData.value[0].consignee,
+      consigneeNumber: selectData.value[0].consigneeNumber,
+    };
+    openInformation.value = true;
+  } else {
+    return ElMessage("请先选择需要修改收件信息的订单");
+  }
+};
+const submitInformation = () => {
+  proxy.$refs.refInformation.validate((valid) => {
+    if (valid) {
+      proxy.post("/issueBill/editAddress", formInformation.data).then(() => {
+        openInformation.value = false;
+        ElMessage({ message: "保存成功", type: "success" });
+        getList();
+      });
+    }
+  });
+};
+const openExpress = ref(false);
+const formExpress = reactive({
+  data: {
+    id: "",
+    expressDeliveryId: "",
+  },
+});
+const rulesExpress = ref({
+  expressDeliveryId: [{ required: true, message: "请选择快递", trigger: "change" }],
+});
+const clickModifiedExpress = () => {
+  if (selectData.value && selectData.value.length > 0) {
+    if (selectData.value.length > 1) {
+      return ElMessage("每次只能选一个");
+    }
+    formExpress.data = {
+      id: selectData.value[0].id,
+      expressDeliveryId: selectData.value[0].expressDeliveryId,
+    };
+    openExpress.value = true;
+  } else {
+    return ElMessage("请先选择需要修改快递的订单");
+  }
+};
+const submitExpress = () => {
+  proxy.$refs.refExpress.validate((valid) => {
+    if (valid) {
+      proxy.post("/issueBill/editExpressDeliveryId", formExpress.data).then(() => {
+        openExpress.value = false;
+        ElMessage({ message: "保存成功", type: "success" });
+        getList();
+      });
+    }
+  });
+};
+const clickPrint = () => {
+  console.log("打印快递单");
+};
+const openExpressCode = ref(false);
+const formExpressCode = reactive({
+  data: {
+    id: "",
+    expressDeliveryCode: "",
+  },
+});
+const rulesExpressCode = ref({
+  expressDeliveryCode: [{ required: true, message: "请输入快递单号", trigger: "blur" }],
+});
+const clickFillInExpressCode = () => {
+  if (selectData.value && selectData.value.length > 0) {
+    if (selectData.value.length > 1) {
+      return ElMessage("每次只能选一个");
+    }
+    formExpressCode.data = {
+      id: selectData.value[0].id,
+      expressDeliveryCode: selectData.value[0].expressDeliveryCode,
+    };
+    openExpressCode.value = true;
+  } else {
+    return ElMessage("请先选择需要填写快递单号的订单");
+  }
+};
+const submitExpressCode = () => {
+  proxy.$refs.refExpressCode.validate((valid) => {
+    if (valid) {
+      proxy.post("/issueBill/editExpressDeliveryCode", formExpressCode.data).then(() => {
+        openExpressCode.value = false;
+        ElMessage({ message: "保存成功", type: "success" });
+        getList();
+      });
+    }
+  });
+};
+</script>
+
+<style lang="scss" scoped>
+::v-deep(.remark) {
+  margin: 0 16px;
+  p {
+    margin-block-start: 0 !important;
+    margin-block-end: 0 !important;
+  }
+}
+:deep(.el-dialog) {
+  margin-top: 10px !important;
+  margin-bottom: 10px !important;
+}
+</style>

+ 101 - 0
src/views/production/shipment/print-order/packTotal.vue

@@ -0,0 +1,101 @@
+<template>
+  <div>
+    <div
+      style="max-height: calc(100vh - 174px); overflow-x: hidden; overflow-y: auto"
+      v-if="formData.data.orderEncasementList && formData.data.orderEncasementList.length > 0">
+      <div style="box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.1); margin-bottom: 20px" v-for="(item, index) in formData.data.orderEncasementList" :key="index">
+        <div style="background-color: #edf0f5; padding: 4px">
+          <el-row :gutter="4" class="row-top">
+            <el-col :span="8">包裹规格格(cm)</el-col>
+            <el-col :span="8">包裹净重(kg)</el-col>
+            <el-col :span="8">包裹体积(m³)</el-col>
+          </el-row>
+          <el-row :gutter="4" class="row-bottom">
+            <el-col :span="8">{{ `${item.length}*${item.width}*${item.height}` }}</el-col>
+            <el-col :span="8">{{ item.netWeight / 1000 }}</el-col>
+            <el-col :span="8">{{ (item.length * item.width * item.height) / 1000000 }}</el-col>
+          </el-row>
+        </div>
+        <div style="background-color: white; border: 1px solid #ebeef5">
+          <el-table
+            border
+            :data="item.orderEncasementDetailList"
+            :row-style="{ height: '35px' }"
+            :cell-style="{ padding: '0' }"
+            header-row-class-name="tableHeaderTwo">
+            <el-table-column label="产品品号" prop="skuSpecCode" width="150" />
+            <el-table-column label="产品品名" prop="skuSpecName" />
+            <el-table-column label="打包数量" align="center" width="120">
+              <template #default="{ row }">
+                <div>
+                  {{ row.quantity ? row.quantity : 0 }}
+                </div>
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+      </div>
+    </div>
+    <div style="text-align: center; margin: 10px">
+      <el-button @click="clickCancel()" size="large">关 闭</el-button>
+    </div>
+  </div>
+</template>
+
+<script setup>
+const { proxy } = getCurrentInstance();
+const props = defineProps({
+  rowData: Object,
+});
+const loading = ref(false);
+const formData = reactive({
+  data: {
+    skuInfoList: [],
+    orderEncasementList: [],
+  },
+});
+onMounted(() => {
+  if (props.rowData && props.rowData.id) {
+    getDetails();
+  }
+});
+const getDetails = () => {
+  loading.value = true;
+  proxy.post("/issueBill/assemblyDetail", { id: props.rowData.id }).then(
+    (res) => {
+      formData.data = res;
+      loading.value = false;
+    },
+    (err) => {
+      console.log(err);
+      loading.value = false;
+    }
+  );
+};
+const emit = defineEmits(["clickCancel"]);
+const clickCancel = () => {
+  emit("clickCancel", false);
+};
+</script>
+
+<style lang="scss" scoped>
+.row-top .el-col {
+  text-align: center;
+  height: 32px;
+  line-height: 32px;
+}
+.row-bottom .el-col {
+  text-align: center;
+  color: red;
+  font-weight: 700;
+  height: 32px;
+  line-height: 32px;
+}
+::v-deep(.tableHeaderTwo) {
+  th {
+    background-color: white !important;
+    height: 35px;
+    padding: 0;
+  }
+}
+</style>

+ 280 - 0
src/views/production/shipment/print-order/unpack.vue

@@ -0,0 +1,280 @@
+<template>
+  <div>
+    <el-row :gutter="10">
+      <el-col :span="7">
+        <el-card class="box-card">
+          <div style="font-size: 16px; font-weight: 700; margin-bottom: 10px">产品清单</div>
+          <el-table :data="formData.data.skuInfoList" :row-style="{ height: '35px' }" header-row-class-name="tableHeader" height="calc(100vh - 315px)">
+            <el-table-column label="产品规格">
+              <template #default="{ row }">
+                <div>{{ row.skuSpecCode }}</div>
+                <div>{{ row.skuSpecName }}</div>
+              </template>
+            </el-table-column>
+            <el-table-column label="剩余可装箱数" prop="surplusQuantity" align="center" width="110" />
+            <el-table-column label="净重(g)" width="120">
+              <template #default="{ row }">
+                <el-input-number
+                  onmousewheel="return false;"
+                  v-model="row.quantity"
+                  placeholder="净重"
+                  style="width: 100%"
+                  :controls="false"
+                  :min="0"
+                  :precision="0"
+                  :max="row.surplusQuantity" />
+              </template>
+            </el-table-column>
+          </el-table>
+          <div style="font-size: 16px; font-weight: 700; margin: 10px 0">包裹规格信息</div>
+          <el-form :model="formData.data" :rules="rules" label-width="120px" ref="refForm">
+            <el-form-item label="尺寸(cm)" required>
+              <el-row>
+                <el-col :span="8">
+                  <el-form-item label="" prop="length">
+                    <el-input-number
+                      onmousewheel="return false;"
+                      v-model="formData.data.length"
+                      placeholder="长"
+                      style="width: 100%"
+                      :controls="false"
+                      :min="0"
+                      :precision="2" />
+                  </el-form-item>
+                </el-col>
+                <el-col :span="8">
+                  <el-form-item label="" prop="width">
+                    <el-input-number
+                      onmousewheel="return false;"
+                      v-model="formData.data.width"
+                      placeholder="宽"
+                      style="width: 100%"
+                      :controls="false"
+                      :min="0"
+                      :precision="2" />
+                  </el-form-item>
+                </el-col>
+                <el-col :span="8">
+                  <el-form-item label="" prop="height">
+                    <el-input-number
+                      onmousewheel="return false;"
+                      v-model="formData.data.height"
+                      placeholder="高"
+                      style="width: 100%"
+                      :controls="false"
+                      :min="0"
+                      :precision="2" />
+                  </el-form-item>
+                </el-col>
+              </el-row>
+            </el-form-item>
+            <el-button type="primary" style="width: 100%" @click="submitPack()" v-preReClick>装包裹</el-button>
+          </el-form>
+        </el-card>
+      </el-col>
+      <el-col :span="17">
+        <el-card class="box-card">
+          <div style="font-size: 16px; font-weight: 700; margin-bottom: 10px">包裹规格数据</div>
+          <div
+            style="max-height: calc(100vh - 190px); overflow-x: hidden; overflow-y: auto"
+            v-if="formData.data.orderEncasementList && formData.data.orderEncasementList.length > 0">
+            <div
+              style="box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.1); margin-bottom: 20px"
+              v-for="(item, index) in formData.data.orderEncasementList"
+              :key="index">
+              <div style="background-color: #edf0f5; padding: 4px">
+                <el-row :gutter="4" class="row-top">
+                  <el-col :span="8">包裹规格格(cm)</el-col>
+                  <el-col :span="6">包裹净重(kg)</el-col>
+                  <el-col :span="6">包裹体积(m³)</el-col>
+                  <el-col :span="4">操作</el-col>
+                </el-row>
+                <el-row :gutter="4" class="row-bottom">
+                  <el-col :span="8">{{ `${item.length}*${item.width}*${item.height}` }}</el-col>
+                  <el-col :span="6">{{ item.netWeight / 1000 }}</el-col>
+                  <el-col :span="6">{{ (item.length * item.width * item.height) / 1000000 }}</el-col>
+                  <el-col :span="4">
+                    <el-button type="primary" @click="copyPack(item)" text>复制包裹</el-button>
+                    <el-button type="danger" @click="deletePack(item)" text>删除</el-button>
+                  </el-col>
+                </el-row>
+              </div>
+              <div style="background-color: white; border: 1px solid #ebeef5">
+                <el-table
+                  border
+                  :data="item.orderEncasementDetailList"
+                  :row-style="{ height: '35px' }"
+                  :cell-style="{ padding: '0' }"
+                  header-row-class-name="tableHeaderTwo">
+                  <el-table-column label="产品品号" prop="skuSpecCode" width="150" />
+                  <el-table-column label="产品品名" prop="skuSpecName" />
+                  <el-table-column label="打包数量" align="center" width="120">
+                    <template #default="{ row }">
+                      <div>
+                        {{ row.quantity ? row.quantity : 0 }}
+                      </div>
+                    </template>
+                  </el-table-column>
+                </el-table>
+              </div>
+            </div>
+          </div>
+        </el-card>
+      </el-col>
+    </el-row>
+
+    <el-dialog title="复制包裹" v-if="openCopy" v-model="openCopy" width="500">
+      <el-form :model="formCopy.data" :rules="rulesCopy" label-width="100px" ref="refCopy">
+        <el-form-item label="复制数量" prop="total">
+          <el-input-number
+            onmousewheel="return false;"
+            v-model="formCopy.data.total"
+            placeholder="请输入复制数量"
+            style="width: 100%"
+            :controls="false"
+            :min="0"
+            :precision="0" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button @click="openCopy = false" size="large">取 消</el-button>
+        <el-button type="primary" @click="submitCopy()" size="large" v-preReClick>提 交</el-button>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import { useRoute } from "vue-router";
+import { ElMessage, ElMessageBox } from "element-plus";
+
+const { proxy } = getCurrentInstance();
+const route = useRoute();
+const loading = ref(false);
+const formData = reactive({
+  data: {
+    skuInfoList: [],
+    orderEncasementList: [],
+  },
+});
+const rules = ref({
+  length: [{ required: true, message: "请输入长", trigger: "blur" }],
+  width: [{ required: true, message: "请输入宽", trigger: "blur" }],
+  height: [{ required: true, message: "请输入高", trigger: "blur" }],
+});
+onMounted(() => {
+  if (route.query && route.query.id) {
+    getDetails();
+  }
+});
+const getDetails = () => {
+  loading.value = true;
+  proxy.post("/issueBill/assemblyDetail", { id: route.query.id }).then(
+    (res) => {
+      formData.data = res;
+      loading.value = false;
+    },
+    (err) => {
+      console.log(err);
+      loading.value = false;
+    }
+  );
+};
+const submitPack = () => {
+  proxy.$refs.refForm.validate((valid) => {
+    if (valid) {
+      let list = formData.data.skuInfoList.filter((item) => item.quantity > 0);
+      if (!(list && list.length > 0)) {
+        return ElMessage("请至少输入一个装箱数量");
+      }
+      loading.value = true;
+      proxy
+        .post("/issueBill/addAllowance", {
+          orderId: route.query.id,
+          length: formData.data.length,
+          width: formData.data.width,
+          height: formData.data.height,
+          orderEncasementDetailList: list,
+          total: 1,
+        })
+        .then(
+          () => {
+            ElMessage({ message: "装箱成功", type: "success" });
+            getDetails();
+          },
+          (err) => {
+            console.log(err);
+            loading.value = false;
+          }
+        );
+    }
+  });
+};
+const openCopy = ref(false);
+const formCopy = reactive({
+  data: {
+    id: "",
+    total: undefined,
+  },
+});
+const rulesCopy = ref({
+  total: [{ required: true, message: "请输入复制数量", trigger: "blur" }],
+});
+const copyPack = (item) => {
+  formCopy.data = {
+    id: item.id,
+    total: undefined,
+  };
+  openCopy.value = true;
+};
+const submitCopy = () => {
+  proxy.$refs.refCopy.validate((valid) => {
+    if (valid) {
+      proxy.post("/issueBill/copyAllowance", formCopy.data).then(() => {
+        openCopy.value = false;
+        ElMessage({ message: "复制成功", type: "success" });
+        getDetails();
+      });
+    }
+  });
+};
+const deletePack = (row) => {
+  ElMessageBox.confirm("你是否确认此操作", "提示", {
+    confirmButtonText: "确定",
+    cancelButtonText: "取消",
+    type: "warning",
+  })
+    .then(() => {
+      proxy.post("/issueBill/deleteAllowance", { id: row.id }).then(() => {
+        ElMessage({ message: "删除成功", type: "success" });
+        getDetails();
+      });
+    })
+    .catch(() => {});
+};
+</script>
+
+<style lang="scss" scoped>
+::v-deep(.el-input-number .el-input__inner) {
+  text-align: left;
+}
+.row-top .el-col {
+  text-align: center;
+  height: 32px;
+  line-height: 32px;
+}
+.row-bottom .el-col {
+  text-align: center;
+  color: red;
+  font-weight: 700;
+  height: 32px;
+  line-height: 32px;
+}
+::v-deep(.tableHeaderTwo) {
+  th {
+    background-color: white !important;
+    height: 35px;
+    padding: 0;
+  }
+}
+</style>

+ 14 - 0
src/views/subsidiary/order/management/add.vue

@@ -350,6 +350,7 @@
               <span style="font-weight: 700; color: #6c88f1; margin-left: 40px">包装人工费: ¥{{ moneyFormat(calculatedAmount("packingLabor"), 2) }}</span>
               <span style="font-weight: 700; color: #6c88f1; margin-left: 40px">包材费: ¥{{ moneyFormat(calculatedPackagingMaterialCost(), 2) }}</span>
               <span style="font-weight: 700; color: #6c88f1; margin-left: 40px">管理费: ¥{{ moneyFormat(calculatedAmount("managementFee"), 2) }}</span>
+              <span style="font-weight: 700; color: #6c88f1; margin-left: 40px">外箱包装费: ¥{{ moneyFormat(calculatedOuterBoxPackingFee(), 2) }}</span>
             </div>
             <div style="padding: 8px 0 0 0">
               <span style="font-weight: 700; color: red">订单总金额(含税): ¥{{ moneyFormat(calculatedTotalAmount(), 2) }}</span>
@@ -644,6 +645,7 @@ const submitForm = (status) => {
       formData.data.deliveryMaterialsFee = calculatedAmount("deliveryMaterialsFee");
       formData.data.packingLabor = calculatedAmount("packingLabor");
       formData.data.managementFee = calculatedAmount("managementFee");
+      formData.data.outerBoxPackingFee = calculatedOuterBoxPackingFee();
       formData.data.packagingMaterialCost = calculatedPackagingMaterialCost();
       formData.data.totalAmount = calculatedTotalAmount();
       if (fileList.value && fileList.value.length > 0) {
@@ -1008,6 +1010,7 @@ const calculatedTotalAmount = () => {
         calculatedAmount("deliveryMaterialsFee") +
         calculatedAmount("packingLabor") +
         calculatedAmount("managementFee") +
+        calculatedOuterBoxPackingFee() +
         calculatedPackagingMaterialCost()) *
         100
     ) / 100
@@ -1047,6 +1050,17 @@ const handleAdhesiveSuccess = (UploadFile, index) => {
     fileUrl: UploadFile.raw.fileUrl,
   };
 };
+const calculatedOuterBoxPackingFee = () => {
+  let money = 0;
+  if (formData.data.orderPackageBomList && formData.data.orderPackageBomList.length > 0) {
+    for (let i = 0; i < formData.data.orderPackageBomList.length; i++) {
+      if (formData.data.orderPackageBomList[i].costPrice && formData.data.orderPackageBomList[i].quantity) {
+        money = Number(Math.round((money + formData.data.orderPackageBomList[i].costPrice * formData.data.orderPackageBomList[i].quantity) * 100) / 100);
+      }
+    }
+  }
+  return money;
+};
 </script>
 
 <style lang="scss" scoped>

+ 14 - 0
src/views/subsidiary/order/management/design.vue

@@ -280,6 +280,7 @@
               <span style="font-weight: 700; color: #6c88f1; margin-left: 40px">包装人工费: ¥{{ moneyFormat(calculatedAmount("packingLabor"), 2) }}</span>
               <span style="font-weight: 700; color: #6c88f1; margin-left: 40px">包材费: ¥{{ moneyFormat(calculatedPackagingMaterialCost(), 2) }}</span>
               <span style="font-weight: 700; color: #6c88f1; margin-left: 40px">管理费: ¥{{ moneyFormat(calculatedAmount("managementFee"), 2) }}</span>
+              <span style="font-weight: 700; color: #6c88f1; margin-left: 40px">外箱包装费: ¥{{ moneyFormat(calculatedOuterBoxPackingFee(), 2) }}</span>
             </div>
             <div style="padding: 8px 0 0 0">
               <span style="font-weight: 700; color: red">订单总金额(含税): ¥{{ moneyFormat(calculatedTotalAmount(), 2) }}</span>
@@ -523,6 +524,7 @@ const submitForm = (status) => {
       formData.data.deliveryMaterialsFee = calculatedAmount("deliveryMaterialsFee");
       formData.data.packingLabor = calculatedAmount("packingLabor");
       formData.data.managementFee = calculatedAmount("managementFee");
+      formData.data.outerBoxPackingFee = calculatedOuterBoxPackingFee();
       formData.data.packagingMaterialCost = calculatedPackagingMaterialCost();
       formData.data.totalAmount = calculatedTotalAmount();
       if (fileList.value && fileList.value.length > 0) {
@@ -775,6 +777,7 @@ const calculatedTotalAmount = () => {
         calculatedAmount("deliveryMaterialsFee") +
         calculatedAmount("packingLabor") +
         calculatedAmount("managementFee") +
+        calculatedOuterBoxPackingFee() +
         calculatedPackagingMaterialCost()) *
         100
     ) / 100
@@ -814,6 +817,17 @@ const handleAdhesiveSuccess = (UploadFile, index) => {
     fileUrl: UploadFile.raw.fileUrl,
   };
 };
+const calculatedOuterBoxPackingFee = () => {
+  let money = 0;
+  if (formData.data.orderPackageBomList && formData.data.orderPackageBomList.length > 0) {
+    for (let i = 0; i < formData.data.orderPackageBomList.length; i++) {
+      if (formData.data.orderPackageBomList[i].costPrice && formData.data.orderPackageBomList[i].quantity) {
+        money = Number(Math.round((money + formData.data.orderPackageBomList[i].costPrice * formData.data.orderPackageBomList[i].quantity) * 100) / 100);
+      }
+    }
+  }
+  return money;
+};
 </script>
 
 <style lang="scss" scoped>

+ 25 - 7
src/views/subsidiary/order/management/index.vue

@@ -272,6 +272,17 @@ const config = computed(() => {
     },
     {
       attrs: {
+        label: "外箱包装费 ¥",
+        prop: "outerBoxPackingFee",
+        width: 120,
+        align: "right",
+      },
+      render(val) {
+        return proxy.moneyFormat(val);
+      },
+    },
+    {
+      attrs: {
         label: "交期",
         prop: "deliveryTime",
         width: 160,
@@ -329,7 +340,7 @@ const config = computed(() => {
                 },
               }
             : {},
-          row.status == 0
+          row.status == 0 && row.flowStatus !== 1 && row.flowStatus !== 2
             ? {
                 attrs: {
                   label: "编辑",
@@ -399,18 +410,23 @@ const clickReset = () => {
 };
 const clickAddOrder = () => {
   proxy.$router.replace({
-    path: "/addOrder",
+    path: "/platform_manage/process/processApproval",
     query: {
+      flowKey: "order",
+      flowName: "新建订单流程",
       random: proxy.random(),
     },
   });
 };
 const clickCode = (row) => {
   proxy.$router.replace({
-    path: "/addOrder",
+    path: "/platform_manage/process/processApproval",
     query: {
-      detailId: row.id,
-      text: "订单详情",
+      flowKey: "order",
+      flowName: "订单详情",
+      processType: "20",
+      id: row.id,
+      flowId: row.flowId,
       random: proxy.random(),
     },
   });
@@ -431,10 +447,12 @@ const clickDelete = (row) => {
 };
 const clickUpdate = (row) => {
   proxy.$router.replace({
-    path: "/addOrder",
+    path: "/platform_manage/process/processApproval",
     query: {
+      flowKey: "order",
+      flowName: "新建订单流程",
+      processType: "40",
       id: row.id,
-      text: "编辑订单",
       random: proxy.random(),
     },
   });

+ 11 - 0
src/views/subsidiary/order/productManagement/index.vue

@@ -269,6 +269,17 @@ const config = computed(() => {
     },
     {
       attrs: {
+        label: "外箱包装费 ¥",
+        prop: "outerBoxPackingFee",
+        width: 120,
+        align: "right",
+      },
+      render(val) {
+        return proxy.moneyFormat(val);
+      },
+    },
+    {
+      attrs: {
         label: "下单时间",
         slot: "wlnCreateTime",
         width: 160,

+ 222 - 268
src/views/system/role/index.vue

@@ -1,244 +1,185 @@
 <template>
-   <div class="app-container">
-      <el-form :model="queryParams" ref="queryRef" v-show="showSearch" :inline="true" label-width="68px">
-         <el-form-item label="角色名称" prop="roleName">
-            <el-input
-               v-model="queryParams.roleName"
-               placeholder="请输入角色名称"
-               clearable
-               style="width: 240px"
-               @keyup.enter="handleQuery"
-            />
-         </el-form-item>
-         <el-form-item label="权限字符" prop="roleKey">
-            <el-input
-               v-model="queryParams.roleKey"
-               placeholder="请输入权限字符"
-               clearable
-               style="width: 240px"
-               @keyup.enter="handleQuery"
-            />
-         </el-form-item>
-         <el-form-item label="状态" prop="status">
-            <el-select
-               v-model="queryParams.status"
-               placeholder="角色状态"
-               clearable
-               style="width: 240px"
-            >
-               <el-option
-                  v-for="dict in sys_normal_disable"
-                  :key="dict.value"
-                  :label="dict.label"
-                  :value="dict.value"
-               />
-            </el-select>
-         </el-form-item>
-         <el-form-item label="创建时间" style="width: 308px">
-            <el-date-picker
-               v-model="dateRange"
-               value-format="YYYY-MM-DD"
-               type="daterange"
-               range-separator="-"
-               start-placeholder="开始日期"
-               end-placeholder="结束日期"
-            ></el-date-picker>
-         </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-row :gutter="10" class="mb8">
-         <el-col :span="1.5">
-            <el-button
-               type="primary"
-               plain
-               icon="Plus"
-               @click="handleAdd"
-               v-hasPermi="['system:role:add']"
-            >新增</el-button>
-         </el-col>
-         <el-col :span="1.5">
-            <el-button
-               type="success"
-               plain
-               icon="Edit"
-               :disabled="single"
-               @click="handleUpdate"
-               v-hasPermi="['system:role:edit']"
-            >修改</el-button>
-         </el-col>
-         <el-col :span="1.5">
-            <el-button
-               type="danger"
-               plain
-               icon="Delete"
-               :disabled="multiple"
-               @click="handleDelete"
-               v-hasPermi="['system:role:remove']"
-            >删除</el-button>
-         </el-col>
-         <el-col :span="1.5">
-            <el-button
-               type="warning"
-               plain
-               icon="Download"
-               @click="handleExport"
-               v-hasPermi="['system:role:export']"
-            >导出</el-button>
-         </el-col>
-         <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
-      </el-row>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryRef" v-show="showSearch" :inline="true" label-width="68px">
+      <el-form-item label="角色名称" prop="roleName">
+        <el-input v-model="queryParams.roleName" placeholder="请输入角色名称" clearable style="width: 240px" @keyup.enter="handleQuery" />
+      </el-form-item>
+      <el-form-item label="权限字符" prop="roleKey">
+        <el-input v-model="queryParams.roleKey" placeholder="请输入权限字符" clearable style="width: 240px" @keyup.enter="handleQuery" />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="角色状态" clearable style="width: 240px">
+          <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="创建时间" style="width: 308px">
+        <el-date-picker
+          v-model="dateRange"
+          value-format="YYYY-MM-DD"
+          type="daterange"
+          range-separator="-"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"></el-date-picker>
+      </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-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:role:add']">新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate" v-hasPermi="['system:role:edit']">修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete" v-hasPermi="['system:role:remove']">删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:role:export']">导出</el-button>
+      </el-col>
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
 
-      <!-- 表格数据 -->
-      <el-table v-loading="loading" :data="roleList" @selection-change="handleSelectionChange">
-         <el-table-column type="selection" width="55" align="center" />
-         <el-table-column label="角色编号" prop="roleId" width="120" />
-         <el-table-column label="角色名称" prop="roleName" :show-overflow-tooltip="true" width="150" />
-         <el-table-column label="权限字符" prop="roleKey" :show-overflow-tooltip="true" width="150" />
-         <el-table-column label="显示顺序" prop="roleSort" width="100" />
-         <el-table-column label="状态" align="center" width="100">
-            <template #default="scope">
-               <el-switch
-                  v-model="scope.row.status"
-                  active-value="0"
-                  inactive-value="1"
-                  @change="handleStatusChange(scope.row)"
-               ></el-switch>
-            </template>
-         </el-table-column>
-         <el-table-column label="创建时间" align="center" prop="createTime">
-            <template #default="scope">
-               <span>{{ parseTime(scope.row.createTime) }}</span>
-            </template>
-         </el-table-column>
-         <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
-            <template #default="scope">
-              <el-tooltip content="修改" placement="top" v-if="scope.row.roleId !== 1">
-                <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:role:edit']"></el-button>
-              </el-tooltip>
-              <el-tooltip content="删除" placement="top" v-if="scope.row.roleId !== 1">
-                <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:role:remove']"></el-button>
-              </el-tooltip>
-              <el-tooltip content="数据权限" placement="top" v-if="scope.row.roleId !== 1">
-                <el-button link type="primary" icon="CircleCheck" @click="handleDataScope(scope.row)" v-hasPermi="['system:role:edit']"></el-button>
-              </el-tooltip>
-              <el-tooltip content="分配用户" placement="top" v-if="scope.row.roleId !== 1">
-                <el-button link type="primary" icon="User" @click="handleAuthUser(scope.row)" v-hasPermi="['system:role:edit']"></el-button>
-              </el-tooltip>
-            </template>
-         </el-table-column>
-      </el-table>
+    <!-- 表格数据 -->
+    <el-table v-loading="loading" :data="roleList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="角色编号" prop="roleId" width="120" />
+      <el-table-column label="角色名称" prop="roleName" :show-overflow-tooltip="true" width="150" />
+      <el-table-column label="权限字符" prop="roleKey" :show-overflow-tooltip="true" width="150" />
+      <el-table-column label="显示顺序" prop="roleSort" width="100" />
+      <el-table-column label="状态" align="center" width="100">
+        <template #default="scope">
+          <el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" align="center" prop="createTime">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template #default="scope">
+          <el-tooltip content="修改" placement="top" v-if="scope.row.roleId !== 1">
+            <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:role:edit']"></el-button>
+          </el-tooltip>
+          <el-tooltip content="删除" placement="top" v-if="scope.row.roleId !== 1">
+            <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:role:remove']"></el-button>
+          </el-tooltip>
+          <el-tooltip content="数据权限" placement="top" v-if="scope.row.roleId !== 1">
+            <el-button link type="primary" icon="CircleCheck" @click="handleDataScope(scope.row)" v-hasPermi="['system:role:edit']"></el-button>
+          </el-tooltip>
+          <el-tooltip content="分配用户" placement="top" v-if="scope.row.roleId !== 1">
+            <el-button link type="primary" icon="User" @click="handleAuthUser(scope.row)" v-hasPermi="['system:role:edit']"></el-button>
+          </el-tooltip>
+        </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"
-      />
+    <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
 
-      <!-- 添加或修改角色配置对话框 -->
-      <el-dialog :title="title" v-model="open" width="500px" append-to-body>
-         <el-form ref="roleRef" :model="form" :rules="rules" label-width="100px">
-            <el-form-item label="角色名称" prop="roleName">
-               <el-input v-model="form.roleName" placeholder="请输入角色名称" />
-            </el-form-item>
-            <el-form-item prop="roleKey">
-               <template #label>
-                  <span>
-                     <el-tooltip content="控制器中定义的权限字符,如:@PreAuthorize(`@ss.hasRole('admin')`)" placement="top">
-                        <el-icon><question-filled /></el-icon>
-                     </el-tooltip>
-                     权限字符
-                  </span>
-               </template>
-               <el-input v-model="form.roleKey" placeholder="请输入权限字符" />
-            </el-form-item>
-            <el-form-item label="角色顺序" prop="roleSort">
-               <el-input-number v-model="form.roleSort" controls-position="right" :min="0" />
-            </el-form-item>
-            <el-form-item label="状态">
-               <el-radio-group v-model="form.status">
-                  <el-radio
-                     v-for="dict in sys_normal_disable"
-                     :key="dict.value"
-                     :label="dict.value"
-                  >{{ dict.label }}</el-radio>
-               </el-radio-group>
-            </el-form-item>
-            <el-form-item label="菜单权限">
-               <el-checkbox v-model="menuExpand" @change="handleCheckedTreeExpand($event, 'menu')">展开/折叠</el-checkbox>
-               <el-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll($event, 'menu')">全选/全不选</el-checkbox>
-               <el-checkbox v-model="form.menuCheckStrictly" @change="handleCheckedTreeConnect($event, 'menu')">父子联动</el-checkbox>
-               <el-tree
-                  class="tree-border"
-                  :data="menuOptions"
-                  show-checkbox
-                  ref="menuRef"
-                  node-key="id"
-                  :check-strictly="!form.menuCheckStrictly"
-                  empty-text="加载中,请稍候"
-                  :props="{ label: 'label', children: 'children' }"
-               ></el-tree>
-            </el-form-item>
-            <el-form-item label="备注">
-               <el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
-            </el-form-item>
-         </el-form>
-         <template #footer>
-            <div class="dialog-footer">
-               <el-button type="primary" @click="submitForm">确 定</el-button>
-               <el-button @click="cancel">取 消</el-button>
-            </div>
-         </template>
-      </el-dialog>
+    <!-- 添加或修改角色配置对话框 -->
+    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
+      <el-form ref="roleRef" :model="form" :rules="rules" label-width="100px">
+        <el-form-item label="角色名称" prop="roleName">
+          <el-input v-model="form.roleName" placeholder="请输入角色名称" />
+        </el-form-item>
+        <el-form-item prop="roleKey">
+          <template #label>
+            <span>
+              <el-tooltip content="控制器中定义的权限字符,如:@PreAuthorize(`@ss.hasRole('admin')`)" placement="top">
+                <el-icon><question-filled /></el-icon>
+              </el-tooltip>
+              权限字符
+            </span>
+          </template>
+          <el-input v-model="form.roleKey" placeholder="请输入权限字符" />
+        </el-form-item>
+        <el-form-item label="角色顺序" prop="roleSort">
+          <el-input-number v-model="form.roleSort" controls-position="right" :min="0" />
+        </el-form-item>
+        <el-form-item label="状态">
+          <el-radio-group v-model="form.status">
+            <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="菜单权限">
+          <el-checkbox v-model="menuExpand" @change="handleCheckedTreeExpand($event, 'menu')">展开/折叠</el-checkbox>
+          <el-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll($event, 'menu')">全选/全不选</el-checkbox>
+          <el-checkbox v-model="form.menuCheckStrictly" @change="handleCheckedTreeConnect($event, 'menu')">父子联动</el-checkbox>
+          <div style="width: 100%">
+            <el-tabs v-model="activeName">
+              <el-tab-pane label="胜德体育" name="1"> </el-tab-pane>
+              <el-tab-pane label="胜浩德业" name="2"> </el-tab-pane>
+            </el-tabs>
+          </div>
+          <el-tree
+            class="tree-border"
+            :data="menuOptions"
+            show-checkbox
+            ref="menuRef"
+            node-key="id"
+            :check-strictly="!form.menuCheckStrictly"
+            empty-text="加载中,请稍候"
+            :props="{ label: 'label', children: 'children' }"></el-tree>
+        </el-form-item>
+        <el-form-item label="备注">
+          <el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
 
-      <!-- 分配角色数据权限对话框 -->
-      <el-dialog :title="title" v-model="openDataScope" width="500px" append-to-body>
-         <el-form :model="form" label-width="80px">
-            <el-form-item label="角色名称">
-               <el-input v-model="form.roleName" :disabled="true" />
-            </el-form-item>
-            <el-form-item label="权限字符">
-               <el-input v-model="form.roleKey" :disabled="true" />
-            </el-form-item>
-            <el-form-item label="权限范围">
-               <el-select v-model="form.dataScope" @change="dataScopeSelectChange">
-                  <el-option
-                     v-for="item in dataScopeOptions"
-                     :key="item.value"
-                     :label="item.label"
-                     :value="item.value"
-                  ></el-option>
-               </el-select>
-            </el-form-item>
-            <el-form-item label="数据权限" v-show="form.dataScope == 2">
-               <el-checkbox v-model="deptExpand" @change="handleCheckedTreeExpand($event, 'dept')">展开/折叠</el-checkbox>
-               <el-checkbox v-model="deptNodeAll" @change="handleCheckedTreeNodeAll($event, 'dept')">全选/全不选</el-checkbox>
-               <el-checkbox v-model="form.deptCheckStrictly" @change="handleCheckedTreeConnect($event, 'dept')">父子联动</el-checkbox>
-               <el-tree
-                  class="tree-border"
-                  :data="deptOptions"
-                  show-checkbox
-                  default-expand-all
-                  ref="deptRef"
-                  node-key="id"
-                  :check-strictly="!form.deptCheckStrictly"
-                  empty-text="加载中,请稍候"
-                  :props="{ label: 'label', children: 'children' }"
-               ></el-tree>
-            </el-form-item>
-         </el-form>
-         <template #footer>
-            <div class="dialog-footer">
-               <el-button type="primary" @click="submitDataScope">确 定</el-button>
-               <el-button @click="cancelDataScope">取 消</el-button>
-            </div>
-         </template>
-      </el-dialog>
-   </div>
+    <!-- 分配角色数据权限对话框 -->
+    <el-dialog :title="title" v-model="openDataScope" width="500px" append-to-body>
+      <el-form :model="form" label-width="80px">
+        <el-form-item label="角色名称">
+          <el-input v-model="form.roleName" :disabled="true" />
+        </el-form-item>
+        <el-form-item label="权限字符">
+          <el-input v-model="form.roleKey" :disabled="true" />
+        </el-form-item>
+        <el-form-item label="权限范围">
+          <el-select v-model="form.dataScope" @change="dataScopeSelectChange">
+            <el-option v-for="item in dataScopeOptions" :key="item.value" :label="item.label" :value="item.value"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="数据权限" v-show="form.dataScope == 2">
+          <el-checkbox v-model="deptExpand" @change="handleCheckedTreeExpand($event, 'dept')">展开/折叠</el-checkbox>
+          <el-checkbox v-model="deptNodeAll" @change="handleCheckedTreeNodeAll($event, 'dept')">全选/全不选</el-checkbox>
+          <el-checkbox v-model="form.deptCheckStrictly" @change="handleCheckedTreeConnect($event, 'dept')">父子联动</el-checkbox>
+          <div style="width: 100%">
+            <el-tabs v-model="activeName">
+              <el-tab-pane label="胜德体育" name="1"> </el-tab-pane>
+              <el-tab-pane label="胜浩德业" name="2"> </el-tab-pane>
+            </el-tabs>
+          </div>
+          <el-tree
+            class="tree-border"
+            :data="deptOptions"
+            show-checkbox
+            default-expand-all
+            ref="deptRef"
+            node-key="id"
+            :check-strictly="!form.deptCheckStrictly"
+            empty-text="加载中,请稍候"
+            :props="{ label: 'label', children: 'children' }"></el-tree>
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitDataScope">确 定</el-button>
+          <el-button @click="cancelDataScope">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
 </template>
 
 <script setup name="Role">
@@ -250,6 +191,7 @@ const { proxy } = getCurrentInstance();
 const { sys_normal_disable } = proxy.useDict("sys_normal_disable");
 
 const roleList = ref([]);
+const activeName = ref("1");
 const open = ref(false);
 const loading = ref(true);
 const showSearch = ref(true);
@@ -275,7 +217,7 @@ const dataScopeOptions = ref([
   { value: "2", label: "自定数据权限" },
   { value: "3", label: "本部门数据权限" },
   { value: "4", label: "本部门及以下数据权限" },
-  { value: "5", label: "仅本人数据权限" }
+  { value: "5", label: "仅本人数据权限" },
 ]);
 
 const data = reactive({
@@ -285,12 +227,12 @@ const data = reactive({
     pageSize: 10,
     roleName: undefined,
     roleKey: undefined,
-    status: undefined
+    status: undefined,
   },
   rules: {
     roleName: [{ required: true, message: "角色名称不能为空", trigger: "blur" }],
     roleKey: [{ required: true, message: "权限字符不能为空", trigger: "blur" }],
-    roleSort: [{ required: true, message: "角色顺序不能为空", trigger: "blur" }]
+    roleSort: [{ required: true, message: "角色顺序不能为空", trigger: "blur" }],
   },
 });
 
@@ -299,7 +241,7 @@ const { queryParams, form, rules } = toRefs(data);
 /** 查询角色列表 */
 function getList() {
   loading.value = true;
-  listRole(proxy.addDateRange(queryParams.value, dateRange.value)).then(response => {
+  listRole(proxy.addDateRange(queryParams.value, dateRange.value)).then((response) => {
     roleList.value = response.rows;
     total.value = response.total;
     loading.value = false;
@@ -319,35 +261,47 @@ function resetQuery() {
 /** 删除按钮操作 */
 function handleDelete(row) {
   const roleIds = row.roleId || ids.value;
-  proxy.$modal.confirm('是否确认删除角色编号为"' + roleIds + '"的数据项?').then(function () {
-    return delRole(roleIds);
-  }).then(() => {
-    getList();
-    proxy.$modal.msgSuccess("删除成功");
-  }).catch(() => {});
+  proxy.$modal
+    .confirm('是否确认删除角色编号为"' + roleIds + '"的数据项?')
+    .then(function () {
+      return delRole(roleIds);
+    })
+    .then(() => {
+      getList();
+      proxy.$modal.msgSuccess("删除成功");
+    })
+    .catch(() => {});
 }
 /** 导出按钮操作 */
 function handleExport() {
-  proxy.download("system/role/export", {
-    ...queryParams.value,
-  }, `role_${new Date().getTime()}.xlsx`);
+  proxy.download(
+    "system/role/export",
+    {
+      ...queryParams.value,
+    },
+    `role_${new Date().getTime()}.xlsx`
+  );
 }
 /** 多选框选中数据 */
 function handleSelectionChange(selection) {
-  ids.value = selection.map(item => item.roleId);
+  ids.value = selection.map((item) => item.roleId);
   single.value = selection.length != 1;
   multiple.value = !selection.length;
 }
 /** 角色状态修改 */
 function handleStatusChange(row) {
   let text = row.status === "0" ? "启用" : "停用";
-  proxy.$modal.confirm('确认要"' + text + '""' + row.roleName + '"角色吗?').then(function () {
-    return changeRoleStatus(row.roleId, row.status);
-  }).then(() => {
-    proxy.$modal.msgSuccess(text + "成功");
-  }).catch(function () {
-    row.status = row.status === "0" ? "1" : "0";
-  });
+  proxy.$modal
+    .confirm('确认要"' + text + '""' + row.roleName + '"角色吗?')
+    .then(function () {
+      return changeRoleStatus(row.roleId, row.status);
+    })
+    .then(() => {
+      proxy.$modal.msgSuccess(text + "成功");
+    })
+    .catch(function () {
+      row.status = row.status === "0" ? "1" : "0";
+    });
 }
 /** 更多操作 */
 function handleCommand(command, row) {
@@ -368,7 +322,7 @@ function handleAuthUser(row) {
 }
 /** 查询菜单树结构 */
 function getMenuTreeselect() {
-  menuTreeselect().then(response => {
+  menuTreeselect().then((response) => {
     menuOptions.value = response.data;
   });
 }
@@ -400,7 +354,7 @@ function reset() {
     deptIds: [],
     menuCheckStrictly: true,
     deptCheckStrictly: true,
-    remark: undefined
+    remark: undefined,
   };
   proxy.resetForm("roleRef");
 }
@@ -416,7 +370,7 @@ function handleUpdate(row) {
   reset();
   const roleId = row.roleId || ids.value;
   const roleMenu = getRoleMenuTreeselect(roleId);
-  getRole(roleId).then(response => {
+  getRole(roleId).then((response) => {
     form.value = response.data;
     form.value.roleSort = Number(form.value.roleSort);
     open.value = true;
@@ -435,14 +389,14 @@ function handleUpdate(row) {
 }
 /** 根据角色ID查询菜单树结构 */
 function getRoleMenuTreeselect(roleId) {
-  return roleMenuTreeselect(roleId).then(response => {
+  return roleMenuTreeselect(roleId).then((response) => {
     menuOptions.value = response.menus;
     return response;
   });
 }
 /** 根据角色ID查询部门树结构 */
 function getDeptTree(roleId) {
-  return deptTreeSelect(roleId).then(response => {
+  return deptTreeSelect(roleId).then((response) => {
     deptOptions.value = response.depts;
     return response;
   });
@@ -488,18 +442,18 @@ function getMenuAllCheckedKeys() {
 }
 /** 提交按钮 */
 function submitForm() {
-  proxy.$refs["roleRef"].validate(valid => {
+  proxy.$refs["roleRef"].validate((valid) => {
     if (valid) {
       if (form.value.roleId != undefined) {
         form.value.menuIds = getMenuAllCheckedKeys();
-        updateRole(form.value).then(response => {
+        updateRole(form.value).then((response) => {
           proxy.$modal.msgSuccess("修改成功");
           open.value = false;
           getList();
         });
       } else {
         form.value.menuIds = getMenuAllCheckedKeys();
-        addRole(form.value).then(response => {
+        addRole(form.value).then((response) => {
           proxy.$modal.msgSuccess("新增成功");
           open.value = false;
           getList();
@@ -523,11 +477,11 @@ function dataScopeSelectChange(value) {
 function handleDataScope(row) {
   reset();
   const deptTreeSelect = getDeptTree(row.roleId);
-  getRole(row.roleId).then(response => {
+  getRole(row.roleId).then((response) => {
     form.value = response.data;
     openDataScope.value = true;
     nextTick(() => {
-      deptTreeSelect.then(res => {
+      deptTreeSelect.then((res) => {
         nextTick(() => {
           if (deptRef.value) {
             deptRef.value.setCheckedKeys(res.checkedKeys);
@@ -542,7 +496,7 @@ function handleDataScope(row) {
 function submitDataScope() {
   if (form.value.roleId != undefined) {
     form.value.deptIds = getDeptAllCheckedKeys();
-    dataScope(form.value).then(response => {
+    dataScope(form.value).then((response) => {
       proxy.$modal.msgSuccess("修改成功");
       openDataScope.value = false;
       getList();