Merge remote-tracking branch 'origin/dev' into dev

master
xiangwei.zhang 6 months ago
commit 9f302719b9

@ -22,7 +22,7 @@ public interface IMesPullingOrderInfoService {
void doMesPullingOrderInfoScan(MesPullingOrderInfo mesPullingOrderInfo, String userName);
MesPullingOrderPartInfo doMesPullingOrderInfoJisScan(MesPullingOrderPartInfo mesPullingOrderPartInfo, String userName);
List<MesPullingOrderInfo> doMesPullingOrderInfoPrint(MesPullingOrderInfo mesPullingOrderInfo, String userName);
List<MesPullingOrderInfo> doMesPullingOrderInfoPrint(MesPullingOrderInfo mesPullingOrderInfo);
ListPager queryMesPullingOrderPartInfoByPager(MesPullingOrderInfo mesPullingOrderInfo, Pager pager);

@ -14,6 +14,6 @@ public interface IMesWorkOrderOfflineRestoreDispatchService {
void saveWorkOrderOffline(MesWorkOrderOffline workOrderOffline, Boolean result);
@Transactional(propagation = Propagation.REQUIRES_NEW, noRollbackFor = {ImppBusiException.class, Exception.class})
Boolean doRestoreWorkOrderOfflineData(String organizeCode, MesWorkOrderOffline workOrderOffline, List<MesWorkOrderAssemblyOffline> workOrderAssemblyOfflineList, String now);
Boolean doRestoreWorkOrderOfflineData(String organizeCode, MesWorkOrderOffline workOrderOffline, List<MesWorkOrderAssemblyOffline> workOrderAssemblyOfflineList, String now, Boolean flag);
}

@ -150,15 +150,14 @@ public class MesProduceSnPrintController {
ValidatorBean.checkNotNull(printQueue.getPrintQueueType(), "打印队列类型不能为空");
ValidatorBean.checkNotNull(printQueue.getOrganizeCode(), "工厂代码不能为空");
ValidatorBean.checkNotNull(printQueue.getModifyUser(), "操作人不能为空");
if (printQueue.getPrintQueueType() == MesExtEnumUtil.PRINT_QUEUE_TYPE.WORK_ORDER_ASSEMBLY.getValue()) {
if (printQueue.getPrintQueueType() == MesExtEnumUtil.PRINT_QUEUE_TYPE.PRINT_WORK_ORDER_ASSEMBLY.getValue()) {
ValidatorBean.checkNotNull(printQueue.getWorkCenterCodeQuery(), "产线代码不能为空");
ValidatorBean.checkNotNull(printQueue.getPartProdGroupCodeQuery(), "零件生产组代码不能为空");
}
String moduleKey = new StringJoiner(MesPcnExtConstWords.COLON)
.add(printQueue.getOrganizeCode())
.add(MesExtEnumUtil.PRINT_QUEUE_TYPE.class.getSimpleName())
.add(printQueue.getPrintQueueType().toString())
.add(MesExtEnumUtil.PRINT_QUEUE_TYPE.valueOfType(printQueue.getPrintQueueType()).name())
.add(printQueue.getWorkCenterCodeQuery()).add(printQueue.getPartProdGroupCodeQuery()).toString();
synchronized (moduleKey.intern()) {

@ -3,11 +3,13 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.controller.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesTemplateService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesPullingOrderInfoService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.pojo.base.bean.ListPager;
import cn.estsh.i3plus.pojo.base.common.Pager;
import cn.estsh.i3plus.pojo.base.enumutil.ResourceEnumUtil;
import cn.estsh.i3plus.pojo.base.util.StringUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesLabelTemplate;
import cn.estsh.i3plus.pojo.mes.bean.MesPrintQueue;
import cn.estsh.i3plus.pojo.mes.bean.MesPullingOrderInfo;
import cn.estsh.i3plus.pojo.mes.bean.MesPullingOrderPartInfo;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
@ -20,9 +22,11 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.StringJoiner;
/**
*
@ -73,14 +77,36 @@ public class MesPullingOrderInfoController {
@ApiOperation(value = "打印未打印拉动单后修改状态")
public ResultBean doMesPullingOrderInfoPrint(@RequestBody MesPullingOrderInfo mesPullingOrderInfo) {
try {
if (StringUtils.isEmpty(mesPullingOrderInfo.getOrganizeCode())) {
throw new ImppBusiException("工厂不能为空");
}
if (StringUtils.isEmpty(mesPullingOrderInfo.getWorkCenterCode())) {
throw new ImppBusiException("产线不能为空");
}
mesPullingOrderInfo.setOrganizeCode(StringUtil.isEmpty(mesPullingOrderInfo.getOrganizeCode()) ? AuthUtil.getOrganizeCode() : mesPullingOrderInfo.getOrganizeCode());
List<MesPullingOrderInfo> pullingOrderInfos = mesPullingOrderInfoService.doMesPullingOrderInfoPrint(mesPullingOrderInfo, AuthUtil.getSessionUser().getUserName());
return ResultBean.success("拉动单打印成功")
.setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode())
.setResultList(pullingOrderInfos);
if (StringUtils.isEmpty(mesPullingOrderInfo.getPullCode())) {
throw new ImppBusiException("拉动组不能为空");
}
if (StringUtils.isEmpty(mesPullingOrderInfo.getModifyUser())) {
throw new ImppBusiException("操作人不能为空");
}
String moduleKey = new StringJoiner(MesPcnExtConstWords.COLON)
.add(mesPullingOrderInfo.getOrganizeCode())
.add("PRINT_PULLING_ORDER_INFO")
.add(mesPullingOrderInfo.getWorkCenterCode()).add(mesPullingOrderInfo.getPullCode()).toString();
synchronized (moduleKey.intern()) {
List<MesPullingOrderInfo> pullingOrderInfos = mesPullingOrderInfoService.doMesPullingOrderInfoPrint(mesPullingOrderInfo);
return ResultBean.success(CollectionUtils.isEmpty(pullingOrderInfos) ? "查询暂无可打印数据!!!" : "打印队列查询成功!!!").setResultList(pullingOrderInfos);
}
} catch (ImppBusiException e) {
return ResultBean.fail(e).build();
} catch (Exception e) {

@ -286,10 +286,10 @@ public class MesBoxingErrorProofingService implements IMesBoxingErrorProofingSer
private void checkSerialNumber(MesPackageDetail mesPackageDetail) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(mesPackageDetail.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(mesPackageDetail.getPackageNo(), "packageNo", ddlPackBean);
// DdlPreparedPack.getStringEqualPack(mesPackageDetail.getPackageNo(), "packageNo", ddlPackBean);
DdlPreparedPack.getStringEqualPack(mesPackageDetail.getSerialNumber(), "serialNumber", ddlPackBean);
if (mesPackageDetailRDao.isExitByHql(ddlPackBean)) {
MesPcnException.throwMesBusiException("零件条码【%s】已存在该箱,不允许重复扫描,请检查数据!", mesPackageDetail.getSerialNumber());
MesPcnException.throwMesBusiException("零件条码【%s】已装箱,请检查数据!", mesPackageDetail.getSerialNumber());
}
}

@ -328,6 +328,7 @@ public class MesInputDefectRecordService implements IMesInputDefectRecordService
detail.setId(null);
detail.setOrganizeCode(org);
detail.setPid(model.getPartInspection().getId());
setSystemSyncStatus(detail);
ConvertBean.serviceModelInitialize(detail, AuthUtil.getSessionUser().getUserName());
}
@ -402,6 +403,7 @@ public class MesInputDefectRecordService implements IMesInputDefectRecordService
detail.setId(null);
detail.setOrganizeCode(org);
detail.setPid(partInspection.getId());
setSystemSyncStatus(detail);
ConvertBean.serviceModelInitialize(detail, AuthUtil.getSessionUser().getUserName());
}
@ -429,7 +431,7 @@ public class MesInputDefectRecordService implements IMesInputDefectRecordService
}
//查询条码所在库位
// 20241010不找当前所在库位先找生产版本库位再找2000
// srcLocateNo = getDestLocateNo(model, org);
// srcLocateNo = getDestLocateNo(model, org);
}
if (Objects.isNull(srcLocateNo)) {
srcLocateNo = configService.getCfgValue(org, "LGORT");
@ -477,6 +479,7 @@ public class MesInputDefectRecordService implements IMesInputDefectRecordService
detail.setId(null);
detail.setOrganizeCode(org);
detail.setPid(model.getPartInspection().getId());
setSystemSyncStatus(detail);
ConvertBean.serviceModelInitialize(detail, AuthUtil.getSessionUser().getUserName());
}
@ -506,7 +509,7 @@ public class MesInputDefectRecordService implements IMesInputDefectRecordService
//移库
if (model.getOptType() != 2) {
String srcLocateNo = configService.getCfgValue(org, "LGORT");
String srcLocateNo = configService.getCfgValue(org, "LGORT");
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean();
DdlPreparedPack.getStringEqualPack(model.getPartNo(), "partNo", ddlPackBean);
@ -610,6 +613,7 @@ public class MesInputDefectRecordService implements IMesInputDefectRecordService
List<MesPartInspectionDetail> resultDetailList = partInspectionDetailRepository.findByHqlWhere(packBean);
resultDetailList.forEach(k -> {
k.setIsDeleted(MesCommonConstant.TRUE_INTEGER);
setSystemSyncStatus(k);
ConvertBean.serviceModelUpdate(model.getPartInspection(), AuthUtil.getSessionUser().getUserName());
});
@ -977,9 +981,8 @@ public class MesInputDefectRecordService implements IMesInputDefectRecordService
private List<MesPartInspectionDetail> checkPartInspectionDetail(MesPartInspection partInspection, String org) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(org);
DdlPreparedPack.getNumEqualPack(partInspection.getId(), MesPcnExtConstWords.PID, packBean);
List<MesPartInspectionDetail> detailList = partInspectionDetailRepository.findByHqlWhere(packBean);
return detailList;
return partInspectionDetailRepository.findByHqlWhere(packBean);
}
@Override
@ -1071,7 +1074,7 @@ public class MesInputDefectRecordService implements IMesInputDefectRecordService
}
produceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue());
ConvertBean.serviceModelUpdate(produceSn, userName);
produceSnExtService.update(produceSn);
produceSnExtService.update(produceSn);
produceSnLog.setProductSn(produceSn.getProductSn());
produceSnLog.setCustSn(produceSn.getCustSn());
@ -1081,4 +1084,9 @@ public class MesInputDefectRecordService implements IMesInputDefectRecordService
ConvertBean.serviceModelInitialize(produceSnLog, userName);
produceSnLogRepository.save(produceSnLog);
}
private void setSystemSyncStatus(MesPartInspectionDetail detail) {
detail.setSystemSyncStatus(CommonEnumUtil.FALSE);
detail.setSystemSyncDatetime(MesPcnExtConstWords.EMPTY);
}
}

@ -35,6 +35,7 @@ import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StopWatch;
import org.springframework.util.StringUtils;
import java.util.*;
@ -395,14 +396,29 @@ public class MesProduceSnPrintService implements IMesProduceSnPrintService {
@Override
public List<MesPrintQueue> findMesPrintQueueList(MesPrintQueue printQueue) {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
String clazz = MesExtEnumUtil.PRINT_QUEUE_TYPE.valueOfClazz(printQueue.getPrintQueueType());
List<MesPrintQueue> printQueueList = null;
try {
IPrintQueueStrategyService strategyService = (IPrintQueueStrategyService) SpringContextsUtil.getBean(clazz);
printQueueList = strategyService.execute(printQueue);
} catch (Exception e) {
log.info("打印队列查询 --- {} --- 执行异常 --- {}", MesExtEnumUtil.PRINT_QUEUE_TYPE.valueOfDescription(printQueue.getPrintQueueType()), e.toString());
} finally {
stopWatch.stop();
if (!CollectionUtils.isEmpty(printQueueList)) log.info("打印队列查询 --- {} --- 执行耗时: {} ms ---", MesExtEnumUtil.PRINT_QUEUE_TYPE.valueOfDescription(printQueue.getPrintQueueType()), stopWatch.getTotalTimeMillis());
}
return printQueueList;

@ -169,19 +169,27 @@ public class MesPullingOrderInfoService implements IMesPullingOrderInfoService {
}
@Override
public List<MesPullingOrderInfo> doMesPullingOrderInfoPrint(MesPullingOrderInfo bean, String userName) {
public List<MesPullingOrderInfo> doMesPullingOrderInfoPrint(MesPullingOrderInfo bean) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(bean.getOrganizeCode());
//多选
if (!StringUtil.isEmpty(bean.getPullCode())) {
DdlPreparedPack.getInPackList(Arrays.asList(bean.getPullCode().split(",")), "pullCode", packBean);
}
if (!StringUtil.isEmpty(bean.getWorkCenterCode())) {
DdlPreparedPack.getInPackList(Arrays.asList(bean.getWorkCenterCode().split(",")), "workCenterCode", packBean);
}
DdlPreparedPack.getStringEqualPack(bean.getPullingOrderNo(), "pullingOrderNo", packBean);
DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.PRINT_STATUS.UNPRINT.getValue(), "printStatus", packBean);
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue(), CommonEnumUtil.ASC_OR_DESC.ASC.getValue()}, new String[]{"createDatetime", "custOrderNo"}, packBean);
List<String> pullCodeList = Arrays.asList(bean.getPullCode().split(MesPcnExtConstWords.COMMA));
List<String> workCenterCodeList = Arrays.asList(bean.getWorkCenterCode().split(MesPcnExtConstWords.COMMA));
if (pullCodeList.size() == 1) DdlPreparedPack.getStringEqualPack(pullCodeList.get(0), MesPcnExtConstWords.PULL_CODE, packBean);
else DdlPreparedPack.getInPackList(pullCodeList, MesPcnExtConstWords.PULL_CODE, packBean);
if (workCenterCodeList.size() == 1) DdlPreparedPack.getStringEqualPack(workCenterCodeList.get(0), MesPcnExtConstWords.WORK_CENTER_CODE, packBean);
else DdlPreparedPack.getInPackList(workCenterCodeList, MesPcnExtConstWords.WORK_CENTER_CODE, packBean);
DdlPreparedPack.getStringEqualPack(bean.getPullingOrderNo(), MesPcnExtConstWords.PULLING_ORDER_NO, packBean);
DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.PRINT_STATUS.UNPRINT.getValue(), MesPcnExtConstWords.PRINT_STATUS, packBean);
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.ASC.getValue()}, new String[]{MesPcnExtConstWords.CUST_ORDER_NO}, packBean);
List<MesPullingOrderInfo> pullingOrderInfos = mesPullingOrderInfoRepository.findByHqlTopWhere(packBean, MesPcnExtConstWords.THREE);
log.info("打印队列查询 --- 拉动单 --- 查询到打印数据: {} ---", CollectionUtils.isEmpty(pullingOrderInfos) ? "[]" :
pullingOrderInfos.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getWorkOrderNo()))).map(MesPullingOrderInfo::getWorkOrderNo).collect(Collectors.toList()).toString());
if (!CollectionUtils.isEmpty(pullingOrderInfos)) {
//根据车型代码查询车型信息
Map<String, List<MesCustomerCarModel>> mesCustomerCarModelMap = getMesCustomerCarModelMap(bean.getOrganizeCode(), pullingOrderInfos.stream().map(MesPullingOrderInfo::getCarModelCode).distinct().collect(Collectors.toList()));
@ -190,7 +198,7 @@ public class MesPullingOrderInfoService implements IMesPullingOrderInfoService {
for (MesPullingOrderInfo pullingOrderInfo : pullingOrderInfos) {
//查询拉动组明细
DdlPackBean partPackBean = DdlPackBean.getDdlPackBean(pullingOrderInfo.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(pullingOrderInfo.getPullingOrderNo(), "pullingOrderNo", partPackBean);
DdlPreparedPack.getStringEqualPack(pullingOrderInfo.getPullingOrderNo(), MesPcnExtConstWords.PULLING_ORDER_NO, partPackBean);
List<MesPullingOrderPartInfo> pullingOrderPartInfos = mesPullingOrderPartInfoRepository.findByHqlWhere(partPackBean);
if (!CollectionUtils.isEmpty(pullingOrderPartInfos)) {
pullingOrderInfo.setPartCount(pullingOrderPartInfos.size());
@ -210,7 +218,7 @@ public class MesPullingOrderInfoService implements IMesPullingOrderInfoService {
pullingOrderInfo.setPrintTime(TimeTool.getNowTime(true));
pullingOrderInfo.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.PRINTED.getValue());
pullingOrderInfo.setIsPrint(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue());
ConvertBean.serviceModelUpdate(pullingOrderInfo, userName);
ConvertBean.serviceModelUpdate(pullingOrderInfo, bean.getModifyUser());
//10-12 打印补打拉动单新增log表
MesPrintedSnLog snLog = new MesPrintedSnLog();
@ -219,7 +227,7 @@ public class MesPullingOrderInfoService implements IMesPullingOrderInfoService {
snLog.setWorkOrderNo(pullingOrderInfo.getWorkOrderNo());
snLog.setPartNo(pullingOrderInfo.getPartNo());
snLog.setPartName(pullingOrderInfo.getPartName());
ConvertBean.serviceModelInitialize(snLog, userName);
ConvertBean.serviceModelInitialize(snLog, bean.getModifyUser());
snLog.setOrganizeCode(bean.getOrganizeCode());
snLogList.add(snLog);

@ -208,12 +208,11 @@ public class MesSpotCheckOrderService implements IMesSpotCheckOrderService {
//校验点检单
checkSpotCheckOrder(model.getSpotCheckOrder());
//点检单类型为产品首检时 需要判断单据的条码是否都扫描完成
if (model.getSpotCheckOrder().getSpotCheckOrderType() == MesExtEnumUtil.SPOT_CHECK_ORDER_TYPE.FIRST_PRODUCT_INSPECTION.getValue()) {
List<String> partNoList = model.getOrderPartList().stream().filter(k -> StringUtils.isEmpty(k.getSn())).map(k -> k.getPartNo()).collect(Collectors.toList());
if (!CollectionUtils.isEmpty(partNoList)) {
throw new ImppBusiException(String.format("剩余物料号【%s】对应的条码未扫描请扫描完成后再完成质检", partNoList));
//点检单类型为产品首检,产品末检时 需要判断单据的条码是否都扫描完成
if (Stream.of(MesExtEnumUtil.EQUIPMENT_CHECK_ORDER_TYPE.FIRST_INSPECTION.getValue(),MesExtEnumUtil.EQUIPMENT_CHECK_ORDER_TYPE.END_INSPECTION.getValue()).collect(Collectors.toList()).contains(model.getSpotCheckOrder().getSpotCheckOrderType())) {
Optional<MesSpotCheckOrderPart> orderPartOptional = model.getOrderPartList().stream().filter(k -> !StringUtils.isEmpty(k.getSn())).findFirst();
if (!orderPartOptional.isPresent()) {
throw new ImppBusiException("未扫描条码,请扫描条码后再查询设备数据,请检查数据");
}
}
//根据设备代码获取EQUIP_ID
@ -313,12 +312,11 @@ public class MesSpotCheckOrderService implements IMesSpotCheckOrderService {
//校验点检单
MesSpotCheckOrder spotCheckOrder = checkSpotCheckOrder(model.getSpotCheckOrder());
//点检单类型为产品首检时 需要判断单据的条码是否都扫描完成
if (model.getSpotCheckOrder().getSpotCheckOrderType() == MesExtEnumUtil.SPOT_CHECK_ORDER_TYPE.FIRST_PRODUCT_INSPECTION.getValue()) {
List<String> partNoList = model.getOrderPartList().stream().filter(k -> StringUtils.isEmpty(k.getSn())).map(k -> k.getPartNo()).collect(Collectors.toList());
if (!CollectionUtils.isEmpty(partNoList)) {
throw new ImppBusiException(String.format("剩余物料号【%s】对应的条码未扫描请扫描完成后再完成质检", partNoList));
//点检单类型为产品首检,产品末检时 需要判断单据的条码是否都扫描完成
if (Stream.of(MesExtEnumUtil.EQUIPMENT_CHECK_ORDER_TYPE.FIRST_INSPECTION.getValue(),MesExtEnumUtil.EQUIPMENT_CHECK_ORDER_TYPE.END_INSPECTION.getValue()).collect(Collectors.toList()).contains(model.getSpotCheckOrder().getSpotCheckOrderType())) {
Optional<MesSpotCheckOrderPart> orderPartOptional = model.getOrderPartList().stream().filter(k -> !StringUtils.isEmpty(k.getSn())).findFirst();
if (!orderPartOptional.isPresent()) {
throw new ImppBusiException("未扫描条码,请扫描条码后再查询设备数据,请检查数据");
}
}
model.getOrderPartList().forEach(k -> {

@ -441,10 +441,6 @@ public class MesWorkOrderService implements IMesWorkOrderService {
try {
LOGGER.info("此次报工的条码【{}】,工单【{}】", productionRecord.getProductSn(), productionRecord.getWorkOrderNo());
List<MesWorkOrder> oldMesWorkOrders = getMesWorkOrders(productionRecord, organizeCode);
if (CollectionUtils.isEmpty(oldMesWorkOrders)) {
updateProductionRecord(organizeCode, userName, productionRecord.getId());
return;
}
// 工单加工记录报表-试制工单,汇报状态修改成"无需汇报"
if (Objects.equals(productionRecord.getReportStatus(), MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_30.getValue())) {
LOGGER.warn("报工条码:{}工单为试制单,更新成无需报工", productionRecord.getProductSn());
@ -454,6 +450,10 @@ public class MesWorkOrderService implements IMesWorkOrderService {
new Object[]{userName, TimeTool.getNowTime(true), productionRecord.getReportStatus()}, ddlPackBean);
return;
}
if (CollectionUtils.isEmpty(oldMesWorkOrders)) {
updateProductionRecord(organizeCode, userName, productionRecord.getId());
return;
}
report(productionRecord, organizeCode, userName, oldMesWorkOrders);
} catch (Exception e) {
String msg = e.getMessage();

@ -264,7 +264,7 @@ public class WorkOrderAssemblyPrintQueueStrategyService implements IPrintQueueSt
if (workCenterCodeList.size() == 1) DdlPreparedPack.getStringEqualPack(partProdGroupCodeCodeList.get(0), MesPcnExtConstWords.PART_PROD_GROUP_CODE, packBean);
else DdlPreparedPack.getInPackList(partProdGroupCodeCodeList, MesPcnExtConstWords.PART_PROD_GROUP_CODE, packBean);
DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.PRINT_QUEUE_TYPE.WORK_ORDER_ASSEMBLY.getValue(), MesPcnExtConstWords.PRINT_QUEUE_TYPE, packBean);
DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.PRINT_QUEUE_TYPE.PRINT_WORK_ORDER_ASSEMBLY.getValue(), MesPcnExtConstWords.PRINT_QUEUE_TYPE, packBean);
DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.PRINT_STATUS.UNPRINT.getValue(), MesPcnExtConstWords.PRINT_STATUS, packBean);
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.ASC.getValue()}, new String[]{MesPcnExtConstWords.CREATE_DATE_TIME}, packBean);
return printQueueRepository.findByHqlTopWhere(packBean, MesPcnExtConstWords.FOUR);

@ -164,6 +164,10 @@ public class MesShippingScanSnStrategyServiceImpl implements IMesShippingScanStr
if (mesShippingSnUniqueService.checkMesShippingSnUnique(model.getOrganizeCode(),model.getSn())) {
throw new ImppBusiException(String.format("【%s】条码唯一性校验数据已存在请检查数据", model.getSn()));
}
//发运组代码不存在
if (Objects.isNull(model.getMesPartShippingGroup())) {
MesPcnException.throwMesBusiException("发运组信息不存在,请检查数据!");
}
List<MesShippingOrderManagementDetail> detailList = model.getDetailList().stream().filter(k -> !StringUtils.isEmpty(k.getCustPartNo()) && StringUtils.isEmpty(k.getBarcode()) && !Objects.equals(k.getIsScanFlg(), MesCommonConstant.TRUE_INTEGER)).collect(Collectors.toList());
MesShippingOrderManagementDetail mesShippingOrderManagementDetail = null;
for (MesShippingOrderManagementDetail managementDetail : detailList) {

@ -4,7 +4,6 @@ import cn.estsh.i3plus.ext.mes.pcn.api.job.IMesWorkOrderOfflineRestoreDispatchSe
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesProductionRecordOfflineModel;
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.codemaker.SnowflakeIdMaker;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.*;
@ -72,7 +71,7 @@ public class MesWorkOrderOfflineRestoreDispatchService implements IMesWorkOrderO
}
@Override
public Boolean doRestoreWorkOrderOfflineData(String organizeCode, MesWorkOrderOffline workOrderOffline, List<MesWorkOrderAssemblyOffline> workOrderAssemblyOfflineList, String now) {
public Boolean doRestoreWorkOrderOfflineData(String organizeCode, MesWorkOrderOffline workOrderOffline, List<MesWorkOrderAssemblyOffline> workOrderAssemblyOfflineList, String now, Boolean flag) {
//写入工单; 写入条码
if (StringUtils.isEmpty(workOrderOffline.getWorkOrderId())) {
@ -84,15 +83,18 @@ public class MesWorkOrderOfflineRestoreDispatchService implements IMesWorkOrderO
insertOrderPart(organizeCode, workOrderOffline, now);
}
//写入加工记录, 工单装配件, 装配件装配记录
insertAssemblyRecord(organizeCode, workOrderOffline, workOrderAssemblyOfflineList, now);
//补偿修改加工记录的汇报状态: 此前已经标记了汇报工位,但缺失工单零件信息 未进行标记汇报处理状态的数据
if (!StringUtils.isEmpty(workOrderOffline.getReportCellCode()) &&
!StringUtils.isEmpty(workOrderOffline.getOrderPartStatus()) && workOrderOffline.getOrderPartStatus().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0 &&
(StringUtils.isEmpty(workOrderOffline.getReportCellStatus()) || workOrderOffline.getReportCellStatus().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)) {
saveProductionRecordReportStatus(organizeCode, workOrderOffline);
}
return (StringUtils.isEmpty(workOrderOffline.getReportCellStatus()) || workOrderOffline.getReportCellStatus().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0) ? false : true;
//补偿处理的默认返回true, 否则根据已经标记了汇报处理状态的返回true
return flag ? true : ((StringUtils.isEmpty(workOrderOffline.getReportCellStatus()) || workOrderOffline.getReportCellStatus().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0) ? false : true);
}

@ -18,8 +18,7 @@ import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
@Slf4j
@ -44,43 +43,51 @@ public class MesWorkOrderOfflineRestoreService implements IMesWorkOrderOfflineRe
//参数 处理数据量
Integer qty = paramMap.containsKey(MesPcnExtConstWords.QTY) ? Integer.valueOf(paramMap.get(MesPcnExtConstWords.QTY)) : MesPcnExtConstWords.ONE_HUNDRED;
//查询工单离线数据
//查询工单离线数据 [未处理]
List<MesWorkOrderOffline> workOrderOfflineList = getWorkOrderOfflineList(organizeCode, qty);
//搜集工单号 [未处理]
List<String> workOrderNoList = CollectionUtils.isEmpty(workOrderOfflineList) ? null :
workOrderOfflineList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getWorkOrderNo()))).map(MesWorkOrderOffline::getWorkOrderNo).collect(Collectors.toList());
log.info("补录离线生产工单数据JOB --- 查询到未补录完成的生产工单包含: {} ---", CollectionUtils.isEmpty(workOrderNoList) ? "[]" : workOrderNoList.toString());
//查询工单装配件离线数据
//查询工单装配件离线数据 [未处理]
List<MesWorkOrderAssemblyOffline> workOrderAssemblyOfflineList = getWorkOrderAssemblyOfflineList(organizeCode, qty);
if (CollectionUtils.isEmpty(workOrderNoList) && CollectionUtils.isEmpty(workOrderAssemblyOfflineList)) return;
String now = TimeTool.getNowTime(true);
if (CollectionUtils.isEmpty(workOrderNoList)) {
//[未处理]
if (!CollectionUtils.isEmpty(workOrderNoList)) {
//查询排序工单装配件离线数据[未同步的数据] 根据工单号分组
Map<String, List<MesWorkOrderAssemblyOffline>> workOrderAssemblyOfflineMap = getWorkOrderAssemblyOfflineMap(organizeCode, workOrderNoList);
//补录生产数据
workOrderOfflineList.forEach(o -> doRestoreWorkOrderOfflineData(organizeCode, o, getWorkOrderAssemblyOfflineList(workOrderAssemblyOfflineMap, o.getWorkOrderNo()), now));
//补录生产数据 [未处理]
workOrderOfflineList.forEach(o -> doRestoreWorkOrderOfflineData(organizeCode, o, getWorkOrderAssemblyOfflineList(workOrderAssemblyOfflineMap, o.getWorkOrderNo()), now, false));
}
//剔除上面已经处理过的工单的 装配件数据 [补偿处理]
workOrderAssemblyOfflineList = CollectionUtils.isEmpty(workOrderAssemblyOfflineList) ? null :
workOrderAssemblyOfflineList.stream().filter(o -> (null != o && !workOrderNoList.contains(o.getWorkOrderNo()))).collect(Collectors.toList());
if (CollectionUtils.isEmpty(workOrderAssemblyOfflineList)) return;
//根据工单号分组 [补偿处理]
Map<String, List<MesWorkOrderAssemblyOffline>> workOrderAssemblyOfflineMap = backWorkOrderAssemblyMap(workOrderAssemblyOfflineList);
//查询工单离线数据 [已处理]
workOrderOfflineList = getWorkOrderOfflineMap(organizeCode, new ArrayList<>(workOrderAssemblyOfflineMap.keySet()));
if (CollectionUtils.isEmpty(workOrderOfflineList)) return;
//补录生产数据 [补偿处理]
workOrderOfflineList.forEach(o -> doRestoreWorkOrderOfflineData(organizeCode, o, getWorkOrderAssemblyOfflineList(workOrderAssemblyOfflineMap, o.getWorkOrderNo()), now, true));
}
//查询工单离线数据
//查询工单离线数据 [未处理]
private List<MesWorkOrderOffline> getWorkOrderOfflineList(String organizeCode, Integer qty) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getNumEqualPack(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), MesPcnExtConstWords.SYSTEM_SYNC_STATUS, packBean);
@ -89,7 +96,18 @@ public class MesWorkOrderOfflineRestoreService implements IMesWorkOrderOfflineRe
return workOrderOfflineList;
}
//查询工单装配件离线数据
//查询工单离线数据 [已处理]
private List<MesWorkOrderOffline> getWorkOrderOfflineMap(String organizeCode, List<String> workOrderNoList) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getNumEqualPack(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), MesPcnExtConstWords.SYSTEM_SYNC_STATUS, packBean);
DdlPreparedPack.getInPackList(workOrderNoList, MesPcnExtConstWords.WORK_ORDER_NO, packBean);
List<MesWorkOrderOffline> workOrderOfflineList = workOrderOfflineRepository.findByHqlWhere(packBean);
if (CollectionUtils.isEmpty(workOrderOfflineList)) return null;
workOrderOfflineList = workOrderOfflineList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesWorkOrderOffline::getModifyDatetime).reversed()).collect(Collectors.toList());
return workOrderOfflineList.stream().filter(o -> null != o).distinct().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(MesWorkOrderOffline::getWorkOrderNo))), ArrayList::new));
}
//查询工单装配件离线数据 [未处理]
private List<MesWorkOrderAssemblyOffline> getWorkOrderAssemblyOfflineList(String organizeCode, Integer qty) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getNumEqualPack(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), MesPcnExtConstWords.SYSTEM_SYNC_STATUS, packBean);
@ -105,20 +123,27 @@ public class MesWorkOrderOfflineRestoreService implements IMesWorkOrderOfflineRe
DdlPreparedPack.getInPackList(workOrderNoList, MesPcnExtConstWords.WORK_ORDER_NO, packBean);
List<MesWorkOrderAssemblyOffline> workOrderAssemblyOfflineList = workOrderAssemblyOfflineRepository.findByHqlWhere(packBean);
if (CollectionUtils.isEmpty(workOrderAssemblyOfflineList)) log.info("--- 异常 --- 补录离线生产工单数据JOB --- 当前没有需要补录的工单装配件离线数据 ---");
return workOrderAssemblyOfflineList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesWorkOrderAssemblyOffline::getWorkOrderNo));
return backWorkOrderAssemblyMap(workOrderAssemblyOfflineList);
}
//搜集数据
private List<MesWorkOrderAssemblyOffline> getWorkOrderAssemblyOfflineList(Map<String, List<MesWorkOrderAssemblyOffline>> workOrderAssemblyOfflineMap, String workOrderNo) {
return CollectionUtils.isEmpty(workOrderAssemblyOfflineMap) ? null : workOrderAssemblyOfflineMap.get(workOrderNo);
}
//根据工单号分组
private Map<String, List<MesWorkOrderAssemblyOffline>> backWorkOrderAssemblyMap(List<MesWorkOrderAssemblyOffline> workOrderAssemblyOfflineList) {
return workOrderAssemblyOfflineList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesWorkOrderAssemblyOffline::getWorkOrderNo));
}
//补录生产数据
private void doRestoreWorkOrderOfflineData(String organizeCode, MesWorkOrderOffline workOrderOffline, List<MesWorkOrderAssemblyOffline> workOrderAssemblyOfflineList, String now) {
private void doRestoreWorkOrderOfflineData(String organizeCode, MesWorkOrderOffline workOrderOffline, List<MesWorkOrderAssemblyOffline> workOrderAssemblyOfflineList, String now, Boolean flag) {
log.info("补录离线生产工单数据JOB --- 工单:{} --- START ---", workOrderOffline.getWorkOrderNo());
Boolean result = false;
try {
result = workOrderOfflineRestoreDispatchService.doRestoreWorkOrderOfflineData(organizeCode, workOrderOffline, workOrderAssemblyOfflineList, now);
result = workOrderOfflineRestoreDispatchService.doRestoreWorkOrderOfflineData(organizeCode, workOrderOffline, workOrderAssemblyOfflineList, now, flag);
} catch (Exception e) {
if (flag) result = true;
log.info("--- 异常 --- 补录离线生产工单数据JOB --- 工单:{} --- ERROR --- {}", workOrderOffline.getWorkOrderNo(), e.toString());
} finally {
workOrderOfflineRestoreDispatchService.saveWorkOrderOffline(workOrderOffline, result);

@ -271,6 +271,10 @@ public class MesPcnExtConstWords {
public static final String EFFECT_NUM = "effectNum";
//组件类型
public static final String MODULE_TYPE = "moduleType";
//拉动组代码
public static final String PULL_CODE = "pullCode";
//拉动单号
public static final String PULLING_ORDER_NO = "pullingOrderNo";
//BaseBean字段不包含工厂, 用于对象复制剔除属性BeanUtils.copyProperties(Object source, Object target, String... ignoreProperties)

Loading…
Cancel
Save