Merge branch 'uat-temp-wj-2502060000-chongqing-step' into dev

dev
王杰 2 months ago
commit 53330ff307

@ -9,4 +9,7 @@ public interface IMesEnumExtService {
@ApiOperation("根据枚举名获取枚举")
Map<String, Object> doGetMesEnumByEnumName(String organizeCode, String enumName);
@ApiOperation("通过class获取枚举")
Map<String, Object> getEnumByClazzEnum(String enumName, Class clazz);
}

@ -48,9 +48,18 @@ public interface IMesEquipmentExtService {
@ApiOperation(value = "根据设备代码查询加工不可用规则信息")
List<MesProdRuleIgnoreCfg> getProdRuleIgnoreCfgListByEquip(String organizeCode, String equipmentCode);
@ApiOperation(value = "根据设备代码集合查询加工不可用规则信息")
List<MesProdRuleIgnoreCfg> getProdRuleIgnoreCfgListByWcEquips(String organizeCode, List<MesWcEquipment> wcEquipmentList);
@ApiOperation(value = "根据设备代码集合查询加工不可用规则信息")
List<MesProdRuleIgnoreCfg> getProdRuleIgnoreCfgListByEquips(String organizeCode, List<String> equipmentCodeList);
@ApiOperation(value = "根据生产线代码查询加工不可用规则信息")
List<MesProdRuleIgnoreCfg> getProdRuleIgnoreCfgListByCenter(String organizeCode, String workCenterCode);
@ApiOperation(value = "根据工位代码查询加工不可用规则信息")
List<MesProdRuleIgnoreCfg> getProdRuleIgnoreCfgListByCell(String organizeCode, String workCenterCode, String workCellCode);
@ApiOperation(value = "根据设备代码, 来源信息查询加工不可用规则信息")
List<MesProdRuleIgnoreCfg> getProdRuleIgnoreCfgList(String organizeCode, String equipmentCode, Integer dataSource, Long sourceId);

@ -46,7 +46,7 @@ public interface IMesAssemblyExtService {
List<MesProductionAssemblyNosortContext> getProductionAssemblyNosortContextList(String organizeCode, String equipmentCode, Map<String, List<MesProdRuleIgnoreCfg>> prodRuleIgnoreCfgMap);
@ApiOperation(value = "获取不可用规则")
String getProdRuleIgnoreCfg(Map<String, List<MesProdRuleIgnoreCfg>> prodRuleIgnoreCfgMap, Long id, String dataSorce);
String getProdRuleIgnoreCfg(Map<String, List<MesProdRuleIgnoreCfg>> prodRuleIgnoreCfgMap, Long id, String equipmentCode, String dataSorce);
@ApiOperation(value = "【排序线】获取生产工单装配件清单")
List<MesWorkOrderAssembly> getWorkOrderAssemblyList(String organizeCode, String workOrderNo, String productSn, String craftCode);

@ -103,4 +103,13 @@ public interface IMesProductionCustomContextStepService {
@ApiOperation(value = "删除打包数据")
void removePackageDataContext(StationRequestBean reqBean);
@ApiOperation(value = "获取排序线工单队列推送锁数据")
List<String> getSortQueuePushLockContext(String orgainzeCode, String workCenterCode);
@ApiOperation(value = "保存排序线工单队列推送锁数据")
Boolean dispatchSortQueuePushLockContext(String organizeCode, String workCenterCode, String queuePushId);
@ApiOperation(value = "删除排序线工单队列推送锁数据")
void removeSortQueuePushLockContext(String orgainzeCode, String workCenterCode, String queuePushId);
}

@ -2,6 +2,7 @@ package cn.estsh.i3plus.ext.mes.pcn.api.busi;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesWorkOrderCutDetailModel;
import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPush;
import cn.estsh.i3plus.pojo.mes.bean.MesRawPartCharging;
import cn.estsh.i3plus.pojo.mes.bean.shipping.MesShippingQueue;
import cn.estsh.i3plus.pojo.mes.model.StationKvBean;
@ -243,4 +244,10 @@ public interface IMesProductionDispatchContextStepService {
@ApiOperation(value = "保存上下文发运队列信息")
Boolean dispatchShippingQueueContext(StationRequestBean reqBean, MesShippingQueue shippingQueue);
@ApiOperation(value = "获取上下文推单队列信息")
List<MesQueueOrderPush> getSortQueuePushContext(StationRequestBean reqBean);
@ApiOperation(value = "保存上下文推单队列信息")
Boolean dispatchSortQueuePushContext(StationRequestBean reqBean, List<MesQueueOrderPush> queueOrderPushList);
}

@ -188,4 +188,7 @@ public interface IMesProductionProcessContextStepService {
@ApiOperation(value = "获取加工不可用规则, key = 数据来源&来源ID")
Map<String, List<MesProdRuleIgnoreCfg>> getProdRuleIgnoreCfgContextMap(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext);
@ApiOperation(value = "处理排序线推单配置上下文, 返回推送工位类型对应的配置信息")
List<MesQueueOrderPushCellCfg> dispatchQueueOrderPushCellCfgContext(StationRequestBean reqBean, Integer pushType);
}

@ -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);
}

@ -2,6 +2,7 @@ package cn.estsh.i3plus.ext.mes.pcn.api.busi;
import cn.estsh.i3plus.pojo.base.bean.BaseBean;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder;
import io.swagger.annotations.ApiOperation;
@ -44,12 +45,18 @@ public interface IMesWorkOrderExtService {
@ApiOperation(value = "根据生产工单ID查询生产工单信息")
List<MesWorkOrder> getWorkOrderListByShiftCode(String organizeCode, String workCenterCode, String shiftCode);
@ApiOperation(value = "根据条码集合 查询生产工单/产品条码(排序)")
Map<String, Map<String, Object>> getWorkOrderMapSort(String organizeCode, List<String> snList);
@ApiOperation(value = "根据条码集合 查询生产工单/产品条码/队列数据(排序)")
Map<String, Map<String, Object>> getWorkOrderMapSort(String organizeCode, String workCenterCode, String workCellCode, List<String> snList);
Map<String, Map<String, Object>> getWorkOrderMapSort(String organizeCode, List<String> snList, MesWorkCell workCell);
@ApiOperation(value = "根据工单或者客户条码 查询生产工单/产品条码(排序)")
Map<String, Object> getWorkOrderMapSort(String organizeCode, String sn);
@ApiOperation(value = "根据工单或者客户条码 查询生产工单/产品条码/队列数据(排序)")
Map<String, Object> getWorkOrderMapSort(String organizeCode, String sn, MesWorkCell workCell);
@ApiOperation(value = "根据工单或者客户条码 查询生产工单信息(排序)")
BaseBean getWorkOrderSort(String organizeCode, String sn, Boolean isBackOrder);

@ -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);
}
}

@ -47,14 +47,14 @@ public class ButtonDynamicExtService extends ButtonDynamicService {
private IConfigService configService;
@Override
public List<ButtonDynamicModel> filterButtonDynamicModelList(String organizeCode, String workCenterCode, String workCellCode, String windowNo, List<ButtonDynamicModel> buttonDynamicModelList) {
if (CollectionUtils.isEmpty(buttonDynamicModelList)) {
public List<ButtonDynamicModel> filterButtonDynamicModelList(String organizeCode, String workCenterCode, String workCellCode, String windowNo, List<ButtonDynamicModel> buttonDynamicModelList, Integer moduleType) {
if (CollectionUtils.isEmpty(buttonDynamicModelList) && !StringUtils.isEmpty(moduleType) && moduleType.compareTo(MesEnumUtil.WORK_MODULE_TYPE.BUTTON_MODULE.getValue()) == 0) {
MesWorkCell workCell = prodOrgExtService.getWorkCellDb(organizeCode, workCenterCode, workCellCode);
if (null != workCell && !StringUtils.isEmpty(workCell.getGrade()) && workCell.getGrade().compareTo(MesExtEnumUtil.WORK_CELL_GRADE.SCAN.getValue()) == 0) {
if (doAutoInitWorkCellModuleData(organizeCode, workCenterCode, workCellCode, workCell.getId())) buttonDynamicModelList = findWorkModuleList(organizeCode, windowNo);
}
}
return super.filterButtonDynamicModelList(organizeCode, workCenterCode, workCellCode, windowNo, buttonDynamicModelList);
return super.filterButtonDynamicModelList(organizeCode, workCenterCode, workCellCode, windowNo, buttonDynamicModelList, moduleType);
}
private List<ButtonDynamicModel> findWorkModuleList(String organizeCode, String windowNo) {

@ -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;
}
}

@ -215,6 +215,26 @@ public class MesEquipmentExtService implements IMesEquipmentExtService {
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), equipmentCode});
}
//根据设备代码集合查询加工不可用规则信息
@Override
public List<MesProdRuleIgnoreCfg> getProdRuleIgnoreCfgListByWcEquips(String organizeCode, List<MesWcEquipment> wcEquipmentList) {
if (StringUtils.isEmpty(organizeCode) || CollectionUtils.isEmpty(wcEquipmentList)) return null;
List<String> equipmentCodeList = CollectionUtils.isEmpty(wcEquipmentList) ? null :
wcEquipmentList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getEquipmentCode()))).map(MesWcEquipment::getEquipmentCode).collect(Collectors.toList());
return getProdRuleIgnoreCfgListByEquips(organizeCode, equipmentCodeList);
}
//根据设备代码集合查询加工不可用规则信息
@Override
public List<MesProdRuleIgnoreCfg> getProdRuleIgnoreCfgListByEquips(String organizeCode, List<String> equipmentCodeList) {
if (StringUtils.isEmpty(organizeCode) || CollectionUtils.isEmpty(equipmentCodeList)) return null;
equipmentCodeList = equipmentCodeList.stream().filter(o -> StringUtils.isEmpty(o)).distinct().collect(Collectors.toList());
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
if (equipmentCodeList.size() == 1) DdlPreparedPack.getStringEqualPack(equipmentCodeList.get(0), MesPcnExtConstWords.EQUIPMENT_CODE, packBean);
else DdlPreparedPack.getInPackList(equipmentCodeList, MesPcnExtConstWords.EQUIPMENT_CODE, packBean);
return prodRuleIgnoreCfgRepository.findByHqlWhere(packBean);
}
//根据生产线代码查询加工不可用规则信息
@Override
public List<MesProdRuleIgnoreCfg> getProdRuleIgnoreCfgListByCenter(String organizeCode, String workCenterCode) {
@ -222,13 +242,17 @@ public class MesEquipmentExtService implements IMesEquipmentExtService {
List<MesWcEquipment> wcEquipmentList = wcEquipmentRepository.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});
List<String> equipmentCodeList = CollectionUtils.isEmpty(wcEquipmentList) ? null :
(wcEquipmentList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getEquipmentCode()))).map(MesWcEquipment::getEquipmentCode).collect(Collectors.toList())).stream().filter(o -> null != o).distinct().collect(Collectors.toList());
if (CollectionUtils.isEmpty(equipmentCodeList)) return null;
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
if (equipmentCodeList.size() == 1) DdlPreparedPack.getStringEqualPack(equipmentCodeList.get(0), MesPcnExtConstWords.EQUIPMENT_CODE, packBean);
else DdlPreparedPack.getInPackList(equipmentCodeList, MesPcnExtConstWords.EQUIPMENT_CODE, packBean);
return prodRuleIgnoreCfgRepository.findByHqlWhere(packBean);
return getProdRuleIgnoreCfgListByWcEquips(organizeCode, wcEquipmentList);
}
//根据工位代码查询加工不可用规则信息
@Override
public List<MesProdRuleIgnoreCfg> getProdRuleIgnoreCfgListByCell(String organizeCode, String workCenterCode, String workCellCode) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workCenterCode) || StringUtils.isEmpty(workCellCode)) return null;
List<MesWcEquipment> wcEquipmentList = wcEquipmentRepository.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});
return getProdRuleIgnoreCfgListByWcEquips(organizeCode, wcEquipmentList);
}
//根据设备代码, 来源信息查询加工不可用规则信息

@ -82,7 +82,7 @@ public class MesAssemblyExtService implements IMesAssemblyExtService {
workOrderAssemblyList.forEach(o -> productionAssemblySortContextList.add(
new MesProductionAssemblySortContext().copy(o).fileUrl(fileMap).foreignKey(prodRuleContext.getForeignKey())
.prodRuleIgnoreCfg(getProdRuleIgnoreCfg(prodRuleIgnoreCfgMap, o.getPid(), MesExtEnumUtil.PROD_RULE_IGNORE_DATA_SOURCE.DATA_SOURCE10.getValueStr()))
.prodRuleIgnoreCfg(getProdRuleIgnoreCfg(prodRuleIgnoreCfgMap, o.getPid(), o.getEquipmentCode(), MesExtEnumUtil.PROD_RULE_IGNORE_DATA_SOURCE.DATA_SOURCE10.getValueStr()))
)
);
@ -116,7 +116,7 @@ public class MesAssemblyExtService implements IMesAssemblyExtService {
new MesProductionAssemblySortContext()
.copy(o, getProductionAssembly(productionAssemblyMap, o.getId()), getIsCheckBindSeq(getWorkCell(workCellMap, o.getWorkCellCode())))
.foreignKey(prodRuleContext.getForeignKey())
.prodRuleIgnoreCfg(getProdRuleIgnoreCfg(prodRuleIgnoreCfgMap, o.getPid(), MesExtEnumUtil.PROD_RULE_IGNORE_DATA_SOURCE.DATA_SOURCE10.getValueStr()))
.prodRuleIgnoreCfg(getProdRuleIgnoreCfg(prodRuleIgnoreCfgMap, o.getPid(), o.getEquipmentCode(), MesExtEnumUtil.PROD_RULE_IGNORE_DATA_SOURCE.DATA_SOURCE10.getValueStr()))
)
);
@ -204,7 +204,7 @@ public class MesAssemblyExtService implements IMesAssemblyExtService {
assemblyNosortCfgList.forEach(o -> {
MesProductionAssemblyNosortContext productionAssemblyNosortContext = new MesProductionAssemblyNosortContext().copy(prodRuleContext, o).fileUrl(fileMap).foreignKey(prodRuleContext.getForeignKey());
productionAssemblyNosortContext.overrideAssemblyStatus(productionCustomContextStepService.getRepeatAssemblySn(prodRuleContext.getOrganizeCode(), prodRuleContext.getWorkCenterCode(), prodRuleContext.getWorkCellCode(), productionAssemblyNosortContext))
.prodRuleIgnoreCfg(getProdRuleIgnoreCfg(prodRuleIgnoreCfgMap, o.getId(), MesExtEnumUtil.PROD_RULE_IGNORE_DATA_SOURCE.DATA_SOURCE30.getValueStr()));
.prodRuleIgnoreCfg(getProdRuleIgnoreCfg(prodRuleIgnoreCfgMap, o.getId(), o.getEquipmentCode(), MesExtEnumUtil.PROD_RULE_IGNORE_DATA_SOURCE.DATA_SOURCE30.getValueStr()));
productionAssemblyNosortContextList.add(productionAssemblyNosortContext);
});
@ -213,9 +213,9 @@ public class MesAssemblyExtService implements IMesAssemblyExtService {
//获取不可用规则
@Override
public String getProdRuleIgnoreCfg(Map<String, List<MesProdRuleIgnoreCfg>> prodRuleIgnoreCfgMap, Long id, String dataSorce) {
public String getProdRuleIgnoreCfg(Map<String, List<MesProdRuleIgnoreCfg>> prodRuleIgnoreCfgMap, Long id, String equipmentCode, String dataSorce) {
if (CollectionUtils.isEmpty(prodRuleIgnoreCfgMap) || StringUtils.isEmpty(id) || StringUtils.isEmpty(dataSorce)) return null;
String key = new StringJoiner(MesPcnExtConstWords.AND).add(dataSorce).add(id.toString()).toString();
String key = new StringJoiner(MesPcnExtConstWords.AND).add(dataSorce).add(equipmentCode).add(id.toString()).toString();
return prodRuleIgnoreCfgMap.containsKey(key) ? JSONObject.toJSONString(prodRuleIgnoreCfgMap.get(key)) : null;
}
@ -250,7 +250,7 @@ public class MesAssemblyExtService implements IMesAssemblyExtService {
assemblyNosortCfgList.forEach(o -> productionAssemblyNosortContextList.add(
new MesProductionAssemblyNosortContext().copy(o)
.prodRuleIgnoreCfg(getProdRuleIgnoreCfg(prodRuleIgnoreCfgMap, o.getId(), MesExtEnumUtil.PROD_RULE_IGNORE_DATA_SOURCE.DATA_SOURCE30.getValueStr()))
.prodRuleIgnoreCfg(getProdRuleIgnoreCfg(prodRuleIgnoreCfgMap, o.getId(), o.getEquipmentCode(), MesExtEnumUtil.PROD_RULE_IGNORE_DATA_SOURCE.DATA_SOURCE30.getValueStr()))
)
);
@ -269,13 +269,15 @@ public class MesAssemblyExtService implements IMesAssemblyExtService {
//【排序线】获取生产工单装配件清单
@Override
public List<MesWorkOrderAssembly> getWorkOrderAssemblyList(String organizeCode, String workCenterCode, String workCellCode, String workOrderNo, List<String> productSnList) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workCenterCode) || StringUtils.isEmpty(workCellCode) || StringUtils.isEmpty(workOrderNo) || CollectionUtils.isEmpty(productSnList)) return null;
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workCenterCode) || StringUtils.isEmpty(workCellCode) || (StringUtils.isEmpty(workOrderNo) && CollectionUtils.isEmpty(productSnList))) return null;
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(workCenterCode, MesPcnExtConstWords.WORK_CENTER_CODE, packBean);
DdlPreparedPack.getStringEqualPack(workCellCode, MesPcnExtConstWords.WORK_CELL_CODE, packBean);
DdlPreparedPack.getStringEqualPack(workOrderNo, MesPcnExtConstWords.WORK_ORDER_NO, packBean);
if (productSnList.size() == 1) DdlPreparedPack.getStringEqualPack(productSnList.get(0), MesPcnExtConstWords.PRODUCT_SN, packBean);
else DdlPreparedPack.getInPackList(productSnList, MesPcnExtConstWords.PRODUCT_SN, packBean);
if (!CollectionUtils.isEmpty(productSnList)) {
if (productSnList.size() == 1) DdlPreparedPack.getStringEqualPack(productSnList.get(0), MesPcnExtConstWords.PRODUCT_SN, packBean);
else DdlPreparedPack.getInPackList(productSnList, MesPcnExtConstWords.PRODUCT_SN, packBean);
}
return workOrderAssemblyRepository.findByHqlWhere(packBean);
}

@ -85,7 +85,7 @@ public class MesProdRuleCfgExtService implements IMesProdRuleCfgExtService {
@Override
public List<MesProdRuleNosortCfg> getProdRuleNosortCfgList(List<MesProdRuleNosortCfg> prodRuleNosortCfgList, Map<String, List<MesProdRuleIgnoreCfg>> prodRuleIgnoreCfgMap) {
if (CollectionUtils.isEmpty(prodRuleNosortCfgList) || CollectionUtils.isEmpty(prodRuleIgnoreCfgMap)) return prodRuleNosortCfgList;
prodRuleNosortCfgList.stream().forEach(o -> o.setProdRuleIgnoreCfg(assemblyExtService.getProdRuleIgnoreCfg(prodRuleIgnoreCfgMap, o.getId(), MesExtEnumUtil.PROD_RULE_IGNORE_DATA_SOURCE.DATA_SOURCE20.getValueStr())));
prodRuleNosortCfgList.stream().forEach(o -> o.setProdRuleIgnoreCfg(assemblyExtService.getProdRuleIgnoreCfg(prodRuleIgnoreCfgMap, o.getId(), o.getEquipmentCode(), MesExtEnumUtil.PROD_RULE_IGNORE_DATA_SOURCE.DATA_SOURCE20.getValueStr())));
return null;
}
@ -127,7 +127,7 @@ public class MesProdRuleCfgExtService implements IMesProdRuleCfgExtService {
@Override
public MesProdRuleContext getProdRuleNosortContextByPid(MesProdRuleContext prodRuleContext, Map<String, List<MesProdRuleIgnoreCfg>> prodRuleIgnoreCfgMap) {
if (null == prodRuleContext || CollectionUtils.isEmpty(prodRuleIgnoreCfgMap)) return prodRuleContext;
prodRuleContext.setProdRuleIgnoreCfg(assemblyExtService.getProdRuleIgnoreCfg(prodRuleIgnoreCfgMap, prodRuleContext.getPid(), MesExtEnumUtil.PROD_RULE_IGNORE_DATA_SOURCE.DATA_SOURCE20.getValueStr()));
prodRuleContext.setProdRuleIgnoreCfg(assemblyExtService.getProdRuleIgnoreCfg(prodRuleIgnoreCfgMap, prodRuleContext.getPid(), prodRuleContext.getEquipmentCode(), MesExtEnumUtil.PROD_RULE_IGNORE_DATA_SOURCE.DATA_SOURCE20.getValueStr()));
return prodRuleContext;
}

@ -201,11 +201,10 @@ public class MesProduceSnExtService implements IMesProduceSnExtService {
//根据零件条码,生产线,工位查询工位队列信息
@Override
public Map<String, List<MesQueueOrder>> getQueueOrderMap(String organizeCode, String workCenterCode, String workCellCode, List<String> productSnList) {
//根据零件条码,生产线,工位查询工位队列信息
List<MesQueueOrder> queueOrderList = getQueueOrderList(organizeCode, workCenterCode, workCellCode, productSnList);
//先排序再分组
return CollectionUtils.isEmpty(queueOrderList) ? null : queueOrderList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesQueueOrder::getProductSn));
}
private List<MesProduceSn> distinctProduceSnList(List<MesProduceSn> produceSnDataList) {

@ -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);
}
}

@ -12,6 +12,7 @@ import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrder;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder;
import cn.estsh.i3plus.pojo.mes.repository.MesWorkOrderRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
@ -161,57 +162,20 @@ public class MesWorkOrderExtService implements IMesWorkOrderExtService {
}
@Override
public Map<String, Map<String, Object>> getWorkOrderMapSort(String organizeCode, String workCenterCode, String workCellCode, List<String> snList) {
public Map<String, Map<String, Object>> getWorkOrderMapSort(String organizeCode, List<String> snList) {
return getWorkOrderMapSort(organizeCode, snList, null);
}
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workCenterCode) || StringUtils.isEmpty(workCellCode) || CollectionUtils.isEmpty(snList)) return null;
@Override
public Map<String, Map<String, Object>> getWorkOrderMapSort(String organizeCode, List<String> snList, MesWorkCell workCell) {
if (StringUtils.isEmpty(organizeCode) || CollectionUtils.isEmpty(snList)) return null;
snList = snList.size() == 1 ? snList : snList.stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList());
Map<String, Map<String, Object>> workOrderMap = new HashMap<>();
for (String sn : snList) {
if (StringUtils.isEmpty(sn)) continue;
Map<String, Object> itemMap = new HashMap<>();
if (sn.length() == MesPcnExtConstWords.CUSTOMER_SN_LENGTH_GM) {
MesProduceSn produceSn = produceSnExtService.getProduceSnByCustSn(organizeCode, customerSnTransformService.transformBarCodeGm(sn));
if (null == produceSn || StringUtils.isEmpty(produceSn.getWorkOrderNo())) {
itemMap.put(MesPcnExtConstWords.MESSAGE, String.format("请检查工单及客户条码信息,客户条码[%s]信息无效!", sn));
continue;
} else itemMap.put(MesProduceSn.class.getSimpleName(), produceSn);
MesWorkOrder workOrder = getWorkOrder(organizeCode, produceSn.getWorkOrderNo());
if (null == workOrder) {
itemMap.put(MesPcnExtConstWords.MESSAGE, String.format("请检查工单信息,客户条码[%s]对应的加工单[%s]信息不存在!", sn, produceSn.getWorkOrderNo()));
continue;
} else itemMap.put(MesWorkOrder.class.getSimpleName(), workOrder);
MesQueueOrder queueOrder = produceSnExtService.getQueueOrder(organizeCode, workCenterCode, workCellCode, produceSn.getProductSn());
if (null == queueOrder) itemMap.put(MesPcnExtConstWords.MESSAGE, String.format("请检查工位队列信息,客户条码[%s]工位队列信息不存在!", sn));
else itemMap.put(MesQueueOrder.class.getSimpleName(), queueOrder);
} else {
MesProduceSn produceSn = produceSnExtService.getProduceSn(organizeCode, sn, sn);
if (null == produceSn) produceSn = produceSnExtService.getProduceSnByCustSn(organizeCode, sn);
if (null == produceSn || StringUtils.isEmpty(produceSn.getWorkOrderNo())) {
itemMap.put(MesPcnExtConstWords.MESSAGE, String.format("请检查工单及产品条码信息,加工单[%s]不存在产品条码信息!", sn));
continue;
} else itemMap.put(MesProduceSn.class.getSimpleName(), produceSn);
MesWorkOrder workOrder = getWorkOrder(organizeCode, produceSn.getWorkOrderNo());
if (null == workOrder) {
itemMap.put(MesPcnExtConstWords.MESSAGE, String.format("请检查工单信息,加工单[%s]信息无效!", produceSn.getWorkOrderNo()));
continue;
} else itemMap.put(MesWorkOrder.class.getSimpleName(), workOrder);
MesQueueOrder queueOrder = produceSnExtService.getQueueOrder(organizeCode, workCenterCode, workCellCode, produceSn.getProductSn());
if (null == queueOrder) itemMap.put(MesPcnExtConstWords.MESSAGE, String.format("请检查工位队列信息,加工单[%s]工位队列信息不存在!", produceSn.getWorkOrderNo()));
else itemMap.put(MesQueueOrder.class.getSimpleName(), queueOrder);
}
workOrderMap.put(sn, itemMap);
workOrderMap.put(sn, getWorkOrderMapSort(organizeCode, sn, workCell));
}
return workOrderMap;
@ -219,30 +183,40 @@ public class MesWorkOrderExtService implements IMesWorkOrderExtService {
@Override
public Map<String, Object> getWorkOrderMapSort(String organizeCode, String sn) {
return getWorkOrderMapSort(organizeCode, sn, null);
}
@Override
public Map<String, Object> getWorkOrderMapSort(String organizeCode, String sn, MesWorkCell workCell) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(sn)) return null;
Map<String, Object> resultMap = new HashMap<>();
MesProduceSn produceSn;
if (sn.length() == MesPcnExtConstWords.CUSTOMER_SN_LENGTH_GM) {
MesProduceSn produceSn = produceSnExtService.getProduceSnByCustSn(organizeCode, customerSnTransformService.transformBarCodeGm(sn));
produceSn = produceSnExtService.getProduceSnByCustSn(organizeCode, customerSnTransformService.transformBarCodeGm(sn));
if (null == produceSn || StringUtils.isEmpty(produceSn.getWorkOrderNo())) resultMap.put(MesPcnExtConstWords.MESSAGE, String.format("请检查工单及客户条码信息,客户条码[%s]信息无效!", sn));
else resultMap.put(MesProduceSn.class.getSimpleName(), produceSn);
MesWorkOrder workOrder = getWorkOrder(organizeCode, produceSn.getWorkOrderNo());
if (null == workOrder) resultMap.put(MesPcnExtConstWords.MESSAGE, String.format("请检查工单信息,客户条码[%s]对应的加工单[%s]信息不存在!", sn, produceSn.getWorkOrderNo()));
else resultMap.put(MesWorkOrder.class.getSimpleName(), workOrder);
} else {
MesProduceSn produceSn = produceSnExtService.getProduceSn(organizeCode, sn, sn);
produceSn = produceSnExtService.getProduceSn(organizeCode, sn, sn);
if (null == produceSn) produceSn = produceSnExtService.getProduceSnByCustSn(organizeCode, sn);
if (null == produceSn || StringUtils.isEmpty(produceSn.getWorkOrderNo())) resultMap.put(MesPcnExtConstWords.MESSAGE, String.format("请检查工单及产品条码信息,加工单[%s]不存在产品条码信息!", sn));
else resultMap.put(MesProduceSn.class.getSimpleName(), produceSn);
}
if (null != produceSn) {
MesWorkOrder workOrder = getWorkOrder(organizeCode, produceSn.getWorkOrderNo());
if (null == workOrder) resultMap.put(MesPcnExtConstWords.MESSAGE, String.format("请检查工单信息,加工单[%s]信息无效!", produceSn.getWorkOrderNo()));
if (null == workOrder) resultMap.put(MesPcnExtConstWords.MESSAGE, String.format("请检查工单信息,客户条码[%s]对应的加工单[%s]信息不存在!", produceSn.getCustSn(), produceSn.getWorkOrderNo()));
else resultMap.put(MesWorkOrder.class.getSimpleName(), workOrder);
}
if (null != produceSn && null != workCell) {
MesQueueOrder queueOrder = produceSnExtService.getQueueOrder(organizeCode, workCell.getWorkCenterCode(), workCell.getWorkCellCode(), produceSn.getProductSn());
if (null == queueOrder) resultMap.put(MesPcnExtConstWords.MESSAGE, String.format("请检查工位队列信息,客户条码[%s]加工单[%s]工位队列信息不存在!", produceSn.getCustSn(), produceSn.getWorkOrderNo()));
else resultMap.put(MesQueueOrder.class.getSimpleName(), queueOrder);
}
return resultMap;
}

@ -77,8 +77,7 @@ public class WorkOrderAssemblyPrintQueueStrategyService implements IPrintQueueSt
List<MesWorkOrder> workOrderList = getMesWorkOrders(model, workOrderNoList);
// 根据工单号对工单分组
Map<String, List<MesWorkOrder>> workOrderMap = CollectionUtils.isEmpty(workOrderList) ? null : workOrderList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesWorkOrder::getWorkOrderNo));
if (CollectionUtils.isEmpty(workOrderMap)) log.info("打印队列查询 --- {} --- 工单信息不存在 --- {} ---", MesExtEnumUtil.PRINT_QUEUE_TYPE.valueOfDescription(model.getPrintQueueType()),
CollectionUtils.isEmpty(workOrderList) ? "[]" : workOrderList.toString());
if (CollectionUtils.isEmpty(workOrderMap)) log.info("打印队列查询 --- {} --- 工单信息不存在 --- {} ---", MesExtEnumUtil.PRINT_QUEUE_TYPE.valueOfDescription(model.getPrintQueueType()), workOrderNoList.toString());
// 产线代码集合
List<String> workCenterCodeList = CollectionUtils.isEmpty(workOrderMap) ? null :

@ -3,6 +3,7 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.station;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesProdShiftRecordService;
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.apiservice.util.MesPcnException;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPartContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext;
@ -18,7 +19,9 @@ import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrder;
import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPush;
import cn.estsh.i3plus.pojo.mes.bean.MesStateMachineStatus;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter;
import cn.estsh.i3plus.pojo.mes.model.AttrBean;
import cn.estsh.i3plus.pojo.mes.model.StationKvBean;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
@ -34,6 +37,7 @@ import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@ -59,6 +63,9 @@ public class MesProductionSortModuleService extends BaseModuleService {
@Autowired
private MesQueueOrderRepository queueOrderRepository;
@Autowired
private IMesQueueOrderPushService queueOrderPushService;
@Override
public void init(StationRequestBean reqBean) {
@ -97,13 +104,18 @@ public class MesProductionSortModuleService extends BaseModuleService {
// 发送班次班组和工单
StationResultBean resultBean = getStationResultBean(reqBean, moduleContentContext, prodShiftDataContext);
// 获取产成零件信息
List<MesProductionPartContext> productionPartContext = productionDispatchContextStepService.getProductionPartContext(reqBean);
// 排除掉空腔的产成零件
productionPartContext = CollectionUtils.isEmpty(productionPartContext) ? null : productionPartContext.stream().filter(o -> !StringUtils.isEmpty(o.getForeignKey())).collect(Collectors.toList());
//生产线是否推单
MesWorkCenter workCenter = productionProcessContext.getWorkCenter();
Boolean isPushQueue = (StringUtils.isEmpty(workCenter.getIsPushQueue()) || workCenter.getIsPushQueue().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) != 0) ? false : true;
//获取队列信息
//非推单【获取当前工位最新修改的完成状态的队列单据数据 并根据其零件生产组代码按生产序号倒序前50条】
List<MesQueueOrderModel> queueOrderModelList = !isPushQueue
? queryQueueOrderTopFiftyProductSeq(reqBean, getNewPartProdGroupCode(reqBean, moduleContentContext))
: queryQueueOrderPush(reqBean);
//封装工位展示的客制化信息 (获取当前工位最新修改的完成状态的队列单据数据 并根据其零件生产组代码按生产序号倒序前50条)
StationResultBean resultBeanCustom = getStationResultBean(queryQueueOrderTopFiftyProductSeq(reqBean, getNewPartProdGroupCode(reqBean, productionPartContext)));
//封装工位展示的客制化信息
StationResultBean resultBeanCustom = getStationResultBean(queueOrderModelList);
if (null == resultBeanCustom) this.sendMessage(reqBean, resultBean);
else this.sendMessage(reqBean, new StationResultBean().busiType(MesPcnEnumUtil.STATION_BUSI_TYPE.BUSI_LIST.getValue()).addStationResultBeans(resultBean).addStationResultBeans(resultBeanCustom));
@ -114,6 +126,8 @@ public class MesProductionSortModuleService extends BaseModuleService {
}
private StationResultBean getStationResultBean(List<MesQueueOrderModel> mesQueueOrderModelList) {
if (CollectionUtils.isEmpty(mesQueueOrderModelList)) return null;
return new StationResultBean().busiType(MesPcnEnumUtil.STATION_BUSI_TYPE.MODULE_CUSTOM_CONTENT.getValue())
@ -131,6 +145,7 @@ public class MesProductionSortModuleService extends BaseModuleService {
return attrBeanList;
}
//获取当前工位最新修改的完成状态的队列单据数据 并根据其零件生产组代码按生产序号倒序前50条
private List<MesQueueOrderModel> queryQueueOrderTopFiftyProductSeq(StationRequestBean reqBean, List<String> partProdGroupCodeList) {
if (CollectionUtils.isEmpty(partProdGroupCodeList)) return null;
@ -138,27 +153,29 @@ public class MesProductionSortModuleService extends BaseModuleService {
List<MesQueueOrderModel> queueOrderModelList = null;
for (String partProdGroupCode : partProdGroupCodeList) {
Pager pager = new Pager();
pager.setStartRow(1);
pager.setCurrentPage(1);
pager.setPageSize(50);
pager.setStartRow(MesPcnExtConstWords.ONE);
pager.setCurrentPage(MesPcnExtConstWords.ONE);
pager.setPageSize(MesPcnExtConstWords.FIFTY);
DdlPackBean packBean = DdlPackBean.getDdlPackBean(reqBean.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(reqBean.getWorkCenterCode(), MesPcnExtConstWords.WORK_CENTER_CODE, packBean);
DdlPreparedPack.getStringEqualPack(reqBean.getWorkCellCode(), MesPcnExtConstWords.WORK_CELL_CODE, packBean);
DdlPreparedPack.getStringEqualPack(partProdGroupCode, MesPcnExtConstWords.PART_PROD_GROUP_CODE, packBean);
packBean.setOrderByStr(" order by productSeq desc ");
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{MesPcnExtConstWords.PRODUCT_SEQ}, packBean);
List<MesQueueOrder> queueOrderList = queueOrderRepository.findByHqlWherePage(packBean, pager);
if (!CollectionUtils.isEmpty(queueOrderList)) {
Boolean isComplete = false;
Integer index = MesPcnExtConstWords.ONE;
for (MesQueueOrder mesQueueOrder : queueOrderList) {
MesQueueOrderModel queueOrderModel = new MesQueueOrderModel();
BeanUtils.copyProperties(mesQueueOrder, queueOrderModel);
//默认绿色【完成状态或关闭状态】
String color = MesExtEnumUtil.COLOR.GREEN.getValue();
if (queueOrderModel.getStatus() == MesExtEnumUtil.QUEUE_ORDER_STATUS.FINISH.getValue()) isComplete = true;
else if (!isComplete) color = MesExtEnumUtil.COLOR.WHITE.getValue();
//创建状态标白色
if (queueOrderModel.getStatus() == MesExtEnumUtil.QUEUE_ORDER_STATUS.CREATE.getValue()) color = MesExtEnumUtil.COLOR.WHITE.getValue();
//跳号标黄色
if (index < queueOrderList.size() && checkJumpNumber(queueOrderList.get(index).getWorkOrderSeq(), mesQueueOrder.getWorkOrderSeq())) color = MesExtEnumUtil.COLOR.YELLOW.getValue();
queueOrderModel.setColor(color);
if (CollectionUtils.isEmpty(queueOrderModelList)) queueOrderModelList = new ArrayList<>();
@ -171,28 +188,109 @@ public class MesProductionSortModuleService extends BaseModuleService {
return queueOrderModelList;
}
private List<String> getNewPartProdGroupCode(StationRequestBean reqBean, List<MesProductionPartContext> productionPartContext) {
//获取零件生产组代码
private List<String> getNewPartProdGroupCode(StationRequestBean reqBean, List<List<StationKvBean>> moduleContentContext) {
// 获取工单信息
// 获取产成零件信息
List<MesProductionPartContext> productionPartContext = productionDispatchContextStepService.getProductionPartContext(reqBean);
// 排除掉空腔的产成零件
productionPartContext = CollectionUtils.isEmpty(productionPartContext) ? null : productionPartContext.stream().filter(o -> !StringUtils.isEmpty(o.getForeignKey())).collect(Collectors.toList());
// 扫描验证完加工单才能拿到产成零件信息
if (!CollectionUtils.isEmpty(productionPartContext)) {
return productionPartContext.stream().map(MesProductionPartContext::getPartProdGroupCode).distinct().collect(Collectors.toList());
return (productionPartContext.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getPartProdGroupCode())))
.map(MesProductionPartContext::getPartProdGroupCode).collect(Collectors.toList())).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList());
}
//工序开始前可能会拿到页面顶部展示单加工单信息
if (!CollectionUtils.isEmpty(moduleContentContext)) {
return (moduleContentContext.stream()
.filter(o -> (null != o && o.stream().filter(i -> i.getKey().equals(MesPcnExtConstWords.PART_PROD_GROUP_CODE)).findFirst().isPresent()))
.map(o -> o.stream().filter(i -> i.getKey().equals(MesPcnExtConstWords.PART_PROD_GROUP_CODE)).findFirst().get().getValue()).collect(Collectors.toList())
).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList());
}
MesQueueOrder queueOrder = getNewQueueOrder(reqBean);
return queueOrder == null ? null : Stream.of(queueOrder.getPartProdGroupCode()).collect(Collectors.toList());
}
private boolean checkJumpNumber(String nextWorkOrderSeq, String currentWorkOrderSeq) {
//查询推单队列
private List<MesQueueOrderModel> queryQueueOrderPush(StationRequestBean reqBean) {
//处理排序线推单上下文, 返回推送工位类型对应的配置信息 【来源工位】;
//再根据配置查询生产队列工位推送信息 : 根据生产线代码,推送来源代码集合查询创建状态的生产队列工位推送信息【创建时间正序】
List<MesQueueOrderPush> queueOrderPushList = queueOrderPushService.getQueueOrderPushList(reqBean.getOrganizeCode(),
productionProcessContextStepService.dispatchQueueOrderPushCellCfgContext(reqBean, MesExtEnumUtil.QUEUE_ORDER_CELL_PUSH_TYPE.TARGET.getValue()));
//列表做多展示50条队列; 超过49条,进行截取
if (!CollectionUtils.isEmpty(queueOrderPushList) && queueOrderPushList.size() > MesPcnExtConstWords.FORTY_NINE) queueOrderPushList = queueOrderPushList.subList(MesPcnExtConstWords.ZERO, MesPcnExtConstWords.FORTY_NINE);
//查询最多50条当前工位修改时间最新的队列记录
DdlPackBean packBean = DdlPackBean.getDdlPackBean(reqBean.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(reqBean.getWorkCenterCode(), MesPcnExtConstWords.WORK_CENTER_CODE, packBean);
DdlPreparedPack.getStringEqualPack(reqBean.getWorkCellCode(), MesPcnExtConstWords.WORK_CELL_CODE, packBean);
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{MesPcnExtConstWords.MODIFY_DATE_TIME}, packBean);
Integer topNum = CollectionUtils.isEmpty(queueOrderPushList) ? MesPcnExtConstWords.FIFTY : (MesPcnExtConstWords.FIFTY - queueOrderPushList.size());
List<MesQueueOrder> queueOrderList = queueOrderRepository.findByHqlTopWhere(packBean, topNum);
if (CollectionUtils.isEmpty(queueOrderPushList) && CollectionUtils.isEmpty(queueOrderList)) return null;
//推送队列根据创建时间倒序
if (!CollectionUtils.isEmpty(queueOrderPushList)) queueOrderPushList = queueOrderPushList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesQueueOrderPush::getCreateDatetime).reversed()).collect(Collectors.toList());
List<MesQueueOrderModel> queueOrderModelList = new ArrayList<>();
if (!CollectionUtils.isEmpty(queueOrderPushList)) {
for (MesQueueOrderPush queueOrderPush : queueOrderPushList) {
if (null == queueOrderPush) continue;
MesQueueOrderModel queueOrderModel = new MesQueueOrderModel();
BeanUtils.copyProperties(queueOrderPush, queueOrderModel);
queueOrderModel.setWorkCellCode(reqBean.getWorkCellCode());
queueOrderModel.setStatus(MesExtEnumUtil.QUEUE_ORDER_STATUS.CREATE.getValue());
queueOrderModelList.add(queueOrderModel);
}
}
if (!CollectionUtils.isEmpty(queueOrderList)) {
for (MesQueueOrder queueOrder : queueOrderList) {
if (null == queueOrder) continue;
MesQueueOrderModel queueOrderModel = new MesQueueOrderModel();
BeanUtils.copyProperties(queueOrder, queueOrderModel);
queueOrderModelList.add(queueOrderModel);
}
}
Integer index = MesPcnExtConstWords.ONE;
for (MesQueueOrderModel queueOrderModel : queueOrderModelList) {
if (null == queueOrderModel) continue;
//默认绿色【完成状态】
String color = MesExtEnumUtil.COLOR.GREEN.getValue();
if (queueOrderModel.getStatus() == MesExtEnumUtil.QUEUE_ORDER_STATUS.CREATE.getValue()) color = MesExtEnumUtil.COLOR.WHITE.getValue();
//跳号标黄色
if (index < queueOrderList.size() && checkSamePartProdGroupCode(queueOrderModelList.get(index).getPartProdGroupCode(), queueOrderModel.getPartProdGroupCode()) && checkJumpNumber(queueOrderModelList.get(index).getWorkOrderSeq(), queueOrderModel.getWorkOrderSeq())) color = MesExtEnumUtil.COLOR.YELLOW.getValue();
queueOrderModel.setColor(color);
index ++;
}
return queueOrderModelList;
}
//验证生成
private Boolean checkSamePartProdGroupCode(String nextPartProdGroupCode, String partProdGroupCode) {
if (StringUtils.isEmpty(nextPartProdGroupCode) || StringUtils.isEmpty(partProdGroupCode)) return false;
return nextPartProdGroupCode.equals(partProdGroupCode);
}
//标黄是跳号的工单, 不是跳过的工单
private Boolean checkJumpNumber(String nextWorkOrderSeq, String currentWorkOrderSeq) {
if (StringUtils.isEmpty(nextWorkOrderSeq) || StringUtils.isEmpty(currentWorkOrderSeq) || !CheckTool.isNumber(nextWorkOrderSeq) || !CheckTool.isNumber(currentWorkOrderSeq)) return false;
return Integer.parseInt(currentWorkOrderSeq) != Integer.parseInt(nextWorkOrderSeq) + MesPcnExtConstWords.ONE;
}
//查询当前工位完成状态最新的一笔队列记录
private MesQueueOrder getNewQueueOrder(StationRequestBean reqBean) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(reqBean.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(reqBean.getWorkCenterCode(), MesPcnExtConstWords.WORK_CENTER_CODE, packBean);
DdlPreparedPack.getStringEqualPack(reqBean.getWorkCellCode(), MesPcnExtConstWords.WORK_CELL_CODE, packBean);
DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.QUEUE_ORDER_STATUS.FINISH.getValue(), MesPcnExtConstWords.STATUS, packBean);
packBean.setOrderByStr(" order by modifyDatetime desc ");
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{MesPcnExtConstWords.MODIFY_DATE_TIME}, packBean);
return queueOrderRepository.getByProperty(packBean);
}

@ -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;
}
}
}

@ -91,6 +91,10 @@ public class MesAssemblyShowNosortStepService extends BaseStepService {
//获取上下文进料零件条码信息集合
List<MesProductionPsInContext> productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean);
//没有【产出零件数据】【进料零件条码信息】,不支持当前工步
if (CollectionUtils.isEmpty(productionPartContextList) && CollectionUtils.isEmpty(productionPsInContextList))
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("生产线[%s]工位[%s]当前已不存在产成零件或进料条码数据信息,请重置工序!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()));
//根据现有数据【产出零件数据】【进料零件条码信息】比对上下文中已经存在的加工规则数据信息集合, 没有加工规则的数据进行查询
if (CollectionUtils.isEmpty(prodRuleContextList)) prodRuleContextList = new ArrayList<>();
Integer initSize = prodRuleContextList.size();
@ -122,8 +126,6 @@ public class MesAssemblyShowNosortStepService extends BaseStepService {
//封装非排序加工规则
private StepResult doHandleProdRuleData(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext,
List<MesProdRuleContext> prodRuleContextList, List<MesProductionPartContext> productionPartContextList, List<MesProductionPsInContext> productionPsInContextList) {
//没有【产出零件数据】【进料零件条码信息】,则直接跳过 【当前是生成零件号场景】
if (CollectionUtils.isEmpty(productionPartContextList) && CollectionUtils.isEmpty(productionPsInContextList)) return stepResult;
//获取加工不可用规则
Map<String, List<MesProdRuleIgnoreCfg>> prodRuleIgnoreCfgMap = productionProcessContextStepService.getProdRuleIgnoreCfgContextMap(reqBean, productionProcessContext);

@ -79,6 +79,10 @@ public class MesAssemblyShowSortStepService extends BaseStepService {
//获取上下文进料零件条码信息集合
List<MesProductionPsInContext> productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean);
//上下文中不存在进料主条码数据信息
if (CollectionUtils.isEmpty(productionPsInContextList) || CollectionUtils.isEmpty(productionPartContextList))
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("生产线[%s]工位[%s]当前已不存在加工单或条码数据信息,请重置工序!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()));
//获取上下文产出零件条码信息集合
List<MesProductionPsOutContext> productionPsOutContextList = productionDispatchContextStepService.getProductionPsOutContext(reqBean);
@ -157,10 +161,6 @@ public class MesAssemblyShowSortStepService extends BaseStepService {
//获取加工不可用规则
Map<String, List<MesProdRuleIgnoreCfg>> prodRuleIgnoreCfgMap = productionProcessContextStepService.getProdRuleIgnoreCfgContextMap(reqBean, productionProcessContext);
//上下文中不存在进料主条码数据信息
if (CollectionUtils.isEmpty(productionPsInContextList) || CollectionUtils.isEmpty(productionPartContextList))
stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("生产线[%s]工位[%s]当前已不存在加工单或条码数据信息,请重置工序!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()));
//拿到当前最大的foreignKey
Optional<MesProductionPsInContext> maxForeignKeyOptional = productionPsInContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getForeignKey()))).max(Comparator.comparing(MesProductionPsInContext::getForeignKey));
Integer foreignKey = (null != maxForeignKeyOptional && maxForeignKeyOptional.isPresent()) ? maxForeignKeyOptional.get().getForeignKey() : MesPcnExtConstWords.ZERO;

@ -90,10 +90,10 @@ public class MesProductSeqCheckNosortStepService extends MesProductSeqCheckStepS
private void doHandleProductSeqCheck(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, List<MesProductionPartContext> productionPartContextList) {
//非排序顺序防错级别配置[工位参数]
String cavityNosortCfg = getCheckProductSeqCfg(reqBean);
String checkProductSeqCfg = getCheckProductSeqCfg(reqBean);
//当是零件级别的配置的时候 搜集工单号 去重
List<String> filterWorkOrderNoList = StringUtils.isEmpty(cavityNosortCfg) ? null :
List<String> filterWorkOrderNoList = StringUtils.isEmpty(checkProductSeqCfg) ? null :
(productionPartContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0))
.map(MesProductionPartContext::getWorkOrderNo).collect(Collectors.toList())).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList());
@ -106,7 +106,7 @@ public class MesProductSeqCheckNosortStepService extends MesProductSeqCheckStepS
if (productionPartContext.getCheckSeqResult().compareTo(MesPcnExtConstWords.ZERO) != 0) continue;
//顺序防错验证
Boolean result = doProductSeqCheckNosort(reqBean, stepResult, productionProcessContext, productionPartContext, cavityNosortCfg, filterWorkOrderNoList);
Boolean result = doProductSeqCheckNosort(reqBean, stepResult, productionProcessContext, productionPartContext, checkProductSeqCfg, filterWorkOrderNoList);
productionPartContext.checkSeqResult(!result ? CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue() : CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue());
@ -130,13 +130,13 @@ public class MesProductSeqCheckNosortStepService extends MesProductSeqCheckStepS
//前道工艺防错验证 【非排序】
private Boolean doProductSeqCheckNosort(StationRequestBean reqBean, StepResult stepResult, MesProductionProcessContext productionProcessContext,
MesProductionPartContext productionPartContext, String cavityNosortCfg, List<String> workOrderNoList) {
MesProductionPartContext productionPartContext, String checkProductSeqCfg, List<String> workOrderNoList) {
String message = StringUtils.isEmpty(stepResult.getMsg()) ? MesPcnExtConstWords.EMPTY : stepResult.getMsg() + MesPcnExtConstWords.SEMICOLON;
//根据生产工单顺序号,生产线代码查询上一个生产工单信息
MesWorkOrder workOrder;
if (StringUtils.isEmpty(cavityNosortCfg)) {
if (StringUtils.isEmpty(checkProductSeqCfg)) {
workOrder = workOrderExtService.getWorkOrder(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), productionPartContext.getProductSeq());
} else if (workOrderNoList.size() == 1) {
//增加零件号条件

@ -6,6 +6,7 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrder;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrderAssembly;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
@ -75,6 +76,10 @@ public class MesProductSeqCheckSortStepService extends MesProductSeqCheckStepSer
//顺序防错验证处理
private void doHandleProductSeqCheck(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, List<MesProductionPartContext> productionPartContextList) {
//排序线是否推单
MesWorkCenter workCenter = productionProcessContext.getWorkCenter();
Boolean isPushQueue = (StringUtils.isEmpty(workCenter.getIsPushQueue()) || workCenter.getIsPushQueue().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) != 0) ? false : true;
List<String> workOrderNoList = new ArrayList<>();
for (MesProductionPartContext productionPartContext : productionPartContextList) {
@ -84,7 +89,7 @@ public class MesProductSeqCheckSortStepService extends MesProductSeqCheckStepSer
if (productionPartContext.getCheckSeqResult().compareTo(MesPcnExtConstWords.ZERO) != 0) continue;
//顺序防错验证
Boolean result = doProductSeqCheckSort(reqBean, stepResult, productionProcessContext, productionPartContext);
Boolean result = doProductSeqCheckSort(reqBean, stepResult, productionProcessContext, productionPartContext, isPushQueue);
productionPartContext.checkSeqResult(!result ? CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue() : CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue());
@ -101,7 +106,7 @@ public class MesProductSeqCheckSortStepService extends MesProductSeqCheckStepSer
}
//前道工艺防错验证 【排序】
private Boolean doProductSeqCheckSort(StationRequestBean reqBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesProductionPartContext productionPartContext) {
private Boolean doProductSeqCheckSort(StationRequestBean reqBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesProductionPartContext productionPartContext, Boolean isPushQueue) {
String message = StringUtils.isEmpty(stepResult.getMsg()) ? MesPcnExtConstWords.EMPTY : stepResult.getMsg() + MesPcnExtConstWords.SEMICOLON;
@ -116,13 +121,20 @@ public class MesProductSeqCheckSortStepService extends MesProductSeqCheckStepSer
if (workOrder.getWorkOrderStatus().compareTo(MesExtEnumUtil.ORDER_STATUS.CLOSE.getValue()) >= 0) return true;
//----以下是加工中状态下的验证-----
//根据生产工单,生产线,工位查询工位队列信息
List<MesQueueOrder> queueOrderList = produceSnExtService.getQueueOrderList(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), workOrder.getWorkOrderNo());
//排序线推单: 是在保存加工结果的时候insertDb队列信息, 存在队列则代表工单已经过当前工位
if (isPushQueue && !CollectionUtils.isEmpty(queueOrderList)) return true;
//排序线非推单: 没有队列或者没有创建状态的队列则代表顺序防错通过
Optional<MesQueueOrder> optional = CollectionUtils.isEmpty(queueOrderList) ? null : queueOrderList.stream().filter(o -> (null != o && o.getStatus().compareTo(MesExtEnumUtil.QUEUE_ORDER_STATUS.CREATE.getValue()) == 0)).findFirst();
if (null == optional || !optional.isPresent()) return true;
if (!isPushQueue && (null == optional || !optional.isPresent())) return true;
//根据未完成零件条码获取生产工单装配件清单
List<String> productSnList = queueOrderList.stream().filter(o -> (null != o && o.getStatus().compareTo(MesExtEnumUtil.QUEUE_ORDER_STATUS.CREATE.getValue()) == 0)).map(MesQueueOrder::getProductSn).collect(Collectors.toList());
List<String> productSnList = CollectionUtils.isEmpty(queueOrderList) ? null : queueOrderList.stream().filter(o -> (null != o && o.getStatus().compareTo(MesExtEnumUtil.QUEUE_ORDER_STATUS.CREATE.getValue()) == 0)).map(MesQueueOrder::getProductSn).collect(Collectors.toList());
List<MesWorkOrderAssembly> workOrderAssemblyList = assemblyExtService.getWorkOrderAssemblyList(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), workOrder.getWorkOrderNo(), productSnList);
Map<String, List<MesWorkOrderAssembly>> productSnMap = CollectionUtils.isEmpty(workOrderAssemblyList) ? null : workOrderAssemblyList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesWorkOrderAssembly::getProductSn));
if (CollectionUtils.isEmpty(productSnMap)) return true;

@ -244,9 +244,6 @@ public class MesSendEquipParamsCmdStepService extends BaseStepService {
return null != productionPartContext ? productionPartContext.getWorkOrderSeq() : null;
case "%CUSTBARCODE%":
return null != productionPsOutContext ? productionPsOutContext.getCustSn() : null;
case "%RFIDSN%":
MesShippingQueue shippingQueue = productionDispatchContextStepService.getShippingQueueContext(reqBean);
return null != shippingQueue ? shippingQueue.getRfidSn() : null;
default:
return matchRule;
}

@ -120,7 +120,7 @@ public class MesShippingQueueFindStepService extends BaseStepService {
if (null == shippingQueue) {
return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().checkRepeat(), stepResult,
false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前零件发运组[%s]未匹配到有效的发运队列,持续监听中...", scanInfo),
false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, String.format("当前零件发运组[%s]未匹配到有效的发运队列,持续监听中...", scanInfo),
getStepParams(reqBean), MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
}

@ -1,11 +1,8 @@
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.IMesShippingQueueService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsInContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCollectContext;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.shipping.MesShippingQueue;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
@ -18,7 +15,6 @@ import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.List;
import java.util.stream.Collectors;
/**
* @Description : RFID
@ -31,9 +27,6 @@ public class MesShippingRfidMatchStepService extends BaseStepService {
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private IMesShippingQueueService shippingQueueService;
@Override
public StepResult execute(StationRequestBean reqBean) {
@ -43,38 +36,20 @@ public class MesShippingRfidMatchStepService extends BaseStepService {
//获取上下文发运队列信息
MesShippingQueue shippingQueue = productionDispatchContextStepService.getShippingQueueContext(reqBean);
if ((null == shippingQueue || StringUtils.isEmpty(shippingQueue.getRfidSn()))) {
return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().checkRepeat(), stepResult,
false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, "当前未获取到缓存中有效的发运队列,即将重新获取!",
getStepParams(reqBean), MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
}
if ((null == shippingQueue || StringUtils.isEmpty(shippingQueue.getRfidSn())))
return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前未获取到缓存中有效的发运队列!");
//获取上下文进料零件条码信息集合
List<MesProductionPsInContext> productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean);
//过滤有效的进料零件条码
String productSn = filterProductionPsInContextList(productionPsInContextList);
if (StringUtils.isEmpty(productSn)) {
return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().checkRepeat(), stepResult.nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_PRODUCT_SN),
false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, "当前未获取到缓存中有效的进料条码,即将重新获取!",
getStepParams(reqBean), MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
}
//获取上下文扫/读信息:主条码
List<MesEquipVariableCollectContext> equipVariableCollectContextList = productionDispatchContextStepService.getScanProductSnContext(reqBean);
//设备写的条码
String productSn = CollectionUtils.isEmpty(equipVariableCollectContextList) ? null : equipVariableCollectContextList.get(0).getEquipVariableValue();
if (StringUtils.isEmpty(productSn)) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前未获取到设备写入的主条码信息!");
if (!shippingQueue.getRfidSn().equals(productSn)) {
return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().checkRepeat(), stepResult,
false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("RFID匹配失败!读条码[%s]与RFID条码[%s]不一致!", productSn, shippingQueue.getRfidSn()),
getStepParams(reqBean), MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
}
if (!shippingQueue.getRfidSn().equals(productSn))
return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("RFID匹配失败!读条码[%s]与RFID条码[%s]不一致!", productSn, shippingQueue.getRfidSn()));
return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "RFID匹配成功!");
return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "RFID匹配成功!", MesPcnEnumUtil.PROMPT_SOUND.SUCCESS.getValue());
}
//过滤有效的进料零件条码
private String filterProductionPsInContextList(List<MesProductionPsInContext> productionPsInContextList) {
productionPsInContextList = CollectionUtils.isEmpty(productionPsInContextList) ? null :
productionPsInContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).collect(Collectors.toList());
return CollectionUtils.isEmpty(productionPsInContextList) ? null : productionPsInContextList.get(0).getProductSn();
}
}

@ -2,8 +2,10 @@ 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.IMesShippingQueueService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCollectContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IStepService;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesProdRouteOptParam;
import cn.estsh.i3plus.pojo.mes.bean.seres.MesCimSeresJisRfid;
@ -11,11 +13,15 @@ import cn.estsh.i3plus.pojo.mes.bean.shipping.MesShippingQueue;
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 lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@ -69,6 +75,21 @@ public class MesShippingRfidSeresFindStepService extends BaseStepService {
stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
}
List<MesEquipVariableCollectContext> equipVariableCollectContextList = new ArrayList<>();
equipVariableCollectContextList.add(new MesEquipVariableCollectContext(reqBean.getOrganizeCode(), rfidSn, MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ.getValue()));
//保存上下文扫/读信息:主条码
productionDispatchContextStepService.dispatchScanProductSnContext(reqBean, equipVariableCollectContextList);
//主条码验证工步 【非排序】
stepResult = ((IStepService) SpringContextsUtil.getBean("mesProductSnCheckStepService")).executeInState(reqBean);
if (!stepResult.isCompleted()) {
return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().checkRepeat(), stepResult,
false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT,
String.format("当前零件发运组[%s]匹配的发运队列单号[%s]VIN[%s]查询到的赛力斯RFID[%s]验证错误,请人工处理! 持续监听中...", shippingQueue.getShippingGroupCode(), shippingQueue.getShippingCode(), shippingQueue.getVin(), cimSeresJisRfid.getRfid()),
stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME);
}
//保存上下文发运队列信息
shippingQueue.setPidStr(cimSeresJisRfid.getId().toString());
shippingQueue.setRfidSn(rfidSn);

@ -60,9 +60,6 @@ public class MesWorkOrderCheckNosortStepService extends MesWorkOrderCheckStepSer
//清除本次已获取得到的加工单信息
productionDispatchContextStepService.removeScanWorkOrderNoContext(reqBean);
//从上下文中取出生产线对象
MesWorkCenter workCenter = productionProcessContext.getWorkCenter();
//获取上下文产出零件信息
List<MesProductionPartContext> cachedProductionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean);
@ -99,7 +96,7 @@ public class MesWorkOrderCheckNosortStepService extends MesWorkOrderCheckStepSer
try {
//验证工单的有效性
if (!checkWorkOrderValid(reqBean, resultBean, stepResult, productionProcessContext, workCenter, equipVariableCollectContextList, productionPartContextList).isCompleted()) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg());
if (!checkWorkOrderValid(reqBean, resultBean, stepResult, productionProcessContext, equipVariableCollectContextList, productionPartContextList).isCompleted()) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg());
//扫描场景下合并历史产出零件信息
if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() == equipVariableCollectContextList.get(0).getMessageSource() && !CollectionUtils.isEmpty(cachedProductionPartContextList)) productionPartContextList.addAll(cachedProductionPartContextList);
@ -173,9 +170,12 @@ public class MesWorkOrderCheckNosortStepService extends MesWorkOrderCheckStepSer
}
//验证工单的有效性
private StepResult checkWorkOrderValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesWorkCenter workCenter,
private StepResult checkWorkOrderValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext,
List<MesEquipVariableCollectContext> equipVariableCollectContextList, List<MesProductionPartContext> productionPartContextList) {
//从上下文中取出生产线对象
MesWorkCenter workCenter = productionProcessContext.getWorkCenter();
//搜集生产工单号
List<String> filterList = equipVariableCollectContextList.stream().filter(o -> (null != o)).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList());
List<String> workOrderNoList = filterList.stream().filter(o -> (!StringUtils.isEmpty(o) && !o.equals(productionProcessContext.getFinishCode()))).distinct().collect(Collectors.toList());

@ -6,10 +6,7 @@ import cn.estsh.i3plus.mes.pcn.util.StationKvBeanUtil;
import cn.estsh.i3plus.platform.common.tool.TimeTool;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrder;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder;
import cn.estsh.i3plus.pojo.mes.bean.*;
import cn.estsh.i3plus.pojo.mes.model.StationKvBean;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
@ -55,9 +52,6 @@ public class MesWorkOrderCheckSortStepService extends MesWorkOrderCheckStepServi
//清除本次已获取得到的加工单信息
productionDispatchContextStepService.removeScanWorkOrderNoContext(reqBean);
//从上下文中取出生产线对象
MesWorkCenter workCenter = productionProcessContext.getWorkCenter();
//获取上下文产出零件信息
List<MesProductionPartContext> cachedProductionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean);
List<MesProductionPsInContext> cachedProductionPsInContextList = null;
@ -103,8 +97,10 @@ public class MesWorkOrderCheckSortStepService extends MesWorkOrderCheckStepServi
List<MesProductionPartContext> productionPartContextList = new ArrayList<>();
List<MesProductionPsInContext> productionPsInContextList = new ArrayList<>();
List<MesProductionPsOutContext> productionPsOutContextList = new ArrayList<>();
if (!checkWorkOrderValid(reqBean, resultBean, stepResult, productionProcessContext, workCenter,
equipVariableCollectContextList, productionPartContextList, productionPsInContextList, productionPsOutContextList).isCompleted()) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg());
if (!checkWorkOrderValid(reqBean, resultBean, stepResult, productionProcessContext,
equipVariableCollectContextList, productionPartContextList, productionPsInContextList, productionPsOutContextList).isCompleted()) {
return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg());
}
//扫描场景下合并历史产出零件信息/产品条码信息
if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() == equipVariableCollectContextList.get(0).getMessageSource() && !CollectionUtils.isEmpty(cachedProductionPartContextList)) {
@ -173,16 +169,22 @@ public class MesWorkOrderCheckSortStepService extends MesWorkOrderCheckStepServi
}
//验证工单的有效性
private StepResult checkWorkOrderValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult,
MesProductionProcessContext productionProcessContext, MesWorkCenter workCenter,
private StepResult checkWorkOrderValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext,
List<MesEquipVariableCollectContext> equipVariableCollectContextList, List<MesProductionPartContext> productionPartContextList,
List<MesProductionPsInContext> productionPsInContextList, List<MesProductionPsOutContext> productionPsOutContextList) {
//从上下文中取出生产线与工位对象
MesWorkCenter workCenter = productionProcessContext.getWorkCenter();
MesWorkCell workCell = productionProcessContext.getWorkCell();
//搜集生产工单号
List<String> filterList = equipVariableCollectContextList.stream().filter(o -> (null != o)).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList());
List<String> workOrderNoList = filterList.stream().filter(o -> (!StringUtils.isEmpty(o) && !o.equals(productionProcessContext.getFinishCode()))).distinct().collect(Collectors.toList());
Map<String, Map<String, Object>> workOrderMap = workOrderExtService.getWorkOrderMapSort(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), workOrderNoList);
Map<String, Map<String, Object>> workOrderMap;
if (StringUtils.isEmpty(workCenter.getIsPushQueue()) || workCenter.getIsPushQueue().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) != 0)
workOrderMap = workOrderExtService.getWorkOrderMapSort(reqBean.getOrganizeCode(), workOrderNoList, workCell);
else workOrderMap = workOrderExtService.getWorkOrderMapSort(reqBean.getOrganizeCode(), workOrderNoList);
for (String workOrderNo : workOrderNoList) {
@ -209,7 +211,7 @@ public class MesWorkOrderCheckSortStepService extends MesWorkOrderCheckStepServi
return stepResult.isCompleted(false).msg(String.format("请检查工单产品条码信息,产品条码[%s]条码状态[%s]", produceSn.getProductSn(), MesExtEnumUtil.PRODUCE_SN_STATUS.valueOfDescription(produceSn.getSnStatus())));
MesQueueOrder queueOrder = (MesQueueOrder) itemMap.get(MesQueueOrder.class.getSimpleName());
if (MesExtEnumUtil.QUEUE_ORDER_STATUS.FINISH.getValue() == queueOrder.getStatus())
if (null != queueOrder && MesExtEnumUtil.QUEUE_ORDER_STATUS.FINISH.getValue() == queueOrder.getStatus())
return stepResult.isCompleted(false).msg(String.format("请检查工单工位队列信息,加工单[%s]工位队列状态[%s]", workOrderNo, MesExtEnumUtil.QUEUE_ORDER_STATUS.valueOfDescription(queueOrder.getStatus())));
//封装产成零件
@ -218,7 +220,10 @@ public class MesWorkOrderCheckSortStepService extends MesWorkOrderCheckStepServi
productionPartContextList.add(productionPartContext);
//封装产品条码
productionPsInContextList.add(new MesProductionPsInContext(produceSn).isCheck(productionProcessContext.getWorkCell()).messageSource(equipVariableCollectContextList.get(0).getMessageSource()).relateId(queueOrder.getId()));
productionPsInContextList.add(new MesProductionPsInContext(produceSn)
.isCheck(productionProcessContext.getWorkCell()).messageSource(equipVariableCollectContextList.get(0).getMessageSource())
.relateId(null != queueOrder ? queueOrder.getId() : null)
);
//封装产出条码
MesProductionPsOutContext productionPsOutContext = new MesProductionPsOutContext().copy(produceSn);
@ -251,6 +256,7 @@ public class MesWorkOrderCheckSortStepService extends MesWorkOrderCheckStepServi
orderList.forEach(o -> StationKvBeanUtil.addStationKvBeanList(dataList, new ArrayList<>(),
new StationKvBean(MesPcnExtConstWords.WORK_ORDER_NO, "工单号", o.getWorkOrderNo()), new StationKvBean(MesPcnExtConstWords.PART_NO, "零件编码", o.getPartNo()),
new StationKvBean(MesPcnExtConstWords.CAR_MODEL_CODE, "车型配置", o.getCarModelCode()), new StationKvBean(MesPcnExtConstWords.CUST_ORDER_NO, "客户订单号", o.getCustOrderNo()),
new StationKvBean(MesPcnExtConstWords.PART_PROD_GROUP_CODE, "零件生产组代码", o.getPartProdGroupCode()).isDisplay(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()),
productionPartContextList.size() == 1 ? null : new StationKvBean(MesPcnExtConstWords.CAVITY, "腔数", new StringJoiner(MesPcnExtConstWords.SLANT_R).add(String.valueOf(index.updateAndGet(v -> v + 1))).add(String.valueOf(productionPartContextList.size())).toString())));
}

@ -6,10 +6,7 @@ import cn.estsh.i3plus.mes.pcn.util.StationKvBeanUtil;
import cn.estsh.i3plus.platform.common.tool.TimeTool;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrder;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder;
import cn.estsh.i3plus.pojo.mes.bean.*;
import cn.estsh.i3plus.pojo.mes.model.StationKvBean;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
@ -55,9 +52,6 @@ public class MesWorkOrderCheckSortStepServiceBak extends MesWorkOrderCheckStepSe
//清除本次已获取得到的加工单信息
productionDispatchContextStepService.removeScanWorkOrderNoContext(reqBean);
//从上下文中取出生产线对象
MesWorkCenter workCenter = productionProcessContext.getWorkCenter();
//获取上下文产出零件信息
List<MesProductionPartContext> cachedProductionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean);
List<MesProductionPsInContext> cachedProductionPsInContextList = null;
@ -103,8 +97,10 @@ public class MesWorkOrderCheckSortStepServiceBak extends MesWorkOrderCheckStepSe
List<MesProductionPartContext> productionPartContextList = new ArrayList<>();
List<MesProductionPsInContext> productionPsInContextList = new ArrayList<>();
List<MesProductionPsOutContext> productionPsOutContextList = new ArrayList<>();
if (!checkWorkOrderValid(reqBean, resultBean, stepResult, productionProcessContext, workCenter,
equipVariableCollectContextList, productionPartContextList, productionPsInContextList, productionPsOutContextList).isCompleted()) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg());
if (!checkWorkOrderValid(reqBean, resultBean, stepResult, productionProcessContext,
equipVariableCollectContextList, productionPartContextList, productionPsInContextList, productionPsOutContextList).isCompleted()) {
return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg());
}
//扫描场景下合并历史产出零件信息/产品条码信息
if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() == equipVariableCollectContextList.get(0).getMessageSource() && !CollectionUtils.isEmpty(cachedProductionPartContextList)) {
@ -173,16 +169,19 @@ public class MesWorkOrderCheckSortStepServiceBak extends MesWorkOrderCheckStepSe
}
//验证工单的有效性
private StepResult checkWorkOrderValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult,
MesProductionProcessContext productionProcessContext, MesWorkCenter workCenter,
private StepResult checkWorkOrderValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext,
List<MesEquipVariableCollectContext> equipVariableCollectContextList, List<MesProductionPartContext> productionPartContextList,
List<MesProductionPsInContext> productionPsInContextList, List<MesProductionPsOutContext> productionPsOutContextList) {
//从上下文中取出生产线与工位对象
MesWorkCenter workCenter = productionProcessContext.getWorkCenter();
MesWorkCell workCell = productionProcessContext.getWorkCell();
//搜集生产工单号
List<String> filterList = equipVariableCollectContextList.stream().filter(o -> (null != o)).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList());
List<String> workOrderNoList = filterList.stream().filter(o -> (!StringUtils.isEmpty(o) && !o.equals(productionProcessContext.getFinishCode()))).distinct().collect(Collectors.toList());
Map<String, Map<String, Object>> workOrderMap = workOrderExtService.getWorkOrderMapSort(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), workOrderNoList);
Map<String, Map<String, Object>> workOrderMap = workOrderExtService.getWorkOrderMapSort(reqBean.getOrganizeCode(), workOrderNoList, workCell);
for (String workOrderNo : workOrderNoList) {

@ -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, "工位工单推送成功!");
}
}

@ -67,12 +67,12 @@ public class MesWorkOrderQueueSaveStepService extends BaseStepService {
}
private void saveWorkOrderQueue(StationRequestBean reqBean, MesProductionPsInContext productionPsInContext) {
// if (!StringUtils.isEmpty(productionPsInContext.getProcessCode()) && productionPsInContext.getProcessCode().equals(reqBean.getProcessCode())) return;
queueOrderRepository.updateByProperties(
if (StringUtils.isEmpty(productionPsInContext.getRelateId())) return;
queueOrderRepository.updateByPropertiesNoSync(
new String[]{MesPcnExtConstWords.ID, MesPcnExtConstWords.ORGANIZE_CODE},
new Object[]{productionPsInContext.getRelateId(), reqBean.getOrganizeCode()},
new String[]{MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.SYSTEM_SYNC_STATUS, MesPcnExtConstWords.STATUS},
new Object[]{reqBean.getUserInfo(), TimeTool.getNowTime(true), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), MesExtEnumUtil.QUEUE_ORDER_STATUS.FINISH.getValue()});
new String[]{MesPcnExtConstWords.STATUS, MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.SYSTEM_SYNC_STATUS, MesPcnExtConstWords.SYSTEM_SYNC_DATE_TIME},
new Object[]{MesExtEnumUtil.QUEUE_ORDER_STATUS.FINISH.getValue(), reqBean.getUserInfo(), TimeTool.getNowTime(true), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), MesPcnExtConstWords.EMPTY});
}
}

@ -290,10 +290,32 @@ public class MesProductionCustomContextStepService extends BaseStepService imple
return !StringUtils.isEmpty(contextStr) ? JSONObject.parseObject(contextStr, Map.class) : null;
}
//删除上下文班次班组信息
//删除打包数据
@Override
public void removePackageDataContext(StationRequestBean reqBean) {
removeFsmBusiData(reqBean.getOrganizeCode(), getPackageDataContextKey(reqBean));
}
//排序线工单队列推送锁数据KEY 【PS:生产线级别】
private String getSortQueuePushLockContextKey(String orgainzeCode, String workCenterCode) { return new StringJoiner(MesPcnExtConstWords.COLON).add(orgainzeCode).add(MesPcnExtConstWords.QUEUE_PUSH_LOCK_CONTEXT).add(workCenterCode).toString(); }
//获取排序线工单队列推送锁数据
@Override
public List<String> getSortQueuePushLockContext(String orgainzeCode, String workCenterCode) {
return getFsmBusiList(orgainzeCode, getSortQueuePushLockContextKey(orgainzeCode, workCenterCode));
}
//保存排序线工单队列推送锁数据
@Override
public Boolean dispatchSortQueuePushLockContext(String organizeCode, String workCenterCode, String queuePushId) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workCenterCode) || StringUtils.isEmpty(queuePushId)) return false;
return dispatchFsmBusiList(organizeCode, getSortQueuePushLockContextKey(organizeCode, workCenterCode), queuePushId);
}
//删除排序线工单队列推送锁数据
@Override
public void removeSortQueuePushLockContext(String orgainzeCode, String workCenterCode, String queuePushId) {
removeFsmBusiList(orgainzeCode, getSortQueuePushLockContextKey(orgainzeCode, workCenterCode), queuePushId);
}
}

@ -6,6 +6,7 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesWorkOrderCutDetailModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPush;
import cn.estsh.i3plus.pojo.mes.bean.MesRawPartCharging;
import cn.estsh.i3plus.pojo.mes.bean.shipping.MesShippingQueue;
import cn.estsh.i3plus.pojo.mes.model.StationKvBean;
@ -550,4 +551,18 @@ public class MesProductionDispatchContextStepService extends BaseStepService imp
return dispatchFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.SHIPPING_QUEUE_CONTEXT, JSONObject.toJSONString(shippingQueue));
}
//获取上下文推单队列信息
@Override
public List<MesQueueOrderPush> getSortQueuePushContext(StationRequestBean reqBean) {
String sortQueuePushJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.QUEUE_PUSH_CONTEXT);
return !StringUtils.isEmpty(sortQueuePushJson) ? JSONObject.parseArray(sortQueuePushJson, MesQueueOrderPush.class) : null;
}
//保存上下文推单队列信息
@Override
public Boolean dispatchSortQueuePushContext(StationRequestBean reqBean, List<MesQueueOrderPush> queueOrderPushList) {
if (CollectionUtils.isEmpty(queueOrderPushList)) return false;
return dispatchFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.QUEUE_PUSH_CONTEXT, JSONObject.toJSONString(queueOrderPushList));
}
}

@ -3,6 +3,7 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step.context;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesEquipmentExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesProdOrgExtService;
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.*;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmRouteDataService;
@ -49,6 +50,9 @@ public class MesProductionProcessContextStepService extends BaseStepService impl
private IConfigService configService;
@Autowired
private IMesQueueOrderPushService queueOrderPushService;
@Autowired
private SnowflakeIdMaker snowflakeIdMaker;
private String getContextKey(StationRequestBean reqBean) {
@ -617,14 +621,24 @@ public class MesProductionProcessContextStepService extends BaseStepService impl
MesCellEquipContext cellEquipmentContext = productionProcessContext.getCurCellEquip();
if (null == cellEquipmentContext) cellEquipmentContext = dispatchCurCellEquipment(reqBean, productionProcessContext).getCurCellEquip();
if (!productionProcessContext.getSuccess() || !StringUtils.isEmpty(productionProcessContext.getProdRuleIgnoreCfg())) return productionProcessContext;
//根据设备代码查询加工不可用规则信息, 如果是排序线末道工位,需要查询生产线所有设备的不可用规则, 因为末道工位可能会补装配前道
List<MesProdRuleIgnoreCfg> prodRuleIgnoreCfgList = (getCenterType(reqBean).compareTo(MesExtEnumUtil.WORK_CENTER_TYPE.SORT.getValue()) == 0 &&
(!StringUtils.isEmpty(productionProcessContext.getWorkCell().getIsEndWorkCell()) && productionProcessContext.getWorkCell().getIsEndWorkCell().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0))
? equipmentExtService.getProdRuleIgnoreCfgListByCenter(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode())
: equipmentExtService.getProdRuleIgnoreCfgListByEquip(reqBean.getOrganizeCode(), cellEquipmentContext.getEquipmentCode());
List<MesProdRuleIgnoreCfg> prodRuleIgnoreCfgList;
if (getCenterType(reqBean).compareTo(MesExtEnumUtil.WORK_CENTER_TYPE.NOSORT.getValue()) == 0) {
//如果是非排序线, 则根据工位当前设备代码查询加工不可用规则信息
prodRuleIgnoreCfgList = equipmentExtService.getProdRuleIgnoreCfgListByEquip(reqBean.getOrganizeCode(), cellEquipmentContext.getEquipmentCode());
} else if (!StringUtils.isEmpty(productionProcessContext.getWorkCell().getIsEndWorkCell()) && productionProcessContext.getWorkCell().getIsEndWorkCell().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0) {
//如果是排序线末道工位,需要查询生产线所有设备的不可用规则, 因为末道工位可能会补装配前道
prodRuleIgnoreCfgList = equipmentExtService.getProdRuleIgnoreCfgListByCenter(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode());
} else {
//如果是排序线,需要查询当前工位下所有设备的不可用规则, 排序线一个工位对应多个设备, 例如不同扭距枪的装配件对应不同的设备
prodRuleIgnoreCfgList = equipmentExtService.getProdRuleIgnoreCfgListByCell(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode());
}
//存储不可用规则到上下文
if (!CollectionUtils.isEmpty(prodRuleIgnoreCfgList)) {
dispatchFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PROD_RULE_IGNORE_CFG_CONTEXT, JSONObject.toJSONString(prodRuleIgnoreCfgList));
}
productionProcessContext.prodRuleIgnoreCfg(!CollectionUtils.isEmpty(prodRuleIgnoreCfgList) ? CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr() : CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValueStr()).isNeedCache();
return productionProcessContext;
}
@ -645,7 +659,43 @@ public class MesProductionProcessContextStepService extends BaseStepService impl
List<MesProdRuleIgnoreCfg> prodRuleIgnoreCfgList = getProdRuleIgnoreCfgContext(reqBean, productionProcessContext);
return CollectionUtils.isEmpty(prodRuleIgnoreCfgList) ? null :
prodRuleIgnoreCfgList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getDataSource()) && !StringUtils.isEmpty(o.getSourceId())))
.collect(Collectors.groupingBy(o -> new StringJoiner(MesPcnExtConstWords.AND).add(o.getDataSource().toString()).add(o.getSourceId().toString()).toString()));
.collect(Collectors.groupingBy(o -> new StringJoiner(MesPcnExtConstWords.AND).add(o.getDataSource().toString()).add(o.getEquipmentCode()).add(o.getSourceId().toString()).toString()));
}
//处理排序线推单配置上下文, 返回推送工位类型对应的配置信息
@Override
public List<MesQueueOrderPushCellCfg> dispatchQueueOrderPushCellCfgContext(StationRequestBean reqBean, Integer pushType) {
List<MesQueueOrderPushCellCfg> queueOrderPushCellCfgList = dispatchQueueOrderPushCellCfgContext(reqBean);
return CollectionUtils.isEmpty(queueOrderPushCellCfgList) ? null :
queueOrderPushCellCfgList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getPushType()) && o.getPushType().compareTo(pushType) == 0)).collect(Collectors.toList());
}
//处理排序线推单配置上下文
private List<MesQueueOrderPushCellCfg> dispatchQueueOrderPushCellCfgContext(StationRequestBean reqBean) {
String queuePushCfgJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.QUEUE_PUSH_CFG_CONTEXT);
if (!StringUtils.isEmpty(queuePushCfgJson)) return JSONObject.parseArray(queuePushCfgJson, MesQueueOrderPushCellCfg.class);
//根据生产线代码查询生产队列推送工位配置信息
List<MesQueueOrderPushCellCfg> queueOrderPushCellCfgList = queueOrderPushService.getQueueOrderPushCellCfgList(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode());
//搜集该工位对应的配置信息
List<MesQueueOrderPushCellCfg> filterList = CollectionUtils.isEmpty(queueOrderPushCellCfgList) ? null :
queueOrderPushCellCfgList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getPushSourceCode()) &&
!StringUtils.isEmpty(o.getPushType()) && !StringUtils.isEmpty(o.getWorkCellCode()) && o.getWorkCellCode().equals(reqBean.getWorkCellCode()))).collect(Collectors.toList());
if (CollectionUtils.isEmpty(filterList)) return null;
//验证是否存在查询队列需要考虑竞争的代码, 赋值是否需要锁定
for (MesQueueOrderPushCellCfg queueOrderPushCellCfg : filterList) {
if (null == queueOrderPushCellCfg || queueOrderPushCellCfg.getPushType().compareTo(MesExtEnumUtil.QUEUE_ORDER_CELL_PUSH_TYPE.SOURCE.getValue()) == 0) continue;
Optional<MesQueueOrderPushCellCfg> optional = queueOrderPushCellCfgList.stream().filter(o -> (null != o
&& !StringUtils.isEmpty(o.getWorkCellCode()) && !o.getWorkCellCode().equals(reqBean.getWorkCellCode())
&& !StringUtils.isEmpty(o.getPushType()) && o.getPushType().compareTo(MesExtEnumUtil.QUEUE_ORDER_CELL_PUSH_TYPE.TARGET.getValue()) == 0)
&& !StringUtils.isEmpty(o.getPushSourceCode()) && o.getPushSourceCode().equals(queueOrderPushCellCfg.getPushSourceCode())).findFirst();
if (null != optional && optional.isPresent()) queueOrderPushCellCfg.setIsNeedLock(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr());
}
//保存排序线推单配置上下文
if (!CollectionUtils.isEmpty(queueOrderPushCellCfgList)) dispatchFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.QUEUE_PUSH_CFG_CONTEXT, JSONObject.toJSONString(filterList));
return filterList;
}
}

@ -127,7 +127,7 @@ public class MesProductionPsInContext implements Serializable {
}
public MesProductionPsInContext relateId(Long relateId) {
this.relateId = relateId;
if (!StringUtils.isEmpty(relateId)) this.relateId = relateId;
return this;
}

@ -359,6 +359,18 @@ public class MesPcnExtConstWords {
public static final String SHIPPING_GROUP_NAME = "shippingGroupName";
//队列状态
public static final String QUEUE_STATUS = "queueStatus";
//工艺顺序号
public static final String PROCESS_SEQ = "processSeq";
//推送来源代码
public static final String PUSH_SOURCE_CODE = "pushSourceCode";
//业务类型
public static final String BUSI_TYPE = "busiType";
//当前页数
public static final String CURRENT_PAGE = "currentPage";
//页面数量
public static final String PAGE_SIZE = "pageSize";
//枚举代码
public static final String ENUM_CODE = "enumCode";
//BaseBean字段不包含工厂, 用于对象复制剔除属性BeanUtils.copyProperties(Object source, Object target, String... ignoreProperties)
@ -522,8 +534,14 @@ public class MesPcnExtConstWords {
public static final Integer FOUR = 4;
//7
public static final Integer SEVEN = 7;
//10
public static final Integer TEN = 10;
//14
public static final Integer FOURTEEN = 14;
//49
public static final Integer FORTY_NINE = 49;
//50
public static final Integer FIFTY = 50;
//60
public static final Integer SIXTY = 60;
//100
@ -628,6 +646,12 @@ public class MesPcnExtConstWords {
public static final String EQUIP_SPOT_CHECK_CONTEXT = "EQUIP_SPOT_CHECK_CONTEXT";
// 加工不可用规则上下文
public static final String PROD_RULE_IGNORE_CFG_CONTEXT = "PROD_RULE_IGNORE_CFG_CONTEXT";
// 推送队列配置上下文
public static final String QUEUE_PUSH_CFG_CONTEXT = "QUEUE_PUSH_CFG_CONTEXT";
// 推送队列锁上下文
public static final String QUEUE_PUSH_LOCK_CONTEXT = "QUEUE_PUSH_LOCK_CONTEXT";
// 推送队列上下文
public static final String QUEUE_PUSH_CONTEXT = "QUEUE_PUSH_CONTEXT";
// 上下文: 展示组件数据
public static final String MODULE_CONTENT_CONTEXT = "MODULE_CONTENT_CONTEXT";

Loading…
Cancel
Save