work cell takt collect

dev
王杰 1 year ago
parent 30ae5a9eba
commit a165129bc6

@ -0,0 +1,25 @@
package cn.estsh.i3plus.ext.mes.pcn.api.busi;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
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;
/**
* @Author: wangjie
* @CreateDate: 2021/01/18 11:22
* @Description:
**/
public interface ISxThirdPartyPlcCollectDataStepService {
/**
* PLC---
* @param objs
* @return
*/
@ApiOperation(value = "第三方PLC数据采集定时任务---步骤执行", notes = "第三方PLC数据采集定时任务---步骤执行")
@Transactional(propagation = Propagation.REQUIRES_NEW, noRollbackFor = {ImppBusiException.class, Exception.class})
StepResult exec(Object... objs);
}

@ -34,7 +34,6 @@ public class SxThirdPartyPlcCollectDataJob implements Job {
Map<String, String> paramMap = JSONObject.parseObject(param.toString(), Map.class);
if (!paramMap.containsKey(MesPcnExtConstWords.ORGANIZE_CODE) || !paramMap.containsKey(MesPcnExtConstWords.STRATEGY_CLASS)) return;
if (!paramMap.containsKey(MesPcnExtConstWords.USER_INFO)) paramMap.put(MesPcnExtConstWords.USER_INFO, MesPcnExtConstWords.JOB);
long startTime = System.currentTimeMillis();

@ -0,0 +1,73 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.collect;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
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.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
/**
*
*/
@Slf4j
public class SxCellTaktDispatchSingleton {
protected volatile static Boolean isInit = false;
private static class SxCellTaktDispatchHolder { private final static SxCellTaktDispatchSingleton INSTANCE = new SxCellTaktDispatchSingleton(); }
public static SxCellTaktDispatchSingleton getInstance() { return SxCellTaktDispatchHolder.INSTANCE; }
private SxCellTaktDispatchSingleton() { isInit = true; }
private volatile static Map<String, SxCellTaktMonitorHandler> cellTaktMonitorMap = new ConcurrentHashMap<>();
public static Boolean getIsInit() { return isInit; }
public static synchronized void execMonitor(String org, Map<String, String> cfgMap) {
if (CollectionUtils.isEmpty(cfgMap)) execMonitorRemove(getCellTaktMonitorMapKeyList(org));
else execMonitorCompareToCfg(org, cfgMap);
}
private static void execMonitorRemove(List<String> removeKeyList) {
if (!CollectionUtils.isEmpty(removeKeyList)) removeKeyList.stream().forEach(SxCellTaktDispatchSingleton::execMonitorRemove);
}
private static void execMonitorCompareToCfg(String org, Map<String, String> cfgMap) {
List<String> cellTaktMonitorMapKeyList = getCellTaktMonitorMapKeyList(org);
List<String> removeKeyList = CollectionUtils.isEmpty(cellTaktMonitorMapKeyList) ? null : cellTaktMonitorMapKeyList.stream().filter(o -> (!StringUtils.isEmpty(o) && !cfgMap.containsKey(o))).collect(Collectors.toList());
execMonitorRemove(removeKeyList);
execMonitorCompute(org, cfgMap);
}
private static List<String> getCellTaktMonitorMapKeyList(String org) {
List<String> cellTaktMonitorMapKeyList = CollectionUtils.isEmpty(cellTaktMonitorMap) ? null : new ArrayList<>(cellTaktMonitorMap.keySet());
return CollectionUtils.isEmpty(cellTaktMonitorMapKeyList) ? null : cellTaktMonitorMapKeyList.stream().filter(o -> (!StringUtils.isEmpty(o) && o.split(MesPcnExtConstWords.COLON)[0].equals(org))).collect(Collectors.toList());
}
private static void execMonitorRemove(String key) {
cellTaktMonitorMap.computeIfPresent(key, (k, v) -> {
v.cancel();
cellTaktMonitorMap.remove(key);
return null;
});
}
private static void execMonitorCompute(String org, Map<String, String> cfgMap) {
for (String key : cfgMap.keySet()) {
if (StringUtils.isEmpty(key)) continue;
String[] plcCodeArr = cfgMap.get(key).split(MesPcnExtConstWords.COMMA);
if (null == plcCodeArr || plcCodeArr.length != 2) continue;
cellTaktMonitorMap.compute(key, (k, v) -> {
if (null == v) v = new SxCellTaktMonitorHandler(org);
return v.plcCodeArr(plcCodeArr);
});
}
}
}

@ -0,0 +1,66 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.collect;
import cn.estsh.impp.framework.boot.util.SpringContextsUtil;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.common.util.concurrent.MoreExecutors;
import org.springframework.util.StringUtils;
import java.util.concurrent.ExecutorService;
/**
*
*/
public class SxCellTaktMonitorHandler {
private volatile Boolean isOpen = true;
private volatile String plcCode2Flag;
private volatile String plcCode2Data;
private String org;
private ExecutorService executorService;
private ListenableFuture<Object> listenFuture;
public SxCellTaktMonitorHandler(String org) {
this.org = org;
executorService = SpringContextsUtil.getBean(ExecutorService.class);
ListeningExecutorService listenExecutor = MoreExecutors.listeningDecorator(executorService);
listenFuture = listenExecutor.submit(() -> {
execMonitor();
return null;
});
}
public SxCellTaktMonitorHandler plcCodeArr(String[] plcCodeArr) {
this.plcCode2Flag = plcCodeArr[0];
this.plcCode2Data = plcCodeArr[1];
return this;
}
public void cancel() {
if (null == this.listenFuture) return;
isOpen = false;
listenFuture.cancel(true);
}
private void execMonitor() {
while (isOpen) {
if (StringUtils.isEmpty(plcCode2Flag) || StringUtils.isEmpty(plcCode2Data)) continue;
String plcFlag = plcCode2Flag;
String plcData = plcCode2Data;
}
}
}

@ -1,4 +1,4 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.job;
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.bean.SxWorkCellTaktCollectPlcCfg;
@ -25,14 +25,25 @@ public class SxThirdPartyPlcCollectCellTaktService implements ISxThirdPartyPlcCo
@Override
public void doThirdPartyPlcCollectData(Map<String, String> paramMap) {
if (!checkConfigStatus(paramMap)) return;
String organizeCode = paramMap.get(MesPcnExtConstWords.ORGANIZE_CODE);
List<SxWorkCellTaktCollectPlcCfg> workCellTaktCollectPlcCfgList = getWorkCellTaktCollectPlcCfgList(paramMap.get(MesPcnExtConstWords.ORGANIZE_CODE));
if (checkOrgIsStopMonitor(organizeCode, paramMap.get(MesPcnExtConstWords.STATUS))) return;
Map<String, String> cfgMap = getWorkCellTaktCollectPlcCfgList(organizeCode);
if (!SxCellTaktDispatchSingleton.getIsInit()) SxCellTaktDispatchSingleton.getInstance();
SxCellTaktDispatchSingleton.execMonitor(organizeCode, cfgMap);
}
private Boolean checkOrgIsStopMonitor(String organizeCode, String status) {
if (!StringUtils.isEmpty(status) && status.equals(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr())) return false;
if (SxCellTaktDispatchSingleton.getIsInit()) SxCellTaktDispatchSingleton.execMonitor(organizeCode, null);
return true;
}
private List<SxWorkCellTaktCollectPlcCfg> getWorkCellTaktCollectPlcCfgList(String organizeCode) {
private Map<String, String> getWorkCellTaktCollectPlcCfgList(String organizeCode) {
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()});
@ -42,13 +53,8 @@ public class SxThirdPartyPlcCollectCellTaktService implements ISxThirdPartyPlcCo
workCellTaktCollectPlcCfgList = CollectionUtils.isEmpty(workCellTaktCollectPlcCfgList) ? null :
workCellTaktCollectPlcCfgList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getPlcCode()))).distinct().collect(Collectors.collectingAndThen(
Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(SxWorkCellTaktCollectPlcCfg::getPlcCode))), ArrayList::new));
return workCellTaktCollectPlcCfgList;
}
private Boolean checkConfigStatus(Map<String, String> paramMap) {
if (paramMap.containsKey(MesPcnExtConstWords.STATUS) && paramMap.get(MesPcnExtConstWords.STATUS).equals(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr())) return true;
return false;
return CollectionUtils.isEmpty(workCellTaktCollectPlcCfgList) ? null :
workCellTaktCollectPlcCfgList.stream().filter(o -> null != o).collect(Collectors.toMap(o -> new StringJoiner(MesPcnExtConstWords.COLON).add(organizeCode).add(o.getWorkCenterCode()).add(o.getWorkCellCode()).toString(), SxWorkCellTaktCollectPlcCfg::getPlcCode));
}
}

@ -0,0 +1,22 @@
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.pojo.mes.model.StepResult;
import lombok.extern.slf4j.Slf4j;
/**
* PLC------PLC
*/
@Slf4j
public class SxThirdPartyPlcCollectReadPlcStepService implements ISxThirdPartyPlcCollectDataStepService {
public SxThirdPartyPlcCollectReadPlcStepService() {}
@Override
public StepResult exec(Object ... objs) {
return null;
}
}

@ -5,6 +5,7 @@ import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProdBusiStrategyService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnRepair;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.jx.JxProdBusiStrategyParamsBuilder;
import cn.estsh.i3plus.ext.mes.pcn.pojo.repository.MesProduceSnRepairRepository;
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.model.StepResult;
@ -43,18 +44,20 @@ public class JxProdBusiStrategyRepairService implements IJxProdBusiStrategyServi
private StepResult checkLineOn4Ps(JxProdBusiStrategyParamsBuilder params, StepResult stepResult) {
stepResult.isCompleted(false);
if (!params.getProduceSnExtDb().getLastWorkOrderNo().equals(params.getOrderModel().getOrderNo()))
return stepResult.msg(String.format("%s[%s]对应的产品条码信息关联的工单号[%s]与当前生产的工单号[%s]不一致,验证失败!", params.getScanName(), params.getScanInfo(), params.getProduceSnExtDb().getLastWorkOrderNo(), params.getOrderModel().getOrderNo()));
if (!StringUtils.isEmpty(params.getProduceSnExtDb().getProcessCode()))
return stepResult.msg(String.format("%s[%s]对应的产品条码信息已经过当前工序,当前条码状态[%s],验证失败!", params.getScanName(), params.getScanInfo(), MesPcnExtEnumUtil.PRODUCE_SN_STATUS.valueOfDescription(params.getProduceSnExtDb().getSnStatus())));
return stepResult.isCompleted(false).msg(String.format("%s[%s]对应的产品条码信息已经过当前工序,当前条码状态[%s],验证失败!", params.getScanName(), params.getScanInfo(), MesPcnExtEnumUtil.PRODUCE_SN_STATUS.valueOfDescription(params.getProduceSnExtDb().getSnStatus())));
if (MesPcnExtEnumUtil.SN_OPERATE_TYPE.REPAIR.getValue() == params.getProduceSnExtDb().getOperateType())
return stepResult.msg(String.format("%s[%s]对应的产品条码信息当前业务类型[返修],验证失败!", params.getScanName(), params.getScanInfo()));
return stepResult.isCompleted(true).msg(String.format("%s[%s]已匹配产品条码信息,验证成功!", params.getScanName(), params.getScanInfo()));
if (!params.getProduceSnExtDb().getLastWorkOrderNo().equals(params.getOrderModel().getOrderNo()) &&
MesPcnExtEnumUtil.PRODUCE_SN_QC_STATUS.QUALIFIED.getValue() == params.getProduceSnExtDb().getQcStatus() && MesPcnExtEnumUtil.PRODUCE_SN_STATUS.REPAIR_OFFLINE.getValue() != params.getProduceSnExtDb().getSnStatus())
return stepResult.isCompleted(false).msg(String.format("%s[%s]对应的产品条码信息关联的工单号[%s]与当前生产的工单号[%s]不一致,验证失败!", params.getScanName(), params.getScanInfo(), params.getProduceSnExtDb().getLastWorkOrderNo(), params.getOrderModel().getOrderNo()));
if (!params.getProduceSnExtDb().getLastWorkOrderNo().equals(params.getOrderModel().getOrderNo()))
return stepResult.nextTriggerEvent(MesPcnExtConstWords.TMP_ORDER).msg(String.format("%s[%s]对应的产品条码信息已被标记成[返修品],即将切换到临时工单[%s]!", params.getScanName(), params.getScanInfo(), params.getProduceSnExtDb().getLastWorkOrderNo()));
else
return stepResult.msg(String.format("%s[%s]已匹配产品条码信息,验证成功!", params.getScanName(), params.getScanInfo()));
}

@ -78,24 +78,27 @@ public class JxProdBusiStrategyStandardService implements IJxProdBusiStrategySer
private StepResult checkLineOn4Ps(JxProdBusiStrategyParamsBuilder params, StepResult stepResult) {
stepResult.isCompleted(false);
if (!params.getProduceSnExtDb().getLastWorkOrderNo().equals(params.getOrderModel().getOrderNo()))
return stepResult.msg(String.format("%s[%s]对应的产品条码信息关联的工单号[%s]与当前生产的工单号[%s]不一致,验证失败!", params.getScanName(), params.getScanInfo(), params.getProduceSnExtDb().getLastWorkOrderNo(), params.getOrderModel().getOrderNo()));
if (!StringUtils.isEmpty(params.getProduceSnExtDb().getProcessCode()))
return stepResult.msg(String.format("%s[%s]对应的产品条码信息已经过当前工序,当前条码状态[%s],验证失败!", params.getScanName(), params.getScanInfo(), MesPcnExtEnumUtil.PRODUCE_SN_STATUS.valueOfDescription(params.getProduceSnExtDb().getSnStatus())));
return stepResult.isCompleted(false).msg(String.format("%s[%s]对应的产品条码信息已经过当前工序,当前条码状态[%s],验证失败!", params.getScanName(), params.getScanInfo(), MesPcnExtEnumUtil.PRODUCE_SN_STATUS.valueOfDescription(params.getProduceSnExtDb().getSnStatus())));
if (MesPcnExtEnumUtil.SN_OPERATE_TYPE.REPAIR.getValue() == params.getProduceSnExtDb().getOperateType())
return stepResult.msg(String.format("%s[%s]对应的产品条码信息当前业务类型[返修],验证失败!", params.getScanName(), params.getScanInfo()));
return stepResult.isCompleted(false).msg(String.format("%s[%s]对应的产品条码信息当前业务类型[返修],验证失败!", params.getScanName(), params.getScanInfo()));
if (null != params.getProduceSnMcRecordDb() && MesPcnExtEnumUtil.SN_OPERATE_TYPE.REPAIR.getValue() == params.getProduceSnMcRecordDb().getOperateType())
return stepResult.msg(String.format("%s[%s]对应的管理编码与工单条码关系信息当前业务类型[返修],验证失败!", params.getScanName(), params.getScanInfo()));
return stepResult.isCompleted(false).msg(String.format("%s[%s]对应的管理编码与工单条码关系信息当前业务类型[返修],验证失败!", params.getScanName(), params.getScanInfo()));
if (null != params.getProduceSnMcRecordDb() && !params.getProduceSnMcRecordDb().getWorkOrderNo().equals(params.getOrderModel().getOrderNo()))
return stepResult.msg(String.format("%s[%s]对应的管理编码与工单条码关系信息关联的工单号[%s]与当前生产的工单号[%s]不一致,验证失败!", params.getScanName(), params.getScanInfo(), params.getProduceSnMcRecordDb().getWorkOrderNo(), params.getOrderModel().getOrderNo()));
if (params.getProduceSnExtDb().getLastWorkOrderNo().equals(params.getOrderModel().getOrderNo()) &&
null != params.getProduceSnMcRecordDb() && !params.getProduceSnMcRecordDb().getWorkOrderNo().equals(params.getOrderModel().getOrderNo()))
return stepResult.isCompleted(false).msg(String.format("%s[%s]对应的管理编码与工单条码关系信息关联的工单号[%s]与当前生产的工单号[%s]不一致,验证失败!", params.getScanName(), params.getScanInfo(), params.getProduceSnMcRecordDb().getWorkOrderNo(), params.getOrderModel().getOrderNo()));
return stepResult.isCompleted(true).msg(String.format("%s[%s]已匹配产品条码信息,验证成功!", params.getScanName(), params.getScanInfo()));
if (!params.getProduceSnExtDb().getLastWorkOrderNo().equals(params.getOrderModel().getOrderNo()) &&
MesPcnExtEnumUtil.PRODUCE_SN_QC_STATUS.QUALIFIED.getValue() == params.getProduceSnExtDb().getQcStatus() && MesPcnExtEnumUtil.PRODUCE_SN_STATUS.REPAIR_OFFLINE.getValue() != params.getProduceSnExtDb().getSnStatus())
return stepResult.isCompleted(false).msg(String.format("%s[%s]对应的产品条码信息关联的工单号[%s]与当前生产的工单号[%s]不一致,验证失败!", params.getScanName(), params.getScanInfo(), params.getProduceSnExtDb().getLastWorkOrderNo(), params.getOrderModel().getOrderNo()));
if (!params.getProduceSnExtDb().getLastWorkOrderNo().equals(params.getOrderModel().getOrderNo()))
return stepResult.nextTriggerEvent(MesPcnExtConstWords.TMP_ORDER).msg(String.format("%s[%s]对应的产品条码信息已被标记成[返修品],即将切换到临时工单[%s]!", params.getScanName(), params.getScanInfo(), params.getProduceSnExtDb().getLastWorkOrderNo()));
else
return stepResult.msg(String.format("%s[%s]已匹配产品条码信息,验证成功!", params.getScanName(), params.getScanInfo()));
}

@ -24,6 +24,7 @@ import org.springframework.util.StringUtils;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Map;
import java.util.StringJoiner;
/**
* @Description :
@ -51,43 +52,51 @@ public class JxInitOrderStepService extends BaseStepService {
StationResultBean resultBean = new StationResultBean();
String selectWorkOrderNo = (String) doHandleModuleObjectMethod(reqBean, resultBean, MesPcnExtConstWords.doHandleSelectWorkOrderNo, 1, null);
String curExecWorkOrderNo = (String) doHandleModuleObjectMethod(reqBean, resultBean, MesPcnExtConstWords.doHandleCurExecWorkOrder, 1, null);
String selectWorkOrderNo = (String) doHandleModuleObjectMethod(reqBean, resultBean, MesPcnExtConstWords.doHandleSelectWorkOrderNo, 1, null);
String curExecWorkOrderNoReal = curExecWorkOrderNo;
String selectWorkOrderNoReal = (StringUtils.isEmpty(selectWorkOrderNo) || !selectWorkOrderNo.contains(MesPcnExtConstWords.COLON)) ? selectWorkOrderNo : selectWorkOrderNo.split(MesPcnExtConstWords.COLON)[1];
if (!StringUtils.isEmpty(selectWorkOrderNo)) doHandleModuleObjectMethod(reqBean, resultBean, MesPcnExtConstWords.doHandleSelectWorkOrderNo, 3, null);
if (!StringUtils.isEmpty(selectWorkOrderNo) && !StringUtils.isEmpty(curExecWorkOrderNo)) {
if (selectWorkOrderNo.equals(curExecWorkOrderNo)) selectWorkOrderNo = null;
else curExecWorkOrderNo = null;
if (!StringUtils.isEmpty(selectWorkOrderNoReal)) doHandleModuleObjectMethod(reqBean, resultBean, MesPcnExtConstWords.doHandleSelectWorkOrderNo, 3, null);
if (!StringUtils.isEmpty(selectWorkOrderNoReal) && !StringUtils.isEmpty(curExecWorkOrderNoReal)) {
if (selectWorkOrderNoReal.equals(curExecWorkOrderNoReal)) selectWorkOrderNoReal = null;
else curExecWorkOrderNoReal = null;
}
MesWorkOrderExt workOrderExt = null;
if (!StringUtils.isEmpty(selectWorkOrderNo)) {
workOrderExt = workOrderExtService.getWorkOrderExtByOrderNo(reqBean.getOrganizeCode(), selectWorkOrderNo);
checkWorkOrderExtIsValid(reqBean, resultBean, stepResult, workOrderExt, String.format("选择的工单号[%s]", selectWorkOrderNo));
doCacheCurExecWorkOrderNo(reqBean, resultBean, stepResult, selectWorkOrderNo);
if (!StringUtils.isEmpty(selectWorkOrderNoReal)) {
workOrderExt = workOrderExtService.getWorkOrderExtByOrderNo(reqBean.getOrganizeCode(), selectWorkOrderNoReal);
String suffix = String.format("%s[%s]", !selectWorkOrderNo.contains(MesPcnExtConstWords.COLON) ?
"选择的工单号" : (selectWorkOrderNo.contains(MesPcnExtConstWords.TMP_ORDER) ? "临时工单号" : "回退工单号"), selectWorkOrderNoReal);
checkWorkOrderExtIsValid(reqBean, resultBean, stepResult, workOrderExt, suffix);
doCacheCurExecWorkOrderNo(reqBean, resultBean, stepResult, selectWorkOrderNoReal, suffix);
if (selectWorkOrderNo.contains(MesPcnExtConstWords.TMP_ORDER) && !StringUtils.isEmpty(curExecWorkOrderNo))
doHandleModuleObjectMethod(reqBean, resultBean, MesPcnExtConstWords.doHandleSelectWorkOrderNo, 2, new StringJoiner(MesPcnExtConstWords.COLON).add(MesPcnExtConstWords.BACK_ORDER).add(curExecWorkOrderNo).toString());
}
if (!StringUtils.isEmpty(curExecWorkOrderNo)) {
workOrderExt = workOrderExtService.getWorkOrderExtByOrderNo(reqBean.getOrganizeCode(), curExecWorkOrderNo);
checkWorkOrderExtIsValid(reqBean, resultBean, stepResult, workOrderExt, String.format("此前操作的工单号[%s]", curExecWorkOrderNo));
if (!StringUtils.isEmpty(curExecWorkOrderNoReal)) {
workOrderExt = workOrderExtService.getWorkOrderExtByOrderNo(reqBean.getOrganizeCode(), curExecWorkOrderNoReal);
checkWorkOrderExtIsValid(reqBean, resultBean, stepResult, workOrderExt, String.format("此前操作的工单号[%s]", curExecWorkOrderNoReal));
}
if (null == workOrderExt || !stepResult.isCompleted()) execSendGuideAndThrowEx(reqBean, resultBean, "请选择启动状态的生产工单!");
cacheOrderModel(reqBean, workOrderExt);
if (!selectWorkOrderNo.contains(MesPcnExtConstWords.TMP_ORDER)) reqBean.setScanInfo(null);
log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxInitOrderStepService --- SUCCESS --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
return stepResult;
}
private void doCacheCurExecWorkOrderNo(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, String selectWorkOrderNo) {
private void doCacheCurExecWorkOrderNo(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, String selectWorkOrderNo, String suffix) {
Boolean flag = (Boolean) doHandleModuleObjectMethod(reqBean, resultBean, MesPcnExtConstWords.doHandleCurExecWorkOrder, 2, selectWorkOrderNo);
if (!flag) execNonCompleteAndSendMsg(reqBean, resultBean, stepResult, String.format("选择的工单号[%s]初始化失败!", selectWorkOrderNo));
if (!flag) execNonCompleteAndSendMsg(reqBean, resultBean, stepResult, String.format("%s初始化失败!", suffix));
else {
execStateModule(reqBean, resultBean);
if (stepResult.isCompleted()) this.sendMessage(reqBean, resultBean, String.format("选择的工单号[%s]初始化成功!", selectWorkOrderNo), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
if (stepResult.isCompleted()) this.sendMessage(reqBean, resultBean, String.format("%s初始化成功!", suffix), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
}
}

@ -1,107 +0,0 @@
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.apiservice.serviceimpl.busi.station.jx.JxSnFinalInspectionModuleService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesWorkOrderExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.WorkOrderExtModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil;
import cn.estsh.i3plus.mes.pcn.serviceimpl.base.BaseStepService;
import cn.estsh.i3plus.platform.common.tool.MathOperation;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
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 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.StringUtils;
/**
* @Description :
* @Reference :
* @Author : wangjie
* @CreateDate : 2019-07-11
* @Modify:
**/
@Slf4j
@Service("jxSnFinalInspectionInitOrderStepService")
public class JxSnFinalInspectionInitOrderStepService extends BaseStepService {
@Autowired
private JxSnFinalInspectionModuleService snFinalInspectionModuleService;
@Autowired
private ISxWorkOrderExtService workOrderExtService;
@Override
public StepResult execute(StationRequestBean reqBean) {
log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnFinalInspectionInitOrderStepService --- START --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
StepResult stepResult = StepResult.getSuccessComplete();
StationResultBean resultBean = new StationResultBean();
String selectWorkOrderNo = (String) snFinalInspectionModuleService.doHandleSelectWorkOrderNo(reqBean, 1, null);
String curExecWorkOrderNo = (String) snFinalInspectionModuleService.doHandleCurExecWorkOrder(reqBean, 1, null);
if (!StringUtils.isEmpty(selectWorkOrderNo)) snFinalInspectionModuleService.doHandleSelectWorkOrderNo(reqBean, 3, null);
if (!StringUtils.isEmpty(selectWorkOrderNo) && !StringUtils.isEmpty(curExecWorkOrderNo)) {
if (selectWorkOrderNo.equals(curExecWorkOrderNo)) selectWorkOrderNo = null;
else curExecWorkOrderNo = null;
}
MesWorkOrderExt workOrderExt = null;
if (!StringUtils.isEmpty(selectWorkOrderNo)) {
workOrderExt = workOrderExtService.getWorkOrderExtByOrderNo(reqBean.getOrganizeCode(), selectWorkOrderNo);
checkWorkOrderExtIsValid(reqBean, resultBean, stepResult, workOrderExt, String.format("选择的工单号[%s]", selectWorkOrderNo));
doCacheCurExecWorkOrderNo(reqBean, resultBean, stepResult, selectWorkOrderNo);
}
if (!StringUtils.isEmpty(curExecWorkOrderNo)) {
workOrderExt = workOrderExtService.getWorkOrderExtByOrderNo(reqBean.getOrganizeCode(), curExecWorkOrderNo);
checkWorkOrderExtIsValid(reqBean, resultBean, stepResult, workOrderExt, String.format("此前操作的工单号[%s]", curExecWorkOrderNo));
}
if (null == workOrderExt || !stepResult.isCompleted()) execSendGuideAndThrowEx(reqBean, resultBean, "请选择启动状态的生产工单!");
cacheOrderModel(reqBean, workOrderExt);
log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnFinalInspectionInitOrderStepService --- SUCCESS --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
return stepResult;
}
private void doCacheCurExecWorkOrderNo(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, String selectWorkOrderNo) {
Boolean flag = (Boolean) snFinalInspectionModuleService.doHandleCurExecWorkOrder(reqBean, 2, selectWorkOrderNo);
if (!flag) execNonCompleteAndSendMsg(reqBean, resultBean, stepResult, String.format("选择的工单号[%s]初始化失败!", selectWorkOrderNo));
else {
snFinalInspectionModuleService.execStateModule(reqBean, null, null);
if (stepResult.isCompleted()) this.sendMessage(reqBean, resultBean, String.format("选择的工单号[%s]初始化成功!", selectWorkOrderNo), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
}
}
private void checkWorkOrderExtIsValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkOrderExt workOrderExt, String suffix) {
if (null == workOrderExt) execNonCompleteAndSendMsg(reqBean, resultBean, stepResult, String.format("%s对应的工单信息不存在!", suffix));
if (stepResult.isCompleted() && MesPcnExtEnumUtil.WORK_ORDER_STATUS.OPEN.getValue() != workOrderExt.getWorkOrderStatus())
execNonCompleteAndSendMsg(reqBean, resultBean, stepResult, String.format("%s状态[%s],不支持在此工位操作!", suffix, MesPcnExtEnumUtil.WORK_ORDER_STATUS.valueOfDescription(workOrderExt.getWorkOrderStatus())));
if (stepResult.isCompleted() && MathOperation.compareTo(workOrderExt.getQty(), new Double(0)) <= 0)
execNonCompleteAndSendMsg(reqBean, resultBean, stepResult, String.format("%s计划数量为[0],不支持在此工位操作!", suffix));
if (!stepResult.isCompleted()) return;
}
private void cacheOrderModel(StationRequestBean reqBean, MesWorkOrderExt workOrderExt) {
WorkOrderExtModel orderModel = new WorkOrderExtModel();
BeanUtils.copyProperties(workOrderExt, orderModel, MesPcnExtConstWords.ID);
reqBean.getDataMap().put(MesPcnExtConstWords.WORK_ORDER, orderModel);
}
}

@ -41,11 +41,6 @@ public class JxSnLineOnBindMcStepService extends BaseStepService {
private ISxWorkOrderExtService workOrderExtService;
@Override
public StepResult guide(StationRequestBean reqBean) {
return execSuccessCompleteAndSendGuideReturn(reqBean, new StationResultBean(), "请扫描管理编码或产品条码!");
}
@Override
public StepResult execute(StationRequestBean reqBean) {
log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnLineOnBindMcStepService --- START --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());

@ -60,16 +60,16 @@ public class JxSnLineOnCheckMcOrPsStepService extends BaseStepService {
log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnLineOnCheckMcOrPsStepService --- START --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
StepResult stepResult = StepResult.getSuccessComplete();
StationResultBean resultBean = new StationResultBean();
if (StringUtils.isEmpty(reqBean.getScanInfo())) return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, "入参缺少管理编码或产品条码!");
if (StringUtils.isEmpty(reqBean.getScanInfo())) execSendGuideAndThrowEx(reqBean, resultBean, "请扫描管理编码或产品条码!");
String curExecWorkOrderNo = getCurExecWorkOrderNo(reqBean, resultBean);
WorkOrderExtModel orderModel = getWorkOrderExtModel(reqBean, resultBean, curExecWorkOrderNo);
StepResult stepResult = StepResult.getSuccessComplete();
checkScanInfoIsValid(reqBean, resultBean, stepResult, orderModel);
log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnLineOnCheckMcOrPsStepService --- SUCCESS --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
@ -113,6 +113,14 @@ public class JxSnLineOnCheckMcOrPsStepService extends BaseStepService {
stepResult.setCompleted(result.isCompleted());
if (!StringUtils.isEmpty(result.getNextTriggerEvent()) && (Boolean) snLineOnModuleService.doHandleSelectWorkOrderNo(
reqBean, 2, new StringJoiner(MesPcnExtConstWords.COLON).add(MesPcnExtConstWords.TMP_ORDER).add(params.getProduceSnExtDb().getLastWorkOrderNo()).toString()))
return stepResult.nextTriggerEvent(result.getNextTriggerEvent()).isCompleted(false);
reqBean.setScanInfo(null);
if (!StringUtils.isEmpty(result.getNextTriggerEvent())) return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult,
new StringJoiner(MesPcnExtConstWords.COMMA).add(result.getMsg().split(MesPcnExtConstWords.COMMA)[0]).add(String.format(",缓存临时工单[%s]失败!", params.getProduceSnExtDb().getLastWorkOrderNo())).toString());
reqBean.setSerialNumber(params.getSerialNumber());
reqBean.setProductSn(params.getProductSn());
reqBean.setTray(null == params.getProduceSnMcRecordDb() ? params.getManageCode() : new StringJoiner(MesPcnExtConstWords.AND).add(params.getProduceSnMcRecordDb().getManageCode()).add(params.getProduceSnMcRecordDb().getId().toString()).toString());

@ -1,107 +0,0 @@
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.apiservice.serviceimpl.busi.station.jx.JxSnLineOnModuleService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesWorkOrderExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.WorkOrderExtModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil;
import cn.estsh.i3plus.mes.pcn.serviceimpl.base.BaseStepService;
import cn.estsh.i3plus.platform.common.tool.MathOperation;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
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 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.StringUtils;
/**
* @Description : 线
* @Reference :
* @Author : wangjie
* @CreateDate : 2019-07-11
* @Modify:
**/
@Slf4j
@Service("jxSnLineOnInitOrderStepService")
public class JxSnLineOnInitOrderStepService extends BaseStepService {
@Autowired
private JxSnLineOnModuleService snLineOnModuleService;
@Autowired
private ISxWorkOrderExtService workOrderExtService;
@Override
public StepResult execute(StationRequestBean reqBean) {
log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnLineOnInitOrderStepService --- START --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
StepResult stepResult = StepResult.getSuccessComplete();
StationResultBean resultBean = new StationResultBean();
String selectWorkOrderNo = (String) snLineOnModuleService.doHandleSelectWorkOrderNo(reqBean, 1, null);
String curExecWorkOrderNo = (String) snLineOnModuleService.doHandleCurExecWorkOrder(reqBean, 1, null);
if (!StringUtils.isEmpty(selectWorkOrderNo)) snLineOnModuleService.doHandleSelectWorkOrderNo(reqBean, 3, null);
if (!StringUtils.isEmpty(selectWorkOrderNo) && !StringUtils.isEmpty(curExecWorkOrderNo)) {
if (selectWorkOrderNo.equals(curExecWorkOrderNo)) selectWorkOrderNo = null;
else curExecWorkOrderNo = null;
}
MesWorkOrderExt workOrderExt = null;
if (!StringUtils.isEmpty(selectWorkOrderNo)) {
workOrderExt = workOrderExtService.getWorkOrderExtByOrderNo(reqBean.getOrganizeCode(), selectWorkOrderNo);
checkWorkOrderExtIsValid(reqBean, resultBean, stepResult, workOrderExt, String.format("选择的工单号[%s]", selectWorkOrderNo));
doCacheCurExecWorkOrderNo(reqBean, resultBean, stepResult, selectWorkOrderNo);
}
if (!StringUtils.isEmpty(curExecWorkOrderNo)) {
workOrderExt = workOrderExtService.getWorkOrderExtByOrderNo(reqBean.getOrganizeCode(), curExecWorkOrderNo);
checkWorkOrderExtIsValid(reqBean, resultBean, stepResult, workOrderExt, String.format("此前操作的工单号[%s]", curExecWorkOrderNo));
}
if (null == workOrderExt || !stepResult.isCompleted()) execSendGuideAndThrowEx(reqBean, resultBean, "请选择启动状态的生产工单!");
cacheOrderModel(reqBean, workOrderExt);
log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnLineOnInitOrderStepService --- SUCCESS --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
return stepResult;
}
private void doCacheCurExecWorkOrderNo(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, String selectWorkOrderNo) {
Boolean flag = (Boolean) snLineOnModuleService.doHandleCurExecWorkOrder(reqBean, 2, selectWorkOrderNo);
if (!flag) execNonCompleteAndSendMsg(reqBean, resultBean, stepResult, String.format("选择的工单号[%s]初始化失败!", selectWorkOrderNo));
else {
snLineOnModuleService.execStateModule(reqBean, null, null);
if (stepResult.isCompleted()) this.sendMessage(reqBean, resultBean, String.format("选择的工单号[%s]初始化成功!", selectWorkOrderNo), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
}
}
private void checkWorkOrderExtIsValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkOrderExt workOrderExt, String suffix) {
if (null == workOrderExt) execNonCompleteAndSendMsg(reqBean, resultBean, stepResult, String.format("%s对应的工单信息不存在!", suffix));
if (stepResult.isCompleted() && MesPcnExtEnumUtil.WORK_ORDER_STATUS.OPEN.getValue() != workOrderExt.getWorkOrderStatus())
execNonCompleteAndSendMsg(reqBean, resultBean, stepResult, String.format("%s状态[%s],不支持在此工位操作!", suffix, MesPcnExtEnumUtil.WORK_ORDER_STATUS.valueOfDescription(workOrderExt.getWorkOrderStatus())));
if (stepResult.isCompleted() && MathOperation.compareTo(workOrderExt.getQty(), new Double(0)) <= 0)
execNonCompleteAndSendMsg(reqBean, resultBean, stepResult, String.format("%s计划数量为[0],不支持在此工位操作!", suffix));
if (!stepResult.isCompleted()) return;
}
private void cacheOrderModel(StationRequestBean reqBean, MesWorkOrderExt workOrderExt) {
WorkOrderExtModel orderModel = new WorkOrderExtModel();
BeanUtils.copyProperties(workOrderExt, orderModel, MesPcnExtConstWords.ID);
reqBean.getDataMap().put(MesPcnExtConstWords.WORK_ORDER, orderModel);
}
}

@ -25,7 +25,7 @@ import java.io.Serializable;
@DynamicInsert
@DynamicUpdate
@EqualsAndHashCode(callSuper = true)
@Table(name = "MES_TIME_SEGMENT_STATISTICS", indexes = {
@Table(name = "SX_WORK_CELL_TAKT_COLLECT_PLC_CFG", indexes = {
@Index(columnList = "SYSTEM_SYNC_STATUS"),
@Index(columnList = "WORK_CENTER_CODE")
})

@ -1014,4 +1014,9 @@ public class MesPcnExtConstWords {
//策略实现类
public static final String STRATEGY_CLASS = "strategyClass";
//临时工单
public static final String TMP_ORDER = "TMP_ORDER";
//回退工单
public static final String BACK_ORDER = "BACK_ORDER";
}

@ -1350,6 +1350,7 @@ public class MesPcnExtEnumUtil {
public enum PRODUCE_SN_STATUS {
CREATE(10, "创建"),
PROCESS(20, "在制"),
REPAIR_OFFLINE(25, "返修在制"),
ERR_OFFLINE(30, "异常下线"),
OFFLINE(40, "正常下线"),
REPAIR(5, "返工");

Loading…
Cancel
Save