Merge branch 'dev-wuhan' into dev-wuhan-temp

tags/yfai-pcn-ext-v2.3
王杰 8 months ago
commit 5e2d89d6af

@ -28,4 +28,11 @@ public interface IMesEquipmentExtService {
@ApiOperation(value = "根据设备数据变量ID集合查询设备数据变量信息")
List<MesEquipmentVariable> getEquipmentVariableList(String organizeCode, List<Long> equipVariableIdList);
@ApiOperation(value = "根据设备代码和设备变量ID查询设备变量")
MesEquipmentVariable getMesEquipmentVariable(String organizeCode, String equipmentCode,long equipmentVariableId);
@ApiOperation(value = "根据设备代码和通道查询设备通道信息")
MesEquipmentChannel getMesEquipmentChannel(String organizeCode, String equipmentCode,String channel);
}

@ -18,6 +18,9 @@ public interface IMesProdOrgExtService {
@ApiOperation(value = "根据生产线代码,工位代码查询工位信息")
MesWorkCell getWorkCellDb(String organizeCode, String workCenterCode, String workCellCode);
@ApiOperation(value = "根据生产线代码,工位代码查询工位信息")
MesWorkCell getWorkCellDb(String organizeCode, String workCenterCode, String workCellCode, Boolean isCheckEndWorkCell);
@ApiOperation(value = "根据生产线代码查询工位信息")
List<MesWorkCell> getWorkCellList(String organizeCode, String workCenterCode);

@ -2,7 +2,7 @@ package cn.estsh.i3plus.ext.mes.pcn.api.busi;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProdShiftContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblyNosortContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblyContext;
import cn.estsh.i3plus.pojo.mes.model.StationKvBean;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
@ -76,7 +76,7 @@ public interface IMesProductionCustomContextStepService {
Integer getRepeatAssemblySnCount(String organizeCode, String workCenterCode, String workCellCode, String equipmentCode);
@ApiOperation(value = "保存可复用条码到上下文")
Boolean dispatchRepeatAssemblySn(String organizeCode, String workCenterCode, String workCellCode, MesProductionAssemblyNosortContext productionAssemblyNosortContext);
Boolean dispatchRepeatAssemblySn(String organizeCode, String workCenterCode, String workCellCode, MesProductionAssemblyContext productionAssemblyContext);
@ApiOperation(value = "删除上下文可复用条码信息")
void removeRepeatAssemblySn(StationRequestBean reqBean);

@ -2,7 +2,6 @@ package cn.estsh.i3plus.ext.mes.pcn.api.busi;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesSortShippingCheckModel;
import cn.estsh.i3plus.pojo.mes.bean.MesJisShipping;
import cn.estsh.i3plus.pojo.mes.bean.shipping.MesLoadingList;
import cn.estsh.i3plus.pojo.mes.bean.shipping.MesShippingOrderManagement;
import cn.estsh.i3plus.pojo.mes.bean.shipping.MesShippingOrderManagementDetail;
import io.swagger.annotations.ApiOperation;
@ -22,7 +21,7 @@ public interface IMesSortShippingCheckService {
MesSortShippingCheckModel doShippingOrderNoQuery(MesShippingOrderManagement shippingOrderManagement);
@ApiOperation(value = "保存条码")
MesSortShippingCheckModel saveSn(MesSortShippingCheckModel model, String organizeCode, String userInfo);
MesSortShippingCheckModel saveSn(MesSortShippingCheckModel model);
@ApiOperation(value = "保存条码和位置码")
MesSortShippingCheckModel saveSnAndLocationCode(MesSortShippingCheckModel model, String organizeCode, String userInfo);

@ -32,6 +32,9 @@ public interface IMesWorkOrderExtService {
void update(MesWorkOrder item);
@ApiOperation(value = "保存工单信息")
void saveAll(List<MesWorkOrder> workOrderList);
@ApiOperation(value = "根据生产工单ID查询生产工单信息")
List<MesWorkOrder> getWorkOrderListByShiftCode(String organizeCode, String workCenterCode, String shiftCode);

@ -107,9 +107,10 @@ public class MesSortShippingCheckController {
ValidatorBean.checkNotNull(model.getShippingCode(), "发运单不能为空");
ValidatorBean.checkNotNull(model.getDetailList(), "发运明细不能为空");
ValidatorBean.checkNotNull(model.getSn(), "条码不能为空");
sortShippingCheckService.saveSn(model, organizeCode, userInfo);
return ResultBean.success("查询成功").setResultObject(model);
model.setOrganizeCode(organizeCode);
model.setUserInfo(userInfo);
sortShippingCheckService.saveSn(model);
return ResultBean.success("扫描成功").setResultObject(model);
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {

@ -117,4 +117,21 @@ public class MesEquipmentExtService implements IMesEquipmentExtService {
else DdlPreparedPack.getInPackList(equipVariableIdList, MesPcnExtConstWords.ID, packBean);
return equipmentVariableRepository.findByHqlWhere(packBean);
}
@Override
public MesEquipmentVariable getMesEquipmentVariable(String organizeCode, String equipmentCode, long equipmentVariableId) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(equipmentCode) || equipmentVariableId == 0) return null;
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(equipmentCode, MesPcnExtConstWords.EQUIPMENT_CODE, packBean);
DdlPreparedPack.getNumEqualPack(equipmentVariableId, MesPcnExtConstWords.ID, packBean);
return equipmentVariableRepository.getByProperty(packBean);
}
@Override
public MesEquipmentChannel getMesEquipmentChannel(String organizeCode, String equipmentCode, String channel) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(equipmentCode) || StringUtils.isEmpty(channel)) return null;
return equipmentChannelRepository.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.EQUIPMENT_CODE, MesPcnExtConstWords.CHANNEL},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), equipmentCode, channel});
}
}

@ -17,10 +17,7 @@ import org.springframework.stereotype.Service;
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.TreeSet;
import java.util.*;
import java.util.stream.Collectors;
@Slf4j
@ -59,6 +56,16 @@ public class MesProdOrgExtService implements IMesProdOrgExtService {
}
@Override
public MesWorkCell getWorkCellDb(String organizeCode, String workCenterCode, String workCellCode, Boolean isCheckEndWorkCell) {
if (!isCheckEndWorkCell) return getWorkCellDb(organizeCode, workCenterCode, workCellCode);
List<MesWorkCell> workCellList = getWorkCellList(organizeCode, workCenterCode);
Optional<MesWorkCell> optional = CollectionUtils.isEmpty(workCellList) ? null : workCellList.stream().filter(o -> (null != o && o.getWorkCellCode().equals(workCellCode))).findFirst();
if (null == optional || !optional.isPresent()) return null;
if (workCellList.size() == 1) optional.get().setIsEndWorkCell(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue());
return optional.get();
}
@Override
public List<MesWorkCell> getWorkCellList(String organizeCode, String workCenterCode) {
if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workCenterCode)) return null;
List<MesWorkCell> workCellList = workCellRepository.findByProperty(

@ -23,6 +23,7 @@ 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.base.util.StringUtil;
import cn.estsh.i3plus.pojo.mes.bean.*;
import cn.estsh.i3plus.pojo.mes.bean.nc.MesPartInspection;
import cn.estsh.i3plus.pojo.mes.bean.nc.MesPartInspectionDetail;
@ -133,13 +134,20 @@ public class MesReworkTaskServiceImpl implements IMesReworkTaskService {
@Autowired
private MesQmsScrapRepository mesQmsScrapRepository;
@Autowired
private IMesWorkOrderExtService workOrderExtService;
@Override
public ListPager<MesReworkTask> queryReworkTask(MesReworkTask mesReworkTask, Pager pager) {
String organizeCode = !StringUtils.isEmpty(mesReworkTask.getOrganizeCode())?mesReworkTask.getOrganizeCode():AuthUtil.getOrganizeCode();
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
if (mesReworkTask.getSn() != null) {
MesProduceSn produceSn = (MesProduceSn) workOrderExtService.getWorkOrderSort(organizeCode, mesReworkTask.getSn(), false);
if(!StringUtil.isEmpty(produceSn)){
DdlPreparedPack.getStringEqualPack(produceSn.getProductSn(), "sn", packBean);
}else {
DdlPreparedPack.getStringEqualPack(mesReworkTask.getSn(), "sn", packBean);
}
}
DdlPreparedPack.getStringEqualPack(mesReworkTask.getReworkOrder(), "reworkOrder", packBean);
DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.REWORK_TASK_STATUS.CREATE.getValue(), "status", packBean);
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{"createDatetime"}, packBean);
@ -824,8 +832,13 @@ public class MesReworkTaskServiceImpl implements IMesReworkTaskService {
private MesReworkTask getMesReworkTask(MesReworkTaskRequestModel requestModel) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(requestModel.getOrganizeCode());
if (!StringUtils.isEmpty(requestModel.getSn())) {
MesProduceSn produceSn = (MesProduceSn) workOrderExtService.getWorkOrderSort(requestModel.getOrganizeCode(), requestModel.getSn(), false);
if(!StringUtil.isEmpty(produceSn)){
DdlPreparedPack.getStringEqualPack(produceSn.getProductSn(), "sn", packBean);
}else {
DdlPreparedPack.getStringEqualPack(requestModel.getSn(), "sn", packBean);
}
}
if (!StringUtils.isEmpty(requestModel.getReworkOrder())) {
DdlPreparedPack.getStringEqualPack(requestModel.getReworkOrder(), "reworkOrder", packBean);
}

@ -244,9 +244,11 @@ public class MesInputDefectRecordService implements IMesInputDefectRecordService
if (model.isTransferFlg() && model.getSourceType() == MesExtEnumUtil.PART_INSPECTION_SOURCE_TYPE.SINGLE.getValue()) {
//移库
if (model.getOptType() != 2) {
MesMove move = createMove(model, getDestLocateNo(model, org), configService.getCfgValue(org, "LGORT"), org, null == produceSn ? model.getWorkCenterCode() : produceSn.getWorkCenterCode());
moveRepository.save(move);
}
}
//判断首次合格还是 多次检验最终为合格品
//若返修单返修完成,则会生成一个新的检验单并合格
@ -335,12 +337,13 @@ public class MesInputDefectRecordService implements IMesInputDefectRecordService
}else{
srcLocate= configService.getCfgValue(org, "UMLGO");
}
if (model.getOptType() != 2) {
//移库
MesMove move = createMove(model, srcLocate, configService.getCfgValue(org, "LGORT"), org, null == produceSn ? model.getWorkCenterCode() : produceSn.getWorkCenterCode());
moveRepository.save(move);
}
}
}
} else {
//零件检测详情不为空,则代表本次校验为不合格。
@ -401,9 +404,11 @@ public class MesInputDefectRecordService implements IMesInputDefectRecordService
if (Objects.isNull(srcLocateNo)) {
srcLocateNo = configService.getCfgValue(org, "LGORT");
}
if (model.getOptType() != 2) {
//移库
MesMove move = createMove(model, srcLocateNo, configService.getCfgValue(org, "UMLGO"), org, null == produceSn ? model.getWorkCenterCode() : produceSn.getWorkCenterCode());
moveRepository.save(move);
}
} else {
@ -438,6 +443,7 @@ public class MesInputDefectRecordService implements IMesInputDefectRecordService
throw new ImppBusiException(String.format("【%s】位置不存在请检查数据", defectTypeNoExitList));
}
//若是扫描条码 则判定条码可疑
if (model.getSourceType() == MesExtEnumUtil.PART_INSPECTION_SOURCE_TYPE.SINGLE.getValue()) {
checkProduceSn(produceSn, model.getSn());
@ -458,9 +464,10 @@ public class MesInputDefectRecordService implements IMesInputDefectRecordService
partInspectionDetailRepository.saveAll(model.getPartInspectionDetailList());
//移库
if (model.getOptType() != 2) {
MesMove move = createMove(model, configService.getCfgValue(org, "LGORT"), configService.getCfgValue(org, "UMLGO"), org, null == produceSn ? model.getWorkCenterCode() : produceSn.getWorkCenterCode());
moveRepository.save(move);
}
}
@ -996,7 +1003,10 @@ public class MesInputDefectRecordService implements IMesInputDefectRecordService
if (CollectionUtils.isEmpty(produceSnList)) {
MesPcnException.throwFlowException("条码不存在");
}
MesProduceSn produceSn = produceSnList.get(0);
MesProduceSn produceSn = produceSnList.stream().filter(mesProduceSn -> Objects.equals(mesProduceSn.getSnStatus(), MesExtEnumUtil.PRODUCE_SN_STATUS.SHIPPED.getValue())).findFirst().orElse(null);
if (produceSn == null) {
MesPcnException.throwFlowException("条码不存在");
}
MesProduceSnLog produceSnLog = new MesProduceSnLog();

@ -347,6 +347,7 @@ public class MesNcProcessingService implements IMesNcProcessingService {
}
String source = configService.getCfgValue(org, "LGORT");
String refundSource = configService.getCfgValue(org, "REFUND");
if (!StringUtils.isEmpty(model.getProductVersion())) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean();
DdlPreparedPack.getStringEqualPack(model.getPart().getPartNo(), "partNo", ddlPackBean);
@ -387,9 +388,12 @@ public class MesNcProcessingService implements IMesNcProcessingService {
model.getPartInspection().setNcStatus(MesExtEnumUtil.PART_INSPECTION_NC_STATUS.NORMAL.getValue());
ConvertBean.serviceModelUpdate(model.getPartInspection(), model.getUserName());
partInspectionRepository.save(model.getPartInspection());
String sourceValue = configService.getCfgValue(org, "UMLGO");
if (model.getOptType() == 2) {
sourceValue = refundSource;
}
//移库 转正常、放行8000移至2000
MesMove move = createMove(model, configService.getCfgValue(org, "UMLGO"), configService.getCfgValue(org, "LGORT"), org, null == sn ? workCenterCode : sn.getWorkCenterCode(), MesExtEnumUtil.MOVE_TYPE.NORMAL_MOVE);
MesMove move = createMove(model, sourceValue, configService.getCfgValue(org, "LGORT"), org, null == sn ? workCenterCode : sn.getWorkCenterCode(), MesExtEnumUtil.MOVE_TYPE.NORMAL_MOVE);
ConvertBean.serviceModelInitialize(move,model.getUserName());
moveRepository.save(move);
@ -442,7 +446,12 @@ public class MesNcProcessingService implements IMesNcProcessingService {
ConvertBean.serviceModelUpdate(model.getPartInspection(),model.getUserName());
partInspectionRepository.save(model.getPartInspection());
MesMove move = createMove(model, configService.getCfgValue(org, "UMLGO"), areaCode, org, null == sn ? workCenterCode : sn.getWorkCenterCode(), MesExtEnumUtil.MOVE_TYPE.RETURN_MOVE);
String sourceValue = configService.getCfgValue(org, "UMLGO");
if (model.getOptType() == 2) {
sourceValue = refundSource;
}
MesMove move = createMove(model, sourceValue, areaCode, org, null == sn ? workCenterCode : sn.getWorkCenterCode(), MesExtEnumUtil.MOVE_TYPE.RETURN_MOVE);
ConvertBean.serviceModelInitialize(move,model.getUserName());
moveRepository.save(move);
@ -477,12 +486,21 @@ public class MesNcProcessingService implements IMesNcProcessingService {
ConvertBean.serviceModelUpdate(model.getPartInspection(), model.getUserName());
partInspectionRepository.save(model.getPartInspection());
if (isOrder) {
MesMove move = createMove(model, source, configService.getCfgValue(org, "SCRAP"), org, null == sn ? workCenterCode : sn.getWorkCenterCode(), MesExtEnumUtil.MOVE_TYPE.SCRAP_MOVE);
String sourceValue = source;
if (model.getOptType() == 2) {
sourceValue = refundSource;
}
MesMove move = createMove(model, sourceValue, configService.getCfgValue(org, "SCRAP"), org, null == sn ? workCenterCode : sn.getWorkCenterCode(), MesExtEnumUtil.MOVE_TYPE.SCRAP_MOVE);
ConvertBean.serviceModelInitialize(move,model.getUserName());
moveRepository.save(move);
} else {
String sourceValue = configService.getCfgValue(org, "UMLGO");
if (model.getOptType() == 2) {
sourceValue = refundSource;
}
//移库 转报废 根据责任方库区对应关系的主数据选择哪个责任方就移动到哪个库区8000移至8002/8003
MesMove move = createMove(model, configService.getCfgValue(org, "UMLGO"), areaCode, org, null == sn ? workCenterCode : sn.getWorkCenterCode(), MesExtEnumUtil.MOVE_TYPE.SCRAP_MOVE);
MesMove move = createMove(model, sourceValue, areaCode, org, null == sn ? workCenterCode : sn.getWorkCenterCode(), MesExtEnumUtil.MOVE_TYPE.SCRAP_MOVE);
ConvertBean.serviceModelInitialize(move,model.getUserName());
moveRepository.save(move);
}
@ -515,9 +533,12 @@ public class MesNcProcessingService implements IMesNcProcessingService {
ConvertBean.serviceModelUpdate(model.getPartInspection(), model.getUserName());
partInspectionRepository.save(model.getPartInspection());
String sourceValue = configService.getCfgValue(org, "UMLGO");
if (model.getOptType() == 2) {
sourceValue = refundSource;
}
//移库 转正常、放行8000移至2000
MesMove move = createMove(model, configService.getCfgValue(org, "UMLGO"), configService.getCfgValue(org, "LGORT"), org, null == sn ? workCenterCode : sn.getWorkCenterCode(), MesExtEnumUtil.MOVE_TYPE.NORMAL_MOVE);
MesMove move = createMove(model, sourceValue, configService.getCfgValue(org, "LGORT"), org, null == sn ? workCenterCode : sn.getWorkCenterCode(), MesExtEnumUtil.MOVE_TYPE.NORMAL_MOVE);
ConvertBean.serviceModelInitialize(move,model.getUserName());
moveRepository.save(move);

@ -1,5 +1,6 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesConfigService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesNumberRuleMatchDispatchService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProduceSnExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesPullingOrderInfoService;
@ -51,6 +52,8 @@ public class MesPullingOrderInfoService implements IMesPullingOrderInfoService {
@Autowired
private IMesProduceSnExtService mesProduceSnExtService;
@Autowired
private IMesConfigService configService;
@Override
public ListPager<MesPullingOrderInfo> queryMesPullingOrderInfoByPager(MesPullingOrderInfo bean, Pager pager) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(bean.getOrganizeCode());
@ -106,28 +109,42 @@ public class MesPullingOrderInfoService implements IMesPullingOrderInfoService {
MesPcnException.throwMesBusiException("扫描拉动单号【%s】拉动单状态不是【已确认】", bean.getPullingOrderNo());
}
//强过码 如果强过为true 不校验顺序 直接扫描完成修改状态为已扫描 todo
if ((!Objects.isNull(bean.getIsPass()) && CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == bean.getIsPass())) {
//强过码 如果强过为true 不校验顺序 直接扫描完成修改状态为已扫描
//扫完单号 扫强过码校验通过后 单号顺序之前的单子变成无序 都可扫描
// String spsPass = configService.getCfgValue(bean.getOrganizeCode(), MesPcnExtConstWords.SPS_STRONGER_PASS);
if (mesPullingOrderInfo.getIsPassCode()==CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()
||(!Objects.isNull(bean.getIsPass()) && CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()==bean.getIsPass())) {
mesPullingOrderInfo.setPullOrderStatus(MesExtEnumUtil.PULL_ORDER_STATUS.JIS_PULL.getValue());
ConvertBean.serviceModelUpdate(mesPullingOrderInfo, userName);
mesPullingOrderInfoRepository.update(mesPullingOrderInfo);
//修改当前单号之前的为可强过
DdlPackBean packBeanPass= DdlPackBean.getDdlPackBean(bean.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(bean.getPullCode(), "pullCode", packBeanPass);
DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.PULL_ORDER_STATUS.KITTING_PULL.getValue(), "pullOrderStatus", packBeanOne);
DdlPreparedPack.getStringSmallerNotEqualPack(bean.getPullingOrderNo(), "pullingOrderNo", packBeanPass);
DdlPreparedPack.getStringEqualPack(bean.getWorkCenterCode(), "workCenterCode", packBeanPass);
List<MesPullingOrderInfo> mesPullingOrderInfos = mesPullingOrderInfoRepository.findByHqlWhere(packBeanPass);
if (!CollectionUtils.isEmpty(mesPullingOrderInfos)){
for (MesPullingOrderInfo pullingOrderInfo : mesPullingOrderInfos) {
pullingOrderInfo.setIsPassCode(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue());
ConvertBean.serviceModelUpdate(pullingOrderInfo, userName);
}
mesPullingOrderInfoRepository.saveAll(mesPullingOrderInfos);
}
} else {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(bean.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(bean.getPullCode(), "pullCode", packBean);
DdlPreparedPack.getStringEqualPack(bean.getWorkCenterCode(), "workCenterCode", packBean);
DdlPreparedPack.getNumEqualPack(bean.getPullOrderType(), "pullOrderType", packBean);
DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.PULL_ORDER_STATUS.KITTING_PULL.getValue(), "pullOrderStatus", packBean);
// if (!StringUtil.isEmpty(bean.orderBy())) {
// packBean.setOrderByStr(bean.orderBy());
// } else {
//顺序校验 根据未扫描单号 1 、2 、3如果没有强过码 必须先扫1 再扫2
//顺序校验 根据未扫描单号 1 、2 、3如果没有强过码 必须先扫1 再扫2 pullingOrderNo修改位workOrderNo
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.ASC.getValue()}, new String[]{"pullingOrderNo"}, packBean);
// }
List<MesPullingOrderInfo> pullingOrderInfos = mesPullingOrderInfoRepository.findByHqlWhere(packBean);
if (!CollectionUtils.isEmpty(pullingOrderInfos)) {
//按照排序 依次扫描,如果扫描不按照顺序 报错
MesPullingOrderInfo pullingOrderInfo = pullingOrderInfos.get(0);
if (pullingOrderInfo.getPullOrderStatus().equals(mesPullingOrderInfo.getPullOrderStatus())) {
if (pullingOrderInfo.getPullingOrderNo().equals(mesPullingOrderInfo.getPullingOrderNo())) {
mesPullingOrderInfo.setPullOrderStatus(MesExtEnumUtil.PULL_ORDER_STATUS.JIS_PULL.getValue());
ConvertBean.serviceModelUpdate(mesPullingOrderInfo, userName);
mesPullingOrderInfoRepository.update(mesPullingOrderInfo);

@ -1,7 +1,9 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesEquipmentExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.*;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.aspect.MonitorLog;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.shippingscan.IMesShippingScanStrategyService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesSortShippingCheckModel;
@ -12,16 +14,17 @@ import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.base.util.StringUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesJisShipping;
import cn.estsh.i3plus.pojo.mes.bean.MesPartShippingGroup;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.bean.*;
import cn.estsh.i3plus.pojo.mes.bean.shipping.MesLoadingList;
import cn.estsh.i3plus.pojo.mes.bean.shipping.MesLoadingListDetail;
import cn.estsh.i3plus.pojo.mes.bean.shipping.MesShippingOrderManagement;
import cn.estsh.i3plus.pojo.mes.bean.shipping.MesShippingOrderManagementDetail;
import cn.estsh.i3plus.pojo.mes.model.MesEquipVariableRwResult;
import cn.estsh.i3plus.pojo.mes.repository.*;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
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;
@ -30,6 +33,7 @@ import org.springframework.util.StringUtils;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* @Description :
@ -44,17 +48,14 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
@Autowired
private MesShippingOrderManagementRepository shippingOrderManagementRepository;
@Autowired
private MesShippingOrderManagementDetailRepository shippingOrderManagementDetailRepository;
@Autowired
private MesProduceSnRepository produceSnRepository;
@Autowired
private IMesProduceSnExtService produceSnExtService;
private MesProduceSnRepository produceSnRepository;
@Autowired
private MesPartShippingGroupRepository partShippingGroupRepository;
@Autowired
private MesLoadingListRepository listRepository;
@Autowired
@ -70,30 +71,141 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
private IMesJisShippingService jisShippingService;
@Autowired
private MesLoadingListDetailRepository vehiclesOrderDetailRepository;
@Autowired
private MesLoadingListRepository vehiclesOrderRepository;
@Autowired
private MesCustomerPartRepository mesCustomerPartRepository;
private MesPartShippingGroupService mesPartShippingGroupService;
@Autowired
private MesPartShippingGroupService mesPartShippingGroupService;
private MesBallTrackRuleRepository mesBallTrackRuleRepository;
@Autowired
private IMesConfigService mesConfigService;
private IMesWorkOrderExtService mesWorkOrderExtService;
@Autowired
private IMesEquipmentExtService mesEquipmentExtService;
@Autowired
private IMesEquipVariableRwExtService equipVariableRwExtService;
@Override
public MesSortShippingCheckModel doShippingOrderNoQuery(MesShippingOrderManagement shippingOrderManagement) {
//校验发运单
MesShippingOrderManagement orderManagement = getMesShippingOrderManagement(shippingOrderManagement);
if(Objects.isNull(orderManagement)){
return null;
}
//校验发运单扫描顺序
checkShippingOrderSeq(shippingOrderManagement, orderManagement);
//根据扫描的发运单找到是否装车配置,若是,则根据发运单查询是否生成装车单,若没生成装车单则提示此发运单配置是否装车为是,但没生成装车单,请检查数据!
checkLoadingList(shippingOrderManagement, orderManagement);
//返回数据组装
MesSortShippingCheckModel model = new MesSortShippingCheckModel();
if (!StringUtils.isEmpty(orderManagement.getCheckSeqCode())) {
model.setIsScanLocationCode(true);
}
//发运单号
model.setShippingCode(orderManagement.getShippingCode());
//零件发运组
model.setMesPartShippingGroup(getMesPartShippingGroup(orderManagement.getOrganizeCode(),orderManagement.getShippingGroupCode()));
//发运单明细
model.setDetailList(getMesShippingOrderManagementDetails(orderManagement));
//最近扫描完成的发运单号
MesShippingOrderManagement lastShippingOrder = getLastShippingOrder(orderManagement.getOrganizeCode());
if (!Objects.isNull(lastShippingOrder)) {
model.setRecentlyScanShippingCode(lastShippingOrder.getShippingCode());
}
return model;
}
@Override
public MesSortShippingCheckModel saveSn(MesSortShippingCheckModel model) {
//校验发运单是否存在
MesShippingOrderManagement orderManagement = checkMesShippingOrderManagement(model);
//零件发运组
MesPartShippingGroup shippingGroup = Objects.isNull(model.getMesPartShippingGroup()) ? getMesPartShippingGroup(orderManagement.getOrganizeCode(), orderManagement.getShippingGroupCode()) : model.getMesPartShippingGroup();
//扫描跳过码
if (!Objects.isNull(model.getIsPass()) && Objects.equals(MesPcnExtConstWords.ONE, model.getIsPass())) {
skipShippingDetails(model, model.getUserInfo(), orderManagement);
//扫描条码
} else{
model = ((IMesShippingScanStrategyService) SpringContextsUtil.getBean(MesExtEnumUtil.SHIPPING_GROUP_CONFIRM_PART_TYPE.valueOfServiceImpl(Integer.parseInt(shippingGroup.getConfirmPartType())))).doScan(model,orderManagement,shippingGroup);
}
model.setDetailList(model.getDetailList());
//当前发运单全部扫描完成 并且不需要扫位置码
if (model.getIsScanCount() == model.getDetailList().size() && StringUtils.isEmpty(orderManagement.getCheckSeqCode())) {
//保存数据库
saveDate(orderManagement, model, model.getOrganizeCode(), model.getUserInfo());
}
return model;
}
@Override
public MesSortShippingCheckModel saveSnAndLocationCode(MesSortShippingCheckModel model, String organizeCode, String userInfo) {
//校验条码
MesProduceSn produceSn = checkMesProduceSn(model, organizeCode);
//校验发运单是否存在
MesShippingOrderManagement orderManagement = checkMesShippingOrderManagement(model);
//根据条码找到对应的物料号若物料号一致则修改扫描flg将flg改为true.
boolean scanFlg = false;
for (MesShippingOrderManagementDetail detail : model.getDetailList()) {
if (detail.getPartNo().equals(produceSn.getPartNo())) {
scanFlg = true;
detail.setIsScanFlg(MesCommonConstant.TRUE_INTEGER);
detail.setBarcode(produceSn.getSerialNumber());
break;
}
}
if (!scanFlg) {
throw new ImppBusiException(String.format("【%s】此条码对应的【%s】物料号与发运单中物料号不匹配请检查数据", model.getSn(), produceSn.getPartNo()));
}
Long count = model.getDetailList().stream().filter(k -> Objects.equals(k.getIsScanFlg(), MesCommonConstant.TRUE_INTEGER)).count();
//当前发运单全部扫描完成
if (count.intValue() == model.getDetailList().size()) {
//保存数据库
saveDate(orderManagement, model, organizeCode, userInfo);
}
return model;
}
@Override
public MesShippingOrderManagement queryShippingOrderNoByAutoPushOrder(String shippingGroupNo, String org) {
//查询最近扫描完成的装车单号
DdlPackBean orderPackBean = DdlPackBean.getDdlPackBean(org);
DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.SHIPPING_ORDER_STATUS.PUBLISHED.getValue(), "status", orderPackBean);
DdlPreparedPack.getStringEqualPack(shippingGroupNo, "shippingGroupCode", orderPackBean);
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{"seq"}, orderPackBean);
return shippingOrderManagementRepository.getByProperty(orderPackBean);
}
private MesPartShippingGroup getMesPartShippingGroup(String org, String partShippingGroupCode) {
if(StringUtil.isEmpty(org) ||StringUtil.isEmpty(partShippingGroupCode)){
return null;
}
MesPartShippingGroup shippingGroup = mesPartShippingGroupService.getMesPartShippingGroup(org, partShippingGroupCode);
if(Objects.isNull(shippingGroup)){
throw new ImppBusiException(String.format("零件发运组【%s】信息不存在请检查数据", partShippingGroupCode));
}
return shippingGroup;
}
private MesShippingOrderManagement getMesShippingOrderManagement(MesShippingOrderManagement shippingOrderManagement) {
//查询发运单信息 发运跳过
DdlPackBean orderManagementPackBean = DdlPackBean.getDdlPackBean(shippingOrderManagement.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(shippingOrderManagement.getShippingCode(), "shippingCode", orderManagementPackBean);
DdlPreparedPack.getNumberSmallerPack(MesExtEnumUtil.SHIPPING_ORDER_STATUS.SHIPPED.getValue(), "status", orderManagementPackBean);
MesShippingOrderManagement orderManagement = shippingOrderManagementRepository.getByProperty(orderManagementPackBean);
if (StringUtils.isEmpty(orderManagement)) {
throw new ImppBusiException(String.format("【%s】此发运单不存在请检查数据", shippingOrderManagement.getShippingCode()));
}
//校验发运单状态 必须是未装车条码
if (orderManagement.getStatus() != MesExtEnumUtil.SHIPPING_ORDER_STATUS.SHIPPING.getValue() && orderManagement.getStatus() != MesExtEnumUtil.SHIPPING_ORDER_STATUS.PUBLISHED.getValue()) {
if (!Stream.of(MesExtEnumUtil.SHIPPING_ORDER_STATUS.SHIPPING.getValue(),MesExtEnumUtil.SHIPPING_ORDER_STATUS.PUBLISHED.getValue()).collect(Collectors.toList()).contains(orderManagement.getStatus())) {
throw new ImppBusiException(String.format("【%s】此发运单状态为【%s】,请选择状态为【%s】或【%s】状态的发运单", shippingOrderManagement.getShippingCode(),
MesExtEnumUtil.SHIPPING_ORDER_STATUS.valueOfDescription(orderManagement.getStatus()),
MesExtEnumUtil.SHIPPING_ORDER_STATUS.SHIPPING.getDescription(), MesExtEnumUtil.SHIPPING_ORDER_STATUS.PUBLISHED.getDescription()));
@ -109,35 +221,26 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
updateShippingOrderDetails(orderManagement.getOrganizeCode(), shippingOrderManagement.getModifyUser(), orderManagement.getId());
return null;
}
return orderManagement;
}
//校验发运单扫描顺序
List<Integer> statusForCheckList = new ArrayList<>();
statusForCheckList.add(MesExtEnumUtil.SHIPPING_ORDER_STATUS.CREATE.getValue());
statusForCheckList.add(MesExtEnumUtil.SHIPPING_ORDER_STATUS.PUBLISHED.getValue());
statusForCheckList.add(MesExtEnumUtil.SHIPPING_ORDER_STATUS.SHIPPING.getValue());
statusForCheckList.add(MesExtEnumUtil.SHIPPING_ORDER_STATUS.PRINTED.getValue());
List<Integer> status = new ArrayList<>();
status.add(MesExtEnumUtil.SHIPPING_ORDER_STATUS.SHIPPED.getValue());
status.add(MesExtEnumUtil.SHIPPING_ORDER_STATUS.LOADING.getValue());
status.add(MesExtEnumUtil.SHIPPING_ORDER_STATUS.STATISTICSING.getValue());
status.add(MesExtEnumUtil.SHIPPING_ORDER_STATUS.STATISTICS.getValue());
private void checkShippingOrderSeq(MesShippingOrderManagement shippingOrderManagement, MesShippingOrderManagement orderManagement) {
//最后一个扫描完成的发运单信息
orderManagementPackBean = DdlPackBean.getDdlPackBean(shippingOrderManagement.getOrganizeCode());
DdlPackBean orderManagementPackBean = DdlPackBean.getDdlPackBean(shippingOrderManagement.getOrganizeCode());
DdlPreparedPack.getNumberSmallerPack(orderManagement.getSeq(), "seq", orderManagementPackBean);
DdlPreparedPack.getStringEqualPack(orderManagement.getShippingGroupCode(), "shippingGroupCode", orderManagementPackBean);
DdlPreparedPack.getInPackList(status, "status", orderManagementPackBean);
DdlPreparedPack.getInPackList(Stream.of(MesExtEnumUtil.SHIPPING_ORDER_STATUS.SHIPPED.getValue(), MesExtEnumUtil.SHIPPING_ORDER_STATUS.LOADING.getValue(), MesExtEnumUtil.SHIPPING_ORDER_STATUS.STATISTICSING.getValue(), MesExtEnumUtil.SHIPPING_ORDER_STATUS.STATISTICS.getValue()).collect(Collectors.toList()), "status", orderManagementPackBean);
DdlPreparedPack.getOrderBy("seq", CommonEnumUtil.ASC_OR_DESC.DESC.getValue(), orderManagementPackBean);
MesShippingOrderManagement management = shippingOrderManagementRepository.getByProperty(orderManagementPackBean);
//是否存在
//当前发运组是否存在比当前小的序号,且状态是未发运完成
orderManagementPackBean = DdlPackBean.getDdlPackBean(shippingOrderManagement.getOrganizeCode());
DdlPreparedPack.getNumberSmallerPack(orderManagement.getSeq(), "seq", orderManagementPackBean);
if (!Objects.isNull(management)) {
DdlPreparedPack.getNumberBiggerPack(management.getSeq(), "seq", orderManagementPackBean);
}
DdlPreparedPack.getStringEqualPack(orderManagement.getShippingGroupCode(), "shippingGroupCode", orderManagementPackBean);
DdlPreparedPack.getInPackList(statusForCheckList, "status", orderManagementPackBean);
boolean exists = shippingOrderManagementRepository.isExitByHql(orderManagementPackBean);
if (exists) {
DdlPreparedPack.getInPackList(Stream.of(MesExtEnumUtil.SHIPPING_ORDER_STATUS.CREATE.getValue(), MesExtEnumUtil.SHIPPING_ORDER_STATUS.PUBLISHED.getValue(), MesExtEnumUtil.SHIPPING_ORDER_STATUS.SHIPPING.getValue(), MesExtEnumUtil.SHIPPING_ORDER_STATUS.PRINTED.getValue()).collect(Collectors.toList()), "status", orderManagementPackBean);
if (shippingOrderManagementRepository.isExitByHql(orderManagementPackBean)) {
//1强过
if ((!Objects.isNull(shippingOrderManagement.getIsPass()) && Objects.equals(MesPcnExtConstWords.ONE, shippingOrderManagement.getIsPass()))) {
orderManagement.setRemark(MesPcnExtConstWords.STRONGER_PASS);
@ -148,8 +251,9 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
orderManagement.getShippingCode(), orderManagement.getSeq()));
}
}
}
//根据扫描的发运单找到是否装车配置,若是,则根据发运单查询是否生成装车单,若没生成装车单则提示此发运单配置是否装车为是,但没生成装车单,请检查数据!
private void checkLoadingList(MesShippingOrderManagement shippingOrderManagement, MesShippingOrderManagement orderManagement) {
if (Objects.equals(orderManagement.getIsLoading(), MesCommonConstant.TRUE_INTEGER)) {
//查询装车单明细
DdlPackBean packBean = DdlPackBean.getDdlPackBean(orderManagement.getOrganizeCode());
@ -164,10 +268,8 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
if(Objects.isNull(loadingList)){
throw new ImppBusiException(String.format("【%s】此发运单配置是否装车为是,但没生成装车单,请检查数据!", shippingOrderManagement.getShippingCode()));
}
//判断是否先装车
if (Objects.equals(orderManagement.getIsFirstInstall(), MesCommonConstant.TRUE_INTEGER)) {
//若没进行装车校验,则提示【%s】此发运单对应的【%s】此装车单状态为【%s】请选择状态为【%s】的数据
if (loadingList.getStatus() != MesExtEnumUtil.MES_LOADING_STATUS.SCANNED.getValue()) {
throw new ImppBusiException(String.format("【%s】此发运单对应的【%s】此装车单状态为【%s】请选择状态为【%s】的数据",
@ -177,265 +279,67 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
}
}
}
MesSortShippingCheckModel model = new MesSortShippingCheckModel();
if (!StringUtils.isEmpty(orderManagement.getCheckSeqCode())) {
model.setIsScanLocationCode(true);
}
DdlPackBean orderDetailPackBean = DdlPackBean.getDdlPackBean(shippingOrderManagement.getOrganizeCode());
private List<MesShippingOrderManagementDetail> getMesShippingOrderManagementDetails(MesShippingOrderManagement orderManagement) {
DdlPackBean orderDetailPackBean = DdlPackBean.getDdlPackBean(orderManagement.getOrganizeCode());
DdlPreparedPack.getNumEqualPack(orderManagement.getId(), "pid", orderDetailPackBean);
DdlPreparedPack.getNumberSmallerPack(MesExtEnumUtil.SHIPPING_ORDER_DETAIL_SHIPPING_STATUS.CLOSE.getValue(),"status",orderDetailPackBean);
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.ASC.getValue()}, new String[]{"custInfoSeq"}, orderDetailPackBean);
List<MesShippingOrderManagementDetail> detailList = shippingOrderManagementDetailRepository.findByHqlWhere(orderDetailPackBean);
if(CollectionUtils.isEmpty(detailList)){
throw new ImppBusiException(String.format("发运单【%s】明细信息不存在请检查数据", orderManagement.getShippingCode()));
}
//已扫描数据
detailList.forEach(k -> {
if (k.getStatus() == MesExtEnumUtil.SHIPPING_ORDER_DETAIL_SHIPPING_STATUS.SHIPPINGED.getValue() || k.getStatus() == MesExtEnumUtil.SHIPPING_ORDER_DETAIL_SHIPPING_STATUS.SKIP.getValue()){
if (Stream.of(MesExtEnumUtil.SHIPPING_ORDER_DETAIL_SHIPPING_STATUS.SHIPPINGED.getValue(),MesExtEnumUtil.SHIPPING_ORDER_DETAIL_SHIPPING_STATUS.SKIP.getValue()).collect(Collectors.toList()).contains(k.getStatus())){
k.setIsScanFlg(MesCommonConstant.TRUE_INTEGER);
}
});
return detailList;
}
Long count = detailList.stream().filter(k -> Objects.equals(k.getIsScanFlg(), MesCommonConstant.TRUE_INTEGER)).count();
model.setIsScanCount(count.intValue());
//查询最近扫描完成的装车单号
DdlPackBean recentlyOrderPackBean = DdlPackBean.getDdlPackBean(shippingOrderManagement.getOrganizeCode());
private MesShippingOrderManagement getLastShippingOrder(String organizeCode) {
DdlPackBean recentlyOrderPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.SHIPPING_ORDER_STATUS.SHIPPED.getValue(), "status", recentlyOrderPackBean);
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{"modifyDatetime"}, recentlyOrderPackBean);
MesShippingOrderManagement recentlyVehiclesOrder = shippingOrderManagementRepository.getByProperty(recentlyOrderPackBean);
model.setDetailList(detailList);
model.setShippingCode(orderManagement.getShippingCode());
if (!StringUtils.isEmpty(recentlyVehiclesOrder)) {
model.setRecentlyScanShippingCode(recentlyVehiclesOrder.getShippingCode());
}
return model;
}
@Override
public MesSortShippingCheckModel saveSn(MesSortShippingCheckModel model, String organizeCode, String userInfo) {
//校验发运单是否存在
MesShippingOrderManagement orderManagement = checkMesShippingOrderManagement(model, organizeCode);
//零件发运组
MesPartShippingGroup shippingGroup = getMesPartShippingGroup(organizeCode, orderManagement.getShippingGroupCode());
//根据条码找到对应的物料号若物料号一致则修改扫描flg将flg改为true.
//根据扫描的发运单以及前端传的发运单明细,进行匹配,若没有找到扫描的发运单,则提示扫描的发运单号不在此装车单中,请检查数据!。
//1 跳过
if(!Objects.isNull(model.getIsPass()) && Objects.equals(MesPcnExtConstWords.ONE,model.getIsPass())){
Optional<MesShippingOrderManagementDetail> shippingOrderManagementDetailOptional = model.getDetailList().stream().filter(t -> !Objects.equals(t.getIsScanFlg(), MesCommonConstant.TRUE_INTEGER)).findFirst();
if(shippingOrderManagementDetailOptional.isPresent()){
MesShippingOrderManagementDetail mesShippingOrderManagementDetail = shippingOrderManagementDetailOptional.get();
MesProduceSn produceSn = new MesProduceSn();
produceSn.setProductSn(model.getSn());
updateOrderManagementDetails(userInfo, produceSn, orderManagement, mesShippingOrderManagementDetail,MesExtEnumUtil.SHIPPING_ORDER_DETAIL_SHIPPING_STATUS.SKIP.getValue(),MesPcnExtConstWords.SHIP_PASS);
}else{
throw new ImppBusiException(String.format("【%s】明细已全部扫描完成请检查数据", orderManagement.getShippingCode()));
}
}else{
//校验条码
MesProduceSn produceSn = checkSn(model, organizeCode);
boolean scanFlg = false;
for (MesShippingOrderManagementDetail detail : model.getDetailList()) {
if (detail.getPartNo().equals(produceSn.getPartNo()) && StringUtils.isEmpty(detail.getBarcode()) && !Objects.equals(detail.getIsScanFlg(), MesCommonConstant.TRUE_INTEGER)) {
//校验发运单明细顺序
if(!StringUtils.isEmpty(shippingGroup.getIsEnableShippingFailSafe()) && CommonEnumUtil.VALID == shippingGroup.getIsEnableShippingFailSafe()){
Optional<MesShippingOrderManagementDetail> first = model.getDetailList().stream().filter(k -> k.getCustInfoSeq().compareTo(detail.getCustInfoSeq()) < 0 && !Objects.equals(k.getIsScanFlg(), MesCommonConstant.TRUE_INTEGER)).findFirst();
if(first.isPresent()){
throw new ImppBusiException(String.format("发运单【%s】启用明细顺序防错序号【%s】前还有未扫描的发运单明细请检查数据", orderManagement.getShippingCode(), detail.getCustInfoSeq()));
}
return shippingOrderManagementRepository.getByProperty(recentlyOrderPackBean);
}
//判断是否需要排序校验 默认排序则需要校验
if (!StringUtils.isEmpty(orderManagement.getScanSeqWay()) && orderManagement.getScanSeqWay() == MesExtEnumUtil.SHIPPING_GROUP_SCAN_CONFIRM_SEQ_MODE.DEFAULT_SORT.getValue()) {
//获取明细中最小的
Optional<String> minPartNO = model.getDetailList().stream().filter(k -> StringUtils.isEmpty(k.getBarcode()))
.min(Comparator.comparingLong(k -> k.getCustInfoSeq())).map(k -> k.getPartNo());
//若扫描的不是最小顺序 则报错
if (minPartNO.isPresent() && !minPartNO.get().equals(produceSn.getPartNo())) {
throw new ImppBusiException(String.format("【%s】此条码扫描顺序错误请检查数据", model.getSn()));
}
}
//校验客户零件信息是否存在
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(detail.getPartNo(), "erpPartNo", packBean);
DdlPreparedPack.getStringEqualPack(detail.getCustPartNo(), "custPartNo", packBean);
if(!mesCustomerPartRepository.isExitByHql(packBean)){
throw new ImppBusiException(String.format("零件号【%s】客户零件号【%s】关系不存在请检查数据", detail.getPartNo(),detail.getCustPartNo()));
}
scanFlg = true;
updateOrderManagementDetails(userInfo, produceSn, orderManagement, detail,MesExtEnumUtil.SHIPPING_ORDER_DETAIL_SHIPPING_STATUS.SHIPPINGED.getValue(),"扫描完成");
break;
}
}
if (!scanFlg) {
throw new ImppBusiException(String.format("【%s】此条码对应的【%s】物料号与发运单中物料号不匹配请检查数据", model.getSn(), produceSn.getPartNo()));
}
}
Long count = model.getDetailList().stream().filter(k -> Objects.equals(k.getIsScanFlg(), MesCommonConstant.TRUE_INTEGER)).count();
model.setIsScanCount(count.intValue());
//当前发运单全部扫描完成 并且不需要扫位置码
if (count.intValue() == model.getDetailList().size() && StringUtils.isEmpty(orderManagement.getCheckSeqCode())) {
//保存数据库
saveDate(orderManagement, model, organizeCode, userInfo);
}
return model;
}
private void updateOrderManagementDetails(String userInfo, MesProduceSn produceSn, MesShippingOrderManagement orderManagement, MesShippingOrderManagementDetail detail,Integer status,String remark) {
if(MesExtEnumUtil.SHIPPING_ORDER_DETAIL_SHIPPING_STATUS.SHIPPINGED.getValue() == status){
detail.setBarcode(produceSn.getProductSn());
}
if (StringUtils.isEmpty(orderManagement.getCheckSeqCode())) {
private void updateOrderManagementDetails(String userInfo, MesShippingOrderManagement orderManagement, MesShippingOrderManagementDetail detail) {
detail.setIsScanFlg(MesCommonConstant.TRUE_INTEGER);
detail.setStatus(status);
detail.setRemark(remark);
detail.setStatus(MesExtEnumUtil.SHIPPING_ORDER_DETAIL_SHIPPING_STATUS.SKIP.getValue());
detail.setRemark(MesPcnExtConstWords.SHIP_PASS);
//根据是否启动记忆判断 若启用记忆,则根据保存数据库
if (!StringUtils.isEmpty(orderManagement.getIsEnableMemory()) && Objects.equals(orderManagement.getIsEnableMemory(), MesCommonConstant.TRUE_INTEGER)) {
//若发运单状态为创建或发布 则写入开始扫描时间
if (!StringUtils.isEmpty(orderManagement.getStatus()) && (orderManagement.getStatus() == MesExtEnumUtil.SHIPPING_ORDER_STATUS.CREATE.getValue() ||
orderManagement.getStatus() == MesExtEnumUtil.SHIPPING_ORDER_STATUS.PUBLISHED.getValue())) {
orderManagement.setStartScanTime(TimeTool.getNowTime(true));
}
//发运单状态
orderManagement.setStatus(MesExtEnumUtil.SHIPPING_ORDER_STATUS.SHIPPING.getValue());
orderManagement.setSystemSyncStatus(CommonEnumUtil.FALSE);
ConvertBean.serviceModelUpdate(orderManagement, userInfo);
update(orderManagement);
//发运单明细
detail.setActualQty(1);
detail.setSystemSyncStatus(CommonEnumUtil.FALSE);
ConvertBean.serviceModelUpdate(detail, userInfo);
updateDetail(detail);
//内部条码更新条码状态
if (!Objects.isNull(produceSn.getId())) {
produceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.SHIPPED.getValue());
produceSn.setSystemSyncStatus(CommonEnumUtil.FALSE);
ConvertBean.serviceModelUpdate(detail, userInfo);
produceSnExtService.update(produceSn);
}
}
}
}
@Override
public MesSortShippingCheckModel saveSnAndLocationCode(MesSortShippingCheckModel model, String organizeCode, String userInfo) {
//校验条码
MesProduceSn produceSn = checkMesProduceSn(model, organizeCode);
//校验发运单是否存在
MesShippingOrderManagement orderManagement = checkMesShippingOrderManagement(model, organizeCode);
//根据条码找到对应的物料号若物料号一致则修改扫描flg将flg改为true.
boolean scanFlg = false;
for (MesShippingOrderManagementDetail detail : model.getDetailList()) {
if (detail.getPartNo().equals(produceSn.getPartNo())) {
scanFlg = true;
detail.setIsScanFlg(MesCommonConstant.TRUE_INTEGER);
detail.setBarcode(produceSn.getSerialNumber());
break;
}
}
if (!scanFlg) {
throw new ImppBusiException(String.format("【%s】此条码对应的【%s】物料号与发运单中物料号不匹配请检查数据", model.getSn(), produceSn.getPartNo()));
}
Long count = model.getDetailList().stream().filter(k -> k.getIsScanFlg() == MesCommonConstant.TRUE_INTEGER).count();
//当前发运单全部扫描完成
if (count.intValue() == model.getDetailList().size()) {
//保存数据库
saveDate(orderManagement, model, organizeCode, userInfo);
private MesSortShippingCheckModel skipShippingDetails(MesSortShippingCheckModel model, String userInfo, MesShippingOrderManagement orderManagement) {
Optional<MesShippingOrderManagementDetail> shippingOrderManagementDetailOptional = model.getDetailList().stream().filter(t -> !Objects.equals(t.getIsScanFlg(), MesCommonConstant.TRUE_INTEGER)).findFirst();
if(!shippingOrderManagementDetailOptional.isPresent()){
throw new ImppBusiException(String.format("【%s】明细已全部扫描完成请检查数据", orderManagement.getShippingCode()));
}
//更新明细
updateOrderManagementDetails(userInfo, orderManagement, shippingOrderManagementDetailOptional.get());
return model;
}
@Override
public MesShippingOrderManagement queryShippingOrderNoByAutoPushOrder(String shippingGroupNo, String org) {
//查询最近扫描完成的装车单号
DdlPackBean orderPackBean = DdlPackBean.getDdlPackBean(org);
DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.SHIPPING_ORDER_STATUS.PUBLISHED.getValue(), "status", orderPackBean);
// DdlPreparedPack.getStringEqualPack(shippingGroupNo, "shippingGroupCode", orderPackBean);
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{"seq"}, orderPackBean);
MesShippingOrderManagement orderManagement = shippingOrderManagementRepository.getByProperty(orderPackBean);
return orderManagement;
}
private MesPartShippingGroup getMesPartShippingGroup(String org, String partShippingGroupCode) {
MesPartShippingGroup shippingGroup = mesPartShippingGroupService.getMesPartShippingGroup(org, partShippingGroupCode);
if(Objects.isNull(shippingGroup)){
throw new ImppBusiException(String.format("零件发运组【%s】信息不存在请检查数据", partShippingGroupCode));
}
return shippingGroup;
}
private MesProduceSn checkSn(MesSortShippingCheckModel model, String org) {
//校验条码是否重复扫描
Optional<MesShippingOrderManagementDetail> optional = model.getDetailList().stream().filter(k -> !StringUtils.isEmpty(k.getBarcode()) && k.getBarcode().equals(model.getSn())).findFirst();
if (optional.isPresent()) {
throw new ImppBusiException(String.format("【%s】此条码已经扫描过请检查数据", model.getSn()));
}
DdlPackBean packBean = DdlPackBean.getDdlPackBean(org);
DdlPreparedPack.getStringEqualPack(model.getSn(), "productSn", packBean);
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{"createDatetime"}, packBean);
MesProduceSn produceSn = produceSnRepository.getByProperty(packBean);
if (!StringUtils.isEmpty(produceSn)) {
//校验状态
checkStatus(model, produceSn);
}else{
//外部条码解析
MesShippingOrderManagementDetail mesShippingOrderManagementDetail = getMesShippingOrderManagementDetail(model, org);
//封装信息
produceSn = new MesProduceSn();
produceSn.setSerialNumber(model.getSn());
produceSn.setProductSn(model.getSn());
produceSn.setPartNo(mesShippingOrderManagementDetail.getPartNo());
}
return produceSn;
}
private MesShippingOrderManagementDetail getMesShippingOrderManagementDetail(MesSortShippingCheckModel model, String org) {
//外部解析条码长度卡控
String cfgValue = mesConfigService.getCfgValue(org, MesPcnExtConstWords.MAX_SHIPPING_BARCODE_LENGTH);
if(Integer.parseInt(cfgValue) < model.getSn().length()) MesPcnException.throwMesBusiException("【%s】此条码长度超过【%s】位请检查数据", model.getSn(),cfgValue);
List<MesShippingOrderManagementDetail> detailList = model.getDetailList().stream().filter(k -> !StringUtils.isEmpty(k.getCustPartNo()) && model.getSn().startsWith(k.getCustPartNo()) && StringUtils.isEmpty(k.getBarcode()) && !Objects.equals(k.getIsScanFlg(), MesCommonConstant.TRUE_INTEGER)).collect(Collectors.toList());
MesShippingOrderManagementDetail mesShippingOrderManagementDetail = null;
for (MesShippingOrderManagementDetail managementDetail : detailList) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(org);
DdlPreparedPack.getStringEqualPack(managementDetail.getPartNo(), "erpPartNo", packBean);
DdlPreparedPack.getStringEqualPack(managementDetail.getCustPartNo(), "custPartNo", packBean);
if(mesCustomerPartRepository.isExitByHql(packBean)){
mesShippingOrderManagementDetail = managementDetail;
break;
}
}
if(Objects.isNull(mesShippingOrderManagementDetail)){
throw new ImppBusiException(String.format("【%s】此条码未匹配到数据请检查数据", model.getSn()));
}
return mesShippingOrderManagementDetail;
}
private MesProduceSn checkMesProduceSn(MesSortShippingCheckModel model, String org) {
//校验条码是否已经扫描
@ -470,9 +374,9 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
}
}
private MesShippingOrderManagement checkMesShippingOrderManagement(MesSortShippingCheckModel model, String org) {
private MesShippingOrderManagement checkMesShippingOrderManagement(MesSortShippingCheckModel model) {
//校验发运单是否存在
DdlPackBean orderManagementPackBean = DdlPackBean.getDdlPackBean(org);
DdlPackBean orderManagementPackBean = DdlPackBean.getDdlPackBean(model.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(model.getShippingCode(), "shippingCode", orderManagementPackBean);
MesShippingOrderManagement orderManagement = shippingOrderManagementRepository.getByProperty(orderManagementPackBean);
if (StringUtils.isEmpty(orderManagement)) {
@ -513,6 +417,7 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
Map<Long, List<MesShippingOrderManagementDetail>> custInfoSeqMap = detailList.stream().collect(Collectors.groupingBy(MesShippingOrderManagementDetail::getCustInfoSeq));
List<MesProduceSn> produceSnList = new ArrayList<>();
List<MesWorkOrder> mesWorkOrderList = new ArrayList<>();
for (MesShippingOrderManagementDetail detail : orderManagementDetailList) {
//根据扫描的条码查询条码是否存在
packBean = DdlPackBean.getDdlPackBean(organizeCode);
@ -538,13 +443,27 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
ConvertBean.serviceModelUpdate(produceSn, userInfo);
produceSnList.add(produceSn);
}
//更新工单
if(!StringUtils.isEmpty(detail.getVisualOrderNo())){
MesWorkOrder workOrder = mesWorkOrderExtService.getWorkOrder(organizeCode, detail.getVisualOrderNo());
if(!Objects.isNull(workOrder)){
workOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.SHIPPING.getValue());
produceSn.setSystemSyncStatus(CommonEnumUtil.FALSE);
ConvertBean.serviceModelUpdate(workOrder, userInfo);
mesWorkOrderList.add(workOrder);
}
}
}
}
//更新条码
if(!CollectionUtils.isEmpty(produceSnList)){
produceSnRepository.saveAll(produceSnList);
}
//更新工单
if(!CollectionUtils.isEmpty(mesWorkOrderList)){
mesWorkOrderExtService.saveAll(mesWorkOrderList);
}
//更新发运单
ConvertBean.serviceModelUpdate(orderManagement,userInfo);
update(orderManagement);
@ -559,6 +478,8 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
vehiclesOrderDetailRepository.save(vehiclesOrderDetail);
}
if(StringUtils.isEmpty(orderManagement.getOrderCode()) || StringUtils.isEmpty(orderManagement.getLoadingListId())){
//发送数据给辊道线
sendShippingFinishedCmd(model, organizeCode);
//保存当前发运单明细报工
jisShippingRepository.saveAll(getMesJisShippings(orderManagement,userInfo));
}else{
@ -596,6 +517,39 @@ public class MesSortShippingCheckService implements IMesSortShippingCheckService
}
private void sendShippingFinishedCmd(MesSortShippingCheckModel model, String organizeCode) {
if (!Objects.isNull(model.getMesPartShippingGroup()) && !StringUtil.isEmpty(model.getMesPartShippingGroup().getEquipmentCode())) {
//辊道设备配置
MesBallTrackRule rule = getMesBallTrackRule(model, organizeCode);
//设备变量
MesEquipmentVariable mesEquipmentVariable = mesEquipmentExtService.getMesEquipmentVariable(organizeCode, rule.getEquipmentCode(), rule.getEquipVariableId());
if (Objects.isNull(mesEquipmentVariable)) {
MesPcnException.throwMesBusiException("设备【%s】设备变量ID【%s】信息不存在请检查", rule.getEquipmentCode(), rule.getEquipVariableId());
}
//设备通道
MesEquipmentChannel mesEquipmentChannel = mesEquipmentExtService.getMesEquipmentChannel(organizeCode, rule.getEquipmentCode(), mesEquipmentVariable.getChannel());
if (Objects.isNull(mesEquipmentChannel)) {
MesPcnException.throwMesBusiException("设备【%s】设备通道【%s】信息不存在请检查", rule.getEquipmentCode(), mesEquipmentVariable.getChannel());
}
//写入
MesEquipVariableRwResult equipVariableRwResult = equipVariableRwExtService.writeVariable(rule.getEquipVariableValue(), mesEquipmentVariable, mesEquipmentChannel.getKepwareFlag());
if (!equipVariableRwResult.getIsSuccessed()) {
MesPcnException.throwMesBusiException(String.format("设备【%s】:发运成功指令发送失败!原因:%s", mesEquipmentChannel.getEquipmentName(), JSONObject.toJSONString(equipVariableRwResult)));
}
}
}
private MesBallTrackRule getMesBallTrackRule(MesSortShippingCheckModel model, String organizeCode) {
DdlPackBean bean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(model.getMesPartShippingGroup().getEquipmentCode(), "equipmentCode", bean);
DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.BALL_TRACK_TYPE.BALL_TRACK_TYPE_30.getValue(), "ballTrackType", bean);
MesBallTrackRule rule = mesBallTrackRuleRepository.getByProperty(bean);
if (Objects.isNull(rule) || Objects.isNull(rule.getEquipVariableId())) {
MesPcnException.throwMesBusiException("设备【%s】辊道设备配置信息不存在请检查", model.getMesPartShippingGroup().getEquipmentCode());
}
return rule;
}
public List<MesJisShipping> getMesJisShippings(MesShippingOrderManagement mesShippingOrderManagement,String userName) {
DdlPackBean detailPackBean = DdlPackBean.getDdlPackBean(mesShippingOrderManagement.getOrganizeCode());
DdlPreparedPack.getNumEqualPack(mesShippingOrderManagement.getId(), "pid", detailPackBean);

@ -116,6 +116,11 @@ public class MesWorkOrderExtService implements IMesWorkOrderExtService {
}
@Override
public void saveAll(List<MesWorkOrder> mesWorkOrderList) {
workOrderRepository.saveAll(mesWorkOrderList);
}
@Override
public List<MesWorkOrder> getWorkOrderListByShiftCode(String organizeCode, String workCenterCode, String shiftCode) {
String currentTime = DateUtil.formatDateTime(new Date());
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);

@ -0,0 +1,19 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.shippingscan;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesSortShippingCheckModel;
import cn.estsh.i3plus.pojo.mes.bean.MesPartShippingGroup;
import cn.estsh.i3plus.pojo.mes.bean.shipping.MesShippingOrderManagement;
import io.swagger.annotations.ApiOperation;
/**
* @Description :
* @Reference :
* @Author : junsheng.li
* @CreateDate 2024/9/25 10:49
* @Modify:
**/
public interface IMesShippingScanStrategyService {
@ApiOperation("扫描条码或目视单")
MesSortShippingCheckModel doScan(MesSortShippingCheckModel model, MesShippingOrderManagement orderManagement, MesPartShippingGroup shippingGroup);
}

@ -0,0 +1,267 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.shippingscan.strategy;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesConfigService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProduceSnExtService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderExtService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.aspect.MonitorLog;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.shippingscan.IMesShippingScanStrategyService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesSortShippingCheckModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.tool.TimeTool;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesPartShippingGroup;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder;
import cn.estsh.i3plus.pojo.mes.bean.shipping.MesShippingOrderManagement;
import cn.estsh.i3plus.pojo.mes.bean.shipping.MesShippingOrderManagementDetail;
import cn.estsh.i3plus.pojo.mes.repository.MesCustomerPartRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesProduceSnRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesShippingOrderManagementDetailRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesShippingOrderManagementRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
import groovy.util.logging.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
/**
* @Description :
* @Reference :
* @Author : junsheng.li
* @CreateDate 2024/9/25 10:54
* @Modify:
**/
@Service
@Slf4j
public class MesShippingScanSnAndOrderStrategyServiceImpl implements IMesShippingScanStrategyService {
@Autowired
private MesShippingOrderManagementRepository shippingOrderManagementRepository;
@Autowired
private MesShippingOrderManagementDetailRepository shippingOrderManagementDetailRepository;
@Autowired
private MesProduceSnRepository produceSnRepository;
@Autowired
private IMesProduceSnExtService produceSnExtService;
@Autowired
private MesCustomerPartRepository mesCustomerPartRepository;
@Autowired
private IMesConfigService mesConfigService;
@Autowired
private IMesWorkOrderExtService mesWorkOrderExtService;
@Override
public MesSortShippingCheckModel doScan(MesSortShippingCheckModel model, MesShippingOrderManagement orderManagement, MesPartShippingGroup shippingGroup) {
if (!Objects.isNull(model.getLastShippingDetailId())) {
//校验目视单是否已经扫描
if (model.getDetailList().stream().anyMatch(t -> !StringUtils.isEmpty(t.getVisualOrderNo()) && t.getVisualOrderNo().equals(model.getSn()))) {
throw new ImppBusiException(String.format("【%s】此目视单已经扫描过请检查数据", model.getSn()));
}
//更新单据信息
model.getDetailList().stream().filter(t -> t.getId().equals(model.getLastShippingDetailId())).forEach(detail -> {
detail.setVisualOrderNo(model.getSn());
updateOrderManagementDetails(orderManagement, detail, getWorkOrder(model, detail), model.getUserInfo());
});
model.setLastShippingDetailId(null);
} else {
//校验条码
MesProduceSn produceSn = checkSn(model);
boolean scanFlg = false;
for (MesShippingOrderManagementDetail detail : model.getDetailList()) {
if (detail.getPartNo().equals(produceSn.getPartNo()) && StringUtils.isEmpty(detail.getBarcode()) && !Objects.equals(detail.getIsScanFlg(), MesCommonConstant.TRUE_INTEGER)) {
//校验发运明细
checkShippingDetails(model, orderManagement, shippingGroup, produceSn, detail);
detail.setBarcode(model.getSn());
//校验通过的明细ID
model.setLastShippingDetailId(detail.getId());
scanFlg = true;
break;
}
}
if (!scanFlg) {
throw new ImppBusiException(String.format("【%s】此条码对应的【%s】物料号与发运单中物料号不匹配请检查数据", model.getSn(), produceSn.getPartNo()));
}
}
return model;
}
private MesWorkOrder getWorkOrder(MesSortShippingCheckModel model, MesShippingOrderManagementDetail detail) {
MesWorkOrder workOrder = mesWorkOrderExtService.getWorkOrder(model.getOrganizeCode(), model.getSn());
if (Objects.isNull(workOrder)) {
throw new ImppBusiException(String.format("目视单【%s】不存在请检查数据", model.getSn()));
}
//校验目视单状态
if (MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue() != workOrder.getWorkOrderStatus() || MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue() != workOrder.getQcStatus()) {
throw new ImppBusiException(String.format("目视单【%s】状态为【%s】质量状态为【%s】不允许发运", model.getSn(), MesExtEnumUtil.ORDER_STATUS.valueOfDescription(workOrder.getWorkOrderStatus()), MesExtEnumUtil.PRODUCE_QC_STATUS.valueOfDescription(workOrder.getQcStatus())));
}
//校验条码是否匹配
if (!Objects.equals(detail.getBarcode(), workOrder.getSn())) {
throw new ImppBusiException(String.format("目视单【%s】条码【%s】与扫描条码【%s】不匹配", model.getSn(), workOrder.getSn(), detail.getBarcode()));
}
//校验零件是否匹配
if (!Objects.equals(detail.getPartNo(), workOrder.getPartNo())) {
throw new ImppBusiException(String.format("目视单【%s】零件【%s】与发运单零件【%s】不匹配", model.getSn(), workOrder.getPartNo(), detail.getPartNo()));
}
return workOrder;
}
private void checkShippingDetails(MesSortShippingCheckModel model, MesShippingOrderManagement orderManagement, MesPartShippingGroup shippingGroup, MesProduceSn produceSn, MesShippingOrderManagementDetail detail) {
//校验发运单明细顺序
if (!Objects.isNull(shippingGroup) && !StringUtils.isEmpty(shippingGroup.getIsEnableShippingFailSafe()) && CommonEnumUtil.VALID == shippingGroup.getIsEnableShippingFailSafe()) {
Optional<MesShippingOrderManagementDetail> first = model.getDetailList().stream().filter(k -> k.getCustInfoSeq().compareTo(detail.getCustInfoSeq()) < 0 && !Objects.equals(k.getIsScanFlg(), MesCommonConstant.TRUE_INTEGER)).findFirst();
if (first.isPresent()) {
throw new ImppBusiException(String.format("发运单【%s】启用明细顺序防错序号【%s】前还有未扫描的发运单明细请检查数据", orderManagement.getShippingCode(), detail.getCustInfoSeq()));
}
}
//判断是否需要排序校验 默认排序则需要校验
if (!StringUtils.isEmpty(orderManagement.getScanSeqWay()) && orderManagement.getScanSeqWay() == MesExtEnumUtil.SHIPPING_GROUP_SCAN_CONFIRM_SEQ_MODE.DEFAULT_SORT.getValue()) {
//获取明细中最小的
Optional<String> minPartNo = model.getDetailList().stream().filter(k -> StringUtils.isEmpty(k.getBarcode()))
.min(Comparator.comparingLong(MesShippingOrderManagementDetail::getCustInfoSeq)).map(MesShippingOrderManagementDetail::getPartNo);
//若扫描的不是最小顺序 则报错
if (minPartNo.isPresent() && !minPartNo.get().equals(produceSn.getPartNo())) {
throw new ImppBusiException(String.format("【%s】此条码扫描顺序错误请检查数据", model.getSn()));
}
}
//校验客户零件信息是否存在
DdlPackBean packBean = DdlPackBean.getDdlPackBean(model.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(detail.getPartNo(), "erpPartNo", packBean);
DdlPreparedPack.getStringEqualPack(detail.getCustPartNo(), "custPartNo", packBean);
if (!mesCustomerPartRepository.isExitByHql(packBean)) {
throw new ImppBusiException(String.format("零件号【%s】客户零件号【%s】关系不存在请检查数据", detail.getPartNo(), detail.getCustPartNo()));
}
}
private MesProduceSn checkSn(MesSortShippingCheckModel model) {
//校验条码是否重复扫描
Optional<MesShippingOrderManagementDetail> optional = model.getDetailList().stream().filter(k -> !StringUtils.isEmpty(k.getBarcode()) && k.getBarcode().equals(model.getSn())).findFirst();
if (optional.isPresent()) {
throw new ImppBusiException(String.format("【%s】此条码已经扫描过请检查数据", model.getSn()));
}
MesProduceSn produceSn = getMesProduceSn(model.getOrganizeCode(), model.getSn());
if (!StringUtils.isEmpty(produceSn)) {
//校验状态
checkStatus(model, produceSn);
} else {
//外部条码解析
MesShippingOrderManagementDetail mesShippingOrderManagementDetail = getMesShippingOrderManagementDetail(model);
//封装信息
produceSn = new MesProduceSn();
produceSn.setSerialNumber(model.getSn());
produceSn.setProductSn(model.getSn());
produceSn.setPartNo(mesShippingOrderManagementDetail.getPartNo());
}
return produceSn;
}
private MesProduceSn getMesProduceSn(String organizeCode, String productSn) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(productSn, "custSn", packBean);
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{"createDatetime"}, packBean);
return produceSnRepository.getByProperty(packBean);
}
private void checkStatus(MesSortShippingCheckModel model, MesProduceSn produceSn) {
//校验产品条码状态 必须是状态为已下线条码
if (produceSn.getSnStatus() != MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue() && produceSn.getSnStatus() != MesExtEnumUtil.PRODUCE_SN_STATUS.CREATE.getValue()) {
throw new ImppBusiException(String.format("【%s】此条码状态为【%s】,请选择状态为【%s】或【%s】状态的条码", model.getSn(), MesExtEnumUtil.PRODUCE_SN_STATUS.valueOfDescription(produceSn.getSnStatus()),
MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getDescription(), MesExtEnumUtil.PRODUCE_SN_STATUS.CREATE.getDescription()));
}
//校验产品质量状态 必须是状态为合格条码
if (produceSn.getQcStatus() != MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue()) {
throw new ImppBusiException(String.format("【%s】此条码质量状态为【%s】,请选择【%s】状态的条码", model.getSn(), MesExtEnumUtil.PRODUCE_QC_STATUS.valueOfDescription(produceSn.getQcStatus()),
MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getDescription()));
}
}
private MesShippingOrderManagementDetail getMesShippingOrderManagementDetail(MesSortShippingCheckModel model) {
//外部解析条码长度卡控
String cfgValue = mesConfigService.getCfgValue(model.getOrganizeCode(), MesPcnExtConstWords.MAX_SHIPPING_BARCODE_LENGTH);
if (Integer.parseInt(cfgValue) < model.getSn().length())
MesPcnException.throwMesBusiException("【%s】此条码长度超过【%s】位请检查数据", model.getSn(), cfgValue);
List<MesShippingOrderManagementDetail> detailList = model.getDetailList().stream().filter(k -> !StringUtils.isEmpty(k.getCustPartNo()) && model.getSn().startsWith(k.getCustPartNo()) && StringUtils.isEmpty(k.getBarcode()) && !Objects.equals(k.getIsScanFlg(), MesCommonConstant.TRUE_INTEGER)).collect(Collectors.toList());
MesShippingOrderManagementDetail mesShippingOrderManagementDetail = null;
for (MesShippingOrderManagementDetail managementDetail : detailList) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(model.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(managementDetail.getPartNo(), "erpPartNo", packBean);
DdlPreparedPack.getStringEqualPack(managementDetail.getCustPartNo(), "custPartNo", packBean);
if (mesCustomerPartRepository.isExitByHql(packBean)) {
mesShippingOrderManagementDetail = managementDetail;
break;
}
}
if (Objects.isNull(mesShippingOrderManagementDetail)) {
throw new ImppBusiException(String.format("【%s】此条码未匹配到数据请检查数据", model.getSn()));
}
return mesShippingOrderManagementDetail;
}
private void updateOrderManagementDetails(MesShippingOrderManagement orderManagement, MesShippingOrderManagementDetail detail, MesWorkOrder workOrder, String userInfo) {
if (StringUtils.isEmpty(orderManagement.getCheckSeqCode())) {
detail.setIsScanFlg(MesCommonConstant.TRUE_INTEGER);
detail.setStatus(MesExtEnumUtil.SHIPPING_ORDER_DETAIL_SHIPPING_STATUS.SHIPPINGED.getValue());
detail.setRemark("扫描完成");
//根据是否启动记忆判断 若启用记忆,则根据保存数据库
if (!StringUtils.isEmpty(orderManagement.getIsEnableMemory()) && Objects.equals(orderManagement.getIsEnableMemory(), MesCommonConstant.TRUE_INTEGER)) {
//若发运单状态为创建或发布 则写入开始扫描时间
if (!StringUtils.isEmpty(orderManagement.getStatus()) && (orderManagement.getStatus() == MesExtEnumUtil.SHIPPING_ORDER_STATUS.CREATE.getValue() ||
orderManagement.getStatus() == MesExtEnumUtil.SHIPPING_ORDER_STATUS.PUBLISHED.getValue())) {
orderManagement.setStartScanTime(TimeTool.getNowTime(true));
}
orderManagement.setStatus(MesExtEnumUtil.SHIPPING_ORDER_STATUS.SHIPPING.getValue());
orderManagement.setSystemSyncStatus(CommonEnumUtil.FALSE);
ConvertBean.serviceModelUpdate(orderManagement, userInfo);
update(orderManagement);
detail.setActualQty(1);
detail.setSystemSyncStatus(CommonEnumUtil.FALSE);
ConvertBean.serviceModelUpdate(detail, userInfo);
updateDetail(detail);
MesProduceSn produceSn = getMesProduceSn(orderManagement.getOrganizeCode(), detail.getBarcode());
//内部条码更新条码状态
if (!Objects.isNull(produceSn)) {
produceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.SHIPPED.getValue());
produceSn.setSystemSyncStatus(CommonEnumUtil.FALSE);
ConvertBean.serviceModelUpdate(produceSn, userInfo);
produceSnExtService.update(produceSn);
}
//更新工单状态为发运
workOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.SHIPPING.getValue());
ConvertBean.serviceModelUpdate(workOrder, userInfo);
mesWorkOrderExtService.update(workOrder);
}
}
}
@MonitorLog
public void update(MesShippingOrderManagement item) {
shippingOrderManagementRepository.update(item);
}
@MonitorLog
public void updateDetail(MesShippingOrderManagementDetail item) {
shippingOrderManagementDetailRepository.update(item);
}
}

@ -0,0 +1,217 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.shippingscan.strategy;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesConfigService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProduceSnExtService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.aspect.MonitorLog;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.shippingscan.IMesShippingScanStrategyService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesSortShippingCheckModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.tool.TimeTool;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesPartShippingGroup;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.bean.shipping.MesShippingOrderManagement;
import cn.estsh.i3plus.pojo.mes.bean.shipping.MesShippingOrderManagementDetail;
import cn.estsh.i3plus.pojo.mes.repository.MesCustomerPartRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesProduceSnRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesShippingOrderManagementDetailRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesShippingOrderManagementRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
import groovy.util.logging.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
/**
* @Description :
* @Reference :
* @Author : junsheng.li
* @CreateDate 2024/9/25 10:54
* @Modify:
**/
@Service
@Slf4j
public class MesShippingScanSnStrategyServiceImpl implements IMesShippingScanStrategyService {
@Autowired
private MesShippingOrderManagementRepository shippingOrderManagementRepository;
@Autowired
private MesShippingOrderManagementDetailRepository shippingOrderManagementDetailRepository;
@Autowired
private MesProduceSnRepository produceSnRepository;
@Autowired
private IMesProduceSnExtService produceSnExtService;
@Autowired
private MesCustomerPartRepository mesCustomerPartRepository;
@Autowired
private IMesConfigService mesConfigService;
@Override
public MesSortShippingCheckModel doScan(MesSortShippingCheckModel model, MesShippingOrderManagement orderManagement, MesPartShippingGroup shippingGroup) {
//校验条码
MesProduceSn produceSn = checkSn(model);
boolean scanFlg = false;
for (MesShippingOrderManagementDetail detail : model.getDetailList()) {
if (detail.getPartNo().equals(produceSn.getPartNo()) && StringUtils.isEmpty(detail.getBarcode()) && !Objects.equals(detail.getIsScanFlg(), MesCommonConstant.TRUE_INTEGER)) {
//校验发运明细
checkShippingDetails(model, orderManagement, shippingGroup, produceSn, detail);
scanFlg = true;
//明细更新
updateOrderManagementDetails(produceSn, orderManagement, detail, model.getUserInfo());
break;
}
}
if (!scanFlg) {
throw new ImppBusiException(String.format("【%s】此条码对应的【%s】物料号与发运单中物料号不匹配请检查数据", model.getSn(), produceSn.getPartNo()));
}
return model;
}
private void checkShippingDetails(MesSortShippingCheckModel model, MesShippingOrderManagement orderManagement, MesPartShippingGroup shippingGroup, MesProduceSn produceSn, MesShippingOrderManagementDetail detail) {
//校验发运单明细顺序
if (!Objects.isNull(shippingGroup) && !StringUtils.isEmpty(shippingGroup.getIsEnableShippingFailSafe()) && CommonEnumUtil.VALID == shippingGroup.getIsEnableShippingFailSafe()) {
Optional<MesShippingOrderManagementDetail> first = model.getDetailList().stream().filter(k -> k.getCustInfoSeq().compareTo(detail.getCustInfoSeq()) < 0 && !Objects.equals(k.getIsScanFlg(), MesCommonConstant.TRUE_INTEGER)).findFirst();
if (first.isPresent()) {
throw new ImppBusiException(String.format("发运单【%s】启用明细顺序防错序号【%s】前还有未扫描的发运单明细请检查数据", orderManagement.getShippingCode(), detail.getCustInfoSeq()));
}
}
//判断是否需要排序校验 默认排序则需要校验
if (!StringUtils.isEmpty(orderManagement.getScanSeqWay()) && orderManagement.getScanSeqWay() == MesExtEnumUtil.SHIPPING_GROUP_SCAN_CONFIRM_SEQ_MODE.DEFAULT_SORT.getValue()) {
//获取明细中最小的
Optional<String> minPartNo = model.getDetailList().stream().filter(k -> StringUtils.isEmpty(k.getBarcode()))
.min(Comparator.comparingLong(MesShippingOrderManagementDetail::getCustInfoSeq)).map(MesShippingOrderManagementDetail::getPartNo);
//若扫描的不是最小顺序 则报错
if (minPartNo.isPresent() && !minPartNo.get().equals(produceSn.getPartNo())) {
throw new ImppBusiException(String.format("【%s】此条码扫描顺序错误请检查数据", model.getSn()));
}
}
//校验客户零件信息是否存在
DdlPackBean packBean = DdlPackBean.getDdlPackBean(model.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(detail.getPartNo(), "erpPartNo", packBean);
DdlPreparedPack.getStringEqualPack(detail.getCustPartNo(), "custPartNo", packBean);
if (!mesCustomerPartRepository.isExitByHql(packBean)) {
throw new ImppBusiException(String.format("零件号【%s】客户零件号【%s】关系不存在请检查数据", detail.getPartNo(), detail.getCustPartNo()));
}
}
private MesProduceSn checkSn(MesSortShippingCheckModel model) {
//校验条码是否重复扫描
Optional<MesShippingOrderManagementDetail> optional = model.getDetailList().stream().filter(k -> !StringUtils.isEmpty(k.getBarcode()) && k.getBarcode().equals(model.getSn())).findFirst();
if (optional.isPresent()) {
throw new ImppBusiException(String.format("【%s】此条码已经扫描过请检查数据", model.getSn()));
}
DdlPackBean packBean = DdlPackBean.getDdlPackBean(model.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(model.getSn(), "productSn", packBean);
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{"createDatetime"}, packBean);
MesProduceSn produceSn = produceSnRepository.getByProperty(packBean);
if (!StringUtils.isEmpty(produceSn)) {
//校验状态
checkStatus(model, produceSn);
} else {
//外部条码解析
MesShippingOrderManagementDetail mesShippingOrderManagementDetail = getMesShippingOrderManagementDetail(model);
//封装信息
produceSn = new MesProduceSn();
produceSn.setSerialNumber(model.getSn());
produceSn.setProductSn(model.getSn());
produceSn.setPartNo(mesShippingOrderManagementDetail.getPartNo());
}
return produceSn;
}
private void checkStatus(MesSortShippingCheckModel model, MesProduceSn produceSn) {
//校验产品条码状态 必须是状态为已下线条码
if (produceSn.getSnStatus() != MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue() && produceSn.getSnStatus() != MesExtEnumUtil.PRODUCE_SN_STATUS.CREATE.getValue()) {
throw new ImppBusiException(String.format("【%s】此条码状态为【%s】,请选择状态为【%s】或【%s】状态的条码", model.getSn(), MesExtEnumUtil.PRODUCE_SN_STATUS.valueOfDescription(produceSn.getSnStatus()),
MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getDescription(), MesExtEnumUtil.PRODUCE_SN_STATUS.CREATE.getDescription()));
}
//校验产品质量状态 必须是状态为合格条码
if (produceSn.getQcStatus() != MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue()) {
throw new ImppBusiException(String.format("【%s】此条码质量状态为【%s】,请选择【%s】状态的条码", model.getSn(), MesExtEnumUtil.PRODUCE_QC_STATUS.valueOfDescription(produceSn.getQcStatus()),
MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getDescription()));
}
}
private MesShippingOrderManagementDetail getMesShippingOrderManagementDetail(MesSortShippingCheckModel model) {
//外部解析条码长度卡控
String cfgValue = mesConfigService.getCfgValue(model.getOrganizeCode(), MesPcnExtConstWords.MAX_SHIPPING_BARCODE_LENGTH);
if (Integer.parseInt(cfgValue) < model.getSn().length())
MesPcnException.throwMesBusiException("【%s】此条码长度超过【%s】位请检查数据", model.getSn(), cfgValue);
List<MesShippingOrderManagementDetail> detailList = model.getDetailList().stream().filter(k -> !StringUtils.isEmpty(k.getCustPartNo()) && model.getSn().startsWith(k.getCustPartNo()) && StringUtils.isEmpty(k.getBarcode()) && !Objects.equals(k.getIsScanFlg(), MesCommonConstant.TRUE_INTEGER)).collect(Collectors.toList());
MesShippingOrderManagementDetail mesShippingOrderManagementDetail = null;
for (MesShippingOrderManagementDetail managementDetail : detailList) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(model.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(managementDetail.getPartNo(), "erpPartNo", packBean);
DdlPreparedPack.getStringEqualPack(managementDetail.getCustPartNo(), "custPartNo", packBean);
if (mesCustomerPartRepository.isExitByHql(packBean)) {
mesShippingOrderManagementDetail = managementDetail;
break;
}
}
if (Objects.isNull(mesShippingOrderManagementDetail)) {
throw new ImppBusiException(String.format("【%s】此条码未匹配到数据请检查数据", model.getSn()));
}
return mesShippingOrderManagementDetail;
}
private void updateOrderManagementDetails(MesProduceSn produceSn, MesShippingOrderManagement orderManagement, MesShippingOrderManagementDetail detail, String userInfo) {
if (StringUtils.isEmpty(orderManagement.getCheckSeqCode())) {
detail.setBarcode(produceSn.getProductSn());
detail.setIsScanFlg(MesCommonConstant.TRUE_INTEGER);
detail.setStatus(MesExtEnumUtil.SHIPPING_ORDER_DETAIL_SHIPPING_STATUS.SHIPPINGED.getValue());
detail.setRemark("扫描完成");
//根据是否启动记忆判断 若启用记忆,则根据保存数据库
if (!StringUtils.isEmpty(orderManagement.getIsEnableMemory()) && Objects.equals(orderManagement.getIsEnableMemory(), MesCommonConstant.TRUE_INTEGER)) {
//若发运单状态为创建或发布 则写入开始扫描时间
if (!StringUtils.isEmpty(orderManagement.getStatus()) && (orderManagement.getStatus() == MesExtEnumUtil.SHIPPING_ORDER_STATUS.CREATE.getValue() ||
orderManagement.getStatus() == MesExtEnumUtil.SHIPPING_ORDER_STATUS.PUBLISHED.getValue())) {
orderManagement.setStartScanTime(TimeTool.getNowTime(true));
}
orderManagement.setStatus(MesExtEnumUtil.SHIPPING_ORDER_STATUS.SHIPPING.getValue());
orderManagement.setSystemSyncStatus(CommonEnumUtil.FALSE);
ConvertBean.serviceModelUpdate(orderManagement, userInfo);
update(orderManagement);
detail.setActualQty(1);
detail.setSystemSyncStatus(CommonEnumUtil.FALSE);
ConvertBean.serviceModelUpdate(detail, userInfo);
updateDetail(detail);
//内部条码更新条码状态
if (!Objects.isNull(produceSn.getId())) {
produceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.SHIPPED.getValue());
produceSn.setSystemSyncStatus(CommonEnumUtil.FALSE);
ConvertBean.serviceModelUpdate(produceSn, userInfo);
produceSnExtService.update(produceSn);
}
}
}
}
@MonitorLog
public void update(MesShippingOrderManagement item) {
shippingOrderManagementRepository.update(item);
}
@MonitorLog
public void updateDetail(MesShippingOrderManagementDetail item) {
shippingOrderManagementDetailRepository.update(item);
}
}

@ -0,0 +1,45 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.station;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseModuleService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IModuleService;
import cn.estsh.i3plus.pojo.mes.bean.MesStateMachineStatus;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
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 java.util.List;
import java.util.Map;
/**
* @Description :
* @Author :wangjie
**/
@Slf4j
@Service("mesProductionModuleService")
public class MesProductionModuleService extends BaseModuleService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Override
public void init(StationRequestBean reqBean) {
//排序线 装配件匹配工步
if (MesExtEnumUtil.WORK_CENTER_TYPE.SORT.getValue() == productionProcessContextStepService.getCenterType(reqBean)) ((IModuleService) SpringContextsUtil.getBean("mesProductionSortModuleService")).init(reqBean);
//非排序线 装配件匹配工步
else ((IModuleService) SpringContextsUtil.getBean("mesProductionNoSortModuleService")).init(reqBean);
}
@Override
public boolean execStateModule(StationRequestBean reqBean, List<MesStateMachineStatus> states, Map<String, String> wcpcMap) {
init(reqBean);
return true;
}
}

@ -0,0 +1,136 @@
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.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.IMesWorkOrderExtService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProdShiftContext;
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.serviceimpl.fsm.BaseModuleService;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IStepService;
import cn.estsh.i3plus.mes.pcn.util.StationKvBeanUtil;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesProdShiftRecord;
import cn.estsh.i3plus.pojo.mes.bean.MesStateMachineStatus;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell;
import cn.estsh.i3plus.pojo.mes.model.StationKvBean;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.repository.MesFileRepository;
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.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @Description :
* @Author :wangjie
**/
@Slf4j
@Service("mesProductionSortModuleService")
public class MesProductionSortModuleService extends BaseModuleService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private IMesProductionCustomContextStepService productionCustomContextStepService;
@Autowired
private IMesProdShiftRecordService mesProdShiftRecordService;
@Autowired
private IMesWorkOrderExtService workOrderExtService;
@Autowired
private MesFileRepository mesFileRepository;
@Override
public void init(StationRequestBean reqBean) {
// 获取工单信息
List<List<StationKvBean>> moduleContentContext = productionDispatchContextStepService.getModuleContentContext(reqBean);
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getEquipmentVariableList(reqBean, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getValue());
MesWorkCell mesWorkCell = productionProcessContext.getWorkCell();
//获取班次信息,先查询缓存,缓存没有在查询数据库
List<StationKvBean> prodShiftDataContext = getShiftRecordStationKvBeans(reqBean);
MesProdShiftContext mesProdShiftKvBean = productionCustomContextStepService.getMesProdShiftKvBean(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode());
if (CollectionUtils.isEmpty(prodShiftDataContext)) {
this.sendMessage(reqBean, new StationResultBean().writeDbLog(), "请先开班", MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
MesPcnException.throwBusiException("请先开班");
}
// 发送班次班组和工单
StationResultBean resultBean = getStationResultBean(reqBean, moduleContentContext, prodShiftDataContext);
this.sendMessage(reqBean, resultBean);
//TODO 右侧排序表格数据
//验证工位是否锁定
reqBean.getDataMap().put(MesPcnEnumUtil.ACTOR_RECEIVE_STRATEGY.WS_CMD_INIT_MODULE.getCode(), CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr());
((IStepService) SpringContextsUtil.getBean("mesCountDownShowStepService")).executeInState(reqBean);
//设备BYPASS监控
//((IStepService) SpringContextsUtil.getBean("mesEquipByPassReadStepService")).executeInState(reqBean);
}
private List<StationKvBean> getShiftRecordStationKvBeans(StationRequestBean reqBean) {
// 获取班次信息 redis
List<StationKvBean> prodShiftDataContext = productionCustomContextStepService.getProdShiftDataContext(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode());
if (CollectionUtils.isEmpty(prodShiftDataContext)) {
MesProdShiftRecord shiftRecord = new MesProdShiftRecord();
shiftRecord.setWorkCenterCode(reqBean.getWorkCenterCode());
shiftRecord.setWorkStatus(MesExtEnumUtil.WORK_STATUS.START.getValue());
// 查询数据库
MesProdShiftRecord prodShiftRecord = mesProdShiftRecordService.queryMesProdShiftRecord(shiftRecord);
if (prodShiftRecord != null) {
prodShiftDataContext = getProdShiftData(prodShiftRecord);
productionCustomContextStepService.dispatchProdShiftDataContext(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(),prodShiftDataContext);
}
}
return prodShiftDataContext;
}
private StationResultBean getStationResultBean(StationRequestBean reqBean, List<List<StationKvBean>> moduleContentContext, List<StationKvBean> prodShiftDataContext) {
StationResultBean resultBean = new StationResultBean();
resultBean.setBusiType(MesPcnEnumUtil.STATION_BUSI_TYPE.MODULE_CONTENT.getValue());
resultBean.setDataType(MesPcnEnumUtil.STATION_DATA_TYPE.CUSTOM.getValue());
resultBean.setCustomPageName(MesPcnExtConstWords.CUSTOM_PAGE_NAME_DEFAULT);
resultBean.setSpecialDisplayData(getStepColIndent(reqBean));
resultBean.setResultObj(prodShiftDataContext);
resultBean.setResultList(moduleContentContext);
return resultBean;
}
//封装展示组件班组班次内容
private List<StationKvBean> getProdShiftData(MesProdShiftRecord record) {
return StationKvBeanUtil.addStationKvBeanList(new ArrayList<>(),
new StationKvBean(MesPcnExtConstWords.SHIFT_GROUP, "班组", record.getShiftGroup()),
new StationKvBean(MesPcnExtConstWords.SHIFT_GROUP_NAME, "班组名称", record.getShiftGroupName()),
new StationKvBean(MesPcnExtConstWords.SHIFT_CODE, "班次", record.getShiftCode()),
new StationKvBean(MesPcnExtConstWords.SHIFT_NAME, "班次名称", record.getShiftName()));
}
}

@ -1,171 +0,0 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProduceSnExtService;
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.pojo.context.*;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesProductionAssembly;
import cn.estsh.i3plus.pojo.mes.bean.MesProductionAssemblyUnique;
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.repository.MesProductionAssemblyRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesProductionAssemblyUniqueRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;
/**
* @Description :
* @Author : wangjie
**/
@Slf4j
@Service("mesAssemblySaveNosortStepService")
public class MesAssemblySaveNosortStepService extends BaseStepService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private IMesProductionCustomContextStepService productionCustomContextStepService;
@Autowired
private MesProductionAssemblyRepository productionAssemblyRepository;
@Autowired
private MesProductionAssemblyUniqueRepository productionAssemblyUniqueRepository;
@Autowired
private IMesProduceSnExtService produceSnExtService;
@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<MesProdRuleContext> prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(reqBean);
if (CollectionUtils.isEmpty(prodRuleContextList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在非排序加工规则数据,请重置工序!");
//获取上下文产出条码数据信息集合
List<MesProductionPsOutContext> productionPsOutContextList = productionDispatchContextStepService.getProductionPsOutContext(reqBean);
if (CollectionUtils.isEmpty(productionPsOutContextList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在产出零件条码信息,请重置工序解决!");
//从上下文中取出工位当前要使用的设备
MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip();
Map<Integer, MesProductionPsOutContext> ppMap = CollectionUtils.isEmpty(productionPsOutContextList) ? null : productionPsOutContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getForeignKey()))).collect(Collectors.toMap(MesProductionPsOutContext::getForeignKey, o -> o));
List<Long> productSnId = new ArrayList<>();
//保存装配记录
prodRuleContextList.stream().filter(o -> null != o).forEach(o -> saveProductionAssemblyData(reqBean, resultBean, stepResult, productSnId, productionProcessContext, o, ppMap, cellEquipContext));
if (!CollectionUtils.isEmpty(productSnId)) produceSnExtService.saveProduceSnList(reqBean, MesExtEnumUtil.PRODUCE_SN_STATUS.ASSEMBLY.getValue(), productSnId);
return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), stepResult, "保存装配记录成功!");
}
private void saveProductionAssemblyData(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, List<Long> productSnId,
MesProductionProcessContext productionProcessContext, MesProdRuleContext prodRuleContext, Map<Integer, MesProductionPsOutContext> ppMap, MesCellEquipContext cellEquipContext) {
if (StringUtils.isEmpty(prodRuleContext.getAssemblyDataJson())) return;
List<MesProductionAssemblyNosortContext> productionAssemblyNosortContextList = prodRuleContext.getNosortAssemblyDataContext();
MesProductionPsOutContext productionPsOutContext = CollectionUtils.isEmpty(ppMap) ? null : ppMap.get(prodRuleContext.getForeignKey());
for (MesProductionAssemblyNosortContext productionAssemblyNosortContext : productionAssemblyNosortContextList) {
if (null == productionAssemblyNosortContext) continue;
MesProductionAssembly productionAssembly = new MesProductionAssembly();
BeanUtils.copyProperties(productionAssemblyNosortContext, productionAssembly);
productionAssembly.setDataSource(MesExtEnumUtil.PRODUCTION_ASSEMBLY_DATA_SOURCE.NOSORT.getValue());
productionAssembly.setIsOrigSn(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue());
productionAssembly.setAreaCode(reqBean.getWorkCenterCode());
productionAssembly.setWorkCenterCode(reqBean.getWorkCenterCode());
productionAssembly.setWorkCellCode(reqBean.getWorkCellCode());
productionAssembly.setProcessCode(reqBean.getProcessCode());
productionAssembly.setProcessName(productionProcessContext.getProcessName());
productionAssembly.setCraftCode(productionProcessContext.getCraftCode());
productionAssembly.setCraftName(productionProcessContext.getCraftName());
productionAssembly.setEquipmentCode(cellEquipContext.getEquipmentCode());
productionAssembly.setProductionRecordId(prodRuleContext.getProductionRecordId());
productionAssembly.setMouldNo(prodRuleContext.getMouldNo());
if (null != productionPsOutContext) {
productionAssembly.setPartNo(productionPsOutContext.getPartNo());
productionAssembly.setPartName(productionPsOutContext.getPartName());
productionAssembly.setSerialNumber(productionPsOutContext.getSerialNumber());
productionAssembly.setProductSn(productionPsOutContext.getProductSn());
productionAssembly.setCustSn(productionPsOutContext.getCustSn());
}
MesScanMonitorContext scanMonitorContext = productionProcessContextStepService.dispatchScanMonitorContext(reqBean, true);
if (null != scanMonitorContext) productionAssembly.setMouldRecordId(scanMonitorContext.getMouldRecordId());
productionAssembly.setOrganizeCode(reqBean.getOrganizeCode());
ConvertBean.serviceModelInitialize(productionAssembly, reqBean.getUserInfo());
productionAssembly.setFid(UUID.randomUUID().toString());
productionAssembly = productionAssemblyRepository.insert(productionAssembly);
if (productionAssemblyNosortContext.getMatchType().compareTo(MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_30.getValue()) == 0) saveProductionAssemblyUnique(productionAssembly);
if (!StringUtils.isEmpty(productionAssemblyNosortContext.getProductSnId())) productSnId.add(productionAssemblyNosortContext.getProductSnId());
if (productionAssemblyNosortContext.getIsRepeat().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0 && productionAssemblyNosortContext.getIsRepeat2Cache().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0)
productionCustomContextStepService.dispatchRepeatAssemblySn(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), productionAssemblyNosortContext);
}
}
private void saveProductionAssemblyUnique(MesProductionAssembly productionAssembly) {
MesProductionAssemblyUnique productionAssemblyUnique = new MesProductionAssemblyUnique();
BeanUtils.copyProperties(productionAssembly, productionAssemblyUnique, MesPcnExtConstWords.ID);
productionAssemblyUnique.setPid(productionAssembly.getId());
productionAssemblyUniqueRepository.insert(productionAssemblyUnique);
}
}

@ -1,15 +1,38 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProduceSnExtService;
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.pojo.context.*;
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.platform.common.convert.ConvertBean;
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.MesProductionAssembly;
import cn.estsh.i3plus.pojo.mes.bean.MesProductionAssemblyUnique;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter;
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.repository.MesProductionAssemblyRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesProductionAssemblyUniqueRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesWorkOrderAssemblyRepository;
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.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;
/**
* @Description :
@ -22,15 +45,143 @@ public class MesAssemblySaveStepService extends BaseStepService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private IMesProductionCustomContextStepService productionCustomContextStepService;
@Autowired
private MesProductionAssemblyRepository productionAssemblyRepository;
@Autowired
private MesWorkOrderAssemblyRepository workOrderAssemblyRepository;
@Autowired
private MesProductionAssemblyUniqueRepository productionAssemblyUniqueRepository;
@Autowired
private IMesProduceSnExtService produceSnExtService;
@Override
public StepResult execute(StationRequestBean reqBean) {
//排序线 保存装配记录工步
if (MesExtEnumUtil.WORK_CENTER_TYPE.SORT.getValue() == productionProcessContextStepService.getCenterType(reqBean)) return ((IStepService) SpringContextsUtil.getBean("mesAssemblySaveSortStepService")).executeInState(reqBean);
StationResultBean resultBean = new StationResultBean();
StepResult stepResult = StepResult.getSuccessComplete();
//非排序线 保存装配记录工步
return ((IStepService) SpringContextsUtil.getBean("mesAssemblySaveNosortStepService")).executeInState(reqBean);
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean);
//配置错误 抛出异常
if (!productionProcessContext.getSuccess()) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
//存储生产过程上下文对象
productionProcessContextStepService.dispatchProductionProcessContext(reqBean, productionProcessContext);
//获取上下文产品加工规则数据信息集合
List<MesProdRuleContext> prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(reqBean);
if (CollectionUtils.isEmpty(prodRuleContextList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在非排序加工规则数据,请重置工序!");
//获取上下文产出条码数据信息集合
List<MesProductionPsOutContext> productionPsOutContextList = productionDispatchContextStepService.getProductionPsOutContext(reqBean);
if (CollectionUtils.isEmpty(productionPsOutContextList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在产出零件条码信息,请重置工序解决!");
//从上下文中取出工位当前要使用的设备
MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip();
MesWorkCenter workCenter = productionProcessContext.getWorkCenter();
Map<Integer, MesProductionPsOutContext> ppMap = CollectionUtils.isEmpty(productionPsOutContextList) ? null : productionPsOutContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getForeignKey()))).collect(Collectors.toMap(MesProductionPsOutContext::getForeignKey, o -> o));
List<Long> productSnIdList = new ArrayList<>();
//保存装配记录
prodRuleContextList.stream().filter(o -> null != o).forEach(o -> saveProductionAssemblyData(reqBean, resultBean, stepResult, productSnIdList, productionProcessContext, o, ppMap, cellEquipContext, workCenter));
if (!CollectionUtils.isEmpty(productSnIdList)) produceSnExtService.saveProduceSnList(reqBean, MesExtEnumUtil.PRODUCE_SN_STATUS.ASSEMBLY.getValue(), productSnIdList);
return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), stepResult, "保存装配记录成功!");
}
private void saveProductionAssemblyData(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, List<Long> productSnIdList, MesProductionProcessContext productionProcessContext,
MesProdRuleContext prodRuleContext, Map<Integer, MesProductionPsOutContext> ppMap, MesCellEquipContext cellEquipContext, MesWorkCenter workCenter) {
if (StringUtils.isEmpty(prodRuleContext.getAssemblyDataJson())) return;
List<MesProductionAssemblyContext> productionAssemblyContextList = prodRuleContext.getAssemblyDataContext(workCenter);
MesProductionPsOutContext productionPsOutContext = CollectionUtils.isEmpty(ppMap) ? null : ppMap.get(prodRuleContext.getForeignKey());
for (MesProductionAssemblyContext productionAssemblyContext : productionAssemblyContextList) {
if (null == productionAssemblyContext) continue;
MesProductionAssembly productionAssembly = new MesProductionAssembly();
BeanUtils.copyProperties(productionAssemblyContext, productionAssembly);
productionAssembly.setDataSource(MesExtEnumUtil.PRODUCTION_ASSEMBLY_DATA_SOURCE.NOSORT.getValue());
productionAssembly.setIsOrigSn(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue());
productionAssembly.setAreaCode(reqBean.getWorkCenterCode());
productionAssembly.setWorkCenterCode(reqBean.getWorkCenterCode());
productionAssembly.setWorkCellCode(reqBean.getWorkCellCode());
productionAssembly.setProcessCode(reqBean.getProcessCode());
productionAssembly.setProcessName(productionProcessContext.getProcessName());
productionAssembly.setCraftCode(productionProcessContext.getCraftCode());
productionAssembly.setCraftName(productionProcessContext.getCraftName());
productionAssembly.setEquipmentCode(cellEquipContext.getEquipmentCode());
productionAssembly.setProductionRecordId(prodRuleContext.getProductionRecordId());
productionAssembly.setMouldNo(prodRuleContext.getMouldNo());
if (null != productionPsOutContext) {
productionAssembly.setPartNo(productionPsOutContext.getPartNo());
productionAssembly.setPartName(productionPsOutContext.getPartName());
productionAssembly.setSerialNumber(productionPsOutContext.getSerialNumber());
productionAssembly.setProductSn(productionPsOutContext.getProductSn());
productionAssembly.setCustSn(productionPsOutContext.getCustSn());
}
MesScanMonitorContext scanMonitorContext = productionProcessContextStepService.dispatchScanMonitorContext(reqBean, true);
if (null != scanMonitorContext) productionAssembly.setMouldRecordId(scanMonitorContext.getMouldRecordId());
productionAssembly.setOrganizeCode(reqBean.getOrganizeCode());
ConvertBean.serviceModelInitialize(productionAssembly, reqBean.getUserInfo());
productionAssembly.setFid(UUID.randomUUID().toString());
productionAssembly = productionAssemblyRepository.insert(productionAssembly);
if (productionAssemblyContext.getMatchType().compareTo(MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_30.getValue()) == 0) saveProductionAssemblyUnique(productionAssembly);
if (!StringUtils.isEmpty(productionAssemblyContext.getProductSnId())) productSnIdList.add(productionAssemblyContext.getProductSnId());
if (productionAssemblyContext.getIsRepeat().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0 && productionAssemblyContext.getIsRepeat2Cache().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0)
productionCustomContextStepService.dispatchRepeatAssemblySn(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), productionAssemblyContext);
if (workCenter.getCenterType().compareTo(MesExtEnumUtil.WORK_CENTER_TYPE.SORT.getValue()) == 0) saveWorkOrderAssembly(reqBean, productionAssemblyContext);
}
}
private void saveProductionAssemblyUnique(MesProductionAssembly productionAssembly) {
MesProductionAssemblyUnique productionAssemblyUnique = new MesProductionAssemblyUnique();
BeanUtils.copyProperties(productionAssembly, productionAssemblyUnique, MesPcnExtConstWords.ID);
productionAssemblyUnique.setPid(productionAssembly.getId());
productionAssemblyUniqueRepository.insert(productionAssemblyUnique);
}
private void saveWorkOrderAssembly(StationRequestBean reqBean, MesProductionAssemblyContext productionAssemblyContext) {
workOrderAssemblyRepository.updateByProperties(
new String[]{MesPcnExtConstWords.ID},
new Object[]{productionAssemblyContext.getSourceId()},
new String[]{MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.SYSTEM_SYNC_STATUS, MesPcnExtConstWords.ASSEMBLY_STATUS},
new Object[]{reqBean.getUserInfo(), TimeTool.getNowTime(true), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), productionAssemblyContext.getAssemblyStatus()});
}
}

@ -77,12 +77,15 @@ public class MesAssemblyShowSortStepService extends BaseStepService {
//获取上下文进料零件条码信息集合
List<MesProductionPsInContext> productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean);
//获取上下文产出零件条码信息集合
List<MesProductionPsOutContext> productionPsOutContextList = productionDispatchContextStepService.getProductionPsOutContext(reqBean);
//根据现有数据【产出零件数据】【进料零件条码信息】比对上下文中已经存在的加工规则数据信息集合, 没有加工规则的数据进行查询
if (CollectionUtils.isEmpty(prodRuleContextList)) prodRuleContextList = new ArrayList<>();
Integer initSize = prodRuleContextList.size();
//封装排序加工规则
doHandleProdRuleData(reqBean, resultBean, productionProcessContext, cellEquipContext, prodRuleContextList, productionPartContextList, productionPsInContextList);
doHandleProdRuleData(reqBean, resultBean, productionProcessContext, cellEquipContext, prodRuleContextList, productionPartContextList, productionPsInContextList, productionPsOutContextList);
if (prodRuleContextList.size() != initSize) {
//保存上下文产品加工规则信息集合
@ -91,6 +94,8 @@ public class MesAssemblyShowSortStepService extends BaseStepService {
if (!CollectionUtils.isEmpty(productionPartContextList)) productionDispatchContextStepService.dispatchProductionPartContext(reqBean, productionPartContextList);
//保存进料主条码数据
if (!CollectionUtils.isEmpty(productionPsInContextList)) productionDispatchContextStepService.dispatchProductionPsInContext(reqBean, productionPsInContextList);
//保存进料主条码数据
if (!CollectionUtils.isEmpty(productionPsOutContextList)) productionDispatchContextStepService.dispatchProductionPsInContext(reqBean, productionPsInContextList);
}
//显示装配件信息
@ -129,7 +134,8 @@ public class MesAssemblyShowSortStepService extends BaseStepService {
//查询排序线加工规则装配件数据信息
private void doHandleProdRuleData(StationRequestBean reqBean, StationResultBean resultBean, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext,
List<MesProdRuleContext> prodRuleContextList, List<MesProductionPartContext> productionPartContextList, List<MesProductionPsInContext> productionPsInContextList) {
List<MesProdRuleContext> prodRuleContextList, List<MesProductionPartContext> productionPartContextList,
List<MesProductionPsInContext> productionPsInContextList, List<MesProductionPsOutContext> productionPsOutContextList) {
//上下文中不存在进料主条码数据信息
if (CollectionUtils.isEmpty(productionPsInContextList) || CollectionUtils.isEmpty(productionPartContextList))
@ -146,6 +152,7 @@ public class MesAssemblyShowSortStepService extends BaseStepService {
//【排序线】获取产品加工规则(条码对应的装配件绑定记录,目前条码等同工单)
productionPartContextList.stream().filter(o -> (null != o && o.getWorkOrderNo().equals(productionPsInContext.getWorkOrderNo()))).findFirst().get().foreignKey(productionPsInContext.foreignKey(foreignKey += 1).getForeignKey());
productionPsOutContextList.stream().filter(o -> (null != o && o.getWorkOrderNo().equals(productionPsInContext.getWorkOrderNo()))).findFirst().get().foreignKey(productionPsInContext.getForeignKey());
prodRuleContextList.add(getProdRuleSortContext(reqBean, productionProcessContext, cellEquipContext, productionPsInContext));
@ -200,8 +207,6 @@ public class MesAssemblyShowSortStepService extends BaseStepService {
return assemblyShowContextList;
}
//封装装配件信息
private MesAssemblyShowContext assemblyShowContext(MesProductionAssemblyContext o) {
MesAssemblyShowContext assemblyShowContext = new MesAssemblyShowContext();

@ -80,7 +80,7 @@ public class MesCustomDialogStepService extends BaseStepService {
if (!scdBean.getIsAsyn()) stepSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), "弹框会话开启!");
//弹框业务异步处理
return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, true, MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, "弹框会话开启!");
return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, true, MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, "弹框会话异步开启!");
}

@ -147,7 +147,7 @@ public class MesProductSnGenerateStepService extends BaseStepService {
//产出零件数据信息
MesProductionPartContext productionPartContext = !CollectionUtils.isEmpty(ppMap) ? ppMap.get(prodRuleContext.getForeignKey()) : null;
//料零件条码
//料零件条码
MesProductionPsInContext productionPsInContext = !CollectionUtils.isEmpty(psMap) ? psMap.get(prodRuleContext.getForeignKey()) : null;
//零件信息
MesPart part = partMap.get(prodRuleContext.getOutPartNo());

@ -10,9 +10,12 @@ 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.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesPart;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
@ -89,7 +92,10 @@ public class MesProductSnSaveStepService extends BaseStepService {
String productResult = productionDispatchContextStepService.getProductResultContext(reqBean);
Map<String, MesPart> partMap = (Map<String, MesPart>) stepResult.getObj();
productionPsOutContextList.stream().filter(o -> null != o).forEach(o -> o.copy(saveProduceSnData(reqBean, resultBean, stepResult, productionProcessContext, o, partMap, prodShiftContext, productResult)));
MesWorkCenter workCenter = productionProcessContext.getWorkCenter();
MesWorkCell workCell = productionProcessContext.getWorkCell();
productionPsOutContextList.stream().filter(o -> null != o).forEach(o -> o.copy(saveProduceSnData(reqBean, resultBean, productionProcessContext, o, partMap, prodShiftContext, productResult, workCenter, workCell)));
//保存上下文产出条码数据信息集合
productionDispatchContextStepService.dispatchProductionPsOutContext(reqBean, productionPsOutContextList);
@ -98,7 +104,8 @@ public class MesProductSnSaveStepService extends BaseStepService {
}
private MesProduceSn saveProduceSnData(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesProductionPsOutContext productionPsOutContext, Map<String, MesPart> partMap, MesProdShiftContext prodShiftContext, String productResult) {
private MesProduceSn saveProduceSnData(StationRequestBean reqBean, StationResultBean resultBean, MesProductionProcessContext productionProcessContext, MesProductionPsOutContext productionPsOutContext,
Map<String, MesPart> partMap, MesProdShiftContext prodShiftContext, String productResult, MesWorkCenter workCenter, MesWorkCell workCell) {
//根据零件条码ID查询零件条码信息
MesProduceSn produceSn = produceSnExtService.getProduceSn(reqBean.getOrganizeCode(), productionPsOutContext.getId());
@ -115,10 +122,7 @@ public class MesProductSnSaveStepService extends BaseStepService {
produceSn.setRouteCode(reqBean.getRouteCode());
produceSn.setProcessCode(reqBean.getProcessCode());
produceSn.setCraftCode(productionProcessContext.getCraftCode());
//TODO 获取下个工艺代码
//produceSn.setNextCraftCode();
produceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue());
produceSn.setQcStatus(!StringUtils.isEmpty(productResult) ? Integer.valueOf(productResult) : MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue());
produceSn.setShiftCode(prodShiftContext.getShiftCode());
@ -129,8 +133,17 @@ public class MesProductSnSaveStepService extends BaseStepService {
produceSn.setCustLabelTemplate(part.getCustLabelTemplate());
ConvertBean.serviceModelUpdate(produceSn, reqBean.getUserInfo());
produceSn.setOutWorkCenterTime(produceSn.getModifyDatetime());
produceSn.setLotNo(produceSn.getModifyDatetime().substring(0, 10));
if (StringUtils.isEmpty(produceSn.getInWorkCenterTime())) produceSn.setInWorkCenterTime(produceSn.getModifyDatetime());
//非排序 或者 排序的末道工位
if (workCenter.getCenterType().compareTo(MesExtEnumUtil.WORK_CENTER_TYPE.NOSORT.getValue()) == 0 ||
(!StringUtils.isEmpty(workCell.getIsEndWorkCell()) && workCell.getIsEndWorkCell().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0)) {
produceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue());
produceSn.setOutWorkCenterTime(produceSn.getModifyDatetime());
} else {
produceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.PROCESSING.getValue());
}
produceSnExtService.update(produceSn);

@ -1,46 +0,0 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
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.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import cn.estsh.impp.framework.boot.util.SpringContextsUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* @Description :
* @Author : wangjie
**/
@Slf4j
@Service("mesProductionDataSaveNosortStepService")
public class MesProductionDataSaveNosortStepService extends BaseStepService {
@Override
public StepResult execute(StationRequestBean reqBean) {
//保存开模记录工步
((IStepService) SpringContextsUtil.getBean("mesMouldRecordGenerateStepService")).executeInState(reqBean);
//保存零件条码信息工步
((IStepService) SpringContextsUtil.getBean("mesProductSnSaveStepService")).executeInState(reqBean);
//加工异常处理工步
((IStepService) SpringContextsUtil.getBean("mesProductResultErrorHandleStepService")).executeInState(reqBean);
//生成加工记录工步
((IStepService) SpringContextsUtil.getBean("mesProductionRecordGenerateStepService")).executeInState(reqBean);
//保存装配记录工步
((IStepService) SpringContextsUtil.getBean("mesAssemblySaveStepService")).executeInState(reqBean);
//保存工单信息工步
((IStepService) SpringContextsUtil.getBean("mesWorkOrderSaveStepService")).executeInState(reqBean);
return stepSuccessCompleteAndSendMsgReturn(reqBean, new StationResultBean().writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), "保存加工结果成功!");
}
}

@ -1,46 +0,0 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
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.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import cn.estsh.impp.framework.boot.util.SpringContextsUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* @Description :
* @Author : wangjie
**/
@Slf4j
@Service("mesProductionDataSaveSortStepService")
public class MesProductionDataSaveSortStepService extends BaseStepService {
@Override
public StepResult execute(StationRequestBean reqBean) {
//保存开模记录工步
((IStepService) SpringContextsUtil.getBean("mesMouldRecordGenerateStepService")).executeInState(reqBean);
//保存零件条码信息工步
((IStepService) SpringContextsUtil.getBean("mesProductSnSaveStepService")).executeInState(reqBean);
//加工异常处理工步
((IStepService) SpringContextsUtil.getBean("mesProductResultErrorHandleStepService")).executeInState(reqBean);
//生成加工记录工步
((IStepService) SpringContextsUtil.getBean("mesProductionRecordGenerateStepService")).executeInState(reqBean);
//保存装配记录工步
((IStepService) SpringContextsUtil.getBean("mesAssemblySaveStepService")).executeInState(reqBean);
//保存工单信息工步
((IStepService) SpringContextsUtil.getBean("mesWorkOrderSaveStepService")).executeInState(reqBean);
return stepSuccessCompleteAndSendMsgReturn(reqBean, new StationResultBean().writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), "保存加工结果成功!");
}
}

@ -3,7 +3,9 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService;
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.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;
@ -25,11 +27,31 @@ public class MesProductionDataSaveStepService extends BaseStepService {
@Override
public StepResult execute(StationRequestBean reqBean) {
//排序线 保存加工结果工步
if (MesExtEnumUtil.WORK_CENTER_TYPE.SORT.getValue() == productionProcessContextStepService.getCenterType(reqBean)) return ((IStepService) SpringContextsUtil.getBean("mesProductionDataSaveSortStepService")).executeInState(reqBean);
//是否排序线
Boolean isSort = MesExtEnumUtil.WORK_CENTER_TYPE.SORT.getValue() == productionProcessContextStepService.getCenterType(reqBean) ? true : false;
//非排序线 保存加工结果工步
return ((IStepService) SpringContextsUtil.getBean("mesProductionDataSaveNosortStepService")).executeInState(reqBean);
//保存开模记录工步
((IStepService) SpringContextsUtil.getBean("mesMouldRecordGenerateStepService")).executeInState(reqBean);
//保存零件条码信息工步
((IStepService) SpringContextsUtil.getBean("mesProductSnSaveStepService")).executeInState(reqBean);
//保存工位队列信息工步
if (isSort) ((IStepService) SpringContextsUtil.getBean("mesWorkOrderQueueSaveStepService")).executeInState(reqBean);
//加工异常处理工步
((IStepService) SpringContextsUtil.getBean("mesProductResultErrorHandleStepService")).executeInState(reqBean);
//生成加工记录工步
((IStepService) SpringContextsUtil.getBean("mesProductionRecordGenerateStepService")).executeInState(reqBean);
//保存装配记录工步
((IStepService) SpringContextsUtil.getBean("mesAssemblySaveStepService")).executeInState(reqBean);
//保存工单信息工步
((IStepService) SpringContextsUtil.getBean("mesWorkOrderSaveStepService")).executeInState(reqBean);
return stepSuccessCompleteAndSendMsgReturn(reqBean, new StationResultBean().writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), "保存加工结果成功!");
}

@ -11,6 +11,7 @@ import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesProductionRecord;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
@ -67,8 +68,6 @@ public class MesProductionRecordGenerateStepService extends BaseStepService {
//获取上下文信息
MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean);
MesWorkCell mesWorkCell = productionProcessContext.getWorkCell();
//配置错误 抛出异常
if (!productionProcessContext.getSuccess()) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage());
@ -98,14 +97,17 @@ public class MesProductionRecordGenerateStepService extends BaseStepService {
Map<Integer, MesProdRuleContext> prMap = CollectionUtils.isEmpty(prodRuleContextList) ? null : prodRuleContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getForeignKey()))).collect(Collectors.toMap(MesProdRuleContext::getForeignKey, o -> o));
MesWorkCenter workCenter = productionProcessContext.getWorkCenter();
MesWorkCell workCell = productionProcessContext.getWorkCell();
//生成加工记录
String mouldNo = null != equipVariableCollectContext ? equipVariableCollectContext.getEquipVariableValue() : null;
productionPsOutContextList.stream().filter(o -> null != o).forEach(o -> saveProductionRecordData(reqBean, mouldNo, prodRuleContextList, productionProcessContext, o, prMap, cellEquipContext, CollectionUtils.isEmpty(psiMap) ? null : psiMap.get(o.getForeignKey())));
productionPsOutContextList.stream().filter(o -> null != o).forEach(o -> saveProductionRecordData(reqBean, workCenter, mouldNo, prodRuleContextList, productionProcessContext, o, prMap, cellEquipContext, CollectionUtils.isEmpty(psiMap) ? null : psiMap.get(o.getForeignKey())));
//保存上下文产品加工规则信息集合
productionDispatchContextStepService.dispatchProdRuleDataContext(reqBean, prodRuleContextList);
if (Objects.equal(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), mesWorkCell.getIsCountFinish())) {
if (Objects.equal(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), workCell.getIsCountFinish())) {
// 保存班次加工数量上下文
Integer amount = productionCustomContextStepService.dispatchProductionStatisticsContext(reqBean, productionPsOutContextList.size());
this.sendMessage(reqBean, new StationResultBean().writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), String.format("生产线[%s]工位[%s]当前累加数[%s]已累计加工数[%s]", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), productionPsOutContextList.size(), amount), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT);
@ -115,7 +117,7 @@ public class MesProductionRecordGenerateStepService extends BaseStepService {
}
private void saveProductionRecordData(StationRequestBean reqBean, String mouldNo, List<MesProdRuleContext> prodRuleContextList, MesProductionProcessContext productionProcessContext,
private void saveProductionRecordData(StationRequestBean reqBean, MesWorkCenter workCenter, String mouldNo, List<MesProdRuleContext> prodRuleContextList, MesProductionProcessContext productionProcessContext,
MesProductionPsOutContext productionPsOutContext, Map<Integer, MesProdRuleContext> prMap, MesCellEquipContext cellEquipContext, MesProductionPsInContext productionPsInContext) {
MesProdRuleContext prodRuleContext = CollectionUtils.isEmpty(prMap) ? null : prMap.get(productionPsOutContext.getForeignKey());
@ -127,11 +129,17 @@ public class MesProductionRecordGenerateStepService extends BaseStepService {
productionRecord.setEquipmentCode(cellEquipContext.getEquipmentCode());
productionRecord.setEquipmentName(cellEquipContext.getEquipmentName());
if (workCenter.getCenterType().compareTo(MesExtEnumUtil.WORK_CENTER_TYPE.NOSORT.getValue()) == 0) {
productionRecord.setReportType((null != prodRuleContext && !StringUtils.isEmpty(prodRuleContext.getReportType())) ? prodRuleContext.getReportType() : MesExtEnumUtil.NOSORT_REPORT_TYPE.NO_REPORT.getValue());
if (productionRecord.getReportType().compareTo(MesExtEnumUtil.NOSORT_REPORT_TYPE.NO_REPORT.getValue()) != 0) productionRecord.setReportPartNo(productionPsOutContext.getPartNo());
productionRecord.setReportStatus(productionRecord.getReportType().compareTo(MesExtEnumUtil.NOSORT_REPORT_TYPE.NO_REPORT.getValue()) != 0 ? MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_10.getValue() : MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_30.getValue());
if (productionRecord.getReportStatus().compareTo(MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_10.getValue()) == 0 && isSamePart(productionPsInContext, productionPsOutContext) &&
checkPsIsReported(reqBean.getOrganizeCode(), productionPsOutContext.getProductSn(), productionPsOutContext.getPartNo())) productionRecord.setReportStatus(MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_30.getValue());
} else {
//排序的汇报基于工单装配件,加工记录默认不汇报
productionRecord.setReportType(MesExtEnumUtil.NOSORT_REPORT_TYPE.NO_REPORT.getValue());
productionRecord.setReportStatus(MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_30.getValue());
}
productionRecord.setModuleStatisticsStatus(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());

@ -108,8 +108,9 @@ 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).isCompleted()) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg());
equipVariableCollectContextList, productionPartContextList, productionPsInContextList, productionPsOutContextList).isCompleted()) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg());
//扫描场景下合并历史产出零件信息/产品条码信息
if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() == equipVariableCollectContextList.get(0).getMessageSource() &&
@ -131,6 +132,8 @@ public class MesWorkOrderCheckSortStepService extends MesWorkOrderCheckStepServi
productionDispatchContextStepService.dispatchProductionPartContext(reqBean, productionPartContextList);
//保存上下文产品条码信息
productionDispatchContextStepService.dispatchProductionPsInContext(reqBean, productionPsInContextList);
//保存上下文产出条码信息
productionDispatchContextStepService.dispatchProductionPsOutContext(reqBean, productionPsOutContextList);
//存储展示组件MODULE_CONTENT内容
productionDispatchContextStepService.dispatchModuleContentContext(reqBean, getModuleContextData(reqBean, productionPartContextList));
@ -171,8 +174,10 @@ public class MesWorkOrderCheckSortStepService extends MesWorkOrderCheckStepServi
}
//验证工单的有效性
private StepResult checkWorkOrderValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesWorkCenter workCenter,
List<MesEquipVariableCollectContext> equipVariableCollectContextList, List<MesProductionPartContext> productionPartContextList, List<MesProductionPsInContext> productionPsInContextList) {
private StepResult checkWorkOrderValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult,
MesProductionProcessContext productionProcessContext, MesWorkCenter workCenter,
List<MesEquipVariableCollectContext> equipVariableCollectContextList, List<MesProductionPartContext> productionPartContextList,
List<MesProductionPsInContext> productionPsInContextList, List<MesProductionPsOutContext> productionPsOutContextList) {
//搜集生产工单号
List<String> filterList = equipVariableCollectContextList.stream().filter(o -> (null != o)).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList());
@ -215,6 +220,9 @@ public class MesWorkOrderCheckSortStepService extends MesWorkOrderCheckStepServi
//封装产品条码
productionPsInContextList.add(new MesProductionPsInContext(productionProcessContext.getWorkCell(), produceSn).messageSource(equipVariableCollectContextList.get(0).getMessageSource()).relateId(queueOrder.getId()));
//封装产出条码
productionPsOutContextList.add(new MesProductionPsOutContext().copy(produceSn));
}
//封装空腔
@ -257,6 +265,8 @@ public class MesWorkOrderCheckSortStepService extends MesWorkOrderCheckStepServi
productionDispatchContextStepService.removeProductionPartContext(reqBean);
//删除上下文产品条码信息
productionDispatchContextStepService.removeProductionPsInContext(reqBean);
//删除上下文产出条码信息
productionDispatchContextStepService.removeProductionPsOutContext(reqBean);
return true;
}

@ -92,7 +92,7 @@ public class MesWorkOrderCutCheckStepService extends BaseStepService {
if (CollectionUtils.isEmpty(equipVariableCollectContextList)) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前缺失待验证的裁片工单信息!");
//清除本次已获取得到的裁片工单信息
//productionDispatchContextStepService.removeScanWorkOrderNoContext(reqBean);
productionDispatchContextStepService.removeScanWorkOrderNoContext(reqBean);
//从上下文中取出生产线对象
MesWorkCenter workCenter = productionProcessContext.getWorkCenter();
@ -147,9 +147,8 @@ public class MesWorkOrderCutCheckStepService extends BaseStepService {
//保存扫描的工单信息上下文
if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() == equipVariableCollectContextList.get(0).getMessageSource()) {
productionProcessContextStepService.dispatchFunctionChooseCavityOrderContext(reqBean, StationKvBeanUtil.addStationKvBeanList(new ArrayList<>(),
new StationKvBean(MesPcnExtConstWords.CAVITY, "腔数", String.valueOf(productionPartContextList.size())),
new StationKvBean(MesPcnExtConstWords.CAVITY, "腔数", String.valueOf(productionPartContextList.stream().collect(Collectors.groupingBy(MesProductionPartContext::getPartNo)).size())),
new StationKvBean(MesPcnExtConstWords.CELL_MESSAGE_SOURCE, "工位信息来源", MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ.getValueStr()),
new StationKvBean(MesPcnExtConstWords.CRAFT_JUMP_CODE, "是否已验证顺序防错", CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValueStr()),
new StationKvBean(MesPcnExtConstWords.WORK_ORDER_NO, "裁片工单", productionPartContextList.stream().filter(o -> null != o).map(MesProductionPartContext::getWorkOrderNo).collect(Collectors.joining(MesPcnExtConstWords.SEMICOLON)))));
}
@ -323,14 +322,17 @@ public class MesWorkOrderCutCheckStepService extends BaseStepService {
}
// 如果裁片工单明细 productSn存在值则表名已 经过上道工位
if (!StringUtils.isEmpty(mesWorkOrderCutDetailList.stream().findFirst().get().getProductSn())) {
List<MesProduceSn> produceSnList = produceSnExtService.getProduceSnList(reqBean.getOrganizeCode(), cutWorkOrderNo);
// 获取上道工艺生产的条码并封装到进料上下文中
if (!CollectionUtils.isEmpty(produceSnList))
produceSnList.stream().filter(o -> null != o).forEach(o -> {
productionPsInContextList.add(new MesProductionPsInContext(workCell, o).cutCode(cutScheme.getCutCode()));
productionPsOutContextList.add(new MesProductionPsOutContext().copy(o));
productionPsOutContextList.add(new MesProductionPsOutContext().copy(o).cutWorkOrderNo(cutWorkOrderNo));
});
}
return stepResult;

@ -27,6 +27,7 @@ import org.springframework.util.StringUtils;
import java.util.*;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
@ -84,7 +85,7 @@ public class MesWorkOrderCutMatchingProdRuleStepService extends BaseStepService
List<MesProductionPartContext> productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean);
//获取上下文进料零件条码信息集合
//List<MesProductionPsInContext> productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean);
List<MesProductionPsInContext> productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean);
//根据现有数据【产出零件数据】【进料零件条码信息】比对上下文中已经存在的加工规则数据信息集合, 没有加工规则的数据进行查询
if (CollectionUtils.isEmpty(prodRuleContextList)) prodRuleContextList = new ArrayList<>();
@ -92,7 +93,7 @@ public class MesWorkOrderCutMatchingProdRuleStepService extends BaseStepService
//封装非排序加工规则
if (!doHandleProdRuleData(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext,
prodRuleContextList, productionPartContextList).isCompleted()) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg());
prodRuleContextList, productionPartContextList, productionPsInContextList).isCompleted()) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg());
//匹配失败需要清除本次扫描/读取信息
//if (!stepResult.isCompleted() && doBusiCheckToDelete(reqBean, stepResult, productionPartContextList, productionPsInContextList))
@ -104,7 +105,9 @@ public class MesWorkOrderCutMatchingProdRuleStepService extends BaseStepService
//保存上下文产品加工规则信息集合
productionDispatchContextStepService.dispatchProdRuleDataContext(reqBean, prodRuleContextList);
//保存上下文产出零件信息
//if (!CollectionUtils.isEmpty(productionPartContextList)) productionDispatchContextStepService.dispatchProductionPartContext(reqBean, productionPartContextList);
if (!CollectionUtils.isEmpty(productionPartContextList)) productionDispatchContextStepService.dispatchProductionPartContext(reqBean, productionPartContextList);
//保存进料主条码数据
if (!CollectionUtils.isEmpty(productionPsInContextList)) productionDispatchContextStepService.dispatchProductionPsInContext(reqBean, productionPsInContextList);
}
return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), stepResult, "匹配完成!");
@ -113,11 +116,12 @@ public class MesWorkOrderCutMatchingProdRuleStepService extends BaseStepService
private StepResult doHandleProdRuleData(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult,
MesProductionProcessContext productionProcessContext,
MesCellEquipContext cellEquipContext, List<MesProdRuleContext> prodRuleContextList,
List<MesProductionPartContext> productionPartContextList) {
List<MesProductionPartContext> productionPartContextList,
List<MesProductionPsInContext> productionPsInContextList) {
//根据是否存在【产出零件数据】获取剩余待匹配的加工规则数据 (只能查询到一条,否则报错)
return doHandleProdRuleDataByProductionPart(reqBean, resultBean, stepResult, productionProcessContext,
cellEquipContext, prodRuleContextList, productionPartContextList);
cellEquipContext, prodRuleContextList, productionPartContextList, productionPsInContextList);
}
@ -127,7 +131,8 @@ public class MesWorkOrderCutMatchingProdRuleStepService extends BaseStepService
MesProductionProcessContext productionProcessContext,
MesCellEquipContext cellEquipContext,
List<MesProdRuleContext> prodRuleContextList,
List<MesProductionPartContext> productionPartContextList) {
List<MesProductionPartContext> productionPartContextList,
List<MesProductionPsInContext> productionPsInContextList) {
//加工规则的数据已与产出零件的数量一致
//if (!CollectionUtils.isEmpty(prodRuleContextList) && prodRuleContextList.size() == productionPartContextList.size()) return stepResult;
@ -149,9 +154,9 @@ public class MesWorkOrderCutMatchingProdRuleStepService extends BaseStepService
log.info("doHandleProdRuleDataByProductionPart --- outPartNoList:{}", foreignKey);
//没有【进料零件条码信息】信息, 根据进料[NULL]条件获取匹配当前产出零件的加工规则数据(只能查询到一条,否则报错)
//根据产出零件条件获取匹配当前产出零件的加工规则数据(只能查询到一条,否则报错)
return doHandleProdRuleDataByProductionPartAndEmptyProductSn(reqBean, resultBean, stepResult, productionProcessContext,
cellEquipContext, prodRuleContextList, productionPartContextList, outPartNoList, foreignKey);
cellEquipContext, prodRuleContextList, productionPartContextList, productionPsInContextList, outPartNoList, foreignKey);
//存在【产出零件数据】信息, 存在【进料零件条码信息】 获取匹配当前产出零件的加工规则数据 (只能查询到一条,否则报错)
//else return doHandleProdRuleDataByProductionPartAndProductSn(reqBean, resultBean, stepResult, workCenter, productionProcessContext, cellEquipContext, prodRuleContextList, productionPartContextList, productionPsInContextList, outPartNoList, foreignKey);
@ -159,7 +164,8 @@ public class MesWorkOrderCutMatchingProdRuleStepService extends BaseStepService
//没有【进料零件条码信息】信息, 根据进料[NULL]条件获取匹配当前产出零件的加工规则数据(只能查询到一条,否则报错)
private StepResult doHandleProdRuleDataByProductionPartAndEmptyProductSn(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext,
MesCellEquipContext cellEquipContext, List<MesProdRuleContext> prodRuleContextList, List<MesProductionPartContext> productionPartContextList, List<String> outPartNoList, Integer foreignKey) {
MesCellEquipContext cellEquipContext, List<MesProdRuleContext> prodRuleContextList, List<MesProductionPartContext> productionPartContextList,
List<MesProductionPsInContext> productionPsInContextList, List<String> outPartNoList, Integer foreignKey) {
//【非排序线】获取产品加工规则 ; 条件进料[NULL]
List<MesProdRuleNosortCfg> prodRuleNosortCfgList = prodRuleCfgExtService.getProdRuleNosortCfgList(new MesProdRuleContext(reqBean.getOrganizeCode()).equipmentCode(cellEquipContext.getEquipmentCode()).outPartNos(outPartNoList).inPartIsEmpty(true));
@ -175,6 +181,9 @@ public class MesWorkOrderCutMatchingProdRuleStepService extends BaseStepService
return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format(
"未维护裁片方案代码[%s]设备[%s]的裁片设备配置信息!", cutCode, cellEquipContext.getEquipmentName()));
// 根据工单分组进料条码
Map<String, MesProductionPsInContext> productionPsInContextMapByWorkOrder = CollectionUtils.isEmpty(productionPsInContextList) ? null : productionPsInContextList.stream().collect(Collectors.toMap(MesProductionPsInContext::getWorkOrderNo, Function.identity(), (x, y) -> y));
for (MesProductionPartContext productionPartContext : productionPartContextList) {
log.info("doHandleProdRuleDataByProductionPartAndEmptyProductSn --- 是否找加工规则:{}", null == productionPartContext || productionPartContext.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0 || !StringUtils.isEmpty(productionPartContext.getForeignKey()));
@ -193,9 +202,12 @@ public class MesWorkOrderCutMatchingProdRuleStepService extends BaseStepService
MesProdRuleContext prodRuleContext = prodRuleCfgExtService.getProdRuleNosortContext(
new MesProdRuleContext(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode(), productionProcessContext.getCraftCode())
.copy(filterList.get(0)).workOrderNo(productionPartContext.getWorkOrderNo()).foreignKey(productionPartContext.foreignKey(foreignKey += 1).getForeignKey()));
prodRuleContext.setIsPrint(cutSchemeEquipment.getIsPrint());
//prodRuleContext.setIsPrint(cutSchemeEquipment.getIsPrint());
prodRuleContextList.add(prodRuleContext);
if (!CollectionUtils.isEmpty(productionPsInContextMapByWorkOrder) && productionPsInContextMapByWorkOrder.containsKey(productionPartContext.getWorkOrderNo()))
productionPsInContextMapByWorkOrder.get(productionPartContext.getWorkOrderNo()).foreignKey(productionPartContext.getForeignKey());
log.info("工厂{}生产线{}工位{}:FSM STATE DISPATCHER --- DO STEP --- {} EXEC --- 设备:{} 产出零件信息:{} 产品加工规则:{} ---", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(),
StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), cellEquipContext.getEquipmentCode(), JSONObject.toJSONString(productionPartContext), JSONObject.toJSONString(prodRuleContext));

@ -1,10 +1,7 @@
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.IMesWorkOrderCutService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.IPrintTemplateStrategyService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesPartContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPartContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesProduceSnPrintModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesWorkOrderCutDetailModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;

@ -15,19 +15,16 @@ import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
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.MesPart;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.bean.MesProductionAssembly;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell;
import cn.estsh.i3plus.pojo.mes.bean.*;
import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel;
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.repository.MesProductionAssemblyRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesWorkOrderCutDetailRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesWorkOrderCutRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
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;
@ -74,6 +71,9 @@ public class MesWorkOrderCutProductSnSaveStepService extends BaseStepService {
@Autowired
private MesProductionAssemblyRepository productionAssemblyRepository;
@Autowired
private MesWorkOrderCutDetailRepository workOrderCutDetailRepository;
@Override
public StepResult execute(StationRequestBean reqBean) {
@ -88,10 +88,10 @@ public class MesWorkOrderCutProductSnSaveStepService extends BaseStepService {
//存储生产过程上下文对象
productionProcessContextStepService.dispatchProductionProcessContext(reqBean, productionProcessContext);
//获取上下文生产扫/读信息:加工单
List<MesEquipVariableCollectContext> equipVariableCollectContextList = productionDispatchContextStepService.getScanWorkOrderNoContext(reqBean);
String cutWorkOrderNo = equipVariableCollectContextList.get(0).getEquipVariableValue();
////获取上下文生产扫/读信息:加工单
//List<MesEquipVariableCollectContext> equipVariableCollectContextList = productionDispatchContextStepService.getScanWorkOrderNoContext(reqBean);
//
//String cutWorkOrderNo = equipVariableCollectContextList.get(0).getEquipVariableValue();
//看是否修改裁片工单状态
//获取上下文进料零件条码信息集合
@ -103,6 +103,9 @@ public class MesWorkOrderCutProductSnSaveStepService extends BaseStepService {
//获取上下文产出零件数据信息集合
List<MesProductionPartContext> productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean);
// 从产出零件上下文中获取裁片工单号
String cutWorkOrderNo = productionPartContextList.stream().findFirst().get().getCutWorkOrderNo();
//获取上下文产品加工规则数据信息集合
List<MesProdRuleContext> prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(reqBean);
@ -117,14 +120,14 @@ public class MesWorkOrderCutProductSnSaveStepService extends BaseStepService {
//从上下文中取出工位对象
MesWorkCell workCell = productionProcessContext.getWorkCell();
//获取生产线的当前班组班次信息
MesProdShiftContext prodShiftContext = productionCustomContextStepService.getMesProdShiftKvBean(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode());
// 无进料条码则生成条码
if (CollectionUtils.isEmpty(productionPsInContextList)) {
productionPsOutContextList = new ArrayList<>();
//获取生产线的当前班组班次信息
MesProdShiftContext prodShiftContext = productionCustomContextStepService.getMesProdShiftKvBean(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode());
if (null == prodShiftContext) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在生产开班记录,请重新开班!");
for (MesProductionPartContext mesProductionPartContext : productionPartContextList) {
@ -183,6 +186,13 @@ public class MesWorkOrderCutProductSnSaveStepService extends BaseStepService {
productionPsOutContextList.add(productionPsOutContext);
// 裁片工单明细 条码赋值 作用:多工位情况下 判定productSn是否有值无值则无需查条码表
workOrderCutDetailRepository.updateByProperties(
new String[]{MesPcnExtConstWords.CUT_WORK_ORDER_NO, MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.IS_DELETED},
new Object[]{cutWorkOrderNo, reqBean.getOrganizeCode(), CommonEnumUtil.VALID, CommonEnumUtil.FALSE},
new String[]{MesPcnExtConstWords.PRODUCT_SN, MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME},
new Object[]{cutWorkOrderNo, reqBean.getUserInfo(), TimeTool.getNowTime(true)});
// 新增装配件加工记录
//saveProductionAssembly(reqBean, productionProcessContext, cellEquipContext, mesProdRuleContext, productionPsOutContext);
@ -193,10 +203,11 @@ public class MesWorkOrderCutProductSnSaveStepService extends BaseStepService {
} else {
if (CollectionUtils.isEmpty(prodRuleContextList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在加工规则信息,请重置工序解决!");
// 保存零件条码
productionPsOutContextList.stream().filter(o -> null != o).forEach(o -> o.copy(saveProduceSnData(reqBean, resultBean, productionProcessContext, o, prodShiftContext, workCell)));
//保存零件条码信息工步
((IStepService) SpringContextsUtil.getBean("mesProductSnSaveStepService")).executeInState(reqBean);
//保存上下文产出条码数据信息集合
productionDispatchContextStepService.dispatchProductionPsOutContext(reqBean, productionPsOutContextList);
for (MesProductionPartContext mesProductionPartContext : productionPartContextList) {
@ -219,6 +230,44 @@ public class MesWorkOrderCutProductSnSaveStepService extends BaseStepService {
}
private MesProduceSn saveProduceSnData(StationRequestBean reqBean, StationResultBean resultBean, MesProductionProcessContext productionProcessContext, MesProductionPsOutContext productionPsOutContext,
MesProdShiftContext prodShiftContext, MesWorkCell workCell) {
//根据零件条码ID查询零件条码信息
MesProduceSn produceSn = produceSnExtService.getProduceSn(reqBean.getOrganizeCode(), productionPsOutContext.getId());
if (null == produceSn) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("请检查零件条码信息,产出零件条码[%s]ID[%s]信息不存在!", productionPsOutContext.getProductSn(), productionPsOutContext.getId()));
produceSn.setAreaCode(workCell.getAreaCode());
produceSn.setWorkCenterCode(workCell.getWorkCenterCode());
produceSn.setWorkCellCode(workCell.getWorkCellCode());
produceSn.setRouteCode(reqBean.getRouteCode());
produceSn.setProcessCode(reqBean.getProcessCode());
produceSn.setCraftCode(productionProcessContext.getCraftCode());
produceSn.setQcStatus(MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue());
produceSn.setShiftCode(prodShiftContext.getShiftCode());
produceSn.setShiftGroup(prodShiftContext.getShiftGroup());
ConvertBean.serviceModelUpdate(produceSn, reqBean.getUserInfo());
produceSn.setLotNo(produceSn.getModifyDatetime().substring(0, 10));
if (StringUtils.isEmpty(produceSn.getInWorkCenterTime())) produceSn.setInWorkCenterTime(produceSn.getModifyDatetime());
produceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.PROCESSING.getValue());
produceSnExtService.update(produceSn);
log.info("工厂{}生产线{}工位{}:FSM STATE DISPATCHER --- DO STEP --- {} EXEC --- MesProductionPsOutContext:{} --- MesProduceSn:{}",
reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(),
StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), JSONObject.toJSONString(productionPsOutContext), JSONObject.toJSONString(produceSn));
return produceSn;
}
private void saveProductionAssembly(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext,
MesCellEquipContext cellEquipContext, MesProdRuleContext mesProdRuleContext,
MesProductionPsOutContext productionPsOutContext) {

@ -0,0 +1,76 @@
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.pojo.context.MesProductionProcessContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsInContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService;
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.model.StationRequestBean;
import cn.estsh.i3plus.pojo.mes.model.StationResultBean;
import cn.estsh.i3plus.pojo.mes.model.StepResult;
import cn.estsh.i3plus.pojo.mes.repository.MesQueueOrderRepository;
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 java.util.List;
/**
* @Description :
* @Author : wangjie
**/
@Slf4j
@Service("mesWorkOrderQueueSaveStepService")
public class MesWorkOrderQueueSaveStepService extends BaseStepService {
@Autowired
private IMesProductionProcessContextStepService productionProcessContextStepService;
@Autowired
private IMesProductionDispatchContextStepService productionDispatchContextStepService;
@Autowired
private MesQueueOrderRepository queueOrderRepository;
@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<MesProductionPsInContext> productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean);
if (CollectionUtils.isEmpty(productionPsInContextList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在零件条码信息,请重置工序解决!");
productionPsInContextList.stream().filter(o -> null != o).forEach(o -> saveWorkOrderQueue(reqBean, o));
return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), stepResult, "保存工位队列成功!");
}
private void saveWorkOrderQueue(StationRequestBean reqBean, MesProductionPsInContext productionPsInContext) {
queueOrderRepository.updateByProperties(
new String[]{MesPcnExtConstWords.ID},
new Object[]{productionPsInContext.getRelateId()},
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()});
}
}

@ -3,7 +3,7 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step.context;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionCustomContextStepService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProdShiftContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblyNosortContext;
import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblyContext;
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.util.StationKvBeanUtil;
@ -231,8 +231,8 @@ public class MesProductionCustomContextStepService extends BaseStepService imple
@Override
public String getRepeatAssemblySn(String organizeCode, String workCenterCode, String workCellCode, String assemblyNosortCfgId) {
String repeatAssemblySnJson = getFsmBusiData(organizeCode, getRepeatAssemblySnContextKey(organizeCode, workCenterCode, workCellCode), assemblyNosortCfgId);
MesProductionAssemblyNosortContext productionAssemblyNosortContext = !StringUtils.isEmpty(repeatAssemblySnJson) ? JSONObject.parseObject(repeatAssemblySnJson, MesProductionAssemblyNosortContext.class) : null;
return null != productionAssemblyNosortContext ? productionAssemblyNosortContext.getAssemblySn() : null;
MesProductionAssemblyContext productionAssemblyContext = !StringUtils.isEmpty(repeatAssemblySnJson) ? JSONObject.parseObject(repeatAssemblySnJson, MesProductionAssemblyContext.class) : null;
return null != productionAssemblyContext ? productionAssemblyContext.getAssemblySn() : null;
}
//根据设备代码获取可复用条码的个数
@ -244,12 +244,12 @@ public class MesProductionCustomContextStepService extends BaseStepService imple
//根据装配件规则ID获取可复用条码
@Override
public Boolean dispatchRepeatAssemblySn(String organizeCode, String workCenterCode, String workCellCode, MesProductionAssemblyNosortContext productionAssemblyNosortContext) {
if (StringUtils.isEmpty(getRepeatAssemblySn(organizeCode, workCenterCode, workCellCode, productionAssemblyNosortContext.getSourceId().toString()))) {
Integer count = getRepeatAssemblySnCount(organizeCode, workCenterCode, workCellCode, productionAssemblyNosortContext.getEquipmentCode()) + 1;
dispatchFsmBusiData(organizeCode, getRepeatAssemblySnContextKey(organizeCode, workCenterCode, workCellCode), productionAssemblyNosortContext.getEquipmentCode(), count.toString());
public Boolean dispatchRepeatAssemblySn(String organizeCode, String workCenterCode, String workCellCode, MesProductionAssemblyContext productionAssemblyContext) {
if (StringUtils.isEmpty(getRepeatAssemblySn(organizeCode, workCenterCode, workCellCode, productionAssemblyContext.getSourceId().toString()))) {
Integer count = getRepeatAssemblySnCount(organizeCode, workCenterCode, workCellCode, productionAssemblyContext.getEquipmentCode()) + 1;
dispatchFsmBusiData(organizeCode, getRepeatAssemblySnContextKey(organizeCode, workCenterCode, workCellCode), productionAssemblyContext.getEquipmentCode(), count.toString());
}
return dispatchFsmBusiData(organizeCode, getRepeatAssemblySnContextKey(organizeCode, workCenterCode, workCellCode), productionAssemblyNosortContext.getSourceId().toString(), JSONObject.toJSONString(productionAssemblyNosortContext));
return dispatchFsmBusiData(organizeCode, getRepeatAssemblySnContextKey(organizeCode, workCenterCode, workCellCode), productionAssemblyContext.getSourceId().toString(), JSONObject.toJSONString(productionAssemblyContext));
}
//删除上下文可复用条码信息

@ -111,7 +111,7 @@ public class MesProductionProcessContextStepService extends BaseStepService impl
if (StringUtils.isEmpty(productionProcessContext.getWorkCenterJson())) productionProcessContext.workCenterJson(prodOrgExtService.getWorkCenterDb(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode()));
//生产过程上下文对象赋值工位信息
if (StringUtils.isEmpty(productionProcessContext.getWorkCellJson())) productionProcessContext.workCellJson(prodOrgExtService.getWorkCellDb(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()));
if (StringUtils.isEmpty(productionProcessContext.getWorkCellJson())) productionProcessContext.workCellJson(prodOrgExtService.getWorkCellDb(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), true));
//生产过程上下文对象赋值工序工艺信息
if (isCheckProcess && (StringUtils.isEmpty(productionProcessContext.getProcessCode()) || !productionProcessContext.getProcessCode().equals(reqBean.getProcessCode()))) processContext(reqBean, productionProcessContext);

@ -110,4 +110,10 @@ public class MesProductionAssemblyContext implements Serializable {
@ApiParam(name = "数据关联键")
public Integer foreignKey;
@ApiParam(value = "是否可复用条码")
public Integer isRepeat;
@ApiParam(value = "是否可复用条码是否写入上下文进行复用")
public Integer isRepeat2Cache = CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue();
}

@ -25,12 +25,6 @@ public class MesProductionAssemblyNosortContext extends MesProductionAssemblyCon
@ApiParam(value = "BOM明细ID")
private String bomDetailId;
@ApiParam(value = "是否可复用条码")
private Integer isRepeat;
@ApiParam(value = "是否可复用条码是否写入上下文进行复用")
private Integer isRepeat2Cache = CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue();
@ApiParam(name = "任意装配件扫描错误判断工位isResetScan后是否重新扫描")
public Integer isResetScan = CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue();

@ -2,11 +2,9 @@ package cn.estsh.i3plus.ext.mes.pcn.pojo.context;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.model.StationRequestBean;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import org.springframework.beans.BeanUtils;
import org.springframework.util.StringUtils;
import java.io.Serializable;
@ -24,6 +22,9 @@ public class MesProductionPsOutContext extends MesProduceSn implements Serializa
@ApiParam(name = "是否计算工单完成数量")
private Integer isCalcCompleteQty = CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue();
@ApiParam(name = "裁片工单号")
private String cutWorkOrderNo;
public MesProductionPsOutContext() {}
public MesProductionPsOutContext copy(MesProduceSn produceSn, Integer foreignKey) {
@ -33,11 +34,21 @@ public class MesProductionPsOutContext extends MesProduceSn implements Serializa
return this;
}
public MesProductionPsOutContext foreignKey(Integer foreignKey) {
this.foreignKey = foreignKey;
return this;
}
public MesProductionPsOutContext copy(MesProduceSn produceSn) {
BeanUtils.copyProperties(produceSn, this);
return this;
}
public MesProductionPsOutContext cutWorkOrderNo(String cutWorkOrderNo) {
this.setCutWorkOrderNo(cutWorkOrderNo);
return this;
}
public MesProductionPsOutContext isCalcCompleteQty(Boolean isCalcCompleteQty) {
if (isCalcCompleteQty) this.isCalcCompleteQty = CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue();
return this;

@ -20,6 +20,9 @@ import java.util.List;
@Data
public class MesNcProcessingInputModel {
@ApiParam("操作类型(1 电子化检验 2客退品 默认1)")
private Integer optType = 1;
@ApiParam("类型")
private Integer type;

@ -18,6 +18,9 @@ import java.util.List;
@Data
public class MesPartInspectionInputModel {
@ApiParam("操作类型(1 电子化检验 2客退品 默认1)")
private Integer optType = 1;
@ApiParam("操作人")
private String userInfo;

@ -1,10 +1,13 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.model;
import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant;
import cn.estsh.i3plus.pojo.mes.bean.MesPartShippingGroup;
import cn.estsh.i3plus.pojo.mes.bean.shipping.MesShippingOrderManagementDetail;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import java.util.List;
import java.util.Objects;
/**
* @Description :
@ -42,5 +45,15 @@ public class MesSortShippingCheckModel {
@ApiParam("发运组明细数据")
private List<MesShippingOrderManagementDetail> detailList;
@ApiParam("发运组")
private MesPartShippingGroup mesPartShippingGroup;
@ApiParam("最后扫描的发运单明细ID")
private Long lastShippingDetailId;
public void setDetailList(List<MesShippingOrderManagementDetail> detailList) {
this.detailList = detailList;
this.isScanCount = (int) detailList.stream().filter(k -> Objects.equals(k.getIsScanFlg(), MesCommonConstant.TRUE_INTEGER)).count();
}
}

@ -197,6 +197,8 @@ public class MesPcnExtConstWords {
public static final String DESCRIPTION = "description";
//描述
public static final String REMARK = "remark";
//状态
public static final String STATUS = "status";
//BaseBean字段不包含工厂, 用于对象复制剔除属性BeanUtils.copyProperties(Object source, Object target, String... ignoreProperties)
public static final String[] BASE_BEAN_FIELDS = {ID, IS_DELETED, IS_VALID, CREATE_DATE_TIME, CREATE_USER, MODIFY_DATE_TIME, MODIFY_USER, DESCRIPTION, REMARK, SYSTEM_SYNC_DATE_TIME, SYSTEM_SYNC_STATUS};

Loading…
Cancel
Save