package com.shlanbao.tzsc.base.interceptor; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import com.shlanbao.tzsc.base.dao.SchCalendarDaoI; import com.shlanbao.tzsc.base.dao.SchStatOutputDaoI; import com.shlanbao.tzsc.base.dao.SysMessageQueueDaoI; import com.shlanbao.tzsc.base.mapping.SchStatOutput; import com.shlanbao.tzsc.base.mapping.SysMessageQueue; import com.shlanbao.tzsc.data.webservice.client.SendMessageClient; import com.shlanbao.tzsc.pms.sch.stat.beans.InputBean; import com.shlanbao.tzsc.pms.sch.stat.beans.OutputBean; import com.shlanbao.tzsc.utils.tools.ApplicationContextUtil; import com.shlanbao.tzsc.utils.tools.StringUtil; /** * 工单产耗信息反馈 * @author shisihai * */ public class WorkOrderFeedbackInterceptor { /** * *说明:工单产耗信息反馈 * @param idOrIds * @param feedbackUser * @return * shisihai * 20162016年2月22日上午9:06:15 */ public Integer sendWorkOrderDetails(String idOrIds,String feedbackUser){ SchCalendarDaoI dao=ApplicationContextUtil.getBean(SchCalendarDaoI.class); SendMessageClient sendMessageClient=new SendMessageClient(); for(String id : StringUtil.splitToStringList(idOrIds, ",")){ //1.根据产出id查询出所需数据 String sql=getFeedbackSql(id); //1.2封装数据 List ls=dao.queryBySql(sql); Map map=packData(ls,"1");//默认是换班类型的反馈 //2.生成xml字符串数据文件,单个工单信息xml字符串 String xmlStr=createXMLStr(map); //调用mes接收工单信息反馈的方法,将xml字符串传过去 //********************* //sendMessageClient.SendMessageToMes("SDCSFinishedEntryInfo", xmlStr); if(!xmlStr.equals("")){ addLog("工单反馈outid:"+id,1); this.editOutputIsFeedback(id, feedbackUser);//修改状态 }else{ addLog("工单反馈outid:"+id,0); return 0; } } return 1; } /** *说明:修改生产实绩反馈状态 * @param id * @param feedbackUser * shisihai * 20162016年2月22日上午9:03:11 */ private void editOutputIsFeedback(String id,String feedbackUser){ SchStatOutputDaoI schStatOutputDao=ApplicationContextUtil.getBean(SchStatOutputDaoI.class); SchStatOutput output = schStatOutputDao.findById(SchStatOutput.class, id); output.setIsFeedback(1L); output.setFeedbackTime(new Date()); output.setFeedbackUser(feedbackUser); } /** *说明:接口日志 * @param des * @param flag 1成功 0失败 * shisihai * 20152015年12月28日下午4:56:58 */ private void addLog(String des,Integer flag) { SysMessageQueueDaoI sysMessageQueueDaoI=ApplicationContextUtil.getBean(SysMessageQueueDaoI.class); SysMessageQueue log=new SysMessageQueue(); log.setSysReceive(2L);//接受方 log.setSysSend(1L);//发送方 log.setDel(0L); log.setMsgType(1L); log.setDes(des);//描述 log.setFlag(flag); log.setDate(new Date()); try { sysMessageQueueDaoI.saveAndReturn(log); } catch (Exception e) { e.printStackTrace(); } } /** *说明:生成工单产耗详细xml,反馈给mes * @param map * @return * shisihai * 20152015年12月28日下午2:20:21 */ @SuppressWarnings("unchecked") private String createXMLStr(Map map) { OutputBean out=(OutputBean) map.get("out"); List inputs=(List) map.get("input"); try { Document doc=DocumentHelper.createDocument(); Element root=doc.addElement("EntryShiftORFinished");//根节点 Element entryBasicInfo=root.addElement("EntryBasicInfo"); if (out!=null) { //订单号 entryBasicInfo.addElement("OrderID").setText(out.getOrderNum()); //工单号 entryBasicInfo.addElement("EntryID").setText(out.getWorkorderCode()); //生产日期 entryBasicInfo.addElement("ProduceDate").setText(out.getDate()); //牌号编码 entryBasicInfo.addElement("OutMaterialID").setText(out.getMatId()); //批次作业号 entryBasicInfo.addElement("LotID").setText(out.getBth()); //产量信息 Element outMaterialQuantity = entryBasicInfo.addElement("OutMaterialQuantity"); //实际产量 outMaterialQuantity.addElement("RealOutMaterialQuantity") .setText(StringUtil.convertObjToString(out.getQty())); //修改产量 outMaterialQuantity.addElement("ChangeMaterialQuantity") .setText(StringUtil.convertObjToString(out.getChangeQty())); //修改产量标识 outMaterialQuantity.addElement("ChangeIdentifer").setText(out.getChangeFlag()); //单位 entryBasicInfo.addElement("UOM").setText(out.getUnitName()); //设备编码 entryBasicInfo.addElement("DeviceID").setText(out.getEqpCode()); //批次作业顺序号 entryBasicInfo.addElement("SequenceNumber").setText(out.getSequenceNumber()); //计划开始时间 entryBasicInfo.addElement("PlanningStartTime").setText(out.getPstim()); //计划结束时间 entryBasicInfo.addElement("PlanningFinishedTime").setText(out.getPetim()); //实际开始时间 entryBasicInfo.addElement("ActualStartTime").setText(out.getStim()); //实际结束时间 entryBasicInfo.addElement("ActualFinishedTime").setText(out.getEtim()); //外联设备相关信息 Element destination = entryBasicInfo.addElement("Destination"); destination.addElement("DestinationID"); destination.addElement("DestinationType"); Element sourceDevice = entryBasicInfo.addElement("SourceDevice"); for (int i = 0; i < 2; i++) { Element item = sourceDevice.addElement("Item"); item.addElement("SouceDeviceID"); item.addElement("SouceDeviceType"); } //工单类型编号 entryBasicInfo.addElement("EntryType").setText(out.getOrderType()); //班次 entryBasicInfo.addElement("ShiftID").setText(out.getShift()); //班组 entryBasicInfo.addElement("TeamID").setText(out.getTeam()); //结果类型 entryBasicInfo.addElement("Result").setText(out.getResult()); //删除标志 entryBasicInfo.addElement("DeleteFlag").setText(StringUtil.convertObjToString(out.getDel())); } if (inputs!=null) { //辅料消耗信息 Element materialInfo = root.addElement("MaterialInfo"); for (InputBean input : inputs) { Element item = materialInfo.addElement("Item"); //辅料类型 item.addElement("MaterialClass").setText(input.getMatType()); //辅料编码 item.addElement("MaterialID").setText(input.getMatCode()); //物料批次号 item.addElement("LotID").setText(input.getBth()); //消耗 item.addElement("Quantity").setText(StringUtil.convertObjToString(input.getQty())); //单位 item.addElement("UOM").setText(input.getUnit()); } } StringBuffer xmlStr=new StringBuffer(doc.asXML()); // Document document = DocumentHelper.parseText(xmlStr.toString()); // System.err.println(document.asXML()); return xmlStr.toString(); } catch (Exception e) { e.printStackTrace(); } return ""; } /** * *说明:查询工单产耗信息 * @param id * @return * shisihai * 20162016年2月22日上午10:52:04 */ private String getFeedbackSql(String id){ StringBuffer sb=new StringBuffer(); sb.append("SELECT "); sb.append(" swo.erp_code AS mod_id,swo.code AS orderCode,to_char(swo.DATE_,'yyyy-mm-dd') as sdate,swo.MAT,swo.BTH,"); sb.append(" nvl(sso.QTY, 0) as qty,nvl(sso.DACQTY, 0) as dacQty,(SELECT mes_code as mes_code from MD_UNIT mdu where sso.UNIT=mdu.id) as unit,"); sb.append(" (SELECT MES_EQPCODE FROM MD_EQUIPMENT WHERE id = swo.EQP) AS eqpCode,"); sb.append(" RUN_SEQ as sequenceNumber,"); sb.append(" to_char(swo.STIM,'yyyy-mm-dd hh24:mi:ss') as stim,to_char(swo.ETIM,'yyyy-mm-dd hh24:mi:ss') as etim,to_char(swo.REAL_STIM,'yyyy-mm-dd hh24:mi:ss') as rstim,to_char(swo.REAL_ETIM,'yyyy-mm-dd hh24:mi:ss') as retim,"); sb.append(" swo.TYPE,swo.SHIFT,swo.TEAM,"); sb.append(" swo.sts,tab.*"); sb.append(" FROM SCH_STAT_OUTPUT sso LEFT JOIN SCH_WORKORDER swo ON sso.OID = swo.id"); sb.append(" LEFT JOIN ( SELECT (SELECT TID FROM MD_MAT WHERE mat = id ) AS flClass,(SELECT code FROM MD_MAT WHERE mat = id ) AS flCode,"); sb.append(" '物料批次' AS wuBth,"); sb.append(" QTY AS flQty,(SELECT mes_code as mes_code FROM MD_UNIT WHERE UNIT = id) AS flunName,OUT_ID FROM SCH_STAT_INPUT ) tab ON tab.OUT_ID = sso.ID"); sb.append(" WHERE sso.id ='"+id+"'"); return sb.toString(); } /** * *说明:封装工单详细反馈数据 * @param ls * @param FeedbackType 反馈类型 0-结束工单 1-换班 * @return * shisihai * 20152015年12月28日下午1:51:22 */ private Map packData(List ls,String FeedbackType) { Map map=new HashMap(); List inputs=new ArrayList(); InputBean input=null; OutputBean out=null; if(ls!=null && ls.size()>0){ Object[] obj=null; for (int i = 0; i < ls.size(); i++) { obj=(Object[]) ls.get(i); if(i==0){ out=new OutputBean(); //ERP订单号 out.setOrderNum(StringUtil.convertObjToString(obj[0])); //工单号 out.setWorkorderCode(StringUtil.convertObjToString(obj[1])); //工单日期 out.setDate(StringUtil.convertObjToString(obj[2])); //牌号编码 out.setMatId(StringUtil.convertObjToString(obj[3])); //作业批次号 out.setBth(StringUtil.convertObjToString(obj[4])); //实际产量 out.setQty(this.convDouble(obj[5])); //修改产量 out.setChangeQty(this.convDouble(obj[5])-this.convDouble(obj[6])); //修改标志 out.setChangeFlag(""); //单位 out.setUnitName(StringUtil.convertObjToString(obj[7])); //设备code out.setEqpCode(StringUtil.convertObjToString(obj[8])); //批次作业顺序号 out.setSequenceNumber(StringUtil.convertObjToString(obj[9])); //计划开始 out.setPstim(StringUtil.convertObjToString(obj[10])); //计划结束 out.setPetim(StringUtil.convertObjToString(obj[11])); //实际开始 out.setStim(StringUtil.convertObjToString(obj[12])); //实际结束 out.setEtim(StringUtil.convertObjToString(obj[13])); //工单类型编号 out.setOrderType(StringUtil.convertObjToString(obj[14])); //班次 out.setShift(StringUtil.convertObjToString(obj[15])); //班组 out.setTeam(StringUtil.convertObjToString(obj[16])); //结果 out.setResult(""); //删除状态 out.setDel(0L); //工单状态 out.setOrderStat(StringUtil.convertObjToString(obj[17])); map.put("out", out); } input=new InputBean(); //辅料类型 input.setMatType(StringUtil.convertObjToString(obj[18])); //辅料code input.setMatCode(StringUtil.convertObjToString(obj[19])); //物料批次 input.setBth(StringUtil.convertObjToString(obj[20])); //消耗量 input.setQty(convDouble(obj[21])); //单位 input.setUnit(StringUtil.convertObjToString(obj[22])); inputs.add(input); } } map.put("input", inputs); return map; } /** * Obje 转Double * TODO * @param o * @return * TRAVLER * 2015年12月2日下午4:30:32 */ private Double convDouble(Object o){ Double d=0.0; if(o!=null&&StringUtil.isDouble(o.toString())){ d=Double.valueOf(o.toString()); } return d; } }