plc collect pd

tags/yfai-pcn-ext-v1.0
王杰 2 years ago
parent 8849931f5a
commit 742e3c958f

@ -16,6 +16,6 @@ public interface ISxThirdPartyPlcCollectDataJobService {
* @param paramMap
*/
@ApiOperation(value = "第三方PLC数据采集定时任务", notes = "第三方PLC数据采集定时任务")
void doThirdPartyPlcCollectData(Map<String, String> paramMap);
void doThirdPartyPlcCollectData(Map<String, Object> paramMap);
}

@ -1,8 +1,11 @@
package cn.estsh.i3plus.ext.mes.pcn.api.busi.jx;
import cn.estsh.i3plus.pojo.mes.bean.MesObjectCfg;
import cn.estsh.i3plus.pojo.mes.bean.MesPlc;
import io.swagger.annotations.ApiOperation;
import java.util.List;
/**
* @Author: wangjie
* @CreateDate: 2021/01/18 11:22
@ -20,6 +23,16 @@ public interface IJxPlcExtService {
MesPlc getPlcDb(String organizeCode, String plcCode);
/**
* PLC
* @param organizeCode
* @param workCenterCode 线
* @param workCellCode
* @return PLC
*/
@ApiOperation(value = "获取PLC信息", notes = "获取PLC信息")
List<MesPlc> getPlcDbList(String organizeCode, String workCenterCode, String workCellCode);
/**
* PLC
* @param plc PLC
* @return PLC
@ -39,12 +52,40 @@ public interface IJxPlcExtService {
/**
* PLC
* @param organizeCode
* @param plcCode PLC
* @param key key
* @param plcCode PLC
* @return PLC
*/
@ApiOperation(value = "获取PLC信息", notes = "获取PLC信息")
MesPlc getPlcData(String organizeCode, String plcCode, String key);
MesPlc getPlcData(String organizeCode, String key, String plcCode);
/**
*
* @param key key
* @param item item
* @return
*/
@ApiOperation(value = "获取信息", notes = "获取信息")
String getCachedData(String key, String item);
/**
*
* @param organizeCode
* @param key key
* @param item item
* @param data
*/
@ApiOperation(value = "缓存信息", notes = "缓存信息")
void doCacheData(String organizeCode, String key, String item, String data);
/**
*
* @param organizeCode
* @param plcCodeList PLC
* @return
*/
@ApiOperation(value = "获取对象结构信息", notes = "获取对象结构信息")
List<MesObjectCfg> getObjectCfgDbList(String organizeCode, List<String> plcCodeList);
}

@ -0,0 +1,26 @@
package cn.estsh.i3plus.ext.mes.pcn.api.busi.jx;
import cn.estsh.i3plus.pojo.mes.bean.MesProductData;
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
import io.swagger.annotations.ApiOperation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* @Author: wangjie
* @CreateDate: 2021/01/18 11:22
* @Description:
**/
public interface IJxProductDataService {
/**
* ()
* @param productDataList
*/
@ApiOperation(value = "插入生产数据信息(新事务,不回滚)", notes = "插入生产数据信息(新事务,不回滚)")
@Transactional(propagation = Propagation.REQUIRES_NEW, noRollbackFor = {ImppBusiException.class, Exception.class})
void insertProductDataNoRollback(List<MesProductData> productDataList);
}

@ -32,14 +32,14 @@ public class SxThirdPartyPlcCollectDataJob implements Job {
log.info("第三方PLC数据采集 --- JOB --- PARAM:{}", param.toString());
Map<String, String> paramMap = JSONObject.parseObject(param.toString(), Map.class);
Map<String, Object> paramMap = JSONObject.parseObject(param.toString(), Map.class);
if (!paramMap.containsKey(MesPcnExtConstWords.ORGANIZE_CODE) || !paramMap.containsKey(MesPcnExtConstWords.STRATEGY_CLASS)) return;
log.info("工厂{}第三方PLC数据采集 --- JOB START --- PARAM:{}", paramMap.get(MesPcnExtConstWords.ORGANIZE_CODE), param.toString());
long startTime = System.currentTimeMillis();
((ISxThirdPartyPlcCollectDataJobService) SpringContextsUtil.getBean(paramMap.get(MesPcnExtConstWords.STRATEGY_CLASS))).doThirdPartyPlcCollectData(paramMap);
((ISxThirdPartyPlcCollectDataJobService) SpringContextsUtil.getBean(MesPcnExtConstWords.SX_TPPC_SUFFIX + paramMap.get(MesPcnExtConstWords.STRATEGY_CLASS) + MesPcnExtConstWords.SERVICE_SUFFIX)).doThirdPartyPlcCollectData(paramMap);
long endTime = System.currentTimeMillis();

@ -2,6 +2,7 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.collect;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import com.alibaba.fastjson.JSONObject;
import org.springframework.util.StringUtils;
import java.util.Map;
@ -10,34 +11,34 @@ import java.util.StringJoiner;
/**
* PLC--
*/
public class SxThirdPartyPlcCollectMonitorCellTaktHandler extends SxThirdPartyPlcCollectMonitorHandler {
public class SxThirdPartyPlcCollectCellTaktHandler extends SxThirdPartyPlcCollectMonitorHandler {
private volatile String plcCode2Flag;
private volatile String plcCode2Data;
public SxThirdPartyPlcCollectMonitorCellTaktHandler(String org, String key) {
super(org, key);
initStepResult();
}
private volatile String limit;
private void initStepResult() {
((Map<String, Object>) stepResult.getData()).put(MesPcnExtConstWords.BUSI_CODE, MesPcnExtConstWords.CELL_TAKT);
((Map<String, Object>) stepResult.getData()).put(MesPcnExtConstWords.WORK_CENTER_CODE, key.split(MesPcnExtConstWords.COLON)[2]);
((Map<String, Object>) stepResult.getData()).put(MesPcnExtConstWords.WORK_CELL_CODE, key.split(MesPcnExtConstWords.COLON)[3]);
public SxThirdPartyPlcCollectCellTaktHandler(String org, String key) {
super(org, key);
super.doSubmit();
}
@Override
public SxThirdPartyPlcCollectMonitorCellTaktHandler doRetry(Object obj) {
public SxThirdPartyPlcCollectCellTaktHandler doRetry(Object obj) {
super.doRetry(obj);
if (isRetry) return this;
String[] plcCodeArr = obj.toString().split(MesPcnExtConstWords.COMMA);
Map<String, String> paramMap = JSONObject.parseObject(obj.toString(), Map.class);
String[] plcCodeArr = paramMap.get(MesPcnExtConstWords.PLC_CODE_UC).split(MesPcnExtConstWords.COMMA);
String limit = paramMap.get(MesPcnExtConstWords.LIMIT);
if (StringUtils.isEmpty(plcCode2Flag) || !plcCode2Flag.equals(plcCodeArr[0])) plcCode2Flag = null;
if (StringUtils.isEmpty(plcCode2Data) || !plcCode2Data.equals(plcCodeArr[1])) plcCode2Data = null;
if (!StringUtils.isEmpty(plcCode2Flag) && !StringUtils.isEmpty(plcCode2Data)) return this;
if (null == this.limit || !this.limit.equals(limit)) this.limit = null;
if (!StringUtils.isEmpty(plcCode2Flag) && !StringUtils.isEmpty(plcCode2Data) && null != this.limit) return this;
isRetry = true;
this.plcCode2Flag = plcCodeArr[0];
this.plcCode2Data = plcCodeArr[1];
plcCode2Flag = plcCodeArr[0];
plcCode2Data = plcCodeArr[1];
this.limit = limit;
return this;
}
@ -46,7 +47,7 @@ public class SxThirdPartyPlcCollectMonitorCellTaktHandler extends SxThirdPartyPl
while (isOpen) {
if (StringUtils.isEmpty(plcCode2Flag) || StringUtils.isEmpty(plcCode2Data)) continue;
if (StringUtils.isEmpty(plcCode2Flag) || StringUtils.isEmpty(plcCode2Data) || null == limit) continue;
if (isRetry || null == filterChain) instanceFilterChain();
@ -61,7 +62,7 @@ public class SxThirdPartyPlcCollectMonitorCellTaktHandler extends SxThirdPartyPl
.add(new SxThirdPartyPlcCollectReadPlcStepService(plcCode2Flag).targetValue(new StringJoiner(MesPcnExtConstWords.COMMA).add(CommonEnumUtil.TRUE_OR_FALSE.TRUE.name().toLowerCase()).add(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr()).toString()))
.add(new SxThirdPartyPlcCollectReadPlcStepService(plcCode2Data))
.add(new SxThirdPartyPlcCollectWritePlcStepService(plcCode2Flag).targetValue(MesPcnExtConstWords.ZERO_STR))
.add(new SxThirdPartyPlcCollectCellTaktStepService().targetField(plcCode2Data));
.add(new SxThirdPartyPlcCollectCellTaktStepService().targetField(plcCode2Data).limit(limit));
isRetry = false;
}

@ -18,22 +18,24 @@ import java.util.stream.Collectors;
* PLC-
*/
@Slf4j
@Service
@Service(value = "SxThirdPartyPlcCollectCellTaktService")
public class SxThirdPartyPlcCollectCellTaktService implements ISxThirdPartyPlcCollectDataJobService {
@Autowired
private SxWorkCellTaktCollectPlcCfgRepository workCellTaktCollectPlcCfgRepository;
@Override
public void doThirdPartyPlcCollectData(Map<String, String> paramMap) {
public void doThirdPartyPlcCollectData(Map<String, Object> paramMap) {
String organizeCode = paramMap.get(MesPcnExtConstWords.ORGANIZE_CODE);
String organizeCode = (String) paramMap.get(MesPcnExtConstWords.ORGANIZE_CODE);
log.info("工厂{}第三方PLC数据采集 --- STRATEGY {} EXEC SERVICE START --- PARAM:{}", organizeCode, MesPcnExtConstWords.CELL_TAKT, paramMap.toString());
if (checkOrgIsStopMonitor(organizeCode, paramMap.get(MesPcnExtConstWords.STATUS))) return;
if (checkOrgIsStopMonitor(organizeCode, (String) paramMap.get(MesPcnExtConstWords.STATUS))) return;
Map<String, Object> cfgMap = getWorkCellTaktCollectPlcCfgList(organizeCode);
String limitCfg = paramMap.containsKey(MesPcnExtConstWords.LIMIT) ? (String) paramMap.get(MesPcnExtConstWords.LIMIT) : MesPcnExtConstWords.EMPTY;
Map<String, Object> cfgMap = getWorkCellTaktCollectPlcCfgList(organizeCode, limitCfg);
log.info("工厂{}第三方PLC数据采集 --- STRATEGY {} EXEC SERVICE --- CFGMAP:{}", organizeCode, MesPcnExtConstWords.CELL_TAKT, cfgMap.toString());
@ -52,7 +54,8 @@ public class SxThirdPartyPlcCollectCellTaktService implements ISxThirdPartyPlcCo
return true;
}
private Map<String, Object> getWorkCellTaktCollectPlcCfgList(String organizeCode) {
private Map<String, Object> getWorkCellTaktCollectPlcCfgList(String organizeCode, String limitCfg) {
String value = "{\"PLC_CODE\":\"%s\", \"LIMIT\":\"%s\"}";
List<SxWorkCellTaktCollectPlcCfg> workCellTaktCollectPlcCfgList = workCellTaktCollectPlcCfgRepository.findByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.STATUS},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()});
@ -64,7 +67,7 @@ public class SxThirdPartyPlcCollectCellTaktService implements ISxThirdPartyPlcCo
Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(SxWorkCellTaktCollectPlcCfg::getPlcCode))), ArrayList::new));
return CollectionUtils.isEmpty(workCellTaktCollectPlcCfgList) ? new HashMap<>() :
workCellTaktCollectPlcCfgList.stream().filter(o -> null != o).collect(Collectors.toMap(o ->
new StringJoiner(MesPcnExtConstWords.COLON).add(MesPcnExtConstWords.CELL_TAKT).add(organizeCode).add(o.getWorkCenterCode()).add(o.getWorkCellCode()).toString(), SxWorkCellTaktCollectPlcCfg::getPlcCode));
new StringJoiner(MesPcnExtConstWords.COLON).add(MesPcnExtConstWords.CELL_TAKT).add(organizeCode).add(o.getWorkCenterCode()).add(o.getWorkCellCode()).toString(), o -> String.format(value, o.getPlcCode(), limitCfg)));
}
}

@ -6,9 +6,11 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.SxWorkCellTaktCollectRecord;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.tool.MathOperation;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import cn.estsh.impp.framework.boot.util.SpringContextsUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import java.util.Map;
@ -22,6 +24,8 @@ public class SxThirdPartyPlcCollectCellTaktStepService implements ISxThirdPartyP
protected String targetField;
protected String limit;
public SxThirdPartyPlcCollectCellTaktStepService() {
this.workCellTaktCollectRecordService = (IJxWorkCellTaktCollectRecordService) SpringContextsUtil.getBean("jxWorkCellTaktCollectRecordService");
}
@ -31,18 +35,25 @@ public class SxThirdPartyPlcCollectCellTaktStepService implements ISxThirdPartyP
return this;
}
public SxThirdPartyPlcCollectCellTaktStepService limit(String limit) {
this.limit = limit;
return this;
}
@Override
public StepResult exec(StepResult stepResult) {
String organizeCode = (String) ((Map<String, Object>) stepResult.getData()).get(MesPcnExtConstWords.ORGANIZE_CODE);
String workCenterCode = (String) ((Map<String, Object>) stepResult.getData()).get(MesPcnExtConstWords.WORK_CENTER_CODE);
String workCellCode = (String) ((Map<String, Object>) stepResult.getData()).get(MesPcnExtConstWords.WORK_CELL_CODE);
Object targetValue = ((Map<String, Object>) stepResult.getData()).get(targetField);
String targetValue = (String) ((Map<String, Object>) stepResult.getData()).get(targetField);
if (!StringUtils.isEmpty(limit) && filter2Limit(targetValue)) return stepResult.isCompleted(false).msg(String.format("读取plcCode:%s 值:%s 不匹配LIMIT区间[%s]!", targetField, targetValue, limit));
SxWorkCellTaktCollectRecord workCellTaktCollectRecord = new SxWorkCellTaktCollectRecord();
workCellTaktCollectRecord.setWorkCenterCode(workCenterCode);
workCellTaktCollectRecord.setWorkCellCode(workCellCode);
workCellTaktCollectRecord.setWorkTakt(targetValue.toString());
workCellTaktCollectRecord.setWorkTakt(targetValue);
workCellTaktCollectRecord.setOrganizeCode(organizeCode);
workCellTaktCollectRecord.setSystemSyncStatus(MesPcnExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue());
ConvertBean.serviceModelInitialize(workCellTaktCollectRecord, MesPcnExtConstWords.JOB);
@ -51,4 +62,17 @@ public class SxThirdPartyPlcCollectCellTaktStepService implements ISxThirdPartyP
return stepResult;
}
private Boolean filter2Limit(String targetValue) {
if (!limit.contains(MesPcnExtConstWords.COMMA)) return false;
String[] limitArr = limit.split(MesPcnExtConstWords.COMMA);
if (limitArr.length != 2) return false;
try {
if (!StringUtils.isEmpty(limitArr[0]) && MathOperation.compareTo(Double.parseDouble(targetValue), Double.parseDouble(limitArr[0])) < 0) return true;
if (!StringUtils.isEmpty(limitArr[1]) && MathOperation.compareTo(Double.parseDouble(targetValue), Double.parseDouble(limitArr[1])) > 0) return true;
} catch (NumberFormatException e) {
return true;
}
return false;
}
}

@ -80,7 +80,7 @@ public class SxThirdPartyPlcCollectDispatchSingleton {
try {
Class clazz = Class.forName(new StringJoiner(MesPcnExtConstWords.DECIMAL_POINT_UNESCAPE)
.add(SxThirdPartyPlcCollectDispatchSingleton.class.getPackage().getName()).add(MesPcnExtConstWords.SX_TPPCM_SUFFIX + busiCode + MesPcnExtConstWords.HANDLER_SUFFIX).toString());
.add(SxThirdPartyPlcCollectDispatchSingleton.class.getPackage().getName()).add(MesPcnExtConstWords.SX_TPPC_SUFFIX + busiCode + MesPcnExtConstWords.HANDLER_SUFFIX).toString());
Constructor constructor = clazz.getConstructor(String.class, String.class);

@ -16,7 +16,7 @@ import java.util.concurrent.ExecutorService;
*/
public class SxThirdPartyPlcCollectMonitorHandler {
public volatile Boolean isOpen = true;
public volatile Boolean isOpen = false;
public volatile Boolean isRetry = false;
@ -35,25 +35,30 @@ public class SxThirdPartyPlcCollectMonitorHandler {
public SxThirdPartyPlcCollectStepFilterChain filterChain;
public SxThirdPartyPlcCollectMonitorHandler(String org, String key) {
this.org = org;
this.key = key;
Map<String, Object> dataMap = new HashMap<>();
dataMap.put(MesPcnExtConstWords.ORGANIZE_CODE, org);
dataMap.put(MesPcnExtConstWords.KEY, key);
stepResult = StepResult.getSuccessComplete().data(dataMap);
initStepResult();
executorService = SpringContextsUtil.getBean(ExecutorService.class);
}
public void doSubmit() {
isOpen = true;
ListeningExecutorService listenExecutor = MoreExecutors.listeningDecorator(executorService);
listenFuture = listenExecutor.submit(() -> {
execMonitor();
return null;
});
}
public void execMonitor() {}
public void initStepResult() {
Map<String, Object> dataMap = new HashMap<>();
dataMap.put(MesPcnExtConstWords.ORGANIZE_CODE, org);
dataMap.put(MesPcnExtConstWords.KEY, key);
dataMap.put(MesPcnExtConstWords.BUSI_CODE, key.split(MesPcnExtConstWords.COLON)[0]);
dataMap.put(MesPcnExtConstWords.WORK_CENTER_CODE, key.split(MesPcnExtConstWords.COLON)[2]);
dataMap.put(MesPcnExtConstWords.WORK_CELL_CODE, key.split(MesPcnExtConstWords.COLON)[3]);
stepResult = StepResult.getSuccessComplete().data(dataMap);
}
public SxThirdPartyPlcCollectMonitorHandler doRetry(Object obj) {
if (version == 0) version ++;
@ -61,9 +66,11 @@ public class SxThirdPartyPlcCollectMonitorHandler {
return this;
}
public void execMonitor() {}
public void cancel() {
isOpen = false;
if (null != listenFuture) listenFuture.cancel(true);
if (null != listenFuture && !listenFuture.isCancelled()) listenFuture.cancel(true);
}
public Boolean version() { return version == 1 ? true : false; }

@ -1,32 +0,0 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.collect;
/**
* PLC--
*/
public class SxThirdPartyPlcCollectMonitorProductDataHandler extends SxThirdPartyPlcCollectMonitorHandler {
private volatile String plcCode2Flag;
private volatile String plcCode2Data;
public SxThirdPartyPlcCollectMonitorProductDataHandler(String org, String key) {
super(org, key);
initStepResult();
}
private void initStepResult() {
}
@Override
public SxThirdPartyPlcCollectMonitorProductDataHandler doRetry(Object obj) {
return doRetry(obj);
}
@Override
public void execMonitor() {
}
}

@ -0,0 +1,162 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.collect;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.SxThirdPartyPlcCollectDataModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.api.iservice.busi.IShippingDispatchService;
import cn.estsh.i3plus.platform.common.util.MesPcnConstWords;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.impp.framework.boot.util.SpringContextsUtil;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.StringJoiner;
/**
* PLC--
*/
public class SxThirdPartyPlcCollectProductDataHandler extends SxThirdPartyPlcCollectMonitorHandler {
private Long startTime;
private Long endTime;
private StationRequestBean reqBean;
private volatile SxThirdPartyPlcCollectDataModel plcCollectData;
private IShippingDispatchService shippingDispatchService;
public SxThirdPartyPlcCollectProductDataHandler(String org, String key) {
super(org, key);
shippingDispatchService = (IShippingDispatchService) SpringContextsUtil.getBean("shippingDispatchService");
}
@Override
public SxThirdPartyPlcCollectProductDataHandler doRetry(Object obj) {
super.doRetry(obj);
if (isOpen) super.cancel();
SxThirdPartyPlcCollectDataModel plcCollectData = (SxThirdPartyPlcCollectDataModel) obj;
if (null == this.plcCollectData) this.plcCollectData = plcCollectData;
else if (compareToRetry(plcCollectData)) isRetry = true;
if (isRetry || null == filterChain) instanceFilterChain();
restoreStepResultData();
super.doSubmit();
return this;
}
@Override
public void execMonitor() {
startTime = System.currentTimeMillis();
while (isOpen) {
endTime = System.currentTimeMillis();
if (checkTimeOut()) return;
if (null == filterChain) continue;
stepResult = filterChain.exec(stepResult);
if (!stepResult.isCompleted()) continue;
doSendScanQueueNextExec();
return;
}
}
private Boolean compareToRetry(SxThirdPartyPlcCollectDataModel plcCollectData) {
if (this.plcCollectData.getPlcCode2PlcFlag().equals(plcCollectData.getPlcCode2PlcFlag())
&& this.plcCollectData.getPlcCode2PcnFlag().equals(plcCollectData.getPlcCode2PcnFlag())
&& this.plcCollectData.getPlcCode2DataList().containsAll(plcCollectData.getPlcCode2DataList())
&& plcCollectData.getPlcCode2DataList().containsAll(this.plcCollectData.getPlcCode2DataList())) return false;
this.plcCollectData = plcCollectData;
return true;
}
private void instanceFilterChain() {
filterChain = new SxThirdPartyPlcCollectStepFilterChain(org, key, MesPcnExtConstWords.PRODUCT_DATA)
.clearField(getClearField()).sleepTime2UnComplete(500L)
.add(new SxThirdPartyPlcCollectReadPlcStepService(plcCollectData.getPlcCode2PlcFlag()).targetValue(
new StringJoiner(MesPcnExtConstWords.COMMA).add(CommonEnumUtil.TRUE_OR_FALSE.TRUE.name().toLowerCase()).add(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr()).toString()))
.add(new SxThirdPartyPlcCollectReadPlcStepService(plcCollectData.getPlcCode2PcnFlag()).targetValue(
new StringJoiner(MesPcnExtConstWords.COMMA).add(CommonEnumUtil.TRUE_OR_FALSE.FALSE.name().toLowerCase()).add(MesPcnExtConstWords.ZERO_STR).toString()));
plcCollectData.getPlcCode2DataList().forEach(o -> filterChain.add(new SxThirdPartyPlcCollectReadPlcStepService(o)));
filterChain.add(new SxThirdPartyPlcCollectWritePlcStepService(plcCollectData.getPlcCode2PcnFlag()).targetValue(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr()))
.add(new SxThirdPartyPlcCollectProductDataStepService().targetField(plcCollectData.getPlcCode2DataList()));
isRetry = false;
}
private void restoreStepResultData() {
((Map<String, Object>) stepResult.getData()).remove(MesPcnExtConstWords.USER_INFO);
((Map<String, Object>) stepResult.getData()).remove(MesPcnExtConstWords.SERIAL_NUMBER);
((Map<String, Object>) stepResult.getData()).remove(MesPcnExtConstWords.PRODUCT_SN);
((Map<String, Object>) stepResult.getData()).remove(MesPcnExtConstWords.MANAGE_CODE);
((Map<String, Object>) stepResult.getData()).remove(MesPcnExtConstWords.WORK_ORDER_NO);
((Map<String, Object>) stepResult.getData()).remove(MesPcnExtConstWords.PART_NO);
((Map<String, Object>) stepResult.getData()).remove(MesPcnExtConstWords.PART_NAME_RDD);
((Map<String, Object>) stepResult.getData()).put(MesPcnExtConstWords.USER_INFO, plcCollectData.getUserInfo());
((Map<String, Object>) stepResult.getData()).put(MesPcnExtConstWords.SERIAL_NUMBER, plcCollectData.getSerialNumber());
((Map<String, Object>) stepResult.getData()).put(MesPcnExtConstWords.PRODUCT_SN, plcCollectData.getProductSn());
((Map<String, Object>) stepResult.getData()).put(MesPcnExtConstWords.MANAGE_CODE, plcCollectData.getManageCode());
((Map<String, Object>) stepResult.getData()).put(MesPcnExtConstWords.WORK_ORDER_NO, plcCollectData.getWorkOrderNo());
((Map<String, Object>) stepResult.getData()).put(MesPcnExtConstWords.PART_NO, plcCollectData.getPartNo());
((Map<String, Object>) stepResult.getData()).put(MesPcnExtConstWords.PART_NAME_RDD, plcCollectData.getPartNameRdd());
}
private String[] getClearField() {
List<String> clearFieldList = new ArrayList<>(plcCollectData.getPlcCode2DataList());
clearFieldList.add(0, plcCollectData.getPlcCode2PlcFlag());
clearFieldList.add(0, plcCollectData.getPlcCode2PcnFlag());
return clearFieldList.toArray(new String[clearFieldList.size()]);
}
private Boolean checkTimeOut() {
if (endTime - startTime < this.plcCollectData.getTimeOut()) return false;
stepResult.msg(String.format("%s当前采集已超时!", StringUtils.isEmpty(stepResult.getMsg()) ? MesPcnExtConstWords.EMPTY : stepResult.getMsg()));
doSendScanQueueNextExec();
return true;
}
private void doSendScanQueueNextExec() {
initStationRequestBean();
reqBean.getDataMap().put(MesPcnExtConstWords.RESULT, stepResult.isCompleted());
if (!StringUtils.isEmpty(stepResult.getMsg())) reqBean.getDataMap().put(MesPcnExtConstWords.INFO, stepResult.getMsg());
shippingDispatchService.doSendScanQueueNextExec(reqBean);
}
private void initStationRequestBean() {
if (null == reqBean) {
reqBean = new StationRequestBean(plcCollectData.getOrganizeCode(), plcCollectData.getWorkCenterCode(), plcCollectData.getWorkCellCode());
reqBean.setClientInfo(shippingDispatchService.getActorClientInfo(reqBean));
reqBean.setTriggerAutoFsm(true);
reqBean.setInterfaceType(MesPcnConstWords.SHIPPING);
reqBean.setBusiType(MesPcnConstWords.WS_CMD_DO_SCAN);
} else {
reqBean.getDataMap().remove(MesPcnExtConstWords.RESULT);
reqBean.getDataMap().remove(MesPcnExtConstWords.INFO);
}
}
}

@ -0,0 +1,34 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.collect;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.ISxThirdPartyPlcCollectDataJobService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Map;
/**
* PLC-
*/
@Slf4j
@Service(value = "SxThirdPartyPlcCollectProductDataService")
public class SxThirdPartyPlcCollectProductDataService implements ISxThirdPartyPlcCollectDataJobService {
@Override
public void doThirdPartyPlcCollectData(Map<String, Object> paramMap) {
String[] keyArr = new ArrayList<>(paramMap.keySet()).get(0).split(MesPcnExtConstWords.COLON);
log.info("工厂{}第三方PLC数据采集 --- STRATEGY {} EXEC SERVICE START --- PARAM:{}", keyArr[1], keyArr[0], JSONObject.toJSONString(paramMap));
if (!SxThirdPartyPlcCollectDispatchSingleton.getIsInit()) SxThirdPartyPlcCollectDispatchSingleton.getInstance();
SxThirdPartyPlcCollectDispatchSingleton.execMonitor(keyArr[1], keyArr[0], paramMap, false);
log.info("工厂{}第三方PLC数据采集 --- STRATEGY {} EXEC SERVICE END ---", keyArr[1], keyArr[0]);
}
}

@ -0,0 +1,108 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.collect;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.ISxThirdPartyPlcCollectDataStepService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxPlcExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProductDataService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.pojo.mes.bean.MesObjectCfg;
import cn.estsh.i3plus.pojo.mes.bean.MesProductData;
import cn.estsh.i3plus.pojo.mes.model.ProductDataModel;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import cn.estsh.impp.framework.boot.util.SpringContextsUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* PLC------
*/
@Slf4j
public class SxThirdPartyPlcCollectProductDataStepService implements ISxThirdPartyPlcCollectDataStepService {
private IJxPlcExtService plcExtService;
private IJxProductDataService productDataService;
protected List<String> targetFieldList;
public SxThirdPartyPlcCollectProductDataStepService() {
this.plcExtService = (IJxPlcExtService) SpringContextsUtil.getBean("jxPlcExtService");
this.productDataService = (IJxProductDataService) SpringContextsUtil.getBean("jxProductDataService");
}
public SxThirdPartyPlcCollectProductDataStepService targetField(List<String> targetFieldList) {
this.targetFieldList = targetFieldList;
return this;
}
@Override
public StepResult exec(StepResult stepResult) {
String organizeCode = (String) ((Map<String, Object>) stepResult.getData()).get(MesPcnExtConstWords.ORGANIZE_CODE);
String userInfo = (String) ((Map<String, Object>) stepResult.getData()).get(MesPcnExtConstWords.USER_INFO);
String workCenterCode = (String) ((Map<String, Object>) stepResult.getData()).get(MesPcnExtConstWords.WORK_CENTER_CODE);
String workCellCode = (String) ((Map<String, Object>) stepResult.getData()).get(MesPcnExtConstWords.WORK_CELL_CODE);
String serialNumber = (String) ((Map<String, Object>) stepResult.getData()).get(MesPcnExtConstWords.SERIAL_NUMBER);
String productSn = (String) ((Map<String, Object>) stepResult.getData()).get(MesPcnExtConstWords.PRODUCT_SN);
String manageCode = (String) ((Map<String, Object>) stepResult.getData()).get(MesPcnExtConstWords.MANAGE_CODE);
String workOrderNo = (String) ((Map<String, Object>) stepResult.getData()).get(MesPcnExtConstWords.WORK_ORDER_NO);
String partNo = (String) ((Map<String, Object>) stepResult.getData()).get(MesPcnExtConstWords.PART_NO);
String partNameRdd = (String) ((Map<String, Object>) stepResult.getData()).get(MesPcnExtConstWords.PART_NAME_RDD);
String key = (String) ((Map<String, Object>) stepResult.getData()).get(MesPcnExtConstWords.KEY);
String objectCfgStr = plcExtService.getCachedData(key, MesPcnExtConstWords.OBJECT_CODE_UC);
if (StringUtils.isEmpty(objectCfgStr)) return stepResult.isCompleted(false).msg(String.format("生产线[%s]工位[%s]缓存信息缺失对象结构信息!", workCenterCode, workCellCode));
List<MesObjectCfg> objectCfgList = JSONObject.parseArray(objectCfgStr, MesObjectCfg.class);
if (CollectionUtils.isEmpty(objectCfgList)) return stepResult.isCompleted(false).msg(String.format("生产线[%s]工位[%s]缓存信息缺失有效的对象结构信息!", workCenterCode, workCellCode));
Map<String, List<MesObjectCfg>> objectCodeMap = objectCfgList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesObjectCfg::getObjectCode));
List<MesProductData> productDataList = new ArrayList<>();
for (String objectCode : objectCodeMap.keySet()) {
if (StringUtils.isEmpty(objectCode)) continue;
MesProductData productData = new MesProductData();
productData.setOrganizeCode(organizeCode);
productData.setWorkCenterCode(workCenterCode);
productData.setWorkCellCode(workCellCode);
productData.setSerialNumber(serialNumber);
productData.setProductSn(productSn);
productData.setGroupNo(manageCode);
productData.setPartNo(partNo);
productData.setPartDesc(partNameRdd);
productData.setOrderNo(workOrderNo);
productData.setObjectCode(objectCode);
productData.setLineData(JSON.toJSONString(getLineDataList(stepResult, objectCodeMap.get(objectCode))));
productData.setSystemSyncStatus(MesPcnExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue());
ConvertBean.serviceModelInitialize(productData, userInfo);
productDataList.add(productData);
}
productDataService.insertProductDataNoRollback(productDataList);
return stepResult;
}
private List<ProductDataModel> getLineDataList(StepResult stepResult, List<MesObjectCfg> objectCfgList) {
List<ProductDataModel> lineDataList = new ArrayList<>();
for (MesObjectCfg objectCfg : objectCfgList) {
if (null == objectCfg) continue;
ProductDataModel productDataModel = new ProductDataModel();
productDataModel.setFieldCode(objectCfg.getFieldCode());
productDataModel.setFieldName(objectCfg.getFieldName());
productDataModel.setFieldValue((String) ((Map<String, Object>) stepResult.getData()).get(objectCfg.getPlcCode()));
lineDataList.add(productDataModel);
}
return lineDataList;
}
}

@ -41,15 +41,15 @@ public class SxThirdPartyPlcCollectReadPlcStepService implements ISxThirdPartyPl
String key = (String) ((Map<String, Object>) stepResult.getData()).get(MesPcnExtConstWords.KEY);
MesPlc plc = plcExtService.getPlcData(organizeCode, plcCode, key);
MesPlc plc = plcExtService.getPlcData(organizeCode, key, plcCode);
if (null == plc || (StringUtils.isEmpty(plc.getChannel()) || StringUtils.isEmpty(plc.getDevice()) || StringUtils.isEmpty(plc.getTagAddress()))) return stepResult.isCompleted(false).msg(String.format("读取plcCode:%s 配置无效", plcCode));
if (null == plc || (StringUtils.isEmpty(plc.getChannel()) || StringUtils.isEmpty(plc.getDevice()) || StringUtils.isEmpty(plc.getTagAddress()))) return stepResult.isCompleted(false).msg(String.format("读取plcCode:%s 配置无效!", plcCode));
Object value = plcExtService.doReadOpcParamValue(plc);
((Map<String, Object>) stepResult.getData()).put(plcCode, value);
if (StringUtils.isEmpty(value) || (!StringUtils.isEmpty(targetValue) && !Arrays.asList(targetValue.split(MesPcnExtConstWords.COMMA)).contains(value.toString()))) return stepResult.isCompleted(false).msg(String.format("读取plcCode:%s 值无效", plcCode));
if (StringUtils.isEmpty(value) || (!StringUtils.isEmpty(targetValue) && !Arrays.asList(targetValue.split(MesPcnExtConstWords.COMMA)).contains(value.toString()))) return stepResult.isCompleted(false).msg(String.format("读取plcCode:%s 值无效!", plcCode));
return stepResult;
}

@ -56,6 +56,8 @@ public class SxThirdPartyPlcCollectStepFilterChain implements ISxThirdPartyPlcCo
@Override
public StepResult exec(StepResult stepResult) {
rollBackStepResult(stepResult);
LOGGER.info(String.format("工厂%s第三方PLC数据采集 --- STRATEGY %s STEP EXEC --- key: %s START --- stepResult:%s ---", org, busiCode, key, JSONObject.toJSONString(stepResult)));
try {
@ -74,17 +76,18 @@ public class SxThirdPartyPlcCollectStepFilterChain implements ISxThirdPartyPlcCo
LOGGER.info(String.format("工厂%s第三方PLC数据采集 --- STRATEGY %s STEP EXEC --- key: %s END --- stepResult:%s ---", org, busiCode, key, JSONObject.toJSONString(stepResult)));
return rollBackStepResult(stepResult);
return stepResult;
}
private StepResult rollBackStepResult(StepResult stepResult) {
stepResult.isCompleted(true).msg(null);
if (null == clearField) return stepResult;
for (String field : clearField) {
if (StringUtils.isEmpty(field)) continue;
((Map<String, Object>) stepResult.getData()).remove(field);
}
return stepResult.isCompleted(true).msg(null);
return stepResult;
}
}

@ -36,21 +36,21 @@ public class SxThirdPartyPlcCollectWritePlcStepService implements ISxThirdPartyP
@Override
public StepResult exec(StepResult stepResult) {
if (StringUtils.isEmpty(targetValue)) return stepResult.isCompleted(false).msg(String.format("写入plcCode:%s 参数缺失目标值", plcCode));
if (StringUtils.isEmpty(targetValue)) return stepResult.isCompleted(false).msg(String.format("写入plcCode:%s 参数缺失目标值!", plcCode));
String organizeCode = (String) ((Map<String, Object>) stepResult.getData()).get(MesPcnExtConstWords.ORGANIZE_CODE);
String key = (String) ((Map<String, Object>) stepResult.getData()).get(MesPcnExtConstWords.KEY);
MesPlc plc = plcExtService.getPlcData(organizeCode, plcCode, key);
MesPlc plc = plcExtService.getPlcData(organizeCode, key, plcCode);
if (null == plc || (StringUtils.isEmpty(plc.getChannel()) || StringUtils.isEmpty(plc.getDevice()) || StringUtils.isEmpty(plc.getTagAddress()))) return stepResult.isCompleted(false).msg(String.format("写入plcCode:%s 配置无效", plcCode));
if (null == plc || (StringUtils.isEmpty(plc.getChannel()) || StringUtils.isEmpty(plc.getDevice()) || StringUtils.isEmpty(plc.getTagAddress()))) return stepResult.isCompleted(false).msg(String.format("写入plcCode:%s 配置无效!", plcCode));
Boolean value = plcExtService.doWriteOpcParamValue(plc, targetValue);
((Map<String, Object>) stepResult.getData()).put(plcCode, value);
if (StringUtils.isEmpty(value) || !value) return stepResult.isCompleted(false).msg(String.format("写入plcCode:%s 失败", plcCode));
if (StringUtils.isEmpty(value) || !value) return stepResult.isCompleted(false).msg(String.format("写入plcCode:%s 失败!", plcCode));
return stepResult;
}

@ -8,15 +8,20 @@ import cn.estsh.i3plus.platform.plugin.opc.service.OpcUAService;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.hardswitch.bean.OpcUAParam;
import cn.estsh.i3plus.pojo.mes.bean.MesObjectCfg;
import cn.estsh.i3plus.pojo.mes.bean.MesPlc;
import cn.estsh.i3plus.pojo.mes.repository.MesObjectCfgRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesPlcRepository;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.text.MessageFormat;
import java.util.List;
import java.util.stream.Collectors;
/**
* @Author: wangjie
@ -30,6 +35,9 @@ public class JxPlcExtService implements IJxPlcExtService {
@Autowired
private MesPlcRepository plcRepository;
@Autowired
private MesObjectCfgRepository objectCfgRepository;
@Override
public MesPlc getPlcDb(String organizeCode, String plcCode) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(plcCode)) return null;
@ -39,6 +47,14 @@ public class JxPlcExtService implements IJxPlcExtService {
}
@Override
public List<MesPlc> getPlcDbList(String organizeCode, String workCenterCode, String workCellCode) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workCenterCode) || StringUtils.isEmpty(workCellCode)) return null;
return plcRepository.findByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.WORK_CENTER_CODE, MesPcnExtConstWords.WORK_CELL_CODE},
new Object[]{organizeCode, CommonEnumUtil.IS_VAILD.VAILD.getValue(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), workCenterCode, workCellCode});
}
@Override
public Object doReadOpcParamValue(MesPlc plc) {
IOpcUAService opcService = new OpcUAService();
String tagAddress = MessageFormat.format("{0}.{1}.{2}", plc.getChannel(), plc.getDevice(), plc.getTagAddress());
@ -66,12 +82,33 @@ public class JxPlcExtService implements IJxPlcExtService {
}
@Override
public MesPlc getPlcData(String organizeCode, String plcCode, String key) {
WorkCellDataCacheDispatch dispatch = new WorkCellDataCacheDispatch.builder().key(key).item(plcCode).build().get();
if (!StringUtils.isEmpty(dispatch.getValue())) return JSONObject.parseObject(dispatch.getValue(), MesPlc.class);
public MesPlc getPlcData(String organizeCode, String key, String plcCode) {
String value = getCachedData(key, plcCode);
if (!StringUtils.isEmpty(value)) return JSONObject.parseObject(value, MesPlc.class);
MesPlc plc = getPlcDb(organizeCode, plcCode);
if (null == plc) plc = new MesPlc();
new WorkCellDataCacheDispatch.builder().key(key).item(plcCode).value(JSONObject.toJSONString(plc)).timeSecond(MesPcnEnumUtil.EXPIRE_TIME.NEVER.getValue()).org(organizeCode).build().save();
doCacheData(organizeCode, key, plcCode, JSONObject.toJSONString(plc));
return plc;
}
@Override
public String getCachedData(String key, String item) {
return new WorkCellDataCacheDispatch.builder().key(key).item(item).build().get().getValue();
}
@Override
public void doCacheData(String organizeCode, String key, String item, String data) {
new WorkCellDataCacheDispatch.builder().key(key).item(item).value(data).timeSecond(MesPcnEnumUtil.EXPIRE_TIME.NEVER.getValue()).org(organizeCode).build().save();
}
@Override
public List<MesObjectCfg> getObjectCfgDbList(String organizeCode, List<String> plcCodeList) {
if (StringUtils.isEmpty(organizeCode)) return null;
List<MesObjectCfg> objectCfgDbList = objectCfgRepository.findByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.IS_DELETED},
new Object[]{organizeCode, CommonEnumUtil.IS_VAILD.VAILD.getValue(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()});
objectCfgDbList = CollectionUtils.isEmpty(objectCfgDbList) ? null :
objectCfgDbList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getPlcCode()) && plcCodeList.contains(o.getPlcCode()))).collect(Collectors.toList());
return objectCfgDbList;
}
}

@ -0,0 +1,28 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.jx;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProductDataService;
import cn.estsh.i3plus.pojo.mes.bean.MesProductData;
import cn.estsh.i3plus.pojo.mes.repository.MesProductDataRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @Author: wangjie
* @CreateDate: 2021/01/18 11:41
* @Description:
**/
@Slf4j
@Service
public class JxProductDataService implements IJxProductDataService {
@Autowired
private MesProductDataRepository productDataRepository;
@Override
public void insertProductDataNoRollback(List<MesProductData> productDataList) {
productDataList.forEach(o -> productDataRepository.insert(o));
}
}

@ -1,13 +1,35 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.step.jx;
import cn.estsh.i3plus.ext.mes.pcn.api.base.ISxWorkOrderExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.ISxThirdPartyPlcCollectDataJobService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxPlcExtService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.station.jx.JxSnProcessingModuleService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesWorkOrderExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.SxThirdPartyPlcCollectDataModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.WorkOrderExtModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmCommonService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.base.BaseStepService;
import cn.estsh.i3plus.pojo.mes.bean.MesObjectCfg;
import cn.estsh.i3plus.pojo.mes.bean.MesPlc;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import cn.estsh.impp.framework.boot.util.SpringContextsUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringJoiner;
import java.util.stream.Collectors;
/**
* @Description :
* @Reference :
@ -19,21 +41,153 @@ import org.springframework.util.StringUtils;
@Service("jxSnProcessingCollectProductDataStepService")
public class JxSnProcessingCollectProductDataStepService extends BaseStepService {
@Autowired
private ISxWorkOrderExtService workOrderExtService;
@Autowired
private JxSnProcessingModuleService snProcessingModuleService;
@Autowired
private IJxPlcExtService plcExtService;
@Autowired
private IFsmCommonService fsmCommonService;
@Override
public StepResult execute(StationRequestBean reqBean) {
log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnProcessingCollectProductDataStepService --- START --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
StepResult stepResult = StepResult.getSuccessComplete();
StationResultBean resultBean = new StationResultBean();
if (StringUtils.isEmpty(reqBean.getSerialNumber()) && StringUtils.isEmpty(reqBean.getProductSn())) return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, "入参缺少过程条码或产品条码!");
if (StringUtils.isEmpty(reqBean.getSerialNumber()) && StringUtils.isEmpty(reqBean.getProductSn())) return execNonCompleteAndSendMsgReturn(reqBean, resultBean, "入参缺少过程条码或产品条码!");
String suffixSn = StringUtils.isEmpty(reqBean.getProductSn()) ? getManageCode(reqBean.getTray(), 1) : reqBean.getProductSn();
String suffix = String.format("当前产品:%s[%s]", StringUtils.isEmpty(reqBean.getProductSn()) ? "管理编码" : "产品条码", suffixSn);
Boolean result = (Boolean) reqBean.getDataMap().get(MesPcnExtConstWords.RESULT);
if (null == result) execCollectProductData(reqBean, resultBean, suffix);
String msg = (String) reqBean.getDataMap().get(MesPcnExtConstWords.INFO);
reqBean.getDataMap().remove(MesPcnExtConstWords.RESULT);
reqBean.getDataMap().remove(MesPcnExtConstWords.INFO);
log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnProcessingCollectProductDataStepService --- SUCCESS --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
return stepResult;
if (result) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, String.format("%s检测数据采集完成!", suffix));
else return execNonCompleteAndSendMsgReturn(reqBean, resultBean, String.format("%s检测数据采集失败!%s", suffix, msg));
}
private void execCollectProductData(StationRequestBean reqBean, StationResultBean resultBean, String suffix) {
fsmCommonService.checkWcpcMapForDoScan(reqBean);
String plcCodes = fsmCommonService.getAndCheckWcpcMapIsContainsKey(reqBean, reqBean.getWcpcMap(), MesPcnExtConstWords.PLC_CODE_UC);
if (StringUtils.isEmpty(plcCodes)) foundExThrowNoShowMsg();
String key = new StringJoiner(MesPcnExtConstWords.COLON).add(MesPcnExtConstWords.PRODUCT_DATA).add(reqBean.getOrganizeCode()).add(reqBean.getWorkCenterCode()).add(reqBean.getWorkCellCode()).toString();
String[] plcCodeArr = checkPlcCodeIsValid(reqBean, resultBean, plcCodes, key);
List<String> plcCodeList = doHandlePlcCodeList(reqBean, resultBean, key);
checkObjectCfgIsValid(reqBean, resultBean, plcCodeList, key);
String curExecWorkOrderNo = getCurExecWorkOrderNo(reqBean, resultBean);
WorkOrderExtModel orderModel = getWorkOrderExtModel(reqBean, resultBean, curExecWorkOrderNo);
Map<String, Object> paramMap = new HashMap<>();
paramMap.put(key, new SxThirdPartyPlcCollectDataModel().userInfo(reqBean.getUserInfo())
.location(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode())
.order(orderModel.getOrderNo(), orderModel.getPartNo(), orderModel.getPartNameRdd())
.sn(reqBean.getSerialNumber(), reqBean.getProductSn()).manageCode(reqBean.getTray())
.plcCode2Flag(plcCodeArr[0], plcCodeArr[1]).plcCode2DataList(plcCodeList)
.timeOut(reqBean.getWcpcMap().get(MesPcnExtConstWords.TIME_OUT_CFG)));
((ISxThirdPartyPlcCollectDataJobService) SpringContextsUtil.getBean(MesPcnExtConstWords.SX_TPPC_SUFFIX + MesPcnExtConstWords.PRODUCT_DATA + MesPcnExtConstWords.SERVICE_SUFFIX)).doThirdPartyPlcCollectData(paramMap);
execSendMsgAndThrowEx(reqBean, resultBean, String.format("%s检测数据正在采集中...", suffix));
}
private String[] checkPlcCodeIsValid(StationRequestBean reqBean, StationResultBean resultBean, String plcCodes, String key) {
String[] plcCodeArr = plcCodes.split(MesPcnExtConstWords.COMMA);
if (plcCodeArr.length != 2) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("生产线[%s]工位[%s]工位参数[%s]维护的PLC代码[%s]无效!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), MesPcnExtConstWords.PLC_CODE_UC, plcCodes));
for (String plcCode : plcCodeArr) {
MesPlc plc = plcExtService.getPlcData(reqBean.getOrganizeCode(), key, plcCode);
if (null == plc || (StringUtils.isEmpty(plc.getChannel()) || StringUtils.isEmpty(plc.getDevice()) || StringUtils.isEmpty(plc.getTagAddress())))
execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("生产线[%s]工位[%s]工位参数[%s]维护的PLC代码[%s]其中[%s]未配置有效的PLC信息!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), MesPcnExtConstWords.PLC_CODE_UC, plcCodes, plcCode));
}
return plcCodeArr;
}
private List<String> doHandlePlcCodeList(StationRequestBean reqBean, StationResultBean resultBean, String key) {
String value = plcExtService.getCachedData(key, MesPcnExtConstWords.PLC_CODE_UC);
if (!StringUtils.isEmpty(value)) return JSONObject.parseArray(value, String.class);
List<MesPlc> plcList = plcExtService.getPlcDbList(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
plcList = CollectionUtils.isEmpty(plcList) ? null : plcList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getObjectCode()) && !StringUtils.isEmpty(o.getChannel()) && !StringUtils.isEmpty(o.getDevice()) && !StringUtils.isEmpty(o.getTagAddress()))).collect(Collectors.toList());
if (CollectionUtils.isEmpty(plcList)) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("生产线[%s]工位[%s]未配置有效的数据位PLC信息!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()));
plcList.forEach(o -> plcExtService.doCacheData(reqBean.getOrganizeCode(), key, o.getPlcCode(), JSONObject.toJSONString(o)));
List<String> plcCodeList = plcList.stream().filter(o -> null != o).map(MesPlc::getPlcCode).collect(Collectors.toList());
plcExtService.doCacheData(reqBean.getOrganizeCode(), key, MesPcnExtConstWords.PLC_CODE_UC, JSONObject.toJSONString(plcCodeList));
return plcCodeList;
}
private void checkObjectCfgIsValid(StationRequestBean reqBean, StationResultBean resultBean, List<String> plcCodeList, String key) {
String value = plcExtService.getCachedData(key, MesPcnExtConstWords.OBJECT_CODE_UC);
List<MesObjectCfg> objectCfgList = !StringUtils.isEmpty(value) ? JSONObject.parseArray(value, MesObjectCfg.class) : getObjectCfgDbList(reqBean, resultBean, plcCodeList);
List<String> plcCodeList2ObjectCfg = CollectionUtils.isEmpty(objectCfgList) ? null : objectCfgList.stream().filter(o -> null != o).map(MesObjectCfg::getPlcCode).collect(Collectors.toList());
plcCodeList2ObjectCfg = CollectionUtils.isEmpty(plcCodeList2ObjectCfg) ? null : plcCodeList2ObjectCfg.stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList());
if (CollectionUtils.isEmpty(plcCodeList2ObjectCfg)) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("生产线[%s]工位[%s]配置的数据位PLC信息未关联有效的对象结构信息!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()));
if (plcCodeList2ObjectCfg.size() != plcCodeList.size()) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("生产线[%s]工位[%s]配置的部分数据位PLC信息未关联有效的对象结构信息!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()));
if (StringUtils.isEmpty(value)) plcExtService.doCacheData(reqBean.getOrganizeCode(), key, MesPcnExtConstWords.OBJECT_CODE_UC, JSONObject.toJSONString(objectCfgList));
}
private List<MesObjectCfg> getObjectCfgDbList(StationRequestBean reqBean, StationResultBean resultBean, List<String> plcCodeList) {
List<MesObjectCfg> objectCfgList = plcExtService.getObjectCfgDbList(reqBean.getOrganizeCode(), plcCodeList);
if (CollectionUtils.isEmpty(objectCfgList)) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("生产线[%s]工位[%s]配置的数据位PLC信息未维护有效的对象结构信息!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()));
return objectCfgList;
}
private String getCurExecWorkOrderNo(StationRequestBean reqBean, StationResultBean resultBean) {
String curExecWorkOrderNo = (String) snProcessingModuleService.doHandleCurExecWorkOrder(reqBean, 1, null);
if (StringUtils.isEmpty(curExecWorkOrderNo)) execExpSendMsgAndThrowEx(reqBean, resultBean, "此前操作的工单号已丢失,请选择启动状态的生产工单!");
return curExecWorkOrderNo;
}
private WorkOrderExtModel getWorkOrderExtModel(StationRequestBean reqBean, StationResultBean resultBean, String curExecWorkOrderNo) {
WorkOrderExtModel orderModel = !reqBean.getDataMap().containsKey(MesPcnExtConstWords.WORK_ORDER) ? null :
JSONObject.parseObject(JSONObject.toJSONString(reqBean.getDataMap().get(MesPcnExtConstWords.WORK_ORDER)), WorkOrderExtModel.class);
if (null == orderModel) {
MesWorkOrderExt workOrderExt = workOrderExtService.getWorkOrderExtByOrderNo(reqBean.getOrganizeCode(), curExecWorkOrderNo);
if (null != workOrderExt) {
orderModel = new WorkOrderExtModel();
BeanUtils.copyProperties(workOrderExt, orderModel, MesPcnExtConstWords.ID);
}
}
if (null == orderModel) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("此前操作的工单号[%s]对应的信息不存在!", curExecWorkOrderNo));
return orderModel;
}
private String getManageCode(String manageCode, Integer length) {
if (StringUtils.isEmpty(manageCode)) return null;
String[] manageCodeArr = manageCode.split(MesPcnExtConstWords.AND);
if (manageCodeArr.length >= length) return manageCodeArr[length - 1];
else return null;
}
}

@ -0,0 +1,102 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.model;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import org.springframework.util.StringUtils;
import java.io.Serializable;
import java.util.List;
@Data
public class SxThirdPartyPlcCollectDataModel implements Serializable {
private static final long serialVersionUID = -1649994009292535386L;
@ApiParam("工厂代码")
public String organizeCode;
@ApiParam("操作人")
public String userInfo;
@ApiParam("生产线代码")
private String workCenterCode;
@ApiParam("工位代码")
private String workCellCode;
@ApiParam("过程条码")
private String serialNumber;
@ApiParam("产品条码")
private String productSn;
@ApiParam("管理码")
private String manageCode;
@ApiParam("生产工单")
private String workOrderNo;
@ApiParam("物料号")
private String partNo;
@ApiParam("物料名称")
private String partNameRdd;
@ApiParam("超时时间")
private Long timeOut = 60000L;
@ApiParam("PLC标志位代码")
private String plcCode2PlcFlag;
@ApiParam("PCN标志位代码")
private String plcCode2PcnFlag;
@ApiParam("数据位PLC代码集合")
private List<String> plcCode2DataList;
public SxThirdPartyPlcCollectDataModel location(String organizeCode, String workCenterCode, String workCellCode) {
this.organizeCode = organizeCode;
this.workCenterCode = workCenterCode;
this.workCellCode = workCellCode;
return this;
}
public SxThirdPartyPlcCollectDataModel userInfo(String userInfo) {
this.userInfo = userInfo;
return this;
}
public SxThirdPartyPlcCollectDataModel order(String workOrderNo, String partNo, String partNameRdd) {
this.workOrderNo = workOrderNo;
this.partNo = partNo;
this.partNameRdd = partNameRdd;
return this;
}
public SxThirdPartyPlcCollectDataModel sn(String serialNumber, String productSn) {
this.serialNumber = serialNumber;
this.productSn = productSn;
return this;
}
public SxThirdPartyPlcCollectDataModel manageCode(String manageCode) {
this.manageCode = manageCode;
return this;
}
public SxThirdPartyPlcCollectDataModel timeOut(Object timeOut) {
if (!StringUtils.isEmpty(timeOut)) this.timeOut = Long.valueOf(timeOut.toString());
return this;
}
public SxThirdPartyPlcCollectDataModel plcCode2Flag(String plcCode2PlcFlag, String plcCode2PcnFlag) {
this.plcCode2PlcFlag = plcCode2PlcFlag;
this.plcCode2PcnFlag = plcCode2PcnFlag;
return this;
}
public SxThirdPartyPlcCollectDataModel plcCode2DataList(List<String> plcCode2DataList) {
this.plcCode2DataList = plcCode2DataList;
return this;
}
}

@ -271,6 +271,8 @@ public class MesPcnExtConstWords {
public static final String PLC_CODE = "plcCode";
//对象代码
public static final String OBJECT_CODE = "objectCode";
//对象代码
public static final String OBJECT_CODE_UC = "OBJECT_CODE";
//字段代码
public static final String FIELD_CODE = "fieldCode";
//检查类型
@ -1030,12 +1032,16 @@ public class MesPcnExtConstWords {
//生产数据
public final static String PRODUCT_DATA = "ProductData";
public final static String SX_TPPCM_SUFFIX = "SxThirdPartyPlcCollectMonitor";
public final static String SX_TPPC_SUFFIX = "SxThirdPartyPlcCollect";
public final static String HANDLER_SUFFIX = "Handler";
public final static String SERVICE_SUFFIX = "Service";
//业务代码
public static final String BUSI_CODE = "BUSI_CODE";
//超时时间配置
public static final String TIME_OUT_CFG = "TIME_OUT_CFG";
//工序合并工位参数配置
public static final String PROCESS_MERGE_FLAG = "PROCESS_MERGE_FLAG";

Loading…
Cancel
Save