package com.cim.idm.controller; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.cim.idm.framework.IDMFrameServiceProxy; import com.cim.idm.framework.data.EventInfo; import com.cim.idm.framework.util.time.TimeStampUtil; import com.cim.idm.model.CheckMark; import com.cim.idm.model.CheckPlan; import com.cim.idm.service.Impl.CheckPlanServiceImpl; import com.cim.idm.service.Impl.ReturnStockIntoServiceImpl; import com.cim.idm.service.impl.ToSAPServiceImpl; import com.cim.idm.utils.AjaxResult; import com.cim.idm.utils.EventInfoUtil; import com.cim.idm.wmspackage.materialpacking.MaterialPackingServiceProxy; 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.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import java.util.*; /** * 盘点 标记 * @author * */ @RestController @EnableAutoConfiguration @RequestMapping("/api/checkmark") public class CheckMarkController { @Autowired private ToSAPServiceImpl toSAPServiceImpl; @Autowired private com.cim.idm.service.Impl.CheckPlanServiceImpl CheckPlanServiceImpl; @RequestMapping(value = "/createMark", method = RequestMethod.POST) public AjaxResult createMark(@RequestBody JSONObject in ) throws Exception{ CheckMark javaObject = JSON.toJavaObject(in, CheckMark.class); String checkplanname = javaObject.getCHECKPLANNAME(); String materialpackingname = javaObject.getMATERIALPACKINGNAME(); String sitename = javaObject.getSITENAME(); String checkplatate = javaObject.getCHECKPLATATE(); String sql = "UPDATE CHECKPLAN c SET CHECKPLATATE = :CHECKPLATATE WHERE CHECKPLANNAME = :CHECKPLANNAME AND SITENAME = :SITENAME AND MATERIALPACKINGNAME = :MATERIALPACKINGNAME"; Map bindMap = new HashMap(); bindMap.put("SITENAME",sitename); bindMap.put("MATERIALPACKINGNAME",materialpackingname); bindMap.put("CHECKPLANNAME",checkplanname); bindMap.put("CHECKPLATATE",checkplatate); int update = IDMFrameServiceProxy.getSqlTemplate().update(sql, bindMap); System.out.println("****"+update); String sqlString = "UPDATE CHECKRECORD SET CHECKPLATATE = :CHECKPLATATE WHERE CHECKPLANNAME = :CHECKPLANNAME AND SITENAME = :SITENAME AND MATERIALPACKINGNAME = :MATERIALPACKINGNAME"; int update2 = IDMFrameServiceProxy.getSqlTemplate().update(sqlString, bindMap); System.out.println("****"+update2); return AjaxResult.me().setResultObj(update); } // @RequestMapping(value = "/deleteMark", method = RequestMethod.POST) // public AjaxResult deleteMark(@RequestBody JSONObject in ) throws Exception{ // // CheckMark javaObject = JSON.toJavaObject(in, CheckMark.class); // String checkplanname = javaObject.getCHECKPLANNAME(); // String materialpackingname = javaObject.getMATERIALPACKINGNAME(); // String sitename = javaObject.getSITENAME(); // String sql = "UPDATE CHECKPLAN c SET CHECKPLATATE = '否' WHERE CHECKPLANNAME = :CHECKPLANNAME AND SITENAME = :SITENAME AND MATERIALPACKINGNAME = :MATERIALPACKINGNAME"; // Map bindMap = new HashMap(); // bindMap.put("SITENAME",sitename); // bindMap.put("MATERIALPACKINGNAME",materialpackingname); // bindMap.put("CHECKPLANNAME",checkplanname); // int update = IDMFrameServiceProxy.getSqlTemplate().update(sql, bindMap); // System.out.println("****"+update); // String sqlString = "UPDATE CHECKRECORD SET CHECKPLATATE = '否' WHERE CHECKPLANNAME = :CHECKPLANNAME AND SITENAME = :SITENAME AND MATERIALPACKINGNAME = :MATERIALPACKINGNAME"; // int update2 = IDMFrameServiceProxy.getSqlTemplate().update(sql, bindMap); // System.out.println("****"+update2); // return AjaxResult.me().setResultObj(update); // } @RequestMapping(value = "/checkmarkAudit", method = RequestMethod.POST) public AjaxResult checkmarkAudit(@RequestBody JSONObject in ) throws Exception{ CheckPlan javaObject = JSON.toJavaObject(in, CheckPlan.class); String planDate = javaObject.getPlanDate(); //时间 String checkPlanName = javaObject.getCheckPlanName();//测试名 Map bindMap = new HashMap(); bindMap.put("PLANDATE",planDate); bindMap.put("CHECKPLANNAME",checkPlanName); String sql = "UPDATE CHECKPLAN c SET CHECKPLANSTATE = 'Audit' WHERE PLANDATE = :PLANDATE AND CHECKPLANNAME = :CHECKPLANNAME"; int update = IDMFrameServiceProxy.getSqlTemplate().update(sql, bindMap); return AjaxResult.me().setResultObj(update); } //Approved @RequestMapping(value = "/Auditcheckmark", method = RequestMethod.POST) public AjaxResult Auditcheckmark(@RequestBody JSONObject in ) throws Exception{ CheckPlan javaObject = JSON.toJavaObject(in, CheckPlan.class); String planDate = javaObject.getPlanDate(); //时间 String checkPlanName = javaObject.getCheckPlanName();//测试名 String user=javaObject.getUser(); String commitDate=javaObject.getCommitDate(); String opCode = javaObject.getOpCode(); if(StringUtils.isEmpty(commitDate)) { commitDate=TimeStampUtil.getCurrentTime("yyyy-MM-dd"); } String billCode=""; String siteName="SDK"; EventInfoUtil eventInfoUtil=new EventInfoUtil(); EventInfo makeEventInfo=new EventInfo(); ReturnStockIntoServiceImpl rs=new ReturnStockIntoServiceImpl(); Map bindMap = new HashMap(); bindMap.put("PLANDATE",planDate); bindMap.put("CHECKPLANNAME",checkPlanName); //盘点计划有,实物没有。做其他出库.zd.2024.8.30 // 获取盘亏的ERPLOCATION String sql_erp = " SELECT DISTINCT ERPLOCATION FROM (\r\n" + " SELECT c.ERPLOCATION, (NVL(c2.MATERIALQUANTITY, 0) -c.MATERIALQUANTITY) AS DifferenceQuantity,\r\n" + " c.CHECKPLATATE,c.CHECKPLANSTATE\r\n" + " FROM CHECKPLAN c\r\n" + " LEFT JOIN CHECKRECORD c2 ON c.CHECKPLANNAME = c2.CHECKPLANNAME AND c.ERPLOCATION = c2.ERPLOCATION \r\n" + " AND c.MATERIALPACKINGNAME = c2.MATERIALPACKINGNAME AND c.SYSLOCATION = c2.ACTLOCATION\r\n" + " WHERE c.CHECKPLANNAME =:CHECKPLANNAME AND c.PLANDATE = :PLANDATE )\r\n" + " WHERE DifferenceQuantity<0 AND nvl(CHECKPLATATE,'是')='是' AND nvl(CHECKPLANSTATE,'N')<>'Approved' "; List> sr_erp = IDMFrameServiceProxy.getSqlTemplate().queryForList(sql_erp, bindMap); if (sr_erp.size() > 0) { for (int i = 0; i < sr_erp.size(); i++) { String erpLocation = sr_erp.get(i).get("ERPLOCATION").toString(); bindMap.put("ERPLOCATION", erpLocation); //查找盘亏的批次 String sql_pk = " SELECT a.*,ABS(DifferenceQuantity)NUM FROM (\r\n" + " SELECT c.MATERIALPACKINGNAME,c.MATERIALSPECNAME,m.UNIT,c.ERPLOCATION,c.SYSLOCATION,m.ERPFACTORY,\r\n" + " NVL( c.MATERIALQUANTITY,0) AS MATERIALQUANTITY,NVL(c2.MATERIALQUANTITY, 0) AS MATERIALACTQUANTITY, \r\n" + " (NVL(c2.MATERIALQUANTITY, 0) -c.MATERIALQUANTITY) AS DifferenceQuantity,c.CHECKPLATATE,c.CHECKPLANSTATE,\r\n" + " m.CHARGE ,m.SDK_ID ,m.PHASE ,TO_CHAR(m.EXPIRINGDATE, 'YYYY-MM-DD HH24:MI:SS') expdate,\r\n" + " TO_CHAR(m.MAKEDATE, 'YYYY-MM-DD HH24:MI:SS') proddate,TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') indate\r\n" + " FROM CHECKPLAN c\r\n" + " LEFT JOIN MATERIALPACKING m ON c.MATERIALPACKINGNAME=m.MATERIALPACKINGNAME \r\n" + " LEFT JOIN CHECKRECORD c2 ON c.CHECKPLANNAME = c2.CHECKPLANNAME AND c.ERPLOCATION = c2.ERPLOCATION \r\n" + " AND c.MATERIALPACKINGNAME = c2.MATERIALPACKINGNAME AND c.SYSLOCATION = c2.ACTLOCATION\r\n" + " WHERE c.CHECKPLANNAME =:CHECKPLANNAME AND c.PLANDATE = :PLANDATE AND c.ERPLOCATION=:ERPLOCATION)A\r\n" + " WHERE DifferenceQuantity<0 AND nvl(CHECKPLATATE,'是')='是' AND nvl(CHECKPLANSTATE,'N')<>'Approved' "; List> sr_pk = IDMFrameServiceProxy.getSqlTemplate().queryForList(sql_pk, bindMap); if(sr_pk.size()>0) { //调用SAP接口 billCode=toSAPServiceImpl.qtcrNoInvoiceForCheckPlan(sr_pk, "qtc", user, commitDate,opCode); //更新盘点计划状态 String sql = "UPDATE CHECKPLAN c SET CHECKPLANSTATE = 'Approved' WHERE PLANDATE = :PLANDATE AND CHECKPLANNAME = :CHECKPLANNAME AND ERPLOCATION=:ERPLOCATION"; IDMFrameServiceProxy.getSqlTemplate().update(sql, bindMap); //更新批次状态 List mpkList=new ArrayList<>(); for(int j=0;j userc=new HashMap<>(); userc.put("unDoID", billCode); userc.put("stockState", "StockOut"); setEventInfo.setUserColumns(userc); makeEventInfo = eventInfoUtil.makeEventInfo("StockOutForCheckPlan", user, "StockOutForCheckPlan"); MaterialPackingServiceProxy.getMaterialPackingService().setEvent(mpkList, makeEventInfo, setEventInfo); //存储物料凭证 rs.SaveUnDoInfo(billCode, commitDate); } } } //盘点计划没有,实物有。做其他入库.zd.2024.8.30 // 获取盘盈的ERPLOCATION String sql_erp_py = " SELECT DISTINCT ERPLOCATION FROM (\r\n" + "SELECT c.ERPLOCATION , c.CHECKPLANSTATE,\r\n" + " (NVL(c.MATERIALQUANTITY, 0) -NVL(c2.MATERIALQUANTITY, 0)) AS DifferenceQuantity,c.CHECKPLATATE\r\n" + " FROM CHECKRECORD c \r\n" + " LEFT JOIN CHECKPLAN c2 ON c.CHECKPLANNAME = c2.CHECKPLANNAME AND c.ERPLOCATION = c2.ERPLOCATION \r\n" + " AND c.MATERIALPACKINGNAME = c2.MATERIALPACKINGNAME AND c.ACTLOCATION = c2.SYSLOCATION \r\n" + " WHERE c.CHECKPLANNAME =:CHECKPLANNAME AND c.PLANDATE = :PLANDATE )\r\n" + " WHERE DifferenceQuantity>0 AND nvl(CHECKPLATATE,'是')='是' AND nvl(CHECKPLANSTATE,'N')<>'Approved' "; List> sr_erp_py = IDMFrameServiceProxy.getSqlTemplate().queryForList(sql_erp_py, bindMap); if (sr_erp_py.size() > 0) { for (int i = 0; i < sr_erp_py.size(); i++) { String erpLocation = sr_erp_py.get(i).get("ERPLOCATION").toString(); bindMap.put("ERPLOCATION", erpLocation); // 查找盘盈的批次 String sql_py = " SELECT a.*,ABS(DifferenceQuantity)NUM FROM (\r\n" + " SELECT c.MATERIALPACKINGNAME,c.MATERIALSPECNAME,c.ERPLOCATION,c.ACTLOCATION SYSLOCATION,m.ERPFACTORY,\r\n" + " NVL( c.MATERIALQUANTITY,0) AS MATERIALQUANTITY,NVL(c2.MATERIALQUANTITY, 0) AS MATERIALACTQUANTITY, \r\n" + " (NVL(c.MATERIALQUANTITY, 0) -NVL(c2.MATERIALQUANTITY, 0)) AS DifferenceQuantity,c.CHECKPLATATE,c.CHECKPLANSTATE,\r\n" + " m.CHARGE ,m.SDK_ID ,m.PHASE ,TO_CHAR(m.EXPIRINGDATE, 'YYYY-MM-DD HH24:MI:SS') expdate,\r\n" + " TO_CHAR(m.MAKEDATE, 'YYYY-MM-DD HH24:MI:SS') proddate,TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') indate\r\n" + " FROM CHECKRECORD c \r\n" + " LEFT JOIN MATERIALPACKING m ON c.MATERIALPACKINGNAME=m.MATERIALPACKINGNAME\r\n" + " LEFT JOIN CHECKPLAN c2 ON c.CHECKPLANNAME = c2.CHECKPLANNAME AND c.ERPLOCATION = c2.ERPLOCATION \r\n" + " AND c.MATERIALPACKINGNAME = c2.MATERIALPACKINGNAME AND c.ACTLOCATION = c2.SYSLOCATION \r\n" + " WHERE c.CHECKPLANNAME =:CHECKPLANNAME AND c.PLANDATE = :PLANDATE AND c.ERPLOCATION =:ERPLOCATION)a\r\n" + " WHERE DifferenceQuantity>0 AND nvl(CHECKPLATATE,'是')='是' AND nvl(CHECKPLANSTATE,'N')<>'Approved' "; List> sr_pk = IDMFrameServiceProxy.getSqlTemplate().queryForList(sql_py, bindMap); if (sr_pk.size() > 0) { // 调用SAP接口 billCode = toSAPServiceImpl.qtcrNoInvoiceForCheckPlan(sr_pk, "qtr", user, commitDate,opCode); // 更新盘点计划状态 String sql = "UPDATE CHECKRECORD c SET CHECKPLANSTATE = 'Approved' WHERE PLANDATE = :PLANDATE AND CHECKPLANNAME = :CHECKPLANNAME AND ERPLOCATION=:ERPLOCATION"; IDMFrameServiceProxy.getSqlTemplate().update(sql, bindMap); // 更新批次状态 List mpkList = new ArrayList<>(); for (int j = 0; j < sr_pk.size(); j++) { MaterialPackingKey mpk = new MaterialPackingKey(); mpk.setSiteName(siteName); mpk.setMaterialPackingName(sr_pk.get(j).get("MATERIALPACKINGNAME").toString()); mpkList.add(mpk); String sqlu=" UPDATE MATERIALPACKING m SET m.ERPLOCATION =:ERPLOCATION,m.LOCATIONNAME =:LOCATIONNAME\r\n" + " WHERE m.SITENAME =:SITENAME AND m.MATERIALPACKINGNAME =:MATERIALPACKINGNAME "; Map bpu=new HashMap<>(); bpu.put("ERPLOCATION", erpLocation); bpu.put("LOCATIONNAME", sr_pk.get(j).get("SYSLOCATION").toString()); bpu.put("SITENAME", siteName); bpu.put("MATERIALPACKINGNAME", sr_pk.get(j).get("MATERIALPACKINGNAME").toString()); IDMFrameServiceProxy.getSqlTemplate().update(sqlu, bpu); } SetEventInfo setEventInfo = new SetEventInfo(); Map userc = new HashMap<>(); userc.put("unDoID", billCode); userc.put("stockState", "Stocked"); setEventInfo.setUserColumns(userc); makeEventInfo = eventInfoUtil.makeEventInfo("StockInForCheckPlan", user, "StockInForCheckPlan"); MaterialPackingServiceProxy.getMaterialPackingService().setEvent(mpkList, makeEventInfo, setEventInfo); //存储物料凭证 rs.SaveUnDoInfo(billCode, commitDate); } } } return AjaxResult.me().setResultObj(null); } /** * 创建盘点单 * @param in 参数 * @return * @throws Exception */ @RequestMapping(value = "/createCheckPlan", method = RequestMethod.POST) public AjaxResult CreateCheckPlan(@RequestBody JSONObject in ) throws Exception { AjaxResult ajaxResult = new AjaxResult(); String user = (String) in.get("USER"); String palanDate = (String) in.get("PLANDATE"); String checkPlanName = (String) in.get("CHECKPLANNAME"); String moveFlag = (String) in.get("MOVEFLAG"); String siteName = (String) in.get("SITENAME"); //3、遍历map中的值 JSONArray boxListArray = in.getJSONArray("BOXLIST"); // 创建一个列表来存储转换后的 LinkedHashMap List> boxList = new ArrayList<>(); // 遍历 JSONArray 并转换为 LinkedHashMap for (int i = 0; i < boxListArray.size(); i++) { JSONObject jsonObject = boxListArray.getJSONObject(i); LinkedHashMap linkedHashMap = new LinkedHashMap<>(); // 将每个字段添加到 LinkedHashMap 中 for (String key : jsonObject.keySet()) { linkedHashMap.put(key, jsonObject.getString(key)); } // 添加到列表中 boxList.add(linkedHashMap); } if("全盘".equals(boxList.get(0).get("PLANTYPE").toString())){ //如果是全盘,校验所选盘点日期是否已经创建过盘带单 String querySql = " SELECT * FROM CHECKPLAN" + " WHERE SITENAME =:SITENAME AND PLANDATE =:PLANDATE AND PLANTYPE =:PLANTYPE "; Map qeuryMap = new HashMap (); qeuryMap.put("SITENAME", siteName); qeuryMap.put("PLANDATE", palanDate); qeuryMap.put("PLANTYPE", boxList.get(0).get("PLANTYPE").toString()); List> queryCheckPlanList = IDMFrameServiceProxy.getSqlTemplate().queryForList(querySql, qeuryMap); if(null != queryCheckPlanList && queryCheckPlanList.size() > 0){ return AjaxResult.me().setSuccess(true).setMessage("已存在方式为全盘日期:" + palanDate + "的盘点计划").setErrorCode(400); } } //LinkedHashMap linkedHashMap = ( LinkedHashMap) in.get("BOXLIST"); EventInfo eventInfo = new EventInfoUtil().makeEventInfo("CreateCheckPlan", user, "CreateCheckPlan", "", ""); if(null != boxList && boxList.size() > 0 && StringUtils.isNotEmpty(user)){ return CheckPlanServiceImpl.CreateCheckPlanListCreate(eventInfo,boxList,palanDate,checkPlanName,moveFlag,siteName); } return AjaxResult.me().setSuccess(true).setErrorCode(200); } }