cl
2024-01-20 d434812c124e2dab22487f8d40d8ad6c3b8ad19c
提交 | 用户 | 时间
d43481 1 package cn.stylefeng.guns.plcserver.callback;
C 2
3
4 import cn.stylefeng.guns.modular.bs.collectionParamConf.model.params.CollectionParamConfParam;
5 import cn.stylefeng.guns.modular.bs.collectionParamConf.model.result.CollectionParamConfResult;
6 import cn.stylefeng.guns.modular.bs.collectionParamConf.service.CollectionParamConfService;
7 import cn.stylefeng.guns.modular.bs.equipmentInfo.service.EquipmentInfoService;
8 import cn.stylefeng.guns.modular.bs.locationInfo.model.params.LocationInfoParam;
9 import cn.stylefeng.guns.modular.bs.locationInfo.model.result.LocationInfoResult;
10 import cn.stylefeng.guns.modular.bs.locationInfo.service.LocationInfoService;
11 import cn.stylefeng.guns.modular.cm.paramCollection.model.params.ParamCollectionParam;
12 import cn.stylefeng.guns.modular.cm.paramCollection.service.ParamCollectionService;
13 import cn.stylefeng.guns.modular.cm.passingStationCollection.model.params.PassingStationCollectionParam;
14 import cn.stylefeng.guns.modular.cm.passingStationCollection.service.PassingStationCollectionService;
15 import cn.stylefeng.guns.modular.dq.materialTraceability.model.params.MaterialTraceabilityParam;
16 import cn.stylefeng.guns.modular.dq.materialTraceability.service.MaterialTraceabilityService;
17 import cn.stylefeng.guns.modular.em.equipmentAlarm.service.EquipmentAlarmService;
18 import cn.stylefeng.guns.modular.em.equipmentStatus.service.EquipmentStatusService;
19 import cn.stylefeng.guns.modular.gm.greaseManage.service.GreaseManageService;
20 import cn.stylefeng.guns.modular.om.productionOrdeInfo.model.params.ProductionOrdeInfoParam;
21 import cn.stylefeng.guns.modular.om.productionOrdeInfo.model.result.ProductionOrdeInfoResult;
22 import cn.stylefeng.guns.modular.om.productionOrdeInfo.service.ProductionOrdeInfoService;
23 import cn.stylefeng.guns.modular.om.productionOrderBatchInfo.model.params.ProductionOrderBatchInfoParam;
24 import cn.stylefeng.guns.modular.om.productionOrderBatchInfo.model.result.ProductionOrderBatchInfoResult;
25 import cn.stylefeng.guns.modular.om.productionOrderBatchInfo.service.ProductionOrderBatchInfoService;
26 import cn.stylefeng.guns.modular.om.productionOrderRecords.service.ProductionOrderRecordsService;
27 import cn.stylefeng.guns.modular.sc.repairManageInfo.model.params.RepairManageInfoParam;
28 import cn.stylefeng.guns.modular.sc.repairManageInfo.model.result.RepairManageInfoResult;
29 import cn.stylefeng.guns.modular.sc.repairManageInfo.service.RepairManageInfoService;
30 import cn.stylefeng.guns.modular.sc.serialNumbersConf.service.SerialNumbersConfService;
31 import cn.stylefeng.guns.plcserver.opc.GlobalVariable;
32 import cn.stylefeng.guns.plcserver.opc.OPCElement;
33 import cn.stylefeng.guns.plcserver.opc.unit.OPCUnit;
34 import cn.stylefeng.guns.plcserver.tool.DateTool;
35 import cn.stylefeng.guns.plcserver.tool.LogUtil;
36 import com.kangaroohy.milo.model.ReadWriteEntity;
37 import com.kangaroohy.milo.runner.subscription.SubscriptionCallback;
38 import com.kangaroohy.milo.service.MiloService;
39 import org.apache.log4j.Logger;
40 import org.springframework.beans.factory.annotation.Autowired;
41 import org.springframework.stereotype.Component;
42
43 import java.util.ArrayList;
44 import java.util.Date;
45 import java.util.List;
46 import java.util.Random;
47
48 @Component
49 public class DOP010Callback implements SubscriptionCallback {
50
51     public MiloService miloService;
52
53     @Autowired
54     public ProductionOrdeInfoService productionOrdeInfoService;
55     @Autowired
56     public PassingStationCollectionService passingStationCollectionService;
57     @Autowired
58     public ParamCollectionService paramCollectionService;
59     @Autowired
60     public CollectionParamConfService collectionParamConfService;
61     @Autowired
62     public SerialNumbersConfService serialNumbersConfService;
63     @Autowired
64     private EquipmentStatusService equipmentStatusService;
65
66     @Autowired
67     private EquipmentAlarmService equipmentAlarmService;
68     @Autowired
69     private MaterialTraceabilityService materialTraceabilityService;
70     @Autowired
71     private EquipmentInfoService equipmentInfoService;
72     @Autowired
73     private RepairManageInfoService repairManageInfoService;
74
75     @Autowired
76     private LocationInfoService locationInfoService;
77
78     @Autowired
79     private GreaseManageService greaseManageService;
80
81     @Autowired
82     private ProductionOrderRecordsService productionOrderRecordsService;
83
84     @Autowired
85     private ProductionOrderBatchInfoService productionOrderBatchInfoService;
86
87     private static Logger logger;
88     LogUtil logUtil = new LogUtil();
89     static {
90         logger = Logger.getLogger(DOP010Callback.class);
91     }
92     private static Date IN_TIME = null;
93     private static String S_ORDER_CODE = "";//工单编号
94     private static String S_PRODUCT_CODE = "";//产品编号
95     private static String S_PRODUCT_TYPE= "";//产品类型
96     private static String S_SFC_CODE = "";//总成编码
97     private static String PRODUCTION_LINE  = "BOP";//产线号
98     private static String LOCATION_CODE  = "DOP010";//工位号
99     private static List list = null;
100
101     public DOP010Callback(MiloService miloService,
102                           ProductionOrdeInfoService productionOrdeInfoService,
103                           PassingStationCollectionService passingStationCollectionService,
104                           ParamCollectionService paramCollectionService,
105                           CollectionParamConfService collectionParamConfService,
106                           SerialNumbersConfService serialNumbersConfService,
107                           EquipmentStatusService equipmentStatusService,
108                           EquipmentAlarmService equipmentAlarmService,
109                           MaterialTraceabilityService materialTraceabilityService,
110                           EquipmentInfoService equipmentInfoService,
111                           RepairManageInfoService repairManageInfoService,
112                           LocationInfoService locationInfoService,
113                           GreaseManageService greaseManageService,
114                           ProductionOrderRecordsService productionOrderRecordsService,
115                           ProductionOrderBatchInfoService productionOrderBatchInfoService) {
116         this.miloService = miloService;
117         this.productionOrdeInfoService = productionOrdeInfoService;
118         this.passingStationCollectionService = passingStationCollectionService;
119         this.paramCollectionService = paramCollectionService;
120         this.collectionParamConfService = collectionParamConfService;
121         this.serialNumbersConfService = serialNumbersConfService;
122         this.equipmentStatusService = equipmentStatusService;
123         this.equipmentAlarmService = equipmentAlarmService;
124         this.materialTraceabilityService = materialTraceabilityService;
125         this.equipmentInfoService = equipmentInfoService;
126         this.repairManageInfoService = repairManageInfoService;
127         this.locationInfoService = locationInfoService;
128         this.greaseManageService = greaseManageService;
129         this.productionOrderRecordsService = productionOrderRecordsService;
130         this.productionOrderBatchInfoService = productionOrderBatchInfoService;
131     }
132     @Override
133     public void onSubscribe(String identifier, Object value) {
134         String ecpStr = "";//异常记录标记
135         try {
136             //心跳
137             if(null != value && identifier.equals(OPCElement.COP010_F_HEART_BEAT)){
138                 if( "false".equals(value.toString()))
139                 {
140                     ReadWriteEntity entity = new ReadWriteEntity(OPCElement.DOP010_F_HEART_BEAT,true);
141                     miloService.writeToOpcUa(entity);
142                 }
143             }
144             //PLC进站
145             else if(null != value && identifier.equals(OPCElement.DOP010_J_PLC_START)){
146                 if("true".equals(value.toString())){
147                     String isRepair = miloService.
148                             readFromOpcUa(OPCElement.DOP010_P_REPAIR)
149                             .getValue().toString();//是否返修
150                     if(isRepair.equals("true")){
151                         handleRepair();
152                     }else{
153                         handleOrder();
154                     }
155                 }
156             }
157             //PLC出站
158             else if(null != value && identifier.equals(OPCElement.DOP010_J_PLC_FINISH)){
159                 if("true".equals(value.toString())){
160                     handleFinsh();
161                     //handleInfo();
162                     handleMaterial();
163                 }
164             }else{
165                 System.out.println("值没有变");
166             }
167         } catch (Exception e) {
168             ecpStr ="出现异常:" + logUtil.getTrace(e);
169         }finally {
170             if(!"".equals(ecpStr)){
171                 logger.info(ecpStr+"\r\n");
172             }
173         }
174     }
175
176     public void handleOrder() throws Exception{
177         IN_TIME = DateTool.getLocalTimeForDate();
178         ProductionOrdeInfoParam param = new ProductionOrdeInfoParam();
179         param.setProductionLine("");//产线
180         param.setOrderStatus("3");//工单状态
181         List<ProductionOrdeInfoResult> list = productionOrdeInfoService.findListBySpec(param);
182         if(list.size()>0) {
183             ProductionOrdeInfoResult result = list.get(0);
184             S_ORDER_CODE = result.getWorkOrderNo();
185             S_PRODUCT_CODE = result.getMaterialCode();
186             S_PRODUCT_TYPE = GlobalVariable.PRODUCT_TYPE_MAP.get(S_PRODUCT_CODE);
187
188             //自动生成唯一码
189             Random random = new Random(System.currentTimeMillis());
190             S_SFC_CODE = "EOP"+ random.nextLong();
191
192             List<ReadWriteEntity> lists = new ArrayList<>();
193             lists.add(new ReadWriteEntity(OPCElement.DOP010_S_ORDER_CODE,S_ORDER_CODE));
194             lists.add(new ReadWriteEntity(OPCElement.DOP010_S_PRODUCT_CODE,S_PRODUCT_TYPE));
195             lists.add(new ReadWriteEntity(OPCElement.DOP010_S_SFC_CODE,S_SFC_CODE));
196             lists.add(new ReadWriteEntity(OPCElement.DOP010_S_NUMBER,result.getPlanQty().toString()));
197             lists.add(new ReadWriteEntity(OPCElement.DOP010_J_PC_WRITE_ORDER,true));
198             miloService.writeToOpcUa(lists);
199             logger.info("DOP010工位,handleOrder PC处理完成!");
200         }else{
201             logger.info("DOP010工位没有可执行的工单,请联系工单管理员下发该产线的工单!");
202         }
203     }
204
205     public void handleFinsh() throws Exception {
206         logger.info("handleFinsh PC处理开始!");
207         String S_PRODUCT_STATE_CODE = miloService.
208                 readFromOpcUa(OPCElement.DOP010_S_PRODUCT_STATE_CODE)
209                 .getValue().toString();
210
211         //处理过站信息
212         PassingStationCollectionParam param = new PassingStationCollectionParam();
213         param.setWorkOrderNo(S_ORDER_CODE);
214         param.setProductCode(S_PRODUCT_CODE);
215         param.setSfcCode(S_SFC_CODE);
216         param.setProductionLine(PRODUCTION_LINE);
217         param.setLocationCode(LOCATION_CODE);
218         param.setInboundTime(IN_TIME);
219         param.setOutboundTime(DateTool.getLocalTimeForDate());
220         param.setOutRsSign(S_PRODUCT_STATE_CODE);//出站是否合格
221         passingStationCollectionService.add(param);
222
223         ReadWriteEntity entity = new ReadWriteEntity(OPCElement.DOP010_J_PC_FINISH,true);
224         miloService.writeToOpcUa(entity);//写PC完成
225         logger.info("handleFinsh PC处理完成!");
226     }
227
228     public void handleMaterial() {
229
230         //查询批次上料信息
231         ProductionOrderBatchInfoParam productionOrderBatchInfoParam = new ProductionOrderBatchInfoParam();
232         productionOrderBatchInfoParam.setWorkOrderNo(S_ORDER_CODE);
233         productionOrderBatchInfoParam.setLocationCode(LOCATION_CODE);
234         List<ProductionOrderBatchInfoResult> list = productionOrderBatchInfoService.findListBySpec(productionOrderBatchInfoParam);
235         for(int i=0;i<list.size();i++){
236             ProductionOrderBatchInfoResult productionOrderBatchInfoResult = list.get(i);
237             int remainingQuantity =  productionOrderBatchInfoResult.getResidueQuantity();//剩余数量
238             if(remainingQuantity>0 ){
239                 //新增物料追溯
240                 MaterialTraceabilityParam materialTraceabilityParam = new MaterialTraceabilityParam();
241                 materialTraceabilityParam.setWorkOrderNo(S_ORDER_CODE);
242                 materialTraceabilityParam.setProductCode(S_PRODUCT_CODE);
243                 materialTraceabilityParam.setProductNo(S_SFC_CODE);
244                 materialTraceabilityParam.setLineCode(PRODUCTION_LINE);
245                 materialTraceabilityParam.setLocationCode(LOCATION_CODE);
246                 materialTraceabilityParam.setAssemblyQty(1);
247                 materialTraceabilityParam.setAssemblyTime(DateTool.getLocalTimeForDate());
248                 materialTraceabilityParam.setMaterialCode(productionOrderBatchInfoResult.getMaterialCode());//物料编码
249                 materialTraceabilityParam.setMaterialBatchNo(productionOrderBatchInfoResult.getBatch());//物料批次
250
251                 materialTraceabilityService.add(materialTraceabilityParam);
252                 //更新剩余数量
253                 productionOrderBatchInfoParam.setId(productionOrderBatchInfoResult.getId());
254                 productionOrderBatchInfoParam.setResidueQuantity(remainingQuantity-1);//剩余数量
255                 productionOrderBatchInfoService.update(productionOrderBatchInfoParam);
256             }
257         }
258     }
259
260     //PC读参数信息
261     public void handleInfo() throws Exception {
262         logger.info("handleInfo START!");
263
264         if(null == list){
265             CollectionParamConfParam collectionParamConfParam = new CollectionParamConfParam();
266             collectionParamConfParam.setLocationCode(LOCATION_CODE);
267             list = collectionParamConfService.findListBySpec(collectionParamConfParam);
268         }
269         if(null != list && !list.isEmpty()) {
270             for (int i = 0; i < list.size(); i++) {
271                 CollectionParamConfResult result = (CollectionParamConfResult) list.get(i);
272                 String value = miloService.
273                         readFromOpcUa(result.getGatherAddress())
274                         .getValue().toString();//读参数值
275                 ParamCollectionParam paramCollectionParam = new ParamCollectionParam();
276                 paramCollectionParam.setParamCode(result.getParamCode());
277                 paramCollectionParam.setParamName(result.getParamName());
278                 paramCollectionParam.setWorkOrderNo(S_ORDER_CODE);
279                 paramCollectionParam.setSfcCode(S_SFC_CODE);
280                 paramCollectionParam.setProductCode(S_PRODUCT_CODE);
281                 paramCollectionParam.setProductionLine(result.getProductionLine());
282                 paramCollectionParam.setLocationCode(result.getLocationCode());
283                 paramCollectionParam.setParamValue(value);
284                 paramCollectionParam.setParamLower(result.getParamLower());
285                 paramCollectionParam.setParamUpper(result.getParamUpper());
286                 paramCollectionParam.setParamStandard(result.getParamCentral());
287                 paramCollectionParam.setCollectionTime(DateTool.getLocalTimeForDate());
288                 paramCollectionParam.setUnit(result.getUnit());
289                 paramCollectionService.add(paramCollectionParam);
290             }
291         }
292
293         logger.info("handleInfo END!");
294     }
295     public void handleRepair() throws Exception{
296         RepairManageInfoParam repairManageInfoParam = new RepairManageInfoParam();
297         repairManageInfoParam.setLocationCode(LOCATION_CODE);
298         repairManageInfoParam.setManageType("2");
299         repairManageInfoParam.setUpPlc("0");
300         List<RepairManageInfoResult> list = repairManageInfoService.findListBySpec(repairManageInfoParam);
301         if(list.size()>0) {
302             RepairManageInfoResult result = list.get(0);
303
304             //自动生成唯一码
305             Random random = new Random(System.currentTimeMillis());
306             S_SFC_CODE = "BOP" + random.nextLong();
307
308
309             S_ORDER_CODE = result.getWorkOrderNo();
310             S_PRODUCT_CODE = result.getProductCode();
311             S_PRODUCT_TYPE = GlobalVariable.PRODUCT_TYPE_MAP.get(S_PRODUCT_CODE);
312             String  repairLocation = result.getPoorLocationCode();//
313
314             //根据工位编码查询工位表中配置的返修工位号
315             LocationInfoParam param = new LocationInfoParam();
316             param.setLocationCode(repairLocation);
317             List<LocationInfoResult> results = locationInfoService.findListBySpec(param);
318             if(results.size()>0) {
319                 LocationInfoResult r = results.get(0);
320                 String repairLocationNo = r.getSpareField2();
321                 if(null != repairLocationNo && "" != repairLocationNo){
322                     List<ReadWriteEntity> lists = new ArrayList<>();
323                     lists.add(new ReadWriteEntity(OPCElement.DOP010_S_ORDER_CODE,S_ORDER_CODE));
324                     lists.add(new ReadWriteEntity(OPCElement.DOP010_S_PRODUCT_CODE,S_PRODUCT_TYPE));
325                     lists.add(new ReadWriteEntity(OPCElement.DOP010_S_SFC_CODE,S_SFC_CODE));
326                     lists.add(new ReadWriteEntity(OPCElement.DOP010_P_REPAIR_LOCATION,repairLocationNo));
327                     lists.add(new ReadWriteEntity(OPCElement.DOP010_J_PC_WRITE_ORDER,true));
328                     miloService.writeToOpcUa(lists);
329                     //更新为已经返修上线
330                     Long id = result.getId();
331                     repairManageInfoParam.setId(id);
332                     repairManageInfoParam.setUpPlc("1");
333                     repairManageInfoService.update(repairManageInfoParam);
334
335                 }else{
336                     logger.info("DOP010工位,handleRepair 请查询"+repairLocation+"工位是否配置返修工位号!");
337                 }
338             }else{
339                 logger.info("DOP010工位,handleRepair 无法查询到"+repairLocation+"工位!");
340             }
341         }
342     }
343 }