commit 6fe4055399177dd181f81d4f0479e7e70fd9ef02 Author: gongbaoxiong <751575283@qq.com> Date: Wed Sep 3 15:08:01 2025 +0800 Default Changelist diff --git a/src/com/wxzd/wms/jkgl/server/EwmJk.java b/src/com/wxzd/wms/jkgl/server/EwmJk.java new file mode 100644 index 0000000..2bee7d5 --- /dev/null +++ b/src/com/wxzd/wms/jkgl/server/EwmJk.java @@ -0,0 +1,1766 @@ +package com.wxzd.wms.jkgl.server; + +import java.io.File; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.rmi.RemoteException; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Vector; + +import javax.jws.WebService; + +import org.apache.axis.client.Service; + + +import com.alibaba.fastjson.JSON; +import com.eclipsesource.json.Json; +import com.eclipsesource.json.JsonArray; +import com.eclipsesource.json.JsonObject; +import com.eclipsesource.json.JsonValue; +import com.wxzd.wms.EASLogin.EASLoginSoapBindingStub; +import com.wxzd.wms.EASLogin.WSContext; +import com.wxzd.wms.agv.server.AgvServlet; +import com.wxzd.wms.util.ServerUtil; +import com.wxzd.wms.util.XmlHelp; +import com.zcsoft.client.ObjectFromServlet; +import com.zcsoft.client.RemoteAccesser; +import com.zcsoft.dbvisit.DB; +import com.zcsoft.log.LogWriter; +import com.zcsoft.util.SerialNumber; +/** + * 供 MES,EAS调用的web service接口实现类 + * + * @author + * + */ +@WebService +public class EwmJk { + +// LogWriter easlw = new LogWriter("Axis", +// new File("E:\\asrslogs\\easjk"), "{yyMM\\dd}EwmjkServer.log"); +// LogWriter meslw = new LogWriter("Axis", +// new File("E:\\asrslogs\\mesjk"), "{yyMM\\dd}EwmjkServer.log"); +// LogWriter agvlw = new LogWriter("Axis", +// new File("E:\\asrslogs\\agvjk"), "{yyMM\\dd}EwmjkServer.log"); +// LogWriter rgvlw = new LogWriter("Axis", +// new File("E:\\asrslogs\\rgvjk"), "{yyMM\\dd}EwmjkServer.log"); + LogWriter easlw = WebServiceLogger.getInstance1(getClass().getName()); + LogWriter meslw = WebServiceLogger.getInstance2(getClass().getName()); + LogWriter agvlw = WebServiceLogger.getInstance3(getClass().getName()); + LogWriter rgvlw = WebServiceLogger.getInstance4(getClass().getName()); + + private final DB db; + + //private static final Map repertorys = XmlHelp.getRepertorys("F:\\Code\\Java\\nuoli\\siQiWms\\repertorys", "repertory"); + private static final Map repertorys = XmlHelp.getRepertorys("D:\\WXZD-ASRS\\tomcat\\conf\\repertorys", "repertory"); + { + meslw.debug("repertorys : "+repertorys); + } + + public EwmJk() + { + db = new DB(); + easlw.setLogLevel(LogWriter.DEBUG); + meslw.setLogLevel(LogWriter.DEBUG); + agvlw.setLogLevel(LogWriter.DEBUG); + rgvlw.setLogLevel(LogWriter.DEBUG); + } + /** + * 生成入库单 + * + */ + String sqlInsertRkd = DB.prepareInsertStmt("cprkd", + "ysdh,lx,slr,ysrq,zl,ckbh,sflz,djbh,ckmc"); + String sqlInsertRkdMx = DB.prepareInsertStmt("cprkdmx", + "ysdh,mxbh,cpbh,rksl,lpxx,color,colorname,cpmc,cpgg1,cpgg2,entryid,jcddbh,jcddid,jldw,warehouse"); + + String sqlInsertSCTLRkd = DB.prepareInsertStmt("cprkd","ysdh,lx,slr,ysrq,zl,ckbh,sflz,djbh"); + String sqlInsertSCTLRkdMx = DB.prepareInsertStmt("cprkdmx","ysdh,mxbh,cpbh,rksl,lpxx,color,cpmc,cpgg1,cpgg2,jcddbh,jcddid,relationNumber"); + + public String insertMesRkd(String req) + { + meslw.log("call insertMesRkd with parameter " + req, LogWriter.DEBUG); + List sqls = new ArrayList(); + List values = new ArrayList(); + try + { + ArrayList oprObjArrayszs=new ArrayList(); + JsonObject jo = Json.parse(req).asObject(); + String operationType=jo.get("operationType").asString(); + String czr=jo.get("czr").asString(); + //操作流水号 + String djbh = jo.get("operationNumber").asString(); + //ws btAAAACNt9676fiu 半成品 + String ckmc = null; + ckmc = jo.getString("warehouse", ""); + System.out.println("warehouse ckmc"+ckmc); + if (ckmc.length()==0) + { + return getOut("insertMesRkd", 1, "插入入库单据时操作失败,未知的仓库名称 单据编号:"+djbh,req,meslw); + + } + if(repertorys.get(ckmc)==null) + { + return getOut("insertMesCkd", 1, "插入入库单据时操作失败,本地未发现 仓库ID为 : "+ckmc+" 的仓库号",req,meslw); + } + ckmc = repertorys.get(ckmc); + String djlx=null; + if(db.hasAnyData("select 2 from CPRKD where djbh=?", djbh)) + { + return getOut("insertMesRkd", 1, "插入入库单据时操作失败,重复的操作流水号: "+djbh,req,meslw); + } + //单据类型需要转换为WMS与之对应的类型 计划领料(PLAN),执行领料(EXCUTE),退料(RETURN),补料(FEEDING),完工入库(STORAGE) + //退料单独执行处理 + if("RETURN".equals(operationType)) + { + djlx = "10"; + String result = MesTl(jo,sqls,values,djlx,djbh,req); + if(result != null ){return result;} + } + else + { + if("STORAGE".equals(operationType)) + { + djlx="11"; + } + //目标库位,MES呼叫工位 + String mbkw = jo.getString("targetLocation",""); + //下发日期 + String ysrq=jo.get("operationTime").asString(); + //WMS出库单号 + String ysdh = SerialNumber.getSerialNumber("cprkd"); +// String easid = jo.get("easId").asString(); + sqls.add(sqlInsertRkd); + values.add(new Object[] { ysdh, djlx,czr ,ysrq, "2","LTCK","1",djbh,ckmc}); + //获取领料计划明细 + JsonArray items = jo.get("data").asArray(); + String jcddbh=null; + String jcddid=null; + for (JsonValue item : items) + { + JsonObject one = item.asObject(); + //获得集成编号 + jcddbh = one.getString("orderNumber", ""); + + jcddid = one.getString("easId", ""); + + if(jcddbh == null || jcddid == null || jcddbh.length()<=0 || jcddid.length()<=0) + { + return getOut("insertMesCkd", 1, "插入出库单据时操作失败,本地未发现 orderNumber 或 easId 为空",req,meslw); + } + + //获取领料信息集合materialList + JsonArray itemxxs = one.get("materialList").asArray(); + //遍历物料信息 + for (JsonValue itemxx : itemxxs) + { + JsonObject two = itemxx.asObject(); + //产品编号 + String cpbh = two.getString("materialCode", ""); + + //数量 + Double sl = two.getDouble("count", 0.0); + // int sl = two.getInt("count",0); + //批次 + String lpxx = two.getString("batch", ""); + //颜色信息 + String color = two.getString("color", ""); + if(color.equals(null) || color.length()==0 ) + { + color = "A000000"; + } + Object colorname = null; + //ws + if(db.hasAnyData("select 2 from colorattr where colorid=?", color)) + { + colorname=db.getSingleField("select fname2 from colorattr where colorid=?", color); +// System.out.println("Object colorname"+colorname); + } + + //物料所属仓库 + String efid = two.getString("efId", ""); + //在物料档案中查找明细 + Map mx = db.getSingleRow("SELECT cpmc,cpgg1,cpgg2,ckdm,ckid,jldw FROM cpxx where cpbh=? ", cpbh); + Object ckid=mx.get("ckid");//仓库代码 + + if(!db.hasAnyData("select * from cpxx where cpbh=?", cpbh)) + { + return getOut("insertMesRkd", 1, "插入出库单据时操作失败,无物料档案记录!产品编号:"+cpbh,req,meslw); + } + Object cpmc=mx.get("cpmc"); + Object cpgg1=mx.get("cpgg1"); + Object cpgg2=mx.get("cpgg2"); + Object ckdm=mx.get("ckdm");//仓库代码 + Object jldw=mx.get("jldw"); + Object mxbh = SerialNumber.getSerialNumber("cprkmxbh"); + sqls.add(sqlInsertRkdMx); +// Map cpxx = db.getSingleRow("SELECT cpmc,cpgg1,cpgg2 FROM CPXX WHERE cpbh=?", cpbh); + values.add(new Object[] { ysdh, mxbh, cpbh, sl, lpxx,color,colorname,cpmc, cpgg1,cpgg2,efid,jcddbh,jcddid,jldw,ckdm}); + + } + + } + } + + + if (sqls.size() > 0) + { + if (!db.preparedUpdate(sqls, values, false)) + { + return getOut("insertMesRkd", 1, "插入入库单据时操作失败",req,meslw); + } + } + } + catch (Exception e) + { + e.printStackTrace(); + return getOut("insertMesRkd", 1, e.getMessage(),req,meslw); + }finally{ + sqls.clear(); + values.clear(); + } + return getOut("insertMesRkd", 0, "OK",req,meslw); + } + + + //2018-02-01 ckmc未EAS请求入库仓库 + String sqlInsertEASRkd = DB.prepareInsertStmt("cprkd", + "ysdh,easid,lx,yhm,ysrq,ydid,yddh,zl,ckbh,sflz,djbh,ckmc");//sflz 是否冲红 + String sqlInsertEASRkdMx = DB.prepareInsertStmt("cprkdmx", + "ysdh,mxbh,cpbh,rksl,lpxx,color,colorname,cpmc,cpgg1,cpgg2,dj,entryId,txm,wzlb,jldw,dqkc"); + + public String insertEasRkd(String req) + { + System.out.println(req); + + easlw.log("call insertEasRkd with parameter " + req, LogWriter.DEBUG); + try + { + ArrayList oprObjArrayszs=new ArrayList(); + List sqls = new ArrayList(); + List values = new ArrayList(); + JsonObject jo = Json.parse(req).asObject(); + //单据编号 + String djbh = jo.get("djbh").asString(); + //判断是否有重复的单据,有重复的单据报错提示。 + if(db.hasAnyData("select * from cprkd where djbh=?", djbh)) + { + return getOut("insertEasRkd", 1, "插入入库单据时操作失败,重复插入单据!",req,easlw); + } + //单据类型 3001 调拨入库 + String djlx=jo.get("djlx").asString(); + //原单id +// String ydid=jo.get("ydid").asString(); +// //原单编号 +// String ydbh=jo.get("yddh").asString(); + //EAS唯一ID + String easId=jo.get("easId").asString(); + //是否冲红 + // boolean chbs=jo.get("hlbs").asBoolean(); + //下发日期 + String ysrq=jo.get("xfsj").asString(); + //yhm + String yhm=jo.get("fqr").asString(); + + //入库的仓库名称 + String ckdm=jo.get("ckmc").asString(); + //WMS入库单号 + String ysdh = SerialNumber.getSerialNumber("cprkd"); + sqls.add(sqlInsertEASRkd); + String yhmName= djlx.equals("3011")?"SRM_"+yhm:"EAS_"+yhm; + values.add(new Object[] {ysdh,easId,djlx,yhmName,ysrq,null,null,"2","LTCK","1",djbh,ckdm}); + //获取领料计划明细 + JsonArray items = jo.get("data").asArray(); + for (JsonValue item : items) + { + JsonObject one = item.asObject(); + //产品编号 + String cpbh = one.getString("cpbh", ""); + /*if(cpbh.trim().length()!=12 && cpbh.trim().length()!=16 && cpbh.trim().length()!=14) + { + return getOut("insertEasRkd", 1, "插入出库单据时操作失败,产品编号位数只能为12或14或16位",req,easlw); + }*/ + //数量 + int sl=Math.abs(one.getInt("sl", 0)); + //批次 + String lpxx = one.getString("lpxx", ""); + String color = one.getString("ys", ""); + if(color.equals(null) || color.length()==0 ) + { + color = "A000000"; + } + Object colorname = null; + //ws + if(db.hasAnyData("select 2 from colorattr where colorid=?", color)) + { + colorname=db.getSingleField("select fname2 from colorattr where colorid=?", color); + } + + String cpmc = one.getString("cpmc", ""); + String entryId = one.getString("entryId", ""); +// String cpmc=one.getString("cpmc", "Unknown"); + String cpgg=one.getString("cpgg", ""); + double dj=one.getDouble("dj", 0.0); + String gzh = one.getString("gzh", ""); + Object wzlb=null; + Object jldw=null; + Object cpgg2=null; + //在物料档案中查找明细 + Object mxbh = SerialNumber.getSerialNumber("cprkmxbh"); + sqls.add(sqlInsertEASRkdMx); + if(!db.hasAnyData("select * from cpxx where cpbh=?", cpbh)) + { + return getOut("insertEasRkd", 1, "插入出库单据时操作失败,无物料档案记录!"+"产品编号:"+cpbh,req,easlw); + } + else + { + //2017-12-08运行到这里说明有物料档案,这时需要查询EAS未传递的物料信息 + Map mx = db.getSingleRow("select wzlb,jldw,cpgg2 from cpxx where cpbh=? ", cpbh); + wzlb=mx.get("wzlb"); + jldw=mx.get("jldw"); + cpgg2=mx.get("cpgg2"); + } + Object dqkc=db.getSingleField("select sum(sl) from cpkcxx where cpbh=?", cpbh); + values.add(new Object[] { ysdh, mxbh, cpbh, sl, lpxx,color,colorname,cpmc,cpgg,cpgg2,dj,entryId,gzh,wzlb,jldw,dqkc}); + + } + + if (sqls.size() > 0) + { + if (!db.preparedUpdate(sqls, values, false)) + { + return getOut("insertEasRkd", 1, "插入入库单据时操作失败",req,easlw); + } + } + } + catch (Exception e) + { + e.printStackTrace(); + return getOut("insertEasRkd", 1, ServerUtil.getError(e),req,easlw); + } + return getOut("insertEasRkd", 0, "OK",req,easlw); + } + + /** + * 生成出库单 + * 要求一个物料一张单据 + * db + */ + String sqlInsertMESCkd = DB.prepareInsertStmt("ckd", + "ckdh,shrq,djlx,djbh,cklx,zl,sflz,ckbh,yhm,bz,xqgw"); + String sqlInsertMESCkdMx = DB.prepareInsertStmt("ckdmx", + "ckdh,mxbh,cpbh,shsl,lpxx,color,colorname,cpmc,cpgg1,cpgg3,jcddbh,jcddid,mbkw,entryid,jldw,warehouse,txm"); + String sqlSelectJh="select 2 from ckd c left join ckdmx s on c.ckdh=s.ckdh where (s.shsl-s.yapsl)>0 and c.djbh=? and djlx='10'"; + + //配盘规则 + String sqlInsertPpjh = DB.prepareInsertStmt("ppgz","ts,cpbh,sl,jcddbh"); + + // 上传字符串:{"operationNumber":"201710250003","targetLocation":"L001","operationType":"PLAN","relationNumber":"","operationTime":"2017-10-25 10:45","data":[{"orderNumber":"20171025110","materialList":[{"materialCode":"1000234","count":"8","batch":"10002"}]}],"trayRule":{"package":"1","bom":[{"materialCode":"1000234","count":"8"}]}} + + public String insertMesCkd(String req) + { + meslw.log("call insertMesCkd with parameter " + req, LogWriter.DEBUG); + + try + { + ArrayList oprObjArrayszs=new ArrayList(); + List sqls = new ArrayList(); + List values = new ArrayList(); + JsonObject jo = Json.parse(req).asObject(); + //操作流水号 + String djbh = jo.get("operationNumber").asString(); + if(db.hasAnyData("select 2 from CKD where djbh=?", djbh)) + { + return getOut("insertMesCkd", 1, "插入出库单据时操作失败,重复的操作流水号: "+djbh,req,meslw); + } + //目标库位,MES呼叫工位 + String mbkw = jo.get("targetLocation").asString(); + if(mbkw.length()>9){ + return getOut("insertMesCkd", 1, "无效的目标工位 : "+mbkw,req,meslw); + } + //单据类型 + String operationType=jo.get("operationType").asString(); + //领料执行,这里存放的是MES计划单号,改放在明细表中 + String bz=jo.getString("relationNumber", ""); +// String easId = jo.getString("easId", ""); + //获取领料计划明细 + JsonArray items = jo.get("data").asArray(); +// if(items == null || items.size()<=0){ +// //lh 20180427 过滤掉mes 传来的无明细的订单 +// return getOut("insertMesCkd", 1, "计划领料单"+djbh+"中的明细为空,请校验!",req); +// } + String djlx=null; + //单据类型需要转换为WMS与之对应的类型 计划领料(PLAN),执行领料(EXCUTE),退料(RETURN),补料(FEEDING),完工入库(STORAGE) + if("PLAN".equals(operationType)) + { + djlx="10"; + } + else if("EXCUTE".equals(operationType)) + { + djlx="11"; + } + else if("FEEDING".equals(operationType))//补料的不需要配盘直接人工操作wms出库 + { + djlx="12"; + } + //2018-03-24领料执行直接判断对应的领料计划单据是否已经全部安排了 + if("EXCUTE".equals(operationType)) + { + if(db.hasAnyData(sqlSelectJh, bz)) + { + return getOut("insertMesCkd", 1, "计划领料单"+djbh+"中还有未安排的明细,请校验!",req,meslw); + } + //2018-03-24更新,原来判断库存是否够,现在判断关联的计划 + } + //下发日期 + String shrq=jo.get("operationTime").asString(); + //WMS出库单号 + String ckdh = SerialNumber.getSerialNumber("ckd"); + sqls.add(sqlInsertMESCkd); + values.add(new Object[] { ckdh, shrq, djlx, djbh, djlx, "2","1", + "LTCK", "MES接口" ,bz,mbkw}); + //获取领料计划明细 +// JsonArray items = jo.get("data").asArray(); + String jcddbh=null; + String jcddid=null; + //存EAS明细,先加入请求方,为json主表 + JsonObject oneBill = Json.object().add("source", "WMS"); + JsonObject queryParams = Json.object(); + //存集成订单号下所有的数据 + //存物料明细集合 + JsonArray bills=(JsonArray) Json.array(); + for (JsonValue item : items) + { + JsonObject one = item.asObject(); + //获得集成编号:eas 生产订单号 + jcddbh = one.getString("orderNumber", ""); + //获得集成订单ID:eas 生产订单ID号 + jcddid = one.getString("easId", ""); + if(jcddbh == null || jcddid == null || jcddbh.length()<=0 || jcddid.length()<=0) + { + return getOut("insertMesCkd", 1, "插入出库单据时操作失败,本地未发现 orderNumber 或 easId 为空",req,meslw); + } + //EAS存集成订单编号 + //获取领料信息集合materialList + JsonArray itemxxs = one.get("materialList").asArray(); + if(itemxxs == null || itemxxs.size()<=0){ + continue; + } + //存物料明细集合+ + JsonArray entrys=(JsonArray) Json.array(); + //遍历物料信息 + for (JsonValue itemxx : itemxxs) + { + JsonObject two = itemxx.asObject(); + //产品编号 + String cpbh = two.getString("materialCode", ""); + //数量 + // int sl = two.getInt("count",0); + double sl = two.getDouble("count", 0.0); + + //出库仓库 (warehouse:需方仓库; supplyWarehouse:供方仓库) + String warehouse = two.getString("warehouse", ""); + + //批次 + String lpxx = two.getString("batch", ""); + //颜色信息 + String color = two.getString("color", ""); + if(color.equals(null) || color.length()==0 ) + { + color = "A000000"; + } + Object colorname = null; + //ws + if(db.hasAnyData("select 2 from colorattr where colorid=?", color)) + { + colorname=db.getSingleField("select fname2 from colorattr where colorid=?", color); +// System.out.println("Object colorname"+colorname); + } + //eas明细编号 + String efid=two.getString("efId", ""); + + //2018-07-15 判断一下该物料的默认仓库是否在本地 +// if(!db.hasAnyData("select * from ckxx where erpid=?", warehouse)) + if(repertorys.get(warehouse)==null) + { + return getOut("insertMesCkd", 1, "插入出库单据时操作失败,本地未发现 仓库ID为 : "+warehouse+" 的仓库号",req,meslw); + } + //2017-11-15 判断一下有没有物料档案如果没有直接报错 + //在物料档案中查找明细,这样会有两次查询,这里进行优化一下 + if(!db.hasAnyData("select * from cpxx where cpbh=? and ckid=?", new Object[]{cpbh,warehouse})) + { + return getOut("insertMesCkd", 1, "插入出库单据时操作失败,无物料档案记录!物料编码:"+cpbh+"; 默认仓库:"+warehouse,req,meslw); + } + //这里补料需要判断一下每个物料是否有库存 + if("FEEDING".equals(operationType)) + { + //判断一下批次是否为null,如果为空查询的时候不带批号,否则都是带批号的。 + if(!db.hasAnyData("select 2 from CP_KYKCMX_V where cpbh=? and kyl>=? and nvl(lpxx,' ' ) =nvl(?,' ') and nvl(color,' ' ) =nvl(?,' ')", new Object[]{cpbh,sl,lpxx,color})) + { + //没有库存的直接返回掉,不继续执行了。 + return getOut("insertMesCkd", 1, "查询WMS系统库存时,库存不足!物料编码:"+cpbh+",批号:"+lpxx+",颜色:"+color,req,meslw); + } + } + //存物料明细,待EAS反馈用 + //20180524 LH测试 应EAS要求 将表示数量的 fqty 改为 qty; + Map cpxx = db.getSingleRow("SELECT cpmc,cpgg1,cpgg3,jldw,ckdm FROM CPXX WHERE cpbh=?", cpbh); + String ckdm = (String)cpxx.get("ckdm"); + JsonObject maTerialdt = null; + //ws add 请求eas审核时传递颜色给eas + if (color.equalsIgnoreCase("A000000")) + { + maTerialdt=Json.object().add("material", cpbh).add("qty", sl).add("entryId", efid).add("lot", lpxx).add("warehouse", ckdm).add("supplyWarehouse", ckdm).add("color", ""); + } else { + maTerialdt=Json.object().add("material", cpbh).add("qty", sl).add("entryId", efid).add("lot", lpxx).add("warehouse", ckdm).add("supplyWarehouse", ckdm).add("color", color); + + } + //存到集合里面 + entrys.add(maTerialdt); + Object mxbh = SerialNumber.getSerialNumber("cpckmxbh"); + sqls.add(sqlInsertMESCkdMx); + if (cpxx != null && cpxx.size() > 0) + values.add(new Object[] { ckdh, mxbh, cpbh, sl, lpxx,color,colorname, + cpxx.get("cpmc"), cpxx.get("cpgg1"), + cpxx.get("cpgg3"),jcddbh,jcddid, mbkw,efid,cpxx.get("jldw"),ckdm,bz}); + //添加需要分配库位的单据明细 + oprObjArrayszs.add(new Object[] { ckdh, mxbh, null, + "自动分配库位" }); + } + + //再存到集合里面 + + + //只有领料计划才有配盘 + if("PLAN".equals(operationType)) + { + //有的计划也没有配盘规则 + if(jo.asObject().get("trayRule")!=null) + { + //获取配盘规则 + JsonObject pp=jo.asObject().get("trayRule").asObject(); + //2017-11-14领料计划有的有配盘规则,有的没有,例如二次配盘区无配盘规则 + //先需要判断配盘规则是否为空,如果为空的话就不需要解析,否则会报错 + if(pp.get("package")!=null) + { + String ppsl=pp.get("package").asString(); + + JsonArray bom=pp.get("bom").asArray(); + for (JsonValue itempp : bom) + { + JsonObject onepp = itempp.asObject(); + String materialCode=onepp.getString("materialCode", ""); + double count=onepp.getDouble("count", 0.0); + double floor = Math.floor(count); + if(count > floor){ + return getOut("insertMesCkd", 1, "无效的配盘规则数量!产品编号: "+materialCode+"; 数量: "+count,req,meslw); + } + sqls.add(sqlInsertPpjh); + values.add(new Object[]{ppsl,materialCode,count,djbh});//dengbiao20180322配盘规则用djbh原先为集成订单号 + } + } + } + + + } + + //这里面一个集成订单编号,下的多种物料,需要在这里拼接,number 中存放的是 + //dengbiao 这里不传集成订单号传单据号,集成订单编号为EAS传给MES的大计划单号。MES传给的单号为拆分EAS大计划之后的小单号,故这里的单号传给EAS的为MES的小计划单号,由EAS内部自行与MES进行处理 + JsonObject easdjbhs=Json.object().add("number", jcddbh).add("easId",jcddid).add("mesNumber",djbh).add("entrys", entrys); + //存多个集成订单编号下面的数据 + bills.add(easdjbhs); + + + } + if(bills == null || bills.size()<=0){ + return getOut("insertMesCkd", 1, "物料明细为空!",req,meslw); + } + + queryParams.add("bills", bills); + oneBill.add("queryParams", queryParams); + //这里先请求一下EAS登录接口,接口名称,EAS领料审核 + //具体的需要领料计划里面的什么数据,暂不知道,需要把单据明细数据都传给EAS + //从数据库中查询 + //领料和补料业务 + if("EXCUTE".equals(operationType)) + { + String easurl = (String)db.getSingleField("SELECT dqz FROM sys_config WHERE ID_pzx=?","EasUrl"); + String back=null; + //这边需要处理一下,今天出现问题的时候没有请求到EAS系统,也不知道是哪里出了问题的,单据没有下载下来 + try + { + System.out.println("开始传递单据给EAS:"); + back=JkglManager.EAS("wmsMaterialReq", oneBill, easlw, easurl); + meslw.log("call EAS wmsMaterialReq with parameter " + back, LogWriter.DEBUG); + System.out.println("eas返回back: "+back); + } + catch (Exception e) + { + System.out.println("调用失败,请校验接口是否连通"); + return getOut("insertMesCkd", 1, "请求EAS领料审核,调用失败,请校验接口是否连通!",e.getMessage(),meslw); + // TODO: handle exception + } + JsonObject jos= null; + int result = 0; + try + { + jos = Json.parse(back).asObject(); + result =jos.get("result").asInt(); + } + catch (Exception e) + { + e.printStackTrace(); + } + if(result!=1) + {//eas接口中,1表示成功 +// System.out.println("false"); + return getOut("insertMesCkd", 1, "请求EAS领料审核失败!EAS:"+jos.get("msg").asString(),oneBill.toString(),meslw); + } +// else +// { +// //请求成功,那么需要请求MES,MES只需要传单号即可 +// String mesurl = (String)db.getSingleField("SELECT dqz FROM sys_config WHERE ID_pzx=?","MesUrl"); +// System.out.println("mesurl:"+mesurl); +// JsonObject mesreq=Json.object().add("operationNumber", djbh).add("result", "0"); +// System.out.println("mesreq:"+mesreq); +// String as = null; +// try +// { +// as=JkglManager.MES(mesreq,meslw,mesurl,"auditFeedbackRequest"); +// } +// catch (Exception e) +// { +// meslw.debug("as bug:"+as); +// e.printStackTrace(); +// } +// System.out.println("as:"+as); +// +// JsonObject joas = Json.parse(req).asObject(); +// System.out.println("joas:"+joas); +// if(as==null||as.indexOf("success")<=0) +// { +// //需要拿到错误信息提示 +// System.out.println("请求MES领料审核失败"); +// return getOut("insertMesCkd", 1, "请求MES领料审核失败!","MES: "+joas.get("message").asString(),meslw); +// } +// System.out.println("请求MES 审核: success"); +// } + + } + int size = sqls.size(); + if (size > 1) + { + if (!db.preparedUpdate(sqls, values, false)) + { + System.out.println("插入出库单据时操作失败"); + return getOut("insertMesCkd", 1, "插入出库单据时操作失败",req,meslw); + } + } + if (oprObjArrayszs.size() > 0) + { + //这里需要判断,如果是执行领料,直接从虚拟库存安排mmp,还德行不德行 + if("EXCUTE".equals(operationType)) + { + db.callProcedure("p_autoAllocateRetrieveCellsxn", oprObjArrayszs); + } + else + { + //asrs先安排库存,再更新出库单,以及更新记录表数据 + db.callProcedure("p_autoAllocateRetrieveCells", oprObjArrayszs); + } + + oprObjArrayszs.clear(); + + } + } + catch (Exception e) + { + e.printStackTrace(); + return getOut("insertMesCkd", 1, e.getMessage(),req,meslw); + } + return getOut("insertMesCkd", 0, "OK",req,meslw); + } + + + /* + * 2018-01-07领料计划取消 + * 小何&&李浩,怕是得行 + * 2018-03-24取消需要更新锁定主表记录 + */ + public String cancelPlan(String reg){ + + meslw.log("call cancelPlan with parameter " + reg, LogWriter.DEBUG); + String selectckdmx=" SELECT JCDDBH,CPBH FROM CKPPXX_V WHERE djbh=? AND zt=0 AND yapsl>0";//查找明细中是否有已经安排 + String updateSql="UPDATE CKD SET zt=1,djzt=2 WHERE djbh=?"; + List sqls = new ArrayList(); + List values = new ArrayList(); + JsonObject jo = Json.parse(reg).asObject(); + //MES操作流水号 + //MES操作类型 + String czlx= jo.get("operationType").asString(); + //要作废的 单据编号,领料计划的操作流水号 + String relationNumber = jo.get("relationNumber").asString(); + + if((!"CANCEL".equalsIgnoreCase(czlx))) + { + return getOut("cancelPlan", 1, "操作类型不存在,类型:"+czlx,reg,meslw); + } + try + { + //没有查询到数据,那么就是不存在,或者已经被审核了 + if(!db.hasAnyData("SELECT 2 FROM ckd WHERE djbh=? AND zt=0", relationNumber)) + { + return getOut("cancelPlan", 1, "取消的单据不存在或已被审核!单号:"+relationNumber,reg,meslw); + } + //只要安排了就不允许取消了 + if(db.hasAnyData(selectckdmx, relationNumber)) + { + return getOut("cancelPlan", 1, "取消的单据已安排出库,取消失败!单号:"+relationNumber,reg,meslw); + } + sqls.add(updateSql); + values.add(relationNumber); + //判断单据是否有物料锁定,有则删除 + if(sqls.size()>0) + { + db.preparedUpdate(sqls,values, false); + } + return getOut("cancelPlan", 0, "OK",reg,meslw); + + } + catch (Exception e) + { + return getOut("cancelPlan", 1, e.getMessage(),reg,meslw); + } + } + + public String EasLogin() throws RemoteException + { + // EAS登录接口地址存在数据库中系统配置中,可以随时在系统中配置 + String endpointURL = (String) db.getSingleField( + "SELECT dqz FROM sys_config WHERE ID_pzx=?", "EasLoginUrL"); + WSContext ws = null; + Service service = new Service(); + try + { + URL url = new URL(endpointURL); + EASLoginSoapBindingStub std = new EASLoginSoapBindingStub(url,service); + ws = std.login("user", "kduser", "eas", "EAS_TEST", "12", 1,"BaseDB"); + if(ws==null) + { + return "请求登录EAS失败!"; + } + } + catch (MalformedURLException e) + { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return ws.getSessionId(); + + } + + String sqlInsertEASCkd = DB.prepareInsertStmt("ckd","ckdh,shrq,djlx,djbh,easId,cklx,sflz,zl,ckbh,yhm,ckdm,llr,bzbh"); + String sqlInsertEASCkdMx = DB.prepareInsertStmt("ckdmx","ckdh,mxbh,entryId,cpbh,cpmc,cpgg1,cpgg2,shsl,lpxx,color,colorname,dj,txm,wzlb,jldw"); + + public String insertEasCkd(String req) + { + easlw.log("call insertEasCkd with parameter " + req, LogWriter.DEBUG); + try + { + ArrayList oprObjArrayszs=new ArrayList(); + List sqls = new ArrayList(); + List values = new ArrayList(); + JsonObject jo = Json.parse(req).asObject(); + //单据编号 + String djbh = jo.get("djbh").asString(); + //eas唯一id + String easId = jo.get("easId").asString(); + //单据类型采购入库 1001 +// 其他入库 1002 +// 委外入库 1003 +// 生产入库 1004 +// 领料出库 2001 +// 委外出库 2002 +// 委外冲红 1003 +// 其他出库 2003 +// 销售出库 2004 +// mes叫料 2005 +// 调拨入库 3001 +// 调拨出库 3002 +// + String djlx=jo.get("djlx").asString(); + //判断是否有重复的单据,有重复的单据报错提示。 + if(db.hasAnyData("select * from ckd where djbh=?", djbh)) + { + return getOut("insertEasCkd", 1, "插入出库单据时操作失败,重复插入单据!",req,easlw); + } + //是否蓝字 + // boolean chbs=jo.get("hlbs").asBoolean(); + //原单ID + String ydid = jo.getString("ydid", "Unknown"); + //原单单号 + String yddh = jo.getString("yddh", "Unknown"); + //下发时间 + String ysrq=jo.get("xfsj").asString(); + //操作人 +// String czy="EAS接口"; + //yhm + String yhm=jo.get("fqr").asString(); + //llr 领料人 + String llr=jo.getString("zdr", ""); +// System.out.println(llr); + // + String ckdm = jo.getString("ckmc", ""); + Object mesnumber =jo.get("mesNumber"); + String pzbh=""; + if(mesnumber != null) { + pzbh = mesnumber.toString(); + } + +// System.out.println("ckdm: " + ckdm); + + /* + * + * {"djlx":"2004","bz":"","easId":"btAAAACDurvMPpM7","xfsj":"2017-11-16","data":[{"sl":100,"lpxx":"","cpbh":"1.1.01.1388.80DFE550*1050RSP20T","dj":1,"cpmc":"DFE550*1050RSP2.0T","seq":1,"cpgg":"","djbh":"XOUT222223","entryId":"btAAAACDury7wH++"},{"sl":24,"lpxx":"","cpbh":"1.1.01.1388.80DFE520*850RSP20T","dj":1,"cpmc":"DFE520*850RSP2.0T","seq":2,"cpgg":"","djbh":"XOUT222223","entryId":"btAAAACDur27wH++"},{"sl":36,"lpxx":"","cpbh":"1.1.01.1388.80DFE685*1220RSP20T","dj":1,"cpmc":"DFE685*1220RSP2.0T","seq":3,"cpgg":"","djbh":"XOUT222223","entryId":"btAAAACDur67wH++"}],"hlbs":false,"zlzt":"","djbh":"XOUT222223","ckmc":"6.06.01"} + */ + //去向 + // String shdw=jo.get("shdw").asString(); + //WMS出库单号 + String ckdh = SerialNumber.getSerialNumber("ckd"); + sqls.add(sqlInsertEASCkd); + values.add(new Object[] { ckdh, ysrq, djlx, djbh,easId,djlx, "1","2","LTCK", "EAS_"+yhm,ckdm,llr,pzbh }); + //获取领料计划明细 + JsonArray items = jo.get("data").asArray(); + for (JsonValue item : items) + { + JsonObject one = item.asObject(); + //获得集成编号 + String entryId = one.getString("entryId", ""); + String cpbh = one.getString("cpbh", ""); + //if(cpbh.trim().length()!=12 && cpbh.trim().length()!=16 && cpbh.trim().length()!=14) + //{ + //return getOut("insertEasRkd", 1, "插入出库单据时操作失败,产品编号不是12位或者14位或者16位码!",req,easlw); + //} + String cpmc = one.getString("cpmc", ""); + String cpgg = one.getString("cpgg", ""); + Double sl = Math.abs(one.getDouble("sl", 0)); + String gzh = one.getString("gzh",""); + Object wzlb=null; + Object jldw=null; + Object cpgg2=null; +// System.out.println("gzh"+gzh); + + + String lpxx = one.getString("lpxx", "Unknown");//TODO + //颜色信息 + String color = one.getString("ys", ""); + if(color.equals(null) || color.length()==0 ) + { + color = "A000000"; + } + Object colorname = null; + //ws + if(db.hasAnyData("select 2 from colorattr where colorid=?", color)) + { + colorname=db.getSingleField("select fname2 from colorattr where colorid=?", color); +// System.out.println("Object colorname"+colorname); + } + Double dj = one.getDouble("dj", 0); + + // String sqlInsertEASCkdMx = DB.prepareInsertStmt("ckdmx","ckdh,mxbh,entryId,cpbh,cpmc,cpgg1,shsl,lpxx,dj"); + //获取领料信息集合materialList + + Object mxbh = SerialNumber.getSerialNumber("cpckmxbh"); + sqls.add(sqlInsertEASCkdMx); + if(!db.hasAnyData("select * from cpxx where cpbh=?", cpbh)) + { + return getOut("insertEasCkd", 1, "插入出库单据时操作失败,无物料档案记录!"+"产品编号:"+cpbh,req,easlw); + } + else + { + //2017-12-08运行到这里说明有物料档案,这时需要查询EAS未传递的物料信息 + Map mx = db.getSingleRow("select wzlb,jldw,cpgg2 from cpxx where cpbh=? ", cpbh); + wzlb=mx.get("wzlb"); + jldw=mx.get("jldw"); + cpgg2 = mx.get("cpgg2"); + } + + values.add(new Object[] { ckdh, mxbh,entryId, cpbh, cpmc,cpgg,cpgg2,sl, lpxx,color,colorname,dj,gzh,wzlb,jldw}); + + } + + + if (sqls.size() > 0) + { + //合并重复的物料需求 + + 合并单据(sqls, values); + + if (!db.preparedUpdate(sqls, values, false)) + { + return getOut("insertEasCkd", 1, "插入出库单据时操作失败",req,easlw); + } + } + if (oprObjArrayszs.size() > 0) + { + //asrs先安排库存,再更新出库单,以及更新记录表数据 + db.callProcedure("p_autoAllocateRetrieveCells", oprObjArrayszs); + oprObjArrayszs.clear(); + + } + } + catch (Exception e) + { + return getOut("insertEasCkd", 1,ServerUtil.getError(e),req,easlw); + } + return getOut("insertEasCkd", 0, "OK",req,easlw); + } + + /** + * 调试rgv,21号结束。 + * MES 七八月份上线 + * 软件操作培训,做好登记 + * + * @param sqls + * @param values + */ + private void 合并单据(List sqls, List values) + { + + + } + /** + * 生成AGV任务 + * ”operationNumber”:”201710250007”, ===>操作流水号 + “targetLocation”:”L001”, ===>目标库位 + “sourceLocation”:”L002”, ===>源库位 + “trayCode”:”T005” ===>托盘编号 + * + * + * + */ + String sqlInsertAgv = DB.prepareInsertStmt("AGV_WORK", + "jobId,jobStatus,priority,startPos,stopPos,plateNo,jobNo,IsCallMES"); + public String insertAgv(String req){ + + agvlw.log("call insertAgv with parameter " + req, LogWriter.DEBUG); + try + { + JsonObject jo = Json.parse(req).asObject(); + //int jobNo = jo.get("JobNo").asInt(); + //String jobType = jo.get("JobType").asString(); + //int jobStatus = jo.get("JobStatus").asInt(); + //int priority = jo.get("Priority").asInt(); + String jobNo = jo.get("operationNumber").asString(); +// String startPos = jo.get("targetLocation").asString(); +// String stopPos = jo.get("sourceLocation").asString(); + String stopPos = jo.get("targetLocation").asString(); + String startPos = jo.get("sourceLocation").asString(); + String plateNO = jo.get("trayCode").asString(); + String zlbh = SerialNumber.getSerialNumber("agvZlbh");//AGV作业指令号 + db.preparedUpdate(sqlInsertAgv,new Object[]{zlbh,0,0,startPos,stopPos,plateNO,jobNo,"1"},false); + } + catch (Exception e) + { + return getOut("insertAgv", 1, e.getMessage(),req,agvlw); + } + return getOut("insertAgv", 0, "OK",req,agvlw); + } + + + /** + * 生成RGV任务最终还需要确定 + * ”operationNumber”:”201710250007”, ===>操作流水号 + “targetLocation”:”L001”, ===>目标库位 + “sourceLocation”:”L002”, ===>源库位 + “trayCode”:”T005” ===>托盘编号 + * + * + * + */ + String sqlInsertRgv = DB.prepareInsertStmt("RGV_WORK", + "joblsh,zt,startPos,stopPos,tpbh,jobNo,no,QDSTART,QDEND,UNABLEDEVICE"); + String sqlselectNo = "select NO,QDADDRESS,EXCLUDERGV,ID from RGVLIST WHERE ID = any(?,?)"; + public String insertRgv(String req){ + rgvlw.log("call insertRgv with parameter " + req, LogWriter.DEBUG); + Map stationStatus = JkglManager.stationStatus; + for(String key : stationStatus.keySet()){ + Integer value = stationStatus.get(key); + System.out.println(key+" "+value); + } + try + { + Vectorfirstrow=null; + Vectortowrow=null; + JsonObject jo = Json.parse(req).asObject(); + String joblsh = jo.get("operationNumber").asString(); + String startPos = jo.get("sourceLocation").asString(); + String stopPos = jo.get("targetLocation").asString(); + String plateNO = jo.get("trayCode").asString(); + String zlbh = SerialNumber.getSerialNumber("RGV_WORK");//AGV作业指令号 + Integer startStatus = stationStatus.get(startPos); + Integer stopStatus = stationStatus.get(stopPos); + //这里需要判断当前的在哪个线号上面。在表里面需要存线号,不同的线号依次来取任务 + if(startPos ==null || stopPos==null || startPos.equalsIgnoreCase(stopPos)) + { + return getOut("insertRgv", 1, "起始或目标站点不可为空或相同",req,rgvlw); + } + //除了1\3号线外 + if(startPos.startsWith("2L") || stopPos.startsWith("2L")){ + if(startStatus == null || stopStatus == null) + { + return getOut("insertRgv", 1, "设备未联机",req,rgvlw); + } + if(startStatus != 1 || stopStatus != 0) + { + return getOut("insertRgv", 1, "指令下发失败,原因: 电气上报 起始站点无货或者目标站点有货",req,rgvlw); + } + } + if(!db.hasAnyData("SELECT 2 FROM RGVLIST WHERE ID=?", startPos)) + { + return getOut("insertRgv", 1, "sourceLocation在RGV基础数据表里面无无数据!",req,rgvlw); + } + if(!db.hasAnyData("SELECT 2 FROM RGVLIST WHERE ID=?", stopPos)) + { + return getOut("insertRgv", 1, "targetLocation在RGV基础数据表里面无无数据!",req,rgvlw); + } + Vector qds=db.getVDataWithPrepareStatement(sqlselectNo, new Object[]{startPos,stopPos}); + if(qds.size()==2) + { + //这里不遍历了。 + firstrow=(Vector)qds.get(0); + towrow=(Vector)qds.get(1); + String excludeRGV_start = firstrow.get(2); + String excludeRGV_stop = towrow.get(2); + //判断一下线号是否相同,不同则报错。 + if(!firstrow.get(0).equals(towrow.get(0))) + { + return getOut("insertRgv", 1, "调用RGV接口失败,不允许下发工位线号的不同的任务!",req,rgvlw); + } + if(firstrow.get(1)==null || towrow.get(1)==null || firstrow.get(1).equals(towrow.get(1))) + { + return getOut("insertRgv", 1, "调用RGV接口失败,起始或目标站的电气地址无效",req,rgvlw); + } + //防止MES下发的起始站和目标站无法到达 + boolean emptyExcule_start = (excludeRGV_start == null || excludeRGV_start.equals("")); + boolean emptyExcule_stop = (excludeRGV_stop == null || excludeRGV_stop.equals("")); + //ws 08.08 注释 +// if(!emptyExcule_start && !emptyExcule_stop +// && !excludeRGV_start.equalsIgnoreCase(excludeRGV_stop)) +// { +// return getOut("insertRgv", 1, "调用RGV接口失败,设备无法同时到达起始和目标位置",req,rgvlw); +// } + String unableDevice = (emptyExcule_start?excludeRGV_stop:excludeRGV_start); + String startAdd = null; + String stopAdd = null; + if(startPos.equalsIgnoreCase(firstrow.get(3))){ + startAdd=firstrow.get(1); + stopAdd=towrow.get(1); + }else{ + stopAdd=firstrow.get(1); + startAdd=towrow.get(1); + } + db.preparedUpdate(sqlInsertRgv,new Object[]{joblsh,0,startPos,stopPos,plateNO,zlbh,Integer.parseInt(firstrow.get(0)),startAdd,stopAdd,unableDevice},false); + + }else{ + return getOut("insertRgv", 1, "调用RGV接口失败,未在RGV基础数据表中找到起始或目标站点信息",req,rgvlw); + } +// db.preparedUpdate(sqlInsertRgv,new Object[]{joblsh,0,startPos,stopPos,plateNO,zlbh,Integer.parseInt(firstrow.get(0)),firstrow.get(1),towrow.get(1)},false); + } + catch (Exception e) + { + return getOut("insertRgv", 1, e.getMessage(),req,rgvlw); + } + return getOut("insertRgv", 0, "OK",req,rgvlw); + } + + + /** + * MES收货确认 + * db + */ + public String feedBack(String req){ + meslw.log("call feedBack with parameter " + req, LogWriter.DEBUG); + JsonObject rs=Json.object(); + try + { + JsonObject jo = Json.parse(req).asObject(); + String ckzlbh=jo.get("sourceNumber").asString(); + String message=jo.get("state").asString(); + //更新指令领料的 + if("0".equals(message)) + { + db.preparedUpdate("update ckzl set messhqr='2',hkzt=2 where zlbh=? and zt='2'",ckzlbh, false); + } + + } + catch (Exception e) + { + meslw.log("处理收获确认时发生异常 : " + e.getMessage(), LogWriter.DEBUG); + return rs.add("code", "1").add("message",e.getMessage() ).toString(); + + } + return rs.add("code", "0").add("message", "succes").toString(); + + } + + + /** + * MES锁定物料 + * 2018-03-09物料锁定,这里需要进行优化 + * 优化主要是语句上的优化。方案还是按照原来老的进行优化 + * + */ + public String lockMaterial (String req) + { + meslw.log("call lockMaterial with parameter " + req, LogWriter.DEBUG); + //锁定表记录查询 + String lockjlSql="select sdsl-jssl as KYSL from LOCKEDMATERIAL where djbh=? and cpbh=? and nvl(lpxx,' ' ) =nvl(?,' ') and nvl(color,' ' ) =nvl(?,' ') and (sdsl-jssl)>0"; + //可用量的查询,排除了MES锁定库存,出库指令锁定 + String kylSql="SELECT SHSL FROM CP_KYKCMX_LOCK_V WHERE cpbh=? and nvl(lpxx,' ' ) =nvl(?,' ') and nvl(color,' ' ) =nvl(?,' ') AND SHSL>0"; + //查询本地的锁定主表记录,如果有数量才能安排,没有数量,直接报错,无数量可解锁 + List sqls = new ArrayList(); + List values = new ArrayList(); + JsonObject MesMagess=Json.object(); + JsonArray 单条返回值=(JsonArray) Json.array(); + Map kykcmx=null; + Map jsslmx=null; + Map sdjl=null; + String restr=null; + try + { + //获取明细编号 + JsonObject jo = Json.parse(req).asObject(); + JsonArray data= jo.get("data").asArray(); + String djbh = jo.get("djbh").asString(); + int czlx = jo.get("czlx").asInt(); + for (JsonValue item : data) + { + String id = SerialNumber.getSerialNumber("AUTOID"); + JsonObject one = item.asObject(); + String cpbh = one.get("cpbh").asString(); + String lpxx = one.getString("lpxx", ""); + String color = one.getString("color", ""); + //ws 看看要不要用 +// if(color.equals(null) || color.length()==0 ) +// { +// color = "A000000"; +// } +// Object colorname = null; +// //ws +// if(db.hasAnyData("select 2 from colorattr where colorid=?", color)) +// { +// colorname=db.getSingleField("select fname2 from colorattr where colorid=?", color); +// System.out.println("Object colorname"+colorname); +// } + int sl = one.get("sl").asInt(); + System.out.println("czlx:"+czlx); + //在里面判断,前面的代码都是复用的 + if (czlx == 1)// 1锁定 + { + kykcmx = db.getSingleRow(kylSql,new Object[] { cpbh, lpxx,color }); + if (kykcmx != null) + { + //这里判断一下,是全部数量还是部分数量 + int kyl=sl; + if(Integer.parseInt(kykcmx.get("SHSL")) 0) + { + if (!db.preparedUpdate(sqls, values, false)) + { + return getOut("lockMaterial", 1, "插入单据时操作失败",req,meslw); + } + } + } + catch (Throwable e) + { + e.printStackTrace(); + return getOut("lockMaterial", 1, ServerUtil.getError(e),req,meslw); + } + meslw.log(MesMagess.toString(),LogWriter.DEBUG); + return MesMagess.toString(); + + } + /** + * MES获取库存可用量 + * 有物料无库存则数量返回0 + * 没有物料档案则返回-1 + * 每一条记录都要有返回值。 + * 2018-03-09程序进行优化,初定版本2 + * 这里要加压 + */ + public String getQuantity(String req) + { + meslw.log("call getQuantity with parameter " + req, LogWriter.DEBUG); + JsonArray rows = (JsonArray) Json.array();// 返回值 + try + { + JsonObject jo = Json.parse(req).asObject(); + JsonArray items = jo.get("data").asArray(); + for (JsonValue item : items) + { + Object number=null; + JsonObject one = item.asObject(); + String cpbh = one.getString("cpbh", ""); + String lpxx = one.getString("lpxx", ""); + String color = one.getString("color", ""); + JsonValue row=null; + //CP_KYKCMX_LOCK_V排除了已经锁定的物料 + String sql="SELECT sum(shsl) FROM CP_KYKCMX_LOCK_V where cpbh=? and nvl(lpxx,' ' ) =nvl(?,' ') and nvl(color,' ' ) =nvl(?,' ') and shsl>0"; + List values = new ArrayList(); + values.add(cpbh); + //有批次则加批次查询,没有则按产品编号查询 + //这里程序可以进行优化,一般都传2个参数,产品编号,批次 ,后期还可能有其他的参数,涂装库可可能还要加颜色?这里待实现 + Object sl = db.getSingleField(sql,new Object[]{cpbh,lpxx,color}); + //2017-12-19更新,没有物料档案则返回-1数量 + if(!db.hasAnyData("select * from cpxx where cpbh=?", cpbh)) + { + number="-1"; + return getOut("getQuantity", 1, "WMS 本地未找到物料档案",req,meslw); + } + //有物料档案信息 + else + { + number=sl; + } + //有数量,包括库存有数量,或者没有物料档案的 + if (number != DB.EMPTY&&number!=null&&!number.equals("")) + { + row = Json.object().add("cpbh", cpbh).add("lpxx", lpxx).add("color", color).add("sl", Integer.parseInt(number.toString())); + } + //没有库存的,返回0 + else + { + row = Json.object().add("cpbh", cpbh).add("lpxx", lpxx).add("color", color).add("sl", 0); + } + rows.add(row); + } + } + catch (Exception e) + { + return getOut("getQuantity", 1, e.getMessage(),req,meslw); + } + if (rows.size() == 0) + { + return getOut("getQuantity", 1, "未查询到记录",req,meslw); + } + return getOut("getQuantity", 0, "OK", rows,req,meslw); + } +// public static void main(String[] args) +// { +//// String str = "\r\nx y zbb " + +//// "\r\n\t\r\tx y zzcc "; +//// System.out.println(convertXmlDataToMapList(str)); +// +// String req="{\"result\":1,\"data\":[{\" \": \"code1\", \"qty\": 50, \"unit\": {\"UnitNumber\": \"001\", \"UnitName\": \"个\"}},"+ +// "{\"MaterialNumber\": \"code2\", \"qty\": 100, \"unit\": {\"UnitNumber\": \"001\", \"UnitName\": \"个\"}},"+ +// "{\"MaterialNumber\": \"code3\", \"qty\": 150, \"unit\": {\"UnitNumber\": \"001\", \"UnitName\": \"个\"}}],"+ +// "\"msg\":\"成功\"}"; +// JsonArray items = Json.parse(req).asObject().get("data").asArray(); +// JsonObject jo = Json.parse(req).asObject(); +// int result = jo.get("result").asInt(); +// System.out.println(result); +// for (JsonValue item : items) { +// String name = item.asObject().getString("MaterialNumber", "Unknown"); +// int quantity = item.asObject().getInt("qty", 1); +// JsonObject unit=item.asObject().get("unit").asObject();//获取对象 +// System.out.println(unit.get("UnitNumber").asString()); +// System.out.println(name); +// } +// +// JsonObject user = Json.object().add("name", "Alice").add("points", 23); +// JsonValue one =Json.object().add("name", "ddd").add("points", 23); +// JsonValue two =Json.object().add("name", "sss").add("points", 45); +// JsonArray a=(JsonArray) Json.array(); +// a.add(one).add(two); +// user.add("hehe", a); +// +// System.out.println(user.toString()); +// } + + private static List convertXmlDataToMapList(String xmlString){ + + List result = new ArrayList(); + + int indexMarkGreaterMark = 0; + int indexMarkLeaterMark = 0; + int indexEndMark = 0; + int n = xmlString.length(); + String nodeName; + String tableNode = null; + String rowNode = null; + Map rowData = null; + for (int i = 0; i < n; i++){ + + char c = xmlString.charAt(i); + if (c == '<'){ + + c = xmlString.charAt(i + 1); + if (c == '/'){//标记 + continue; + } + if (c == '?'){//处理 + i = xmlString.indexOf('?', i + 2) + 1; + continue; + } + + indexMarkGreaterMark = i; + indexMarkLeaterMark = xmlString.indexOf('>', indexMarkGreaterMark + 1); + i = indexMarkLeaterMark; + + c = xmlString.charAt(indexMarkLeaterMark - 1); + if (c == '/'){//处理 + continue; + } + + //System.out.println("from=" + indexMarkGreaterMark + ", to " + indexMarkLeaterMark); + + nodeName = xmlString.substring(indexMarkGreaterMark + 1, indexMarkLeaterMark); + //System.out.println("nodeName=" + nodeName); + if (tableNode == null){ + tableNode = nodeName; + } + else if (rowNode == null){ + rowNode = nodeName; + //System.out.println("\tRow Element=" + rowData); + rowData = new HashMap(); + } + else { + String fieldName = nodeName; + int nodeEndMark = xmlString.indexOf('<', i); + i = nodeEndMark + nodeName.length() + 2; + + String fieldValue = xmlString.substring(indexMarkLeaterMark + 1, nodeEndMark); + + System.out.println("\t\t" + fieldName + ".value = " + fieldValue); + + rowData.put(fieldName, fieldValue); + } + } + else if (c == '/'){ + indexEndMark = i; + indexMarkLeaterMark = xmlString.indexOf('>', i + 1); + i = indexMarkLeaterMark; + + nodeName = xmlString.substring(indexEndMark + 1, indexMarkLeaterMark); + if (nodeName.equals(rowNode)) + { + rowNode = null; + if (rowData != null){ + result.add(rowData); + } + } + else if (nodeName.equals(tableNode)){ + tableNode = null; + } + } + } + + return result; + + } + /** + * + * @param type 调用的方法名 + * @param sta 返回状态0成功,1失败 + * @param msg 具体信息 + * @return JSON字符串 + */ + private String getOut(String type,int sta ,String msg,String req,LogWriter lw) + { + StringBuilder contex = new StringBuilder(); + contex.append(type); + contex.append(" BACK "); + contex.append(msg); + contex.append(" para "); + contex.append(req); + lw.log(contex.toString(),LogWriter.DEBUG); + String re = Json.object().add("status", sta).add("message", msg).toString(); + System.out.println(re+"||||||||||||||||||||||||||||||||||||"); + return re; +// return Json.object().add("status", sta).add("message", msg).toString(); + } + /** + * + * @param type 调用的方法名 + * @param sta 返回状态0成功,1失败 + * @param msg 具体信息 + * @param a 返回JSON对象数组 + * @return + */ + private String getOut(String type,int sta ,String msg,JsonArray array,String req,LogWriter lw) + { + StringBuilder contex = new StringBuilder(); + contex.append(type); + contex.append(" BACK "); + contex.append(msg); + contex.append(" "); + contex.append(array.toString()); + contex.append(" para "); + contex.append(req); + lw.log(contex.toString(),LogWriter.DEBUG); + return Json.object().add("status", sta).add("message", msg).add("data", array).toString(); + } + + //TODO 单纯的从MES关联的领料执行的出库单号 无法在本地 锁定 多订单退料时,该物料对应的是哪个EAS领料单的,以及对应的entryID + private String MesTl(JsonObject jo,List sqls,List values,String djlx,String djbh,String req) throws Exception + { + JsonArray operationList = jo.get("operationList").asArray(); + String ysdh = SerialNumber.getSerialNumber("cprkd"); + sqls.add(sqlInsertSCTLRkd); + values.add(new Object[] { ysdh, djlx,"MES接口" ,new Date(),"2","LTCK","1",djbh}); + for(JsonValue list : operationList) + { + JsonObject operationItem = list.asObject(); + String relationNumber = operationItem.get("relationNumber").asString(); + if(!db.hasAnyData("select 2 from CKD where djbh=?", relationNumber)) + { + throw new Exception("退料关联单据号不存在"); + } +// Map ckdInfo = db.getSingleRow("SELECT ckdh FROM CKD WHERE djbh=?", relationNumber); + JsonArray orderList = operationItem.get("orderList").asArray(); + for(JsonValue order : orderList) + { + JsonObject orderItem = order.asObject(); + String jcddbh = orderItem.getString("orderNumber", ""); + String jcddid = orderItem.getString("easId", ""); + JsonArray materialList = orderItem.get("materialList").asArray(); + for(JsonValue material : materialList) + { + JsonObject materialItem = material.asObject(); + String cpbh = materialItem.getString("materialCode", ""); + Double sl = materialItem.getDouble("count", 0.0); + String lpxx = materialItem.getString("batch", ""); + String color = materialItem.getString("color", ""); + +// //集成订单信息 +// Map jcddxx = db.getSingleRow("SELECT jcddbh,jcddid FROM CKDMX WHERE ckdh=? and cpbh", ckdInfo.get("ckdh")); + if(!db.hasAnyData("select * from cpxx where cpbh=?", cpbh)) + { + return getOut("insertMesRkd", 1, "插入退料单据时操作失败,无物料档案记录!产品编号:"+cpbh,req,meslw); + } + Object mxbh = SerialNumber.getSerialNumber("cprkmxbh"); + sqls.add(sqlInsertSCTLRkdMx); + Map cpxx = db.getSingleRow("SELECT cpmc,cpgg1,cpgg2 FROM CPXX WHERE cpbh=?", cpbh); + values.add(new Object[] { ysdh, mxbh, cpbh, sl, lpxx,color, + cpxx.get("cpmc"), cpxx.get("cpgg1"),cpxx.get("cpgg2"),jcddbh,jcddid,relationNumber}); + } + } + } + return null; + } + + /** + * mes删除任务 + * @param req + * @return + */ + String sql = "update RGV_WORK SET zt=8 WHERE JOBLSH=? "; + public String MESDeleteRGVTask(String req) + { + rgvlw.log("call MESDeleteRGVTask with parameter " + req, LogWriter.DEBUG); + try + { + JsonObject jo = Json.parse(req).asObject(); + String joblsh = jo.get("operationNumber").asString(); + if(!db.hasAnyData("select 2 from rgv_work where joblsh=?", joblsh)) + { + return getOut("MESSingleToRGV", 1, "WMS无此记录"+joblsh,req,meslw); + } + if(!db.preparedUpdate(sql, new Object[]{joblsh}, false)){ + return getOut("MESSingleToRGV", 1, "删除单据失败",req,rgvlw); + } + return getOut("MESDeleteRGVTask", 0, "OK",req,rgvlw); + } + catch (Exception e) + { + // TODO: handle exception + return getOut("MESSingleToRGV", 1, e.getMessage(),req,rgvlw); + } + } + + + String sqlUpdateRGVWork = "update RGV_WORK SET MESORDER=? WHERE JOBLSH=? AND ZT=1"; + public String MESSingleToRGV(String req) + { + rgvlw.log("call MESSingleToRGV with parameter " + req, LogWriter.DEBUG); + try + { + JsonObject jo = Json.parse(req).asObject(); + //RGV单据流水号 + String joblsh = jo.get("operationNumber").asString(); + int single=jo.getInt("single", -1); +// System.out.println("joblsh: "+joblsh+"; single: "+single); + if(single != 1){ + return getOut("MESSingleToRGV", 1, "确认信号默认为1,实际传递信号为 : "+single,req,rgvlw); + } + Map djxx = db.getSingleRow("select deviceid,jobNo,MESORDER from RGV_WORK WHERE JOBLSH=? AND ZT=1", joblsh); + if(djxx == null){ + return getOut("MESSingleToRGV", 1, "未找到 订单流水号为 : "+joblsh +" 的正在执行的单据",req,rgvlw); + } + String deviceID = djxx.get("deviceid"); + int jobNo = Integer.parseInt(djxx.get("jobNo")); + int MESOrder = Integer.parseInt(djxx.get("MESORDER")); + if(!"csc5".equalsIgnoreCase(deviceID)){ + return getOut("MESSingleToRGV", 1, "只有第3条RGV焊接线才需要人工确认继续执行",req,rgvlw); + } + if(MESOrder >= 2){ + return getOut("MESSingleToRGV", 1, "改订单已确认完成,无需再次确认",req,rgvlw); + }else{ + MESOrder++; + } + //请求监控服务 + ObjectFromServlet ofs = RemoteAccesser.commitRequest(99 , 122, new Object[]{deviceID,jobNo,(byte)MESOrder}); + if(ofs.isSuccess() && ofs.getReturnedValue()!=null){ + String returnVal = ofs.getReturnedValue().toString(); + if("success".equalsIgnoreCase(returnVal)){ + if(!db.preparedUpdate(sqlUpdateRGVWork, new Object[]{MESOrder+"",joblsh}, false)){ + return getOut("MESSingleToRGV", 1, "插入单据信号状态失败",req,rgvlw); + } + return getOut("MESSingleToRGV", 0, "OK",req,rgvlw); + } + return getOut("MESSingleToRGV", 1, "确认信号未被传递到RGV小车上,原因: "+returnVal ,req,rgvlw); + } + return getOut("MESSingleToRGV", 1, "请求调用监控服务失败!!",req,rgvlw); + }catch (Exception e) + { + e.printStackTrace(); + return getOut("MESSingleToRGV", 1, e.getMessage(),req,rgvlw); + } + } + + + public String brightLight(String req) + { + System.out.print("req:"+req); + meslw.log("call brightLight with parameter " + req, LogWriter.DEBUG); +// ObjectFromServlet ofs = RemoteAccesser.commitRequest(99 , 123, new Object[]{"RR600"}); + JsonObject joas = Json.parse(req).asObject(); + String code=joas.getString("in0", null); + System.out.print("code:"+code); + meslw.log("code: "+ code, LogWriter.DEBUG); + ObjectFromServlet ofs = RemoteAccesser.commitRequest(99 , 123, new Object[]{"RR600",code}); + return getOut("brightLight", 0, "OK",req,meslw); + + } + + public String deviceStatus(String req) + { + JsonArray ja = new JsonArray(); + String device =(String)db.getSingleField("select dqz from SYS_CONFIG where id_pzx='devicesStatus'", null); + String[] deviceList = device.split(","); + for(int i=0;i