package com.huaheng.api.mes.controller; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.huaheng.api.mes.dto.*; import com.huaheng.api.mes.dto.otherReceipt.OtherReceiptDetail; import com.huaheng.api.mes.dto.otherReceipt.OtherReceiptHeader; import com.huaheng.api.mes.result.ReturnInfo; import com.huaheng.api.mes.service.IMesService; import com.huaheng.api.mes.utils.CallaMOM; import com.huaheng.api.mes.utils.SqlServer; import com.huaheng.api.mes.vo.InventoryVO; import com.huaheng.api.mes.vo.InventoryTransactionVO; import com.huaheng.common.constant.QuantityConstant; import com.huaheng.common.exception.service.ServiceException; import com.huaheng.common.utils.StringUtils; import com.huaheng.common.utils.reflect.ReflectUtils; import com.huaheng.framework.aspectj.lang.annotation.ApiLogger; import com.huaheng.framework.web.controller.BaseController; import com.huaheng.framework.web.domain.AjaxResult; import com.huaheng.framework.web.domain.RetCode; import com.huaheng.pc.config.address.service.AddressService; import com.huaheng.pc.config.material.domain.Material; import com.huaheng.pc.config.material.service.MaterialService; import com.huaheng.pc.inventory.inventoryDetail.domain.InventoryDetail; import com.huaheng.pc.inventory.inventoryDetail.service.InventoryDetailService; import com.huaheng.pc.inventory.inventoryTransaction.domain.InventoryTransaction; import com.huaheng.pc.inventory.inventoryTransaction.service.InventoryTransactionService; import com.huaheng.pc.momLog.service.IMomLogService; import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail; import com.huaheng.pc.receipt.receiptDetail.service.ReceiptDetailService; import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader; import com.huaheng.pc.receipt.receiptHeader.service.ReceiptHeaderService; import com.huaheng.pc.shipment.shipmentDetail.domain.ShipmentDetail; import com.huaheng.pc.shipment.shipmentDetail.service.ShipmentDetailService; import com.huaheng.pc.shipment.shipmentHeader.domain.ShipmentHeader; import com.huaheng.pc.shipment.shipmentHeader.service.ShipmentHeaderService; import com.huaheng.pc.shipment.shipmentHeaderHistory.domain.ShipmentHeaderHistory; import com.huaheng.pc.shipment.shipmentHeaderHistory.service.ShipmentHeaderHistoryService; import com.huaheng.pc.system.user.domain.User; import com.huaheng.pc.system.user.service.IUserService; import com.huaheng.pc.task.taskDetail.domain.TaskDetail; import com.huaheng.pc.task.taskDetail.service.TaskDetailService; import io.swagger.annotations.ApiOperation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.io.UnsupportedEncodingException; import java.sql.ResultSet; import java.sql.SQLException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; @RestController @RequestMapping("/API/WMS/v2") public class MesReceiptController extends BaseController { @Resource private ReceiptHeaderService receiptHeaderService; @Resource private ReceiptDetailService receiptDetailService; @Resource private ShipmentHeaderService shipmentHeaderService; @Resource private ShipmentDetailService shipmentDetailService; @Resource private InventoryDetailService inventoryDetailService; @Resource private TaskDetailService taskDetailService; @Resource private InventoryTransactionService inventoryTransactionService; @Resource private ShipmentHeaderHistoryService shipmentHeaderHistoryService; @Resource private MaterialService materialService; @Resource private IMomLogService momLogService; @Resource private IMesService mesService; @Resource private IUserService userService; @Resource private AddressService addressService; private static Logger logger = LoggerFactory.getLogger(ReflectUtils.class); @PostMapping("/receipt") @ApiLogger(apiName = "添加入库单及其明细", from = "ROBOT") @ApiOperation("添加入库单及其明细") public AjaxResult receipt(@RequestBody ReceiptDTO receiptDTO) { AjaxResult ajaxResult = handleQuest("receipt", new MultiProcessListener() { @Override public AjaxResult doProcess() { AjaxResult ajaxResult = mesService.receipt(receiptDTO); return ajaxResult; } }); return ajaxResult; } /** * 添加出库单及其明细 * * @param receiptDTO * @return */ @PostMapping("/shipment") @ApiLogger(apiName = "添加出库单及其明细", from = "ROBOT") @ApiOperation("添加出库单及其明细") public AjaxResult shipment(@RequestBody ReceiptDTO receiptDTO) { AjaxResult ajaxResult = handleQuest("shipment", new MultiProcessListener() { @Override public AjaxResult doProcess() { AjaxResult ajaxResult = mesService.shipment(receiptDTO); return ajaxResult; } }); return ajaxResult; } private JSONObject getJsonObject(Header header, List<Detail> details) { JSONObject data = new JSONObject(); JSONObject Rd_In_M = new JSONObject(); Rd_In_M.put("MGPK", header.getId()); Rd_In_M.put("cCode", header.getReferCode()); JSONArray Rd_In_S = new JSONArray(); details.forEach(detail -> { JSONObject json = new JSONObject(); json.put("MGPK", header.getId()); json.put("SGPK", detail.getId()); json.put("cInvCode", detail.getMaterialCode()); Rd_In_S.add(json); }); data.put("Requester", "WMS"); data.put("Rd_In_M", Rd_In_M); data.put("Rd_In_S", Rd_In_S); return data; } /** * 入库单参数_判空处理 * * @param ajaxResult * @param shipmentHeader * @param shipemtnDetails */ private boolean enterIsNull(AjaxResult ajaxResult, Header shipmentHeader, List<Detail> shipemtnDetails) { if (isNullData(ajaxResult, shipmentHeader, shipemtnDetails)) { return true; } if (StringUtils.isEmpty(shipmentHeader.getRefeCodeType())) { ajaxResult.setCode(RetCode.FAIL).setMsg("单据类型不能为空!!!"); return true; } else if (StringUtils.isEmpty(shipmentHeader.getReferCode())) { ajaxResult.setCode(RetCode.FAIL).setMsg("单据单号不能为空!!!"); return true; } else if (shipmentHeader.getTotalQty() == null || shipmentHeader.getTotalQty().intValue() <= 0) { ajaxResult.setCode(RetCode.FAIL).setMsg("数量不能为空!!!"); } shipemtnDetails.forEach(shipemtnDetail -> { if (StringUtils.isEmpty(shipemtnDetail.getMaterialCode())) { ajaxResult.setCode(RetCode.FAIL).setMsg("物料编码不能为空!!!"); } else if (shipemtnDetail.getTotalQty() == null || shipemtnDetail.getQty().intValue() <= 0) { ajaxResult.setCode(RetCode.FAIL).setMsg("数量不能为空!!!"); } }); return StringUtils.isNotEmpty(ajaxResult.getMsg()); } /** * 出库单参数_判空处理 * * @param ajaxResult * @param shipmentHeader * @param shipemtnDetails */ private boolean outIsNull(AjaxResult ajaxResult, Header shipmentHeader, List<Detail> shipemtnDetails) { if (isNullData(ajaxResult, shipmentHeader, shipemtnDetails)) { return true; } if (StringUtils.isEmpty(shipmentHeader.getReferCode())) { ajaxResult.setCode(RetCode.FAIL).setMsg("单据单号不能为空!!!"); return true; } shipemtnDetails.forEach(shipemtnDetail -> { if (StringUtils.isEmpty(shipemtnDetail.getMaterialCode())) { ajaxResult.setCode(RetCode.FAIL).setMsg("物料编码不能为空!!!"); } }); return StringUtils.isNotEmpty(ajaxResult.getMsg()); } /** * 判空处理 */ private boolean isNullData(AjaxResult ajaxResult, Header shipmentHeader, List<Detail> shipemtnDetails) { if (shipmentHeader == null) { ajaxResult.setCode(RetCode.FAIL).setMsg("出库单头表不能为空!!!"); return true; } else if (shipemtnDetails == null || shipemtnDetails.size() < 1) { ajaxResult.setCode(RetCode.FAIL).setMsg("出库单明细表集不能为空!!!"); return true; } return false; } /** * 入库单单据取消 */ @PostMapping("/cancelEnterWarehouse") @ApiOperation("入库单单据取消") @ApiLogger(apiName = "入库单单据取消", from = "ROBOT") public AjaxResult cancelEnterWarehouse(@RequestBody ReceiptDTO receiptDTO) { AjaxResult ajaxResult = handleQuest("cancelEnterWarehouse", new MultiProcessListener() { @Override public AjaxResult doProcess() { AjaxResult ajaxResult = mesService.cancelEnterWarehouse(receiptDTO); return ajaxResult; } }); return ajaxResult; } /** * 出库单单据取消 */ @PostMapping("/cancelOutWarehouse") @ApiOperation("出库单单据取消") @ApiLogger(apiName = "出库单单据取消", from = "ROBOT") public AjaxResult cancelOutWarehouse(@RequestBody ReceiptDTO receiptDTO) { AjaxResult ajaxResult = handleQuest("cancelOutWarehouse", new MultiProcessListener() { @Override public AjaxResult doProcess() { AjaxResult ajaxResult = mesService.cancelOutWarehouse(receiptDTO); return ajaxResult; } }); return ajaxResult; } private AjaxResult isNull(Header header, List<Detail> details) { AjaxResult ajaxResult = new AjaxResult(); boolean isNull = outIsNull(ajaxResult, header, details); details.forEach(detail -> { if (detail.getTotalQty() == null || detail.getTotalQty().intValue() <= 0) { ajaxResult.setCode(RetCode.FAIL).setMsg("总数量不能为空!!!"); } }); if (isNull || StringUtils.isNotEmpty(ajaxResult.getMsg())) { return ajaxResult; } return ajaxResult; } /** * 查询库存 */ @PostMapping("/searchInventory") @ApiLogger(apiName = "查询库存", from = "ROBOT") @ApiOperation("查询库存") public AjaxResult searchInventory(@RequestBody Detail detailed) { String materialName = detailed.getMaterialName(); String materialCode = detailed.getMaterialCode(); String containerCode = detailed.getContainerCode(); LambdaQueryWrapper<InventoryDetail> lambdaQueryWrapper = Wrappers.lambdaQuery(); // 物料编码 if (StringUtils.isNotEmpty(materialName)) { lambdaQueryWrapper.eq(InventoryDetail::getMaterialName, materialName); } // 物料名称 if (StringUtils.isNotEmpty(materialCode)) { lambdaQueryWrapper.eq(InventoryDetail::getMaterialCode, materialCode); } // 托盘号 if (StringUtils.isNotEmpty(containerCode)) { lambdaQueryWrapper.eq(InventoryDetail::getContainerCode, containerCode); } if (StringUtils.isEmpty(materialName) && StringUtils.isEmpty(containerCode) && StringUtils.isEmpty(containerCode)) { lambdaQueryWrapper.gt(InventoryDetail::getQty, 0); } List<InventoryDetail> detailList = inventoryDetailService.list(lambdaQueryWrapper); List<InventoryVO> inventoryVOList = new ArrayList<>(); detailList.forEach(detail -> { InventoryVO inventoryVO = new InventoryVO(); BeanUtils.copyProperties(detail, inventoryVO); inventoryVO.setWarehouse("035"); inventoryVOList.add(inventoryVO); }); return AjaxResult.success(inventoryVOList); } /** * 获取出入库单明细记录 * * @return AjaxResult */ @PostMapping("/getShipmentDetail") @ApiLogger(apiName = "获取出入库单明细记录", from = "ROBOT") @ApiOperation("获取出入库单明细记录") public AjaxResult getShipmentDetail(@RequestBody GetOrderHistoryDTO getOrderHistoryDTO) { if (StringUtils.isEmpty(getOrderHistoryDTO.getEndTime()) || StringUtils.isEmpty(getOrderHistoryDTO.getStartTime())) { return AjaxResult.error("开始时间和结束时间不能为空!!!"); } LambdaQueryWrapper<InventoryTransaction> lambdaQueryWrapper = Wrappers.lambdaQuery(); lambdaQueryWrapper .ge(InventoryTransaction::getCreated, getOrderHistoryDTO.getStartTime()) .le(InventoryTransaction::getCreated, getOrderHistoryDTO.getEndTime()); List<InventoryTransaction> list = inventoryTransactionService.list(lambdaQueryWrapper); List<InventoryTransactionVO> inventoryTransactionVOList = new ArrayList<>(); list.forEach(inventoryTransaction -> { InventoryTransactionVO inventoryTransactionVO = new InventoryTransactionVO(); BeanUtils.copyProperties(inventoryTransaction, inventoryTransactionVO); inventoryTransactionVOList.add(inventoryTransactionVO); }); return AjaxResult.success(inventoryTransactionVOList); } /** * 获取sqlServer数据库中物料信息, 同步到本地数据库中 */ @PostMapping("/getMaterial") @ApiOperation("获取外部物料信息") public List<Material> getMaterial() { List<Material> materialList = new ArrayList<>(); try { // String sql = "SELECT * FROM [dbo].[sys_user] WHERE createTime > (select DATEADD(HOUR,-3,getdate())) AND createTime <= (select GETDATE())"; // String sql = "SELECT * FROM [dbo].[base_material] WHERE MaterialName = 'SMLS Pipe'"; // 获取新增一天以内和修改两个小时以内的物料数据 //String sql = "select a.cInvCode, a.cInvName, b.cidefine6, b.cidefine7, c.cComUnitName from [dbo].[Inventory] a left join [dbo].[Inventory_extradefine] b on a.cInvCode = b.cInvCode LEFT JOIN [dbo].[ComputationUnit] c ON a.cComUnitCode = c.cComunitCode WHERE (datediff(day,a.dSDate,getdate())=0 OR a.dModifyDate >= DATEADD(HOUR, -4, GETDATE())) and a.cDefWareHouse in ('035','003')"; //DATEDIFF() 函数返回两个日期之间的天数。 String sql = "SELECT\n" + "\ta.cinvcode,\n" + "\ta.cinvname,\n" + "\ta.cDefWareHouse,\n" + "\ta.cComUnitCode,\n" + "\tb.cComUnitName,\n" + "\tc.cidefine6,\n" + "\tc.cidefine7,\n" + "\ta.dModifyDate,\n" + "\ta.dSDate,\n" + "\ta.cinvstd,\n" + "\ta.Iinvweight,\n" + "\ta.cinvccode,\n" + "\td.cInvCName\n" + "FROM\n" + "\t[dbo].[Inventory] a\n" + "\tLEFT JOIN [dbo].[ComputationUnit] b ON a.cComUnitCode= b.cComUnitCode\n" + "\tLEFT JOIN [dbo].[Inventory_extradefine] c ON a.cinvcode= c.cinvcode\n" + "\tLEFT JOIN [dbo].[InventoryClass] d on a.cinvccode= d.cinvccode \n" + "WHERE ( datediff( DAY, a.dSDate, getdate( ) ) = 0 OR a.dModifyDate >= DATEADD( HOUR, - 4, GETDATE( ) ) ) \n" + "\tAND a.cDefWareHouse IN ( '035', '003' ,'001')"; ResultSet resultSet = SqlServer.find(sql); if (resultSet == null) { return materialList; } while (resultSet.next()) { // 字段要与海王表一致 String code = resultSet.getString("cInvCode");//物料编码 String name = resultSet.getString("cInvName");//物料名称 String unitName = resultSet.getString("cComUnitName");//单位名称 String physicalDimension = resultSet.getString("cidefine6");//外形尺寸 String high = resultSet.getString("cidefine7");//托盘类型 String defWareHouse = resultSet.getString("cDefWareHouse");//u8仓库 String unitCode = resultSet.getString("cComUnitCode");//单位编码 //String modifyDate = resultSet.getString("dModifyDate");//修改时间 //String startDate = resultSet.getString("dSDate");//启用时间 String spec = resultSet.getString("cinvstd");//规格 String weight = resultSet.getString("Iinvweight");//重量cinvccode String cinvccode = resultSet.getString("cinvccode");//存货类别编码 String cInvCName = resultSet.getString("cInvCName");//存货类别名称 int isHigh = "高托".equals(high) ? 1 : 0; Material material = new Material(); material.setCode(code); material.setName(name); material.setUnit(unitName); material.setSpec(spec); material.setIsHigh(isHigh); material.setWarehouseCode("CS0001"); material.setCompanyCode("BHF"); material.setPhysicalDimension(physicalDimension); material.setDefWareHouse(defWareHouse); material.setUnitCode(unitCode); //material.setModifyDate(); //material.setStartDate(); material.setWeight(weight); material.setCinvccode(cinvccode); material.setCInvCName(cInvCName); materialList.add(material); } // materialService.saveBatch(materialList); } catch (SQLException throwable) { throwable.printStackTrace(); } logger.debug("******************************同步海王物料档案" + materialList.size() + "条数据!!!"); return materialList; } /** * 当前时间向推几小时 */ public String dateRoll(int ihour) { DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); // 获取当前时间 LocalDateTime date = LocalDateTime.now(); // 获取当前时间的前几小时时间 LocalDateTime localDateTime = date.minusHours(ihour); return dateTimeFormatter.format(localDateTime); } /** * 查询站台任务明细列表 */ @ApiLogger(apiName = "查询站台任务明细列表", from = "ROBOT") @PostMapping("/kanbanInfo") @CrossOrigin public AjaxResult kanbanInfo(@RequestBody TaskDetail taskDetail) { String fromLocation = taskDetail.getFromLocation(); if (StringUtils.isEmpty(fromLocation)) { return AjaxResult.error("站台不能为空!!!"); } LambdaQueryWrapper<TaskDetail> wrapper = Wrappers.lambdaQuery(); wrapper.eq(TaskDetail::getFromLocation, fromLocation) .lt(TaskDetail::getStatus, "100"); List<TaskDetail> taskDetailList = taskDetailService.list(wrapper); return AjaxResult.success(taskDetailList); } /** * post调用E_Rd_In(MOM)入库成功接口 */ //@ApiLogger(apiName = "post调用E_Rd_In(MOM)入库接口", from="ROBOT") @PostMapping("/postE_Rd_In") public ReturnInfo postE_Rd_In(@RequestBody ReceiptDetail receiptDetail) { User user = userService.selectUserByEmail(receiptDetail.getLastUpdatedBy()); ReceiptHeader receiptHeader = receiptHeaderService.getById(receiptDetail.getReceiptId()); //59 JSONObject Rd_In_M = new JSONObject(); Rd_In_M.put("mno", receiptHeader.getCode()); Rd_In_M.put("MGPK", receiptHeader.getMOMID()); Rd_In_M.put("cBusType", receiptHeader.getReceiptType()); Rd_In_M.put("TAID", receiptHeader.getTAID()); Rd_In_M.put("FAID", receiptHeader.getFAID()); Rd_In_M.put("UserNo", user.getLoginName()); Rd_In_M.put("warehouse", receiptHeader.getWarehouse()); JSONArray jsonArray = new JSONArray(); JSONObject Rd_In_S = new JSONObject(); Rd_In_S.put("MGPK", receiptHeader.getMOMID()); Rd_In_S.put("SGPK", receiptDetail.getMOMID()); Rd_In_S.put("SNNO", receiptDetail.getSNNO()); Rd_In_S.put("cInvCode", receiptDetail.getMaterialCode()); Rd_In_S.put("Iquantity", receiptDetail.getTaskQty()); Rd_In_S.put("iFQuantity", receiptDetail.getQty()); Rd_In_S.put("cwhcode", "035"); Rd_In_S.put("MOCode", receiptDetail.getNoticeNo()); Rd_In_S.put("ISUrgent", receiptDetail.getIsUrgent()); Rd_In_S.put("receiptBarcode", receiptDetail.getReceiptBarcode()); Rd_In_S.put("warehouse", receiptHeader.getWarehouse()); Rd_In_S.put("warehouseName", receiptHeader.getWarehouseName()); Rd_In_S.put("creatorCode", user.getLoginName()); Rd_In_S.put("creatorName", receiptDetail.getLastUpdatedBy()); Rd_In_S.put("productionWorker", receiptHeader.getProductionWorker()); Rd_In_S.put("productionWorkerName", receiptHeader.getProductionWorkerName()); Rd_In_S.put("ifrom", receiptDetail.getIfrom()); Rd_In_S.put("LMPKID", receiptDetail.getLMPKID()); Rd_In_S.put("LSPKID", receiptDetail.getLSPKID()); jsonArray.add(Rd_In_S); JSONObject data = new JSONObject(); data.put("Rd_In_M", Rd_In_M); data.put("Rd_In_S", jsonArray); String action = "E_Rd_In"; JSONObject json = new JSONObject(); json.put("data", data); return postMOM(action, json, "入库回传"); } /** * post调用E_Rd_In(MOM)其他入库成功接口 */ //@ApiLogger(apiName = "post调用E_Rd_In(MOM)其他入库接口", from="ROBOT") @PostMapping("/postOther_E_Rd_In") public ReturnInfo postOther_E_Rd_In(@RequestBody List<ReceiptDetail> receiptDetails, ReceiptHeader receiptHeader) { OtherReceiptDomain domain = new OtherReceiptDomain(); OtherReceiptHeader receiptHeader1 = new OtherReceiptHeader(); receiptHeader1.setCode(receiptHeader.getCode()); receiptHeader1.setMomId(receiptHeader.getMOMID()); receiptHeader1.setReceiptType(receiptHeader.getReceiptType()); receiptHeader1.setTaId(receiptHeader.getTAID()); receiptHeader1.setFaId(receiptHeader.getFAID()); receiptHeader1.setLastUpdatedBy(receiptHeader.getLastUpdatedBy()); receiptHeader1.setWarehouse(receiptHeader.getWarehouse()); receiptHeader1.setDepCode(QuantityConstant.DEFAULT_DEPT); receiptHeader1.setStock(QuantityConstant.DEFAULT_STOCK); List<OtherReceiptDetail> list = new ArrayList<>(); for (ReceiptDetail receiptDetail : receiptDetails) { OtherReceiptDetail detail = new OtherReceiptDetail(); detail.setMomIdByHeader(receiptHeader.getMOMID()); detail.setMomId(receiptDetail.getMOMID()); detail.setSnNo(receiptDetail.getSNNO()); detail.setMaterialCode(receiptDetail.getMaterialCode()); detail.setTaskQty(receiptDetail.getTaskQty()); detail.setQty(receiptDetail.getQty()); detail.setWarehouseCode(receiptDetail.getWarehouseCode()); detail.setNotice(receiptDetail.getNoticeNo()); detail.setISUrgent(receiptDetail.getIsUrgent()); detail.setReceiptBarcode(receiptDetail.getReceiptBarcode()); detail.setWarehouse(receiptHeader.getWarehouse()); detail.setWarehouseName(receiptHeader.getWarehouseName()); detail.setLastUpdatedBy(receiptDetail.getLastUpdatedBy()); detail.setLastUpdatedByName(receiptDetail.getLastUpdatedByName()); detail.setProductionWorker(receiptHeader.getProductionWorker()); detail.setProductionWorkerName(receiptHeader.getProductionWorkerName()); list.add(detail); } domain.setReceiptHeader(receiptHeader1); domain.setReceiptDetails(list); //返回实体 ReturnDomain data = new ReturnDomain(); data.setData(domain); String str = JSONObject.toJSONString(data); JSONObject jsonObject = JSONObject.parseObject(str); return postMOM("E_Rd_In", jsonObject, "其他入库回传"); } /** * post调用E_Rd_In(MOM)出库成功接口 */ //@ApiLogger(apiName = "post调用E_Rd_Out(MOM)出库接口", from="ROBOT") @PostMapping("/postE_Rd_Out") public Boolean postE_Rd_Out(@RequestBody ShipmentHeader shipmentHeader) { // ShipmentHeader shipmentHeader = shipmentHeaderService.getById(shipmentHeaderID.getId()); //StringBuffer keyField = new StringBuffer(); JSONArray dataArray = new JSONArray(); // 如果订单为合并类型 if ("merge".equals(shipmentHeader.getShipmentType())) { // 查询所有子表 List<ShipmentDetail> shipmentDetailList = shipmentDetailService.list(new LambdaQueryWrapper<ShipmentDetail>().eq(ShipmentDetail::getShipmentId, shipmentHeader.getId())); // 查询所有合并前的头表 StringBuilder ids = new StringBuilder(); for (ShipmentDetail shipmentDetail : shipmentDetailList) { ids.append(",").append(shipmentDetail.getRecordCode()); } String codes = ids.substring(1, ids.length()); String[] headerIdArr = codes.split(","); List<ShipmentHeader> shipmentHeaderList = new ArrayList<>(); List<ShipmentHeaderHistory> list2 = shipmentHeaderHistoryService.list(new LambdaQueryWrapper<ShipmentHeaderHistory>().in(ShipmentHeaderHistory::getCode, headerIdArr)); for (ShipmentHeaderHistory shipmentHeaderHistory : list2) { ShipmentHeader shipmentHeader1 = new ShipmentHeader(); BeanUtils.copyProperties(shipmentHeaderHistory, shipmentHeader1); shipmentHeaderList.add(shipmentHeader1); } // 根据合并前的头表id分组 Map<String, List<ShipmentDetail>> map = new HashMap<>(); for (ShipmentDetail detail : shipmentDetailList) { String key = detail.getRecordCode(); if (key != null) { if (map.containsKey(key)) { map.get(key).add(detail); } else { List<ShipmentDetail> list = new ArrayList<>(); list.add(detail); map.put(key, list); } } } for (String key : map.keySet()) { JSONObject data = new JSONObject(); // 合并前的头表 ShipmentHeader header = new ShipmentHeader(); // 合并前头表对应的子表 List<ShipmentDetail> detailList = new ArrayList<>(); for (ShipmentHeader SH : shipmentHeaderList) { if (key.equals(SH.getCode())) { header = SH; detailList = map.get(key); break; } } // 查询出库单据表头 JSONObject Rd_Out_M = getRd_Out_M(header); JSONArray jsonArray = getRd_Out_S(header, detailList); data.put("Rd_Out_M", Rd_Out_M); data.put("Rd_Out_S", jsonArray); dataArray.add(data); } } else { // 查询出库单据表头 JSONObject Rd_Out_M = getRd_Out_M(shipmentHeader); // 查询出库单据明细 List<ShipmentDetail> shipmentDetailList = shipmentDetailService.list(new LambdaQueryWrapper<ShipmentDetail>() .eq(ShipmentDetail::getShipmentId, shipmentHeader.getId())); JSONArray jsonArray = getRd_Out_S(shipmentHeader, shipmentDetailList); JSONObject data = new JSONObject(); data.put("Rd_Out_M", Rd_Out_M); data.put("Rd_Out_S", jsonArray); dataArray.add(data); } String action = "E_Rd_Out"; JSONObject json = new JSONObject(); json.put("data", dataArray); ReturnInfo returnInfo = postMOM(action, json, "出库回传"); if (returnInfo == null) { shipmentHeader.setErrorMsg("出库回传:接口地址错误或返回为空"); shipmentHeader.setPushSuccessStatus(2); shipmentHeaderService.updateById(shipmentHeader); return false; } shipmentHeader.setPushErrorCount(shipmentHeader.getPushErrorCount() + 1); if (returnInfo.hasError()) { shipmentHeader.setPushSuccessStatus(1); shipmentHeader.setFirstStatus(QuantityConstant.SHIPMENT_HEADER_RETURN); shipmentHeader.setLastStatus(QuantityConstant.SHIPMENT_HEADER_RETURN); } else { shipmentHeader.setPushSuccessStatus(2); shipmentHeader.setErrorMsg(returnInfo.getMsg()); } shipmentHeaderService.updateById(shipmentHeader); return true; } public JSONArray getRd_Out_S(ShipmentHeader shipmentHeader, List<ShipmentDetail> shipmentDetailList) { JSONArray jsonArray = new JSONArray(); shipmentDetailList.forEach(shipmentDetail -> { User user = userService.selectUserByEmail(shipmentDetail.getLastUpdatedBy()); JSONObject Rd_Out_S = new JSONObject(); Rd_Out_S.put("MGPK", shipmentHeader.getMOMID()); Rd_Out_S.put("SGPK", shipmentDetail.getMOMID()); Rd_Out_S.put("SNNO", shipmentDetail.getSNNO()); Rd_Out_S.put("cInvCode", shipmentDetail.getMaterialCode()); // 实际入库数量 Rd_Out_S.put("Iquantity", shipmentDetail.getTaskQty()); // MOM传入的入库数量 Rd_Out_S.put("iFQuantity", shipmentDetail.getQty()); Rd_Out_S.put("cwhcode", "035"); Rd_Out_S.put("MOCode", shipmentDetail.getNoticeNo()); Rd_Out_S.put("ISUrgent", shipmentDetail.getIsUrgent()); Rd_Out_S.put("updatedByNo", user.getLoginName()); Rd_Out_S.put("updatedBy", shipmentDetail.getLastUpdatedBy()); Rd_Out_S.put("warehouse", shipmentHeader.getWarehouse()); Rd_Out_S.put("warehouseName", shipmentHeader.getWarehouseName()); Rd_Out_S.put("creatorCode", shipmentHeader.getCreatorCode()); Rd_Out_S.put("creatorName", shipmentHeader.getCreatorName()); // Rd_Out_S.put("requestedStartDate", shipmentHeader.getRequestedStartDate()); Rd_Out_S.put("ifrom", shipmentDetail.getIfrom()); Rd_Out_S.put("LMPKID", shipmentDetail.getLMPKID()); Rd_Out_S.put("LSPKID", shipmentDetail.getLSPKID()); jsonArray.add(Rd_Out_S); }); return jsonArray; } public JSONObject getRd_Out_M(@RequestBody ShipmentHeader shipmentHeader) { User user = userService.selectUserByEmail(shipmentHeader.getLastUpdatedBy()); JSONObject Rd_Out_M = new JSONObject(); Rd_Out_M.put("mno", shipmentHeader.getCode()); Rd_Out_M.put("MGPK", shipmentHeader.getMOMID()); Rd_Out_M.put("cBusType", shipmentHeader.getShipmentType()); Rd_Out_M.put("TAID", shipmentHeader.getTAID()); Rd_Out_M.put("FAID", shipmentHeader.getFAID()); Rd_Out_M.put("UserNo", user.getLoginName()); Rd_Out_M.put("warehouse", "035"); Rd_Out_M.put("cDepCode", "01030101");//部门编码 Rd_Out_M.put("cWhCode", shipmentHeader.getWarehouse());//仓库编码 return Rd_Out_M; } /** * utf-8 转 GB2312 */ public String getGB(String action) { byte[] Rd_Out; //中间用ISO-8859-1过渡 String data = null; try { Rd_Out = action.getBytes("8859_1"); data = new String(Rd_Out, "GB2312"); //转换成GB2312字符 } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return data; } /** * @param action MOM行为 * @param JObject 行为参数 * @return */ public ReturnInfo postMOM(String action, JSONObject JObject, String apiName) { String url = addressService.selectAddress(QuantityConstant.MOM); return CallaMOM.getMsg(action, JObject, apiName, url); } }