diff --git a/zi-wms-inf/src/main/java/com/cim/idm/service/impl/QMSServiceImpl.java b/zi-wms-inf/src/main/java/com/cim/idm/service/impl/QMSServiceImpl.java index d0cc66c..55caf5c 100644 --- a/zi-wms-inf/src/main/java/com/cim/idm/service/impl/QMSServiceImpl.java +++ b/zi-wms-inf/src/main/java/com/cim/idm/service/impl/QMSServiceImpl.java @@ -475,5 +475,97 @@ public class QMSServiceImpl implements QMSService{ return code; } - + + public String sendToIQCByDataList(String opCode, List> list) throws CustomException { + + JSONArray jsonArray = new JSONArray(); + for (int i = 0; i < list.size(); i++) { + JSONObject jsonObject = new JSONObject(true); +//       "deliveryNumber": "SDK20240511003", +//         "supplierName": "BOE", +//         "supplierCode": "0000102038", +//         "materialName": "胶带", +//         "materialCode": "2F08S4J4", +//         "materialGroup": "A40001", +//         "batchQuantity": 10, +//         "quantityUnit": "1", +//         "deliveryDate": "2024-1-1 12:2:2" + jsonObject.put("opCode", opCode); + jsonObject.put("deliveryNumber", opCode); + jsonObject.put("warehouse", list.get(i).get("ERPLOCATIONDESC")); + jsonObject.put("supplierName", list.get(i).get("SUPPLIERNAME")); + jsonObject.put("supplierCode", list.get(i).get("SUPPLIERCODE")); + jsonObject.put("materialName", list.get(i).get("MATERIALNAME")); + jsonObject.put("materialCode", list.get(i).get("MATERIALCODE")); + jsonObject.put("materialGroup", list.get(i).get("MATERIALGROUP")); + jsonObject.put("batchQuantity", list.get(i).get("BATCHQUANTITY")); + jsonObject.put("quantityUnit", list.get(i).get("QUANTITYUNIT")); + jsonObject.put("deliveryDate", list.get(i).get("DELIVERYDATE")); + jsonObject.put("specifications", list.get(i).get("BATCHNUMBER")); + jsonObject.put("LOCATIONNAME", list.get(i).get("LOCATIONNAME")); + jsonObject.put("inspector", "检验室(原材仓)"); + + String erpFactory = list.get(i).get("BATCHQUANTITY") == null ? "" : list.get(i).get("BATCHQUANTITY").toString(); + String factoryArea = ""; + if("103".equals(erpFactory)) { + factoryArea = "tc"; + }else if("105".equals(erpFactory)) { + factoryArea = "cq"; + }else if("106".equals(erpFactory)){ + factoryArea = "dg"; + }else { + factoryArea = "sh"; + } + // 入库单号和厂区 + String receiveRequestName = list.get(i).get("RECEIVEREQUESTNAME") == null ? "" : list.get(i).get("RECEIVEREQUESTNAME").toString(); + jsonObject.put("transferOrderNumber", receiveRequestName); + jsonObject.put("factoryArea", factoryArea); + + /** + * 增加供应商编码和供应商名称 + * 2025-05-12 + */ + //供应商编码 + jsonObject.put("supplierCode", list.get(i).get("SUPPLIERCODE")); + //供应商名称 + jsonObject.put("supplierName", list.get(i).get("SUPPLIERNAME")); + + String lots = list.get(i).get("LOTS") == null ? "" : list.get(i).get("LOTS").toString(); + String[] split = lots.split("\\;"); + JSONArray jsonArray2 = new JSONArray (); + for (int j = 0; j < split.length; j++) { + jsonArray2.add(split[j]); + } + jsonObject.put("lots", jsonArray2); + jsonArray.add(jsonObject); + } + String makePreIQCInfoSendJson = jsonArray.toString(); + String httpPost = NCHttpUtil.httpPost(baseUrl + "/iqc/select/number", makePreIQCInfoSendJson); + org.json.JSONObject jsonObject = new org.json.JSONObject(httpPost); + String code = jsonObject.getString("code"); + if (!"00000".equals(code)) { + + } +// String msg = jsonObject.getString("msg"); + //JSONObject object = (JSONObject) jsonObject.get("data"); + Thread t = new Thread(new Runnable(){ + public void run(){ + // run方法具体重写 + UUID uuid = UUID.randomUUID(); + ErpMessageLog erplog = new ErpMessageLog(); + erplog.setEventUser(""); + erplog.setServerName("WmsToQMS"); + erplog.setEventName("PreIQCInfoSend"); + erplog.setId(uuid.toString()); + erplog.setInterfaceTime(ConvertUtil.getCurrTime("yyyy-MM-dd HH:mm:ss")); + erplog.setMessageId(UUID.randomUUID().toString()); + erplog.setSendMsg(makePreIQCInfoSendJson); + erplog.setReturnMsg2(httpPost.toString()); + erplog.setResultCode(code); + MessageLogUtil.writeMessageLog(erplog); + }}); + t.start(); + return code; + + } } 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 429beca..41561ce 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 @@ -5,12 +5,17 @@ import com.alibaba.fastjson.JSONObject; import com.cim.idm.data.AuditBox; import com.cim.idm.data.ErpMessageLog; import com.cim.idm.framework.IDMFrameServiceProxy; +import com.cim.idm.framework.data.EventInfo; import com.cim.idm.framework.util.sys.SystemPropHelper; import com.cim.idm.framework.util.time.TimeStampUtil; import com.cim.idm.util.MessageLogUtil; import com.cim.idm.util.ToSAPMessageUtil; import com.cim.idm.wmsextend.generic.errorHandler.CustomException; +import com.cim.idm.wmsextend.generic.util.EventInfoUtil; +import com.cim.idm.wmspackage.materialpacking.MaterialPackingServiceProxy; +import com.cim.idm.wmspackage.materialpacking.management.data.MaterialPacking; import com.cim.idm.wmspackage.materialpacking.management.data.MaterialPackingKey; +import com.cim.idm.wmspackage.materialpacking.management.info.SetEventInfo; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -29,6 +34,8 @@ public class ToSAPServiceImpl { @Autowired private ToSAPMessageUtil toSAPMessageUtil; + @Autowired + private QMSServiceImpl qmsServiceImpl; public String PurStockIn(String receiveRequestName, String siteName, String user, @@ -6271,4 +6278,194 @@ public class ToSAPServiceImpl { bodyJSonData.put("BUDAT", payMentDate); return MainData.toJSONString(); } + + /** + * 到货单入库调用SAP过账 + * @param deliveryName 到货单号 + * @param siteName 工厂 + * @param user 登录用户 + * @param commitDate 过账时间 + * @param opCode + * @return + * @throws Exception + */ + public String DeliveryToSAPMontage(String deliveryName, String siteName, String user,String commitDate, String opCode, List saleList) throws Exception { + EventInfo eventInfo = new EventInfoUtil().makeEventInfo("NormalStockInDelivery", user, "NormalStockInDelivery", "", ""); + String rcode; + String undoId = ""; + String rmsg = null; + //调用SAP接口的报文 + String sendData = ""; + //SAP返回报文 + String sapreturn = ""; + List materialPackingKeyList = new ArrayList<>(); + //依据采购订单,查询待入库的物料(MATERIALPACKING) + String querySql = " \n" + + "\tSELECT\n" + + " D.DELIVERYSTATE,\n" + + " DR.DELIVERYNAME,\n" + + " DR.DELIVERYNUM,\n" + + " DR.RECEIVEREQUESTNAME,\n" + + " DR.RECEIVEREQUESTDETAILNAME,\n" + + " DR.MATERIALSPECNAME,\n" + + " P.MATERIALPACKINGNAME,\n" + + " P.ERPLOCATION,\n" + + " P.ERPFACTORY,\n" + + " P.SUPPLIERNAME,\n" + + " P.UNIT,\n" + + "\t\tP.FQTY,\n" + + " P.FUNIT,\n" + + " P.REMARK,\n" + + "\t\tBF.IQCFLAG,\n" + + " P.OQARESULT,\n" + + "\t\tR.STOCKORGNO,\n" + + "\t\tR.RECEIVEREQUESTTYPE\n" + + "FROM\n" + + " MATERIALPACKING P \n" + + "LEFT JOIN BS_MATERIALFACTORY BF ON BF.MATERIALSPECNAME = P.MATERIALSPECNAME AND BF.ERPFACTORY = P.ERPFACTORY\n" + + "LEFT JOIN MATERIALRECEIVEREQUESTDETAIL RD ON P.SITENAME = RD.SITENAME \n" + + "LEFT JOIN MATERIALRECEIVEREQUEST R ON RD.RECEIVEREQUESTNAME = R.RECEIVEREQUESTNAME AND RD.SITENAME = R.SITENAME\n" + + "LEFT JOIN MATERIALDELIVERYRECEIVE DR ON R.RECEIVEREQUESTNAME=DR.RECEIVEREQUESTNAME \n" + + "LEFT JOIN MATERIALDELIVERY D ON DR.DELIVERYNAME = D.DELIVERYNAME\n" + + "WHERE\n" + + " D.SITENAME =:SITENAME\n" + + " AND D.DELIVERYNAME =:DELIVERYNAME\n" + + " AND D.DELIVERYSTATE = '01'\n" + + "\t\tAND DR.MATERIALSPECNAME=RD.MATERIALSPECNAME\n" + + "\t\tAND RD.RECEIVEREQUESTDETAILNAME=DR.RECEIVEREQUESTDETAILNAME\n" + + "\t\tAND P.RECEIVEREQUESTNAME = DR.DELIVERYNAME \n" + + "\t\tAND P.MATERIALSPECNAME = DR.MATERIALSPECNAME "; + Map hashMap = new HashMap(); + hashMap.put("DELIVERYNAME", deliveryName); + hashMap.put("SITENAME", siteName); + List> queryForList = IDMFrameServiceProxy.getSqlTemplate().queryForList(querySql, hashMap); + List> receiveBoxsQty = new ArrayList<>(); //基于标签收包的维度的数量 + try { + Map bodyData = new HashMap<>(); + List> itemData = new ArrayList<>(); + + for (Map mm : queryForList) { + + //UMWRK 收货工厂 + //LGORT 发货库存地点 + //UMLOG 收货库存地点 + //MATNR 发货物料号 + //UMMAT 收货物料 + Map item = new HashMap<>(); + item.put("MATNR", mm.get("MATERIALSPECNAME")); + item.put("LGORT", mm.get("ERPLOCATION")); + //item.put("UMWRK", mm.get("ERPFACTORY")); + item.put("WERKS", mm.get("ERPFACTORY")); + item.put("BWART","101"); + item.put("LIFNR", mm.get("SUPPLIERNAME")); + item.put("MENGE", mm.get("MATERIALQUANTITY")); + item.put("MEINS", mm.get("UNIT")); + item.put("BPMNG", mm.get("FQTY"));//采购价格单位数量 + item.put("BPRME", mm.get("FUNIT"));//采购价格单位 + + item.put("EBELN", mm.get("RECEIVEREQUESTNAME")); + item.put("EBELP", mm.get("RECEIVEREQUESTDETAILNAME")); + item.put("SGTXT", mm.get("REMARK")); + String insmk = ""; + if("Y".equals((String)mm.get("IQCFLAG"))) { + insmk = "2"; + } + if("NG".equals((String)mm.get("OQARESULT"))) { + insmk = "3"; + } +// String insmk = StringUtils.equals(mm.get("OQARESULTSTATE").toString(),"END")?"":"X"; + item.put("INSMK", insmk); + itemData.add(item); + //存储条码,更新UNDOID用 + MaterialPackingKey materialPackingKey = new MaterialPackingKey(siteName, mm.get("MATERIALPACKINGNAME").toString()); + materialPackingKeyList.add(materialPackingKey); + } + + sendData = ToSAPMessageUtil.mm067(user, bodyData, itemData, commitDate); + + sapreturn = toSAPMessageUtil.sendHttpPost(toSAPMessageUtil.materialChangeLocationUrl,"",sendData); + 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(); + //将log写到表里 + ErpMessageLog erplog = new ErpMessageLog(); + erplog.setEventUser(""); + erplog.setServerName("WmsToErp"); + erplog.setEventName("PurStockIn"); + erplog.setInterfaceTime(TimeStampUtil.getCurrentTime(TimeStampUtil.FORMAT_DEFAULT)); + erplog.setMessageId(UUID.randomUUID().toString()); + erplog.setSendMsg(sendData); + erplog.setReturnMsg2(sapreturn); + erplog.setResultCode(rcode); + MessageLogUtil.writeMessageLog(erplog); + if ("S".equals(rcode)) { + undoId = returnJsonObject.get("MBLNR").toString()+"_"+returnJsonObject.get("MJAHR").toString();//将物料凭证号与凭证年度拼在一起 + }else { + throw new RuntimeException("SAP返回" + rmsg); + } + } catch (Exception e) { + log.info(e.getMessage(), e); + throw new RuntimeException("SAP返回" + rmsg); + } + + if(!saleList.contains(queryForList.get(0).get("RECEIVEREQUESTTYPE").toString())) { + try { + // 调用 QMS + //qMSServiceImpl.PreIQCInfoSend(receiveRequestName, "SDK",opCode, erpFactory); + qmsServiceImpl.sendToIQCByDataList(opCode, queryForList); + } catch (CustomException e) { + e.printStackTrace(); + throw new RuntimeException("QMS返回" + e.toString()); + } + } + // 更新入库凭证,更新库存状态 + if (materialPackingKeyList.size() > 0){ + SetEventInfo setEventInfo = new SetEventInfo(); + Map updateMap = new HashMap<>(); + updateMap.put("unDoID", undoId); + updateMap.put("packingState","Released"); + updateMap.put("stockState","Stocked"); + updateMap.put("messageId",opCode); + updateMap.put("shipRequestName", ""); + updateMap.put("shipRequestDetailName", ""); + setEventInfo.setUserColumns(updateMap); + MaterialPackingServiceProxy.getMaterialPackingService().setEvent(materialPackingKeyList, eventInfo, setEventInfo); + } + //插入凭证信息 + SaveUnDoInfo(deliveryName,commitDate); + return undoId; + } + + /** + * 接收ERP返回消息更新WMS凭证 + * @param materialPackingName + */ + public void SaveUnDoInfo(String materialPackingName,String commitDate) { + + String insertUnDOMaterialPackingInfo = "insert into BS_MATERIALPACKINGUNDOINFO (unDoID,preundoid,UNDODETAILNAME,undoidstate,UNDOIDDATE," + + "SITENAME, MATERIALPACKINGNAME, MATERIALPACKINGTYPE, CONTENTMATERIALTYPE," + + "MATERIALTYPE, MATERIALSPECNAME, SUPERMATERIALPACKINGNAME, PACKINGGRADE, SUBPACKINGQUANTITY, MATERIALCREATEQUANTITY," + + "MATERIALQUANTITY, PACKINGSTATE, OLDPACKINGSTATE, STOCKSTATE, OLDSTOCKSTATE, HOLDSTATE, AREANAME, LOCATIONNAME," + + "DURABLENAME, MATERIALPROCESSGROUPNAME, LASTEVENTNAME, LASTEVENTTIMEKEY, LASTEVENTTIME, LASTEVENTUSER," + + "LASTEVENTCOMMENT, CREATETIME, CREATEUSER, RECEIVEREQUESTNAME, RECEIVEREQUESTDETAILNAME," + + "MAKEDATE, RECEIVEACTNO, STOCKINTYPE, RECEIVETIME, RECEIVEUSER, SHIPREQUESTNAME, SHIPREQUESTDETAILNAME, SHIPTIME," + + "SHIPUSER, REASONCODETYPE, OQARESULTSTATE, OQARESULT, ERPLOCATION, ERPFACTORY, REASONCODE, CHARGE, SUPPLIERNAME,ETCSTATE,ERPEVENTTIME,NPFLAG)" + + "select unDoID,'' as preundoid,UNDODETAILNAME,'Completed' as undoidstate,:commitDate AS UNDOIDDATE," // + + "SITENAME, MATERIALPACKINGNAME, MATERIALPACKINGTYPE, CONTENTMATERIALTYPE," + + "MATERIALTYPE, MATERIALSPECNAME, SUPERMATERIALPACKINGNAME, PACKINGGRADE, SUBPACKINGQUANTITY, MATERIALCREATEQUANTITY," + + "MATERIALQUANTITY, PACKINGSTATE, OLDPACKINGSTATE, STOCKSTATE, OLDSTOCKSTATE, HOLDSTATE, AREANAME, LOCATIONNAME," + + "DURABLENAME, MATERIALPROCESSGROUPNAME, LASTEVENTNAME, LASTEVENTTIMEKEY, LASTEVENTTIME, LASTEVENTUSER," + + "LASTEVENTCOMMENT, CREATETIME, CREATEUSER, RECEIVEREQUESTNAME, RECEIVEREQUESTDETAILNAME," + + "MAKEDATE, RECEIVEACTNO, STOCKINTYPE, RECEIVETIME, RECEIVEUSER, SHIPREQUESTNAME, SHIPREQUESTDETAILNAME, SHIPTIME," + + "SHIPUSER, REASONCODETYPE, OQARESULTSTATE, OQARESULT, ERPLOCATION, ERPFACTORY, REASONCODE, CHARGE, SUPPLIERNAME,ETCSTATE,ERPEVENTTIME,NPFLAG" + + " from MATERIALPACKING " + + " where MATERIALPACKINGNAME=:MATERIALPACKINGNAME "; + + Map bindMap_insert = new HashMap(); + bindMap_insert.put("MATERIALPACKINGNAME", materialPackingName); + bindMap_insert.put("commitDate", commitDate); + IDMFrameServiceProxy.getSqlTemplate().update(insertUnDOMaterialPackingInfo, bindMap_insert); + } } diff --git a/zi-wms-pda/src/main/java/com/cim/idm/controller/DeliveryController.java b/zi-wms-pda/src/main/java/com/cim/idm/controller/DeliveryController.java index 0c5f058..b87feff 100644 --- a/zi-wms-pda/src/main/java/com/cim/idm/controller/DeliveryController.java +++ b/zi-wms-pda/src/main/java/com/cim/idm/controller/DeliveryController.java @@ -137,4 +137,44 @@ public class DeliveryController { } return AjaxResult.me().setErrorCode(-1).setMessage("删除失败"); } + + /** + * 2025-05-14 + * 获取到货单入库详情 + */ + @PostMapping(value = "/getMaterialDeliveryDetailList") + public AjaxResult GetMaterialDeliveryDetailList(@RequestBody JSONObject in) { + Map params = (Map) in.get("params"); + // siteName + StoreDetailDto storeDetailDto = new StoreDetailDto(); + storeDetailDto.setSiteName(params.get("SITENAME")); + storeDetailDto.setDocumentName(params.get("RECEIVEREQUESTNAME")); + // 单据名称集合 + List nameList = new ArrayList<>(); + String deliveryName = null; + MaterialDelivery byKey = deliveryService.getByKey(storeDetailDto); + // 到货单 + if (Objects.nonNull(byKey)) { + deliveryName = byKey.getDeliveryName(); + // 到库单(找出该单据下的所有的采购单) + nameList = deliveryService.getRelByDelivery(storeDetailDto) + .stream().map(MaterialDeliveryReceive::getReceiveRequestName).distinct().collect(Collectors.toList()); + } + // 异常 + if (nameList.isEmpty()) { + throw new GlobalException("不存在该单据"); + } + + // 获取采购单明细及批次 + String deliveryType = params.get("deliveryType"); + if (deliveryType.equals(DeliveryTypeEnums.BATCH.getCode())) { + // 批次 + return AjaxResult.me().setSuccess(true).setResultObj( + deliveryService.getStoreDetail(storeDetailDto.getDocumentName(), storeDetailDto.getSiteName(), nameList, deliveryName)); + } else { + // 辅材 + return AjaxResult.me().setSuccess(true).setResultObj( + deliveryService.getMaterialDetail(storeDetailDto.getDocumentName(), storeDetailDto.getSiteName(), nameList, deliveryName)); + } + } } diff --git a/zi-wms-pda/src/main/java/com/cim/idm/controller/MaterialReceiveActController.java b/zi-wms-pda/src/main/java/com/cim/idm/controller/MaterialReceiveActController.java index db661f8..d63697e 100644 --- a/zi-wms-pda/src/main/java/com/cim/idm/controller/MaterialReceiveActController.java +++ b/zi-wms-pda/src/main/java/com/cim/idm/controller/MaterialReceiveActController.java @@ -619,4 +619,43 @@ public class MaterialReceiveActController { } return billCode; } + + /** + * 到货单入库过账 + * 2025-05-14 + * @param in receiveRequestName到货单号 + * @return 返回信息 + */ + @RequestMapping(value = "/commitDeliveryStockInToSAP", method = RequestMethod.POST) + public AjaxResult CommitDeliveryStockInToSAP(@RequestBody JSONObject in ) { + try { + TrackOutBoDto trackOutBoDto = JSON.toJavaObject(in, TrackOutBoDto.class); + StoreDetailDto storeDetailDto = new StoreDetailDto(); + storeDetailDto.setDocumentName(trackOutBoDto.getReceiveRequestName()); + storeDetailDto.setSiteName(trackOutBoDto.getSiteName()); + MaterialDelivery materialDelivery = deliveryService.getByKey(storeDetailDto); + if (Objects.nonNull(materialDelivery)) { + String user = trackOutBoDto.getUser(); + String opCode = trackOutBoDto.getOpCode(); + String commitDate = trackOutBoDto.getCommitDate(); + String siteName = trackOutBoDto.getSiteName(); + toSAPServiceImpl.DeliveryToSAPMontage(materialDelivery.getDeliveryName(), siteName, user, commitDate,opCode,ReceiveTypeEnums.getsaleReturn()); + // 到货单据更新状态 + if (Objects.nonNull(materialDelivery.getDeliveryName())) { + DeliveryEditDto deliveryEditDto = new DeliveryEditDto(); + deliveryEditDto.setDeliveryName(trackOutBoDto.getReceiveRequestName()); + deliveryEditDto.setSiteName(trackOutBoDto.getSiteName()); + // @TODO 完成状态下,更新为 DeliveryStateEnums.FINISH + deliveryEditDto.setDeliveryState(DeliveryStateEnums.DOING.getCode()); + deliveryService.editDelivery(deliveryEditDto); + } + } else { + return AjaxResult.me().setSuccess(false).setMessage("到货单:" + trackOutBoDto.getReceiveRequestName() + "不存在").setErrorCode(400); + } + } catch (Exception e) { + e.printStackTrace(); + return AjaxResult.me().setSuccess(false).setMessage(e.toString()); + } + return AjaxResult.me().setSuccess(true); + } } diff --git a/zi-wms-pda/src/main/resources/com/cim/idm/dao/DeliveryDao.xml b/zi-wms-pda/src/main/resources/com/cim/idm/dao/DeliveryDao.xml index e3507a0..da8fc28 100644 --- a/zi-wms-pda/src/main/resources/com/cim/idm/dao/DeliveryDao.xml +++ b/zi-wms-pda/src/main/resources/com/cim/idm/dao/DeliveryDao.xml @@ -285,7 +285,7 @@