diff --git a/zi-wms-data/src/main/java/com/cim/idm/wmspackage/receiverequestdetail/management/data/MaterialReceiveRequestDetail.java b/zi-wms-data/src/main/java/com/cim/idm/wmspackage/receiverequestdetail/management/data/MaterialReceiveRequestDetail.java index 929f5e2..54cb410 100644 --- a/zi-wms-data/src/main/java/com/cim/idm/wmspackage/receiverequestdetail/management/data/MaterialReceiveRequestDetail.java +++ b/zi-wms-data/src/main/java/com/cim/idm/wmspackage/receiverequestdetail/management/data/MaterialReceiveRequestDetail.java @@ -63,6 +63,8 @@ public class MaterialReceiveRequestDetail extends FieldAccessor implements DataI private String businessDivision; // 事业部zzsyb private String phase; + private String remark; // 备注 + public String getLocationName() { @@ -548,4 +550,12 @@ public class MaterialReceiveRequestDetail extends FieldAccessor implements DataI public void setPhase(String phase) { this.phase = phase; } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } } 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 7566c05..344a951 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 @@ -7123,7 +7123,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)){ diff --git a/zi-wms-pda/src/main/java/com/cim/idm/controller/MaterialUndoController.java b/zi-wms-pda/src/main/java/com/cim/idm/controller/MaterialUndoController.java index 5ab5bbd..d9613d2 100644 --- a/zi-wms-pda/src/main/java/com/cim/idm/controller/MaterialUndoController.java +++ b/zi-wms-pda/src/main/java/com/cim/idm/controller/MaterialUndoController.java @@ -97,8 +97,10 @@ public class MaterialUndoController { materialUndoServiceImpl.orderUndo(undoId, userId,commitDate); } else if (inv_TYPE.contains("ZLF")) { // 销售发货出库 materialUndoServiceImpl.orderUndo(undoId, userId,commitDate); - } else if (inv_TYPE.contains("无来源转库")) { // 无来源转库 + } else if (lastEventName.contains("无来源转库")) { // 备货出库转现场仓,无来源转库 materialUndoServiceImpl.wlyZkUndo(undoId, userId,preErpLocation,preLocationName); + } else if (lastEventName.contains("生产领料出库")) { // 生产领料直接出库 + materialUndoServiceImpl.ckUndo(undoId, userId); } else { return AjaxResult.me().setSuccess(false).setMessage("单据类型不支持冲销"); } diff --git a/zi-wms-pda/src/main/java/com/cim/idm/controller/SAPToWMSController.java b/zi-wms-pda/src/main/java/com/cim/idm/controller/SAPToWMSController.java index 7389a32..0e5860d 100644 --- a/zi-wms-pda/src/main/java/com/cim/idm/controller/SAPToWMSController.java +++ b/zi-wms-pda/src/main/java/com/cim/idm/controller/SAPToWMSController.java @@ -1321,7 +1321,7 @@ public class SAPToWMSController { String lgort1 = MapUtils.getString(item, "LGORT1"); // 发出仓库 String werks2 = MapUtils.getString(item, "WERKS2"); // 接收工厂 String lgort2 = MapUtils.getString(item, "LGORT2"); // 接收仓库 - + if(StringUtils.isEmpty(moveState)) { if(StringUtils.isEmpty(lgort2)) @@ -1348,6 +1348,7 @@ public class SAPToWMSController { String xloek= MapUtils.getString(item, "xloek"); // 删除标识 String auart= MapUtils.getString(item, "AUART"); // 接收生产订单类型 返工ZP05 复卷ZP01 String lifnr= MapUtils.getString(item, "LIFNR"); // 委外 + String msgtxt = MapUtils.getString(item, "MSGTXT"); // 备注 MaterialShipRequestDetail mrd =new MaterialShipRequestDetail(); @@ -1460,6 +1461,7 @@ public class SAPToWMSController { bindMapItem.put("saleOutQuantity", 0); bindMapItem.put("auart", auart); bindMapItem.put("deliveryAddress", lifnr); + bindMapItem.put("remark", msgtxt); @@ -1544,6 +1546,7 @@ public class SAPToWMSController { bindMapItem.put("phase", phase); bindMapItem.put("saleOutQuantity", 0); bindMapItem.put("auart", auart); + bindMapItem.put("remark", msgtxt); nonPrimaryKeyValueInfo.setUserColumns(bindMapItem); EventInfo eventInfo = new EventInfo(); 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..8e2f30f 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 @@ -562,7 +562,7 @@ public class InvoiceServiceImpl implements InvoiceService { //抛送MES数据 untils.sendMaterialInfoToMES_NEW2(shipRequestName, "", materialPackingKeyList,billCode,eventUser); - WlySaveUnDoInfo( billCode,commitDate); + WlySaveUnDoInfo( materialPackingKeyList,billCode,commitDate); } else { @@ -956,7 +956,18 @@ public class InvoiceServiceImpl implements InvoiceService { return undoId; } - public void WlySaveUnDoInfo( String undoid,String commitDate) { + public void WlySaveUnDoInfo( List list,String undoid,String commitDate) { + + // 更新事件名 + // 此SQL语句用于更新物料包装的最后事件名称、评论和时间 + String sqlu="UPDATE MATERIALPACKING m SET m.LASTEVENTNAME=:LASTEVENTNAME,m.LASTEVENTCOMMENT =:LASTEVENTCOMMENT,m.LASTEVENTTIME =SYSDATE \r\n" + + " WHERE m.SITENAME =:SITENAME AND m.MATERIALPACKINGNAME in (:BOXLIST)"; + Map bpu = new HashMap (); + bpu.put("LASTEVENTNAME", makeEventInfo.getEventName()); + bpu.put("LASTEVENTCOMMENT", makeEventInfo.getEventComment()); + bpu.put("SITENAME", "SDK"); + bpu.put("BOXLIST", list); + IDMFrameServiceProxy.getSqlTemplate().update(sqlu, bpu); String insertUnDOMaterialPackingInfo = "insert into BS_MATERIALPACKINGUNDOINFO (unDoID,preundoid,UNDODETAILNAME,undoidstate,UNDOIDDATE," + "SITENAME, MATERIALPACKINGNAME, MATERIALPACKINGTYPE, CONTENTMATERIALTYPE," @@ -3428,6 +3439,7 @@ public class InvoiceServiceImpl implements InvoiceService { " 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" + @@ -3497,8 +3509,8 @@ public class InvoiceServiceImpl implements InvoiceService { } makeEventInfo.setEventName("备货出库无来源转库"); makeEventInfo.setEventComment("备货出库无来源转库"); -// WlySaveUnDoInfo( billCode,commitDate); - untils.SaveUnDoInfo_ForSap(materialPackingKeyList, billCode, makeEventInfo); + WlySaveUnDoInfo( materialPackingKeyList,billCode,commitDate); +// untils.SaveUnDoInfo_ForSap(materialPackingKeyList, billCode, makeEventInfo); } else { @@ -3521,7 +3533,8 @@ public class InvoiceServiceImpl implements InvoiceService { throw new GlobalException("发送到mes失败!"); } } - + makeEventInfo.setEventName("备货出库生产领料出库"); + makeEventInfo.setEventComment("备货出库生产领料出库"); untils.SaveUnDoInfo_ForSap(materialPackingKeyList, billCode, makeEventInfo); } } @@ -3804,4 +3817,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; + } } diff --git a/zi-wms-pda/src/main/java/com/cim/idm/service/Impl/MaterialUndoServiceImpl.java b/zi-wms-pda/src/main/java/com/cim/idm/service/Impl/MaterialUndoServiceImpl.java index e760786..2f284c9 100644 --- a/zi-wms-pda/src/main/java/com/cim/idm/service/Impl/MaterialUndoServiceImpl.java +++ b/zi-wms-pda/src/main/java/com/cim/idm/service/Impl/MaterialUndoServiceImpl.java @@ -287,7 +287,6 @@ public class MaterialUndoServiceImpl implements IMaterialUndoService { "GROUP BY RECEIVEREQUESTNAME,RECEIVEREQUESTDETAILNAME) M ON (T.SHIPREQUESTNAME = M.RECEIVEREQUESTNAME AND T.SHIPREQUESTDETAILNAME = M.RECEIVEREQUESTDETAILNAME)\r\n" + "WHEN MATCHED THEN UPDATE SET T.ASSIGNEDQUANTITY = T.ASSIGNEDQUANTITY - M.QTY,T.SALEOUTQUANTITY = T.SALEOUTQUANTITY - M.QTY"; - //根据当前的出库数量更新saleQty // String sql = "SELECT M.RECEIVEREQUESTNAME,M.RECEIVEREQUESTDETAILNAME,M.QTY FROM MATERIALPACKINGSUB M WHERE M.MATERIALPACKINGNAME = :MATERIALPACKINGNAME\r\n" + // "UNION \r\n" + @@ -359,6 +358,12 @@ public class MaterialUndoServiceImpl implements IMaterialUndoService { for (MaterialPacking materialPacking : list) { Map hashMap = new HashMap (); + if(preLocationName == null) { + preLocationName = ""; + } + if(preErpLocation == null) { + preErpLocation = ""; + } hashMap.put("erpLocation", preErpLocation); hashMap.put("locationName", preLocationName); // hashMap.put("preErpLocation", materialPacking.getErpLocation()); @@ -381,7 +386,7 @@ public class MaterialUndoServiceImpl implements IMaterialUndoService { public void wlyZkUndo (String undoId, String user,String preErpLocation,String preLocationName) throws Exception { String billCode = toSAPService.cancelShipInter(undoId, user); - if (billCode == null) { + if (billCode == null || billCode.equals("")) { throw new GlobalException("报送ERP失败,请联系IT处理!"); } @@ -392,9 +397,15 @@ public class MaterialUndoServiceImpl implements IMaterialUndoService { List list = MaterialPackingServiceProxy.getMaterialPackingService().select(condition, bindSet); SetEventInfo setEventInfo = new SetEventInfo(); - +// 新加 for (MaterialPacking materialPacking : list) { Map hashMap = new HashMap (); + if(preLocationName == null) { + preLocationName = ""; + } + if(preErpLocation == null) { + preErpLocation = ""; + } hashMap.put("erpLocation", preErpLocation); hashMap.put("locationName", preLocationName); // hashMap.put("preErpLocation", materialPacking.getErpLocation());