Sfoglia il codice sorgente

出货计划查询编辑

Pengxy 3 mesi fa
parent
commit
916d5ca13d

+ 2 - 2
yudao-order-server/src/main/java/cn/iocoder/yudao/module/order/controller/admin/delivery/OrderDeliveryController.java

@@ -51,8 +51,8 @@ public class OrderDeliveryController {
     @GetMapping("/shipping-plan/list")
     @Operation(summary = "出货计划列表查询")
     @PreAuthorize("@ss.hasPermission('order:shipping-plan:query')")
-    public CommonResult<PageResult<ShippingPlanRespVO>> getShippingPlanList(@Valid ShippingPlanPageReqVO pageReqVO) {
-        return success(orderDeliveryService.getShippingPlanPage(pageReqVO));
+    public CommonResult<PageResult<ShippingPlanListItemVO>> getShippingPlanList(@Valid ShippingPlanPageReqVO pageReqVO) {
+        return success(orderDeliveryService.getShippingPlanListPage(pageReqVO));
     }
 
     @GetMapping("/shipping-plan/{id}")

+ 18 - 0
yudao-order-server/src/main/java/cn/iocoder/yudao/module/order/controller/admin/delivery/vo/ShippingPlanPageReqVO.java

@@ -18,4 +18,22 @@ public class ShippingPlanPageReqVO extends PageParam {
 
     @Schema(description = "收货人")
     private String consignee;
+
+    @Schema(description = "客户订单号")
+    private String ordNbr;
+
+    @Schema(description = "订单编号")
+    private String billNo;
+
+    @Schema(description = "国家")
+    private String country;
+
+    @Schema(description = "出货日期")
+    private String shippingDate;
+
+    @Schema(description = "客户编码")
+    private String customNo;
+
+    @Schema(description = "物料编号")
+    private String itemNum;
 }

+ 6 - 0
yudao-order-server/src/main/java/cn/iocoder/yudao/module/order/dal/mysql/ShippingPlanDetailMapper.java

@@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.module.order.dal.dataobject.ShippingPlanDetailDO;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -13,6 +14,11 @@ import java.util.List;
 @Mapper
 public interface ShippingPlanDetailMapper extends BaseMapperX<ShippingPlanDetailDO> {
 
+    /**
+     * 根据计划ID查询明细列表(使用原生SQL,忽略租户)
+     */
+    List<ShippingPlanDetailDO> selectDetailsByPlanId(@Param("planId") Long planId);
+
     default List<ShippingPlanDetailDO> selectListByPlanId(Long planId) {
         return selectList(new LambdaQueryWrapper<ShippingPlanDetailDO>()
                 .eq(ShippingPlanDetailDO::getPlanId, planId));

+ 5 - 0
yudao-order-server/src/main/java/cn/iocoder/yudao/module/order/dal/mysql/ShippingPlanMapper.java

@@ -27,6 +27,11 @@ public interface ShippingPlanMapper extends BaseMapperX<ShippingPlanDO> {
     }
 
     /**
+     * 根据ID查询出货计划(使用原生SQL,忽略租户)
+     */
+    ShippingPlanDO selectByRecId(@Param("id") Long id);
+
+    /**
      * 出货计划列表查询(包含明细和发货单关联)
      */
     Page<ShippingPlanListItemVO> selectShippingPlanList(Page<ShippingPlanListItemVO> page,

+ 5 - 0
yudao-order-server/src/main/java/cn/iocoder/yudao/module/order/service/OrderDeliveryService.java

@@ -25,6 +25,11 @@ public interface OrderDeliveryService {
     PageResult<ShippingPlanRespVO> getShippingPlanPage(ShippingPlanPageReqVO pageReqVO);
 
     /**
+     * 出货计划列表分页查询(包含明细)
+     */
+    PageResult<ShippingPlanListItemVO> getShippingPlanListPage(ShippingPlanPageReqVO pageReqVO);
+
+    /**
      * 获取出货计划详情
      */
     ShippingPlanRespVO getShippingPlan(Long id);

+ 11 - 7
yudao-order-server/src/main/java/cn/iocoder/yudao/module/order/service/impl/OrderDeliveryServiceImpl.java

@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.order.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
 import cn.iocoder.yudao.module.order.controller.admin.delivery.vo.*;
 import cn.iocoder.yudao.module.order.convert.OrderDeliveryConvert;
@@ -104,11 +105,6 @@ public class OrderDeliveryServiceImpl implements OrderDeliveryService {
     @Override
     @TenantIgnore
     public PageResult<ShippingPlanRespVO> getShippingPlanPage(ShippingPlanPageReqVO pageReqVO) {
-        // 使用包含明细的列表查询
-        PageResult<ShippingPlanListItemVO> listResult = shippingPlanMapper.selectShippingPlanListPage(pageReqVO);
-        
-        // 如果需要返回ShippingPlanRespVO格式,可以在这里转换
-        // 目前直接使用简单的分页查询
         PageResult<ShippingPlanDO> pageResult = shippingPlanMapper.selectPage(pageReqVO);
         return new PageResult<>(
                 OrderDeliveryConvert.INSTANCE.convertList(pageResult.getList()),
@@ -118,13 +114,21 @@ public class OrderDeliveryServiceImpl implements OrderDeliveryService {
 
     @Override
     @TenantIgnore
+    public PageResult<ShippingPlanListItemVO> getShippingPlanListPage(ShippingPlanPageReqVO pageReqVO) {
+        return shippingPlanMapper.selectShippingPlanListPage(pageReqVO);
+    }
+
+    @Override
+    @TenantIgnore
     public ShippingPlanRespVO getShippingPlan(Long id) {
-        ShippingPlanDO plan = shippingPlanMapper.selectById(id);
+        // 使用原生SQL查询,完全绕过租户拦截器
+        ShippingPlanDO plan = shippingPlanMapper.selectByRecId(id);
         if (plan == null) {
             return null;
         }
         ShippingPlanRespVO resp = OrderDeliveryConvert.INSTANCE.convert(plan);
-        List<ShippingPlanDetailDO> details = shippingPlanDetailMapper.selectListByPlanId(id);
+        // 使用原生SQL查询明细,绕过租户拦截器
+        List<ShippingPlanDetailDO> details = shippingPlanDetailMapper.selectDetailsByPlanId(id);
         resp.setItems(OrderDeliveryConvert.INSTANCE.convertDetailList(details));
         return resp;
     }

+ 35 - 0
yudao-order-server/src/main/resources/mapper/order/ShippingPlanDetailMapper.xml

@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.iocoder.yudao.module.order.dal.mysql.ShippingPlanDetailMapper">
+
+    <!-- 根据计划ID查询明细列表(忽略租户) -->
+    <select id="selectDetailsByPlanId" resultType="cn.iocoder.yudao.module.order.dal.dataobject.ShippingPlanDetailDO">
+        SELECT 
+            RecID as recId,
+            Domain as domain,
+            plan_id as planId,
+            OrdNbr as ordNbr,
+            bill_no as billNo,
+            OrdDate as ordDate,
+            Country as country,
+            CustomNo as customNo,
+            CustomName as customName,
+            ItemNum as itemNum,
+            ItemName as itemName,
+            Specification as specification,
+            Qty as qty,
+            Packaging as packaging,
+            Volume as volume,
+            Weight as weight,
+            Remark as remark,
+            CreateUser as createUser,
+            UpdateUser as updateUser,
+            CreateTime as createTime,
+            UpdateTime as updateTime,
+            IsActive as isActive,
+            IsConfirm as isConfirm
+        FROM ShippingPlanDetail
+        WHERE plan_id = #{planId}
+    </select>
+
+</mapper>

+ 42 - 0
yudao-order-server/src/main/resources/mapper/order/ShippingPlanMapper.xml

@@ -2,6 +2,30 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="cn.iocoder.yudao.module.order.dal.mysql.ShippingPlanMapper">
 
+    <!-- 根据ID查询出货计划(忽略租户) -->
+    <select id="selectByRecId" resultType="cn.iocoder.yudao.module.order.dal.dataobject.ShippingPlanDO">
+        SELECT 
+            RecID as recId,
+            Domain as domain,
+            LotSerial as lotSerial,
+            Remark as remark,
+            ShippingSite as shippingSite,
+            Status as status,
+            CreateUser as createUser,
+            UpdateUser as updateUser,
+            CreateTime as createTime,
+            UpdateTime as updateTime,
+            IsActive as isActive,
+            IsConfirm as isConfirm,
+            Priority as priority,
+            ShippingDate as shippingDate,
+            ShippingAddress as shippingAddress,
+            Consignee as consignee,
+            Telephone as telephone
+        FROM ShippingPlan
+        WHERE RecID = #{id}
+    </select>
+
     <!-- 出货计划列表查询 - 根据需求文档提供的SQL -->
     <select id="selectShippingPlanList" resultType="cn.iocoder.yudao.module.order.controller.admin.delivery.vo.ShippingPlanListItemVO">
         SELECT 
@@ -44,6 +68,24 @@
         <if test="req.consignee != null and req.consignee != ''">
             AND a.Consignee LIKE CONCAT('%', #{req.consignee}, '%')
         </if>
+        <if test="req.ordNbr != null and req.ordNbr != ''">
+            AND b.OrdNbr LIKE CONCAT('%', #{req.ordNbr}, '%')
+        </if>
+        <if test="req.billNo != null and req.billNo != ''">
+            AND b.bill_no LIKE CONCAT('%', #{req.billNo}, '%')
+        </if>
+        <if test="req.country != null and req.country != ''">
+            AND b.Country = #{req.country}
+        </if>
+        <if test="req.shippingDate != null and req.shippingDate != ''">
+            AND DATE(a.ShippingDate) = #{req.shippingDate}
+        </if>
+        <if test="req.customNo != null and req.customNo != ''">
+            AND b.CustomNo LIKE CONCAT('%', #{req.customNo}, '%')
+        </if>
+        <if test="req.itemNum != null and req.itemNum != ''">
+            AND b.ItemNum LIKE CONCAT('%', #{req.itemNum}, '%')
+        </if>
         ORDER BY a.CreateTime DESC
     </select>
 

+ 5 - 0
yudao-server/src/main/resources/application.yaml

@@ -315,6 +315,11 @@ yudao:
       - /admin-api/system/user/profile/**
       - /admin-api/system/auth/**
     ignore-tables:
+      - ShippingPlan
+      - ShippingPlanDetail
+      - ASNBOLShipperDetail
+      - crm_seorder
+      - crm_seorderentry
     ignore-caches:
       - user_role_ids
       - permission_menu_ids

+ 47 - 41
yudao-ui/yudao-ui-admin-vue3/src/views/jiaohuo/ShippingPlan.vue

@@ -5,7 +5,7 @@
       <el-form :inline="true" :model="searchForm" class="search-form">
         <el-form-item label="客户订单号">
           <el-input
-            v-model="searchForm.OrdNbr"
+            v-model="searchForm.ordNbr"
             placeholder="请输入客户订单号"
             clearable
             @keyup.enter="handleSearch"
@@ -13,21 +13,21 @@
         </el-form-item>
         <el-form-item label="订单编号">
           <el-input
-            v-model="searchForm.bill_no"
+            v-model="searchForm.billNo"
             placeholder="请输入订单编号"
             clearable
             @keyup.enter="handleSearch"
           />
         </el-form-item>
         <el-form-item label="国家">
-          <el-select v-model="searchForm.Country" placeholder="请选择国家" clearable>
+          <el-select v-model="searchForm.country" placeholder="请选择国家" clearable>
             <el-option label="中国" value="中国" />
             <el-option label="英国" value="英国" />
           </el-select>
         </el-form-item>
         <el-form-item label="出货日期">
           <el-date-picker
-            v-model="searchForm.ShippingDate"
+            v-model="searchForm.shippingDate"
             type="date"
             placeholder="请选择日期"
             value-format="YYYY-MM-DD"
@@ -36,7 +36,7 @@
         </el-form-item>
         <el-form-item label="客户编码">
           <el-input
-            v-model="searchForm.CustomNo"
+            v-model="searchForm.customNo"
             placeholder="请输入客户编码"
             clearable
             @keyup.enter="handleSearch"
@@ -44,7 +44,7 @@
         </el-form-item>
         <el-form-item label="物料编号">
           <el-input
-            v-model="searchForm.ItemNum"
+            v-model="searchForm.itemNum"
             placeholder="请输入物料编号"
             clearable
             @keyup.enter="handleSearch"
@@ -82,32 +82,32 @@
       >
         <el-table-column type="selection" width="55" fixed="left" />
         <el-table-column prop="lotserial" label="出货编号" width="180" fixed="left" />
-        <el-table-column prop="OrdNbr" label="客户订单号" width="150" />
-        <el-table-column prop="bill_no" label="订单编号" width="180" />
-        <el-table-column prop="OrdDate" label="下单日期" width="120">
+        <el-table-column prop="ordNbr" label="客户订单号" width="150" />
+        <el-table-column prop="billNo" label="订单编号" width="180" />
+        <el-table-column prop="ordDate" label="下单日期" width="120">
           <template #default="{ row }">
-            {{ row.OrdDate ? row.OrdDate.substring(0, 10) : '' }}
+            {{ row.ordDate ? String(row.ordDate).substring(0, 10) : '' }}
           </template>
         </el-table-column>
-        <el-table-column prop="Country" label="国家" width="100" />
-        <el-table-column prop="CustomNo" label="客户编码" width="120" />
-        <el-table-column prop="CustomName" label="客户名称" width="200" show-overflow-tooltip />
-        <el-table-column prop="ItemNum" label="物料编号" width="150" />
-        <el-table-column prop="ItemName" label="物料名称" width="200" show-overflow-tooltip />
-        <el-table-column prop="Specification" label="规格型号" width="150" />
-        <el-table-column prop="Qty" label="数量" width="100" align="right" />
-        <el-table-column prop="Weight" label="重量(KG)" width="120" align="right" />
-        <el-table-column prop="Volume" label="体积(M3)" width="120" align="right" />
-        <el-table-column prop="Packaging" label="包装要求" width="150" />
-        <el-table-column prop="ShippingSite" label="出货地点" width="150" />
-        <el-table-column prop="ShippingDate" label="出货日期" width="120">
+        <el-table-column prop="country" label="国家" width="100" />
+        <el-table-column prop="customNo" label="客户编码" width="120" />
+        <el-table-column prop="customName" label="客户名称" width="200" show-overflow-tooltip />
+        <el-table-column prop="itemNum" label="物料编号" width="150" />
+        <el-table-column prop="itemName" label="物料名称" width="200" show-overflow-tooltip />
+        <el-table-column prop="specification" label="规格型号" width="150" />
+        <el-table-column prop="qty" label="数量" width="100" align="right" />
+        <el-table-column prop="weight" label="重量(KG)" width="120" align="right" />
+        <el-table-column prop="volume" label="体积(M3)" width="120" align="right" />
+        <el-table-column prop="packaging" label="包装要求" width="150" />
+        <el-table-column prop="shippingSite" label="出货地点" width="150" />
+        <el-table-column prop="shippingDate" label="出货日期" width="120">
           <template #default="{ row }">
-            {{ row.ShippingDate ? row.ShippingDate.substring(0, 10) : '' }}
+            {{ row.shippingDate ? String(row.shippingDate).substring(0, 10) : '' }}
           </template>
         </el-table-column>
-        <el-table-column prop="ShippingAddress" label="收货地址" width="200" show-overflow-tooltip />
-        <el-table-column prop="Consignee" label="收货人" width="100" />
-        <el-table-column prop="Telephone" label="联系方式" width="120" />
+        <el-table-column prop="shippingAddress" label="收货地址" width="200" show-overflow-tooltip />
+        <el-table-column prop="consignee" label="收货人" width="100" />
+        <el-table-column prop="telephone" label="联系方式" width="120" />
         <el-table-column label="操作" width="150" fixed="right">
           <template #default="{ row }">
             <el-button type="primary" link :icon="Edit" @click="handleEdit(row)">编辑</el-button>
@@ -146,12 +146,12 @@ const tableData = ref([])
 const selectedRows = ref([])
 
 const searchForm = reactive({
-  OrdNbr: '',
-  bill_no: '',
-  Country: '',
-  ShippingDate: '',
-  CustomNo: '',
-  ItemNum: ''
+  ordNbr: '',
+  billNo: '',
+  country: '',
+  shippingDate: '',
+  customNo: '',
+  itemNum: ''
 })
 
 const pagination = reactive({
@@ -161,7 +161,7 @@ const pagination = reactive({
 })
 
 const hasValidSelection = computed(() => {
-  return selectedRows.value.length > 0 && selectedRows.value.every(row => !row.RecID)
+  return selectedRows.value.length > 0 && selectedRows.value.every(row => !row.recID)
 })
 
 const planFormRef = ref(null)
@@ -171,13 +171,18 @@ const handleSearch = async () => {
   loading.value = true
   try {
     const params = {
-      ...searchForm,
-      page: pagination.page,
+      ordNbr: searchForm.ordNbr,
+      billNo: searchForm.billNo,
+      country: searchForm.country,
+      shippingDate: searchForm.shippingDate,
+      customNo: searchForm.customNo,
+      itemNum: searchForm.itemNum,
+      pageNo: pagination.page,
       pageSize: pagination.pageSize
     }
-    const { data } = await getShippingPlanList(params)
-    tableData.value = data.list || []
-    pagination.total = data.total || 0
+    const res = await getShippingPlanList(params)
+    tableData.value = res.list || []
+    pagination.total = res.total || 0
   } catch (error) {
     console.error('查询失败:', error)
     if (error.code === 'ERR_NETWORK' || error.response?.status === 404) {
@@ -222,13 +227,14 @@ const handleView = (row) => {
 }
 
 // 销售出库
+// 销售出库
 const handleSalesOutbound = async () => {
   if (!selectedRows.value.length) {
     ElMessage.warning('请先选择出货计划')
     return
   }
 
-  const invalidRows = selectedRows.value.filter(row => row.RecID)
+  const invalidRows = selectedRows.value.filter(row => row.recID)
   if (invalidRows.length > 0) {
     ElMessage.warning('选中的记录中包含已出库的记录')
     return
@@ -258,8 +264,8 @@ const handleSalesOutbound = async () => {
   }
 }
 
-// 初始化 - 注释掉自动查询,等后端API准备好后再启用
-// handleSearch()
+// 初始化 - 页面加载时自动查询
+handleSearch()
 </script>
 
 <style scoped lang="scss">

+ 12 - 3
yudao-ui/yudao-ui-admin-vue3/src/views/jiaohuo/components/SalesOrderForm.vue

@@ -57,7 +57,13 @@
         </el-col>
         <el-col :span="8">
           <el-form-item label="客户级别" prop="customLevel">
-            <el-input v-model="formData.customLevel" placeholder="请输入客户级别" />
+            <el-input-number
+              v-model="formData.customLevel"
+              :min="0"
+              :controls="false"
+              placeholder="请输入客户级别"
+              style="width: 100%"
+            />
           </el-form-item>
         </el-col>
         <el-col :span="8">
@@ -263,7 +269,7 @@ const getDefaultFormData = () => ({
   orderType: '2',
   customNo: '',
   customName: '',
-  customLevel: '',
+  customLevel: 0,
   date: '' as string | number,
   rdate: '' as string | number,
   urgent: '0',
@@ -271,6 +277,8 @@ const getDefaultFormData = () => ({
   reason: '',
   factoryId: globalConfig.domain, // 使用全局配置
   companyId: globalConfig.companyId, // 使用全局配置
+  closed: 0,
+  status: 0,
   items: [] as any[]
 })
 
@@ -399,7 +407,8 @@ const handleAddRow = () => {
     qty: 1,
     planDate: '',
     date: '',
-    remark: ''
+    remark: '',
+    rstate: 0
   })
 }
 

+ 31 - 5
yudao-ui/yudao-ui-admin-vue3/src/views/jiaohuo/components/ShippingPlanForm.vue

@@ -332,17 +332,43 @@ const loadOrderData = (orders) => {
   }
 }
 
+// 时间戳转日期字符串 YYYY-MM-DD
+const formatTimestamp = (timestamp) => {
+  if (!timestamp) return ''
+  const date = new Date(timestamp)
+  const year = date.getFullYear()
+  const month = String(date.getMonth() + 1).padStart(2, '0')
+  const day = String(date.getDate()).padStart(2, '0')
+  return `${year}-${month}-${day}`
+}
+
 // 加载数据
 const loadData = async (id) => {
   try {
+    console.log('加载出货计划详情, ID:', id)
     const response = await getShippingPlanDetail(id)
-    if (response && response.data) {
-      Object.assign(formData, response.data)
+    console.log('API返回数据:', response)
+    if (response) {
+      // 处理日期格式转换(时间戳转YYYY-MM-DD)
+      const data = { ...response }
+      if (data.shippingDate) {
+        data.shippingDate = formatTimestamp(data.shippingDate)
+      }
+      // 处理明细中的日期
+      if (data.items && data.items.length > 0) {
+        data.items = data.items.map((item) => ({
+          ...item,
+          ordDate: item.ordDate ? formatTimestamp(item.ordDate) : ''
+        }))
+      }
+      console.log('处理后的数据:', data)
+      Object.assign(formData, data)
     } else {
       ElMessage.error('加载数据失败:返回数据为空')
     }
   } catch (error) {
-    ElMessage.error('加载数据失败:' + (error.message || '未知错误'))
+    console.error('加载数据异常:', error)
+    ElMessage.error('加载数据失败:' + (error.message || '系统异常'))
   }
 }
 
@@ -418,8 +444,8 @@ const handleSubmit = async () => {
       await createShippingPlan(formData)
       ElMessage.success('添加成功')
     } else {
-      // 编辑模式需要包含ID
-      const updateData = { ...formData, id: currentId.value }
+      // 编辑模式需要包含recId
+      const updateData = { ...formData, recId: currentId.value }
       await updateShippingPlan(updateData)
       ElMessage.success('保存成功')
     }