package com.shlanbao.tzsc.base.interceptor; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import com.shlanbao.tzsc.base.mapping.*; import com.shlanbao.tzsc.init.BaseParams; import com.shlanbao.tzsc.plugin.service.LoadComboboxServiceI; import com.shlanbao.tzsc.pms.cos.spare.beans.CosSparePartsBean; import com.shlanbao.tzsc.pms.md.unit.beans.UnitBean; import com.shlanbao.tzsc.pms.md.unit.service.UnitServiceI; import com.shlanbao.tzsc.pms.sch.workorder.beans.TransmitterWorkOrderBean; import com.shlanbao.tzsc.utils.params.ComboboxType; import com.shlanbao.tzsc.utils.tools.*; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.apache.log4j.Logger; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.StringUtils; import com.shlanbao.tzsc.pms.md.eqp.beans.EquipmentsBean; import com.shlanbao.tzsc.pms.cos.spare.service.CosSparePartsServiceI; import com.shlanbao.tzsc.pms.equ.requestRecord.service.EqpRequestRecordServiceI; import com.shlanbao.tzsc.pms.equ.wcplan.service.EqmWheelCovelPlanServiceI; import com.shlanbao.tzsc.pms.md.eqp.service.EquipmentsServiceI; import com.shlanbao.tzsc.pms.md.fixCode.beans.FixCodeBean; import com.shlanbao.tzsc.pms.md.fixCode.service.FixCodeServiceI; import com.shlanbao.tzsc.pms.md.mat.service.MatServiceI; import com.shlanbao.tzsc.pms.qm.outInspection.service.OutInspectionServiceI; import com.shlanbao.tzsc.pms.sch.workorder.service.BomServiceI; import com.shlanbao.tzsc.pms.sch.workorder.service.CraftServiceI; import com.shlanbao.tzsc.pms.sch.workorder.service.SchProdInventoryServiceI; import com.shlanbao.tzsc.pms.sch.workorder.service.SchWorkorderIOServiceI; import com.shlanbao.tzsc.pms.sch.workorder.service.WorkOrderServiceI; import com.shlanbao.tzsc.utils.params.SysEqpTypeBase; /** * [说明]:XML接口解析 * * */ public class PMSXmlDataInterceptor { @Autowired private BomServiceI schWorkorderBom; @Autowired private MatServiceI matService; @Autowired private WorkOrderServiceI workOrderService; @Autowired private EquipmentsServiceI equipmentsService; @Autowired private OutInspectionServiceI outInspectionService; @Autowired private CosSparePartsServiceI cosSparePartsService; @Autowired private FixCodeServiceI fixCodeService; @Autowired private EqmWheelCovelPlanServiceI eqmWheelCovelPlanService; @Autowired private EqpRequestRecordServiceI eqpRequestRecordServiceI; @Autowired private UnitServiceI unitServiceI; @Autowired private CraftServiceI craftServiceI; @Autowired private SchProdInventoryServiceI prodInventoryServiceI; @Autowired private SchWorkorderIOServiceI workorderIOServiceI; @Autowired private LoadComboboxServiceI loadComboboxService; protected Logger log = Logger.getLogger(this.getClass()); private static PMSXmlDataInterceptor instance = null; // 构造方法初始化 public PMSXmlDataInterceptor() { if (null == matService) { matService = ApplicationContextUtil.getBean(MatServiceI.class); } if (null == schWorkorderBom) { schWorkorderBom = ApplicationContextUtil.getBean(BomServiceI.class); } if (null == workOrderService) { workOrderService = ApplicationContextUtil.getBean(WorkOrderServiceI.class); } if (null == eqpRequestRecordServiceI) { eqpRequestRecordServiceI = ApplicationContextUtil.getBean(EqpRequestRecordServiceI.class); } if (null == equipmentsService) { equipmentsService = ApplicationContextUtil.getBean(EquipmentsServiceI.class); } if (null == outInspectionService) { outInspectionService = ApplicationContextUtil.getBean(OutInspectionServiceI.class); } if (null == cosSparePartsService) { cosSparePartsService = ApplicationContextUtil.getBean(CosSparePartsServiceI.class); } if (null == eqmWheelCovelPlanService) { eqmWheelCovelPlanService = ApplicationContextUtil.getBean(EqmWheelCovelPlanServiceI.class); } if (null == fixCodeService) { fixCodeService = ApplicationContextUtil.getBean(FixCodeServiceI.class); } if (null == unitServiceI) { unitServiceI = ApplicationContextUtil.getBean(UnitServiceI.class); } if (null == craftServiceI) { craftServiceI = ApplicationContextUtil.getBean(CraftServiceI.class); } if (null == prodInventoryServiceI) { prodInventoryServiceI = ApplicationContextUtil.getBean(SchProdInventoryServiceI.class); } if (null == workorderIOServiceI) { workorderIOServiceI = ApplicationContextUtil.getBean(SchWorkorderIOServiceI.class); } if (null == loadComboboxService) { loadComboboxService = ApplicationContextUtil.getBean(LoadComboboxServiceI.class); } } public static PMSXmlDataInterceptor getInstance() { if (instance == null) { instance = new PMSXmlDataInterceptor(); } return instance; } /** * 【说明】封装返回MES成功失败详细信息 * * @param type 1:BOM接口 2:工单撤销接口 3:工单下发 * @author WANCHANGHUANG * @date 2019年5月8日15:58:28 */ public String ContResMessage(int type, Map mapMessages) { if (type == 1) { String DateStr = DateUtil.getNowDateTime("yyyy-MM-dd HH:mm:ss"); //BOM下发接口 if (mapMessages.size() > 0) { String message = ""; //遍历MAP,凭借xml字符串 for (Entry entry : mapMessages.entrySet()) { message += "2" + DateStr + "" + entry.getKey() + entry.getValue() + ""; } message += ""; return message; } return "1" + DateStr + "解析成功!"; } else if (type == 2) { //工单撤销 if (mapMessages.size() > 0) { String message = ""; //遍历MAP,凭借xml字符串 for (Entry entry : mapMessages.entrySet()) { message += "" + entry.getKey() + entry.getValue() + ""; } message += ""; return message; } return "1"; } else if (type == 3) { //工单下发 if (mapMessages.size() > 0) { String message = ""; //遍历MAP,凭借xml字符串 for (Entry entry : mapMessages.entrySet()) { message += "2" + entry.getKey() + "" + entry.getValue() + ""; } message += ""; return message; } return "1解析成功!"; } else if (type == 4) { //物料锁定 if (mapMessages.size() > 0) { String message = ""; //遍历MAP,凭借xml字符串 for (Entry entry : mapMessages.entrySet()) { message += ""+entry.getKey()+""+entry.getValue()+""; } message += ""; return message; } return "1"; } return null; } /** * @param isSend 是否发送方 * @param des 日志描述 * @param flag 成功标志 * @param xml xml文本 * @param remark 详细日志 * @Title: addLog * @Description: 添加接口日志 * @author baoshiwei * @date 2019年5月6日 */ public void addLog(boolean isSend, String des, Integer flag, String xml, String... remark) { try { SysMessageQueue log = new SysMessageQueue(); if (!isSend) { log.setSysReceive(1L);// 接受方 log.setSysSend(2L);// 发送方 log.setMsgType(0L); } else { log.setSysReceive(2L);// 接受方 log.setSysSend(1L);// 发送方 log.setMsgType(1L); } log.setDel(0L); log.setContent(xml); log.setDes(des);// 描述 log.setFlag(flag);// 成功或失败 log.setDate(new Date()); if (remark.length > 0) { log.setRemark(remark[0]); } workOrderService.saveAndReturn(log); } catch (Exception e) { e.printStackTrace(); } } /** * [说明]:系统握手信号 * * @author wanchanghuang * @date 2019年4月29日16:42:14 * @param strXml */ public String MESSendHandshakeSignal(String strXml) { PMSXmlDataInterceptor.getInstance().addLog(false, "系统握手信号", 1, strXml); return "ok"; } /** * [功能说明]:工单BOM接口 * * @author wanchanghuang * @createTime 2019年4月29日16:46:58 */ public String MESSendWorkOrderBom(Document doc, String strXml) { try { if (doc == null) { /** 日志 1-成功 */ PMSXmlDataInterceptor.getInstance().addLog(false, "BOM接口下发", 2, strXml,"BOM接口异常,下发的xml为空!!!!"); return "2" + DateUtil.getNowDateTime("yyyy-MM-dd HH:mm:ss") + "ERR:BOM接口异常,下发的xml为空!!!!"; } List list = doc.selectNodes("//dataset/data"); Iterator WorkOrders = list.iterator(); SchWorkorderBom schWkBom = null; MdMat mdMat = null; MdUnit mdUnit = null; Map mapMessages = new HashMap(); // 匹配物料 Map matMap = matService.getAllMatMap(); // 匹配单位 Map unitMap = Mes2DASParams.MES2DASUnit(); while (WorkOrders.hasNext()) { Element ele = (Element) WorkOrders.next(); String BOMRevision = ele.elementTextTrim("BOMRevision");//版本号 String materialCode = ele.elementTextTrim("MaterialCode");//牌号 String effectTime = ele.elementTextTrim("EffectTime"); // 生效日期 Date etime = null; try{ etime = DateUtil.strToDate(effectTime,"yyyy-MM-dd"); }catch (Exception e) { mapMessages.put(effectTime,">>日期不能转换"+materialCode); } String[] prods= matMap.get(materialCode); if(prods==null || prods.length!=2) { mapMessages.put(materialCode,">>物料不能匹配"+materialCode); break; } schWorkorderBom.deleteBomByBomId(BOMRevision); Iterator items = ele.elementIterator("item"); while (items.hasNext()) { Element itemEle = (Element) items.next(); String MaterialCode = itemEle.elementTextTrim("MaterialCode"); //物料代码 String UOM = itemEle.elementTextTrim("UOM");//单位 String Quantity=itemEle.elementTextTrim("Quantity");//计划投料产量 String MachineCode=itemEle.elementTextTrim("MachineCode");//设备类型 //封装对象 schWkBom = new SchWorkorderBom(); schWkBom.setBom_lot_id(BOMRevision); schWkBom.setProd(new MdMat(prods[0])); schWkBom.setEqptype(MachineCode); schWkBom.setEffectTime(etime); schWkBom.setDel(0); mdMat=new MdMat();//物料转换 String[] str= matMap.get(MaterialCode); if(str==null || str.length!=2) { mapMessages.put(MaterialCode,">>物料不能匹配"+MaterialCode); break; } mdMat.setId(str[0]); schWkBom.setMdMat(mdMat); mdUnit=new MdUnit();//单位转换 String unitId = unitMap.get(UOM); if(unitId==null || "".equals(unitId)){ mapMessages.put(MaterialCode,">>单位不能匹配"+UOM); break; } mdUnit.setId(unitId); schWkBom.setMdUnit(mdUnit); schWkBom.setQty(StringUtil.converObj2Double(Quantity)); //保存 //插入前先查询是否已存在 long total= schWorkorderBom.querySchWkOrderBom(schWkBom); if(total==0) { schWorkorderBom.addSchWkOrderBom(schWkBom); } else { } } } String res = ContResMessage(1, mapMessages); //保存日志 PMSXmlDataInterceptor.getInstance().addLog(false, "BOM接口下发", mapMessages.size() > 0 ? 2 : 1, strXml,res); //返回MES return res; } catch (Exception e) { e.printStackTrace(); } /** 日志 2-失败 */ PMSXmlDataInterceptor.getInstance().addLog(false, "BOM接口下发异常", 2, strXml,"ERR:BOM接口解析错误!!!"); return "2" + DateUtil.getNowDateTime("yyyy-MM-dd HH:mm:ss") + "ERR:BOM接口解析错误!!!"; } /** * [功能说明]:成品主数据接口 * * @author wanchanghuang * @createTime 2019年5月7日08:14:25 */ public void MESSendFinProductData(Document doc, String strXml) { try { if (doc == null) { /** 日志 1-成功 */ PMSXmlDataInterceptor.getInstance().addLog(false, "成品主数据", 2, strXml ,"成品主数据异常,XML为空或者格式不正确"); }else { List list = doc.selectNodes("//dataset/data"); Iterator WorkOrders = list.iterator(); MdMat mdMat = null; MdUnit mdUnit = null; MdMatType mdMatType = null; int success = 0; while (WorkOrders.hasNext()) { Element ele = (Element) WorkOrders.next(); String CgtName = ele.elementTextTrim("CgtName");//卷烟牌号名称 String CgtCode = ele.elementTextTrim("CgtCode");//卷烟牌号CODE if(StringUtils.isEmpty(CgtName) || StringUtils.isEmpty(CgtCode)) { /** 日志 1-成功 */ PMSXmlDataInterceptor.getInstance().addLog(false,"成品主数据接口", 2,strXml,"ERR:成品主数据接口,品牌编号或品牌名称为空!"); continue; } //封装 mdMat = new MdMat(); mdMat.setCode(CgtCode);//编号 mdMat.setName(CgtName);//名称 mdMat.setSimpleName(CgtName);//简称 mdMat.setDes(CgtName);//备注 mdUnit = new MdUnit(); mdUnit.setId("1");// TODO 默认单位箱 mdMat.setMdUnit(mdUnit); mdMat.setLastUpdateTime(new Date()); mdMat.setEnable(1l); mdMat.setDel("0"); mdMatType = new MdMatType(); mdMatType.setId("1");// TODO 默认数据类型品牌1 mdMat.setMdMatType(mdMatType); //保存,插入前验证是否已经存在 long total = matService.queryMdMatType(mdMat); if (total == 0) { // TODO 已存在的是否需要更新? matService.saveMdMat(mdMat); } success ++; } /** 日志 1-成功 */ PMSXmlDataInterceptor.getInstance().addLog(false,"成品主数据接口", 1, strXml,"其接收到"+ list.size() +"条数据,保存成功" + success +"条"); } }catch (Exception e) { PMSXmlDataInterceptor.getInstance().addLog(false,"成品主数据接口异常", 2, strXml,"接口解析异常,请核对XML数据!"); e.printStackTrace(); } } /** * [功能说明]:滤棒 / 烟丝半成品接口 * * @author wanchanghuang * @createTime 2019年5月7日08:14:25 */ public void MESSendSemiFinProductData(Document doc, String strXml) { String message = null; try { if (doc == null) { /** 日志 1-成功 */ PMSXmlDataInterceptor.getInstance().addLog(false, "半成品主数据", 2, strXml , "半成品主数据异常,XML为空或者XML格式不规范!!!"); }else { List list = doc.selectNodes("//dataset/data"); Iterator WorkOrders = list.iterator(); MdMat mdMat = null; MdUnit mdUnit = null; MdMatType mdMatType = null; int success = 0; // 匹配单位 Map unitMap = Mes2DASParams.MES2DASUnit(); while (WorkOrders.hasNext()) { Element ele = (Element) WorkOrders.next(); String Description = ele.elementTextTrim("Description");//半成品名称 String SemiCode = ele.elementTextTrim("SemiCode");//半成品编码 String CgtBrandCode = ele.elementTextTrim("CgtBrandCode");//卷烟牌号CODE String UnitCode = ele.elementTextTrim("UnitCode");//单位 String SemiClsCode = ele.elementTextTrim("SemiClsCode"); //类别 mdMatType = new MdMatType(); // 12 滤棒 09 烟丝 if ("12".equals(SemiClsCode)){ mdMatType.setId("14");// 滤棒半成品 } else if("09".equals(SemiClsCode)){ mdMatType.setId("34");// 烟丝 } else { continue; } if(StringUtils.isEmpty(SemiCode) || StringUtils.isEmpty(Description)) { /** 日志 1-成功 */ PMSXmlDataInterceptor.getInstance().addLog(false,"半成品主数据接口", 2, strXml,"ERR:半成品主数据接口,半成品编号或半成品名称为空!"); continue; } //封装 mdMat = new MdMat(); mdMat.setCode(SemiCode);//编号 mdMat.setName(Description);//名称 mdMat.setSimpleName(Description);//简称 mdMat.setDes(Description + "卷烟品牌CODE:" + CgtBrandCode);//备注 //单位 String unitId = unitMap.get(UnitCode); if (unitId == null || "".equals(unitId)) { message = "ERR:烟丝/滤棒 半成品接口异常,不能找到单位" + UnitCode; PMSXmlDataInterceptor.getInstance().addLog(false, "半成品主数据接口异常", 2, strXml ,message ); break; } mdUnit = new MdUnit(); mdUnit.setId(unitId); mdMat.setMdUnit(mdUnit); mdMat.setLastUpdateTime(new Date()); mdMat.setEnable(1l); mdMat.setDel("0"); mdMat.setMdMatType(mdMatType); //保存,插入前验证是否已经存在 long total = matService.queryMdMatType(mdMat); if (total == 0) { matService.saveMdMat(mdMat); } success ++; } /** 日志 1-成功 */ PMSXmlDataInterceptor.getInstance().addLog(false,"半成品主数据接口", 1, strXml,"其接收到"+ list.size() +"条数据,保存成功" + success +"条"); } }catch (Exception e) { /** 日志 2-失败 */ PMSXmlDataInterceptor.getInstance().addLog(false,"半成品主数据接口异常", 2, strXml,"接口解析异常,请核对xml数据!"); e.printStackTrace(); } } /** * [功能说明]:卷包 / 成型 物料主数据 * * @author wanchanghuang * @createTime 2019年5月7日08:14:25 */ public void MESSendPartData(Document doc, String strXml) { String message = null; try { if (doc == null) { /** 日志 1-成功 */ PMSXmlDataInterceptor.getInstance().addLog(false, "物料主数据", 2, strXml ,"物料主数据异常,XML为空或者XML格式不规范!!!"); }else { List list = doc.selectNodes("//dataset/data"); Iterator WorkOrders = list.iterator(); MdMat mdMat = null; MdUnit mdUnit = null; MdMatType mdMatType = null; List unitErr = new ArrayList<>(); List typeErr = new ArrayList<>(); int success = 0; // 匹配单位 Map unitMap = Mes2DASParams.MES2DASUnit(); // 物料类型(物料大类) Map MatMap = Mes2DASParams.MES2DASMatType();// mescode while (WorkOrders.hasNext()) { Element ele = (Element) WorkOrders.next(); String Name = ele.elementTextTrim("Name");//物料名称 String Short = ele.elementTextTrim("Short");//物料简称 String Code = ele.elementTextTrim("Code");//物料CODE String UnitsCode = ele.elementTextTrim("UnitsCode");//单位 String Lcls = ele.elementTextTrim("Lcls");//物料大类 //封装 mdMat = new MdMat(); mdMat.setCode(Code);//编号 mdMat.setName(Name);//名称 mdMat.setSimpleName(Short);//简称 mdMat.setDes(Short);//备注 //单位 String unitId = unitMap.get(UnitsCode); if (unitId == null || "".equals(unitId)) { unitErr.add(Code+"-->"+UnitsCode); /*message = "ERR:物料主数据接口异常,不能找到单位" + UnitsCode; *//** 日志 2-失败 *//* PMSXmlDataInterceptor.getInstance().addLog(false, "物料主数据接口异常", 2, ele.asXML() , message);*/ continue; } mdUnit = new MdUnit(); mdUnit.setId(unitId); mdMat.setMdUnit(mdUnit); mdMat.setLastUpdateTime(new Date()); mdMat.setEnable(1l); mdMat.setDel("0"); String matTypeId="";//wu //物料类型 ,条透?小透不能再大类区分,碰到12只能通过小类区分 if("12".equals(Lcls)) { Lcls= ele.elementTextTrim("Scls");//物料小类 matTypeId = MatMap.get(Lcls); }else { matTypeId = MatMap.get(Lcls); } if (matTypeId == null || "".equals(matTypeId)) { typeErr.add(Code+"-->"+Lcls); /*message = "ERR:物料主数据接口异常,物料大类不能匹配到类型Lcls:" + Lcls; *//** 日志 2-失败 *//* PMSXmlDataInterceptor.getInstance().addLog(false, "物料主数据接口异常", 2, ele.asXML() , message );*/ continue; } mdMatType = new MdMatType(); mdMatType.setId(matTypeId);//物料大类转换成数采ID mdMat.setMdMatType(mdMatType); //保存,插入前验证是否已经存在 long total = matService.queryMdMatType(mdMat); if (total == 0) { matService.saveMdMat(mdMat); } success ++; } /** 日志 1-成功 */ String remark = "其接收到"+ list.size() +"条数据,保存成功" + success +"条;"; if (unitErr.size()>0){ remark+=unitErr.size()+"条数据单位不能匹配"+ JSONArray.fromObject(unitErr).toString(); } if (typeErr.size()>0){ remark+=typeErr.size()+"条数据物料类型不能匹配"+JSONArray.fromObject(typeErr).toString(); } PMSXmlDataInterceptor.getInstance().addLog(false, "物料主数据接口", 1, strXml,remark); } } catch (Exception e) { /** 日志 2-失败 */ PMSXmlDataInterceptor.getInstance().addLog(false, "物料主数据接口解析异常", 2, strXml , message); e.printStackTrace(); } } /** * [功能说明]:卷包/成型工单下发 * * @author wanchanghuang * @createTime 2019年5月7日08:14:25 */ public String MESSendWorkOrder(Document doc, String strXml) { String message = null; try { if (doc == null) { /** 日志 1-成功 */ PMSXmlDataInterceptor.getInstance().addLog(false, "卷包工单接口下发", 2, strXml,"卷包工单接口下发异常,下发的xml为空!!!!"); return "2ERR:卷包工单接口下发异常,下发的xml为空!!!!"; } // 匹配物料 Map matMap = matService.getAllMatMap(); // 匹配单位 Map unitMap = Mes2DASParams.MES2DASUnit(); // 匹配设备 Map eqpMap = Mes2DASParams.MES2DASALLEqp(); // 设备编号 Map eqpCodeMap=Mes2DASParams.MES2DASALLEqpCode(); SchWorkorder schWk = null; MdShift mdShift = null; MdTeam mdTeam = null; MdEquipment mdEqu = null; MdMat mdMat = null; MdUnit mdUnit = null; int success = 0; Map mapMessages = new HashMap(); // 获取WorkOrders节点集合 List list = doc.selectNodes("//dataset/data"); Iterator WorkOrders = list.iterator(); while (WorkOrders.hasNext()) { Element ele = (Element) WorkOrders.next(); String WorkOrderCode = ele.elementTextTrim("WorkOrderCode");// 工单编号 if(WorkOrderCode.contains("#030")){ continue; } String BatchCode = ele.elementTextTrim("BatchCode");// 生产批次号 String OrderType = ele.elementTextTrim("OrderType");// 工单类型 String ProductType = ele.elementTextTrim("ProductType");// 生产类型 String Shift = ele.elementTextTrim("Shift");// 班次 String TeamCode = ele.elementTextTrim("TeamCode");// 班组 String MachineCode = ele.elementTextTrim("MachineCode");//机台 String MaterialCode = ele.elementTextTrim("MaterialCode");//牌号 String SequenceNo = ele.elementTextTrim("SequenceNo");// 顺序号 String PlanQuantity = ele.elementTextTrim("PlanQuantity");// 计划产量 String UOM = ele.elementTextTrim("UOM");// 单位 String ProductDate = ele.elementTextTrim("ProductDate");// 计划生产日期 String PlanStartTime = ele.elementTextTrim("PlanStartTime");//计划开始时间 String PlanEndTime = ele.elementTextTrim("PlanEndTime");// 计划结束时间 String BomRevision = ele.elementTextTrim("BomRevision");// 版本号 String ParameterSetRevision = ele.elementTextTrim("ParameterSetRevision");// 工艺版本号 //封装 schWk = new SchWorkorder(); schWk.setCode(WorkOrderCode);//工单编号 schWk.setBth(BatchCode); //生产批次号 //工单类型转换 2 包装机组 1 卷接机组 3 装封箱机 4 成型机组 5 发射机组 /** *021801 卷接机组 0218 021901 包装机组 0219 022001 滤棒成型机组 0220 022103 装封箱机 0221 MES 卷包 0-卷包(01-卷烟 02-包装) 1-卷烟 2-包装机 1-成型 4-成型 2-制叶 3-制丝 4-封箱 3-装箱机 5-梗丝 6-烟丝 7-滤棒发射 5-发射机 8-膨丝 * * */ schWk.setProdType(ProductType == "1" ? 2l : 1l);//生产类型 mdShift = new MdShift();//班次 mdShift.setId(Shift); schWk.setMdShift(mdShift); mdTeam = new MdTeam(); //班组 mdTeam.setId(TeamCode); schWk.setMdTeam(mdTeam); schWk.setSts(1l);//工单默认状态1:下发状态 mdEqu = new MdEquipment();//机台 String eqpId=eqpMap.get(MachineCode); if (eqpId == null || "".equals(eqpId)) { mapMessages.put(MachineCode, "机台号不能转换" + MachineCode); break; } //----------------------------------------------工单类型 if(!StringUtils.isEmpty(OrderType)) { if("0".equals(OrderType)) { String eqpCode = eqpCodeMap.get(MachineCode); schWk.setType(Long.valueOf(eqpCode.substring(0,1))); }else if("1".equals(OrderType)) { schWk.setType(4l); }else if("4".equals(OrderType)) { schWk.setType(3l); }else if("7".equals(OrderType)) { schWk.setType(5l); } if (schWk.getType()==null) { mapMessages.put(WorkOrderCode, "工单类型不能转换" + OrderType); } } mdEqu.setId(eqpId); schWk.setMdEquipment(mdEqu); //牌号 mdMat = new MdMat(); String[] str = matMap.get(MaterialCode); if (str==null || str.length != 2) { mapMessages.put(WorkOrderCode, "物料不能转换" + MaterialCode); break; } mdMat.setId(str[0]); schWk.setMdMat(mdMat); //顺序号 schWk.setRunSeq(StringUtil.converObj2Long(SequenceNo)); schWk.setQty(StringUtil.converObj2Double(PlanQuantity));//计划产量 //单位 mdUnit = new MdUnit(); String unitId = unitMap.get(UOM); if (unitId == null || "".equals(unitId)) { mapMessages.put(WorkOrderCode, "单位不能转换" + UOM); break; } mdUnit.setId(unitId); schWk.setMdUnit(mdUnit); schWk.setDate(DateUtil.formatStringToDate(ProductDate, "yyyy-MM-dd"));//工单日期 schWk.setStim(DateUtil.formatStringToDate(PlanStartTime, "yyyy-MM-dd HH:mm:ss"));//计划开始时间 schWk.setEtim(DateUtil.formatStringToDate(PlanEndTime, "yyyy-MM-dd HH:mm:ss"));//计划结束时间 schWk.setBomVersion(BomRevision);//版本号 schWk.setIsNew(1l); schWk.setIsCheck(0l); schWk.setDel(0l); schWk.setEnable(1l); schWk.setIsAuto("Y"); schWk.setParameterSetRevision(ParameterSetRevision);//工艺版本号 if (schWk.getType()==5){ TransmitterWorkOrderBean orderBean = new TransmitterWorkOrderBean(); orderBean.setEqpId(schWk.getMdEquipment().getId()); orderBean.setMaterialCode(schWk.getMdMat().getId()); orderBean.setUnit(schWk.getMdUnit().getId()); orderBean.setOrderType(schWk.getType()+""); orderBean.setDate_(schWk.getDate()); orderBean.setDel(0); orderBean.setSts(1); orderBean.setWorkOrderCode(schWk.getCode()); orderBean.setShift(schWk.getMdShift().getId()); orderBean.setTeam(schWk.getMdTeam().getId()); orderBean.setBatchCode(schWk.getBth()); orderBean.setStim(schWk.getStim()); orderBean.setEtim(schWk.getEtim()); orderBean.setPlanQuantity(schWk.getQty()); orderBean.setProductType(schWk.getProdType()+""); long total = workOrderService.queryTransmitterOrderByCode(orderBean.getWorkOrderCode()); if (total==0){ workOrderService.addFSJOrder(orderBean); } }else{ long total = workOrderService.querySchWorkOrderByCode(schWk); if (total == 0) { //保存工单,保存前,查询是否已经插入 workOrderService.addSchWorkOrderObj(schWk); } } success ++; } String res = ContResMessage(3, mapMessages); //保存日志 PMSXmlDataInterceptor.getInstance().addLog(false, "卷包工单接口下发", mapMessages.size() > 0 ? 2 : 1, strXml,"其接收到"+ list.size() +"条数据,保存成功" + success +"条。" + "错误信息:"+res); //返回MES return res; } catch (Exception e) { e.printStackTrace(); } /** 日志 2-失败 */ PMSXmlDataInterceptor.getInstance().addLog(false, "卷包工单接口下发异常", 2, strXml ,"ERR:卷包工单接口下发解析异常," + message); return "2ERR:卷包工单接口下发解析异常," + message + ""; } /** * [功能说明]:工单撤销接口 -同步 * * @author wanchanghuang * @createTime 2019年5月7日08:14:25 */ public String MESSendOrderCancelRequest(Document doc, String strXml) { try { if (doc == null) { /** 日志 1-成功 */ PMSXmlDataInterceptor.getInstance().addLog(false, "工单撤销接口异常", 2, strXml,"MES下发的XML数据为空"); return "MES下发的XML数据为空"; } SchWorkorder wkorder = null; Map mapMessages = new HashMap(); List list = doc.selectNodes("//dataset/data"); Iterator WorkOrders = list.iterator(); while (WorkOrders.hasNext()) { Element ele = (Element) WorkOrders.next(); String WorkOrderCode = ele.elementTextTrim("WorkOrderCode");// 工单编号 wkorder = new SchWorkorder(); wkorder.setCode(WorkOrderCode); //查询正在运行,完成的工单是否存在,如果存在,撤销失败,如果不存在,运行修改工单状态 long total = workOrderService.querySchworkOrderByCodes(wkorder); if (total == 0) { workOrderService.updateSchWorkOrderStatus(wkorder); } else { mapMessages.put(WorkOrderCode, "该工单已经审核"); } } String res = ContResMessage(2, mapMessages); //保存日志 PMSXmlDataInterceptor.getInstance().addLog(false, "工单撤销接口下发", mapMessages.size() > 0 ? 2 : 1, strXml+"----------------反馈mes信息----------------"+res); //返回MES return res; } catch (Exception e) { e.printStackTrace(); } /** 日志 2-失败 */ PMSXmlDataInterceptor.getInstance().addLog(false, "工单撤销接口下发异常", 2, strXml,"解析异常,请查看XML数据"); return "解析异常,请查看XML数据"; } /** * [功能说明]:物料锁定 -同步 * * @author wanchanghuang * @createTime 2019年5月7日08:14:25 */ public String MESSendMaterialLock(Document doc, String strXml) { try { if (doc == null) { /** 日志 1-成功 */ PMSXmlDataInterceptor.getInstance().addLog(false, "物料锁定接口异常", 2, strXml,"ERR: XML为空异常"); return "ERR: XML为空异常/Message>"; } MdMaterialLk wkorder = null; Map mapMessages = new HashMap(); List list = doc.selectNodes("//dataset/data"); Iterator WorkOrders = list.iterator(); while (WorkOrders.hasNext()) { Element ele = (Element) WorkOrders.next(); String MaterialCode = ele.elementTextTrim("MaterialCode");// 物料编号 String MaterialBatchCode = ele.elementTextTrim("MaterialBatchCode");// 物料批次号 String Type = ele.elementTextTrim("Type");// 0-解锁 1-锁定 wkorder = new MdMaterialLk(); wkorder.setMaterialBatchCode(MaterialBatchCode); wkorder.setMaterialCode(MaterialCode); wkorder.setType(Type); wkorder.setCreateDate(new Date()); wkorder.setUpdateDate(wkorder.getCreateDate()); /** * 1.通过 type判断 * 0-解锁,直接修改状态 * 1-锁定,查看是否已存在,存在直接修改状态 * 不存在,直接添加新的锁定 * * */ if("0".equals(Type)) { matService.updateMdMaterail(wkorder); }else if("1".equals(Type)) { //查询正在运行,完成的工单是否存在,如果存在,撤销失败,如果不存在,运行修改工单状态 long total = matService.queryMdMaterailAll(wkorder); if(total==0) { //添加 matService.addMdMaterail(wkorder); }else { //修改 matService.updateMdMaterail(wkorder); } } } String res = ContResMessage(4, mapMessages); //保存日志 PMSXmlDataInterceptor.getInstance().addLog(false, "物料锁定接口", mapMessages.size() > 0 ? 2 : 1, res + strXml); //返回MES return res; } catch (Exception e) { e.printStackTrace(); } /** 日志 2-失败 */ PMSXmlDataInterceptor.getInstance().addLog(false, "物料锁定接口异常", 2, strXml,"ERR: XML异常"); return "ERR: XML异常/Message>"; } /** * [功能说明]:卷接机台物料告警接口 * @author wanchanghuang * @createTime 2019年5月15日13:00:07 * */ public void MESSendEquipmentAlarm(Document doc, String strXml) { try { if (doc == null) { /** 日志 1-成功 */ PMSXmlDataInterceptor.getInstance().addLog(false, "卷接机台物料告警接口", 2, strXml , "[卷接机台物料告警接口异常,XML为空或者格式不正确]"); }else { List list = doc.selectNodes("//dataset/data"); Iterator WorkOrders = list.iterator(); Map map=new HashMap(); while (WorkOrders.hasNext()) { Element ele = (Element) WorkOrders.next(); Iterator items = ele.elementIterator("item"); while (items.hasNext()) { Element itemEle = (Element) items.next(); String CoilingNo = itemEle.elementTextTrim("CoilingNo");//卷烟牌号名称 String Shift = itemEle.elementTextTrim("Shift");//卷烟牌号CODE map.put(CoilingNo, Shift); } } /** 日志 1-成功 */ PMSXmlDataInterceptor.getInstance().addLog(false,"卷接机台物料告警接口", 1, strXml); //推送WCT对应设备机台 System.err.println("卷接机台物料告警接口>>>>"+map.size()); for(Entry k: map.entrySet()) { System.out.println(k.getKey()+" "+k.getValue()); } } }catch (Exception e) { PMSXmlDataInterceptor.getInstance().addLog(false,"卷接机台物料告警接口异常", 2, strXml,"接口异常"); e.printStackTrace(); } } /******接口分割线 ************************************************************************************************/ /** * @param ftype 调用方法名称 * @param fstr xml字符串 * @param doc xml DOM对象 * @Title: alalyMESSendEquipmentToDAS * @Description: 设备主数据下发(辅助设备没有工段) * @author baoshiwei * @date 2019年5月6日 */ public void alalyMESSendEquipmentToDAS(String ftype, String fstr, Document doc) { try { MdEquipment equipment = null; MdEqpType mdEqpType = null; MdWorkshop mdWorkshop = null; //辅助设备 MdAppendEquipment appendEquipment = null; int success = 0; List appendEqps = new ArrayList<>(); List eqps = new ArrayList<>(); // 设备类型map转换 Map eqpTypeMap = Mes2DASParams.MES2DASEqpCategory(); // 设备型号map转换 Map machineMap = Mes2DASParams.MES2DASMachineType(); // 车间转换 Map workShopMap = Mes2DASParams.MES2DASWorkShop(); // 工段对应的 数采设备信息(0:设备code 1:工单类型 2.设备类型 ) Map workCenterMap = Mes2DASParams.MES2DASWorkCenterEQP(); // 额定车速单位转换 Map rSpeedUnitMap = Mes2DASParams.MES2DASRSpeedUnit(); // 额定产能单位转换 Map rCapacityUnit = Mes2DASParams.MES2DASRCapacityUnit(); // 获取Equipments节点集合 List list = doc.selectNodes("dataset/data"); if (list == null || list.size() < 1) { log.error("XML数据中不包含设备主数据信息!请核对xml数据!"); PMSXmlDataInterceptor.getInstance().addLog(false, "设备主数据下发", 2, fstr, "XML数据中不包含设备主数据信息!请核对xml数据!"); return; } Iterator Equipments = list.iterator(); while (Equipments.hasNext()) { //辅助设备的工段为空,用于区分主辅设备 Element ele = (Element) Equipments.next(); String MesEqpCode = ele.elementTextTrim("MachineryCode");// 设备编号 String workCenter = ele.elementTextTrim("WorkCenterCode");// 工序段 if (!StringUtil.notEmpty(MesEqpCode)) { log.error("设备编号不能为空!"); } //辅助设备没有工段 //主数据(发射机没有工段,需要手动录入或特殊处理) if (StringUtil.notEmpty(workCenter)) { // 根据设备编码或工段查询是否已经存在。已存在的不进行操作 equipment = equipmentsService.getEqpByMESCodeOrWorkCenter(MesEqpCode, workCenter, true); if (equipment != null) { // 设备已经存在 // throw new Exception("该设备已经在卷包数采中存在!设备mes_code为" + MesEqpCode); System.out.println("该设备已经在卷包数采中存在!设备mes_code为" + MesEqpCode); } String[] str = workCenterMap.get(workCenter); if (str == null) { log.error("数采系统没有匹配到MES中该设备工段对应的设备信息!请在卷包数采 综合基础数据中维护!设备工段为" + workCenter); PMSXmlDataInterceptor.getInstance().addLog(false, "设备主数据下发", 2, ele.asXML(), "数采系统没有匹配到MES中该设备工段对应的设备信息!请在卷包数采 综合基础数据中维护!设备工段为" + workCenter); continue; } String eqpCode = str[0]; if (!StringUtil.isInteger(eqpCode)) { log.error("MES系统下发的该设备工段对应的数采设备信息维护设备code错误!请在卷包数采 综合基础数据中维护!设备工段为" + workCenter); PMSXmlDataInterceptor.getInstance().addLog(false, "设备主数据下发", 2, ele.asXML(), "MES系统下发的该设备工段对应的数采设备信息维护设备code错误!请在卷包数采 综合基础数据中维护!设备工段为" + workCenter); continue; } String eqpName = str[3]; //String eqpName = ele.elementTextTrim("MachineryName");// 设备名称 String eqpDesc = ele.elementTextTrim("EquipmentLocationDes");// 设备描述 String eqpType = ele.elementTextTrim("MachinerySClass");// 设备类别 // 卷烟机、包装机 eqpType = eqpTypeMap.get(eqpType); //设备类型大类 1:卷烟机 2:保障机制 3: 装封箱机 4:成型机 if (eqpType == null) { log.error("卷包数采系统没有匹配到MES设备类型!请在卷包数采 综合基础数据中维护 。该设备mes_code为" + MesEqpCode + " MES设备类型为:" + ele.elementTextTrim("MachinerySClass")); PMSXmlDataInterceptor.getInstance().addLog(false, "设备主数据下发", 2, ele.asXML(), "卷包数采系统没有匹配到MES设备类型!请在卷包数采 综合基础数据中维护 。该设备mes_code为" + MesEqpCode + " MES设备类型为:" + ele.elementTextTrim("MachinerySClass")); continue; } String machineType = ele.elementTextTrim("MachineryModel");// 机型 // ZJ17 machineType = machineMap.get(machineType); if (machineType == null) { log.error("卷包数采系统没有匹配到MES系统该设备机型!请在卷包数采 综合基础数据中维护 。该设备mes_code为" + MesEqpCode + " MES中设备机型为:" + ele.elementTextTrim("MachineryModel")); PMSXmlDataInterceptor.getInstance().addLog(false, "设备主数据下发", 2, ele.asXML(), "卷包数采系统没有匹配到MES系统该设备机型!请在卷包数采 综合基础数据中维护 。该设备mes_code为" + MesEqpCode + " MES中设备机型为:" + ele.elementTextTrim("MachineryModel")); continue; } String workshop = ele.elementTextTrim("AreaName");// 车间 workshop = workShopMap.get(workshop); if (workshop == null) { log.error("卷包数采系统没有匹配到MES中该设备所属车间!请在卷包数采 综合基础数据中维护 。该设备mes_code为" + MesEqpCode + " MES中该设备所属车间为:" + ele.elementTextTrim("AreaName")); PMSXmlDataInterceptor.getInstance().addLog(false, "设备主数据下发", 2, ele.asXML(), "卷包数采系统没有匹配到MES中该设备所属车间!请在卷包数采 综合基础数据中维护 。该设备mes_code为" + MesEqpCode + " MES中该设备所属车间为:" + ele.elementTextTrim("AreaName")); continue; } String eqpPosition = ele.elementTextTrim("EquipmentLocation");// 设备位置 if (eqpPosition == null) { log.error("设备位置不能为空。且唯一!错误数据设备mes_code为" + MesEqpCode); PMSXmlDataInterceptor.getInstance().addLog(false, "设备主数据下发", 2, ele.asXML(), "设备位置不能为空。且唯一!错误数据设备mes_code为" + MesEqpCode); continue; } String rateSpeed = ele.elementTextTrim("MachineryRspeed");// 额定车速 /*if (StringUtil.notNull(rateSpeed) && !StringUtil.isDouble(rateSpeed)) { log.error("额定车速必须为数字!错误数据设备mes_code为" + MesEqpCode); PMSXmlDataInterceptor.getInstance().addLog(false, "设备主数据下发", 2, ele.asXML(), "额定车速必须为数字!错误数据设备mes_code为" + MesEqpCode); continue; }*/ String rateSpeedUnit = ele.elementTextTrim("RspeedUnit");// 额定车速单位 rateSpeedUnit = rSpeedUnitMap.get(rateSpeedUnit); String yield = ele.elementTextTrim("MachineryRcapacity");// 额定产能 /*if (StringUtil.notNull(yield) && !StringUtil.isDouble(yield)) { log.error("额定产能必须为数字!错误数据设备mes_code为" + MesEqpCode); PMSXmlDataInterceptor.getInstance().addLog(false, "设备主数据下发", 2, ele.asXML(), "额定产能必须为数字!错误数据设备mes_code为" + MesEqpCode); continue; }*/ String yieldUnit = ele.elementTextTrim("RcapacityUnit");// 额定产能单位 yieldUnit = rCapacityUnit.get(yieldUnit); String enabled = ele.elementTextTrim("Enabled");// 是否启用 if (!StringUtil.notNull(enabled)) { log.error("是否启用状态不能为空!错误数据设备mes_code为" + MesEqpCode); PMSXmlDataInterceptor.getInstance().addLog(false, "设备主数据下发", 2, ele.asXML(), "是否启用状态不能为空!错误数据设备mes_code为" + MesEqpCode); continue; } if (enabled.equalsIgnoreCase("true")) { enabled = "1"; } else { enabled = enabled.equals("1")?"1":"0"; } String fixedAssetNum = ele.elementTextTrim("FixedCode");// 固定资产编号 /*if (!StringUtil.notNull(fixedAssetNum)) { log.error("固定资产编号不能为空!错误数据设备mes_code为" + MesEqpCode); PMSXmlDataInterceptor.getInstance().addLog(false, "设备主数据下发", 2, ele.asXML(), "固定资产编号不能为空!错误数据设备mes_code为" + MesEqpCode); continue; }*/ String manufacturingNum = ele.elementTextTrim("ManufactureNo");// 出厂编号 /*if (!StringUtil.notNull(manufacturingNum)) { log.error("出厂编号不能为空!错误数据设备mes_code为" + MesEqpCode); PMSXmlDataInterceptor.getInstance().addLog(false, "设备主数据下发", 2, ele.asXML(), "出厂编号不能为空!错误数据设备mes_code为" + MesEqpCode); continue; }*/ String approvalNum = ele.elementTextTrim("RegistrationCode");// 批准文号 String navicertNum = ele.elementTextTrim("NavicertNum");// 准运证编号 String usingDepartment = ele.elementTextTrim("System");// 使用部门 String fixedAssetDate = ele.elementTextTrim("FixedTime");// 入固时间 // yyyy-mm-dd Date fixedDate = DateUtil.formatStringToDate(fixedAssetDate, "yyyy-MM-dd"); if (fixedDate == null) { /*log.error("入固时间不能为空,且格式为yyyy-MM-dd!错误数据设备mes_code为" + MesEqpCode + " 错误时间为:" + ele.elementTextTrim("FixedAssetDate"));*/ fixedDate = new Date(); } //如果不存在则新增 if (equipment == null) { equipment = new MdEquipment(); } mdEqpType = new MdEqpType(machineType); mdWorkshop = new MdWorkshop(); mdWorkshop.setId(workshop); equipment.setMdEqpType(mdEqpType); equipment.setMdWorkshop(mdWorkshop); equipment.setEquipmentCode(eqpCode); equipment.setMesEqpCode(MesEqpCode); equipment.setWorkCenter(workCenter); equipment.setEquipmentName(eqpName); equipment.setEquipmentDesc(eqpDesc); equipment.setEquipmentPosition(eqpPosition); if (StringUtil.notNull(rateSpeed)) { equipment.setRatedSpeed(Double.valueOf(rateSpeed)); } equipment.setRateSpeedUnit(rateSpeedUnit); if (StringUtil.notNull(yield)) { equipment.setYieId(Double.valueOf(yield)); } equipment.setYieldUnit(yieldUnit); equipment.setEnabled(enabled); equipment.setFixedAssetNum(fixedAssetNum); equipment.setFixedAssetFlag("0"); equipment.setManufacturingNum(manufacturingNum); equipment.setApprovalNum(approvalNum); equipment.setNavicertNum(navicertNum); equipment.setCreateTime(fixedDate); equipment.setUsingDepartment(usingDepartment); equipment.setDel("0"); // eqps.add(equipment); equipmentsService.saveOrUpdateEqp(equipment); PMSXmlDataInterceptor.getInstance().addLog(false, "设备主数据下发", 1, ele.asXML()); } else { //辅助设备数据解析 // 根据设备编码或工段查询是否已经存在。已存在的不进行操作 appendEquipment = equipmentsService.getAppdependEqpByMESCodeOrWorkCenter(MesEqpCode); if (appendEquipment != null) { // 设备已经存在 // throw new Exception("该设备已经在卷包数采中存在!设备mes_code为" + MesEqpCode); System.out.println("更新MEScode设备:" + MesEqpCode); } String eqpName = ele.elementTextTrim("MachineryName");// 设备名称 String eqpDesc = ele.elementTextTrim("EquipmentLocationDes");// 设备描述 String eqpType = ele.elementTextTrim("MachineryLClass");// 设备类别 // 卷烟机、包装机 String machineType = ele.elementTextTrim("MachineryModel");// 机型 // ZJ17 String workshop = ele.elementTextTrim("AreaName");// 车间 workshop = workShopMap.get(workshop); if (workshop == null) { log.error("卷包数采系统没有匹配到MES中该设备所属车间!请在卷包数采 综合基础数据中维护 。该设备mes_code为" + MesEqpCode + " MES中该设备所属车间为:" + ele.elementTextTrim("AreaName")); PMSXmlDataInterceptor.getInstance().addLog(false, "设备主数据下发", 2, ele.asXML(), "卷包数采系统没有匹配到MES中该设备所属车间!请在卷包数采 综合基础数据中维护 。该设备mes_code为" + MesEqpCode + " MES中该设备所属车间为:" + ele.elementTextTrim("AreaName")); continue; } String eqpPosition = ele.elementTextTrim("EquipmentLocation");// 设备位置 if (eqpPosition == null) { log.error("设备位置不能为空。且唯一!错误数据设备mes_code为" + MesEqpCode); PMSXmlDataInterceptor.getInstance().addLog(false, "设备主数据下发", 2, ele.asXML(), "设备位置不能为空。且唯一!错误数据设备mes_code为" + MesEqpCode); continue; } String rateSpeed = ele.elementTextTrim("MachineryRspeed");// 额定车速 if (StringUtil.notNull(rateSpeed) && !StringUtil.isDouble(rateSpeed)) { log.error("额定车速必须为数字!错误数据设备mes_code为" + MesEqpCode); PMSXmlDataInterceptor.getInstance().addLog(false, "设备主数据下发", 2, ele.asXML(), "额定车速必须为数字!错误数据设备mes_code为" + MesEqpCode); continue; } String rateSpeedUnit = ele.elementTextTrim("RspeedUnit");// 额定车速单位 String yield = ele.elementTextTrim("MachineryRcapacity");// 额定产能 if (StringUtil.notNull(yield) && !StringUtil.isDouble(yield)) { log.error("额定产能必须为数字!错误数据设备mes_code为" + MesEqpCode); PMSXmlDataInterceptor.getInstance().addLog(false, "设备主数据下发", 2, ele.asXML(), "额定产能必须为数字!错误数据设备mes_code为" + MesEqpCode); continue; } String yieldUnit = ele.elementTextTrim("RcapacityUnit");// 额定产能单位 String enabled = ele.elementTextTrim("Enabled");// 是否启用 if (!StringUtil.notNull(enabled)) { log.error("是否启用状态不能为空!错误数据设备mes_code为" + MesEqpCode); PMSXmlDataInterceptor.getInstance().addLog(false, "设备主数据下发", 2, ele.asXML(), "是否启用状态不能为空!错误数据设备mes_code为" + MesEqpCode); continue; } /*if (enabled.equalsIgnoreCase("true")) { enabled = "1"; } else { enabled = "0"; }*/ String fixedAssetNum = ele.elementTextTrim("FixedCode");// 固定资产编号 if (!StringUtil.notNull(fixedAssetNum)) { log.error("固定资产编号不能为空!错误数据设备mes_code为" + MesEqpCode); PMSXmlDataInterceptor.getInstance().addLog(false, "设备主数据下发", 2, ele.asXML(), "固定资产编号不能为空!错误数据设备mes_code为" + MesEqpCode); continue; } String manufacturingNum = ele.elementTextTrim("ManufactureNo");// 出厂编号 if (!StringUtil.notNull(manufacturingNum)) { log.error("出厂编号不能为空!错误数据设备mes_code为" + MesEqpCode); PMSXmlDataInterceptor.getInstance().addLog(false, "设备主数据下发", 2, ele.asXML(), "出厂编号不能为空!错误数据设备mes_code为" + MesEqpCode); continue; } String approvalNum = ele.elementTextTrim("RegistrationCode");// 批准文号 String navicertNum = ele.elementTextTrim("NavicertNum");// 准运证编号 String usingDepartment = ele.elementTextTrim("System");// 使用部门 String fixedAssetDate = ele.elementTextTrim("FixedTime");// 入固时间 // yyyy-mm-dd Date fixedDate = DateUtil.formatStringToDate(fixedAssetDate, "yyyy-MM-dd"); if (fixedDate == null) { /*throw new Exception("入固时间不能为空,且格式为yyyy-MM-dd!错误数据设备mes_code为" + MesEqpCode + " 错误时间为:" + ele.elementTextTrim("FixedAssetDate"));*/ fixedDate = new Date(); } //如果不存在则新增 if (appendEquipment == null) { appendEquipment = new MdAppendEquipment(); } appendEquipment.setEqpType(eqpType); appendEquipment.setMdEqpType(machineType); appendEquipment.setMdWorkshop(workshop); appendEquipment.setEquipmentCode(null); appendEquipment.setMesEqpCode(MesEqpCode); appendEquipment.setWorkCenter(workCenter); appendEquipment.setEquipmentName(eqpName); appendEquipment.setEquipmentDesc(eqpDesc); appendEquipment.setEquipmentPosition(eqpPosition); if (StringUtil.notNull(rateSpeed)) { appendEquipment.setRatedSpeed(Double.valueOf(rateSpeed)); } appendEquipment.setRateSpeedUnit(rateSpeedUnit); if (StringUtil.notNull(yield)) { appendEquipment.setYieId(Double.valueOf(yield)); } appendEquipment.setYieldUnit(yieldUnit); appendEquipment.setEnabled(enabled); appendEquipment.setFixedAssetNum(fixedAssetNum); appendEquipment.setFixedAssetFlag("0"); appendEquipment.setManufacturingNum(manufacturingNum); appendEquipment.setApprovalNum(approvalNum); appendEquipment.setNavicertNum(navicertNum); appendEquipment.setCreateTime(fixedDate); appendEquipment.setUsingDepartment(usingDepartment); appendEquipment.setDel("0"); equipmentsService.saveOrUpdateAppendEqp(appendEquipment); //PMSXmlDataInterceptor.getInstance().addLog(false, "设备主数据下发", 1, ele.asXML()); success ++; } } PMSXmlDataInterceptor.getInstance().addLog(false,"设备主数据下发", 1, fstr,"共下发" + list.size()+"条,保存成功:" + success + "条"); loadComboboxService.initCombobox(ComboboxType.ALL); } catch (Exception e) { /** 日志 0-失败 */ PMSXmlDataInterceptor.getInstance().addLog(false, "设备主数据下发", 2, fstr, "REEOR:设备主数据下发接口解析失败..." + ftype + ":" + fstr); System.out.println("REEOR:设备主数据下发接口解析失败..." + ftype + ":" + fstr); e.printStackTrace(); } } /** * @param ftype fstr fdoc * @return * @throws Exception * @Title: MESSendRSpeedUnitToDAS * @Description: 解析并保存额定产能单位标识代码 * @author baoshiwei * @date 2019年5月6日 */ public void alalyMESSendRCapacityUnitToDAS(String ftype, String fstr, Document fdoc) { try { List list = fdoc.selectNodes("dataset/data"); MdFixCode fixCode = null; FixCodeBean bean = null; if (list == null || list.size() < 1) { log.error("XML数据中不包含额定产能单位信息!请核对xml数据!"); PMSXmlDataInterceptor.getInstance().addLog(false, "额定产能单位下发", 2, fstr, "XML数据中不包含额定产能单位信息!请核对xml数据!"); return; } Iterator fixCodes = list.iterator(); while (fixCodes.hasNext()) { Element ele = (Element) fixCodes.next(); try { String code = ele.elementTextTrim("RCapacityUnitCode");// 设备编号 String name = ele.elementTextTrim("RCapacityUnitName");// 工序段 fixCode = new MdFixCode(); fixCode.setMesCode(code); fixCode.setUpcode("RCapacityUnit"); // 添加上级代码 fixCode.setDes(name); fixCode.setDel("0"); bean = BeanConvertor.copyProperties(fixCode, FixCodeBean.class); fixCodeService.saveFixCode(fixCode, bean); PMSXmlDataInterceptor.getInstance().addLog(false, "额定产能单位下发", 1, ele.asXML()); } catch (Exception e) { PMSXmlDataInterceptor.getInstance().addLog(false, "额定产能单位下发", 2, ele.asXML(), e.getMessage()); System.out.println("REEOR:额定产能单位下发接口解析失败..." + ftype + ":" + ele.asXML()); e.printStackTrace(); } } } catch (Exception e) { /** 日志 0-失败 */ PMSXmlDataInterceptor.getInstance().addLog(false, "额定产能单位下发", 2, fstr, e.getMessage()); log.error("REEOR:额定产能单位下发接口解析失败..." + ftype + ":" + fstr); e.printStackTrace(); } } /** * @param ftype fstr fdoc * @return * @Title: MESSendRSpeedUnitToDAS * @Description: 解析保存额定车速标识代码 * @author baoshiwei * @date 2019年5月6日 */ public void alalyMESSendRSpeedUnitToDAS(String ftype, String fstr, Document fdoc) { try { List list = fdoc.selectNodes("dataset/data"); MdFixCode fixCode = null; FixCodeBean bean = null; if (list == null || list.size() < 1) { log.error("XML数据中不包含额定车速单位信息!请核对xml数据!"); PMSXmlDataInterceptor.getInstance().addLog(false, "额定车速单位下发", 2, fstr, "XML数据中不包含额定车速单位信息!请核对xml数据!"); return; } Iterator fixCodes = list.iterator(); while (fixCodes.hasNext()) { Element ele = (Element) fixCodes.next(); try { String code = ele.elementTextTrim("RSpeedUnitCode");// 设备编号 String name = ele.elementTextTrim("RSpeedUnitName");// 工序段 fixCode = new MdFixCode(); fixCode.setMesCode(code); fixCode.setUpcode("RSpeedUnit"); // 添加上级代码 fixCode.setDes(name); fixCode.setDel("0"); bean = BeanConvertor.copyProperties(fixCode, FixCodeBean.class); fixCodeService.saveFixCode(fixCode, bean); PMSXmlDataInterceptor.getInstance().addLog(false, "额定车速单位下发", 1, ele.asXML()); } catch (Exception e) { PMSXmlDataInterceptor.getInstance().addLog(false, "额定车速单位下发", 2, ele.asXML(), e.getMessage()); System.out.println("REEOR:额定车速单位下发接口解析失败..." + ftype + ":" + ele.asXML()); e.printStackTrace(); } } //PMSXmlDataInterceptor.getInstance().addLog(false,"额定车速单位下发", 1, fstr); } catch (Exception e) { /** 日志 0-失败 */ PMSXmlDataInterceptor.getInstance().addLog(false, "额定车速单位下发", 2, fstr, e.getMessage()); System.out.println("REEOR:额定车速单位下发接口解析失败..." + ftype + ":" + fstr); e.printStackTrace(); } } /** * @param ftype * @param fstr * @param fdoc * @Title: addMesSendEquipmentWorkOrder * @Description: 设备保养工单接口,解析xml,保存数据 * @author baoshiwei * @date 2019年5月7日 */ public void addMesSendEquipmentWorkOrder(String ftype, String fstr, Document fdoc) { try { List info = fdoc.selectNodes("dataset/data"); int success = 0; for (Element lt : info) { EqmWheelCovelPlanInfo ecp = new EqmWheelCovelPlanInfo(); String EMWorkOrderCode = lt.elementTextTrim("EMWorkOrderCode"); // 设备保养工单号 ecp.setEqp_work_order_code(EMWorkOrderCode); String PlanDate = lt.elementTextTrim("PlanDate"); //计划日期 ecp.setPlan_date(DateUtil.formatStringToDate(PlanDate, "yyyy-MM-dd")); String PlanStartTime = lt.elementTextTrim("PlanStartTime"); //计划起始时间 ecp.setPlan_stime(DateUtil.formatStringToDate(PlanStartTime, "yyyy-MM-dd HH:mm:ss")); String Duration = lt.elementTextTrim("Duration"); //计划维护时长 ecp.setPlan_times(Duration); String Shift = lt.elementTextTrim("Shift"); //班次 ecp.setShift_id(Shift);//1. 早班 2.中班 3.晚班 0 常日班 if ("0".equals(Shift)) { ecp.setShift_name("常日班"); } else if ("1".equals(Shift)) { ecp.setShift_name("早班"); } else if ("2".equals(Shift)) { ecp.setShift_name("中班"); } else if ("3".equals(Shift)) { ecp.setShift_name("晚班"); } String Planner = lt.elementTextTrim("Planner"); //制单人 ecp.setPlan_name(Planner); String Equipmentcode = lt.elementTextTrim("Equipmentcode"); //设备编号 EquipmentsBean fcb = SysEqpTypeBase.getEquipmentByMesCodeToId(Equipmentcode, true); if (fcb == null) { PMSXmlDataInterceptor.getInstance().addLog(false, "设备保养计划下发", 2, lt.asXML(), "设备号转换失败!!!"); continue; } ecp.setEqp_id(fcb.getId()); ecp.setEqp_name(fcb.getName()); String MaintainaceType = lt.elementTextTrim("MaintainaceType"); //保养类别 ecp.setType(MaintainaceType); //1. 轮保 2 润滑 3 停产检修 4 点检 String LocationCode = lt.elementTextTrim("LocationCode"); //车间代码 FixCodeBean bean = SysEqpTypeBase.getFixCodeByMesCode(LocationCode,"WORKSHOP0001",true); if (bean == null){ PMSXmlDataInterceptor.getInstance().addLog(false, "设备保养计划下发", 2, lt.asXML(), "车间转换失败!!"); continue; } ecp.setShop_code(bean.getCode()); //1.制丝 2.卷包 3 成型 4.动力 6.高架库queryMaintainPlan String CycleType = lt.elementTextTrim("CycleType"); //检验类型 ecp.setAttr1(CycleType);//1月检,2周检,3日检,4年 String CycleNum = lt.elementTextTrim("CycleNum"); //检验周期 ecp.setAttr2("1");//检验周期数 (1个月,3个月,6 个月 等) ecp.setDel(0); ecp.setSh_status(0); //保存主数据 eqmWheelCovelPlanService.saveByEqmWheelCovelPlanByObj(ecp); success ++; /** 日志 1-成功 */ //PMSXmlDataInterceptor.getInstance().addLog(false, "设备保养计划下发", 1, lt.asXML()); } PMSXmlDataInterceptor.getInstance().addLog(false,"设备保养计划下发", 1, fstr,"共下发" + info.size()+"条,保存成功:" + success + "条"); } catch (Exception e) { /** 日志 0-失败 */ PMSXmlDataInterceptor.getInstance().addLog(false, "设备保养计划下发", 2, fstr, e.getMessage()); log.error("REEOR:设备保养计划下发解析失败..." + ftype + ":" + fstr); } } /** * @param ftype * @param fstr * @param fdoc * @Title: addMesSendEquipmentRepairOrder * @Description: 解析保存mes下发维修呼叫工单号 * @author baoshiwei * @date 2019年5月8日 */ public void addMesSendEquipmentRepairOrder(String ftype, String fstr, Document fdoc) { try { EqpRequestRecord bean = new EqpRequestRecord(); List info = fdoc.selectNodes("dataset/data"); for (Element ele : info) { String id = StringUtil.convertObjToString(ele.elementTextTrim("FaultId")); bean = eqpRequestRecordServiceI.getById(id); bean.setOrderNo(StringUtil.convertObjToString(ele.elementTextTrim("EquipmentOrder"))); eqpRequestRecordServiceI.saveOrUpdate(bean); } PMSXmlDataInterceptor.getInstance().addLog(false,"设备维修工单下发", 1, fstr); } catch (Exception e) { /** 日志 0-失败 */ PMSXmlDataInterceptor.getInstance().addLog(false, "设备维修工单下发", 2, fstr, e.getMessage()); e.printStackTrace(); log.error("REEOR:设备维修工单下发解析失败..." + ftype + ":" + fstr); } } /** * @return void * @Author bsw * @Description //TODO 解析保存mes下发单位数据 * @Date 2019-05-10 10:59 * @Param [ftype, fstr, fdoc] **/ public void addMesSendUnit(String ftype, String fstr, Document fdoc) { try { List info = fdoc.selectNodes("dataset/data"); int success = 0; for (Element lt : info) { UnitBean unit = new UnitBean(); String code = lt.elementTextTrim("Code"); // 编码 unit.setCode(code); String name = lt.elementTextTrim("Name"); // 名称 unit.setName(name); String notation = lt.elementTextTrim("Notation"); // 单位符号 unit.setMesCode(notation); unit.setType("1"); unit.setEnable(1L); //保存主数据 List mdunit = unitServiceI.getUnitByParams(unit); if (mdunit != null && mdunit.size() > 0) { unit.setId(mdunit.get(0).getId()); unitServiceI.iEditUnit(unit); } else { unitServiceI.addUnit(unit); } /** 日志 1-成功 */ //PMSXmlDataInterceptor.getInstance().addLog(false, "计量单位主数据下发", 1, lt.asXML()); success ++; } PMSXmlDataInterceptor.getInstance().addLog(false,"计量单位主数据下发", 1, fstr,"共下发" + info.size()+"条,保存成功:" + success + "条"); loadComboboxService.initCombobox(ComboboxType.ALL); } catch (Exception e) { /** 日志 0-失败 */ PMSXmlDataInterceptor.getInstance().addLog(false, "计量单位主数据下发", 2, fstr, e.getMessage()); e.printStackTrace(); log.error("REEOR:计量单位主数据下发解析失败..." + ftype + ":" + fstr); } } /** * @return void * @Author bsw * @Description //TODO 解析保存MES下发外观缺陷定义数据 * @Date 2019-05-13 08:54 * @Param [ftype, fstr, fdoc] **/ public void alalyMESSendFaultDefinition(String ftype, String fstr, Document doc) { try { // 获取格式如[{FaultName=吸阻大,FaultLevel=A,FaultType=C,FaultCode=XZD001D,FaultDesc=吸阻超标,FaultMinusScore=1.0},{...}]的字符串 List list = doc.selectNodes("dataset/data"); if (list != null && list.size() > 0) { Map ft = Mes2DASParams.MES2DASCode("OUTWARDTYPE"); List qmOutwardDefectItems = new ArrayList<>(); QmOutwardDefectItem qmOutwardDefectItem = null; int success = 0; for (Iterator faultItem = list.iterator(); faultItem.hasNext(); ) { qmOutwardDefectItem = new QmOutwardDefectItem(); Element e = (Element) faultItem.next(); String faultType = e.elementTextTrim("FaultType");//缺陷类型 X - 箱装 T - 条盒 B - 小盒 C - 烟支 F - 滤棒 QMOUTWAND if (!StringUtil.notEmpty(faultType)) { PMSXmlDataInterceptor.getInstance().addLog(false, "卷包成型外观缺陷定义缺陷类型不能为空!", 2, e.asXML()); continue; } faultType = ft.get(faultType)==null?faultType:ft.get(faultType); qmOutwardDefectItem.setType(faultType); String parameterCode = e.elementTextTrim("ParameterCode");//工艺参数代码 if (!StringUtil.notEmpty(parameterCode)) { PMSXmlDataInterceptor.getInstance().addLog(false, "卷包成型外观缺陷定义工艺参数代码不能为空!", 2, e.asXML()); continue; } qmOutwardDefectItem.setParameterCode(parameterCode); String position = e.elementTextTrim("Position");//缺陷部位 qmOutwardDefectItem.setPos(position); String faultName = e.elementTextTrim("FaultName");//缺陷名称 if (!StringUtil.notEmpty(faultName)) { PMSXmlDataInterceptor.getInstance().addLog(false, "卷包成型外观缺陷定义缺陷名称不能为空!", 2, e.asXML()); continue; } qmOutwardDefectItem.setName(faultName); String faultCode = e.elementTextTrim("FaultCode");//缺陷代码 if (!StringUtil.notEmpty(faultCode)) { PMSXmlDataInterceptor.getInstance().addLog(false, "卷包成型外观缺陷定义缺陷代码不能为空!", 2, e.asXML()); continue; } qmOutwardDefectItem.setCode(faultCode); String faultDesc = e.elementTextTrim("FaultDesc");//缺陷说明 qmOutwardDefectItem.setDes(faultDesc); String faultLevel = e.elementTextTrim("FaultLevel");//缺陷等级 if (!StringUtil.notEmpty(faultLevel)) { PMSXmlDataInterceptor.getInstance().addLog(false, "卷包成型外观缺陷定义缺陷等级不能为空!", 2, e.asXML()); continue; } qmOutwardDefectItem.setLvl(faultLevel); String minusScore = e.elementTextTrim("MinusScore");//单位扣分值 if (!StringUtil.isFloat(minusScore)) { PMSXmlDataInterceptor.getInstance().addLog(false, "卷包成型外观缺陷定义单位扣分值不能为空 且必须为数字!当前值为:" + minusScore, 2, e.asXML()); continue; } qmOutwardDefectItem.setMinusScore(Float.valueOf(minusScore)); qmOutwardDefectItem.setDel(0L); QmOutwardDefectItem qf = outInspectionService.findByCode(qmOutwardDefectItem.getCode()); //判断是否已经存在 if (qf != null) { qmOutwardDefectItem.setId(qf.getId()); outInspectionService.saveOrUpdate(qmOutwardDefectItem); // 成功日志 PMSXmlDataInterceptor.getInstance().addLog(false, "卷包成型外观缺陷定义更新!更新的缺陷代码为:" + qmOutwardDefectItem.getCode(), 1, e.asXML()); // PMSXmlDataInterceptor.getInstance().addLog(false,"卷包成型外观缺陷定义数据已存在!已存在的缺陷代码为:"+qmOutwardDefectItem.getCode(), 2, fstr); continue; } qmOutwardDefectItems.add(qmOutwardDefectItem); success ++; } outInspectionService.saveOutInspections(qmOutwardDefectItems); // 成功日志 PMSXmlDataInterceptor.getInstance().addLog(false, "卷包成型外观缺陷定义下发", 1, fstr,"共下发" + list.size()+"条,保存成功:" + success + "条"); } else { PMSXmlDataInterceptor.getInstance().addLog(false, "MES发送给卷包数采集的成型外观缺陷定义数据为空!", 2, fstr); } } catch (Exception e) { /** 日志 0-失败 */ PMSXmlDataInterceptor.getInstance().addLog(false, "卷包成型外观缺陷定义下发", 2, fstr, e.getMessage()); log.info("REEOR:卷包成型外观缺陷定义下发接口解析失败..." + ftype + ":" + fstr); e.printStackTrace(); } } /** * @Author bsw * @Description //TODO mes 下发工单撤销确认接口 * @Date 2019-05-13 10:18 * @Param [ftype, fstr, fdoc] * @return void **/ public void alalyMESSendOrderCancelConfirmToDAS(String ftype, String fstr, Document doc) { try { List list = doc.selectNodes("dataset/data"); if (list.size() < 1) { throw new Exception("工单撤销请求数据为空!"); } Iterator iterator = list.iterator(); while (iterator.hasNext()) { Element ele = (Element) iterator.next(); String workCode = ele.elementTextTrim("WorkOrderCode");// 工单号 if (!StringUtil.notEmpty(workCode)) { PMSXmlDataInterceptor.getInstance().addLog(false, "撤销请求的工单号不能为空!", 2, fstr); continue; } String command = ele.elementTextTrim("Command");// 状态 10,确认撤销 if (!StringUtil.notEmpty(command)) { PMSXmlDataInterceptor.getInstance().addLog(false, "撤销结果的状态不能为空!", 2, fstr); continue; } if (!StringUtil.isInteger(command)) { PMSXmlDataInterceptor.getInstance().addLog(false, "撤销结果的状态必须是数字且为10!", 2, fstr); continue; } // 查询该工单是否为 待撤销状态 String workOrderId = workOrderService.CancelRequestWorkOrderByCode(workCode, false); if (workOrderId != null) { // 修改工单状态 if (Integer.valueOf(command) == 10) { // 确认,修改工单状态为8,撤销状态 // workOrderService.MESRequestCancelWorkOrder(workOrderId,8L); // 确认撤销则删除该工单相关信息。 workOrderService.deleteOrderByCode(workOrderId); PMSXmlDataInterceptor.getInstance().addLog(false,"工单撤销删除工单", 1, ele.asXML()); } else if (Integer.valueOf(command) == 14) { // 确认,修改工单状态为1,下发状态 workOrderService.MESRequestCancelWorkOrder(workOrderId, 1L); PMSXmlDataInterceptor.getInstance().addLog(false,"工单撤销取消", 1, ele.asXML()); } } } //PMSXmlDataInterceptor.getInstance().addLog(false,"工单撤销结果下发", 1, fstr); } catch (Exception e) { /** 日志 0-失败 */ PMSXmlDataInterceptor.getInstance().addLog(false,"工单撤销结果下发", 2, fstr, e.getMessage()); System.out.println("REEOR:工单撤销结果下发接口解析失败..." + ftype + ":" + fstr); e.printStackTrace(); } } /** * @Title: alalyMESSendParameterSetToDAS * @Description: 解析保存mes下发工艺标准 * @author baoshiwei * @date 2019年5月14日 * @param ftype * @param fstr * @param fdoc */ public String alalyMESSendParameterSetToDAS(String ftype, String fstr, Document fdoc) { try { // 判断物料是否存在 // 获取物料code 和id map集合 Map matMap = matService.getAllMatMapCx(); Map unitMap = Mes2DASParams.MES2DASUnit(); // 获取MaterialItem节点 List list = fdoc.selectNodes("dataset/data"); Iterator datas = list.iterator(); SchWorkorderCraft schWorkorderCraft = null; int success = 0; while (datas.hasNext()) { Element ele = (Element) datas.next(); String materialCode = ele.elementTextTrim("MaterialCode");// 牌号 String[] mats=matMap.get(materialCode); if (mats == null) { throw new Exception("工艺标准解析该物料(牌号)编码不存在!请核对物料数据。不存在的物料编码是:" + materialCode); } String matId=mats[0]; String parameterSetRevision = ele.elementTextTrim("ParameterSetRevision");// 版本号 if (!StringUtil.notEmpty(parameterSetRevision)) { throw new Exception("工艺标准解析该版本号不能为空!请核对xml数据。该物料编码是:" + materialCode); } String effectTime = ele.elementTextTrim("EffectTime");// 生效日期 if (!StringUtil.notEmpty(effectTime)) { throw new Exception("工艺标准解析该生效日期不能为空!请核对xml数据。该物料编码是:" + materialCode); } Date effectDate = DateUtil.formatStringToDate(effectTime, "yyyy-MM-dd"); if (effectDate == null) { throw new Exception("工艺标准解析该生效日期格式错误!支持的日期格式为 yyyy-MM-dd请核对xml数据。该物料编码是:" + materialCode); } //String effectRemark = ele.elementTextTrim("EffectRemark");// 生效备注 // 详细项 List peles = ele.elements("item"); craftServiceI.deleteByCraft(parameterSetRevision,materialCode); if (peles != null && peles.size() > 0) { for (Element element : peles) { String parameterCode = element.elementTextTrim("ParameterCode");// 工艺参数代码 if (!StringUtil.notEmpty(parameterCode)) { throw new Exception("工艺标准解析该工艺参数代码不能为空!请核对xml数据。该物料编码是:" + materialCode); } schWorkorderCraft=craftServiceI.queryByMatAndCode(matId, parameterCode); if(schWorkorderCraft==null){ schWorkorderCraft = new SchWorkorderCraft(); } String dcsType = element.elementTextTrim("DCSType");// DCS类型--cp:成品 cxcp:成型成品 rol:卷接 if (!StringUtil.notEmpty(dcsType)) { throw new Exception("工艺标准解析Dcs类型不能为空!请核对xml数据。该物料编码是:" + materialCode); } schWorkorderCraft.setDcsType(dcsType); schWorkorderCraft.setMaterialCode(matId); schWorkorderCraft.setParameterSetRevision(parameterSetRevision); schWorkorderCraft.setEffectTime(effectDate); //schWorkorderCraft.setEffectRemark(effectRemark); schWorkorderCraft.setParameterCode(parameterCode); schWorkorderCraft.setOrdCode(SysEqpTypeBase.getZJCJType(parameterCode)); // schWorkorderCraft.setMaterialCode(materialCode); String parameterName = element.elementTextTrim("ParameterName");// 工艺参数名称 if (!StringUtil.notEmpty(parameterName)) { throw new Exception("工艺标准解析该工艺参数名称不能为空!请核对xml数据。该物料编码是:" + materialCode); } schWorkorderCraft.setParameterName(parameterName); String isPCP = element.elementTextTrim("IsPCP");// 是否过程控制参数 if (StringUtil.notEmpty(isPCP)) { if (isPCP.equals("true")) { isPCP = "0"; } else { isPCP = "1"; } schWorkorderCraft.setPcp(Long.valueOf(isPCP)); } String isQC = element.elementTextTrim("IsQC");// 是否检验项目 if (StringUtil.notEmpty(isQC)) { if (isQC.equals("true")) { isQC = "0"; } else { isQC = "1"; } schWorkorderCraft.setQc(Long.valueOf(isQC)); } String pValue = element.elementTextTrim("PValue");// 置信水平下限(P值) if (StringUtil.notEmpty(pValue)) { if (StringUtil.isDouble(pValue)) { schWorkorderCraft.setPval(Double.valueOf(pValue)); } else { throw new Exception("工艺标准解析该工艺参数置信水平下限(P值)不是数字!请核对xml数据。该物料编码是:" + materialCode); } } String zValue = element.elementTextTrim("ZValue");// Z值 if (StringUtil.notEmpty(zValue)) { if (StringUtil.isDouble(zValue)) { schWorkorderCraft.setZval(Double.valueOf(zValue)); } else { throw new Exception("工艺标准解析该工艺参数Z值不是数字!请核对xml数据。该物料编码是:" + materialCode); } } String cPKValue = element.elementTextTrim("CPKValue");// CPK值 if (StringUtil.notEmpty(cPKValue)) { if (StringUtil.isDouble(cPKValue)) { schWorkorderCraft.setCpk(Double.valueOf(cPKValue)); } else { throw new Exception("工艺标准解析该工艺参数CPK值不是数字!请核对xml数据。该物料编码是:" + materialCode); } } String cPValue = element.elementTextTrim("CPValue");// CP值 if (StringUtil.notEmpty(cPValue)) { if (StringUtil.isDouble(cPValue)) { schWorkorderCraft.setCp(Double.valueOf(cPValue)); } else { throw new Exception("工艺标准解析该工艺参数CP值不是数字!请核对xml数据。该物料编码是:" + materialCode); } } String pPValue = element.elementTextTrim("PPValue");// PP值 if (StringUtil.notEmpty(pPValue)) { if (StringUtil.isDouble(pPValue)) { schWorkorderCraft.setPp(Double.valueOf(pPValue)); } else { throw new Exception("工艺标准解析该工艺参数PP值不是数字!请核对xml数据。该物料编码是:" + materialCode); } } String pPKValue = element.elementTextTrim("PPKValue");// PPK值 if (StringUtil.notEmpty(pPKValue)) { if (StringUtil.isDouble(pPKValue)) { schWorkorderCraft.setPpk(Double.valueOf(pPKValue)); } else { throw new Exception("工艺标准解析该工艺参数PPK值不是数字!请核对xml数据。该物料编码是:" + materialCode); } } String pPMValue = element.elementTextTrim("PPMValue");// PPM值 if (StringUtil.notEmpty(pPMValue)) { if (StringUtil.isDouble(pPMValue)) { schWorkorderCraft.setPpm(Double.valueOf(pPMValue)); } else { throw new Exception("工艺标准解析该工艺参数PPM值不是数字!请核对xml数据。该物料编码是:" + materialCode); } } String standardValue = element.elementTextTrim("StandardValue");// 标准值 if (StringUtil.notEmpty(standardValue)) { if (StringUtil.isDouble(standardValue)) { schWorkorderCraft.setStd(Double.valueOf(standardValue)); } else { throw new Exception("工艺标准解析该工艺参数标准值不是数字!请核对xml数据。该物料编码是:" + materialCode); } } else { throw new Exception("工艺标准解析该工艺参数标准值不能为空!请核对xml数据。该物料编码是:" + materialCode); } String upperValue = element.elementTextTrim("UpperValue");// 标准值允差上限 if (StringUtil.notEmpty(upperValue)) { if (StringUtil.isDouble(upperValue)) { schWorkorderCraft.setUval(Double.valueOf(upperValue)); } else { throw new Exception("工艺标准解析该工艺参数标准值允差上限不是数字!请核对xml数据。该物料编码是:" + materialCode); } } else { throw new Exception("工艺标准解析该工艺参数标准值允差上限不能为空!请核对xml数据。该物料编码是:" + materialCode); } String lowerValue = element.elementTextTrim("LowerValue");// 标准值允差下限 if (StringUtil.notEmpty(lowerValue)) { if (StringUtil.isDouble(lowerValue)) { schWorkorderCraft.setLval(Double.valueOf(lowerValue)); } else { throw new Exception("工艺标准解析该工艺参数标准值允差下限不是数字!请核对xml数据。该物料编码是:" + materialCode); } } else { throw new Exception("工艺标准解析该工艺参数标准值允差下限不能为空!请核对xml数据。该物料编码是:" + materialCode); } String controlUpperValue = element.elementTextTrim("ControlUpperValue");// 控制线上限 if (StringUtil.notEmpty(controlUpperValue)) { if (StringUtil.isDouble(controlUpperValue)) { schWorkorderCraft.setCuval(Double.valueOf(controlUpperValue)); } else { throw new Exception("工艺标准解析该工艺参数控制线上限值不是数字!请核对xml数据。该物料编码是:" + materialCode); } } String controlLowerValue = element.elementTextTrim("ControlLowerValue");// 控制线下限 if (StringUtil.notEmpty(controlLowerValue)) { if (StringUtil.isDouble(controlLowerValue)) { schWorkorderCraft.setClval(Double.valueOf(controlLowerValue)); } else { throw new Exception("工艺标准解析该工艺参数控制线下限值不是数字!请核对xml数据。该物料编码是:" + materialCode); } } String warningUpperValue = element.elementTextTrim("WarningUpperValue");// 警戒线上限 if (StringUtil.notEmpty(warningUpperValue)) { if (StringUtil.isDouble(warningUpperValue)) { schWorkorderCraft.setWuval(Double.valueOf(warningUpperValue)); } else { throw new Exception("工艺标准解析该工艺参数警戒线上限不是数字!请核对xml数据。该物料编码是:" + materialCode); } } String warningLowerValue = element.elementTextTrim("WarningLowerValue");// 警戒线下限 if (StringUtil.notEmpty(warningLowerValue)) { if (StringUtil.isDouble(warningLowerValue)) { schWorkorderCraft.setWlval(Double.valueOf(warningLowerValue)); } else { throw new Exception("工艺标准解析该工艺参数警戒线下限不是数字!请核对xml数据。该物料编码是:" + materialCode); } } String uom = element.elementTextTrim("UOM");// 单位 uom = unitMap.get(uom); if (uom == null) { throw new Exception("卷包数采没有匹配到该单位编号!请在卷包数采 综合基础数据维护中 核对 该物料编码是:" + materialCode + "无法匹配到的单位为:" + element.elementTextTrim("UOM")); } String isDetermine = element.elementTextTrim("IsDetermine");// 是否需要判定不合格 if (StringUtil.notEmpty(isDetermine)) { if (isDetermine.equals("true")) { isDetermine = "0"; } else { isDetermine = "1"; } schWorkorderCraft.setDtm(Long.valueOf(isDetermine)); } String determineLowerValue = element.elementTextTrim("DetermineLowerValue");// 不合格下限 if (StringUtil.notEmpty(determineLowerValue)) { if (StringUtil.isDouble(determineLowerValue)) { schWorkorderCraft.setDtmuval(Double.valueOf(determineLowerValue)); } else { throw new Exception("工艺标准解析该工艺参数不合格下限不是数字!请核对xml数据。该物料编码是:" + materialCode); } } String determineUppderValue = element.elementTextTrim("DetermineUppderValue");// 不合格上限 if (StringUtil.notEmpty(determineUppderValue)) { if (StringUtil.isDouble(determineUppderValue)) { schWorkorderCraft.setDtmlval(Double.valueOf(determineUppderValue)); } else { throw new Exception("工艺标准解析该工艺参数不合格上限不是数字!请核对xml数据。该物料编码是:" + materialCode); } } /*String parameterType = element.elementTextTrim("ParameterType");// 计数类型 if (StringUtil.notEmpty(parameterType)) { if (StringUtil.isInteger(parameterType)) { schWorkorderCraft.setParamType(Long.valueOf(parameterType)); } else { throw new Exception("工艺标准解析该工艺参数计数类型不是整数!请核对xml数据。该物料编码是:" + materialCode); } }*/ String parameterType = element.elementTextTrim("ParameterType");// 计数类型 if (StringUtil.notEmpty(parameterType)) { if (StringUtil.isInteger(parameterType)) { schWorkorderCraft.setParamType(Long.parseLong(parameterType)); } else { throw new Exception("工艺标准解析该工艺参数计数类型格式错误!请核对xml数据。该物料编码是:" + materialCode); } } //删除相同牌号+版本号的工艺标准 schWorkorderCraft.setEffectRemark(parameterSetRevision+materialCode); //保存新的工艺标准 craftServiceI.saveOrUpdateCraft(schWorkorderCraft); } } success ++; } /** 日志 1-成功 */ PMSXmlDataInterceptor.getInstance().addLog(false,"工艺标准下发", 1, fstr,"共下发" + list.size()+"条,保存成功:" + success + "条"); //反馈 Document document=DocumentHelper.createDocument(); Element root=document.addElement("dataset"); Element body=root.addElement("data"); Element result=body.addElement("Result"); result.addText("1"); Element receiveTime=body.addElement("ReceiveTime"); receiveTime.addText(DateUtil.formatDateToString(new Date())); return document.asXML(); } catch (Exception e) { /** 日志 2-失败 */ PMSXmlDataInterceptor.getInstance().addLog(false,"工艺标准下发", 2, fstr, e.getMessage()); System.out.println("REEOR:工艺标准接口解析失败..." + ftype + ":" + fstr); e.printStackTrace(); //PMSXmlDataInterceptor.getInstance().addLog(false,"工艺标准下发", 1, fstr); Document document=DocumentHelper.createDocument(); Element root=document.addElement("dataset"); Element body=root.addElement("data"); Element result=body.addElement("Result"); result.addText("2"); Element reason=body.addElement("Reason"); reason.addText(e.getMessage()); Element receiveTime=body.addElement("ReceiveTime"); receiveTime.addText(DateUtil.formatDateToString(new Date())); return document.asXML(); } } /** * @Title: alalyMESSendShiftsToDAS * @Description: 解析并保存mes下发排班计划 * @author baoshiwei * @date 2019年5月14日 * @param ftype * @param fstr * @param fdoc */ public void alalyMESSendShiftsToDAS(String ftype, String fstr, Document fdoc) { try { List calendarsEle = fdoc.selectNodes("dataset/data" ); if(calendarsEle==null || calendarsEle.size() <=0){ throw new Exception("MES发送给卷包数采的排班信息为空 !"); } //存放日历bean List calendars=new ArrayList(); //数据转换MAP Map workshopMap=Mes2DASParams.MES2DASWorkShop(); Map shiftMap=Mes2DASParams.MES2DASShift(); Map teamMap=Mes2DASParams.MES2DASTeam(); SchCalendar calendar=null; MdShift shift=null;//班组 MdTeam team=null;//班次 MdWorkshop workshop=null;//车间 Date date=null;//生产日期 Date sTime=null;//开始时间 Date eTime=null;//结束时间 for (Iterator cale=calendarsEle.iterator();cale.hasNext();) { calendar=new SchCalendar(); Element e = (Element) cale.next(); String endTime = e.elementTextTrim("EndTime"); eTime=DateUtil.formatStringToDate(endTime); if(eTime==null){ throw new Exception("结束时间格式错误!要求数据格式 yyyy-MM-dd HH:mm:ss 异常数据:"+endTime); } String pdate = e.elementTextTrim("PlanDate"); date=DateUtil.formatStringToDate(pdate,"yyyy-MM-dd"); if(date==null){ throw new Exception("生产日期格式错误!要求数据格式 yyyy-MM-dd 异常数据:"+pdate); } String stime = e.elementTextTrim("StartTime"); sTime=DateUtil.formatStringToDate(stime); if(sTime==null){ throw new Exception("开始时间格式错误!要求数据格式 yyyy-MM-dd HH:mm:ss 异常数据:"+stime); } String group = e.elementTextTrim("ShiftGroup"); if(StringUtil.isInteger(group)){ //需要转换 group=teamMap.get(group); if(group==null){ throw new Exception("数采系统没有匹配到MES对应的班组,请在卷包数采 综合基础数据维护中维护! 异常数据:"+e.elementTextTrim("Group")); } team=new MdTeam(group); } String shiftId =e.elementTextTrim("Shift"); if(StringUtil.isInteger(shiftId)){ //需要转换 shiftId=shiftMap.get(shiftId); if(shiftId==null){ throw new Exception("数采系统没有匹配到MES对应的班次,请在卷包数采 综合基础数据维护中维护! 异常数据:"+e.elementTextTrim("Shift")); } shift=new MdShift(shiftId); } String shopId = e.elementTextTrim("LocationCode"); //需要转换 workshop=new MdWorkshop(); shopId=workshopMap.get(shopId); if(shopId==null){ throw new Exception("数采系统没有匹配到MES对应的车间!请在卷包数采 综合基础数据维护中维护! 异常数据:"+e.elementTextTrim("LocationCode")); } //需要转换 workshop.setId(shopId); calendar=new SchCalendar(team, shift, workshop, date, sTime, eTime, 0L); calendars.add(calendar); } //从小到大排序 时间排序 Collections.sort(calendars, new Comparator(){ @Override public int compare(SchCalendar o1, SchCalendar o2) { if(o1.getDate().getTime()-o2.getDate().getTime()>=0){ return 1;//1 从小到大 -1 从大到小 }else{ return -1; } } }); //删除时间段内的日历 workOrderService.deleteCalendar(calendars.get(0),calendars.get(calendars.size()-1)); workOrderService.batchInsertAndReturn(calendars); //**日志 1-成功*// PMSXmlDataInterceptor.getInstance().addLog(false,"排班计划下发",1,fstr); }catch(Exception e){ /** 日志 2-失败 */ PMSXmlDataInterceptor.getInstance().addLog(false,"排班计划下发", 2, fstr, e.getMessage()); System.out.println("REEOR:排班计划接口解析失败..." + ftype + ":" + fstr); e.printStackTrace(); } } /** * @Title: alalyMESSendTestResultToDAS * @Description: 解析保存卷包批次检验结果判定 * @author baoshiwei * @date 2019年5月14日 * @param ftype * @param fstr * @param fdoc */ public void alalyMESSendTestResultToDAS(String ftype, String fstr, Document fdoc) { try { List info = fdoc.selectNodes("dataset/data"); for (Element lt : info) { String materialCode = lt.elementTextTrim("MaterialCode"); String batchCode = lt.elementTextTrim("BatchCode"); String qualified = lt.elementTextTrim("Qualified"); String remark = lt.elementTextTrim("Remark"); String workOrderNumber = lt.elementTextTrim("WorkOrderNumber"); String orderType = lt.elementTextTrim("OrderType"); System.out.println("MaterialCode=="+materialCode+"-----BatchCode=="+batchCode+"------Qualified=="+qualified+"-----Remark=="+remark+"-----WorkOrderNumber=="+workOrderNumber+"-----OrderType=="+orderType); /** 日志 1-成功 */ //PMSXmlDataInterceptor.getInstance().addLog(false, "卷包批次检验判定结果下发", 1, lt.asXML()); } /** 日志 1-成功 */ PMSXmlDataInterceptor.getInstance().addLog(false, "卷包批次检验判定结果下发", 1, fstr); } catch (Exception e) { /** 日志 2-失败 */ PMSXmlDataInterceptor.getInstance().addLog(false, "卷包批次检验判定结果下发", 2, fstr, "REEOR:卷包批次检验判定结果下发解析失败..." + ftype + ":" + fstr); e.printStackTrace(); log.error("REEOR:卷包批次检验判定结果下发解析失败..." + ftype + ":" + fstr); } } /** * @Title: alalyMESSendWorkorderIOToDAS * @Description: 解析保存工单出入库记录 * @author baoshiwei * @date 2019年5月16日 * @param ftype * @param fstr * @param fdoc */ public void alalyMESSendWorkorderIOToDAS(String ftype, String fstr, Document fdoc) { try { SchWorkorderIO workorderIO = null; List info = fdoc.selectNodes("dataset/data"); int success = 0; for (Element lt : info) { String workorderNumber = lt.elementTextTrim("WorkorderNumber"); String matCode = lt.elementTextTrim("MaterialCode"); String operationTime = lt.elementTextTrim("OperationTime"); String inoutType = lt.elementTextTrim("InoutType"); String operator = lt.elementTextTrim("Operator"); List itmes = lt.elements("item"); for (Element element : itmes) { String materialCode = element.elementTextTrim("MaterialCode"); List Details = element.elements("Details"); for (Element detail : Details) { workorderIO = new SchWorkorderIO(); String batchCode = detail.elementTextTrim("BatchCode"); String quantity = detail.elementTextTrim("Quantity"); try { Double qty = Double.parseDouble(quantity); if (inoutType.equals("5")||inoutType.equals("6")) { workorderIO.setQuantity(-qty); }else { workorderIO.setQuantity(qty); } }catch (Exception e){ PMSXmlDataInterceptor.getInstance().addLog(false, "工单出入库记录下发", 2, lt.asXML(),"quantity数字格式转换失败!接收值为:" + quantity); continue; } String uom = detail.elementTextTrim("Uom"); String replaceMaterial = detail.elementTextTrim("ReplaceMaterial"); String minorQuantity = detail.elementTextTrim("MinorQuantity"); if(minorQuantity!=null){ try { Double mqty = Double.parseDouble(minorQuantity); workorderIO.setMinorQuantity(mqty); }catch (Exception e){ PMSXmlDataInterceptor.getInstance().addLog(false, "工单出入库记录下发", 2, lt.asXML(),"minorQuantity数字格式转换失败!接收值为:" + minorQuantity); continue; } } String minorUom = detail.elementTextTrim("MinorUom"); String consumeTime = detail.elementTextTrim("ConsumeTime"); workorderIO.setWorkorderNumber(workorderNumber); workorderIO.setMatCode(matCode); if (operationTime!=null){ try { workorderIO.setOperationTime(DateUtil.formatStringToDate(operationTime, "yyyy-MM-dd HH:mm:ss")); } catch (Exception e2) { PMSXmlDataInterceptor.getInstance().addLog(false, "工单出入库记录下发", 2, lt.asXML(),"日期格式转换失败!格式为:yyyy-MM-dd HH:mm:ss 实际:"+operationTime); continue; } } workorderIO.setInOutType(inoutType); workorderIO.setOperator(operator); workorderIO.setMaterialCode(materialCode); workorderIO.setBatchCode(batchCode); workorderIO.setUom(uom); workorderIO.setReplaceMaterial(replaceMaterial); workorderIO.setMinorUom(minorUom); if (consumeTime!=null){ try { workorderIO.setConsumeTime(DateUtil.formatStringToDate(consumeTime, "yyyy-MM-dd HH:mm:ss")); } catch (Exception e2) { PMSXmlDataInterceptor.getInstance().addLog(false, "工单出入库记录下发", 2, lt.asXML(),"日期格式转换失败!格式为: yyyy-MM-dd HH:mm:ss 实际:"+consumeTime); continue; } } workorderIOServiceI.addWorkorderIO(workorderIO); } } /** 日志 1-成功 */ // PMSXmlDataInterceptor.getInstance().addLog(false, "工单出入库记录下发", 1, lt.asXML()); success ++; } /** 日志 1-成功 */ PMSXmlDataInterceptor.getInstance().addLog(false, "工单出入库记录下发", 1, fstr,"共下发" + info.size()+"条,保存成功:" + success + "条"); } catch (Exception e) { /** 日志 2-失败 */ PMSXmlDataInterceptor.getInstance().addLog(false, "工单出入库记录下发", 2, fstr, "REEOR:工单出入库记录下发解析失败..." + ftype + ":" + fstr); e.printStackTrace(); log.error("REEOR:工单出入库记录下发解析失败..." + ftype + ":" + fstr); } } /** * @Title: alalyMESSendProdInventoryToDAS * @Description: 解析保存成品入库记录 * @author baoshiwei * @date 2019年5月16日 * @param ftype * @param fstr * @param fdoc */ public void alalyMESSendProdInventoryToDAS(String ftype, String fstr, Document fdoc) { try { List info = fdoc.selectNodes("dataset/data"); SchProdInventory prodInventory = null; int success = 0; for (Element lt : info) { String materialCode = lt.elementTextTrim("MaterialCode"); List items = lt.elements("item"); for (Element e : items) { prodInventory = new SchProdInventory(); prodInventory.setMaterialCode(materialCode); String traceCode = e.elementTextTrim("TraceCode"); String yhgcm = e.elementTextTrim("YHGCM"); String time = e.elementTextTrim("Time"); prodInventory.setTraceCode(traceCode); prodInventory.setYhgcm(yhgcm); try { prodInventory.setTime(DateUtil.formatStringToDate(time, "yyyy-MM-dd HH:mm:ss")); } catch (Exception e2) { PMSXmlDataInterceptor.getInstance().addLog(false, "成品入库记录下发", 2, lt.asXML(),"日期格式转换失败!格式为:yyyy-MM-dd HH:mm:ss 实际:"+time); continue; } prodInventoryServiceI.addProdInventory(prodInventory); } /** 日志 1-成功 */ //PMSXmlDataInterceptor.getInstance().addLog(false, "成品入库记录下发", 1, lt.asXML()); success ++; } /** 日志 1-成功 */ PMSXmlDataInterceptor.getInstance().addLog(false, "成品入库记录下发", 1, fstr,"共下发" + info.size()+"条,保存成功:" + success + "条"); } catch (Exception e) { /** 日志 2-失败 */ PMSXmlDataInterceptor.getInstance().addLog(false, "成品入库记录下发", 2, fstr, "REEOR:成品入库记录下发解析失败..." + ftype + ":" + fstr); e.printStackTrace(); log.error("REEOR:成品入库记录下发解析失败..." + ftype + ":" + fstr); } } /** * [功能说明]在线自检,巡检,成品,成型成品 共用方法 * 反馈成功,修改工单状态 * * */ public void updateQmOLinkCheck(String olid,String param) { fixCodeService.updateQmOLinkCheck(olid,param); } /** * [功能说明]修改外观数据自动反馈 共用方法 * 反馈成功,修改工单状态 * */ public void updateQmOutWard(String olid,String sts,boolean flag) { try { fixCodeService.updateQmOutWard(olid,sts,flag); } catch (Exception e) { e.printStackTrace(); } } public void alalyMESSendSparePartsToDAS(String ftype, String fstr, Document fdoc) { try { // 匹配单位 Map unitMap = Mes2DASParams.MES2DASUnit(); List info = fdoc.selectNodes("dataset/data"); CosSparePartsBean spareParts = null; for (Element lt : info) { String EMWorkOrderCode = lt.elementTextTrim("EMWorkOrderCode"); List items = lt.elements("item"); for (Element e : items) { spareParts = new CosSparePartsBean(); String PartCode = e.elementTextTrim("PartCode"); String PartName = e.elementTextTrim("PartName"); String Quantity = e.elementTextTrim("Quantity"); String Unit = e.elementTextTrim("Unit"); String Remark = e.elementTextTrim("Remark"); spareParts.setSpareCode(PartCode); // 查询些备件是否存在数据库中 List cosSparePartsBeans = cosSparePartsService.queryListByBeans(spareParts); // 备件存在则更新库存 if (cosSparePartsBeans!=null && cosSparePartsBeans.size()>0){ spareParts = cosSparePartsBeans.get(0); spareParts.setNumber((Integer.parseInt(spareParts.getNumber())+Integer.parseInt(Quantity))+""); // 不存在则新增 } else { spareParts.setName(PartName); spareParts.setRemark(Remark); String uom = unitMap.get(Unit); if (uom == null) { throw new Exception("卷包数采没有匹配到该单位编号!请在卷包数采 综合基础数据维护中 核对" + "无法匹配到的单位为:" + Unit); } spareParts.setUnitId(uom); spareParts.setNumber(Quantity); } cosSparePartsService.saveOrUpdateBean(spareParts); } } /** 日志 1-成功 */ PMSXmlDataInterceptor.getInstance().addLog(false, "备件出库记录下发", 1, fstr); } catch (Exception e) { /** 日志 2-失败 */ PMSXmlDataInterceptor.getInstance().addLog(false, "备件出库记录下发", 2, fstr, "REEOR:备件出库记录下发解析失败..." + ftype + ":" + fstr); e.printStackTrace(); log.error("REEOR:备件出库记录下发解析失败..." + ftype + ":" + fstr); } } }