From 8d1fa52a6637a17652de782d4ba40676d44f5996 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=B8=85?= <3115919733@qq.com> Date: Tue, 27 May 2025 15:22:58 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E8=BD=AC=E5=B7=A5=E5=8D=95-=E6=B2=A1?= =?UTF-8?q?=E5=81=9A=E5=AE=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../idm/service/impl/ToSAPServiceImpl.java | 123 +++++++++++++++++- .../idm/controller/MESToWMSController.java | 2 +- .../idm/service/Impl/MESToWMSServiceImpl.java | 63 +++++++-- .../com/cim/idm/service/MESToWMSService.java | 7 + 4 files changed, 181 insertions(+), 14 deletions(-) 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 eab96bb..fee5501 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 @@ -6472,7 +6472,8 @@ public class ToSAPServiceImpl { } - public String StockOutByOrder(List materialPackingList, String mes) {{ + public String StockOutByOrder(List materialPackingList, String mes, + String bwart) {{ String rcode; String undoId = ""; @@ -6535,7 +6536,7 @@ public class ToSAPServiceImpl { // //GRUND 移动原因 (201,202回传) // item.put("GRUND", mm.get("SHIPREQUESTDETAILTYPE")); - item.put("BWART", "261"); + item.put("BWART", bwart); //ZLLORDER 自定义领料单号 // item.put("ZLLORDER", "LL1010250408001"); item.put("ZLLORDER", mm.getZLLORDER()); @@ -6583,6 +6584,124 @@ public class ToSAPServiceImpl { return undoId; } } + + + /** + * 转工单-新 + * @param materialPackingList + * @param mes + * @param bwart + * @return + */ + public String StockOutByOrder_new(List> mapList, String mes, + String bwart) { + + 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", mapList); + 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 (mapList == null || mapList.size() < 1) { + throw new RuntimeException("不存在需要发送的数据"); + } + for (Map mm : mapList) { + mm.put("BWART", bwart); + 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()); + item.put("BWART", bwart); + //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);*/ + } + + System.out.println(mapList); + /*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 null; + } + /** * 成品入库 * 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 1e64e3a..f6cd056 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 @@ -34,7 +34,7 @@ public class MESToWMSController { public AjaxResult workOrder_Request(@RequestBody JSONArray in) { log.info("Received work order request: {}", in.toJSONString()); try { - return mesToWMSService.workOrder_Request(in); + return mesToWMSService.workOrder_Request_new(in); } catch (Exception e) { throw new RuntimeException(e); } 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 17498ba..6edf335 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 @@ -660,6 +660,45 @@ public class MESToWMSServiceImpl implements MESToWMSService { return result; } + @Override + @Transactional + public AjaxResult workOrder_Request_new(JSONArray in) throws Exception { + log.info("Received work order request: {}", in.toJSONString()); + List> mapList = new ArrayList<>(); + for (int i = 0; i < in.size(); i++) { + JSONObject jsonObject = in.getJSONObject(i); + Map map = new HashMap<>(); + // 料号 + String materialSpecname = jsonObject.getString("materialSpecname"); + // 组织 + String WERKS = jsonObject.getString("WERKS"); + // 仓库 + String LGORT = jsonObject.getString("LGORT"); + // 数量 + String MENGE = jsonObject.getString("MENGE"); + // 单位 + String MEINS = jsonObject.getString("MEINS"); + // 自定义领料单号 + String ZLLORDER = jsonObject.getString("ZLLORDER"); + // 自定义领料单行号 + String ZLLITEM = jsonObject.getString("ZLLITEM"); + // 工单 + String AUFNR = jsonObject.getString("AUFNR"); + + map.put("MATNR", materialSpecname); + map.put("WERKS", WERKS); + map.put("LGORT", LGORT); + map.put("MENGE", MENGE); + map.put("MEINS", MEINS); + map.put("ZLLORDER", ZLLORDER); + map.put("ZLLITEM", ZLLITEM); + map.put("AUFNR", AUFNR); + mapList.add(map); + } + // 出库 + String undoid = toSAPService.StockOutByOrder_new(mapList, "MES", "262"); + return AjaxResult.me().setResultObj(null).setSuccess(true).setErrorCode(200).setMessage("执行成功,物料凭证 " + undoid); + } /** * 接收MES请求工单请求 * @@ -701,6 +740,15 @@ public class MESToWMSServiceImpl implements MESToWMSService { String s = materialOutByMES(materialSpecnameList, chargeList); //调用入库方法 String s1 = materialIntoByMES(materialSpecnameList, chargeList,wo); + if (StringUtils.isEmpty(s1)) { + // 冲销 + String undo = invoiceService.cancelShipInter(s, "MES"); + if (undo == null || undo.isEmpty()) { + throw new GlobalException("下发mes失败后冲销失败!"); + } else { + throw new GlobalException("发送到mes失败!"); + } + } String message = "工单转换成功 物料凭证 {}"; return AjaxResult.me().setResultObj(null).setSuccess(true).setErrorCode(200).setMessage("执行成功,物料凭证 " + s1); } @@ -716,17 +764,9 @@ public class MESToWMSServiceImpl implements MESToWMSService { //出库过账 String undoid = toSAPService.StockOutByOrder( materialPackingList, - "MES" + "MES", + "262" ); - if (undoid != null) { - // 冲销 - String undo = invoiceService.cancelShipInter(undoid, "MES"); - if (undo == null || undo.isEmpty()) { - throw new GlobalException("下发mes失败后冲销失败!"); - } else { - throw new GlobalException("发送到mes失败!"); - } - } //更新MDC表状态 mesToWmsDao.updateMDCFlag(materialSpecnameList, chargeList, "T"); return undoid; @@ -743,7 +783,8 @@ public class MESToWMSServiceImpl implements MESToWMSService { //入库过账 String undoid = toSAPService.StockOutByOrder( materialPackingListByRK, - "MES" + "MES", + "261" ); mesToWmsDao.updateMDCFlag(materialSpecnameList, chargeList, "S"); return undoid; 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 fbccc71..72ab4e2 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 @@ -35,6 +35,13 @@ public interface MESToWMSService { */ AjaxResult shipByMES(JSONArray in) throws Exception; + /** + * 接收MES请求工单请求 + * @param in + * @return + */ + AjaxResult workOrder_Request_new(JSONArray in) throws Exception; + /** * 接收MES请求工单请求 * @param in From 5854ed364fdcbdaa1dd2599dfcc9477c0997526d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=B8=85?= <3115919733@qq.com> Date: Tue, 27 May 2025 17:18:11 +0800 Subject: [PATCH 2/4] =?UTF-8?q?E=E5=BA=93=E5=AD=98=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cim/idm/service/Impl/CostCenterServiceImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/zi-wms-pda/src/main/java/com/cim/idm/service/Impl/CostCenterServiceImpl.java b/zi-wms-pda/src/main/java/com/cim/idm/service/Impl/CostCenterServiceImpl.java index 16131d5..242d733 100644 --- a/zi-wms-pda/src/main/java/com/cim/idm/service/Impl/CostCenterServiceImpl.java +++ b/zi-wms-pda/src/main/java/com/cim/idm/service/Impl/CostCenterServiceImpl.java @@ -110,7 +110,8 @@ public class CostCenterServiceImpl implements CostCenterService { } String status = ""; // 选中数据中的业助是否全部与借用人相同,相同是 true - boolean exist = boxList.stream().allMatch(item -> career_ASSISTANCE.equals(item.getCAREER_ASSISTANCE())); + boolean exist = boxList.stream().allMatch(item -> career_ASSISTANCE.equals(item.getCAREER_ASSISTANCE()) || + StringUtils.isEmpty(item.getCAREER_ASSISTANCE())); if (exist) { status = "1"; // 完成 } else { From 2030f4c39044696f060d74ce4d0836c70121dcf2 Mon Sep 17 00:00:00 2001 From: 18110972313 <780768673@qq.com> Date: Tue, 27 May 2025 17:59:16 +0800 Subject: [PATCH 3/4] =?UTF-8?q?update=20=E4=B8=B4=E6=97=B6=E8=BF=87?= =?UTF-8?q?=E8=B4=A6(=E8=A1=A5=E8=BF=87=E8=B4=A6)=EF=BC=8C=E5=87=BA?= =?UTF-8?q?=E5=BA=93=E8=BF=87=E8=B4=A6=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cim/idm/controller/SaleOutController.java | 73 ++ .../idm/service/Impl/InvoiceServiceImpl.java | 646 ++++++++++++++++++ 2 files changed, 719 insertions(+) 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 87d9f2a..96b6901 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 @@ -1183,4 +1183,77 @@ public class SaleOutController { } return AjaxResult.me().setSuccess(true).setErrorCode(200); } + + + /** + * 临时出库(补过账) + * 2025-05-27 + * @param in + * @return + * @throws Exception + */ + @Transactional + @RequestMapping(value = "/completeShipRequestRepairStockOut", method = RequestMethod.POST) + public AjaxResult CompleteShipRequestRepairStockOut(@RequestBody JSONObject in ) throws Exception{ + StockOutDto ms = JSON.toJavaObject(in, StockOutDto.class); + String shipRequestName = ms.getShipRequestName(); + String siteName = "SDK"; + String user = ms.getUser(); + String commitDate = ms.getCommitDate(); + String opCode = ms.getOpCode(); + String reMark = ms.getReMark(); + List boxList = new ArrayList<>(); + + Map hashMap = new HashMap (); + hashMap.put("SHIPREQUESTNAME", shipRequestName); + 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.MATERIALQUANTITY > 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) + { + for(int i=0;i> queryForList = IDMFrameServiceProxy.getSqlTemplate().queryForList(sql, hashMap); + if (queryForList != null && queryForList.size() > 0) { + String type = queryForList.get(0).get("SHIPREQUESTTYPE").toString(); + shipRequestType = type; + } else { + return AjaxResult.me().setSuccess(false).setMessage("找不到出库单据" + shipRequestName); + } + InvoiceServiceImpl invoiceServiceImpl=new InvoiceServiceImpl(); +// sendERPStockOut=invoiceServiceImpl.SendERPStockOut20240802(shipRequestName, siteName, user, boxList,commitDate,opCode); + sendERPStockOut=invoiceServiceImpl.RepairStockUpOutSendSAPOrMES(shipRequestName, siteName, user, boxList,commitDate,opCode); +// sendERPStockOut="1"; + if (sendERPStockOut == null || "".equals(sendERPStockOut)) { + return AjaxResult.me().setSuccess(false).setMessage("过账失败"); + } + return AjaxResult.me().setSuccess(true).setErrorCode(200); + } } diff --git a/zi-wms-pda/src/main/java/com/cim/idm/service/Impl/InvoiceServiceImpl.java b/zi-wms-pda/src/main/java/com/cim/idm/service/Impl/InvoiceServiceImpl.java index 642f678..9c4261e 100644 --- a/zi-wms-pda/src/main/java/com/cim/idm/service/Impl/InvoiceServiceImpl.java +++ b/zi-wms-pda/src/main/java/com/cim/idm/service/Impl/InvoiceServiceImpl.java @@ -3804,4 +3804,650 @@ public class InvoiceServiceImpl implements InvoiceService { } return message; } + + @Transactional + public String RepairStockUpOutSendSAPOrMES(String shipRequestName, String siteName, String eventUser, + List list , String commitDate, String opCode) throws Exception { + //判断单据类型调用不同的NC接口 + String sql = "SELECT m.SHIPREQUESTTYPE,m.SHIPREQUESTDETAILTYPE FROM MATERIALSHIPREQUEST m WHERE m.SHIPREQUESTNAME = :SHIPREQUESTNAME"; + Map hashMap = new HashMap (); + hashMap.put("SHIPREQUESTNAME", shipRequestName); + List materialPackingKeyList = new ArrayList<> (); + List arrayList = new ArrayList (); + List> queryForList = IDMFrameServiceProxy.getSqlTemplate().queryForList(sql, hashMap); + String shipRequestType = queryForList.get(0).get("SHIPREQUESTTYPE").toString(); + String detailype = queryForList.get(0).get("SHIPREQUESTDETAILTYPE").toString(); + if ("4C".equals(shipRequestType)) { + String sql222 = "SELECT SUM(m.REQUESTQUANTITY - m.ASSIGNEDQUANTITY) QTY,MATERIALSPECNAME FROM MATERIALSHIPREQUESTDETAIL m WHERE m.SHIPREQUESTNAME = :SHIPREQUESTNAME GROUP BY MATERIALSPECNAME"; + List> queryForList2 = IDMFrameServiceProxy.getSqlTemplate().queryForList(sql222, hashMap); + for (int i = 0; i < queryForList2.size(); i++) { + String string = queryForList2.get(i).get("QTY").toString(); + String MATERIALSPECNAME = queryForList2.get(i).get("MATERIALSPECNAME").toString(); + BigDecimal bigDecimal = new BigDecimal(string); + if (bigDecimal.compareTo(BigDecimal.ZERO) < 0 ) { + throw new CustomException( MATERIALSPECNAME + "销售不允许超发"); + } + } + } + //备份过账条码表的信息,并删除 + String bfSql = "INSERT\r\n" + + " INTO\r\n" + + " MATERIALPACKINGSUBHISTORY T (T.MATERIALPACKINGNAME,\r\n" + + " T.RECEIVEREQUESTNAME,\r\n" + + " T.RECEIVEREQUESTDETAILNAME,\r\n" + + " T.QTY)\r\n" + + "SELECT\r\n" + + " M.MATERIALPACKINGNAME,\r\n" + + " M.RECEIVEREQUESTNAME,\r\n" + + " M.RECEIVEREQUESTDETAILNAME,\r\n" + + " M.QTY\r\n" + + "FROM\r\n" + + " MATERIALPACKINGSUB M\r\n" + + "WHERE\r\n" + + " M.RECEIVEREQUESTNAME = :SHIPREQUESTNAME"; + String scSql = "DELETE FROM MATERIALPACKINGSUB WHERE RECEIVEREQUESTNAME = :SHIPREQUESTNAME"; + IDMFrameServiceProxy.getSqlTemplate().update(bfSql, hashMap); + IDMFrameServiceProxy.getSqlTemplate().update(scSql, hashMap); + EventInfoUtil eventInfoUtil = new EventInfoUtil(); + EventInfo makeEventInfo = eventInfoUtil.makeEventInfo("CompletedShipRequest", eventUser, "CompletedShipRequest"); + //循环过账批次 + for (int i = 0; i < list.size(); ++ i) { + String materialPackingName = list.get(i).getMaterialPackingName(); + String sdk_ID = list.get(i).getSDK_ID(); + String phase = list.get(i).getPHASE(); + String materialSpecName = list.get(i).getMaterialSpecName(); + // float materialQuantity = list.get(i).getMaterialQuantity(); + //重新获取下数量,通过sql查询取数 + String SLsQL = "SELECT m.MATERIALPACKINGNAME,m.MATERIALQUANTITY," + + "DECODE(NVL(m.MATERIALQUANTITY2,0), 0 ,m.MATERIALQUANTITY,m.MATERIALQUANTITY2) MATERIALQUANTITY2 FROM MATERIALPACKING m" + + " WHERE m.SHIPREQUESTNAME = :SHIPRQEUESTNAME AND MATERIALPACKINGNAME = :MATERIALPACKINGNAME "; + Map hashMap2 = new HashMap (); + hashMap2.put("SHIPRQEUESTNAME", shipRequestName); + hashMap2.put("MATERIALPACKINGNAME", materialPackingName); + String materialQuantity2 = list.get(i).getMaterialQuantity2() + ""; + List> queryForList3 = IDMFrameServiceProxy.getSqlTemplate().queryForList(SLsQL, hashMap2); + if (queryForList3 != null && queryForList3.size() > 0) { + materialQuantity2 = queryForList3.get(0).get("MATERIALQUANTITY2").toString(); + } else { + throw new CustomException("单据" + shipRequestName + "库存" + materialPackingName + "绑定关系不存在"); + } + //循环单据查询过帐表 + String pcSql = "SELECT SHIPREQUESTNAME, SHIPREQUESTDETAILNAME,\r\n" + + " m.MATERIALSPECNAME ,\r\n" + + " m.PHASE ,\r\n" + + " m.SDK_ID ,\r\n" + + " m.REQUESTQUANTITY ,\r\n" + + " m.ASSIGNEDQUANTITY ,\r\n" + + " (m.REQUESTQUANTITY - nvl(m.SALEOUTQUANTITY, 0) ) SALEOUTQUANTITY\r\n" + + "FROM\r\n" + + " MATERIALSHIPREQUESTDETAIL m\r\n" + + "WHERE\r\n" + + " m.MATERIALSPECNAME = :MATERIALSPECNAME\r\n" + + " AND SHIPREQUESTNAME = :SHIPREQUESTNAME ORDER BY TO_NUMBER(SHIPREQUESTDETAILNAME) ASC "; + hashMap.put("MATERIALSPECNAME", materialSpecName); + hashMap.put("SDK_ID", sdk_ID); + hashMap.put("PHASE", phase); + List> queryForList2 = IDMFrameServiceProxy.getSqlTemplate().queryForList(pcSql, hashMap); + BigDecimal pcQty = new BigDecimal(materialQuantity2);//批次数量 + BigDecimal temp; + for (int j = 0; j < queryForList2.size(); j++) { + String sq = queryForList2.get(j).get("SALEOUTQUANTITY").toString();//剩余发货数量 + String shipRequestDetailName = queryForList2.get(j).get("SHIPREQUESTDETAILNAME").toString();//行项 + BigDecimal saleQty = new BigDecimal(sq);//需要发货数量 + if (pcQty.compareTo(BigDecimal.ZERO) == 0 + || (saleQty.compareTo(BigDecimal.ZERO) == 0 && (j != queryForList2.size() - 1) ) + ) { + continue; + } + int compareTo = saleQty.compareTo(pcQty);//大于等于0则批次全发,小于0则需要拆分 + int compareToZero=saleQty.compareTo(BigDecimal.ZERO); + if (compareTo >= 0) { + untils.fahuoSplit(materialPackingName, shipRequestName, shipRequestDetailName, pcQty); + break; + } else {//需要拆行 + if( (j != queryForList2.size() - 1) && compareToZero>0) {//判断是否是最后一行,不是最后一行就不允许超发,发货数量等于请求数量即拆 + untils.fahuoSplit(materialPackingName, shipRequestName, shipRequestDetailName, saleQty); + pcQty = pcQty.subtract(saleQty); + continue; + } else { + untils.fahuoSplit(materialPackingName, shipRequestName, shipRequestDetailName, pcQty); + break; + } + } + } + materialPackingKeyList.add(materialPackingName); + } + //判断会有多少个仓库发货,不同仓库需要分开走账 + StringBuffer cklx = new StringBuffer(); + cklx.append("SELECT m.MATERIALPACKINGNAME,m.SITENAME FROM MATERIALPACKING m WHERE m.MATERIALPACKINGNAME IN "); + String str = ""; + str += "("; + for (String materialPacking : materialPackingKeyList) { + str += "'" + materialPacking + "',"; + } + str += "'')"; + // 查询MATERIALQUANTITY 与 MATERIALQUANTITY2是否相等,如果相等则未修改数量,不相等则修改数量 + List> packingQueryForList = IDMFrameServiceProxy.getSqlTemplate().queryForList(cklx.toString() + str, hashMap); + + String billCode = ""; + switch (shipRequestType) { + case "NLCC" : //STO调拨出库 + + // 拆条码,查询MATERIALQUANTITY 与 MATERIALQUANTITY2是否相等,如果相等则未修改了数量,不相等则修改了数量 + //如果已修改数量,则进行拆条码 + for (int z = 0; z < packingQueryForList.size(); z++) { + String MATERIALPACKINGNAME = packingQueryForList.get(z).get("MATERIALPACKINGNAME").toString(); + Object[] bindSet = {MATERIALPACKINGNAME}; + String qtysql = "WHERE MATERIALPACKINGNAME = ?"; + List qtyQueryForList = MaterialPackingServiceProxy.getMaterialPackingService().select(qtysql, bindSet); + + String qty = new Double(qtyQueryForList.get(0).getMaterialQuantity()) == null ? "0" : String.valueOf(qtyQueryForList.get(0).getMaterialQuantity()); + + String qty2 = new Double(qtyQueryForList.get(0).getMaterialQuantity2()) == null ? "0" : String.valueOf(qtyQueryForList.get(0).getMaterialQuantity2()); + String materialPackingName = qtyQueryForList.get(0).getMaterialPackingName(); + String charge = qtyQueryForList.get(0).getCharge(); + BigDecimal bigQty = new BigDecimal(qty); + // 已拆数量 + BigDecimal bigQty2 = new BigDecimal(qty2); + + // 如果已拆数量不等于原数量,并且已拆数量为0(未拆分数量) + if(bigQty.compareTo(bigQty2) != 0 && !"0.0".equals(qty2)) { + // 剩余数量 + BigDecimal restQty = bigQty.subtract(bigQty2); + + // 生成新的拆分条码 + String stringBigQty2 = bigQty2.toString(); + String newPalletNo = CodeGenerator.packingGenerateCode(materialPackingName,stringBigQty2,charge); + + // 写入拆分的新条码,更新原数据库 + List boxList = new ArrayList(); +// MaterialPackingKey materialpackingKey = new MaterialPackingKey(); + MaterialPacking materialpackingNew = new MaterialPacking(); +// materialpackingKey.setSiteName("SDK"); +// materialpackingKey.setMaterialPackingName(newPalletNo); +// materialpackingNew.setKey(materialpackingKey); + + // 复制一个当前的原标签数据 + materialpackingNew.setKey(qtyQueryForList.get(0).getKey()); +// MaterialPacking materialpackingNew = qtyQueryForList.get(z); + // 设置新为标签和数量 + materialpackingNew.setMaterialPackingName(newPalletNo); + // bigQty2 转double类型 + materialpackingNew.setMaterialQuantity(bigQty2.doubleValue()); + boxList.add(qtyQueryForList.get(0)); + boxList.add(materialpackingNew); + boolean moveTransformOut = packingChargeSplit(boxList, eventUser); + if (moveTransformOut != true) { + throw new RuntimeException("修改数量拆分失败"); + } + + //记录到拆分表 + String subsql = "SELECT RECEIVEREQUESTDETAILNAME FROM MATERIALPACKINGSUB WHERE RECEIVEREQUESTNAME = :RECEIVEREQUESTNAME AND MATERIALPACKINGNAME = :MATERIALPACKINGNAME\n"; + Map subHashMap = new HashMap(); + subHashMap.put("RECEIVEREQUESTNAME", shipRequestName); + subHashMap.put("MATERIALPACKINGNAME", MATERIALPACKINGNAME); + List> ZKqueryForList = IDMFrameServiceProxy.getSqlTemplate().queryForList(subsql, subHashMap); + String preReceiverequestdetailname = ZKqueryForList.get(0).get("RECEIVEREQUESTDETAILNAME").toString(); + + String shipRequestDetailName = qtyQueryForList.get(0).getShipRequestDetailName() == null ? "" : qtyQueryForList.get(0).getShipRequestDetailName().toString(); + untils.fahuoSplit(newPalletNo, shipRequestName, preReceiverequestdetailname, bigQty2); + + // 原条码扣减拆出的数量,用剩余数量更新原条码,条码不变,数量更新 + SetEventInfo setEventInfo = new SetEventInfo(); + Map pakHashMap = new HashMap<>(); + pakHashMap.put("materialQuantity", restQty.doubleValue()); + pakHashMap.put("materialQuantity2", 0); + pakHashMap.put("shipRequestName", ""); + pakHashMap.put("shipRequestDetailName", ""); + + EventInfo eventInfo = new EventInfoUtil().makeEventInfo("备货出库调拨出拆分条码", eventUser, "拆分条码"); + setEventInfo.setUserColumns(pakHashMap); + MaterialPackingServiceProxy.getMaterialPackingService().setEvent(new MaterialPackingKey( "SDK", MATERIALPACKINGNAME), eventInfo, setEventInfo); + + // 删除被拆分的原条码数据,用拆分出的新条码覆盖,进行后面的过账,现场仓过账只过账已拆分出的数量,剩余数量的原条码不过账 + boolean deletePacking = materialPackingKeyList.remove(MATERIALPACKINGNAME); + if (deletePacking) { + materialPackingKeyList.add(newPalletNo); + } + + } + + } + + makeEventInfo.setEventName("调拨出库"); + makeEventInfo.setEventComment("备货调拨出库"); + billCode=TransferStockOut_NLCC(shipRequestName, "SDK", eventUser,materialPackingKeyList,commitDate); + untils.SaveUnDoInfo_ForSap(materialPackingKeyList, billCode, makeEventInfo); + break; + + case "01"://生产领料 + case "02"://生产补料 + if ("01".equals(shipRequestType)){ + makeEventInfo.setEventName("CompletedShipRequestLL"); + makeEventInfo.setEventComment("CompletedShipRequestLL"); + }else { + makeEventInfo.setEventName("CompletedShipRequestBL"); + makeEventInfo.setEventComment("CompletedShipRequestBL"); + } + + // 判断是否是现场仓 + String IsSql = "SELECT m.ERPRECEIVELOCATION,m.ERPLOCATION,m.ERPRECEIVEFACTORY FROM MATERIALSHIPREQUESTDETAIL m WHERE SHIPREQUESTNAME = :SHIPREQUESTNAME"; + Map bpc=new HashMap<>(); + bpc.put("SHIPREQUESTNAME", shipRequestName); + List> receiveList = IDMFrameServiceProxy.getSqlTemplate().queryForList(IsSql, bpc); + String ERPRECEIVELOCATION = receiveList.get(0).get("ERPRECEIVELOCATION") == null ? "" : receiveList.get(0).get("ERPRECEIVELOCATION").toString(); + String ERPLOCATION = receiveList.get(0).get("ERPLOCATION") == null ? "" : receiveList.get(0).get("ERPLOCATION").toString(); + String ERPRECEIVEFACTORY = receiveList.get(0).get("ERPRECEIVEFACTORY") == null ? "" : receiveList.get(0).get("ERPRECEIVEFACTORY").toString(); + + //判断是否为MES需要二次接收的物料 + /*String sqlc=" SELECT e.ENUMVALUE FROM MES_ENUMDEFVALUE e \r\n" + + " WHERE e.ENUMNAME ='ConfirmReceiveArea'\r\n" + + " AND e.ENUMVALUE in(\r\n" + + " SELECT p.AREANAME FROM MES_PRODUCTREQUEST p \r\n" + + " WHERE p.PRODUCTREQUESTNAME =(SELECT m.RECEIVEPRODUCTIONORDERNUMBER FROM MATERIALSHIPREQUESTDETAIL m \r\n" + + " WHERE m.SHIPREQUESTNAME=:SHIPREQUESTNAME AND RECEIVEPRODUCTIONORDERNUMBER IS NOT NULL AND ROWNUM=1))";*/ + List> src = new ArrayList>(); + String sqlQuery = " SELECT m.RECEIVEPRODUCTIONORDERNUMBER FROM MATERIALSHIPREQUESTDETAIL m " + + " WHERE m.SHIPREQUESTNAME=:SHIPREQUESTNAME AND RECEIVEPRODUCTIONORDERNUMBER IS NOT NULL AND ROWNUM=1"; + List> materialShipRequestDetailList = IDMFrameServiceProxy.getSqlTemplate().queryForList(sqlQuery, bpc); + if (null != materialShipRequestDetailList && !materialShipRequestDetailList.isEmpty()){ + String productRequestName = materialShipRequestDetailList.get(0).get("RECEIVEPRODUCTIONORDERNUMBER") == null ? "" : materialShipRequestDetailList.get(0).get("RECEIVEPRODUCTIONORDERNUMBER").toString().substring(4); + String sqlc = " SELECT e.ENUMVALUE FROM ENUMDEFVALUE@MES_PRODUCTREQUEST e \r\n" + + " WHERE e.ENUMNAME ='ConfirmReceiveArea'\r\n" + + " AND e.ENUMVALUE in(\r\n" + + " SELECT p.AREANAME FROM PRODUCTREQUEST@MES_PRODUCTREQUEST p \r\n" + + " WHERE p.PRODUCTREQUESTNAME =:PRODUCTREQUESTNAME)"; + bpc.put("PRODUCTREQUESTNAME", productRequestName); + src = IDMFrameServiceProxy.getSqlTemplate().queryForList(sqlc, bpc); + } + //MES需要接收,则只抛送数据。 或如果是现场仓,先移到现场仓 + if (src.size()>0){ + billCode="Y"; + String sqlZK=" SELECT\r\n" + + " t.MATERIALSPECNAME,m.MATERIALPACKINGNAME,\r\n" + + " t.ERPFACTORY,\r\n" + + " t.ERPLOCATION,\r\n" + + " m2.SHIPREQUESTDETAILTYPE,\r\n" + + " t.UNIT,\r\n" + + " m1.COSTCENTER,\r\n" + + " m1.SHIPREQUESTNAME,\r\n" + + " m1.SHIPREQUESTDETAILNAME,\r\n" + + " m1.ERPRECEIVELOCATION,\r\n" + + " m1.ERPRECEIVEFACTORY,\r\n" + + " m1.SENDSALESORDER ,m1.SENDSALESORDERDETAILNO,\r\n" + + " CASE WHEN m1.SENDSALESORDER IS NOT NULL THEN 'E' ELSE '' END SOBKZ,\r\n" + + " (\r\n" + + " SELECT\r\n" + + " RECEIVEPRODUCTIONORDERNUMBER\r\n" + + " FROM\r\n" + + " MATERIALSHIPREQUESTDETAIL m5\r\n" + + " WHERE\r\n" + + " m5.SHIPREQUESTNAME =:SHIPREQUESTNAME\r\n" + + " AND m5.MATERIALSPECNAME = t.MATERIALSPECNAME\r\n" + + " ORDER BY\r\n" + + " m5.USEDATE,\r\n" + + " m5.SHIPREQUESTDETAILNAME FETCH FIRST ROW ONLY)RECEIVEPRODUCTIONORDERNUMBER,\r\n" + + " SUM(m.QTY) AS MATERIALQUANTITY\r\n" + + " FROM \r\n" + + " MATERIALPACKINGSUB m\r\n" + + " LEFT JOIN MATERIALPACKING T ON \r\n" + + " m.MATERIALPACKINGNAME = T.MATERIALPACKINGNAME\r\n" + + " AND m.RECEIVEREQUESTNAME = T.SHIPREQUESTNAME\r\n" + + " LEFT JOIN MATERIALSHIPREQUESTDETAIL M1 \r\n" + + " ON \r\n" + + " m.RECEIVEREQUESTNAME = M1.SHIPREQUESTNAME\r\n" + + " AND m.RECEIVEREQUESTDETAILNAME = M1.SHIPREQUESTDETAILNAME\r\n" + + " LEFT JOIN MATERIALSHIPREQUEST M2 \r\n" + + " ON \r\n" + + " M1.SHIPREQUESTNAME = M2.SHIPREQUESTNAME\r\n" + + " WHERE \r\n" + + " T.SHIPREQUESTNAME = :SHIPREQUESTNAME\r\n" + + " AND T.SITENAME = :SITENAME\r\n" + + " AND T.STOCKSTATE = 'Stocked'\r\n" + + " AND T.MATERIALPACKINGNAME IN (:BOXLIST)\r\n" + + " GROUP BY\r\n" + + " t.MATERIALSPECNAME,\r\n" + + " t.ERPFACTORY,\r\n" + + " t.ERPLOCATION,\r\n" + + " m2.SHIPREQUESTDETAILTYPE,\r\n" + + " t.UNIT,\r\n" + + " m1.COSTCENTER,\r\n" + + " m1.SHIPREQUESTNAME,m1.SENDSALESORDER ,m1.SENDSALESORDERDETAILNO,\r\n" + + " m1.SHIPREQUESTDETAILNAME,\r\n" + + " m1.ERPRECEIVELOCATION,\r\n" + + " m1.ERPRECEIVEFACTORY,m.MATERIALPACKINGNAME"; + + // 转库到线边仓 + Map hashMapZK = new HashMap(); + hashMapZK.put("BOXLIST", materialPackingKeyList); + hashMapZK.put("SHIPREQUESTNAME", shipRequestName); + hashMapZK.put("SITENAME", siteName); + List> ZKqueryForList = IDMFrameServiceProxy.getSqlTemplate().queryForList(sqlZK.toString(), hashMapZK); + + for (int z = 0; z < ZKqueryForList.size(); z++) { + String materialPackingName = ZKqueryForList.get(z).get("MATERIALPACKINGNAME").toString(); + materialPackingKeyList.add(materialPackingName); + MaterialPackingKey materialPackingKey = new MaterialPackingKey("SDK",materialPackingName); + arrayList.add(materialPackingKey); + } + /*List mpKeyList = new ArrayList (); + SetEventInfo setEventInfo = new SetEventInfo(); + for (MaterialPackingKey materialPacking : arrayList) { + MaterialPackingKey key = materialPacking; + mpKeyList.add(key); + } + + Map hashMapPack = new HashMap (); + hashMapPack.put("erpLocation", ERPRECEIVELOCATION == null ? "" : ERPRECEIVELOCATION); + hashMapPack.put("erpFactory", ERPRECEIVEFACTORY == null ? "" : ERPRECEIVEFACTORY); + hashMapPack.put("locationName", ""); + hashMapPack.put("lastEventUser", eventUser); + hashMapPack.put("unDoID", billCode); + setEventInfo.setUserColumns(hashMapPack); + MaterialPackingServiceProxy.getMaterialPackingService().setEvent(mpKeyList, makeEventInfo, setEventInfo); + */ + //抛送MES数据 + //untils.sendMaterialInfoToMES_NEW2(shipRequestName, "", materialPackingKeyList); + untils.StockOutSendMaterialInfoToMES(shipRequestName, "", materialPackingKeyList); + //更新BOX状态 + EventInfo mesEventInfo = eventInfoUtil.makeEventInfo("CompletedShipRequestMES", eventUser, "CompletedShipRequestMES"); + SetEventInfo setEventInfo = new SetEventInfo(); + Map hashMapPack = new HashMap (); + hashMapPack.put("stockState", GenericServiceProxy.getConstantMap().STOCKSTATE_STOCKPENDING); + hashMapPack.put("oldStockState", GenericServiceProxy.getConstantMap().STOCKSTATE_STOCKED); + setEventInfo.setUserColumns(hashMapPack); + MaterialPackingServiceProxy.getMaterialPackingService().setEvent(arrayList, mesEventInfo, setEventInfo); + } else { + if(!ERPRECEIVELOCATION.isEmpty()) { + + // 拆条码,查询MATERIALQUANTITY 与 MATERIALQUANTITY2是否相等,如果相等则未修改了数量,不相等则修改了数量 + // 如果已修改数量,则进行拆条码 + for (int z = 0; z < packingQueryForList.size(); z++) { + String MATERIALPACKINGNAME = packingQueryForList.get(z).get("MATERIALPACKINGNAME").toString(); + Object[] bindSet = {MATERIALPACKINGNAME}; + String qtysql = "WHERE MATERIALPACKINGNAME = ?"; + List qtyQueryForList = MaterialPackingServiceProxy.getMaterialPackingService().select(qtysql, bindSet); + + String qty = new Double(qtyQueryForList.get(0).getMaterialQuantity()) == null ? "0" : String.valueOf(qtyQueryForList.get(0).getMaterialQuantity()); + + String qty2 = new Double(qtyQueryForList.get(0).getMaterialQuantity2()) == null ? "0" : String.valueOf(qtyQueryForList.get(0).getMaterialQuantity2()); + String materialPackingName = qtyQueryForList.get(0).getMaterialPackingName(); + String charge = qtyQueryForList.get(0).getCharge(); + BigDecimal bigQty = new BigDecimal(qty); + // 已拆数量 + BigDecimal bigQty2 = new BigDecimal(qty2); + + // 如果已拆数量不等于原数量,并且已拆数量为0(未拆分数量) + if(bigQty.compareTo(bigQty2) != 0 && !"0.0".equals(qty2)) { + // 剩余数量 + BigDecimal restQty = bigQty.subtract(bigQty2); + + // 生成新的拆分条码 + String stringBigQty2 = bigQty2.toString(); + String newPalletNo = CodeGenerator.packingGenerateCode(materialPackingName,stringBigQty2,charge); + + // 写入拆分的新条码,更新原数据库 + List boxList = new ArrayList(); + // MaterialPackingKey materialpackingKey = new MaterialPackingKey(); + MaterialPacking materialpackingNew = new MaterialPacking(); + // materialpackingKey.setSiteName("SDK"); + // materialpackingKey.setMaterialPackingName(newPalletNo); + // materialpackingNew.setKey(materialpackingKey); + + // 复制一个当前的原标签数据 + materialpackingNew.setKey(qtyQueryForList.get(0).getKey()); + // MaterialPacking materialpackingNew = qtyQueryForList.get(z); + // 设置新为标签和数量 + materialpackingNew.setMaterialPackingName(newPalletNo); + // bigQty2 转double类型 + materialpackingNew.setMaterialQuantity(bigQty2.doubleValue()); + boxList.add(qtyQueryForList.get(0)); + boxList.add(materialpackingNew); + boolean moveTransformOut = packingChargeSplit(boxList, eventUser); + if (moveTransformOut != true) { + throw new RuntimeException("修改数量拆分失败"); + } + + //记录到拆分表 + String subsql = "SELECT RECEIVEREQUESTDETAILNAME FROM MATERIALPACKINGSUB WHERE RECEIVEREQUESTNAME = :RECEIVEREQUESTNAME AND MATERIALPACKINGNAME = :MATERIALPACKINGNAME\n"; + Map subHashMap = new HashMap(); + subHashMap.put("RECEIVEREQUESTNAME", shipRequestName); + subHashMap.put("MATERIALPACKINGNAME", MATERIALPACKINGNAME); + List> ZKqueryForList = IDMFrameServiceProxy.getSqlTemplate().queryForList(subsql, subHashMap); + String preReceiverequestdetailname = ZKqueryForList.get(0).get("RECEIVEREQUESTDETAILNAME").toString(); + + String shipRequestDetailName = qtyQueryForList.get(0).getShipRequestDetailName() == null ? "" : qtyQueryForList.get(0).getShipRequestDetailName().toString(); + untils.fahuoSplit(newPalletNo, shipRequestName, preReceiverequestdetailname, bigQty2); + + // 原条码扣减拆出的数量,用剩余数量更新原条码,条码不变,数量更新 + SetEventInfo setEventInfo = new SetEventInfo(); + Map pakHashMap = new HashMap<>(); + pakHashMap.put("materialQuantity", restQty.doubleValue()); + pakHashMap.put("materialQuantity2", 0); + pakHashMap.put("shipRequestName", ""); + pakHashMap.put("shipRequestDetailName", ""); + + EventInfo eventInfo = new EventInfoUtil().makeEventInfo("拆分条码", eventUser, "备货出库拆分条码"); + setEventInfo.setUserColumns(pakHashMap); + MaterialPackingServiceProxy.getMaterialPackingService().setEvent(new MaterialPackingKey( "SDK", MATERIALPACKINGNAME), eventInfo, setEventInfo); + + // 删除被拆分的原条码数据,用拆分出的新条码覆盖,进行后面的过账,现场仓过账只过账已拆分出的数量,剩余数量的原条码不过账 + boolean deletePacking = materialPackingKeyList.remove(MATERIALPACKINGNAME); + if (deletePacking) { + materialPackingKeyList.add(newPalletNo); + } + + } + + } + + + //new MESServiceImpl().NeedReceiveMaterialInfoSend_NEW(shipRequestName, "SDK", materialPackingKeyList); + billCode="Y"; + String sqlZK=" SELECT\r\n" + + " t.MATERIALSPECNAME,m.MATERIALPACKINGNAME,\r\n" + + " t.ERPFACTORY,\r\n" + + " t.ERPLOCATION,\r\n" + + " t.LOCATIONNAME,\r\n" + + " m2.SHIPREQUESTDETAILTYPE,\r\n" + + " t.UNIT,\r\n" + + " m1.COSTCENTER,\r\n" + + " m1.SHIPREQUESTNAME,\r\n" + + " m1.SHIPREQUESTDETAILNAME,\r\n" + + " m1.ERPRECEIVELOCATION,\r\n" + + " m1.ERPRECEIVEFACTORY,\r\n" + + " m1.SENDSALESORDER ,m1.SENDSALESORDERDETAILNO,\r\n" + + " CASE WHEN m1.SENDSALESORDER IS NOT NULL THEN 'E' ELSE '' END SOBKZ,\r\n" + + " (\r\n" + + " SELECT\r\n" + + " RECEIVEPRODUCTIONORDERNUMBER\r\n" + + " FROM\r\n" + + " MATERIALSHIPREQUESTDETAIL m5\r\n" + + " WHERE\r\n" + + " m5.SHIPREQUESTNAME =:SHIPREQUESTNAME\r\n" + + " AND m5.MATERIALSPECNAME = t.MATERIALSPECNAME\r\n" + + " ORDER BY\r\n" + + " m5.USEDATE,\r\n" + + " m5.SHIPREQUESTDETAILNAME FETCH FIRST ROW ONLY)RECEIVEPRODUCTIONORDERNUMBER,\r\n" + + " SUM(m.QTY) AS MATERIALQUANTITY\r\n" + + " FROM \r\n" + + " MATERIALPACKINGSUB m\r\n" + + " LEFT JOIN MATERIALPACKING T ON \r\n" + + " m.MATERIALPACKINGNAME = T.MATERIALPACKINGNAME\r\n" + + " AND m.RECEIVEREQUESTNAME = T.SHIPREQUESTNAME\r\n" + + " LEFT JOIN MATERIALSHIPREQUESTDETAIL M1 \r\n" + + " ON \r\n" + + " m.RECEIVEREQUESTNAME = M1.SHIPREQUESTNAME\r\n" + + " AND m.RECEIVEREQUESTDETAILNAME = M1.SHIPREQUESTDETAILNAME\r\n" + + " LEFT JOIN MATERIALSHIPREQUEST M2 \r\n" + + " ON \r\n" + + " M1.SHIPREQUESTNAME = M2.SHIPREQUESTNAME\r\n" + + " WHERE \r\n" + + " T.SHIPREQUESTNAME = :SHIPREQUESTNAME\r\n" + + " AND T.SITENAME = :SITENAME\r\n" + + " AND T.STOCKSTATE = 'Stocked'\r\n" + + " AND T.MATERIALPACKINGNAME IN (:BOXLIST)\r\n" + + " GROUP BY\r\n" + + " t.MATERIALSPECNAME,\r\n" + + " t.ERPFACTORY,\r\n" + + " t.ERPLOCATION,\r\n" + + " t.LOCATIONNAME,\r\n" + + " m2.SHIPREQUESTDETAILTYPE,\r\n" + + " t.UNIT,\r\n" + + " m1.COSTCENTER,\r\n" + + " m1.SHIPREQUESTNAME,m1.SENDSALESORDER ,m1.SENDSALESORDERDETAILNO,\r\n" + + " m1.SHIPREQUESTDETAILNAME,\r\n" + + " m1.ERPRECEIVELOCATION,\r\n" + + " m1.ERPRECEIVEFACTORY,m.MATERIALPACKINGNAME"; + + // 转库到线边仓 +// String sqlZK = "SELECT b.MATERIALPACKINGNAME FROM MATERIALPACKINGSUB b WHERE b.MATERIALPACKINGNAME IN (:BOXLIST)"; + Map hashMapZK = new HashMap(); + hashMapZK.put("BOXLIST", materialPackingKeyList); + hashMapZK.put("SHIPREQUESTNAME", shipRequestName); + hashMapZK.put("SITENAME", siteName); + List> ZKqueryForList = IDMFrameServiceProxy.getSqlTemplate().queryForList(sqlZK.toString(), hashMapZK); + List SUBList = new ArrayList<> (); + for (int z = 0; z < ZKqueryForList.size(); z++) { + String materialPackingName = ZKqueryForList.get(z).get("MATERIALPACKINGNAME").toString(); + SUBList.add(materialPackingName); + MaterialPackingKey materialPackingKey = new MaterialPackingKey("SDK",materialPackingName); + arrayList.add(materialPackingKey); + + // 更新MATERIALPACKING表前仓库货位为现在货位和仓库数据,保存现仓库货位 + Map row = ZKqueryForList.get(z); + String erpLocation = row.get("ERPLOCATION") == null ? "" : row.get("ERPLOCATION").toString(); + String locationName = row.get("LOCATIONNAME") == null ? "" : row.get("LOCATIONNAME").toString(); + String updSql = "UPDATE MATERIALPACKING SET PREERPLOCATION = :PREERPLOCATION, PRELOCATIONNAME = :PRELOCATIONNAME WHERE MATERIALPACKINGNAME = :MATERIALPACKINGNAME"; + Map updHashMap = new HashMap<>(); + updHashMap.put("PREERPLOCATION", erpLocation); + updHashMap.put("PRELOCATIONNAME", locationName); + updHashMap.put("MATERIALPACKINGNAME", materialPackingName); + try { + IDMFrameServiceProxy.getSqlTemplate().update(updSql, updHashMap); + } catch (Exception e) { + // 日志记录并抛出自定义异常,便于调试和事务回滚 + throw new CustomException("更新仓库货位信息失败: " + materialPackingName, e); + } + } + billCode = UnSourcedChangeLocation(arrayList,ERPRECEIVEFACTORY, + ERPRECEIVELOCATION, "", eventUser, commitDate ); + + List mpKeyList = new ArrayList (); + SetEventInfo setEventInfo = new SetEventInfo(); + for (MaterialPackingKey materialPacking : arrayList) { + MaterialPackingKey key = materialPacking; + mpKeyList.add(key); + } + + Map hashMapPack = new HashMap (); + hashMapPack.put("erpLocation", ERPRECEIVELOCATION == null ? "" : ERPRECEIVELOCATION); + hashMapPack.put("erpFactory", ERPRECEIVEFACTORY == null ? "" : ERPRECEIVEFACTORY); + hashMapPack.put("locationName", ""); + hashMapPack.put("lastEventUser", eventUser); + hashMapPack.put("unDoID", billCode); + setEventInfo.setUserColumns(hashMapPack); + MaterialPackingServiceProxy.getMaterialPackingService().setEvent(mpKeyList, makeEventInfo, setEventInfo); + //抛送MES数据 + Boolean success = untils.sendMaterialInfoToMES_NEW2(shipRequestName, "", SUBList,billCode,eventUser); + + if (!success) { + String undo = cancelShipInter(billCode, eventUser); + if (undo == null || undo.isEmpty()) { + throw new GlobalException("下发mes失败后冲销失败!"); + }else { + throw new GlobalException("发送到mes失败!"); + } + } + makeEventInfo.setEventName("备货出库无来源转库"); + makeEventInfo.setEventComment("备货出库无来源转库"); +// WlySaveUnDoInfo( billCode,commitDate); + untils.SaveUnDoInfo_ForSap(materialPackingKeyList, billCode, makeEventInfo); + } + else + { +// billCode=toSAPService.ProductionStockOut_NEW(shipRequestName, "SDK", eventUser,materialPackingKeyList); + + billCode=ProductionStockOut_NEW(shipRequestName, "SDK", eventUser,materialPackingKeyList,commitDate); + if (billCode.isEmpty()) { + throw new CustomException("SAP过账异常!"); + } +// + //抛送MES数据 + Boolean success = untils.sendMaterialInfoToMES_NEW(shipRequestName, "", materialPackingKeyList,billCode,eventUser); + //billCode = NCWServiceImpl.SaleOut2(shipRequestName, "SDK", eventUser,materialPackingKeyList,""); + // 如果mes发送失败,则进行sap过账冲销 + if (!success) { + String undo = cancelShipInter(billCode, eventUser); + if (undo == null || undo.isEmpty()) { + throw new GlobalException("下发mes失败后冲销失败!"); + }else { + throw new GlobalException("发送到mes失败!"); + } + } + + untils.SaveUnDoInfo_ForSap(materialPackingKeyList, billCode, makeEventInfo); + } + } + break; + + case "06"://成本中心领料 + // billCode=toSAPService.orderStockOut(shipRequestName, "SDK", eventUser,materialPackingKeyList); + billCode=orderStockOut(shipRequestName, "SDK", eventUser,materialPackingKeyList,commitDate); + //抛送MES数据 + Boolean success = untils.sendMaterialInfoToMES_NEW(shipRequestName, "", materialPackingKeyList,billCode,eventUser); + + if (!success) { + String undo = cancelShipInter(billCode, eventUser); + if (undo == null || undo.isEmpty()) { + throw new GlobalException("下发mes失败后冲销失败!"); + }else { + throw new GlobalException("发送到mes失败!"); + } + } + + //更新MES管芯数据 + new MESServiceImpl().updateDurable_ByCostcenter(shipRequestName, "SDK", eventUser, materialPackingKeyList); + //billCode = NCWServiceImpl.SaleOut2(shipRequestName, "SDK", eventUser,materialPackingKeyList,""); + untils.SaveUnDoInfo_ForSap(materialPackingKeyList, billCode, makeEventInfo); + break; + case "09"://研发领料 +// billCode=toSAPService.orderStockOut(shipRequestName, "SDK", eventUser,materialPackingKeyList); +// billCode=orderStockOut(shipRequestName, "SDK", eventUser,materialPackingKeyList); +// //更新MES管芯数据 +// new MESServiceImpl().updateDurable_ByCostcenter(shipRequestName, "SDK", eventUser, materialPackingKeyList); +// //billCode = NCWServiceImpl.SaleOut2(shipRequestName, "SDK", eventUser,materialPackingKeyList,""); +// untils.SaveUnDoInfo_ForSap(materialPackingKeyList, billCode, makeEventInfo); + break; + case "ZLF0"://销售出库确认 (单据类型ZLF0~ZLF8) SD023(销售回传) + case "ZLF1": + case "ZLF2": + case "ZLF3": + case "ZLF4": + case "ZLF5": + case "ZLF6": + case "ZLF7": + case "ZLF8": + makeEventInfo.setEventName("CompletedShipRequestZL"); + makeEventInfo.setEventComment("CompletedShipRequestZL"); +// billCode=toSAPService.saleStockOut_NEW(shipRequestName, "SDK", eventUser,materialPackingKeyList); + billCode=saleStockOut_NEW(shipRequestName, "SDK", eventUser,materialPackingKeyList,commitDate); + untils.SaveUnDoInfo_ForSap(materialPackingKeyList, billCode, makeEventInfo); + //单据类型等于ZLF0-ZLF9,物料编码以7开头都属于成品胶水需要调用QMS质检接口 + String message = checkShipRequestTypeSendIQC(commitDate, siteName ,shipRequestName, makeEventInfo, materialPackingKeyList); + if (StringUtils.isNotEmpty(message)) { + throw new CustomException(message); + } + break; + case "08": // 委外 + case "OEM": // 委外 +// billCode=toSAPService.oemStockOut_NEW(shipRequestName, "SDK", eventUser,materialPackingKeyList); + billCode=oemStockOut_NEW(shipRequestName, "SDK", eventUser,materialPackingKeyList, commitDate); + untils.SaveUnDoInfo_ForSap(materialPackingKeyList, billCode, makeEventInfo); + break; + default : + break; + } + return billCode; + } } From 4102004c9c8f049fc9f612e50ef6953049508097 Mon Sep 17 00:00:00 2001 From: 18110972313 <780768673@qq.com> Date: Tue, 27 May 2025 19:13:48 +0800 Subject: [PATCH 4/4] =?UTF-8?q?update=20=E5=88=B0=E8=B4=A7=E5=8D=95?= =?UTF-8?q?=E5=85=A5=E5=BA=93=EF=BC=8C=E4=BF=AE=E6=94=B9QMS=E8=B4=A8?= =?UTF-8?q?=E6=A3=80=E6=8A=A5=E6=96=87=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cim/idm/service/impl/QMSServiceImpl.java | 27 ++++++++++--------- .../idm/service/impl/ToSAPServiceImpl.java | 2 +- 2 files changed, 16 insertions(+), 13 deletions(-) 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 2cfb05c..a42263a 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 @@ -477,11 +477,11 @@ public class QMSServiceImpl implements QMSService{ } - public String sendToIQCByDataList(String opCode, String siteName, String deliveryName) throws CustomException { + public String sendToIQCByDataList(String opCode, String siteName, String deliveryName,String commitDate) throws CustomException { String sql = " \n" + "WITH AA AS (\n" + "\tSELECT\n" + - "\t\tP.SITENAME,\n" + + " P.SITENAME,\n" + "\t\tP.RECEIVEREQUESTNAME,\n" + "\t\tP.ERPFACTORY,\n" + "\t\tP.ERPLOCATION,\n" + @@ -490,36 +490,39 @@ public class QMSServiceImpl implements QMSService{ "\t\tP.UNIT AS quantityUnit,\n" + "\t\tLISTAGG(DISTINCT P.CHARGE , ';') WITHIN GROUP (ORDER BY P.CHARGE) AS LOTS,\n" + "\t\tCOUNT(DISTINCT P.CHARGE ) batchQuantity,\n" + - "\t\tP.SUPPLIERNAME\n" + + "\t\tP.SUPPLIERNAME,\n" + + "\t\tP.TRUEGG " + "\tFROM\n" + "\t\tMATERIALPACKING P \n" + "\tWHERE\n" + "\t\tP.RECEIVEREQUESTNAME =:DELIVERYNAME\n" + "\t\tGROUP BY \n" + - "\t\tP.SITENAME,\n" + + " P.SITENAME,\n" + "\t\tP.RECEIVEREQUESTNAME,\n" + "\t\tP.ERPFACTORY,\n" + "\t\tP.ERPLOCATION,\n" + "\t\tP.MATERIALSPECNAME,\n" + "\t\tP.LOCATIONNAME,\n" + "\t\tP.UNIT,\n" + - "\t\tP.SUPPLIERNAME\n" + + "\t\tP.SUPPLIERNAME,\n" + + "\t\tP.TRUEGG " + "\t\t)\n" + "\t\t\n" + "SELECT\n" + - "\tAA.SITENAME,\n" + + " AA.SITENAME,\n" + "AA.RECEIVEREQUESTNAME,\n" + "\t\tAA.ERPFACTORY,\n" + "\t\tAA.ERPLOCATION,\n" + - "\t\tAA.materialCode,\n" + + "\t\tAA.MATERIALCODE AS MATERIALSPECNAME,\n" + "\t\tAA.LOCATIONNAME,\t\n" + - "\t\tAA.quantityUnit,\n" + + "\t\tAA.quantityUnit AS UNIT,\n" + "\t\tAA.LOTS,\n" + "\t\tAA.batchQuantity,\n" + - "\t\tAA.SUPPLIERNAME,\n" + + "\t\tAA.SUPPLIERNAME AS SUPPLIERCODE,\n" + "\t\tEL.DESCRIPTION AS ERPLOCATIONDESC,\n" + "\t\tMP.MATERIALGROUP,\n" + - "\t\tMP.DESCRIPTION\n" + + "\t\tMP.DESCRIPTION AS MATERIALNAME,\n" + + "\t\tAA.TRUEGG AS BATCHNUMBER " + "FROM\n" + "AA\n" + "LEFT JOIN BS_ERPLOCATION EL ON EL.ERPLOCATIONNAME = AA.ERPLOCATION\n" + @@ -548,7 +551,7 @@ public class QMSServiceImpl implements QMSService{ //         "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("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")); @@ -556,7 +559,7 @@ public class QMSServiceImpl implements QMSService{ jsonObject.put("materialGroup", list.get(i).get("MATERIALGROUP")); jsonObject.put("batchQuantity", list.get(i).get("BATCHQUANTITY"));// jsonObject.put("quantityUnit", list.get(i).get("UNIT"));//QUANTITYUNIT - jsonObject.put("deliveryDate", list.get(i).get("DELIVERYDATE"));// + jsonObject.put("deliveryDate", commitDate);// jsonObject.put("specifications", list.get(i).get("BATCHNUMBER"));// jsonObject.put("LOCATIONNAME", list.get(i).get("LOCATIONNAME")); jsonObject.put("inspector", "检验室(原材仓)"); 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 fee5501..918e2c5 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 @@ -7134,7 +7134,7 @@ public class ToSAPServiceImpl { // 调用 QMS //qMSServiceImpl.PreIQCInfoSend(receiveRequestName, "SDK",opCode, erpFactory); exceptionMsg = "QMS返回"; - qmsServiceImpl.sendToIQCByDataList(opCode, "SDK",deliveryName); + qmsServiceImpl.sendToIQCByDataList(opCode, "SDK",deliveryName, commitDate); } // 更新入库凭证,更新库存状态 if (StringUtils.isNotEmpty(undoId)){