From 2b4ef9426387986f0caf2e212553f407cec7d644 Mon Sep 17 00:00:00 2001 From: shenzhouyu Date: Wed, 12 Nov 2025 15:53:17 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=B3=E8=AF=B7=E5=8D=95=E9=80=80=E6=96=99?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProductionUnissueController.java | 22 +++ .../entity/dto/NewUnissueNotifyDto.java | 14 ++ .../entity/dto/UnissueNotifyHeadDataDto.java | 7 + .../mapper/UnissueNotifyHeaderMapper.java | 3 + .../service/UnissueNotifyHeaderService.java | 6 + .../impl/UnissueNotifyHeaderServiceImpl.java | 148 +++++++++++++++++- .../notify/UnissueNotifyHeaderMapper.xml | 12 +- 7 files changed, 208 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/gaotao/modules/notify/entity/dto/NewUnissueNotifyDto.java diff --git a/src/main/java/com/gaotao/modules/notify/controller/ProductionUnissueController.java b/src/main/java/com/gaotao/modules/notify/controller/ProductionUnissueController.java index 1ee5300a..1febf4a0 100644 --- a/src/main/java/com/gaotao/modules/notify/controller/ProductionUnissueController.java +++ b/src/main/java/com/gaotao/modules/notify/controller/ProductionUnissueController.java @@ -3,9 +3,13 @@ package com.gaotao.modules.notify.controller; import com.baomidou.mybatisplus.core.metadata.IPage; import com.gaotao.common.utils.PageUtils; import com.gaotao.common.utils.R; +import com.gaotao.modules.api.entity.IfsShopOrder; import com.gaotao.modules.base.entity.SOScheduledRoutingData; import com.gaotao.modules.notify.entity.*; +import com.gaotao.modules.notify.entity.dto.NewSoIssueNotifyDto; +import com.gaotao.modules.notify.entity.dto.NewUnissueNotifyDto; import com.gaotao.modules.notify.entity.dto.UnissueNotifyHeadDataDto; +import com.gaotao.modules.notify.entity.vo.ShopOrderAndMaterialVo; import com.gaotao.modules.notify.entity.vo.ShopOrderMaterialVo; import com.gaotao.modules.notify.entity.vo.ShopOrderVo; import com.gaotao.modules.notify.service.UnissueNotifyHeaderService; @@ -163,4 +167,22 @@ public class ProductionUnissueController { unissueNotifyHeaderService.closeInboundNotification(data); return R.ok(); } + + @PostMapping(value="/getUnissueShopOrderAndMaterialByShoporder") + public R getUnissueShopOrderAndMaterialByShoporder(@RequestBody UnissueNotifyHeadDataDto data) throws Exception { + List rows = unissueNotifyHeaderService.getUnissueShopOrderAndMaterialByShoporder(data); + if(rows != null && rows.size() > 0){ + return R.ok().put("rows", rows); + } + return R.error("未找到对应的工单物料信息"); + } + + @PostMapping(value="/saveNewUnissueNotifyOrderList") + public R saveNewUnissueNotifyOrderList(@RequestBody NewUnissueNotifyDto data) throws Exception { + String rows = unissueNotifyHeaderService.saveNewUnissueNotifyOrderList(data); + if("200".equals(rows)){ + return R.ok("操作成功"); + } + return R.error("操作失败"); + } } diff --git a/src/main/java/com/gaotao/modules/notify/entity/dto/NewUnissueNotifyDto.java b/src/main/java/com/gaotao/modules/notify/entity/dto/NewUnissueNotifyDto.java new file mode 100644 index 00000000..cd318e97 --- /dev/null +++ b/src/main/java/com/gaotao/modules/notify/entity/dto/NewUnissueNotifyDto.java @@ -0,0 +1,14 @@ +package com.gaotao.modules.notify.entity.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class NewUnissueNotifyDto { + private String notifyNo; + + private String site; + + List materialList; +} diff --git a/src/main/java/com/gaotao/modules/notify/entity/dto/UnissueNotifyHeadDataDto.java b/src/main/java/com/gaotao/modules/notify/entity/dto/UnissueNotifyHeadDataDto.java index 27dd8034..a7b0ec46 100644 --- a/src/main/java/com/gaotao/modules/notify/entity/dto/UnissueNotifyHeadDataDto.java +++ b/src/main/java/com/gaotao/modules/notify/entity/dto/UnissueNotifyHeadDataDto.java @@ -35,6 +35,13 @@ public class UnissueNotifyHeadDataDto { private String notifyNo; + private String orderNo; + + private String site; + + private String releaseNo; + private String sequenceNo; + /** * 库存预览数据列表(用于推送WCS) */ diff --git a/src/main/java/com/gaotao/modules/notify/mapper/UnissueNotifyHeaderMapper.java b/src/main/java/com/gaotao/modules/notify/mapper/UnissueNotifyHeaderMapper.java index ff642d67..723138fd 100644 --- a/src/main/java/com/gaotao/modules/notify/mapper/UnissueNotifyHeaderMapper.java +++ b/src/main/java/com/gaotao/modules/notify/mapper/UnissueNotifyHeaderMapper.java @@ -31,4 +31,7 @@ public interface UnissueNotifyHeaderMapper extends BaseMapper searchNotifyHeader(Page page, @Param("data") UnissueNotifyHeadDataDto data); + + int deleteUnissueNotifyOrderMaterialInList(@Param("notifyNo") String notifyNo, @Param("site")String site,@Param("items") List items); + } diff --git a/src/main/java/com/gaotao/modules/notify/service/UnissueNotifyHeaderService.java b/src/main/java/com/gaotao/modules/notify/service/UnissueNotifyHeaderService.java index fa69cb3f..191d40da 100644 --- a/src/main/java/com/gaotao/modules/notify/service/UnissueNotifyHeaderService.java +++ b/src/main/java/com/gaotao/modules/notify/service/UnissueNotifyHeaderService.java @@ -7,7 +7,9 @@ import com.gaotao.modules.notify.entity.SOIssueNotifyHeaderData; import com.gaotao.modules.notify.entity.UnissueNotifyHeader; import com.gaotao.modules.notify.entity.UnissueNotifyOrderList; import com.gaotao.modules.notify.entity.UnissueNotifyOrderMaterialList; +import com.gaotao.modules.notify.entity.dto.NewUnissueNotifyDto; import com.gaotao.modules.notify.entity.dto.UnissueNotifyHeadDataDto; +import com.gaotao.modules.notify.entity.vo.ShopOrderAndMaterialVo; import com.gaotao.modules.notify.entity.vo.ShopOrderMaterialVo; import com.gaotao.modules.notify.entity.vo.ShopOrderVo; @@ -44,4 +46,8 @@ public interface UnissueNotifyHeaderService { List searchNotifyMaterialList(UnissueNotifyOrderList data); int closeInboundNotification(UnissueNotifyHeader data); + + List getUnissueShopOrderAndMaterialByShoporder(UnissueNotifyHeadDataDto data) throws Exception; + + String saveNewUnissueNotifyOrderList(NewUnissueNotifyDto data) throws Exception; } diff --git a/src/main/java/com/gaotao/modules/notify/service/impl/UnissueNotifyHeaderServiceImpl.java b/src/main/java/com/gaotao/modules/notify/service/impl/UnissueNotifyHeaderServiceImpl.java index 2520abcb..5fb830ef 100644 --- a/src/main/java/com/gaotao/modules/notify/service/impl/UnissueNotifyHeaderServiceImpl.java +++ b/src/main/java/com/gaotao/modules/notify/service/impl/UnissueNotifyHeaderServiceImpl.java @@ -6,10 +6,15 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.gaotao.common.utils.PageUtils; import com.gaotao.common.utils.R; +import com.gaotao.modules.api.entity.IfsInventoryPart; import com.gaotao.modules.api.service.IfsApiIssueAndReturnService; import com.gaotao.modules.base.entity.SOScheduledRoutingData; import com.gaotao.modules.notify.entity.*; +import com.gaotao.modules.notify.entity.dto.GroupKey; +import com.gaotao.modules.notify.entity.dto.NewUnissueNotifyDto; +import com.gaotao.modules.notify.entity.dto.ShoporderAndMaterialDto; import com.gaotao.modules.notify.entity.dto.UnissueNotifyHeadDataDto; +import com.gaotao.modules.notify.entity.vo.ShopOrderAndMaterialVo; import com.gaotao.modules.notify.entity.vo.ShopOrderMaterialVo; import com.gaotao.modules.notify.entity.vo.ShopOrderVo; import com.gaotao.modules.notify.mapper.UnissueNotifyHeaderMapper; @@ -21,6 +26,7 @@ import com.gaotao.modules.sys.entity.SysUserEntity; import com.gaotao.modules.trans.entity.TransNoControl; import com.gaotao.modules.trans.service.TransNoControlService; import org.apache.shiro.SecurityUtils; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -29,9 +35,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.ResponseBody; import java.math.BigDecimal; -import java.util.Date; -import java.util.List; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; @Service @@ -239,5 +243,143 @@ public class UnissueNotifyHeaderServiceImpl implements UnissueNotifyHeaderServic return i; } + @Override + public List getUnissueShopOrderAndMaterialByShoporder(UnissueNotifyHeadDataDto data) throws Exception { + List orderInfo = ifsApiIssueAndReturnService.getWorkOrderInfo(data.getOrderNo(), data.getSite(),data.getReleaseNo(),data.getSequenceNo()); + List shopOrderVos = orderInfo.stream() + .filter(so -> "Started".equalsIgnoreCase(so.getObjstate())) + .toList(); + if(orderInfo.size()>0 && shopOrderVos.size()==0){ + throw new Exception("生产订单"+data.getOrderNo()+"状态不允许发货,请检查!"); + } + if(shopOrderVos != null && shopOrderVos.size()>0) { + List orderAndMaterialVos = new ArrayList<>(); + List materialVos = ifsApiIssueAndReturnService.getShopOrderMaterial(data.getOrderNo(), data.getSite(), data.getReleaseNo(), data.getSequenceNo()); + List shopOrderMaterial = materialVos.stream().filter(m -> "Reserve And Backflush".equals(m.getReserveIssueMethod())).collect(Collectors.toList()); + for (ShopOrderMaterialVo shopOrderVo : shopOrderMaterial){ + ShopOrderAndMaterialVo vo = new ShopOrderAndMaterialVo(); + BeanUtils.copyProperties(shopOrderVo, vo); + vo.setStatus(shopOrderVos.get(0).getStatus()); + vo.setPartNo(shopOrderVos.get(0).getPartNo()); + vo.setPartDesc(shopOrderVos.get(0).getPartDesc()); + vo.setLotSize(shopOrderVos.get(0).getLotSize()); + vo.setStartDate(shopOrderVos.get(0).getStartDate()); + vo.setFinishDate(shopOrderVos.get(0).getFinishDate()); + vo.setNeedDate(shopOrderVos.get(0).getNeedDate()); + vo.setCloseCode(shopOrderVos.get(0).getCloseCode()); + vo.setCloseTolerance(shopOrderVos.get(0).getCloseTolerance()); + vo.setQtyComplete(shopOrderVos.get(0).getQtyComplete()); + vo.setObjstate(shopOrderVos.get(0).getObjstate()); + vo.setCloseCodeDb(shopOrderVos.get(0).getCloseCodeDb()); + orderAndMaterialVos.add(vo); + } + return orderAndMaterialVos; + } + return null; + } + + @Override + public String saveNewUnissueNotifyOrderList(NewUnissueNotifyDto data) throws Exception { + if(data.getMaterialList() != null && data.getMaterialList().size() > 0){ + Map> mainGroupMap = data.getMaterialList().stream() + .collect(Collectors.groupingBy( + dto -> new GroupKey( + dto.getOrderNo(), + dto.getReleaseNo(), + dto.getSequenceNo() + ) + )); + + // 用于存储最终结果:父集合和子集合 + List parentList = new ArrayList<>(); + List childList = new ArrayList<>(); + int num = 0; + BigDecimal nextItem=BigDecimal.ZERO; + + // 步骤2:遍历每个分组,生成父对象和子对象 + for (Map.Entry> entry : mainGroupMap.entrySet()) { + GroupKey groupKey = entry.getKey(); + List groupDtos = entry.getValue(); + + // 2.1 生成父对象的唯一 itemNo(确保全局唯一,这里用 UUID 简化) + if(num == 0){ + UnissueNotifyOrderList parentData = new UnissueNotifyOrderList(); + parentData.setSite(data.getSite()); + parentData.setNotifyNo(data.getNotifyNo()); + nextItem=unissueNotifyHeaderMapper.getNextItemForUnissueNotifyOrderList(parentData); + + }else{ + nextItem = nextItem.add(BigDecimal.ONE); + } + + + // 2.2 构建SOIssueNotifyOrderList + UnissueNotifyOrderList parent = buildParent(data.getNotifyNo(),data.getSite(),groupKey, groupDtos, nextItem); + parentList.add(parent); + + // 2.3 遍历分组内的 dto,按 lineItemNo 生成子对象(SOIssueNotifyOrderMaterialList) + List children = buildChildren(data.getNotifyNo(),data.getSite(),groupDtos, nextItem); + childList.addAll(children); + + num++; + } + + List items= new ArrayList<>(); + // 保存父类 + for(UnissueNotifyOrderList parentItem : parentList){ + int i = unissueNotifyHeaderMapper.saveUnissueNotifyOrderList(parentItem); + items.add(parentItem.getItemNo().toString()); + } + //保存子类 + unissueNotifyHeaderMapper.deleteUnissueNotifyOrderMaterialInList(data.getNotifyNo(),data.getSite(),items); + + unissueNotifyOrderMaterialListMapper.batchSaveUnissueNotifyOrderMaterialListData(childList); + return "200"; + }else{ + throw new RuntimeException("物料列表不能为空"); + } + } + + private static UnissueNotifyOrderList buildParent(String notifyNo,String site,GroupKey groupKey, List groupDtos, BigDecimal parentItemNo) { + UnissueNotifyOrderList parent = new UnissueNotifyOrderList(); + parent.setNotifyNo(notifyNo); + parent.setSite(site); + parent.setItemNo(parentItemNo); + parent.setSoorderNo(groupKey.getOrderNo()); + parent.setReleaseNo(groupKey.getReleaseNo()); + parent.setSequenceNo(groupKey.getSequenceNo()); + // 从分组内第一个 dto 提取共同属性(假设同一分组内这些属性一致) + ShoporderAndMaterialDto firstDto = groupDtos.get(0); + parent.setNeedDate(new Date()); + return parent; + } + + /** + * 构建子对象列表,关联父对象的 itemNo + */ + private static List buildChildren(String notifyNo,String site,List groupDtos, BigDecimal parentItemNo) { + return groupDtos.stream() + .map(dto -> { + UnissueNotifyOrderMaterialList child = new UnissueNotifyOrderMaterialList(); + child.setNotifyNo(notifyNo); + child.setSite(site); + child.setItemNo(parentItemNo); + // 设置细分核心字段(lineItemNo) + child.setBomItemNo(dto.getLineItemNo().toString()); + // 提取详细属性 + child.setComponentPartNo(dto.getComponentPartNo()); + child.setQtyToUnissue(dto.getApplyQty()); + if( dto.getApplyQty()!=null){ + child.setQtyToUnissueOriginal(dto.getApplyQty()); + } + child.setUnissueType("BOM物料"); + child.setComponentPartDesc(dto.getComponentPartDesc()); + return child; + }) + // 按 lineItemNo 排序(可选,确保子项顺序) + .sorted(Comparator.comparing(UnissueNotifyOrderMaterialList::getBomItemNo)) + .collect(Collectors.toList()); + } + } diff --git a/src/main/resources/mapper/notify/UnissueNotifyHeaderMapper.xml b/src/main/resources/mapper/notify/UnissueNotifyHeaderMapper.xml index aef48f94..8818c6b8 100644 --- a/src/main/resources/mapper/notify/UnissueNotifyHeaderMapper.xml +++ b/src/main/resources/mapper/notify/UnissueNotifyHeaderMapper.xml @@ -36,7 +36,7 @@ delete from unissue_notify_header where site=#{site} and notify_no=#{notifyNo} - update unissue_notify_header set status=#{status} where site=#{site} and notify_no=#{notifyNo} + update unissue_notify_header set plan_issue_date=#{planIssueDate},remark=#{remark},status=#{status} where site=#{site} and notify_no=#{notifyNo} + + DELETE FROM unissue_notify_order_material_list + WHERE + notify_no = #{notifyNo} + AND site = #{site} + AND item_no IN + + #{item} + + \ No newline at end of file