700 lines
32 KiB
Java
Raw Normal View History

2025-03-10 13:46:51 +08:00
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<String, Object> QueryMap = new HashMap<String, Object>();
QueryMap.put("STORAGENAME", storage);
QueryMap.put("ERPLOCATION", loction);
List<Map<String,Object>> 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<String, Object> DetailMap = new HashMap<String, Object>();
DetailMap.put("MATERIALSPECNAME",materialSpec );
List<Map<String,Object>> ShipDetaillist = IDMFrameServiceProxy.getSqlTemplate().queryForList(DetailSql, DetailMap);
String DetailSql2 = "SELECT IS_OVEN FROM BS_ERPLOCATION m WHERE ERPLOCATIONNAME =:ERPLOCATIONAMEE AND IS_OVEN='Y' ";
Map<String, Object> DetailMap2 = new HashMap<String, Object>();
DetailMap2.put("ERPLOCATIONAMEE",ERPLOcxation );
List<Map<String,Object>> 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<String, Object> DetailMap2 = new HashMap<String, Object>();
// DetailMap2.put("ERPLOCATIONAMEE",ERPLOcxation );
// List<Map<String,Object>> 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<String, Object> DetailMap = new HashMap<String, Object>();
DetailMap.put("MATERIALSPECNAME",materialSpec );
List<Map<String,Object>> ShipDetaillist = IDMFrameServiceProxy.getSqlTemplate().queryForList(DetailSql, DetailMap);
String DetailSql2 = "SELECT CONST_TEMP FROM BS_ERPLOCATION m WHERE ERPLOCATIONNAME =:ERPLOCATIONAMEE AND CONST_TEMP='Y' ";
Map<String, Object> DetailMap2 = new HashMap<String, Object>();
DetailMap2.put("ERPLOCATIONAMEE",ERPLOcxation );
List<Map<String,Object>> 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<String, Object> DetailMap = new HashMap<String, Object>();
DetailMap.put("ERPLOCATION",ERPLOcxation );
List<Map<String,Object>> 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<String, Object> bindMap = new HashMap<String, Object>();
bindMap.put("MATERIALPACKINGNAME",materialPackingName);
bindMap.put("ERPFACTORY",erpFactory);
bindMap.put("ERPLOCATION",erpLocation);
bindMap.put("LOCATIONNAME",locationName);
List<Map<String,Object>> list = IDMFrameServiceProxy.getSqlTemplate().queryForList(sql, bindMap);
if(list.size() > 1) {
throw new GlobalException("条码不止一个,请联系IT处理");
}
if (list.size() == 1) {
for (Map<String, Object> 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<Map<String,Object>> 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<String, Object> bindMapOrg = new HashMap<String, Object>();
bindMapOrg.put("USERID",userId);
bindMapOrg.put("PASSWORD",password);
// 此物料的仓库是否是调拨单的出库仓库,如果无记录,则提示,系统无此条
List<Map<String,Object>> 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<String, Object> bindMapOrg = new HashMap<String, Object>();
bindMapOrg.put("UNDOID",undoId);
// 判断是否有其他操作影响了物料状态
List<Map<String,Object>> 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<String, Object> hashMap = new HashMap<String,Object> ();
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<String, Object> hashMap = new HashMap<String,Object> ();
hashMap.put("SHIPREQUESTNAME", shipRequestName);
List<Map<String,Object>> 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<Map<String,Object>> 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<String, Object> bindMap_insert = new HashMap<String, Object>();
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<String> 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<String,Object> map = new HashMap<String,Object> ();
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<String, Object> bindMap_insert = new HashMap<String, Object>();
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<String, Object> hashMap2 = new HashMap<String,Object> ();
hashMap2.put("MATERIALPACKINGNAME", s);
List<Map<String, Object>> 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<String, Object> hashMap = new HashMap<String,Object> ();
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<String, Object> hashMap = new HashMap<String,Object> ();
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<String> 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<String,Object> bpu = new HashMap<String,Object> ();
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<String,Object> map = new HashMap<String,Object> ();
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<String, Object> bindMap_insert = new HashMap<String, Object>();
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<String, Object> hashMap = new HashMap<String,Object> ();
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<String, Object> hashMap = new HashMap<String,Object> ();
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<String> 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<String, Object> bp=new HashMap<>();
bp.put("SHIPREQUESTNAME", invoiceNo);
try {
// 执行SQL查询获取查询结果列表
List<Map<String, Object>> 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();
}
}
}