add SAP->WMS物料消耗,新增sapwms_materialconsume_request接口

This commit is contained in:
18110972313 2025-05-09 16:56:17 +08:00
parent 7b33ffad41
commit 9bfb0a28b9
3 changed files with 272 additions and 0 deletions

View File

@ -10,6 +10,8 @@ import com.cim.idm.framework.util.time.TimeUtils;
import com.cim.idm.model.SAPToWMSRequest; import com.cim.idm.model.SAPToWMSRequest;
import com.cim.idm.model.WMSToSAPReturn; import com.cim.idm.model.WMSToSAPReturn;
import com.cim.idm.mwmsextend.materialreceiverequest.service.MaterialReceiveRequestServiceImpl; 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.util.MessageLogUtil;
import com.cim.idm.wmsextend.generic.errorHandler.CustomException; import com.cim.idm.wmsextend.generic.errorHandler.CustomException;
import com.cim.idm.wmspackage.invoice.MaterialReceiveRequestServiceProxy; 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.MaterialReceiveRequestDetail;
import com.cim.idm.wmspackage.receiverequestdetail.management.data.MaterialReceiveRequestDetailKey; import com.cim.idm.wmspackage.receiverequestdetail.management.data.MaterialReceiveRequestDetailKey;
import com.cim.idm.wmspackage.receiverequestdetail.management.info.CreateReceiveRequestDetailInfo; import com.cim.idm.wmspackage.receiverequestdetail.management.info.CreateReceiveRequestDetailInfo;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.MapUtils; import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
@ -76,6 +80,9 @@ public class SAPToWMSController {
* 设置MATERIALSPEC的SITENAME值为SDK * 设置MATERIALSPEC的SITENAME值为SDK
*/ */
String materialSpecSiteName = "SDK"; String materialSpecSiteName = "SDK";
@Autowired
private IMaterialPackingService materialPackingService;
// 物料主数据 // 物料主数据
@RequestMapping(value = "/materialspec", method = RequestMethod.POST) @RequestMapping(value = "/materialspec", method = RequestMethod.POST)
public WMSToSAPReturn GetMaterialSpec(HttpServletRequest httpRequest, @RequestBody SAPToWMSRequest request) { 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<String,Object> head = request.getHEAD();
//开启事务
IDMFrameServiceProxy.getTransactionManager().beginTransaction();
try {
ArrayList<Map<String,Object>> 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<String, Object> 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<String, Object> 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;
}
}
} }

View File

@ -5,6 +5,7 @@ import com.cim.idm.framework.data.EventInfo;
import com.cim.idm.model.dto.packing.MaterialPackingListDto; import com.cim.idm.model.dto.packing.MaterialPackingListDto;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -28,4 +29,13 @@ public interface IMaterialPackingService {
*/ */
void delMaterialPacking(Map<String, Object> hashMap, String materialPackingName, void delMaterialPacking(Map<String, Object> hashMap, String materialPackingName,
String siteName, EventInfo makeEventInfo); String siteName, EventInfo makeEventInfo);
/**
* SAP物料消耗(正向反向)
* 2025-05-08
* @param dataList body报文
* @param siteName 工厂
* @param userName 用户名
*/
void materialConsumeSapBwtar(ArrayList<Map<String,Object>> dataList, String siteName, String userName) throws Exception;
} }

View File

@ -5,12 +5,20 @@ import com.cim.idm.framework.IDMFrameServiceProxy;
import com.cim.idm.framework.data.EventInfo; import com.cim.idm.framework.data.EventInfo;
import com.cim.idm.model.dto.packing.MaterialPackingListDto; import com.cim.idm.model.dto.packing.MaterialPackingListDto;
import com.cim.idm.service.IMaterialPackingService; 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.MaterialPackingServiceProxy;
import com.cim.idm.wmspackage.materialpacking.management.data.MaterialPackingKey; 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.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 org.springframework.stereotype.Service;
import javax.annotation.Resource; 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.List;
import java.util.Map; import java.util.Map;
@ -48,4 +56,184 @@ public class MaterialPackingServiceServiceImpl implements IMaterialPackingServic
IDMFrameServiceProxy.getSqlTemplate().update(deleteSql, hashMap); IDMFrameServiceProxy.getSqlTemplate().update(deleteSql, hashMap);
} }
} }
/**
* SAP物料消耗(正向反向)
* 2025-05-08
* @param dataList body报文
* @param siteName 工厂
* @param userName 用户名
*/
@Override
public void materialConsumeSapBwtar(ArrayList<Map<String,Object>> dataList, String siteName, String userName) throws Exception {
String checkBwart = "";// 移动类型
EventInfo eventInfo = new EventInfoUtil().makeEventInfo("materialConsumeSapBwtar", userName, "materialConsumeSapBwtar", "", "");
for (Map<String, Object> data : dataList) {
//存储要更新的MaterialPacking信息
ArrayList<SetEventInfo> setEventInfoList = new ArrayList<>();
//存储要更新MaterialPacking信息的key
ArrayList<MaterialPackingKey> 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<String, Object> selcetMaterialpackingMap = new HashMap<String, Object> ();
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<Map<String, Object>> queryMaterialpackingList = IDMFrameServiceProxy.getSqlTemplate().queryForList(selcetMaterialpackingSql, selcetMaterialpackingMap);
for (int i = 0; i < queryMaterialpackingList.size(); i++) {
Map<String, Object> hashMap2 = new HashMap<String,Object>();
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<String, Object> selcetMaterialpackingMap = new HashMap<String, Object> ();
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<Map<String, Object>> queryMaterialpackingList = IDMFrameServiceProxy.getSqlTemplate().queryForList(selcetMaterialpackingSql, selcetMaterialpackingMap);
for (int i = 0; i < queryMaterialpackingList.size(); i++) {
Map<String, Object> hashMap2 = new HashMap<String,Object>();
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;
}
}
} }