forked from I3-YF/i3plus-mes-pcn-yfai
Merge branch 'uat-temp-wj-2502060000-chongqing-step' into dev
commit
53330ff307
@ -0,0 +1,40 @@
|
||||
package cn.estsh.i3plus.ext.mes.pcn.api.busi;
|
||||
|
||||
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPartContext;
|
||||
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext;
|
||||
import cn.estsh.i3plus.pojo.base.bean.ListPager;
|
||||
import cn.estsh.i3plus.pojo.base.common.Pager;
|
||||
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
|
||||
import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPush;
|
||||
import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPushCellCfg;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public interface IMesQueueOrderPushService {
|
||||
|
||||
@ApiOperation(value = "根据生产线代码,工位代码查询生产队列推送工位配置信息")
|
||||
List<MesQueueOrderPushCellCfg> getQueueOrderPushCellCfgList(String organizeCode, String workCenterCode, String workCellCode);
|
||||
|
||||
@ApiOperation(value = "根据生产线代码查询生产队列推送工位配置信息")
|
||||
List<MesQueueOrderPushCellCfg> getQueueOrderPushCellCfgList(String organizeCode, String workCenterCode);
|
||||
|
||||
//递增步长10,取整10位; 例如:查询=10 >> 返回=20 ; 查询=29 >> 返回=30
|
||||
@ApiOperation(value = "获取当前工单对应的工位推单队列中最大的顺序号")
|
||||
Integer getQueueOrderPushMaxSeq(String organizeCode, String workOrderNo);
|
||||
|
||||
@ApiOperation(value = "写入工位工单推送信息")
|
||||
void insertQueueOrderPush(String organizeCode, String userInfo, List<MesQueueOrderPushCellCfg> queueOrderPushCellCfgList,
|
||||
MesProductionPsOutContext productionPsOutContext, MesProductionPartContext productionPartContext);
|
||||
|
||||
@ApiOperation(value = "根据配置查询创建状态的生产队列工位推送信息")
|
||||
List<MesQueueOrderPush> getQueueOrderPushList(String organizeCode, List<MesQueueOrderPushCellCfg> queueOrderPushCellCfgList);
|
||||
|
||||
@ApiOperation(value = "根据配置查询生产队列工位推送信息")
|
||||
List<MesQueueOrderPush> getQueueOrderPushListByStatus(String organizeCode, List<MesQueueOrderPushCellCfg> queueOrderPushCellCfgList, Integer cdtAscOrDesc, Integer... queueStatusArr);
|
||||
|
||||
@ApiOperation(value = "根据分页条件查询生产队列工位推送信息")
|
||||
ListPager<MesQueueOrderPush> queryQueueOrderPushListPager(Map<String, String> paramMap, List<String> pushSourceCodeList, Pager pager);
|
||||
|
||||
}
|
@ -1,45 +0,0 @@
|
||||
package cn.estsh.i3plus.ext.mes.pcn.apiservice.controller.base;
|
||||
|
||||
|
||||
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesEnumExtService;
|
||||
import cn.estsh.i3plus.mes.pcn.util.EnumUtil;
|
||||
import cn.estsh.i3plus.pojo.base.enumutil.MesEnumUtil;
|
||||
import cn.estsh.i3plus.pojo.mes.dbinterface.MesInterfaceEnumUtil;
|
||||
import cn.estsh.i3plus.pojo.mes.repository.MesEnumDetailRepository;
|
||||
import cn.estsh.i3plus.pojo.mes.repository.MesEnumRepository;
|
||||
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @Author: Wynne.Lu
|
||||
* @CreateDate: 2019/8/30 1:39 PM
|
||||
* @Description:
|
||||
**/
|
||||
@Slf4j
|
||||
@Service
|
||||
@ApiOperation(value = "获取MesEnumUtil")
|
||||
public class MesEnumExtService implements IMesEnumExtService {
|
||||
|
||||
@Override
|
||||
public Map<String, Object> doGetMesEnumByEnumName(String organizeCode, String enumName) {
|
||||
Map<String, Object> enumMap;
|
||||
enumMap = getEnumByClazzEnum(enumName, MesExtEnumUtil.class);
|
||||
if (CollectionUtils.isEmpty(enumMap)) enumMap = getEnumByClazzEnum(enumName, MesEnumUtil.class);
|
||||
if (CollectionUtils.isEmpty(enumMap)) enumMap = getEnumByClazzEnum(enumName, MesInterfaceEnumUtil.class);
|
||||
return enumMap;
|
||||
}
|
||||
|
||||
public Map<String, Object> getEnumByClazzEnum(String enumName, Class clz) {
|
||||
return EnumUtil.getEnumByName(clz, enumName);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,88 @@
|
||||
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.base;
|
||||
|
||||
|
||||
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesEnumExtService;
|
||||
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
|
||||
import cn.estsh.i3plus.mes.pcn.util.EnumUtil;
|
||||
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
|
||||
import cn.estsh.i3plus.pojo.base.enumutil.MesEnumUtil;
|
||||
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
|
||||
import cn.estsh.i3plus.pojo.mes.bean.MesEnum;
|
||||
import cn.estsh.i3plus.pojo.mes.bean.MesEnumDetail;
|
||||
import cn.estsh.i3plus.pojo.mes.dbinterface.MesInterfaceEnumUtil;
|
||||
import cn.estsh.i3plus.pojo.mes.repository.MesEnumDetailRepository;
|
||||
import cn.estsh.i3plus.pojo.mes.repository.MesEnumRepository;
|
||||
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
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.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @Author: Wynne.Lu
|
||||
* @CreateDate: 2019/8/30 1:39 PM
|
||||
* @Description:
|
||||
**/
|
||||
@Slf4j
|
||||
@Service
|
||||
@ApiOperation(value = "获取MesEnumUtil")
|
||||
public class MesEnumExtService implements IMesEnumExtService {
|
||||
|
||||
@Autowired
|
||||
private MesEnumRepository enumRepository;
|
||||
|
||||
@Autowired
|
||||
private MesEnumDetailRepository enumDetailRepository;
|
||||
|
||||
@Override
|
||||
public Map<String, Object> doGetMesEnumByEnumName(String organizeCode, String enumName) {
|
||||
Map<String, Object> enumMap = getEnumMap(organizeCode, enumName);
|
||||
if (CollectionUtils.isEmpty(enumMap)) enumMap = getEnumByClazzEnum(enumName, MesExtEnumUtil.class);
|
||||
if (CollectionUtils.isEmpty(enumMap)) enumMap = getEnumByClazzEnum(enumName, MesEnumUtil.class);
|
||||
if (CollectionUtils.isEmpty(enumMap)) enumMap = getEnumByClazzEnum(enumName, MesInterfaceEnumUtil.class);
|
||||
return enumMap;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, Object> getEnumByClazzEnum(String enumName, Class clz) {
|
||||
return EnumUtil.getEnumByName(clz, enumName);
|
||||
}
|
||||
|
||||
private Map<String, Object> getEnumMap(String organizeCode, String enumName) {
|
||||
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
|
||||
DdlPreparedPack.getStringEqualPack(enumName, MesPcnExtConstWords.ENUM_CODE, packBean);
|
||||
MesEnum enumDb = enumRepository.getByProperty(packBean);
|
||||
if (null == enumDb) return null;
|
||||
List<MesEnumDetail> enumDetailList = enumDetailRepository.findByHqlWhere(packBean);
|
||||
if (CollectionUtils.isEmpty(enumDetailList)) return null;
|
||||
return getEnumMap(enumDetailList, enumName);
|
||||
}
|
||||
|
||||
private Map<String, Object> getEnumMap(List<MesEnumDetail> enumDetailList, String enumName) {
|
||||
Map<String, Object> enumMap = new HashMap<>();
|
||||
List<Map<String, Object>> values = new ArrayList<>();
|
||||
enumDetailList.forEach(e -> {
|
||||
Map<String, Object> value = new HashMap<>();
|
||||
value.put("value", e.getDetailValue());
|
||||
if (!StringUtils.isEmpty(e.getEnumCode())) {
|
||||
value.put("code", e.getDetailCode());
|
||||
}
|
||||
value.put("description", e.getDetailName());
|
||||
values.add(value);
|
||||
});
|
||||
enumMap.put("enumName", enumName);
|
||||
enumMap.put("valuesList", values);
|
||||
return enumMap;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,168 @@
|
||||
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi;
|
||||
|
||||
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesQueueOrderPushService;
|
||||
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPartContext;
|
||||
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext;
|
||||
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
|
||||
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
|
||||
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
|
||||
import cn.estsh.i3plus.pojo.base.bean.ListPager;
|
||||
import cn.estsh.i3plus.pojo.base.common.Pager;
|
||||
import cn.estsh.i3plus.pojo.base.common.PagerHelper;
|
||||
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
|
||||
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
|
||||
import cn.estsh.i3plus.pojo.mes.bean.MesPart;
|
||||
import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPush;
|
||||
import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPushCellCfg;
|
||||
import cn.estsh.i3plus.pojo.mes.repository.MesQueueOrderPushCellCfgRepository;
|
||||
import cn.estsh.i3plus.pojo.mes.repository.MesQueueOrderPushRepository;
|
||||
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
|
||||
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.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Service
|
||||
public class MesQueueOrderPushService implements IMesQueueOrderPushService {
|
||||
|
||||
@Autowired
|
||||
private MesQueueOrderPushCellCfgRepository queueOrderPushCellCfgRepository;
|
||||
|
||||
@Autowired
|
||||
private MesQueueOrderPushRepository queueOrderPushRepository;
|
||||
|
||||
@Override
|
||||
public List<MesQueueOrderPushCellCfg> getQueueOrderPushCellCfgList(String organizeCode, String workCenterCode, String workCellCode) {
|
||||
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workCenterCode) || StringUtils.isEmpty(workCellCode)) return null;
|
||||
return queueOrderPushCellCfgRepository.findByProperty(
|
||||
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.WORK_CENTER_CODE, MesPcnExtConstWords.WORK_CELL_CODE},
|
||||
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), workCenterCode, workCellCode});
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<MesQueueOrderPushCellCfg> getQueueOrderPushCellCfgList(String organizeCode, String workCenterCode) {
|
||||
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workCenterCode)) return null;
|
||||
return queueOrderPushCellCfgRepository.findByProperty(
|
||||
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.WORK_CENTER_CODE},
|
||||
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), workCenterCode});
|
||||
}
|
||||
|
||||
//获取当前工单对应的工位推单队列中最大的顺序号; 递增步长10,取整10位; 例如:查询=10 >> 返回=20 ; 查询=29 >> 返回=30
|
||||
@Override
|
||||
public Integer getQueueOrderPushMaxSeq(String organizeCode, String workOrderNo) {
|
||||
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workOrderNo)) return MesPcnExtConstWords.TEN;
|
||||
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
|
||||
DdlPreparedPack.getStringEqualPack(workOrderNo, MesPcnExtConstWords.WORK_ORDER_NO, packBean);
|
||||
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{MesPcnExtConstWords.PROCESS_SEQ}, packBean);
|
||||
MesQueueOrderPush queueOrderPushDb2MaxSeq = queueOrderPushRepository.getByProperty(packBean);
|
||||
return ((null == queueOrderPushDb2MaxSeq || queueOrderPushDb2MaxSeq.getProcessSeq().compareTo(MesPcnExtConstWords.ZERO) == 0)
|
||||
? MesPcnExtConstWords.ONE : (queueOrderPushDb2MaxSeq.getProcessSeq() / MesPcnExtConstWords.TEN + 1)
|
||||
) * MesPcnExtConstWords.TEN;
|
||||
}
|
||||
|
||||
//写入工位工单推送信息
|
||||
@Override
|
||||
public void insertQueueOrderPush(String organizeCode, String userInfo, List<MesQueueOrderPushCellCfg> queueOrderPushCellCfgList,
|
||||
MesProductionPsOutContext productionPsOutContext, MesProductionPartContext productionPartContext) {
|
||||
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(userInfo) || null == productionPsOutContext || CollectionUtils.isEmpty(queueOrderPushCellCfgList)) return;
|
||||
Integer processSeq = getQueueOrderPushMaxSeq(organizeCode, productionPsOutContext.getWorkOrderNo());
|
||||
for (MesQueueOrderPushCellCfg queueOrderPushCellCfg : queueOrderPushCellCfgList) {
|
||||
if (null == queueOrderPushCellCfg) continue;
|
||||
MesQueueOrderPush queueOrderPush = new MesQueueOrderPush();
|
||||
queueOrderPush.setPushSourceCode(queueOrderPushCellCfg.getPushSourceCode());
|
||||
queueOrderPush.setWorkOrderNo(productionPsOutContext.getWorkOrderNo());
|
||||
queueOrderPush.setProductSn(productionPsOutContext.getProductSn());
|
||||
queueOrderPush.setCustSn(productionPsOutContext.getCustSn());
|
||||
queueOrderPush.setPartNo(productionPsOutContext.getPartNo());
|
||||
queueOrderPush.setPartName(productionPsOutContext.getPartName());
|
||||
queueOrderPush.setProcessSeq(processSeq);
|
||||
queueOrderPush.setQueueStatus(MesExtEnumUtil.QUEUE_ORDER_STATUS.CREATE.getValue());
|
||||
queueOrderPush.setProductSeq(productionPartContext.getProductSeq());
|
||||
queueOrderPush.setWorkOrderSeq(productionPartContext.getWorkOrderSeq());
|
||||
queueOrderPush.setCarModelCode(productionPartContext.getCarModelCode());
|
||||
queueOrderPush.setCustOrderNo(productionPartContext.getCustOrderNo());
|
||||
queueOrderPush.setPartProdGroupCode(productionPartContext.getPartProdGroupCode());
|
||||
queueOrderPush.setAreaCode(queueOrderPushCellCfg.getAreaCode());
|
||||
queueOrderPush.setWorkCenterCode(queueOrderPushCellCfg.getWorkCenterCode());
|
||||
queueOrderPush.setSourceWorkCellCode(queueOrderPushCellCfg.getWorkCellCode());
|
||||
queueOrderPush.setOrganizeCode(organizeCode);
|
||||
ConvertBean.serviceModelInitialize(queueOrderPush, userInfo);
|
||||
queueOrderPushRepository.insert(queueOrderPush);
|
||||
}
|
||||
}
|
||||
|
||||
//根据配置查询创建状态的生产队列工位推送信息
|
||||
@Override
|
||||
public List<MesQueueOrderPush> getQueueOrderPushList(String organizeCode, List<MesQueueOrderPushCellCfg> queueOrderPushCellCfgList) {
|
||||
if (StringUtils.isEmpty(organizeCode) || CollectionUtils.isEmpty(queueOrderPushCellCfgList)) return null;
|
||||
//搜集推送来源代码 去重; 根据生产线代码,推送来源代码集合查询创建状态的生产队列工位推送信息【创建时间正序】
|
||||
List<MesQueueOrderPush> queueOrderPushList = getQueueOrderPushListByStatus(organizeCode, queueOrderPushCellCfgList, CommonEnumUtil.ASC_OR_DESC.ASC.getValue(), MesExtEnumUtil.QUEUE_ORDER_STATUS.CREATE.getValue());
|
||||
//条码去重
|
||||
return CollectionUtils.isEmpty(queueOrderPushList) ? null :
|
||||
queueOrderPushList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getProductSn()))).distinct()
|
||||
.collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(MesQueueOrderPush::getProductSn))), ArrayList::new));
|
||||
|
||||
}
|
||||
|
||||
//根据配置查询生产队列工位推送信息
|
||||
@Override
|
||||
public List<MesQueueOrderPush> getQueueOrderPushListByStatus(String organizeCode, List<MesQueueOrderPushCellCfg> queueOrderPushCellCfgList, Integer cdtAscOrDesc, Integer... queueStatusArr) {
|
||||
|
||||
if (StringUtils.isEmpty(organizeCode) || CollectionUtils.isEmpty(queueOrderPushCellCfgList)) return null;
|
||||
|
||||
//搜集推送来源代码 去重
|
||||
List<String> pushSourceCodeList = (queueOrderPushCellCfgList.stream()
|
||||
.filter(o -> (null != o && !StringUtils.isEmpty(o.getPushSourceCode()))).map(MesQueueOrderPushCellCfg::getPushSourceCode).collect(Collectors.toList())
|
||||
).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList());
|
||||
if (CollectionUtils.isEmpty(pushSourceCodeList)) return null;
|
||||
|
||||
//根据生产线代码,推送来源代码集合查询入参状态的生产队列工位推送信息【创建时间正序】
|
||||
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
|
||||
DdlPreparedPack.getStringEqualPack(queueOrderPushCellCfgList.get(0).getWorkCenterCode(), MesPcnExtConstWords.WORK_CENTER_CODE, packBean);
|
||||
|
||||
if (null != queueStatusArr && queueStatusArr.length == 1)
|
||||
DdlPreparedPack.getNumEqualPack(queueStatusArr[0], MesPcnExtConstWords.QUEUE_STATUS, packBean);
|
||||
else if (null != queueStatusArr) DdlPreparedPack.getInPackArray(queueStatusArr, MesPcnExtConstWords.QUEUE_STATUS, packBean);
|
||||
|
||||
if (pushSourceCodeList.size() == 1) DdlPreparedPack.getStringEqualPack(pushSourceCodeList.get(0), MesPcnExtConstWords.PUSH_SOURCE_CODE, packBean);
|
||||
else DdlPreparedPack.getInPackList(pushSourceCodeList, MesPcnExtConstWords.PUSH_SOURCE_CODE, packBean);
|
||||
|
||||
if (!StringUtils.isEmpty(cdtAscOrDesc)) DdlPreparedPack.getOrderByPack(new Object[]{cdtAscOrDesc}, new String[]{MesPcnExtConstWords.CREATE_DATE_TIME}, packBean);
|
||||
|
||||
return queueOrderPushRepository.findByHqlWhere(packBean);
|
||||
}
|
||||
|
||||
//根据分页条件查询生产队列工位推送信息
|
||||
@Override
|
||||
public ListPager<MesQueueOrderPush> queryQueueOrderPushListPager(Map<String, String> paramMap, List<String> pushSourceCodeList, Pager pager) {
|
||||
|
||||
DdlPackBean packBean = DdlPackBean.getDdlPackBean(paramMap.get(MesPcnExtConstWords.ORGANIZE_CODE));
|
||||
|
||||
DdlPreparedPack.getStringEqualPack(paramMap.get(MesPcnExtConstWords.WORK_CENTER_CODE), MesPcnExtConstWords.WORK_CENTER_CODE, packBean);
|
||||
DdlPreparedPack.getStringEqualPack(paramMap.get(MesPcnExtConstWords.PART_NO), MesPcnExtConstWords.PART_NO, packBean);
|
||||
DdlPreparedPack.getStringEqualPack(paramMap.get(MesPcnExtConstWords.PART_PROD_GROUP_CODE), MesPcnExtConstWords.PART_PROD_GROUP_CODE, packBean);
|
||||
|
||||
DdlPreparedPack.getStringLikerPack(paramMap.get(MesPcnExtConstWords.WORK_ORDER_NO), MesPcnExtConstWords.WORK_ORDER_NO, packBean);
|
||||
DdlPreparedPack.getStringLikerPack(paramMap.get(MesPcnExtConstWords.CUST_SN), MesPcnExtConstWords.CUST_SN, packBean);
|
||||
|
||||
if (pushSourceCodeList.size() == 1) DdlPreparedPack.getStringEqualPack(pushSourceCodeList.get(0), MesPcnExtConstWords.PUSH_SOURCE_CODE, packBean);
|
||||
else DdlPreparedPack.getInPackList(pushSourceCodeList, MesPcnExtConstWords.PUSH_SOURCE_CODE, packBean);
|
||||
|
||||
if (paramMap.containsKey(MesPcnExtConstWords.QUEUE_STATUS)) {
|
||||
List<Integer> queueStatusList = Arrays.stream(paramMap.get(MesPcnExtConstWords.QUEUE_STATUS).split(MesPcnExtConstWords.COMMA)).map(Integer::parseInt).collect(Collectors.toList());
|
||||
if (queueStatusList.size() == 1) DdlPreparedPack.getNumEqualPack(queueStatusList.get(0), MesPcnExtConstWords.QUEUE_STATUS, packBean);
|
||||
else DdlPreparedPack.getInPackList(queueStatusList, MesPcnExtConstWords.QUEUE_STATUS, packBean);
|
||||
}
|
||||
|
||||
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{MesPcnExtConstWords.CREATE_DATE_TIME}, packBean);
|
||||
|
||||
pager = PagerHelper.getPager(pager, queueOrderPushRepository.findByHqlWhereCount(packBean));
|
||||
List<MesQueueOrderPush> list = queueOrderPushRepository.findByHqlWherePage(packBean, pager);
|
||||
|
||||
return new ListPager<>(list, pager);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,164 @@
|
||||
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.station.function;
|
||||
|
||||
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesEnumExtService;
|
||||
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
|
||||
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesQueueOrderPushService;
|
||||
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
|
||||
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseSwsService;
|
||||
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.function.IFsmModuleFunctionService;
|
||||
import cn.estsh.i3plus.pojo.base.bean.ListPager;
|
||||
import cn.estsh.i3plus.pojo.base.common.Pager;
|
||||
import cn.estsh.i3plus.pojo.base.common.PagerHelper;
|
||||
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
|
||||
import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPushCellCfg;
|
||||
import cn.estsh.i3plus.pojo.mes.model.ButtonDynamicModel;
|
||||
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
|
||||
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
|
||||
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
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.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @Description : 工位参数按钮事件接口实现【队列推送】
|
||||
**/
|
||||
@Service
|
||||
public class MesFunctionQueueOrderPushService extends BaseSwsService implements IFsmModuleFunctionService {
|
||||
|
||||
@Autowired
|
||||
private IMesProductionProcessContextStepService productionProcessContextStepService;
|
||||
|
||||
@Autowired
|
||||
private IMesQueueOrderPushService queueOrderPushService;
|
||||
|
||||
@Autowired
|
||||
private IMesEnumExtService enumExtService;
|
||||
|
||||
@Override
|
||||
public Object doCustomApiDispatch(StationRequestBean reqBean, StationResultBean resultBean, ButtonDynamicModel buttonDynamicModel) {
|
||||
|
||||
//页面渲染数据集
|
||||
Map<String, Object> resultMap = new HashMap<>();
|
||||
|
||||
//验证参数
|
||||
Map<String, String> paramMap = null;
|
||||
try {
|
||||
paramMap = StringUtils.isEmpty(buttonDynamicModel.getFunctionValue()) ? null : JSONObject.parseObject(buttonDynamicModel.getFunctionValue(), Map.class);
|
||||
} catch (Exception e) {
|
||||
}
|
||||
if (CollectionUtils.isEmpty(paramMap) || StringUtils.isEmpty(BUSI_TYPE.valueOfDescription(paramMap.get(MesPcnExtConstWords.BUSI_TYPE)))) {
|
||||
resultMap.put(MesPcnExtConstWords.DATA_TYPE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT.getValue());
|
||||
return packResultMap(reqBean, resultBean, resultMap, String.format("[%s]参数异常!", buttonDynamicModel.getButtonName()));
|
||||
}
|
||||
|
||||
//查询
|
||||
if (BUSI_TYPE.ONE.value.equals(paramMap.get(MesPcnExtConstWords.BUSI_TYPE))) return queryQueueOrderPush(reqBean, resultMap, paramMap);
|
||||
|
||||
this.sendMessage(reqBean, new StationResultBean().writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PICK.getValue()),
|
||||
String.format("[%s]%s: %s", buttonDynamicModel.getButtonName(), BUSI_TYPE.valueOfDescription(paramMap.get(MesPcnExtConstWords.BUSI_TYPE)), JSONObject.toJSONString(paramMap)),
|
||||
MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
|
||||
|
||||
resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PICK.getValue());
|
||||
resultMap.put(MesPcnExtConstWords.DATA_TYPE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT.getValue());
|
||||
|
||||
if (BUSI_TYPE.TWO.value.equals(paramMap.get(MesPcnExtConstWords.BUSI_TYPE))) queryQueueOrderPush(reqBean, resultMap, paramMap);
|
||||
else if (BUSI_TYPE.THREE.value.equals(paramMap.get(MesPcnExtConstWords.BUSI_TYPE))) queryQueueOrderPush(reqBean, resultMap, paramMap);
|
||||
else queryQueueOrderPush(reqBean, resultMap, paramMap);
|
||||
|
||||
if (!resultMap.containsKey(MesPcnExtConstWords.MESSAGE)) {
|
||||
resultMap.put(MesPcnExtConstWords.DATA_TYPE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT.getValue());
|
||||
resultMap.put(MesPcnExtConstWords.MESSAGE, String.format("[%s]%s成功!", buttonDynamicModel.getButtonName(), BUSI_TYPE.valueOfDescription(paramMap.get(MesPcnExtConstWords.BUSI_TYPE))));
|
||||
}
|
||||
|
||||
return resultMap;
|
||||
|
||||
}
|
||||
|
||||
private Object queryQueueOrderPush(StationRequestBean reqBean, Map<String, Object> resultMap, Map<String, String> paramMap) {
|
||||
|
||||
Pager pager = new Pager();
|
||||
pager.setCurrentPage(paramMap.containsKey(MesPcnExtConstWords.CURRENT_PAGE) ? Integer.valueOf(paramMap.get(MesPcnExtConstWords.CURRENT_PAGE)) : MesPcnExtConstWords.ONE);
|
||||
pager.setPageSize(paramMap.containsKey(MesPcnExtConstWords.PAGE_SIZE) ? Integer.valueOf(paramMap.get(MesPcnExtConstWords.PAGE_SIZE)) : MesPcnExtConstWords.FIFTY);
|
||||
|
||||
resultMap.put(MesPcnExtConstWords.QUEUE_STATUS, enumExtService.doGetMesEnumByEnumName(reqBean.getOrganizeCode(), MesExtEnumUtil.QUEUE_ORDER_STATUS.class.getSimpleName()));
|
||||
|
||||
//处理排序线推单上下文, 返回推送工位类型对应的配置信息 【来源工位】
|
||||
List<MesQueueOrderPushCellCfg> queueOrderPushCellCfgList = productionProcessContextStepService.dispatchQueueOrderPushCellCfgContext(reqBean, MesExtEnumUtil.QUEUE_ORDER_CELL_PUSH_TYPE.TARGET.getValue());
|
||||
List<String> pushSourceCodeList = (queueOrderPushCellCfgList.stream()
|
||||
.filter(o -> (null != o && !StringUtils.isEmpty(o.getPushSourceCode()))).map(MesQueueOrderPushCellCfg::getPushSourceCode).collect(Collectors.toList())
|
||||
).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList());
|
||||
|
||||
if (!CollectionUtils.isEmpty(pushSourceCodeList)) resultMap.put(MesPcnExtConstWords.PUSH_SOURCE_CODE, pushSourceCodeList);
|
||||
else {
|
||||
pager = PagerHelper.getPager(pager, MesPcnExtConstWords.ZERO);
|
||||
resultMap.put(MesPcnExtConstWords.DATA, new ListPager<>(new ArrayList<>(), pager));
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
paramMap.put(MesPcnExtConstWords.ORGANIZE_CODE, reqBean.getOrganizeCode());
|
||||
//根据配置查询生产队列工位推送信息
|
||||
resultMap.put(MesPcnExtConstWords.DATA, queueOrderPushService.queryQueueOrderPushListPager(paramMap, pushSourceCodeList, pager));
|
||||
return resultMap;
|
||||
|
||||
}
|
||||
|
||||
//返回提示信息
|
||||
private Object packResultMap(StationRequestBean reqBean, StationResultBean resultBean, Map<String, Object> resultMap, String message) {
|
||||
this.sendMessage(reqBean, resultBean, message, MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT);
|
||||
resultMap.put(MesPcnExtConstWords.MESSAGE, message);
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
//业务操作
|
||||
enum BUSI_TYPE {
|
||||
|
||||
ONE("1", "查询"),
|
||||
|
||||
TWO("2", "新增"),
|
||||
|
||||
THREE("3", "修改"),
|
||||
|
||||
FOUR("4", "取消");
|
||||
|
||||
private String value;
|
||||
|
||||
private String description;
|
||||
|
||||
BUSI_TYPE(String value, String description) {
|
||||
|
||||
this.value = value;
|
||||
|
||||
this.description = description;
|
||||
|
||||
}
|
||||
|
||||
public String getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
public static String valueOfDescription(String val) {
|
||||
if (StringUtils.isEmpty(val)) return null;
|
||||
String tmp = null;
|
||||
for (int i = 0; i < values().length; i++) {
|
||||
if (val.equals(values()[i].value)) {
|
||||
tmp = values()[i].description;
|
||||
}
|
||||
}
|
||||
return tmp;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,229 @@
|
||||
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
|
||||
|
||||
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionCustomContextStepService;
|
||||
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService;
|
||||
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
|
||||
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesQueueOrderPushService;
|
||||
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext;
|
||||
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCollectContext;
|
||||
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
|
||||
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.fsm.BaseStepService;
|
||||
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IStepService;
|
||||
import cn.estsh.i3plus.mes.pcn.util.StringUtil;
|
||||
import cn.estsh.i3plus.platform.common.tool.TimeTool;
|
||||
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
|
||||
import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPush;
|
||||
import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPushCellCfg;
|
||||
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.i3plus.pojo.mes.util.MesExtEnumUtil;
|
||||
import cn.estsh.impp.framework.boot.util.SpringContextsUtil;
|
||||
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.util.*;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @Description : 工位工单接收工步
|
||||
* @Author : wangjie
|
||||
**/
|
||||
@Slf4j
|
||||
@Service("mesWorkOrderQueueAcceptStepService")
|
||||
public class MesWorkOrderQueueAcceptStepService extends BaseStepService {
|
||||
|
||||
@Autowired
|
||||
private IMesProductionProcessContextStepService productionProcessContextStepService;
|
||||
|
||||
@Autowired
|
||||
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
|
||||
|
||||
@Autowired
|
||||
private IMesProductionCustomContextStepService productionCustomContextStepService;
|
||||
|
||||
@Autowired
|
||||
private IMesQueueOrderPushService queueOrderPushService;
|
||||
|
||||
@Autowired
|
||||
private IFsmCommonService fsmCommonService;
|
||||
|
||||
private static Map<String, String> lockTimeMap = new HashMap<>();
|
||||
private static Map<String, ReentrantLock> lockMap = new ConcurrentHashMap<>();
|
||||
|
||||
@Override
|
||||
public StepResult init(StationRequestBean reqBean) {
|
||||
|
||||
StepResult stepResult = StepResult.getSuccessComplete();
|
||||
|
||||
String endlessLoopReadTimes = fsmCommonService.handleFsmWcpcMapDataForDoScan(reqBean).get(MesPcnExtConstWords.ENDLESS_LOOP_READ_TIMES);
|
||||
if (StringUtils.isEmpty(endlessLoopReadTimes)) endlessLoopReadTimes = MesPcnExtConstWords.ENDLESS_LOOP_READ_TIMES_DEFAULT;
|
||||
if (productionDispatchContextStepService.dispatchOverEndlessLoopReadTimes(reqBean, endlessLoopReadTimes)) {
|
||||
stepThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, new StationResultBean().isWs(false),
|
||||
stepResult.isCompleted(false).msg(String.format("当前未获取到工位工单队列超过[%s]次!", endlessLoopReadTimes)),
|
||||
MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, getStepParams(reqBean), MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
|
||||
}
|
||||
|
||||
//发送工步内容
|
||||
productionCustomContextStepService.sendStepContextMessage(reqBean);
|
||||
|
||||
return stepResult;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public StepResult execute(StationRequestBean reqBean) {
|
||||
|
||||
StationResultBean resultBean = new StationResultBean();
|
||||
|
||||
StepResult stepResult = StepResult.getSuccessComplete();
|
||||
|
||||
//获取上下文信息
|
||||
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean);
|
||||
|
||||
//配置错误 抛出异常
|
||||
if (!productionProcessContext.getSuccess()) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
|
||||
|
||||
//存储生产过程上下文对象
|
||||
productionProcessContextStepService.dispatchProductionProcessContext(reqBean, productionProcessContext);
|
||||
|
||||
//处理排序线推单上下文, 返回推送工位类型对应的配置信息 【来源工位】
|
||||
List<MesQueueOrderPushCellCfg> queueOrderPushCellCfgList = productionProcessContextStepService.dispatchQueueOrderPushCellCfgContext(reqBean, MesExtEnumUtil.QUEUE_ORDER_CELL_PUSH_TYPE.TARGET.getValue());
|
||||
if (CollectionUtils.isEmpty(queueOrderPushCellCfgList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(),
|
||||
String.format("生产线[%s]工位[%s]未配置[%s]类型的生产队列推送工位配置信息!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), MesExtEnumUtil.QUEUE_ORDER_CELL_PUSH_TYPE.TARGET.getDescription()));
|
||||
|
||||
MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip();
|
||||
|
||||
//推送来源代码集合查询创建状态的生产队列工位推送信息
|
||||
List<MesQueueOrderPush> queueOrderPushList = queueOrderPushService.getQueueOrderPushList(reqBean.getOrganizeCode(), queueOrderPushCellCfgList);
|
||||
if (CollectionUtils.isEmpty(queueOrderPushList) || queueOrderPushList.size() < cellEquipContext.getCavity()) {
|
||||
return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().checkRepeat(), stepResult,
|
||||
false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT,
|
||||
CollectionUtils.isEmpty(queueOrderPushList) ? "当前未接收到工位工单队列,持续监听中..." : String.format("当前接收到到工位工单队列个数[%s]不满足腔数[%s],持续监听中...", queueOrderPushList.size(), cellEquipContext.getCavity()),
|
||||
getStepParams(reqBean), MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
|
||||
}
|
||||
|
||||
//搜集需要考虑加锁的推送来源代码
|
||||
List<String> pushSourceCodeList = queueOrderPushCellCfgList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getIsNeedLock()))).map(MesQueueOrderPushCellCfg::getPushSourceCode).collect(Collectors.toList());
|
||||
|
||||
//当前即将执行的接收队列
|
||||
List<MesQueueOrderPush> curPushList = null;
|
||||
|
||||
try {
|
||||
//验证是否执行加锁
|
||||
for (MesQueueOrderPush queueOrderPush : queueOrderPushList) {
|
||||
if (null == queueOrderPush || StringUtils.isEmpty(queueOrderPush.getWorkOrderNo())) continue;
|
||||
//当前遍历中的代码不考虑加锁
|
||||
if (CollectionUtils.isEmpty(pushSourceCodeList) || !pushSourceCodeList.contains(queueOrderPush.getPushSourceCode())) {
|
||||
if (CollectionUtils.isEmpty(curPushList)) curPushList = new ArrayList<>();
|
||||
curPushList.add(queueOrderPush);
|
||||
//满足腔数的情况下退出循环
|
||||
if (curPushList.size() >= cellEquipContext.getCavity()) break;
|
||||
} else {
|
||||
//当前遍历中的代码考虑加锁; 获取不到锁的情况下退出循环
|
||||
if (!tryLock(reqBean.getWorkCenterCode(), queueOrderPush.getPushSourceCode())) break;
|
||||
List<String> queuePushIdList = productionCustomContextStepService.getSortQueuePushLockContext(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode());
|
||||
if (!CollectionUtils.isEmpty(queuePushIdList) && queuePushIdList.contains(queueOrderPush.getId().toString())) continue;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//验证是否满足腔数
|
||||
if (CollectionUtils.isEmpty(curPushList) || curPushList.size() < cellEquipContext.getCavity()) {
|
||||
return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().checkRepeat(), stepResult,
|
||||
false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT,
|
||||
CollectionUtils.isEmpty(curPushList) ? "当前未接收到工位工单队列,持续监听中..." : String.format("当前接收到到工位工单队列个数[%s]不满足腔数[%s],持续监听中...", curPushList.size(), cellEquipContext.getCavity()),
|
||||
getStepParams(reqBean), MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
|
||||
}
|
||||
|
||||
//搜集工单号
|
||||
List<String> workOrderNoList = curPushList.stream().filter(o -> null != o).map(MesQueueOrderPush::getWorkOrderNo).collect(Collectors.toList());
|
||||
|
||||
//发送工步内容
|
||||
productionCustomContextStepService.sendStepContextMessage(reqBean, workOrderNoList.toString(), MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ);
|
||||
|
||||
List<MesEquipVariableCollectContext> equipVariableCollectContextList = new ArrayList<>();
|
||||
workOrderNoList.stream().filter(o -> !StringUtils.isEmpty(o)).forEach(o ->
|
||||
equipVariableCollectContextList.add(new MesEquipVariableCollectContext(reqBean.getOrganizeCode(), o, MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ.getValue())));
|
||||
//保存上下文扫/读信息:加工单
|
||||
productionDispatchContextStepService.dispatchScanWorkOrderNoContext(reqBean, equipVariableCollectContextList);
|
||||
|
||||
this.sendMessage(reqBean, new StationResultBean().writeDbLog(), String.format("获取到工位工单推送队列%s!", workOrderNoList.toString()), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
|
||||
|
||||
log.info("工厂{}生产线{}工位{}:FSM STATE DISPATCHER --- DO STEP --- {} EXEC --- QUEUE_ORDER_PUSH:{}",
|
||||
reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), JSONObject.toJSONString(curPushList));
|
||||
|
||||
//加工单验证工步 【排序】
|
||||
stepResult = ((IStepService) SpringContextsUtil.getBean("mesWorkOrderCheckSortStepService")).executeInState(reqBean);
|
||||
|
||||
//保存上下文推单信息
|
||||
if (stepResult.isCompleted()) productionDispatchContextStepService.dispatchSortQueuePushContext(reqBean, curPushList);
|
||||
|
||||
return stepResult;
|
||||
|
||||
} finally {
|
||||
|
||||
//验证是否执行解锁
|
||||
if (!CollectionUtils.isEmpty(curPushList)) {
|
||||
for (MesQueueOrderPush queueOrderPush : curPushList) {
|
||||
if (null == queueOrderPush) continue;
|
||||
if (CollectionUtils.isEmpty(pushSourceCodeList) || !pushSourceCodeList.contains(queueOrderPush.getPushSourceCode())) continue;
|
||||
//当需要考虑加锁且满足腔数的情况下, 保存排序线工单队列推送锁数据
|
||||
if (curPushList.size() >= cellEquipContext.getCavity()) productionCustomContextStepService.dispatchSortQueuePushLockContext(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), queueOrderPush.getId().toString());
|
||||
//解锁
|
||||
unLock(reqBean.getWorkCenterCode(), queueOrderPush.getPushSourceCode());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//加锁
|
||||
private Boolean tryLock(String workCenterCode, String pushSourceCode) {
|
||||
try {
|
||||
String key = new StringJoiner(MesPcnExtConstWords.AND).add(workCenterCode).add(pushSourceCode).toString();
|
||||
ReentrantLock lock = lockMap.computeIfAbsent(key, item -> new ReentrantLock(true));
|
||||
//500ms内拿不到锁的情况下监控锁是否已经超时
|
||||
if (!lock.tryLock(MesPcnExtConstWords.FIVE_HUNDRED, TimeUnit.MILLISECONDS) && checkTimeOut(key, lock)) return false;
|
||||
lockTimeMap.put(key, TimeTool.getNowTime(true));
|
||||
return true;
|
||||
} catch (InterruptedException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
//监控超过10秒的情况下进行自动解锁
|
||||
private Boolean checkTimeOut(String key, ReentrantLock lock) {
|
||||
try {
|
||||
String lockTime = lockTimeMap.get(key);
|
||||
if ((StringUtils.isEmpty(lockTime) || TimeTool.getSecoundsBetweenTime(1, lockTime, TimeTool.getNowTime(true)) >= MesPcnExtConstWords.TEN) && lock.isLocked()) lock.unlock();
|
||||
} catch (Exception e) {
|
||||
if (lock.isLocked()) lock.unlock();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
//解锁
|
||||
private void unLock(String workCenterCode, String pushSourceCode) {
|
||||
try {
|
||||
String key = new StringJoiner(MesPcnExtConstWords.AND).add(workCenterCode).add(pushSourceCode).toString();
|
||||
lockMap.computeIfPresent(key, (k, v) -> {
|
||||
if (!v.isHeldByCurrentThread() || !v.isLocked()) return v;
|
||||
v.unlock();
|
||||
return v;
|
||||
});
|
||||
} catch (Exception e) {
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,88 @@
|
||||
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
|
||||
|
||||
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService;
|
||||
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
|
||||
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesQueueOrderPushService;
|
||||
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPartContext;
|
||||
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
|
||||
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext;
|
||||
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
|
||||
import cn.estsh.i3plus.mes.pcn.util.StringUtil;
|
||||
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
|
||||
import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPushCellCfg;
|
||||
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.i3plus.pojo.mes.util.MesExtEnumUtil;
|
||||
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.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @Description : 工位工单推送工步
|
||||
* @Author : wangjie
|
||||
**/
|
||||
@Slf4j
|
||||
@Service("mesWorkOrderQueuePushStepService")
|
||||
public class MesWorkOrderQueuePushStepService extends BaseStepService {
|
||||
|
||||
@Autowired
|
||||
private IMesProductionProcessContextStepService productionProcessContextStepService;
|
||||
|
||||
@Autowired
|
||||
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
|
||||
|
||||
@Autowired
|
||||
private IMesQueueOrderPushService queueOrderPushService;
|
||||
|
||||
@Override
|
||||
public StepResult execute(StationRequestBean reqBean) {
|
||||
|
||||
StationResultBean resultBean = new StationResultBean();
|
||||
|
||||
StepResult stepResult = StepResult.getSuccessComplete();
|
||||
|
||||
//获取上下文信息
|
||||
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean);
|
||||
|
||||
//配置错误 抛出异常
|
||||
if (!productionProcessContext.getSuccess()) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
|
||||
|
||||
//存储生产过程上下文对象
|
||||
productionProcessContextStepService.dispatchProductionProcessContext(reqBean, productionProcessContext);
|
||||
|
||||
//处理排序线推单配置上下文, 返回推送工位类型对应的配置信息 【来源工位】
|
||||
List<MesQueueOrderPushCellCfg> queueOrderPushCellCfgList = productionProcessContextStepService.dispatchQueueOrderPushCellCfgContext(reqBean, MesExtEnumUtil.QUEUE_ORDER_CELL_PUSH_TYPE.SOURCE.getValue());
|
||||
if (CollectionUtils.isEmpty(queueOrderPushCellCfgList)) {
|
||||
return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()),
|
||||
stepResult, true, MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT,
|
||||
String.format("生产线[%s]工位[%s]未配置[%s]类型的生产队列推送工位配置信息,当前跳过工位工单推送!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), MesExtEnumUtil.QUEUE_ORDER_CELL_PUSH_TYPE.SOURCE.getDescription()));
|
||||
}
|
||||
|
||||
//获取上下文产出条码信息
|
||||
List<MesProductionPsOutContext> productionPsOutContextList = productionDispatchContextStepService.getProductionPsOutContext(reqBean);
|
||||
//获取上下文产出零件信息
|
||||
List<MesProductionPartContext> productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean);
|
||||
if (CollectionUtils.isEmpty(productionPsOutContextList) || CollectionUtils.isEmpty(productionPartContextList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在产出零件条码信息,请重置工序解决!");
|
||||
|
||||
//写入工位工单推送信息
|
||||
productionPsOutContextList.stream().forEach(o ->
|
||||
queueOrderPushService.insertQueueOrderPush(reqBean.getOrganizeCode(), reqBean.getUserInfo(), queueOrderPushCellCfgList, o,
|
||||
productionPartContextList.stream().filter(i -> (null != o && !StringUtils.isEmpty(i.getForeignKey()) && i.getForeignKey().compareTo(o.getForeignKey()) == 0)).findFirst().get())
|
||||
);
|
||||
|
||||
log.info("工厂{}生产线{}工位{}:FSM STATE DISPATCHER --- DO STEP --- {} EXEC --- ORDER:{} --- PUSH_SOURCE_CODE:{}",
|
||||
reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()),
|
||||
productionPsOutContextList.stream().filter(o -> null != o).map(MesProductionPsOutContext::getWorkOrderNo).collect(Collectors.toList()).toString(),
|
||||
queueOrderPushCellCfgList.stream().filter(o -> null != o).map(MesQueueOrderPushCellCfg::getPushSourceCode).collect(Collectors.toList()).toString());
|
||||
|
||||
return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), stepResult, "工位工单推送成功!");
|
||||
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue