diff --git a/zi-wms-inf/src/main/java/com/cim/idm/data/changeOrder/changeOrderDto.java b/zi-wms-inf/src/main/java/com/cim/idm/data/changeOrder/changeOrderDto.java new file mode 100644 index 0000000..d1269b1 --- /dev/null +++ b/zi-wms-inf/src/main/java/com/cim/idm/data/changeOrder/changeOrderDto.java @@ -0,0 +1,44 @@ +package com.cim.idm.data.changeOrder; + +import lombok.Data; + +@Data +public class changeOrderDto { + // MATNR 发货物料号 +// item.put("MATNR", maps.get(i).get("MATERIALSPECNAME")); +// // WERKS 发货工厂 +// item.put("WERKS", maps.get(i).get("ERPFACTORY")); +// // LGORT 发货库存地点 +// item.put("LGORT", maps.get(i).get("ERPLOCATION")); +// //MENGE 数量 +// item.put("MENGE", maps.get(i).get("QTY")); +// //MENGE 单位 +// item.put("MEINS", maps.get(i).get("UNIT")); +// // //KOSTL 成本中心 +// // item.put("KOSTL", mm.get("COSTCENTER")); +// // //GRUND 移动原因 (201,202回传) +// // item.put("GRUND", mm.get("SHIPREQUESTDETAILTYPE")); +// +// item.put("BWART", "261"); +// //ZLLORDER 自定义领料单号 +//// item.put("ZLLORDER", "LL1010250408001"); +// item.put("ZLLORDER", maps.get(i).get("SHIPREQUESTNAME")); +// //ZLLITEM 自定义领料单行号 +// +//// item.put("ZLLITEM", "0001"); +// item.put("ZLLITEM", maps.get(i).get("RESERVEDPROJECTNUMB")); +// //AUFNR 订单号 +// item.put("AUFNR", maps.get(i).get("WO")); + private String MATNR; + private String WERKS; + private String LGORT; + private String MENGE; + private String MEINS; + private String KOSTL; + private String GRUND; + private String BWART; + private String ZLLORDER; + private String ZLLITEM; + private String AUFNR; + +} 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 3c1103a..a997258 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 @@ -5676,4 +5676,116 @@ public class ToSAPServiceImpl { public String qtcrNoInvoiceForCheckPlan(List> srPk, String qtc, String user, String commitDate, String opCode) { return ""; } + + public String StockOutByOrder(List materialPackingList, String mes) {{ + + String rcode; + String undoId = ""; + String rmsg = null; + + try { + + JSONObject sendData = new JSONObject(true); + JSONObject header = new JSONObject(true); + sendData.put("HEAD", header); + JSONObject body = new JSONObject(true); + sendData.put("BODY", body); + JSONArray itemArray = new JSONArray(); + + /* + HEAD + */ + header.put("INTF_ID", "MM067"); + String uniqueID = UUID.randomUUID().toString(); + header.put("REQ_KEYID", uniqueID); + header.put("SRC_MSGID", uniqueID); + header.put("SRC_SYSTEM", "WMS"); + header.put("DEST_SYSTEM", "SAP"); + header.put("REQUSER", mes); + + /* + BODY + */ + body.put("ITEM", itemArray); + body.put("ITEMID", uniqueID); + //过账日期 + body.put("BUDAT", TimeStampUtil.getCurrentTime("yyyyMMdd")); + //凭证日期 + body.put("BLDAT", TimeStampUtil.getCurrentTime("yyyyMMdd")); + //凭证抬头文本 + body.put("BKTXT", uniqueID); + //用户名 + body.put("USNAM", mes); + + + if (materialPackingList == null || materialPackingList.size() < 1) { + throw new RuntimeException("不存在需要发送的数据"); + } + for (com.cim.idm.data.changeOrder.changeOrderDto mm : materialPackingList) { + JSONObject item = new JSONObject(true); + if(materialPackingList.size()>0) { + // MATNR 发货物料号 + item.put("MATNR", mm.getMATNR()); + + // WERKS 发货工厂 + item.put("WERKS", mm.getWERKS()); + // LGORT 发货库存地点 + item.put("LGORT", mm.getLGORT()); + //MENGE 数量 + item.put("MENGE",mm.getMENGE()); + //MENGE 单位 + item.put("MEINS",mm.getMEINS()); + // //KOSTL 成本中心 + // item.put("KOSTL", mm.get("COSTCENTER")); + // //GRUND 移动原因 (201,202回传) + // item.put("GRUND", mm.get("SHIPREQUESTDETAILTYPE")); + + item.put("BWART", "261"); + //ZLLORDER 自定义领料单号 +// item.put("ZLLORDER", "LL1010250408001"); + item.put("ZLLORDER", mm.getZLLORDER()); + //ZLLITEM 自定义领料单行号 + +// item.put("ZLLITEM", "0001"); + item.put("ZLLITEM", mm.getZLLITEM()); + //AUFNR 订单号 + item.put("AUFNR", mm.getAUFNR()); + + } + itemArray.add(item); + } + + log.info("SendTOSAP >>>>" + sendData); + String sendDatas = sendData.toJSONString(); + String sapreturn = toSAPMessageUtil.sendHttpPost(toSAPMessageUtil.materialChangeLocationUrl, "", sendDatas); + org.json.JSONObject receiveJsonObject = new org.json.JSONObject(sapreturn); + org.json.JSONObject returnJsonObject = (org.json.JSONObject) receiveJsonObject.get("RETURN"); + rcode = returnJsonObject.get("STATUS").toString(); + rmsg = returnJsonObject.get("MSGTXT").toString(); + + if ("S".equals(rcode)) { + undoId = returnJsonObject.get("MBLNR").toString()+"_"+returnJsonObject.get("MJAHR").toString();//将物料凭证号与凭证年度拼在一起 + } + //将log写到表里 + ErpMessageLog erplog = new ErpMessageLog(); + erplog.setEventUser(""); + erplog.setServerName("WmsToErp"); + erplog.setEventName("MES物料消耗261"); + erplog.setInterfaceTime(TimeStampUtil.getCurrentTime(TimeStampUtil.FORMAT_DEFAULT)); + erplog.setMessageId(UUID.randomUUID().toString()); + erplog.setSendMsg(sendData.toJSONString()); + erplog.setSendMsg2(sendData.toJSONString()); + erplog.setReturnMsg2(sapreturn); + erplog.setResultCode(rcode); + MessageLogUtil.writeMessageLog(erplog); + } catch (Exception e) { + log.info(e.getMessage(), e); + throw new RuntimeException("SAP返回" + e.toString()); + } + if (!"S".equals(rcode)) { + throw new RuntimeException("SAP返回" + rmsg); + } + return undoId; + } + } } diff --git a/zi-wms-pda/src/main/java/com/cim/idm/controller/MESToWMSController.java b/zi-wms-pda/src/main/java/com/cim/idm/controller/MESToWMSController.java index a393bb6..7fa7a94 100644 --- a/zi-wms-pda/src/main/java/com/cim/idm/controller/MESToWMSController.java +++ b/zi-wms-pda/src/main/java/com/cim/idm/controller/MESToWMSController.java @@ -23,6 +23,19 @@ public class MESToWMSController { @Autowired private MESToWMSServiceImpl mesToWMSService; + /** + * 转工单接口 + */ + @ApiOperation(value = "物料转工单请求") + @RequestMapping(value = "/meswms_workorder_request", method = RequestMethod.POST) + public AjaxResult workOrder_Request(@RequestBody JSONArray in) { + log.info("Received work order request: {}", in.toJSONString()); + try { + return mesToWMSService.workOrder_Request(in); + } catch (Exception e) { + throw new RuntimeException(e); + } + } @ApiOperation(value = "物料消耗请求") @RequestMapping(value = "/meswms_materialconsume_request", method = RequestMethod.POST) diff --git a/zi-wms-pda/src/main/java/com/cim/idm/controller/QMSController.java b/zi-wms-pda/src/main/java/com/cim/idm/controller/QMSController.java index f5525ad..4662dfc 100644 --- a/zi-wms-pda/src/main/java/com/cim/idm/controller/QMSController.java +++ b/zi-wms-pda/src/main/java/com/cim/idm/controller/QMSController.java @@ -414,6 +414,8 @@ public class QMSController { if(mpList.size()>0) { setEventInfo2.setUserColumns(bindMap); + makeEventInfo.setEventTimeKey(TimeStampUtil.getCurrentEventTimeKey()); + makeEventInfo.setEventTime(TimeStampUtil.getCurrentTimestamp()); MaterialPackingServiceProxy.getMaterialPackingService().setEvent(mpList, eventInfo, setEventInfo2); } } @@ -509,6 +511,8 @@ public class QMSController { if(mpList.size()>0) { setEventInfo2.setUserColumns(bindMap); + makeEventInfo.setEventTimeKey(TimeStampUtil.getCurrentEventTimeKey()); + makeEventInfo.setEventTime(TimeStampUtil.getCurrentTimestamp()); MaterialPackingServiceProxy.getMaterialPackingService().setEvent(mpList, eventInfo, setEventInfo2); } } else { @@ -526,6 +530,8 @@ public class QMSController { for (MaterialPackingKey mp :mpList) { MaterialPackingKey materialPackingKey = mp; chargeString+=(mp.getMaterialPackingName()+","); + makeEventInfo.setEventTimeKey(TimeStampUtil.getCurrentEventTimeKey()); + makeEventInfo.setEventTime(TimeStampUtil.getCurrentTimestamp()); MaterialPackingServiceProxy.getMaterialPackingService().setEvent(materialPackingKey, makeEventInfo, setEventInfo); } if(ngFlag) @@ -914,6 +920,8 @@ public class QMSController { boxList2.add( queryForList.get(0).get("MATERIALPACKINGNAME").toString()); setEventInfo.setUserColumns(hashMap3); + eventInfo.setEventTimeKey(TimeStampUtil.getCurrentEventTimeKey()); + eventInfo.setEventTime(TimeStampUtil.getCurrentTimestamp()); MaterialPackingServiceProxy.getMaterialPackingService().setEvent(new MaterialPackingKey( queryForList.get(0).get("SITENAME").toString(), queryForList.get(0).get("MATERIALPACKINGNAME").toString()), eventInfo, setEventInfo); } diff --git a/zi-wms-pda/src/main/java/com/cim/idm/controller/SaleOutController.java b/zi-wms-pda/src/main/java/com/cim/idm/controller/SaleOutController.java index 44a0e8e..6d412df 100644 --- a/zi-wms-pda/src/main/java/com/cim/idm/controller/SaleOutController.java +++ b/zi-wms-pda/src/main/java/com/cim/idm/controller/SaleOutController.java @@ -712,6 +712,7 @@ public class SaleOutController { hashMap.put("SHIPREQUESTNAME", shipRequestName); // 关联详情单据,去除当是现场仓时多余已经入库到现场仓的批次条码 + /* String sqlGetBox="SELECT\n" + "m.MATERIALPACKINGNAME,\n" + "m.MATERIALQUANTITY,\n" + @@ -726,6 +727,22 @@ public class SaleOutController { "AND m.STOCKSTATE = 'Stocked'\n" + "AND m.MATERIALQUANTITY2 >0\n" + "AND (m.ERPLOCATION <> mdl.ERPRECEIVELOCATION OR mdl.ERPRECEIVELOCATION IS NULL)"; + */ + + String sqlGetBox = " SELECT m.MATERIALPACKINGNAME,\n" + + " m.MATERIALQUANTITY,\n" + + " DECODE(NVL(m.MATERIALQUANTITY2, 0), 0 , m.MATERIALQUANTITY, m.MATERIALQUANTITY2) MATERIALQUANTITY2\n" + + "FROM MATERIALPACKING m\n" + + "WHERE " + + "m.SHIPREQUESTNAME =:SHIPREQUESTNAME\n" + + "AND m.STOCKSTATE = 'Stocked'\n" + + "AND m.MATERIALQUANTITY2 > 0\n" + + "AND NOT EXISTS (\n" + + " SELECT 1 FROM MATERIALSHIPREQUESTDETAIL mdl\n" + + " WHERE mdl.SHIPREQUESTNAME = m.SHIPREQUESTNAME\n" + + " AND mdl.MATERIALSPECNAME = m.MATERIALSPECNAME\n" + + " AND (m.ERPLOCATION = mdl.ERPRECEIVELOCATION AND mdl.ERPRECEIVELOCATION IS NOT NULL)\n" + + ") "; List> sr = IDMFrameServiceProxy.getSqlTemplate().queryForList(sqlGetBox, hashMap); if(sr.size()>0) { diff --git a/zi-wms-pda/src/main/java/com/cim/idm/dao/MesToWmsDao.java b/zi-wms-pda/src/main/java/com/cim/idm/dao/MesToWmsDao.java index 5332144..2661bcb 100644 --- a/zi-wms-pda/src/main/java/com/cim/idm/dao/MesToWmsDao.java +++ b/zi-wms-pda/src/main/java/com/cim/idm/dao/MesToWmsDao.java @@ -1,13 +1,13 @@ package com.cim.idm.dao; import com.cim.idm.model.MaterialPackingSubDto; -import com.cim.idm.wmspackage.materialpacking.management.data.MaterialPacking; +import com.cim.idm.data.changeOrder.changeOrderDto; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; import org.springframework.stereotype.Component; import java.util.List; -import java.util.Map; @Component @Mapper @@ -24,4 +24,13 @@ public interface MesToWmsDao { public void updateBsMesShipped(@Param("materialPackingName") String materialPackingName) throws Exception; public void updateUnDoId(@Param("undoId") String undoId) throws Exception; + + List getMaterialPackingList(@Param("materialSpecnameList") List materialSpecnameList, @Param("chargeList") List chargeList); + + + void updateMDCFlag(@Param("materialSpecnameList") List materialSpecnameList, @Param("chargeList") List chargeList, @Param("t") String t); + + List getMaterialPackingListByRK(@Param("materialSpecnameList") List materialSpecnameList, @Param("chargeList") List chargeList); + + void updateWO(@Param("materialSpecnameList") List materialSpecnameList, @Param("chargeList") List chargeList, @Param("t") String t); } diff --git a/zi-wms-pda/src/main/java/com/cim/idm/service/Impl/MESToWMSServiceImpl.java b/zi-wms-pda/src/main/java/com/cim/idm/service/Impl/MESToWMSServiceImpl.java index 44bbe58..58dd0dd 100644 --- a/zi-wms-pda/src/main/java/com/cim/idm/service/Impl/MESToWMSServiceImpl.java +++ b/zi-wms-pda/src/main/java/com/cim/idm/service/Impl/MESToWMSServiceImpl.java @@ -2,7 +2,6 @@ package com.cim.idm.service.Impl; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.cim.idm.dao.FgStockInDao; import com.cim.idm.dao.MesToWmsDao; import com.cim.idm.data.ErpMessageLog; import com.cim.idm.exception.GlobalException; @@ -11,7 +10,7 @@ import com.cim.idm.framework.data.EventInfo; import com.cim.idm.framework.orm.SqlTemplate; import com.cim.idm.framework.util.sys.SystemPropHelper; import com.cim.idm.framework.util.time.TimeStampUtil; -import com.cim.idm.model.MaterialPackingSubDto; +import com.cim.idm.data.changeOrder.changeOrderDto; import com.cim.idm.mwmsextend.materialpacking.service.MaterialPackingServiceImpl; import com.cim.idm.service.MESToWMSService; import com.cim.idm.service.QMSService; @@ -89,6 +88,7 @@ public class MESToWMSServiceImpl implements MESToWMSService { String qty = jb.get("qty").toString(); // 消耗数量 String wo = jb.get("requestName") == null ? "" : jb.get("requestName").toString(); // 工单 String flag = jb.get("flag") == null ? "" : jb.get("flag").toString(); + String charge = jb.get("CHARGE") == null ? "" : jb.get("CHARGE").toString(); //判空 if (StringUtils.isBlank(materialSpecName) || StringUtils.isBlank(qty)) { result = AjaxResult.me().setSuccess(false).setErrorCode(500).setMessage("料号或数量不能为空"); @@ -118,6 +118,7 @@ public class MESToWMSServiceImpl implements MESToWMSService { put("V_FLAG", flag); put("V_RETURN_CODE", ""); put("V_RETURN_MESSAGE", ""); + put("V_CHARGE", charge); } }; Map stringObjectMap = IDMFrameServiceProxy.getSqlTemplate().executeProcedure(procedureName, bindMap); @@ -551,4 +552,102 @@ public class MESToWMSServiceImpl implements MESToWMSService { MessageLogUtil.writeMessageLog(loginfo); return result; } + + /** + * 接收MES请求工单请求 + * + * @param in + * @return + */ + @Override + @Transactional + public AjaxResult workOrder_Request(JSONArray in) { + //转工单,按照批次先传MDC消耗请求SAP出库,再生成入库信息传SAP入库 + log.info("Received work order request: {}", in.toJSONString()); + //转换前工单formOrder,转换后工单toOrder,料号 materialSpecname,批次 charge + //先判断Array里面的批次和料号库存是否都存在,如果不存在不执行作业 + //将料号和批次分别放到集合里面从mybatis里面取数据和SAP过账,出库成功后更新changeOrderFlag状态为T,入库成功后更新状态为S + List materialSpecnameList = new ArrayList<>(); + List chargeList = new ArrayList<>(); + String wo = ""; + for (int i = 0; i < in.size(); i++) { + JSONObject jsonObject = in.getJSONObject(i); + String materialSpecname = jsonObject.getString("materialSpecname"); + String charge = jsonObject.getString("charge"); + wo = jsonObject.getString("toOrder"); + materialSpecnameList.add(materialSpecname); + chargeList.add(charge); + if (StringUtils.isNotBlank(materialSpecname) && StringUtils.isNotBlank(charge)) { + //判断批次和料号MDC表是否存在 + if (!checkMaterialPackingExist(materialSpecname, charge)) { + log.error("工单转换失败,批次和料号不存在 {} {} ", materialSpecname, charge); + //String占位符 + String message = "工单转换失败,批次和料号不存在 {} {} "; + + return AjaxResult.me().setResultObj(null).setSuccess(false).setErrorCode(500).setMessage(message); + } + } else { + return AjaxResult.me().setResultObj(null).setSuccess(false).setErrorCode(500).setMessage("工单转换失败,库存不存在"); + } + } + //调用出库方法 + String s = materialOutByMES(materialSpecnameList, chargeList); + //调用入库方法 + String s1 = materialIntoByMES(materialSpecnameList, chargeList,wo); + String message = "工单转换成功 物料凭证 {}"; + return AjaxResult.me().setResultObj(null).setSuccess(true).setErrorCode(200).setMessage("执行成功,物料凭证 " + s1); + } + + /** + * 出库方法 + */ + @Transactional + public String materialOutByMES(List materialSpecnameList, List chargeList) { + String result = ""; + //调用Mybatis方法查询当前可出库存 + List materialPackingList = mesToWmsDao.getMaterialPackingList(materialSpecnameList, chargeList); + //出库过账 + String undoid = toSAPService.StockOutByOrder( + materialPackingList, + "MES" + ); + //更新MDC表状态 + mesToWmsDao.updateMDCFlag(materialSpecnameList, chargeList, "T"); + return undoid; + } + + /** + * 入库方法 + */ + @Transactional + public String materialIntoByMES(List materialSpecnameList, List chargeList, String wo) { + //更新工单号 + mesToWmsDao.updateWO(materialSpecnameList, chargeList, wo); + List materialPackingListByRK = mesToWmsDao.getMaterialPackingListByRK(materialSpecnameList, chargeList); + //入库过账 + String undoid = toSAPService.StockOutByOrder( + materialPackingListByRK, + "MES" + ); + mesToWmsDao.updateMDCFlag(materialSpecnameList, chargeList, "S"); + return undoid; + } + + + /** + * 判断MDC表是否有库存 + */ + public static boolean checkMaterialPackingExist(String materialSpecName,String charge) { + String sql = "SELECT COUNT(1) FROM MATERIALPACKINGMDC WHERE MATERIALSPECNAME = :MATERIALSPECNAME AND CHARGE = :CHARGE"; + Map bindMap = new HashMap<>(); + bindMap.put("MATERIALSPECNAME", materialSpecName); + bindMap.put("CHARGE", charge); + List> maps = IDMFrameServiceProxy.getSqlTemplate().queryForList(sql, bindMap); + if (maps != null && maps.size() > 0) { + if (maps.get(0).get("COUNT(1)") != null && Integer.parseInt(maps.get(0).get("COUNT(1)").toString()) > 0) { + return true; + } + } + return false; + } } \ No newline at end of file diff --git a/zi-wms-pda/src/main/java/com/cim/idm/service/MESToWMSService.java b/zi-wms-pda/src/main/java/com/cim/idm/service/MESToWMSService.java index 3798cf5..1806e5e 100644 --- a/zi-wms-pda/src/main/java/com/cim/idm/service/MESToWMSService.java +++ b/zi-wms-pda/src/main/java/com/cim/idm/service/MESToWMSService.java @@ -34,4 +34,11 @@ public interface MESToWMSService { * @return */ AjaxResult shipByMES(JSONArray in) throws Exception; + + /** + * 接收MES请求工单请求 + * @param in + * @return + */ + AjaxResult workOrder_Request(JSONArray in); } \ No newline at end of file diff --git a/zi-wms-pda/src/main/resources/com/cim/idm/dao/MesToWmsDao.xml b/zi-wms-pda/src/main/resources/com/cim/idm/dao/MesToWmsDao.xml index 03d399c..58df72e 100644 --- a/zi-wms-pda/src/main/resources/com/cim/idm/dao/MesToWmsDao.xml +++ b/zi-wms-pda/src/main/resources/com/cim/idm/dao/MesToWmsDao.xml @@ -4,7 +4,7 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + - + + + UPDATE MATERIALRECEIVEREQUESTDETAIL T @@ -77,4 +115,26 @@ UPDATE IF_ERPUNDO T SET T.FLAG = 'Y' WHERE T.UNDOID = #{undoId} + + UPDATE MATERIALPACKINGMDC T SET T.CHANGEORDERFLAG = 'T' WHERE T.MATERIALSPECNAME in + + #{item} + + AND T.CHARGE in + + #{item} + + + + + UPDATE MATERIALPACKINGMDC T SET T.WO = #{t} WHERE T.MATERIALSPECNAME in + + #{item} + + AND T.CHARGE in + + #{item} + + + \ No newline at end of file