diff --git a/zi-wms-inf/src/main/java/com/cim/idm/service/impl/ToSAPServiceImpl.java b/zi-wms-inf/src/main/java/com/cim/idm/service/impl/ToSAPServiceImpl.java index bbc2875..c7b167d 100644 --- a/zi-wms-inf/src/main/java/com/cim/idm/service/impl/ToSAPServiceImpl.java +++ b/zi-wms-inf/src/main/java/com/cim/idm/service/impl/ToSAPServiceImpl.java @@ -2608,7 +2608,8 @@ public class ToSAPServiceImpl { //用户名 body.put("USNAM", user); //查询临时表TEMP_MESCONSUME,从里面取数据 - String sql = "SELECT T.MATERIALSPECNAME, T.ERPFACTORY, T.ERPLOCATION, T.QTY, T.UNIT,T.WO,T.SHIPREQUESTNAME,M.RESERVEDPROJECTNUMB FROM TEMP_MESCONSUME T LEFT JOIN MATERIALSHIPREQUESTDETAIL M ON M.SHIPREQUESTNAME = T.SHIPREQUESTNAME AND M.MATERIALSPECNAME = T.MATERIALSPECNAME"; + //String sql = "SELECT T.MATERIALSPECNAME, T.ERPFACTORY, T.ERPLOCATION, T.QTY, T.UNIT,T.WO,T.SHIPREQUESTNAME,M.RESERVEDPROJECTNUMB FROM TEMP_MESCONSUME T LEFT JOIN MATERIALSHIPREQUESTDETAIL M ON M.SHIPREQUESTNAME = T.SHIPREQUESTNAME AND M.MATERIALSPECNAME = T.MATERIALSPECNAME"; + String sql = "SELECT T.MATERIALSPECNAME, T.ERPFACTORY, T.ERPLOCATION, T.QTY, T.UNIT,T.WO,T.SHIPREQUESTNAME,M.SHIPREQUESTDETAILNAME FROM TEMP_MESCONSUME T LEFT JOIN MATERIALSHIPREQUESTDETAIL M ON M.SHIPREQUESTNAME = T.SHIPREQUESTNAME AND M.MATERIALSPECNAME = T.MATERIALSPECNAME"; List> maps = IDMFrameServiceProxy.getSqlTemplate().queryForList(sql, new HashMap()); @@ -2641,7 +2642,8 @@ public class ToSAPServiceImpl { //ZLLITEM 自定义领料单行号 // item.put("ZLLITEM", "0001"); - item.put("ZLLITEM", maps.get(i).get("RESERVEDPROJECTNUMB")); + //item.put("ZLLITEM", maps.get(i).get("RESERVEDPROJECTNUMB")); + item.put("ZLLITEM", maps.get(i).get("SHIPREQUESTDETAILNAME")); //AUFNR 订单号 item.put("AUFNR", maps.get(i).get("WO")); diff --git a/zi-wms-pda/src/main/java/com/cim/idm/controller/SAPToWMSController.java b/zi-wms-pda/src/main/java/com/cim/idm/controller/SAPToWMSController.java index f81c0f0..587cd25 100644 --- a/zi-wms-pda/src/main/java/com/cim/idm/controller/SAPToWMSController.java +++ b/zi-wms-pda/src/main/java/com/cim/idm/controller/SAPToWMSController.java @@ -10,6 +10,8 @@ import com.cim.idm.framework.util.time.TimeUtils; import com.cim.idm.model.SAPToWMSRequest; import com.cim.idm.model.WMSToSAPReturn; import com.cim.idm.mwmsextend.materialreceiverequest.service.MaterialReceiveRequestServiceImpl; +import com.cim.idm.service.IMaterialPackingService; +import com.cim.idm.service.Impl.MESToWMSServiceImpl; import com.cim.idm.util.MessageLogUtil; import com.cim.idm.wmsextend.generic.errorHandler.CustomException; import com.cim.idm.wmspackage.invoice.MaterialReceiveRequestServiceProxy; @@ -34,11 +36,13 @@ import com.cim.idm.wmspackage.receiverequestdetail.ReceiveRequestDetailServicePr import com.cim.idm.wmspackage.receiverequestdetail.management.data.MaterialReceiveRequestDetail; import com.cim.idm.wmspackage.receiverequestdetail.management.data.MaterialReceiveRequestDetailKey; import com.cim.idm.wmspackage.receiverequestdetail.management.info.CreateReceiveRequestDetailInfo; +import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -76,6 +80,9 @@ public class SAPToWMSController { * 设置MATERIALSPEC的SITENAME值为SDK */ String materialSpecSiteName = "SDK"; + @Autowired + private IMaterialPackingService materialPackingService; + // 物料主数据 @RequestMapping(value = "/materialspec", method = RequestMethod.POST) public WMSToSAPReturn GetMaterialSpec(HttpServletRequest httpRequest, @RequestBody SAPToWMSRequest request) { @@ -2223,4 +2230,71 @@ public class SAPToWMSController { } } + /** + * 物料消耗 + * 2024-05-08 + * @param httpRequest + * @param request + * @return + */ + @ApiOperation(value = "物料消耗") + @RequestMapping("/sapwms_materialconsume_request") + public WMSToSAPReturn sapMaterialConsume_Request(HttpServletRequest httpRequest, @RequestBody SAPToWMSRequest request) { + Map head = request.getHEAD(); + //开启事务 + IDMFrameServiceProxy.getTransactionManager().beginTransaction(); + try { + ArrayList> datas = request.getBODY(); + String siteName = "SDK"; + String userName = "SAP"; + if (null == datas || datas.size() <= 0){ + throw new Exception("BODY信息不能为空,请确认"); + } + materialPackingService.materialConsumeSapBwtar(datas,siteName,userName); + Map oKReturn = new HashMap<>(); + oKReturn.put("STATUS", "S"); + oKReturn.put("MSGTXT", "物料消耗成功"); + oKReturn.put("ZRSV01", ""); + oKReturn.put("ZRSV02", ""); + oKReturn.put("ZRSV03", ""); + oKReturn.put("ZRSV04", ""); + oKReturn.put("ZRSV05", ""); + oKReturn.put("ZRSV06", ""); + oKReturn.put("ZRSV07", ""); + oKReturn.put("ZRSV08", ""); + oKReturn.put("ZRSV09", ""); + oKReturn.put("ZRSV10", ""); + WMSToSAPReturn WMSToSAPReturn = new WMSToSAPReturn(head, oKReturn); + ErpMessageLog erpMessageLog = new ErpMessageLog(); + erpMessageLog.setServerName(System.getProperty("Seq")); + erpMessageLog.setEventName(httpRequest.getRequestURL().toString()); + erpMessageLog.setId(new TimeUtils().getCurrentEventTimeKey()); + erpMessageLog.setResultCode("S"); + erpMessageLog.setSendMsg(JSONObject.toJSONString(request)); + erpMessageLog.setMessageId("sapwms_materialconsume_request"); + erpMessageLog.setReturnMsg(JSONObject.toJSONString(WMSToSAPReturn)); + erpMessageLog.setInterfaceTime(TimeStampUtil.getCurrentTime(TimeStampUtil.FORMAT_DEFAULT)); + MessageLogUtil.writeMessageLog(erpMessageLog); + IDMFrameServiceProxy.getTransactionManager().commitTransaction(); + return WMSToSAPReturn; + }catch (Exception e){ + IDMFrameServiceProxy.getTransactionManager().rollbackTransaction(); + Map errorReturn = new HashMap<>(); + errorReturn.put("STATUS", "E"); + errorReturn.put("MSGTXT", "物料消耗失败, " + e.getMessage()); + errorReturn.put("HEAD", request.getHEAD()); + WMSToSAPReturn WMSToSAPReturn = new WMSToSAPReturn(head, errorReturn); + ErpMessageLog erpMessageLog = new ErpMessageLog(); + erpMessageLog.setServerName(System.getProperty("Seq")); + erpMessageLog.setEventName(httpRequest.getRequestURL().toString()); + erpMessageLog.setId(new TimeUtils().getCurrentEventTimeKey()); + erpMessageLog.setResultCode("E"); + erpMessageLog.setSendMsg(JSONObject.toJSONString(request)); + erpMessageLog.setMessageId("sapwms_materialconsume_request"); + erpMessageLog.setReturnMsg(JSONObject.toJSONString(WMSToSAPReturn)); + erpMessageLog.setInterfaceTime(TimeStampUtil.getCurrentTime(TimeStampUtil.FORMAT_DEFAULT)); + MessageLogUtil.writeMessageLog(erpMessageLog); + return WMSToSAPReturn; + } + } } diff --git a/zi-wms-pda/src/main/java/com/cim/idm/service/IMaterialPackingService.java b/zi-wms-pda/src/main/java/com/cim/idm/service/IMaterialPackingService.java index d8100fa..d385382 100644 --- a/zi-wms-pda/src/main/java/com/cim/idm/service/IMaterialPackingService.java +++ b/zi-wms-pda/src/main/java/com/cim/idm/service/IMaterialPackingService.java @@ -5,6 +5,7 @@ import com.cim.idm.framework.data.EventInfo; import com.cim.idm.model.dto.packing.MaterialPackingListDto; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -28,4 +29,13 @@ public interface IMaterialPackingService { */ void delMaterialPacking(Map hashMap, String materialPackingName, String siteName, EventInfo makeEventInfo); + + /** + * SAP物料消耗(正向、反向) + * 2025-05-08 + * @param dataList body报文 + * @param siteName 工厂 + * @param userName 用户名 + */ + void materialConsumeSapBwtar(ArrayList> dataList, String siteName, String userName) throws Exception; } diff --git a/zi-wms-pda/src/main/java/com/cim/idm/service/Impl/MaterialPackingServiceServiceImpl.java b/zi-wms-pda/src/main/java/com/cim/idm/service/Impl/MaterialPackingServiceServiceImpl.java index 04d2895..25e511b 100644 --- a/zi-wms-pda/src/main/java/com/cim/idm/service/Impl/MaterialPackingServiceServiceImpl.java +++ b/zi-wms-pda/src/main/java/com/cim/idm/service/Impl/MaterialPackingServiceServiceImpl.java @@ -5,12 +5,20 @@ import com.cim.idm.framework.IDMFrameServiceProxy; import com.cim.idm.framework.data.EventInfo; import com.cim.idm.model.dto.packing.MaterialPackingListDto; import com.cim.idm.service.IMaterialPackingService; +import com.cim.idm.utils.EventInfoUtil; import com.cim.idm.wmspackage.materialpacking.MaterialPackingServiceProxy; import com.cim.idm.wmspackage.materialpacking.management.data.MaterialPackingKey; import com.cim.idm.wmspackage.materialpacking.management.info.RemoveInfo; +import com.cim.idm.wmspackage.materialpacking.management.info.SetEventInfo; +import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -48,4 +56,184 @@ public class MaterialPackingServiceServiceImpl implements IMaterialPackingServic IDMFrameServiceProxy.getSqlTemplate().update(deleteSql, hashMap); } } + + /** + * SAP物料消耗(正向、反向) + * 2025-05-08 + * @param dataList body报文 + * @param siteName 工厂 + * @param userName 用户名 + */ + @Override + public void materialConsumeSapBwtar(ArrayList> dataList, String siteName, String userName) throws Exception { + String checkBwart = "";// 移动类型 + EventInfo eventInfo = new EventInfoUtil().makeEventInfo("materialConsumeSapBwtar", userName, "materialConsumeSapBwtar", "", ""); + for (Map data : dataList) { + //存储要更新的MaterialPacking信息 + ArrayList setEventInfoList = new ArrayList<>(); + //存储要更新MaterialPacking信息的key + ArrayList materialPackingKeyList = new ArrayList<>(); + String aufnr = MapUtils.getString(data, "AUFNR"); //生产单号 + String werks = MapUtils.getString(data, "WERKS"); // 组织 + String matnr = MapUtils.getString(data, "MATNR"); // 物料编号 + String bwart = MapUtils.getString(data, "BWART"); // 移动类型 + String menge = MapUtils.getString(data, "MENGE"); // 订单数量 + String meins = MapUtils.getString(data, "MEINS"); // 单位 + String lgort = MapUtils.getString(data, "LGORT"); // ERP库存地点 + String budatMkpf = MapUtils.getString(data, "BUDAT_MKPF"); // 过账日期 + String mblnr = MapUtils.getString(data, "MBLNR"); // 物料凭证号 + if (StringUtils.isEmpty(aufnr) || StringUtils.isEmpty(werks) || StringUtils.isEmpty(matnr) + || StringUtils.isEmpty(bwart) || StringUtils.isEmpty(menge) || StringUtils.isEmpty(meins) + || StringUtils.isEmpty(lgort) || StringUtils.isEmpty(budatMkpf) || StringUtils.isEmpty(mblnr)) { + throw new Exception("AUFNR、WERKS、MATNR、BWART、MENGE、MEINS、LGORT、BUDAT_MKPF、MBLNR是必填项"); + } + //操作数量 + BigDecimal mengeBigDecimal = new BigDecimal(menge); + if (StringUtils.isNotEmpty(checkBwart) && !bwart.equals(checkBwart)){ + throw new Exception("不能同时操作261、262多种移动类型,请确认"); + } + if ("261".equals(bwart)){ + //正向 BWART=261发料,根据WERKS+LGORT+AUFNR+MATNR+MEINS根据先进先出逻辑扣减MENGE量的库存 + //根据先进先出查询库存 + String selcetMaterialpackingSql = " SELECT\n" + + "\tSITENAME, MATERIALPACKINGNAME, MATERIALQUANTITY, CREATETIME \n" + + "FROM\n" + + "\tMATERIALPACKING \n" + + "WHERE\n" + + "\tSITENAME =:SITENAME\n" + + "\tAND STOCKSTATE =:STOCKSTATE\n" + + "\tAND ERPFACTORY =:ERPFACTORY \n" + + "\tAND ERPLOCATION =:ERPLOCATION\n" + + "\tAND UNIT =:UNIT\n" + + "\tAND MATERIALSPECNAME =:MATERIALSPECNAME \n" + + "\tAND UNDOID =:UNDOID \n" + + "ORDER BY CREATETIME ASC "; + Map selcetMaterialpackingMap = new HashMap (); + selcetMaterialpackingMap.put("SITENAME", siteName); + selcetMaterialpackingMap.put("STOCKSTATE", "Stocked"); + selcetMaterialpackingMap.put("ERPFACTORY", werks); + selcetMaterialpackingMap.put("ERPLOCATION", lgort); + selcetMaterialpackingMap.put("UNIT", meins); + selcetMaterialpackingMap.put("MATERIALSPECNAME", matnr); + selcetMaterialpackingMap.put("UNDOID", mblnr); + List> queryMaterialpackingList = IDMFrameServiceProxy.getSqlTemplate().queryForList(selcetMaterialpackingSql, selcetMaterialpackingMap); + for (int i = 0; i < queryMaterialpackingList.size(); i++) { + Map hashMap2 = new HashMap(); + SetEventInfo setEventInfo = new SetEventInfo(); + + String materialPackingName = queryMaterialpackingList.get(i).get("MATERIALPACKINGNAME").toString(); + String materialQuantity = queryMaterialpackingList.get(i).get("MATERIALQUANTITY").toString(); + BigDecimal materialQuantityDecimal = new BigDecimal(materialQuantity); + if (mengeBigDecimal.compareTo(materialQuantityDecimal) < 0){ + //消耗数量小于当前条码库存数量 + materialQuantityDecimal = materialQuantityDecimal.subtract(mengeBigDecimal); + mengeBigDecimal = new BigDecimal(BigInteger.ZERO); + + //保存要更新的MaterialPacking信息 + materialQuantity = materialQuantityDecimal.toString(); + hashMap2.put("materialQuantity", materialQuantity); + hashMap2.put("materialCreateQuantity", materialQuantity); + hashMap2.put("unDoID", mblnr); + setEventInfo.setUserColumns(hashMap2); + setEventInfoList.add(setEventInfo); + MaterialPackingKey materialPackingKey = new MaterialPackingKey(siteName, materialPackingName); + materialPackingKeyList.add(materialPackingKey); + break; + } else if (mengeBigDecimal.compareTo(materialQuantityDecimal) == 0){ + //消耗数量等于当前条码库存数量 + mengeBigDecimal = new BigDecimal(BigInteger.ZERO); + materialQuantityDecimal = new BigDecimal(BigInteger.ZERO); + + //保存要更新的MaterialPacking信息 + materialQuantity = materialQuantityDecimal.toString(); + hashMap2.put("materialQuantity", materialQuantity); + hashMap2.put("materialCreateQuantity", materialQuantity); + hashMap2.put("unDoID", mblnr); + setEventInfo.setUserColumns(hashMap2); + setEventInfoList.add(setEventInfo); + MaterialPackingKey materialPackingKey = new MaterialPackingKey(siteName, materialPackingName); + materialPackingKeyList.add(materialPackingKey); + break; + } else { + //消耗数量大于当前条码库存数量 + mengeBigDecimal = mengeBigDecimal.subtract(materialQuantityDecimal); + materialQuantityDecimal = new BigDecimal(BigInteger.ZERO); + //如果扣减后当前条码库存数量等于0,将状态改为StockOut + hashMap2.put("stockState", "StockOut"); + //保存要更新的MaterialPacking信息 + + materialQuantity = materialQuantityDecimal.toString(); + hashMap2.put("materialQuantity", materialQuantity); + hashMap2.put("materialCreateQuantity", materialQuantity); + hashMap2.put("unDoID", mblnr); + setEventInfo.setUserColumns(hashMap2); + setEventInfoList.add(setEventInfo); + MaterialPackingKey materialPackingKey = new MaterialPackingKey(siteName, materialPackingName); + materialPackingKeyList.add(materialPackingKey); + } + + } + if (mengeBigDecimal.compareTo(BigDecimal.ZERO) > 0){ + throw new Exception("物料:" + matnr + " " + werks + " " + lgort + " " + meins + "库存短缺"); + } + MaterialPackingServiceProxy.getMaterialPackingService().setEvent(materialPackingKeyList, eventInfo, setEventInfoList); + } else if ("262".equals(bwart)) { + //反向 BWART=262冲销,根据MBLNR增加对应的数量 + String selcetMaterialpackingSql = " SELECT\n" + + "\tSITENAME, MATERIALPACKINGNAME, STOCKSTATE, MATERIALQUANTITY \n" + + "FROM\n" + + "\tMATERIALPACKING \n" + + "WHERE\n" + + "\tSITENAME =:SITENAME\n" + + "\tAND STOCKSTATE IN ('Stocked','StockOut')\n" + + "\tAND ERPFACTORY =:ERPFACTORY \n" + + "\tAND ERPLOCATION =:ERPLOCATION\n" + + "\tAND UNIT =:UNIT\n" + + "\tAND MATERIALSPECNAME =:MATERIALSPECNAME \n" + + "\tAND UNDOID =:UNDOID \n"; + Map selcetMaterialpackingMap = new HashMap (); + selcetMaterialpackingMap.put("SITENAME", siteName); + selcetMaterialpackingMap.put("ERPFACTORY", werks); + selcetMaterialpackingMap.put("ERPLOCATION", lgort); + selcetMaterialpackingMap.put("UNIT", meins); + selcetMaterialpackingMap.put("MATERIALSPECNAME", matnr); + selcetMaterialpackingMap.put("UNDOID", mblnr); + List> queryMaterialpackingList = IDMFrameServiceProxy.getSqlTemplate().queryForList(selcetMaterialpackingSql, selcetMaterialpackingMap); + for (int i = 0; i < queryMaterialpackingList.size(); i++) { + Map hashMap2 = new HashMap(); + SetEventInfo setEventInfo = new SetEventInfo(); + + String materialPackingName = queryMaterialpackingList.get(i).get("MATERIALPACKINGNAME").toString(); + String materialQuantity = queryMaterialpackingList.get(i).get("MATERIALQUANTITY").toString(); + String stockState = queryMaterialpackingList.get(i).get("STOCKSTATE").toString(); + BigDecimal materialQuantityDecimal = new BigDecimal(materialQuantity); + if("Stocked".equals(stockState)){ + materialQuantityDecimal = materialQuantityDecimal.add(mengeBigDecimal); + }else if ("StockOut".equals(stockState)){ + materialQuantityDecimal = mengeBigDecimal; + hashMap2.put("STOCKSTATE", "Stocked"); + } + //保存要更新的MaterialPacking信息 + materialQuantity = materialQuantityDecimal.toString(); + hashMap2.put("materialQuantity", materialQuantity); + hashMap2.put("materialCreateQuantity", materialQuantity); + //hashMap2.put("unDoID", mblnr); + setEventInfo.setUserColumns(hashMap2); + setEventInfoList.add(setEventInfo); + MaterialPackingKey materialPackingKey = new MaterialPackingKey(siteName, materialPackingName); + materialPackingKeyList.add(materialPackingKey); + break; + } + if (queryMaterialpackingList.isEmpty()){ + throw new Exception("物料:" + matnr + " " + werks + " " + lgort + " " + meins + "冲销失败"); + }else { + MaterialPackingServiceProxy.getMaterialPackingService().setEvent(materialPackingKeyList, eventInfo, setEventInfoList); + } + + } else { + throw new Exception("不属于物料消耗261、262的移动类型,请确认"); + } + checkBwart = bwart; + } + } }