package com.cim.idm.utils; import com.cim.idm.exception.GlobalException; import com.cim.idm.framework.IDMFrameServiceProxy; import com.cim.idm.framework.data.EventInfo; import com.cim.idm.service.impl.MESServiceImpl; import com.cim.idm.wmsextend.generic.errorHandler.CustomException; import com.cim.idm.wmspackage.materialpacking.MaterialPackingServiceProxy; import com.cim.idm.wmspackage.materialpacking.management.data.MaterialPacking; import com.cim.idm.wmspackage.materialpacking.management.data.MaterialPackingKey; import com.cim.idm.wmspackage.materialpacking.management.info.SetEventInfo; import org.apache.commons.lang3.StringUtils; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.format.DateTimeFormatter; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; @RestController @RequestMapping("/CommonUtils") @EnableAutoConfiguration public class CommonUtils { /** * 查询库位所在的仓库 * @param loction * @return */ public Boolean QueryLocation(String storage,String loction) { String sql="SELECT ERPLOCATION FROM STORAGESPEC s WHERE STORAGENAME =:STORAGENAME AND ERPLOCATION =:ERPLOCATION "; Map QueryMap = new HashMap(); QueryMap.put("STORAGENAME", storage); QueryMap.put("ERPLOCATION", loction); List> list =IDMFrameServiceProxy.getSqlTemplate().queryForList(sql, QueryMap); if(list.size()>0) return true; return false; } public String ChangeTime(String date) { DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyyMMdd"); DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); // 解析为LocalDate,因为没有时间部分 LocalDate localDate = LocalDate.parse(date, inputFormatter); // 创建一个LocalTime表示00:00:00 LocalTime localTime = LocalTime.MIDNIGHT; // 或者 LocalTime.of(0, 0, 0); // 合并LocalDate和LocalTime为LocalDateTime LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime); // 格式化LocalDateTime为字符串 String formattedDate = localDateTime.format(outputFormatter); return formattedDate; } /** * 检验是否熟化仓 * @param ERPLOcxation * @param materialSpec * @return */ public Boolean JudgeMentIsOvenSpec(String ERPLOcxation,String materialSpec) { String DetailSql = "SELECT MATURATIONFLAG FROM MATERIALSPEC m WHERE MATERIALSPECNAME =:MATERIALSPECNAME AND MATURATIONFLAG='Y' "; Map DetailMap = new HashMap(); DetailMap.put("MATERIALSPECNAME",materialSpec ); List> ShipDetaillist = IDMFrameServiceProxy.getSqlTemplate().queryForList(DetailSql, DetailMap); String DetailSql2 = "SELECT IS_OVEN FROM BS_ERPLOCATION m WHERE ERPLOCATIONNAME =:ERPLOCATIONAMEE AND IS_OVEN='Y' "; Map DetailMap2 = new HashMap(); DetailMap2.put("ERPLOCATIONAMEE",ERPLOcxation ); List> ShipDetaillist2 = IDMFrameServiceProxy.getSqlTemplate().queryForList(DetailSql2, DetailMap2); // if(Objects.isNull(ShipDetaillist) || ShipDetaillist.isEmpty()) { // return true; // }else { // String DetailSql2 = "SELECT IS_OVEN FROM BS_ERPLOCATION m WHERE ERPLOCATIONNAME =:ERPLOCATIONAMEE AND IS_OVEN='Y' "; // Map DetailMap2 = new HashMap(); // DetailMap2.put("ERPLOCATIONAMEE",ERPLOcxation ); // List> ShipDetaillist2 = IDMFrameServiceProxy.getSqlTemplate().queryForList(DetailSql2, DetailMap2); // if(Objects.isNull(ShipDetaillist2) || ShipDetaillist2.isEmpty()) // { // return false; // }else // { // return true; // } // } if((Objects.isNull(ShipDetaillist) || ShipDetaillist.isEmpty()) && (Objects.isNull(ShipDetaillist2) || ShipDetaillist2.isEmpty())) { return true; }else { if(ShipDetaillist2.size() > 0 && ShipDetaillist2.size() > 0) { return true; }else { return false; } } } /** * 检验恒温管控 * @param ERPLOcxation * @param materialSpec * @return */ public Boolean JudgeMentERPLocationAndMaterialSpec(String ERPLOcxation,String materialSpec) { String DetailSql = "SELECT IS_CON_TEMP FROM MATERIALSPEC m WHERE MATERIALSPECNAME =:MATERIALSPECNAME AND IS_CON_TEMP='Y' "; Map DetailMap = new HashMap(); DetailMap.put("MATERIALSPECNAME",materialSpec ); List> ShipDetaillist = IDMFrameServiceProxy.getSqlTemplate().queryForList(DetailSql, DetailMap); String DetailSql2 = "SELECT CONST_TEMP FROM BS_ERPLOCATION m WHERE ERPLOCATIONNAME =:ERPLOCATIONAMEE AND CONST_TEMP='Y' "; Map DetailMap2 = new HashMap(); DetailMap2.put("ERPLOCATIONAMEE",ERPLOcxation ); List> ShipDetaillist2 = IDMFrameServiceProxy.getSqlTemplate().queryForList(DetailSql2, DetailMap2); if((Objects.isNull(ShipDetaillist) || ShipDetaillist.isEmpty()) && (Objects.isNull(ShipDetaillist2) || ShipDetaillist2.isEmpty())) { return true; }else { if(ShipDetaillist2.size() > 0 && ShipDetaillist2.size() > 0) { return true; }else { return false; } } } /** * 检验是否不良品入非不良品仓库 * @param ERPLOcxation * @param packingGrade * @return */ public Boolean JudgeMtaerialStateWithERPLocation(String ERPLOcxation,String packingGrade) { String DetailSql = "SELECT be.TYPE,be.TYPES FROM BS_ERPLOCATION be WHERE ERPLOCATIONNAME = :ERPLOCATION "; Map DetailMap = new HashMap(); DetailMap.put("ERPLOCATION",ERPLOcxation ); List> ShipDetaillist = IDMFrameServiceProxy.getSqlTemplate().queryForList(DetailSql, DetailMap); if(!Objects.isNull(ShipDetaillist) && !ShipDetaillist.isEmpty()) { String ckType = ShipDetaillist.get(0).get("TYPE") == null ? "" : ShipDetaillist.get(0).get("TYPE").toString(); String ckTypes = ShipDetaillist.get(0).get("TYPES") == null ? "" : ShipDetaillist.get(0).get("TYPES").toString(); if("Y".equals(ckTypes)) { return true; } if ("NG".equals(packingGrade) && !"2".equals(ckType)) { return false; } else if ("OK".equals(packingGrade) && "2".equals(ckType)) { return false; } return true; } return false; } /** * 检验标签是否入库时时否在库 * @param erpLocation * @param materialPackingName * @return * @return */ public void IsAtMaterialPacking(String materialPackingName, String erpFactory, String erpLocation,String locationName, String materialSpecName) { //判断条码是否存在且状态是在库 String sql = "SELECT M.STOCKSTATE,M.RECEIVEACTNO FROM MATERIALPACKING M WHERE M.MATERIALPACKINGNAME = :MATERIALPACKINGNAME"; Map bindMap = new HashMap(); bindMap.put("MATERIALPACKINGNAME",materialPackingName); bindMap.put("ERPFACTORY",erpFactory); bindMap.put("ERPLOCATION",erpLocation); bindMap.put("LOCATIONNAME",locationName); List> list = IDMFrameServiceProxy.getSqlTemplate().queryForList(sql, bindMap); if(list.size() > 1) { throw new GlobalException("条码不止一个,请联系IT处理!"); } if (list.size() == 1) { for (Map map : list) { if (!"Created".equals(map.get("STOCKSTATE").toString())) { throw new GlobalException("条码已存在且不为创建状态,请联系IT处理!"); } } } //恒温恒湿管控 if(!(JudgeMentERPLocationAndMaterialSpec(erpLocation,materialSpecName))) { throw new GlobalException("物料为:"+materialSpecName+" 仓库为:"+erpLocation+" ,不符合恒温恒湿管理"); } String sql2 = "SELECT\r\n" + " BMS.LOTNAME MATERIALPACKINGNAME,\r\n" + " BMS.PRODUCTSPECNAME MATERIALSPECNAME,\r\n" + " BMS.PHASE ,BMS.SDK_ID,\r\n" + " SS.SPECNAME ,\r\n" + " m.DESC_CN ,\r\n" + " BMS.QTY MATERIALQUANTITY ,\r\n" + " BMS.REQUESTNAME RECEIVEREQUESTNAME ,\r\n" + " BMS.CHARGE,BMS.PACKINGGRADE, :ERPFACTORY ERPFACTORY, :ERPLOCATION ERPLOCATION, :LOCATIONNAME LOCATIONNAME\r\n" + "FROM\r\n" + " BS_MES_SHIPPED BMS LEFT JOIN MATERIALSPEC m ON m.MATERIALSPECNAME = BMS.PRODUCTSPECNAME \r\n" + " LEFT JOIN SDK_SPEC SS ON SS.SDK_ID = BMS.SDK_ID \r\n" + "WHERE\r\n" + " BMS.LOTNAME = :MATERIALPACKINGNAME\r\n" + " AND (BMS.RECEIVE_FLAG IS NULL\r\n" + " OR BMS.RECEIVE_FLAG <> 'Y')"; List> list2 = IDMFrameServiceProxy.getSqlTemplate().queryForList(sql2, bindMap); if(list2.size() != 1) { throw new GlobalException("生产未完成入库,请联系IT处理!"); } // 良品与不良品与仓校验 String packingGrade = list2.get(0).get("PACKINGGRADE") == null ? "" : list2.get(0).get("PACKINGGRADE").toString(); Boolean judgeMtaerialStateWithERPLocation = JudgeMtaerialStateWithERPLocation(erpLocation, packingGrade); if (!judgeMtaerialStateWithERPLocation) { throw new GlobalException("仓库类型和物料品质等级不一致"); } // 判断是否是熟化仓 if(!(JudgeMentIsOvenSpec(erpLocation,materialSpecName))) { throw new GlobalException("物料为:"+materialSpecName+" 仓库为:"+erpLocation+" ,熟化对应不一致"); } } /** * 检验是否是否有组织权限 * @param password * @param orgNo * @return */ public Boolean orgPermission(String userId, String password, String orgNo) { String sql = "SELECT ORGNO FROM USERINFO WHERE USERID =:USERID AND PASSWORD =:PASSWORD"; Map bindMapOrg = new HashMap(); bindMapOrg.put("USERID",userId); bindMapOrg.put("PASSWORD",password); // 此物料的仓库是否是调拨单的出库仓库,如果无记录,则提示,系统无此条 List> orgList = IDMFrameServiceProxy.getSqlTemplate().queryForList(sql, bindMapOrg); if(orgList.get(0).get("ORGNO") == null || "".equals(orgList.get(0).get("ORGNO"))) { // throw new GlobalException("组织不存在"); }else { String orgs = (String)orgList.get(0).get("ORGNO"); if(orgs.contains(orgNo)) { return true; } } return false; } /** * 校验物料状态是否可以冲销 * @param undoId * @return * @throws Exception */ public Boolean CheckUndoCondition(String undoId) throws RuntimeException { String sql = " SELECT bm.UNDOID , BM .MATERIALPACKINGNAME FROM BS_MATERIALPACKINGUNDOINFO bm WHERE UNDOID = :UNDOID \r\n" + " MINUS \r\n" + " SELECT m.UNDOID , m.MATERIALPACKINGNAME FROM MATERIALPACKING m WHERE UNDOID = :UNDOID"; Map bindMapOrg = new HashMap(); bindMapOrg.put("UNDOID",undoId); // 判断是否有其他操作影响了物料状态 List> undoList = IDMFrameServiceProxy.getSqlTemplate().queryForList(sql, bindMapOrg); if(undoList != null && undoList.size() > 0) { throw new RuntimeException("物料状态发生了改变,无法完成冲销"); }else { } return true; } /** * 发货写入条码拆分表 * @param materialPackingName * @param shipRequestName * @param shipRequestDetailName * @param qty */ public void fahuoSplit (String materialPackingName, String shipRequestName,String shipRequestDetailName, BigDecimal qty) { String updateSql = "UPDATE MATERIALSHIPREQUESTDETAIL T SET T.SALEOUTQUANTITY = NVL(T.SALEOUTQUANTITY, 0) + :QTY " + "WHERE T.SHIPREQUESTNAME = :SHIPREQUESTNAME AND T.SHIPREQUESTDETAILNAME = :SHIPREQUESTDETAILNAME"; String insertSql = "INSERT INTO MATERIALPACKINGSUB T (T.MATERIALPACKINGNAME,T.RECEIVEREQUESTNAME,T.RECEIVEREQUESTDETAILNAME,T.QTY) \r\n" + "VALUES (:MATERIALPACKINGNAME,:SHIPREQUESTNAME,:SHIPREQUESTDETAILNAME,:QTY)"; Map hashMap = new HashMap (); hashMap.put("SHIPREQUESTNAME", shipRequestName); hashMap.put("SHIPREQUESTDETAILNAME", shipRequestDetailName); hashMap.put("MATERIALPACKINGNAME", materialPackingName); hashMap.put("QTY", qty); IDMFrameServiceProxy.getSqlTemplate().update(updateSql, hashMap); IDMFrameServiceProxy.getSqlTemplate().update(insertSql, hashMap); } /** * 更新订单状态 * @param shipRequestName */ public void updateShipRequestState (String shipRequestName) { //String sql = "SELECT 1 FROM MATERIALSHIPREQUESTDETAIL M WHERE SHIPREQUESTNAME = :SHIPREQUESTNAME HAVING SUM(M.REQUESTQUANTITY - M.ASSIGNEDQUANTITY) >= 0"; String sql="SELECT * FROM (\r\n" + " SELECT m.MATERIALSPECNAME,sum(m.REQUESTQUANTITY)RQTY,sum(m.ASSIGNEDQUANTITY)AQTY \r\n" + " FROM MATERIALSHIPREQUESTDETAIL M WHERE SHIPREQUESTNAME = :SHIPREQUESTNAME\r\n" + " GROUP BY m.MATERIALSPECNAME )\r\n" + " WHERE AQTY-RQTY<0 "; Map hashMap = new HashMap (); hashMap.put("SHIPREQUESTNAME", shipRequestName); List> queryForList = IDMFrameServiceProxy.getSqlTemplate().queryForList(sql, hashMap); //当查不出未拣配完成的料号则将单据置为Completed状态。zd.2024.9.24 if (queryForList == null || queryForList.size() < 1) { //判断是否存在未出库但是已经绑定了的box sql = "SELECT 1 FROM MATERIALPACKING T WHERE T.SHIPREQUESTNAME = :SHIPREQUESTNAME AND T.STOCKSTATE = 'Stocked'"; List> queryForList2 = IDMFrameServiceProxy.getSqlTemplate().queryForList(sql, hashMap); if (queryForList2 == null || queryForList2.size() < 1) { String updateSql = "UPDATE MATERIALSHIPREQUEST T SET T.SHIPREQUESTSTATE = 'Completed' WHERE T.SHIPREQUESTNAME = :SHIPREQUESTNAME"; IDMFrameServiceProxy.getSqlTemplate().update(updateSql, hashMap); } } } //成品入库拆分批次时存储物料凭证。zd.2024.9.27 public void SaveUnDoInfoBySplitCharge( String undoid,String commitDate ) { String insertUnDOMaterialPackingInfo = "insert into BS_MATERIALPACKINGUNDOINFO\r\n" + " (unDoID,\r\n" + " preundoid,\r\n" + " UNDODETAILNAME,\r\n" + " undoidstate,\r\n" + " UNDOIDDATE,\r\n" + " SITENAME,\r\n" + " MATERIALPACKINGNAME,\r\n" + " MATERIALPACKINGTYPE,\r\n" + " CONTENTMATERIALTYPE,\r\n" + " MATERIALTYPE,\r\n" + " MATERIALSPECNAME,\r\n" + " SUPERMATERIALPACKINGNAME,\r\n" + " PACKINGGRADE,\r\n" + " SUBPACKINGQUANTITY,\r\n" + " MATERIALCREATEQUANTITY,\r\n" + " MATERIALQUANTITY,\r\n" + " PACKINGSTATE,\r\n" + " OLDPACKINGSTATE,\r\n" + " STOCKSTATE,\r\n" + " OLDSTOCKSTATE,\r\n" + " HOLDSTATE,\r\n" + " AREANAME,\r\n" + " LOCATIONNAME,\r\n" + " DURABLENAME,\r\n" + " MATERIALPROCESSGROUPNAME,\r\n" + " LASTEVENTNAME,\r\n" + " LASTEVENTTIMEKEY,\r\n" + " LASTEVENTTIME,\r\n" + " LASTEVENTUSER,\r\n" + " LASTEVENTCOMMENT,\r\n" + " CREATETIME,\r\n" + " CREATEUSER,\r\n" + " RECEIVEREQUESTNAME,\r\n" + " RECEIVEREQUESTDETAILNAME,\r\n" + " MAKEDATE,\r\n" + " RECEIVEACTNO,\r\n" + " STOCKINTYPE,\r\n" + " RECEIVETIME,\r\n" + " RECEIVEUSER,\r\n" + " SHIPREQUESTNAME,\r\n" + " SHIPREQUESTDETAILNAME,\r\n" + " SHIPTIME,\r\n" + " SHIPUSER,\r\n" + " REASONCODETYPE,\r\n" + " OQARESULTSTATE,\r\n" + " OQARESULT,\r\n" + " ERPLOCATION,\r\n" + " ERPFACTORY,\r\n" + " REASONCODE,\r\n" + " CHARGE,\r\n" + " SUPPLIERNAME,\r\n" + " ETCSTATE,\r\n" + " ERPEVENTTIME,\r\n" + " NPFLAG)\r\n" + " WITH MS AS\r\n" + " (SELECT MATERIALPACKINGNAME, MAX(RECEIVEREQUESTNAME) RECEIVEREQUESTNAME, sum(qty) QTY\r\n" + " FROM MATERIALPACKINGSUB m\r\n" + " WHERE m.MATERIALPACKINGNAME IN\r\n" + " (SELECT MATERIALPACKINGNAME\r\n" + " from MATERIALPACKING a\r\n" + " where a.unDoID = :UNDOID)\r\n" + " GROUP BY MATERIALPACKINGNAME )\r\n" + " select unDoID,\r\n" + " '' as preundoid,\r\n" + " UNDODETAILNAME,\r\n" + " 'Completed' as undoidstate,\r\n" + " :commitDate AS UNDOIDDATE,\r\n" + " SITENAME,\r\n" + " m.MATERIALPACKINGNAME,\r\n" + " MATERIALPACKINGTYPE,\r\n" + " CONTENTMATERIALTYPE,\r\n" + " MATERIALTYPE,\r\n" + " MATERIALSPECNAME,\r\n" + " SUPERMATERIALPACKINGNAME,\r\n" + " PACKINGGRADE,\r\n" + " SUBPACKINGQUANTITY,\r\n" + " MATERIALCREATEQUANTITY,\r\n" + " MS.QTY,\r\n" + " PACKINGSTATE,\r\n" + " OLDPACKINGSTATE,\r\n" + " STOCKSTATE,\r\n" + " OLDSTOCKSTATE,\r\n" + " HOLDSTATE,\r\n" + " AREANAME,\r\n" + " LOCATIONNAME,\r\n" + " DURABLENAME,\r\n" + " MATERIALPROCESSGROUPNAME,\r\n" + " LASTEVENTNAME,\r\n" + " LASTEVENTTIMEKEY,\r\n" + " LASTEVENTTIME,\r\n" + " LASTEVENTUSER,\r\n" + " LASTEVENTCOMMENT,\r\n" + " CREATETIME,\r\n" + " CREATEUSER,\r\n" + " MS.RECEIVEREQUESTNAME,\r\n" + " '',\r\n" + " MAKEDATE,\r\n" + " RECEIVEACTNO,\r\n" + " STOCKINTYPE,\r\n" + " RECEIVETIME,\r\n" + " RECEIVEUSER,\r\n" + " SHIPREQUESTNAME,\r\n" + " SHIPREQUESTDETAILNAME,\r\n" + " SHIPTIME,\r\n" + " SHIPUSER,\r\n" + " REASONCODETYPE,\r\n" + " OQARESULTSTATE,\r\n" + " OQARESULT,\r\n" + " ERPLOCATION,\r\n" + " ERPFACTORY,\r\n" + " REASONCODE,\r\n" + " CHARGE,\r\n" + " SUPPLIERNAME,\r\n" + " ETCSTATE,\r\n" + " ERPEVENTTIME,\r\n" + " NPFLAG\r\n" + " from MATERIALPACKING m\r\n" + " LEFT JOIN MS\r\n" + " ON m.MATERIALPACKINGNAME = MS.MATERIALPACKINGNAME\r\n" + " where m.unDoID = :UNDOID"; Map bindMap_insert = new HashMap(); bindMap_insert.put("UNDOID", undoid); bindMap_insert.put("commitDate", commitDate); IDMFrameServiceProxy.getSqlTemplate() .update(insertUnDOMaterialPackingInfo, bindMap_insert); } /** * 物料凭证保存 * @param list * @param undoid * @param makeEventInfo */ public void SaveUnDoInfo(List list, String undoid, EventInfo makeEventInfo, String erpLocation,String commitDate,String shipRequestType, String eventUser,String shipRequestName) { String updateUndoInfo = "UPDATE MATERIALPACKING T SET T.unDoID = :unDoID WHERE T.MATERIALPACKINGNAME = :MATERIALPACKINGNAME " + "AND ERPLOCATION = :ERPLOCATION AND STOCKSTATE = 'Stocked'"; for (String s : list) { Map map = new HashMap (); map.put("MATERIALPACKINGNAME", s); map.put("ERPLOCATION", erpLocation); map.put("unDoID", undoid); IDMFrameServiceProxy.getSqlTemplate() .update(updateUndoInfo, map); } String insertUnDOMaterialPackingInfo = "insert into BS_MATERIALPACKINGUNDOINFO (unDoID,preundoid,UNDODETAILNAME,undoidstate,UNDOIDDATE," + "SITENAME, MATERIALPACKINGNAME, MATERIALPACKINGTYPE, CONTENTMATERIALTYPE," + "MATERIALTYPE, MATERIALSPECNAME, SUPERMATERIALPACKINGNAME, PACKINGGRADE, SUBPACKINGQUANTITY, MATERIALCREATEQUANTITY," + "MATERIALQUANTITY, PACKINGSTATE, OLDPACKINGSTATE, STOCKSTATE, OLDSTOCKSTATE, HOLDSTATE, AREANAME, LOCATIONNAME," + "DURABLENAME, MATERIALPROCESSGROUPNAME, LASTEVENTNAME, LASTEVENTTIMEKEY, LASTEVENTTIME, LASTEVENTUSER," + "LASTEVENTCOMMENT, CREATETIME, CREATEUSER, RECEIVEREQUESTNAME, RECEIVEREQUESTDETAILNAME," + "MAKEDATE, RECEIVEACTNO, STOCKINTYPE, RECEIVETIME, RECEIVEUSER, SHIPREQUESTNAME, SHIPREQUESTDETAILNAME, SHIPTIME," + "SHIPUSER, REASONCODETYPE, OQARESULTSTATE, OQARESULT, ERPLOCATION, ERPFACTORY, REASONCODE, CHARGE, SUPPLIERNAME,ETCSTATE,ERPEVENTTIME,NPFLAG)" + "select unDoID,'' as preundoid,UNDODETAILNAME,'Created' as undoidstate,:UNDOIDDATE AS UNDOIDDATE," // + "SITENAME, MATERIALPACKINGNAME, MATERIALPACKINGTYPE, CONTENTMATERIALTYPE," + "MATERIALTYPE, MATERIALSPECNAME, SUPERMATERIALPACKINGNAME, PACKINGGRADE, SUBPACKINGQUANTITY, MATERIALCREATEQUANTITY," + "DECODE(MATERIALQUANTITY2,0,MATERIALQUANTITY,MATERIALQUANTITY2) MATERIALQUANTITY, PACKINGSTATE, OLDPACKINGSTATE, STOCKSTATE, OLDSTOCKSTATE, HOLDSTATE, AREANAME, LOCATIONNAME," + "DURABLENAME, MATERIALPROCESSGROUPNAME, LASTEVENTNAME, LASTEVENTTIMEKEY, LASTEVENTTIME, LASTEVENTUSER," + "LASTEVENTCOMMENT, CREATETIME, CREATEUSER, RECEIVEREQUESTNAME, RECEIVEREQUESTDETAILNAME," + "MAKEDATE, RECEIVEACTNO, STOCKINTYPE, RECEIVETIME, RECEIVEUSER, :SHIPREQUESTNAME, SHIPREQUESTDETAILNAME, SHIPTIME," + "SHIPUSER, REASONCODETYPE, OQARESULTSTATE, OQARESULT, ERPLOCATION, ERPFACTORY, REASONCODE, CHARGE, SUPPLIERNAME,ETCSTATE,ERPEVENTTIME,NPFLAG" + " from MATERIALPACKING " + " where unDoID=:UNDOID"; Map bindMap_insert = new HashMap(); bindMap_insert.put("UNDOIDDATE", commitDate); bindMap_insert.put("UNDOID", undoid); bindMap_insert.put("SHIPREQUESTNAME", shipRequestName); bindMap_insert.put("USERID", eventUser); IDMFrameServiceProxy.getSqlTemplate() .update(insertUnDOMaterialPackingInfo, bindMap_insert); //更新Box状态,如果数量发货数量和条码数量相同则全部出货,小于则更新条码数量,取消单据解绑 for (String s : list) { MaterialPackingKey materialPackingKey = new MaterialPackingKey("SDK",s); MaterialPacking selectByKey = MaterialPackingServiceProxy.getMaterialPackingService().selectByKey(materialPackingKey); //通过sql取数量, String SLsQL = "SELECT m.MATERIALPACKINGNAME,m.MATERIALQUANTITY," + "m. MATERIALQUANTITY2 FROM MATERIALPACKING m" + " WHERE MATERIALPACKINGNAME = :MATERIALPACKINGNAME "; Map hashMap2 = new HashMap (); hashMap2.put("MATERIALPACKINGNAME", s); List> queryForList3 = IDMFrameServiceProxy.getSqlTemplate().queryForList(SLsQL, hashMap2); String materialQuantity = ""; String materialQuantity2 = ""; if (queryForList3 != null && queryForList3.size() > 0) { materialQuantity2 = queryForList3.get(0).get("MATERIALQUANTITY2").toString(); materialQuantity = queryForList3.get(0).get("MATERIALQUANTITY").toString(); } else { // throw new CustomException("单据" + shipRequestName + "库存" + materialPackingName + "不存在"); } BigDecimal fmaterialQuantity = new BigDecimal(materialQuantity); BigDecimal fmaterialQuantity2 = new BigDecimal(materialQuantity2); String erpLocation2 = selectByKey.getErpLocation(); if (erpLocation.equals(erpLocation2)) { if (fmaterialQuantity.compareTo(fmaterialQuantity2) > 0 && fmaterialQuantity2.compareTo(BigDecimal.ZERO) != 0) { Map hashMap = new HashMap (); hashMap.put("materialQuantity", fmaterialQuantity.subtract(fmaterialQuantity2)); // hashMap.put("materialQuantity2", 0); hashMap.put("shipRequestName", ""); hashMap.put("shipRequestDetailName", ""); SetEventInfo setEventInfo = new SetEventInfo(); setEventInfo.setUserColumns(hashMap); MaterialPackingServiceProxy.getMaterialPackingService().setEvent(materialPackingKey, makeEventInfo, setEventInfo); String updateSql = "UPDATE MATERIALPACKING T SET T.MATERIALQUANTITY2 = 0 ,T.MATERIALQUANTITY = :MATERIALQUANTITY " + "WHERE MATERIALPACKINGNAME = :MATERIALPACKINGNAME"; hashMap2.put("MATERIALQUANTITY2", materialQuantity2); hashMap2.put("MATERIALQUANTITY", fmaterialQuantity.subtract(fmaterialQuantity2)); IDMFrameServiceProxy.getSqlTemplate().update(updateSql, hashMap2); } else { Map hashMap = new HashMap (); hashMap.put("stockState", "StockOut"); // hashMap.put("shipRequestName", ""); // hashMap.put("shipRequestDetailName", ""); SetEventInfo setEventInfo = new SetEventInfo(); setEventInfo.setUserColumns(hashMap); MaterialPackingServiceProxy.getMaterialPackingService().setEvent(materialPackingKey, makeEventInfo, setEventInfo); } } } } /** * 保存undo信息 * 该方法用于更新和插入与物料包装相关的undo信息,根据提供的参数执行不同的数据库操作 * * @param list 包含物料包装名称的列表 * @param undoid undo的标识符,用于区分不同的undo操作 * @param makeEventInfo 包含事件信息的对象,用于更新物料包装的最后事件信息 */ public void SaveUnDoInfo_ForSap(List list, String undoid, EventInfo makeEventInfo) { // 更新事件名 // 此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); // 销售交货单不返回凭证 // 如果undoid不等于"S",则执行更新和插入操作,以记录undo信息 if(!StringUtils.equals("S", undoid)) { // 更新undo信息 // 此SQL语句用于更新物料包装的undoid,仅当库存状态为'Stocked'时 String updateUndoInfo = "UPDATE MATERIALPACKING T SET T.unDoID = :unDoID WHERE T.MATERIALPACKINGNAME in (:MATERIALPACKINGNAME) " + " AND STOCKSTATE = 'Stocked'"; Map map = new HashMap (); map.put("MATERIALPACKINGNAME", list); map.put("unDoID", undoid); IDMFrameServiceProxy.getSqlTemplate().update(updateUndoInfo, map); // 插入undo物料包装信息 // 此SQL语句用于插入新的记录到BS_MATERIALPACKINGUNDOINFO表中,记录详细的undo信息 String insertUnDOMaterialPackingInfo = "insert into BS_MATERIALPACKINGUNDOINFO (unDoID,preundoid,UNDODETAILNAME,undoidstate,UNDOIDDATE," + "SITENAME, MATERIALPACKINGNAME, MATERIALPACKINGTYPE, CONTENTMATERIALTYPE," + "MATERIALTYPE, MATERIALSPECNAME, SUPERMATERIALPACKINGNAME, PACKINGGRADE, SUBPACKINGQUANTITY, MATERIALCREATEQUANTITY," + "MATERIALQUANTITY, PACKINGSTATE, OLDPACKINGSTATE, STOCKSTATE, OLDSTOCKSTATE, HOLDSTATE, AREANAME, LOCATIONNAME," + "DURABLENAME, MATERIALPROCESSGROUPNAME, LASTEVENTNAME, LASTEVENTTIMEKEY, LASTEVENTTIME, LASTEVENTUSER," + "LASTEVENTCOMMENT, CREATETIME, CREATEUSER, RECEIVEREQUESTNAME, RECEIVEREQUESTDETAILNAME," + "MAKEDATE, RECEIVEACTNO, STOCKINTYPE, RECEIVETIME, RECEIVEUSER, SHIPREQUESTNAME, SHIPREQUESTDETAILNAME, SHIPTIME," + "SHIPUSER, REASONCODETYPE, OQARESULTSTATE, OQARESULT, ERPLOCATION, ERPFACTORY, REASONCODE, CHARGE, SUPPLIERNAME,ETCSTATE,ERPEVENTTIME,NPFLAG)" + "select unDoID,'' as preundoid,UNDODETAILNAME,'Created' as undoidstate,:UNDOIDDATE AS UNDOIDDATE," // + "SITENAME, MATERIALPACKINGNAME, MATERIALPACKINGTYPE, CONTENTMATERIALTYPE," + "MATERIALTYPE, MATERIALSPECNAME, SUPERMATERIALPACKINGNAME, PACKINGGRADE, SUBPACKINGQUANTITY, MATERIALCREATEQUANTITY," + "DECODE(MATERIALQUANTITY2,0,MATERIALQUANTITY,MATERIALQUANTITY2) MATERIALQUANTITY, PACKINGSTATE, OLDPACKINGSTATE, STOCKSTATE, OLDSTOCKSTATE, HOLDSTATE, AREANAME, LOCATIONNAME," + "DURABLENAME, MATERIALPROCESSGROUPNAME, LASTEVENTNAME, LASTEVENTTIMEKEY, LASTEVENTTIME, LASTEVENTUSER," + "LASTEVENTCOMMENT, CREATETIME, CREATEUSER, RECEIVEREQUESTNAME, RECEIVEREQUESTDETAILNAME," + "MAKEDATE, RECEIVEACTNO, STOCKINTYPE, RECEIVETIME, RECEIVEUSER, SHIPREQUESTNAME, SHIPREQUESTDETAILNAME, SHIPTIME," + "SHIPUSER, REASONCODETYPE, OQARESULTSTATE, OQARESULT, ERPLOCATION, ERPFACTORY, REASONCODE, CHARGE, SUPPLIERNAME,ETCSTATE,ERPEVENTTIME,NPFLAG" + " from MATERIALPACKING " + " where unDoID=:UNDOID"; Map bindMap_insert = new HashMap(); bindMap_insert.put("UNDOIDDATE", ""); bindMap_insert.put("UNDOID", undoid); IDMFrameServiceProxy.getSqlTemplate() .update(insertUnDOMaterialPackingInfo, bindMap_insert); } // 更新Box状态 // 根据物料数量和包装数量,更新物料包装的状态和相关属性 for (String s : list) { MaterialPackingKey materialPackingKey = new MaterialPackingKey("SDK",s); com.cim.idm.wmspackage.materialpacking.management.data.MaterialPacking selectByKey = MaterialPackingServiceProxy.getMaterialPackingService().selectByKey(materialPackingKey); double materialQuantity = selectByKey.getMaterialQuantity(); double materialQuantity2 = selectByKey.getMaterialQuantity2(); BigDecimal fmaterialQuantity = new BigDecimal(materialQuantity); BigDecimal fmaterialQuantity2 = new BigDecimal(materialQuantity2); if (fmaterialQuantity.compareTo(fmaterialQuantity2) > 0 && fmaterialQuantity2.compareTo(BigDecimal.ZERO) != 0) { Map hashMap = new HashMap (); hashMap.put("materialQuantity", fmaterialQuantity.subtract(fmaterialQuantity2)); hashMap.put("materialQuantity2", 0); hashMap.put("shipRequestName", ""); hashMap.put("shipRequestDetailName", ""); SetEventInfo setEventInfo = new SetEventInfo(); setEventInfo.setUserColumns(hashMap); MaterialPackingServiceProxy.getMaterialPackingService().setEvent(materialPackingKey, makeEventInfo, setEventInfo); } else { Map hashMap = new HashMap (); hashMap.put("stockState", "StockOut"); SetEventInfo setEventInfo = new SetEventInfo(); setEventInfo.setUserColumns(hashMap); MaterialPackingServiceProxy.getMaterialPackingService().setEvent(materialPackingKey, makeEventInfo, setEventInfo); } } } /** * 将物料信息发送到MES系统(制造执行系统)的新版本方法 * 该方法根据提供的发票号和收货活动号,查询数据库以获取相关的接收位置和工厂信息, * 然后调用MESServiceImpl的OutMaterialInfoSend_NEW方法将这些信息连同箱号列表一起发送到MES系统 * * @param invoiceNo 发票编号,用于标识特定的物料发货请求 * @param receiveActNo 收货活动编号,用于指定收货活动 * @param boxList 箱号列表,包含所有需要发送的物料箱号 */ public void sendMaterialInfoToMES_NEW(String invoiceNo,String receiveActNo,List boxList){ // 定义SQL查询语句,用于获取物料接收位置和接收工厂信息 String sql="SELECT m.ERPRECEIVELOCATION,m.ERPRECEIVEFACTORY FROM MATERIALSHIPREQUEST a,MATERIALSHIPREQUESTDETAIL m \r\n" + " WHERE m.SHIPREQUESTNAME =:SHIPREQUESTNAME and m.SHIPREQUESTNAME=a.SHIPREQUESTNAME " + " AND a.SHIPREQUESTDETAILTYPE in('311','261','201')"; // 创建参数映射,用于执行SQL查询 Map bp=new HashMap<>(); bp.put("SHIPREQUESTNAME", invoiceNo); try { // 执行SQL查询,获取查询结果列表 List> sr=IDMFrameServiceProxy.getSqlTemplate().queryForList(sql, bp); if(sr.size()>0) { // 创建MESServiceImpl实例,用于调用发送物料信息到MES系统的方法 MESServiceImpl mesService=new MESServiceImpl() ; // 调用MESServiceImpl的OutMaterialInfoSend_NEW方法,发送物料信息到MES系统 mesService.OutMaterialInfoSend_NEW(invoiceNo, "SDK", receiveActNo, "", sr.get(0).get("ERPRECEIVELOCATION")==null?"":sr.get(0).get("ERPRECEIVELOCATION").toString() ,sr.get(0).get("ERPRECEIVEFACTORY")==null?"":sr.get(0).get("ERPRECEIVEFACTORY").toString(),boxList ); } } catch (CustomException e) { // 异常处理:打印异常堆栈跟踪信息 e.printStackTrace(); } } public void sendMaterialInfoToMES_NEW2(String invoiceNo,String receiveActNo,List boxList){ // 定义SQL查询语句,用于获取物料接收位置和接收工厂信息 String sql="SELECT m.ERPRECEIVELOCATION,m.ERPRECEIVEFACTORY FROM MATERIALSHIPREQUEST a,MATERIALSHIPREQUESTDETAIL m \r\n" + " WHERE m.SHIPREQUESTNAME =:SHIPREQUESTNAME and m.SHIPREQUESTNAME=a.SHIPREQUESTNAME " + " AND a.SHIPREQUESTDETAILTYPE in('311','261')"; // 创建参数映射,用于执行SQL查询 Map bp=new HashMap<>(); bp.put("SHIPREQUESTNAME", invoiceNo); try { // 执行SQL查询,获取查询结果列表 List> sr=IDMFrameServiceProxy.getSqlTemplate().queryForList(sql, bp); if(sr.size()>0) { // 创建MESServiceImpl实例,用于调用发送物料信息到MES系统的方法 MESServiceImpl mesService=new MESServiceImpl() ; // 调用MESServiceImpl的OutMaterialInfoSend_NEW方法,发送物料信息到MES系统 mesService.OutMaterialInfoSend_NEW2(invoiceNo, "SDK", receiveActNo, "", sr.get(0).get("ERPRECEIVELOCATION")==null?"":sr.get(0).get("ERPRECEIVELOCATION").toString() ,sr.get(0).get("ERPRECEIVEFACTORY")==null?"":sr.get(0).get("ERPRECEIVEFACTORY").toString(),boxList ); } } catch (CustomException e) { // 异常处理:打印异常堆栈跟踪信息 e.printStackTrace(); } } }