zhuguifei
2026-03-10 2c1fd10c6fbabb8e9f0e9f07fe66fb36c008e883
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
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<String,Object> 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<String, Object> map) {
        OutputBean out=(OutputBean) map.get("out");
        List<InputBean> inputs=(List<InputBean>) 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<String, Object> packData(List<?> ls,String FeedbackType) {
        Map<String,Object> map=new HashMap<String,Object>();
        List<InputBean> inputs=new ArrayList<InputBean>();
        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;
    }
    
}