# 出货计划模块后端实现说明 ## 概述 本文档说明了出货计划模块的后端实现,包括CRUD操作、销售出库功能等。 ## 已实现的功能 ### 1. 出货计划管理 - ✅ 出货计划列表查询(分页) - ✅ 出货计划详情查询 - ✅ 创建出货计划 - ✅ 编辑出货计划 - ✅ 删除出货计划 - ✅ 销售出库(调用存储过程) ### 2. 涉及的数据表 - `ShippingPlan` - 出货计划主表 - `ShippingPlanDetail` - 出货计划明细表 - `ASNBOLShipperDetail` - 销售发货明细表(关联查询) - `crm_seorder` - 销售订单表 - `crm_seorderentry` - 销售订单明细表 ## 文件结构 ### Controller层 ``` yudao-order-server/src/main/java/cn/iocoder/yudao/module/order/controller/admin/delivery/ ├── OrderDeliveryController.java # 订单交付控制器(已更新) └── vo/ ├── ShippingPlanPageReqVO.java # 出货计划分页请求VO(已存在) ├── ShippingPlanSaveReqVO.java # 出货计划保存请求VO(已存在) ├── ShippingPlanRespVO.java # 出货计划响应VO(已存在) ├── ShippingPlanListItemVO.java # 出货计划列表项VO(新增) └── SalesOutboundReqVO.java # 销售出库请求VO(新增) ``` ### Service层 ``` yudao-order-server/src/main/java/cn/iocoder/yudao/module/order/service/ ├── OrderDeliveryService.java # 接口(已更新) └── impl/ └── OrderDeliveryServiceImpl.java # 实现类(已更新) ``` ### DAL层 ``` yudao-order-server/src/main/java/cn/iocoder/yudao/module/order/dal/ ├── dataobject/ │ ├── ShippingPlanDO.java # 出货计划实体(已存在) │ └── ShippingPlanDetailDO.java # 出货计划明细实体(已存在) └── mysql/ ├── ShippingPlanMapper.java # 出货计划Mapper(已更新) ├── ShippingPlanDetailMapper.java # 出货计划明细Mapper(已存在) └── OrderDeliveryMapper.java # 订单交付Mapper(已更新) ``` ### Mapper XML ``` yudao-order-server/src/main/resources/mapper/order/ ├── OrderDeliveryMapper.xml # 订单交付SQL(已更新) └── ShippingPlanMapper.xml # 出货计划SQL(新增) ``` ### Convert层 ``` yudao-order-server/src/main/java/cn/iocoder/yudao/module/order/convert/ └── OrderDeliveryConvert.java # 对象转换器(已存在) ``` ## API接口说明 ### 1. 出货计划列表查询 **接口**: `GET /order/shipping-plan/list` **权限**: `order:shipping-plan:query` **请求参数**: ```json { "pageNo": 1, "pageSize": 20, "lotSerial": "出货编号(可选)", "status": "状态(可选)", "consignee": "收货人(可选)" } ``` **响应**: ```json { "code": 0, "data": { "list": [...], "total": 100 } } ``` ### 2. 获取出货计划详情 **接口**: `GET /order/shipping-plan/{id}` **权限**: `order:shipping-plan:query` **路径参数**: `id` - 出货计划主键 ### 3. 创建出货计划 **接口**: `POST /order/shipping-plan` **权限**: `order:shipping-plan:create` **请求体**: ```json { "lotSerial": "出货编号", "shippingDate": "2024-01-01", "shippingSite": "出货地点", "consignee": "收货人", "telephone": "联系方式", "shippingAddress": "收货地址", "remark": "备注", "items": [ { "ordNbr": "客户订单号", "billNo": "订单号", "itemNum": "物料编号", "itemName": "物料名称", "qty": 100, "weight": 50.5, "volume": 2.5 } ] } ``` ### 4. 更新出货计划 **接口**: `PUT /order/shipping-plan` **权限**: `order:shipping-plan:update` **请求体**: 同创建,需包含 `recId` 字段 ### 5. 删除出货计划 **接口**: `DELETE /order/shipping-plan/{id}` **权限**: `order:shipping-plan:delete` **路径参数**: `id` - 出货计划主键 ### 6. 销售出库 **接口**: `POST /order/sales-outbound` **权限**: `order:shipping-plan:outbound` **请求体**: ```json { "orgNo": "组织编号", "operatorAccount": "操作人账号", "planIds": [1, 2, 3] } ``` **说明**: - 调用存储过程 `pr_WMS_AutoCreateShipper` - 传入参数: 组织编号、操作人账号、出货计划ID列表(逗号分隔) - 会验证出货计划是否存在且未生成出库单 ## 业务逻辑说明 ### 创建出货计划 1. 验证必填字段 2. 设置默认值(Domain、Priority、IsActive等) 3. 获取当前登录用户信息 4. 插入主表记录 5. 批量插入明细记录 ### 更新出货计划 1. 验证出货计划是否存在 2. 更新主表记录 3. 删除旧的明细记录 4. 重新插入新的明细记录 ### 销售出库 1. 验证所有出货计划ID是否存在 2. 检查是否已生成出库单(recid字段) 3. 拼接ID字符串(逗号分隔) 4. 调用存储过程 `pr_WMS_AutoCreateShipper` ## 数据库字段映射 ### ShippingPlan主表 | 数据库字段 | Java字段 | 说明 | |-----------|---------|------| | RecID | recId | 主键(自增) | | Domain | domain | 域名(默认8010) | | LotSerial | lotSerial | 出货编号 | | ShippingSite | shippingSite | 出货地点 | | ShippingDate | shippingDate | 出货日期 | | Consignee | consignee | 收货人 | | Telephone | telephone | 联系方式 | | ShippingAddress | shippingAddress | 收货地址 | | Remark | remark | 备注 | | CreateUser | createUser | 创建用户 | | CreateTime | createTime | 创建时间 | ### ShippingPlanDetail明细表 | 数据库字段 | Java字段 | 说明 | |-----------|---------|------| | RecID | recId | 主键 | | plan_id | planId | 主表ID | | OrdNbr | ordNbr | 客户订单号 | | bill_no | billNo | 订单号 | | ItemNum | itemNum | 物料编号 | | ItemName | itemName | 物料名称 | | Specification | specification | 规格型号 | | Qty | qty | 订单数量 | | Weight | weight | 重量(KG) | | Volume | volume | 体积(M3) | | seorder_id | seorderId | 销售订单ID | | sentry_id | sentryId | 订单行ID | ## 注意事项 1. **多租户**: 所有查询方法都使用了 `@TenantIgnore` 注解,忽略租户隔离 2. **事务管理**: 创建、更新、删除操作都使用了 `@Transactional` 注解 3. **日期格式**: 前端传入的日期字符串格式为 `YYYY-MM-DD`,后端会自动转换为 `LocalDateTime` 4. **权限控制**: 所有接口都配置了权限注解 `@PreAuthorize` 5. **存储过程**: 销售出库功能调用了 `pr_WMS_AutoCreateShipper` 存储过程 ## 待完善功能 1. 出货计划状态流转管理 2. 出货计划审批流程 3. 与ASN发货单的关联查询优化 4. 出货计划导出Excel功能 5. 出货计划打印功能 ## 测试建议 1. 测试创建出货计划(包含多条明细) 2. 测试更新出货计划(修改主表和明细) 3. 测试删除出货计划(验证级联删除明细) 4. 测试销售出库(验证存储过程调用) 5. 测试分页查询(验证搜索条件) 6. 测试权限控制(不同角色的访问权限) ## 相关文档 - 若依框架文档: https://doc.iocoder.cn/ - MyBatis Plus文档: https://baomidou.com/ - Spring Boot文档: https://spring.io/projects/spring-boot