BOM生效

dev
yxw 1 year ago
parent 4ea1c40bae
commit a00fc87fa9

@ -93,7 +93,7 @@ public interface ISxWorkOrderExtService {
* @param workOrderStatus
* @param orderNoList
*/
void updateWorkOrderStatus(Integer workOrderStatus, List<String> orderNoList);
List<String> updateWorkOrderStatus(Integer workOrderStatus, List<String> orderNoList);
GenerateWorkOrderDto getMesWorkOrderDetail(String orderNo);

@ -2,7 +2,6 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.controller.base;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IBomTakeEffectService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.BomTakeEffectModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.WmsBomTotalModel;
import cn.estsh.i3plus.platform.common.util.CommonConstWords;
import cn.estsh.i3plus.pojo.base.enumutil.ResourceEnumUtil;
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
@ -13,8 +12,6 @@ import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
*
*

@ -3,7 +3,6 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.controller.base;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IJobBookingService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesJobBookingPart;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesPackageExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesWorkOverModel;
import cn.estsh.i3plus.platform.common.util.CommonConstWords;
import cn.estsh.i3plus.pojo.base.common.Pager;
import cn.estsh.i3plus.pojo.base.enumutil.ResourceEnumUtil;

@ -38,7 +38,6 @@ public class SxWorkOrderExtController extends MesPcnBaseController {
@Autowired
private ISxWorkOrderExtService workOrderExtService;
@ApiOperation("生成工单")
@PostMapping("generate")
public ResultBean generateWorkOrder(@RequestBody GenerateWorkOrderDto workOrderDto){
@ -62,8 +61,6 @@ public class SxWorkOrderExtController extends MesPcnBaseController {
}
@ApiOperation("调整工单")
@PostMapping("adjust")
public ResultBean adjustWorkOrder(@RequestBody GenerateWorkOrderDto generateWorkOrderDto){
@ -95,9 +92,6 @@ public class SxWorkOrderExtController extends MesPcnBaseController {
}
}
@PutMapping(value = "/update-order-status")
@ApiOperation(value = "生产工单状态批量调整")
public ResultBean updateWorkOrderStatus(@RequestBody RequestModel requestModel) {
@ -112,8 +106,9 @@ public class SxWorkOrderExtController extends MesPcnBaseController {
ValidatorBean.checkNotNull(workOrderStatus, "工单状态不能为空");
ValidatorBean.checkNotNull(orderNoList, "工单号不能为空");
workOrderExtService.updateWorkOrderStatus(workOrderStatus, orderNoList);
return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode());
return ResultBean.success("操作成功")
.setResultList(workOrderExtService.updateWorkOrderStatus(workOrderStatus, orderNoList))
.setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode());
} catch (ImppBusiException busExcep) {
return ResultBean.fail(busExcep);
} catch (Exception e) {

@ -33,7 +33,6 @@ public class TorqueManageCheckController extends MesPcnBaseController {
@Autowired
private ITorqueManageCheckService personCheckDetailService;
/**
*
*
@ -56,7 +55,7 @@ public class TorqueManageCheckController extends MesPcnBaseController {
/**
*
*
* @param personCheckDetail
* @param torqueManageTaskDetail
* @return
*/
@PutMapping(value = "/detail/update")
@ -76,7 +75,7 @@ public class TorqueManageCheckController extends MesPcnBaseController {
/**
*
*
* @param personCheckDetail
* @param torqueManageTaskDetail
* @return
*/
@PutMapping(value = "/detail/update-top-data")

@ -3,14 +3,15 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.base;
import cn.estsh.i3plus.ext.mes.pcn.api.base.IBomTakeEffectService;
import cn.estsh.i3plus.ext.mes.pcn.api.base.ISxPcnHttpService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IProduceSnExtService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesBomTakeEffectRecord;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesPartExt;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesProduceSnExt;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProduceSnMcRecordService;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.*;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.BomTakeEffectModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.WmsBomTotalModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.repository.MesBomPendingPartRepository;
import cn.estsh.i3plus.ext.mes.pcn.pojo.repository.MesBomTakeEffectRecordRepository;
import cn.estsh.i3plus.ext.mes.pcn.pojo.repository.MesPartExtRepository;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil;
import cn.estsh.i3plus.mes.pcn.util.PcnHttpUtil;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum;
@ -32,10 +33,9 @@ import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
@ -57,10 +57,19 @@ public class BomTakeEffectService implements IBomTakeEffectService {
private MesBomTakeEffectRecordRepository bomTakeEffectRecordRepository;
@Autowired
private MesPartExtRepository partExtRDao;
@Autowired
private IJxProduceSnMcRecordService jxProduceSnMcRecordService;
@Autowired
private MesBomPendingPartRepository bomPendingPartRepository;
@Override
public MesProduceSnExt queryProduceSnBySn(String serialNumber, String organizeCode) {
return produceSnExtService.getProduceSnExtBySn(organizeCode, serialNumber);
MesProduceSnMcRecord produceSnMcRecordDb = jxProduceSnMcRecordService.getProduceSnMcRecordDb(organizeCode, serialNumber);
if (produceSnMcRecordDb == null) return produceSnExtService.getProduceSnExtByProductSn(organizeCode, serialNumber);
return produceSnExtService.getProduceSnExtByProductSn(organizeCode, produceSnMcRecordDb.getProductSn());
}
@Override
@ -91,26 +100,129 @@ public class BomTakeEffectService implements IBomTakeEffectService {
}
@Override
public void doEffect(BomTakeEffectModel bomTakeEffectModel) throws IOException {
public void doEffect(BomTakeEffectModel bomTakeEffectModel){
String organizeCode = bomTakeEffectModel.getOrganizeCode();
List<WmsBomTotalModel> wmsBomTotalModels = bomTakeEffectModel.getWmsBomTotalModels();
String userName = bomTakeEffectModel.getUserInfo();
String partNo = bomTakeEffectModel.getPartNo();
String workOrderNo = bomTakeEffectModel.getWorkOrderNo();
String partNameRdd = bomTakeEffectModel.getPartNameRdd();
String productSn = bomTakeEffectModel.getProductSn();
//String jsonWmsBomTotalList = JSON.toJSONString(wmsBomTotalModels);
BaseResultBean bomEffectResultBean = doWmsBomEffect(organizeCode, partNo);
if (null != bomEffectResultBean && bomEffectResultBean.success) {
log.info("BOM生效 --- doEffect --- WMS-BOM生效成功!");
List<MesBom> bomListByDb = queryOldPartBom(organizeCode, partNo);
// 保存待BOM生效成品
saveBomPendingPart(bomTakeEffectModel, organizeCode, bomListByDb);
// 删除旧BOM数据
deleteOldBom(bomListByDb);
// 保存新Bom数据
saveNewPartBom(bomTakeEffectModel.getWmsBomTotalModels(), userName);
// 插入BOM生效记录表
saveBomEffectRecord(organizeCode, userName, partNo, bomTakeEffectModel.getWorkOrderNo(), bomTakeEffectModel.getProductSn());
}
}
private void deleteOldBom(List<MesBom> bomListByDb) {
bomRepository.deleteAll(bomListByDb);
}
private void saveBomPendingPart(BomTakeEffectModel bomTakeEffectModel, String organizeCode, List<MesBom> bomListByDb) {
List<String> oldItemPartNoList = getItemPartNoList(bomListByDb);
removeSamePartByNewBom(oldItemPartNoList, bomTakeEffectModel.getWmsBomTotalModels());
removeRecordedPart(oldItemPartNoList, organizeCode);
saveBomPendingPart(oldItemPartNoList, bomTakeEffectModel);
updateBomPendingPartByPartByPartNo(bomTakeEffectModel.getPartNo(), bomTakeEffectModel.getOrganizeCode(), bomTakeEffectModel.getUserInfo());
}
private List<String> getItemPartNoList(List<MesBom> bomListByDb) {
return CollectionUtils.isEmpty(bomListByDb) ? null :
bomListByDb.stream().map(MesBom::getItemPartNo).collect(Collectors.toList());
}
private void saveBomPendingPart(List<String> oldItemPartNoList, BomTakeEffectModel bomTakeEffectModel) {
if (CollectionUtils.isEmpty(oldItemPartNoList)) return;
List<MesBom> mesBomList = queryBomByItemPartNo(bomTakeEffectModel.getOrganizeCode(), oldItemPartNoList);
if (CollectionUtils.isEmpty(mesBomList)) return;
mesBomList = removeCurPartBom(bomTakeEffectModel, mesBomList);
if (CollectionUtils.isEmpty(mesBomList)) return;
List<MesBomPendingPart> bomPendingPartList = new ArrayList<>(mesBomList.size());
for (MesBom mesBom : mesBomList) {
MesBomPendingPart bomPendingPart = new MesBomPendingPart();
BeanUtils.copyProperties(mesBom, bomPendingPart , MesPcnExtConstWords.ID, MesPcnExtConstWords.CREATE_USER, MesPcnExtConstWords.CREATE_DATE_TIME, MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME);
ConvertBean.serviceModelInitialize(bomPendingPart, bomTakeEffectModel.getUserInfo());
bomPendingPart.setSystemSyncStatus(MesPcnExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue());
bomPendingPart.setIsReminded(MesPcnExtEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
bomPendingPart.setIsTookEffect(MesPcnExtEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
bomPendingPartList.add(bomPendingPart);
}
bomPendingPartRepository.saveAll(bomPendingPartList);
}
private void updateBomPendingPartByPartByPartNo(String partNo, String organizeCod, String userInfo) {
bomPendingPartRepository.updateByProperties(
new String[]{MesPcnExtConstWords.PART_NO, "isTookEffect", MesPcnExtConstWords.ORGANIZE_CODE,
MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.IS_DELETED},
new Object[]{partNo, MesPcnExtEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), organizeCod,
CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()},
new String[]{"isTookEffect", "isReminded", MesPcnExtConstWords.SYSTEM_SYNC_STATUS,
MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME},
new Object[]{MesPcnExtEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), MesPcnExtEnumUtil.TRUE_OR_FALSE.TRUE.getValue(),
MesPcnExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue(), userInfo, TimeTool.getNowTime(true)});
}
private List<MesBom> removeCurPartBom(BomTakeEffectModel bomTakeEffectModel, List<MesBom> mesBomList) {
return mesBomList.stream().filter(o -> !o.getPartNo().equals(bomTakeEffectModel.getPartNo()))
.collect(Collectors.toList());
}
private void removeRecordedPart(List<String> oldItemPartNoList, String organizeCode) {
if (CollectionUtils.isEmpty(oldItemPartNoList)) return;
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
packBean.addColumnQuery("isReminded", " and ( model." + "isReminded" + " = :m_" + "isReminded", MesPcnExtEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
packBean.addColumnQuery("isTookEffect", " or model." + "isTookEffect" + " = :m_" + "isTookEffect" + " )", MesPcnExtEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
List<MesBomPendingPart> bomPendingPartDbListByNotRemind = bomPendingPartRepository.findByHqlWhere(packBean);
List<String> itemPartNoList = bomPendingPartDbListByNotRemind.stream().map(MesBomPendingPart::getItemPartNo).distinct().collect(Collectors.toList());
if (!CollectionUtils.isEmpty(itemPartNoList)) oldItemPartNoList.removeAll(itemPartNoList);
}
private void removeSamePartByNewBom(List<String> oldItemPartNoList, List<WmsBomTotalModel> wmsBomTotalModels) {
if (CollectionUtils.isEmpty(wmsBomTotalModels) || CollectionUtils.isEmpty(oldItemPartNoList)) return;
List<String> newItemPartNoList = wmsBomTotalModels.stream().map(WmsBomTotalModel::getItemPartNo).collect(Collectors.toList());
oldItemPartNoList.removeAll(newItemPartNoList);
}
private BaseResultBean doWmsBomEffect(String organizeCode, String partNo) {
String bomEffectRequestUrl = pcnHttpService.getRequestUrl(organizeCode, MesPcnExtConstWords.BOM_TASK_EFFECT);
/*log.info("PCN获取MES接口路径:{}", bomEffectRequestUrl);
for (int i = 0; i < wmsBomTotalModels.size(); i++) {
wmsBomTotalModels.get(i).setModifyUser(userName);
wmsBomTotalModels.get(i).setModifyDatetime(TimeTool.getNowTime(true));
wmsBomTotalModels.get(i).setCreateUser(userName);
wmsBomTotalModels.get(i).setCreateDatetime(TimeTool.getNowTime(true));
}*/
//Map<String, String> params = new HashMap<>();
// params.put("wmsBomTotalModels", jsonWmsBomTotalList);
Map<String, String> params = new HashMap<>();
params.put(MesPcnExtConstWords.PART_NO, partNo);
params.put(MesPcnExtConstWords.ORGANIZE_CODE, organizeCode);
@ -128,45 +240,63 @@ public class BomTakeEffectService implements IBomTakeEffectService {
.setErrorDetail("HTTP调用mes Bom生效接口失败,请联系管理员")
.build();
}
return bomEffectResultBean;
}
if (null != bomEffectResultBean && bomEffectResultBean.success) {
log.info("MES进行BOM数据更新");
//先删除bom表 该父物料下的BOM
private void saveNewPartBom(List<WmsBomTotalModel> wmsBomTotalModels, String userName) {
List<MesBom> mesBomList = new ArrayList<>();
for (WmsBomTotalModel wmsBomTotalModel : wmsBomTotalModels) {
MesBom bom = new MesBom();
BeanUtils.copyProperties(wmsBomTotalModel, bom, "id");
bom.setUnit(wmsBomTotalModel.getUNIT());
bom.setBomCode(wmsBomTotalModel.getBomNum());
ConvertBean.serviceModelInitialize(bom, userName);
mesBomList.add(bom);
}
bomRepository.saveAll(mesBomList);
}
private List<MesBom> queryOldPartBom(String organizeCode, String partNo) {
return bomRepository.findByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.PART_NO},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), partNo});
}
private List<MesBom> queryBomByItemPartNo(String organizeCode, List<String> itemPartNo) {
List<MesBom> bomList = new ArrayList<>();
int batchHandleNum = 100;
for (int i = 0; i < itemPartNo.size(); i += batchHandleNum) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(partNo, MesPcnExtConstWords.PART_NO, packBean);
List<MesBom> bomListByDb = bomRepository.findByHqlWhere(packBean);
bomRepository.deleteAll(bomListByDb);
//再插入MesBom表
List<MesBom> mesBomList = new ArrayList<>();
for (int i = 0; i < wmsBomTotalModels.size(); i++) {
MesBom bom = new MesBom();
BeanUtils.copyProperties(wmsBomTotalModels.get(i), bom, "id");
bom.setUnit(wmsBomTotalModels.get(i).getUNIT());
bom.setBomCode(wmsBomTotalModels.get(i).getBomNum());
ConvertBean.serviceModelInitialize(bom, userName);
mesBomList.add(bom);
}
bomRepository.saveAll(mesBomList);
//插入BOM生效记录表
MesBomTakeEffectRecord bomTakeEffectRecord = new MesBomTakeEffectRecord();
bomTakeEffectRecord.setWorkOrderNo(workOrderNo);
bomTakeEffectRecord.setPartNo(partNo);
MesPartExt partExt = partExtRDao.getByProperty(
new String[]{MesConstWords.ORGANIZE_CODE, MesConstWords.IS_DELETED, MesConstWords.IS_VALID, MesPcnExtConstWords.PART_NO},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), partNo});
if (null != partExt) {
bomTakeEffectRecord.setPartName(partExt.getPartName());
}
bomTakeEffectRecord.setTakeEffectTime(TimeTool.getNowTime(true));
bomTakeEffectRecord.setTaskUser(userName);
bomTakeEffectRecord.setProductSn(productSn);
bomTakeEffectRecord.setOrganizeCode(organizeCode);
ConvertBean.serviceModelInitialize(bomTakeEffectRecord, userName);
bomTakeEffectRecordRepository.save(bomTakeEffectRecord);
DdlPreparedPack.getInPackList(itemPartNo, MesPcnExtConstWords.ITEM_PART_NO, packBean);
List<MesBom> bomTempList = bomRepository.findByHqlWhere(packBean);
bomList.addAll(bomTempList);
}
return bomList;
}
private void saveBomEffectRecord(String organizeCode, String userName, String partNo, String workOrderNo, String productSn) {
MesBomTakeEffectRecord bomTakeEffectRecord = new MesBomTakeEffectRecord();
bomTakeEffectRecord.setWorkOrderNo(workOrderNo);
bomTakeEffectRecord.setPartNo(partNo);
MesPartExt partExt = partExtRDao.getByProperty(
new String[]{MesConstWords.ORGANIZE_CODE, MesConstWords.IS_DELETED, MesConstWords.IS_VALID, MesPcnExtConstWords.PART_NO},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), partNo});
if (null != partExt) {
bomTakeEffectRecord.setPartName(partExt.getPartName());
}
bomTakeEffectRecord.setTakeEffectTime(TimeTool.getNowTime(true));
bomTakeEffectRecord.setTaskUser(userName);
bomTakeEffectRecord.setProductSn(productSn);
bomTakeEffectRecord.setOrganizeCode(organizeCode);
ConvertBean.serviceModelInitialize(bomTakeEffectRecord, userName);
bomTakeEffectRecordRepository.save(bomTakeEffectRecord);
}
}

@ -18,7 +18,6 @@ import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum;
import cn.estsh.i3plus.platform.common.tool.ConvertUtil;
import cn.estsh.i3plus.platform.common.tool.JsonUtilTool;
import cn.estsh.i3plus.platform.common.tool.MathOperation;
import cn.estsh.i3plus.platform.common.tool.TimeTool;
import cn.estsh.i3plus.platform.common.util.MesConstWords;
import cn.estsh.i3plus.pojo.base.bean.BaseResultBean;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
@ -136,9 +135,7 @@ public class SxWorkOrderExtService implements ISxWorkOrderExtService {
private SxProductOffLineRepository productOffLineRepository;
@Autowired
private SxProductOffLineExtRepository productOffLineExtRepository;
private MesBomPendingPartRepository bomPendingPartRepository;
@Resource(name = MesPcnExtConstWords.REDIS_RES_PCN)
private ImppRedis redisMesPcn;
@ -729,11 +726,161 @@ public class SxWorkOrderExtService implements ISxWorkOrderExtService {
*/
@Override
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void updateWorkOrderStatus(Integer workOrderStatus, List<String> orderNoList) {
public List<String> updateWorkOrderStatus(Integer workOrderStatus, List<String> orderNoList) {
String organizeCode = AuthUtil.getOrganize().getOrganizeCode();
String userInfo = AuthUtil.getSessionUser().getUserName();
//获取所有数据
List<MesWorkOrderExt> workOrderExtList = getMesWorkOrderExts(orderNoList, organizeCode);
checkOperateOrderValid(workOrderStatus, workOrderExtList);
// 一个工单号下的多个工单
for (MesWorkOrderExt workOrderExt : workOrderExtList) {
Integer lastWorkOrderStatus = null;
switch (MesPcnExtEnumUtil.WORK_ORDER_STATUS.getByValue(workOrderStatus)) {
case OPEN:
// 启动
// 校验当前工单是否能够启动并获取上次工单状态
lastWorkOrderStatus = checkOpenOrderValid(organizeCode, workOrderExt, lastWorkOrderStatus);
// 生成点检单
doGenerateCheckOrder(workOrderStatus, organizeCode, userInfo, workOrderExt, lastWorkOrderStatus);
break;
case PAUSE:
// 暂停
// 校验工单是否是启动状态
checkPauseOrderValid(workOrderExt);
// 暂停记录工单日志
pauseRecordOrderNo(workOrderExt);
break;
case REMOVE:
// 删除
// 校验当前工单是否能够删除
checkRemoveOrderValid(organizeCode, userInfo, workOrderExt);
break;
}
// 更改工单状态
saveMesWorkOrderExt(workOrderStatus, userInfo, workOrderExt, lastWorkOrderStatus);
}
return openOrderInformNeedBomEffectPart(workOrderExtList, userInfo);
}
private List<String> openOrderInformNeedBomEffectPart(List<MesWorkOrderExt> workOrderExtList, String userInfo) {
if (CollectionUtils.isEmpty(workOrderExtList)) return null;
List<MesWorkOrderExt> workOrderExtListWithOpen = workOrderExtList.stream().filter(o -> o.getWorkOrderStatus() == MesPcnExtEnumUtil.WORK_ORDER_STATUS.OPEN.getValue()).collect(Collectors.toList());
if (CollectionUtils.isEmpty(workOrderExtListWithOpen)) return null;
Map<String, List<MesWorkOrderExt>> workOrderExtMapByPartNo = workOrderExtListWithOpen.stream().collect(Collectors.groupingBy(MesWorkOrderExt::getPartNo));
List<MesBomPendingPart> bomPendingPartDbList = queryBomPendingPart(workOrderExtList.get(0).getOrganizeCode(), new ArrayList<>(workOrderExtMapByPartNo.keySet()));
if (CollectionUtils.isEmpty(bomPendingPartDbList)) return null;
Map<String, List<MesBomPendingPart>> bomPendingPartMap = bomPendingPartDbList.stream().collect(Collectors.groupingBy(MesBomPendingPart::getPartNo));
List<String> informList = new ArrayList<>();
for (Map.Entry<String, List<MesBomPendingPart>> entry : bomPendingPartMap.entrySet()) {
List<MesWorkOrderExt> workOrderExtListByPartNo = workOrderExtMapByPartNo.get(entry.getKey());
List<MesBomPendingPart> bomPendingPartList = entry.getValue();
for (MesWorkOrderExt workOrderExt : workOrderExtListByPartNo) {
for (MesBomPendingPart bomPendingPart : bomPendingPartList) {
bomPendingPart.setSystemSyncStatus(MesPcnExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue());
bomPendingPart.setIsReminded(MesPcnExtEnumUtil.TRUE_OR_FALSE.TRUE.getValue());
ConvertBean.serviceModelUpdate(bomPendingPart, userInfo);
informList.add(String.format("工单[%s]对应成品[%s],有对应子物料[%s],对应BOM版本号[%s],对应有效开始期[%s],结束日期[%s],待BOM生效",
workOrderExt.getOrderNo(), entry.getKey(), bomPendingPart.getItemPartNo(),
bomPendingPart.getBomVersion(), bomPendingPart.getEffStartTime(), bomPendingPart.getEffEndTime()));
}
}
}
bomPendingPartRepository.saveAll(bomPendingPartDbList);
return informList;
}
private List<MesBomPendingPart> queryBomPendingPart(String organizeCode, List<String> partNoList) {
if (CollectionUtils.isEmpty(partNoList) || StringUtils.isEmpty(organizeCode)) return null;
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getInPackList(partNoList, MesPcnExtConstWords.PART_NO, packBean);
DdlPreparedPack.getNumEqualPack(MesPcnExtEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), "isReminded", packBean);
return bomPendingPartRepository.findByHqlWhere(packBean);
}
private Integer checkOpenOrderValid(String organizeCode, MesWorkOrderExt workOrderExt, Integer lastWorkOrderStatus) {
if (MesPcnExtEnumUtil.WORK_ORDER_STATUS.LANDED.getValue() == workOrderExt.getWorkOrderStatus()) {
//调用启动工单附属启动的方法
//校验是否存在已经启动的工单
List<MesWorkOrderExt> landedOrderList = getWorkOrderListByCenterAndStatus(organizeCode, workOrderExt.getWorkCenterCode(), MesPcnExtEnumUtil.WORK_ORDER_STATUS.LANDED.getValue());
if (CollectionUtils.isEmpty(landedOrderList)) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES_PCN.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("生产线[%s]暂无下达状态的工单,请刷新界面重试", workOrderExt.getWorkCenterCode())
.build();
}
if (!landedOrderList.get(0).getOrderNo().equals(workOrderExt.getOrderNo())) {
throw ImppExceptionBuilder.newInstance().setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("工单[%s]的工单序号不是生产线[%s]下工单中最小的序号", workOrderExt.getOrderNo(), workOrderExt.getWorkCenterCode())
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES_PCN.getCode())
.build();
}
if (MesPcnExtEnumUtil.WORK_ORDER_SN_CREATE_STATUS.UN_CREATE.getValue() == workOrderExt.getSnCreateStatus()) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES_PCN.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("工单[%s]未生成产品条码,不能启动", workOrderExt.getOrderNo())
.build();
}
} else if (MesPcnExtEnumUtil.WORK_ORDER_STATUS.PAUSE.getValue() == workOrderExt.getWorkOrderStatus()) {
//更改未暂停前状态
//获取暂停前的状态
lastWorkOrderStatus = getLastWorkOrderStatus(organizeCode, workOrderExt);
if (lastWorkOrderStatus == MesPcnExtEnumUtil.WORK_ORDER_STATUS.OPEN.getValue() &&
MesPcnExtEnumUtil.WORK_ORDER_SN_CREATE_STATUS.UN_CREATE.getValue() == workOrderExt.getSnCreateStatus())
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES_PCN.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("工单[%s]未生成产品条码,不能启动", workOrderExt.getOrderNo())
.build();
} else
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES_PCN.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("工单[%s]状态为[%s],不能启动",
workOrderExt.getOrderNo(), MesPcnExtEnumUtil.WORK_ORDER_STATUS.valueOfDescription(workOrderExt.getWorkOrderStatus()))
.build();
return lastWorkOrderStatus;
}
private List<MesWorkOrderExt> getMesWorkOrderExts(List<String> orderNoList, String organizeCode) {
List<MesWorkOrderExt> workOrderExtList = new ArrayList<>();
for (String orderNo : orderNoList) {
MesWorkOrderExt workOrderExt = getWorkOrderExtByOrderNo(organizeCode, orderNo);
@ -746,7 +893,23 @@ public class SxWorkOrderExtService implements ISxWorkOrderExtService {
}
workOrderExtList.add(workOrderExt);
}
return workOrderExtList;
}
private void checkPauseOrderValid(MesWorkOrderExt workOrderExt) {
boolean isCreate = MesPcnExtEnumUtil.WORK_ORDER_STATUS.CREATE.getValue() == workOrderExt.getWorkOrderStatus();
boolean isLanded = MesPcnExtEnumUtil.WORK_ORDER_STATUS.LANDED.getValue() == workOrderExt.getWorkOrderStatus();
boolean isOpen = MesPcnExtEnumUtil.WORK_ORDER_STATUS.OPEN.getValue() == workOrderExt.getWorkOrderStatus();
if (!isCreate && !isLanded && !isOpen) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES_PCN.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("工单[%s]的状态不是启动,下达,创建状态,不能暂停", workOrderExt.getOrderNo())
.build();
}
}
private void checkOperateOrderValid(Integer workOrderStatus, List<MesWorkOrderExt> workOrderExtList) {
Map<Integer, List<MesWorkOrderExt>> listMap = workOrderExtList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesWorkOrderExt::getWorkOrderStatus));
if (listMap.size() > 1) {
throw ImppExceptionBuilder.newInstance()
@ -769,216 +932,104 @@ public class SxWorkOrderExtService implements ISxWorkOrderExtService {
}
}
}
}
// 一个工单号下的多个工单
for (MesWorkOrderExt workOrderExt : workOrderExtList) {
Integer lastWorkOrderStatus = null;
//启动
if (MesPcnExtEnumUtil.WORK_ORDER_STATUS.OPEN.getValue() == workOrderStatus) {
if (MesPcnExtEnumUtil.WORK_ORDER_STATUS.LANDED.getValue() == workOrderExt.getWorkOrderStatus()) {
//调用启动工单附属启动的方法
//校验是否存在已经启动的工单
List<MesWorkOrderExt> landedOrderList = getWorkOrderListByCenterAndStatus(organizeCode, workOrderExt.getWorkCenterCode(), MesPcnExtEnumUtil.WORK_ORDER_STATUS.LANDED.getValue());
if (CollectionUtils.isEmpty(landedOrderList)) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES_PCN.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("生产线[%s]暂无下达状态的工单,请刷新界面重试", workOrderExt.getWorkCenterCode())
.build();
}
if (!landedOrderList.get(0).getOrderNo().equals(workOrderExt.getOrderNo())) {
throw ImppExceptionBuilder.newInstance().setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("工单[%s]的工单序号不是生产线[%s]下工单中最小的序号", workOrderExt.getOrderNo(), workOrderExt.getWorkCenterCode())
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES_PCN.getCode())
.build();
}
if (MesPcnExtEnumUtil.WORK_ORDER_SN_CREATE_STATUS.UN_CREATE.getValue() == workOrderExt.getSnCreateStatus()) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES_PCN.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("工单[%s]未生成产品条码,不能启动", workOrderExt.getOrderNo())
.build();
}
} else if (MesPcnExtEnumUtil.WORK_ORDER_STATUS.PAUSE.getValue() == workOrderExt.getWorkOrderStatus()) {
//更改未暂停前状态
//获取暂停前的状态
List<MesWorkOrderLog> workOrderLogList = workOrderLogExtService.getWorkOrderLogList(organizeCode, workOrderExt.getOrderNo());
if (CollectionUtils.isEmpty(workOrderLogList)) {
throw ImppExceptionBuilder.newInstance().setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("工单号[%s]缺失履历信息,操作失败", workOrderExt.getOrderNo())
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES_PCN.getCode())
.build();
}
workOrderLogList = workOrderLogList.stream().sorted(Comparator.comparing(MesWorkOrderLog::getModifyDatetime).reversed()).collect(Collectors.toList());
lastWorkOrderStatus = MesPcnExtEnumUtil.WORK_ORDER_STATUS.LANDED.getValue();
for (MesWorkOrderLog workOrderLog : workOrderLogList) {
if (null == workOrderLog) {
continue;
}
if (workOrderLog.getWorkOrderStatus() != MesPcnExtEnumUtil.WORK_ORDER_STATUS.PAUSE.getValue()) {
lastWorkOrderStatus = workOrderLog.getWorkOrderStatus();
break;
}
}
if (lastWorkOrderStatus == MesPcnExtEnumUtil.WORK_ORDER_STATUS.OPEN.getValue()) {
if (MesPcnExtEnumUtil.WORK_ORDER_SN_CREATE_STATUS.UN_CREATE.getValue() == workOrderExt.getSnCreateStatus()) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES_PCN.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("工单[%s]未生成产品条码,不能启动", workOrderExt.getOrderNo())
.build();
}
}
}else {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES_PCN.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("工单[%s]状态为[%s],不能启动",
workOrderExt.getOrderNo(), MesPcnExtEnumUtil.WORK_ORDER_STATUS.valueOfDescription(workOrderExt.getWorkOrderStatus()))
.build();
}
private void checkRemoveOrderValid(String organizeCode, String userInfo, MesWorkOrderExt workOrderExt) {
if (workOrderExt.getCompleteQty() > 0) {
throw ImppExceptionBuilder.newInstance().setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("工单号【%s】的完成数量大于0不能删除", workOrderExt.getOrderNo())
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorSolution("校验生产工单表数据")
.build();
} else if(workOrderExt.getCompleteQty() == 0){
// 要自动解绑已绑定的关键件 看一下是什么
DdlPackBean packBeanBind = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(workOrderExt.getOrderNo(),MesPcnExtConstWords.WORK_ORDER_NO,packBeanBind);
List<MesProdBindRecordExt> prodBindRecordExtList = prodBindRecordExtRepository.findByHqlWhere(packBeanBind);
prodBindRecordExtList.forEach(p -> {
p.setActionType(MesPcnExtEnumUtil.MES_ACTION_TYPE.UNTYING.getValue());
ConvertBean.serviceModelUpdate(p, userInfo);
new ConvertBeanExt(p).convertBean(p);
});
if (!CollectionUtils.isEmpty(prodBindRecordExtList)) prodBindRecordExtRepository.saveAll(prodBindRecordExtList);
}
}
if (workOrderExt.getWorkOrderType() != MesPcnExtEnumUtil.WORK_ORDER_TYPE.REWORK_ORDER.getValue() &&
MesPcnExtEnumUtil.WORK_ORDER_STATUS.OPEN.getValue() == workOrderStatus &&
(null == lastWorkOrderStatus || MesPcnExtEnumUtil.WORK_ORDER_STATUS.OPEN.getValue() == lastWorkOrderStatus)) {
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
List<MesAffiliatedStartConfig> mesAffiliatedStartConfigs = affiliatedStartConfigRepository.findByHqlWhere(ddlPackBean);
int totalConfigSize = CollectionUtils.isEmpty(mesAffiliatedStartConfigs) ? 0 : mesAffiliatedStartConfigs.size();
log.info("总配置类信息" + mesAffiliatedStartConfigs + "总配置数量" + totalConfigSize);
for (MesAffiliatedStartConfig mesAffiliatedStartConfig : mesAffiliatedStartConfigs) {
try {
log.info("点检启动配置类信息" + mesAffiliatedStartConfig);
IWorkOrderStartService workOrderStartService = (IWorkOrderStartService) SpringContextsUtil.getBean(mesAffiliatedStartConfig.getAffiliatedStartClass());
log.info(workOrderStartService.getClass().getName() + "点检开始执行调用");
workOrderStartService.doGenCheckOrder(workOrderExt, userInfo);
log.info(workOrderStartService.getClass().getName() + "点检开始执行结束");
} catch (Exception e) {
log.error("点检开始执行异常" + e.getMessage());
StackTraceElement[] stackTrace = e.getStackTrace();
log.error(Arrays.toString(stackTrace));
}
}
}
} else if (MesPcnExtEnumUtil.WORK_ORDER_STATUS.PAUSE.getValue() == workOrderStatus) {
//暂停
//校验工单是否是启动状态
boolean isCreate = MesPcnExtEnumUtil.WORK_ORDER_STATUS.CREATE.getValue() == workOrderExt.getWorkOrderStatus();
boolean isLanded = MesPcnExtEnumUtil.WORK_ORDER_STATUS.LANDED.getValue() == workOrderExt.getWorkOrderStatus();
boolean isOpen = MesPcnExtEnumUtil.WORK_ORDER_STATUS.OPEN.getValue() == workOrderExt.getWorkOrderStatus();
if (!isCreate && !isLanded && !isOpen) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES_PCN.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("工单[%s]的状态不是启动,下达,创建状态,不能暂停", workOrderExt.getOrderNo())
.build();
private void doGenerateCheckOrder(Integer workOrderStatus, String organizeCode, String userInfo, MesWorkOrderExt workOrderExt, Integer lastWorkOrderStatus) {
if (workOrderExt.getWorkOrderType() != MesPcnExtEnumUtil.WORK_ORDER_TYPE.REWORK_ORDER.getValue() &&
MesPcnExtEnumUtil.WORK_ORDER_STATUS.OPEN.getValue() == workOrderStatus &&
(null == lastWorkOrderStatus || MesPcnExtEnumUtil.WORK_ORDER_STATUS.OPEN.getValue() == lastWorkOrderStatus)) {
List<MesAffiliatedStartConfig> mesAffiliatedStartConfigs = getMesAffiliatedStartConfigs(organizeCode);
int totalConfigSize = CollectionUtils.isEmpty(mesAffiliatedStartConfigs) ? 0 : mesAffiliatedStartConfigs.size();
log.info("总配置类信息:" + mesAffiliatedStartConfigs + "总配置数量:" + totalConfigSize);
for (MesAffiliatedStartConfig mesAffiliatedStartConfig : mesAffiliatedStartConfigs) {
try {
log.info("点检启动配置类信息" + mesAffiliatedStartConfig);
IWorkOrderStartService workOrderStartService = (IWorkOrderStartService) SpringContextsUtil.getBean(mesAffiliatedStartConfig.getAffiliatedStartClass());
log.info(workOrderStartService.getClass().getName() + "点检开始执行调用");
workOrderStartService.doGenCheckOrder(workOrderExt, userInfo);
log.info(workOrderStartService.getClass().getName() + "点检开始执行结束");
} catch (Exception e) {
log.error("点检开始执行异常" + e.getMessage());
StackTraceElement[] stackTrace = e.getStackTrace();
log.error(Arrays.toString(stackTrace));
}
String key = new StringJoiner(MesPcnExtConstWords.COLON).add("MES-PAUSE-ORDER").add(workOrderExt.getOrderNo()).toString();
}
}
}
//String workCenterWoPauseKey = new StringJoiner(MesPcnExtConstWords.COLON).add("MES-PAUSE-ORDER").add(workOrderExt.getWorkCenterCode()).toString();
private Integer getLastWorkOrderStatus(String organizeCode, MesWorkOrderExt workOrderExt) {
//redisMesPcn.putObject(workCenterWoPauseKey, workOrderExt.getOrderNo());
List<MesWorkOrderLog> workOrderLogList = getMesWorkOrderLogs(organizeCode, workOrderExt);
redisMesPcn.putObject(key, workOrderExt.getOrderNo(), MesPcnEnumUtil.EXPIRE_TIME.ONE_MIN.getValue());
workOrderLogList = workOrderLogList.stream().sorted(Comparator.comparing(MesWorkOrderLog::getModifyDatetime).reversed()).collect(Collectors.toList());
} else if (MesPcnExtEnumUtil.WORK_ORDER_STATUS.CLOSE.getValue() == workOrderStatus) {
/*//关闭
//校验工单是否是暂停状态
if (MesPcnExtEnumUtil.WORK_ORDER_STATUS.PAUSE.getValue() != workOrderExt.getWorkOrderStatus()) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES_PCN.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("工单[%s]的状态不是暂停状态,不能关闭", workOrderExt.getOrderNo())
.build();
}*/
} else if (MesPcnExtEnumUtil.WORK_ORDER_STATUS.CLOSE.getValue() == workOrderStatus) {
//完成
//校验工单是否是暂停状态
//修改返工工单状态
//if(workOrderExt.getWorkOrderType() == MesPcnExtEnumUtil.WORK_ORDER_TYPE.REWORK_ORDER.getValue()) {
//
// List<String> waterPurifierCodeList = !Optional.ofNullable(waterPurifierCode).isPresent() || StringUtils.isEmpty(waterPurifierCode.getCfgValue()) ? new ArrayList<>() : Arrays.asList(waterPurifierCode.getCfgValue().split(MesPcnExtConstWords.COMMA));
// if(CollectionUtils.isEmpty(waterPurifierCodeList) || !waterPurifierCodeList.contains(workOrderExt.getWorkCenterCode())){
// // 手动点击完成工单,存在未下线条码
// if(!workOrderExt.getQty().equals(workOrderExt.getCompleteQty())) {
// List<MesProduceSnRepair> produceSnRepairList = queryProduceSnRepairList(organizeCode, workOrderExt.getOrderNo());
// if(!CollectionUtils.isEmpty(produceSnRepairList)) {
// // 未下线条码
// produceSnRepairList = produceSnRepairList.stream().filter(o -> StringUtils.isEmpty(o.getOutWorkCenterTime())).collect(Collectors.toList());
//
// if(!CollectionUtils.isEmpty(produceSnRepairList)){
// List<String> serialNumberList = produceSnRepairList.stream().map(MesProduceSnRepair::getSerialNumber).collect(Collectors.toList());
//
// updateProduceSnRepair(organizeCode, serialNumberList);
//
// updatePackage(organizeCode, serialNumberList);
//
// unbindReworkRangeList(organizeCode, workOrderExt, serialNumberList, userInfo);
//
// clearProdBindRecord(organizeCode, workOrderExt, TimeTool.getNowTime(true), serialNumberList, userInfo);
// }
// }
// }
//
// //reworkOrderRepository.updateByProperties(new String[]{MesPcnExtConstWords.REWORK_ORDER_NO}, new Object[]{workOrderExt.getOrderNo()},
// // new String[]{ MesPcnExtConstWords.WORK_ORDER_STATUS, MesPcnExtConstWords.SYSTEM_SYNC_STATUS, MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME},
// // new Object[]{MesPcnExtEnumUtil.WORK_ORDER_STATUS.CLOSE.getValue(), MesPcnExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue(), AuthUtil.getSessionUser().getUserName(), TimeTool.getNowTime(true)});
// }
//}
/*if (MesExtEnumUtil.WORK_ORDER_STATUS.PAUSE.getValue() != mesWorkOrder.getWorkOrderStatus()) {
throw ImppExceptionBuilder.newInstance().setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("工单号【%s】的工单状态不是暂停状态不能完成", mesWorkOrder.getOrderNo())
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorSolution("校验生产工单表数据")
.build();
}*/
} else if (MesPcnExtEnumUtil.WORK_ORDER_STATUS.REMOVE.getValue() == workOrderStatus) {
//删除
//校验工单是否是暂停状态
/*if (MesExtEnumUtil.WORK_ORDER_STATUS.PAUSE.getValue() != mesWorkOrder.getWorkOrderStatus()) {
*//*if (MesExtEnumUtil.WORK_ORDER_STATUS.CREATE.getValue() != mesWorkOrder.getWorkOrderStatus()){
throw ImppExceptionBuilder.newInstance().setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("工单号【%s】的工单状态不是暂停或启动状态不能删除", mesWorkOrder.getOrderNo())
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorSolution("校验生产工单表数据")
.build();
}*//*
}*/
if (workOrderExt.getCompleteQty() > 0){
throw ImppExceptionBuilder.newInstance().setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("工单号【%s】的完成数量大于0不能删除", workOrderExt.getOrderNo())
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode())
.setErrorSolution("校验生产工单表数据")
.build();
}else if(workOrderExt.getCompleteQty() == 0){
// 要自动解绑已绑定的关键件 看一下是什么
DdlPackBean packBeanBind = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(workOrderExt.getOrderNo(),MesPcnExtConstWords.WORK_ORDER_NO,packBeanBind);
List<MesProdBindRecordExt> prodBindRecordExtList = prodBindRecordExtRepository.findByHqlWhere(packBeanBind);
prodBindRecordExtList.forEach(p -> {
p.setActionType(MesPcnExtEnumUtil.MES_ACTION_TYPE.UNTYING.getValue());
ConvertBean.serviceModelUpdate(p, userInfo);
new ConvertBeanExt(p).convertBean(p);
});
if (!CollectionUtils.isEmpty(prodBindRecordExtList)) prodBindRecordExtRepository.saveAll(prodBindRecordExtList);
}
Integer initLastWorkOrderStatus = MesPcnExtEnumUtil.WORK_ORDER_STATUS.LANDED.getValue();
for (MesWorkOrderLog workOrderLog : workOrderLogList) {
if (null == workOrderLog) {
continue;
}
if (null == lastWorkOrderStatus) {
workOrderExt.setWorkOrderStatus(workOrderStatus);
} else {
workOrderExt.setWorkOrderStatus(lastWorkOrderStatus);
if (workOrderLog.getWorkOrderStatus() != MesPcnExtEnumUtil.WORK_ORDER_STATUS.PAUSE.getValue()) {
initLastWorkOrderStatus = workOrderLog.getWorkOrderStatus();
break;
}
ConvertBean.serviceModelUpdate(workOrderExt, userInfo);
workOrderExt.setSystemSyncStatus(MesPcnExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue());
new ConvertBeanExt(workOrderExt).convertBean(workOrderExt);
MesWorkOrderExt mesWorkOrderDb = workOrderExtRepository.save(workOrderExt);
//生产工单日志
this.insertMesWorkOrderLog(mesWorkOrderDb);
}
return initLastWorkOrderStatus;
}
private void pauseRecordOrderNo(MesWorkOrderExt workOrderExt) {
String key = new StringJoiner(MesPcnExtConstWords.COLON).add("MES-PAUSE-ORDER").add(workOrderExt.getOrderNo()).toString();
redisMesPcn.putObject(key, workOrderExt.getOrderNo(), MesPcnEnumUtil.EXPIRE_TIME.ONE_MIN.getValue());
}
private MesWorkOrderExt saveMesWorkOrderExt(Integer workOrderStatus, String userInfo, MesWorkOrderExt workOrderExt, Integer lastWorkOrderStatus) {
workOrderExt.setWorkOrderStatus(lastWorkOrderStatus == null ? workOrderStatus : lastWorkOrderStatus);
ConvertBean.serviceModelUpdate(workOrderExt, userInfo);
workOrderExt.setSystemSyncStatus(MesPcnExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue());
new ConvertBeanExt(workOrderExt).convertBean(workOrderExt);
MesWorkOrderExt mesWorkOrderDb = workOrderExtRepository.save(workOrderExt);
//生产工单日志
this.insertMesWorkOrderLog(mesWorkOrderDb);
return mesWorkOrderDb;
}
private List<MesAffiliatedStartConfig> getMesAffiliatedStartConfigs(String organizeCode) {
List<MesAffiliatedStartConfig> mesAffiliatedStartConfigs = affiliatedStartConfigRepository.findByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue()});
return mesAffiliatedStartConfigs;
}
private List<MesWorkOrderLog> getMesWorkOrderLogs(String organizeCode, MesWorkOrderExt workOrderExt) {
List<MesWorkOrderLog> workOrderLogList = workOrderLogExtService.getWorkOrderLogList(organizeCode, workOrderExt.getOrderNo());
if (CollectionUtils.isEmpty(workOrderLogList)) {
throw ImppExceptionBuilder.newInstance().setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("工单号[%s]缺失履历信息,操作失败", workOrderExt.getOrderNo())
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES_PCN.getCode())
.build();
}
return workOrderLogList;
}
private List<MesProduceSnRepair> queryProduceSnRepairList(String organizeCode, String orderNo) {
@ -1055,7 +1106,7 @@ public class SxWorkOrderExtService implements ISxWorkOrderExtService {
//}
//DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
//DdlPreparedPack.getStringEqualPack(mesWorkOrder.getOrderNo(), MesExtConstWords.REWORK_ORDER_NO, packBean);
//DdlPreparedPack.getStringEqualPack(mesWorkOrder.getOrderNo(), MesPcnExtConstWords.REWORK_ORDER_NO, packBean);
//List<MesReworkRange> reworkRangeList = reworkRangeRepository.findByHqlWhere(packBean);
//
//reworkRangeList = reworkRangeList.stream().filter(o -> serialNumberList.contains(o.getSerialNumber())).collect(Collectors.toList());

@ -169,6 +169,7 @@ class SxBuOqcHandlerFactory {
}
Map<String, String> prodMap = new HashMap<>();
prodMap.put(MesPcnExtConstWords.WORK_ORDER_NO, produceSn.getLastWorkOrderNo());
prodMap.put(MesPcnExtConstWords.SERIAL_NUMBER, produceSn.getSerialNumber());
prodMap.put(MesPcnExtConstWords.PRODUCT_SN, produceSn.getProductSn());
prodMap.put(MesPcnExtConstWords.PACKAGENO, produceSn.getPackageNo());

@ -1355,7 +1355,7 @@ public class JxOqcManageService implements IJxOqcManageService {
prodMapList.add(0, snOp.get());
}
private List<Map<String, String>> checkProdMapListBySn4CheckUnqualified(List<Map<String, String>> prodMapList, JxOqcManageModel result) {
private List<Map<String, String>> checkProdMapListBySn4CheckUnqualified(List<Map<String, String>> prodMapList, JxOqcManageModel result, SxBuOqcDataModel dataFromPcn) {
if (CollectionUtils.isEmpty(prodMapList)) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES_PCN.getCode())
@ -1380,9 +1380,19 @@ public class JxOqcManageService implements IJxOqcManageService {
.build();
}
if ((!dataFromPcn.getShiftCode().equals(result.getShiftCode())) || (!dataFromPcn.getWorkTime().equals(result.getWorkTime()))) {
throw ImppExceptionBuilder.newInstance()
.setSystemID(CommonEnumUtil.SOFT_TYPE.MES_PCN.getCode())
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
.setErrorDetail("检验单不合格:当前扫描条码[%s]作业时间[%s]班次代码[%s]与检验单[%s]作业时间[%s]班次代码[%s]不一致,操作失败", result.getProductSn(), dataFromPcn.getWorkTime(), dataFromPcn.getShiftCode(), result.getOqcNo(), result.getWorkTime(), result.getShiftCode())
.build();
}
prodMapList = prodMapList.stream().filter(o -> (null != o && !result.getProductSn().equals(o.get(MesPcnExtConstWords.PRODUCT_SN)))).collect(Collectors.toList());
prodMapList = prodMapList.stream().filter(o -> (null != o && snOp.get().get(MesPcnExtConstWords.OUT_WC_TIME).compareTo(o.get(MesPcnExtConstWords.OUT_WC_TIME)) >= 0)).collect(Collectors.toList());
prodMapList = prodMapList.stream().filter(o -> (null != o &&
snOp.get().get(MesPcnExtConstWords.OUT_WC_TIME).compareTo(o.get(MesPcnExtConstWords.OUT_WC_TIME)) >= 0)
).collect(Collectors.toList());
if (CollectionUtils.isEmpty(prodMapList)) prodMapList = new ArrayList<>();
@ -1493,11 +1503,6 @@ public class JxOqcManageService implements IJxOqcManageService {
//检验条码明细
List<MesOqcCheckPackageDetail> oqcCheckPackageDetailList = oqcCheckService.getOqcCheckPackageDetailListByOqcNo(model.getOrganizeCode(), model.getOqcNo());
if (StringUtils.isEmpty(model.getSn())) {
oqcCheckPackageDetailList.stream().map(MesOqcCheckPackageDetail::getProductSn).collect(Collectors.toList());
model.getSn();
}
//检验条码中间表明细
List<MesOqcCheckPackageIf> oqcCheckPackageIfList = oqcCheckService.getOqcCheckPackageIfListByOqcNo(model.getOrganizeCode(), model.getOqcNo());
@ -1524,7 +1529,7 @@ public class JxOqcManageService implements IJxOqcManageService {
return;
}
JxOqcManageModel result = new JxOqcManageModel(oqcCheckDb.getOrganizeCode(), paramModel.getUserId(), paramModel.getUserInfo(), oqcCheckDb.getOqcNoType());
JxOqcManageModel result = new JxOqcManageModel(oqcCheckDb.getOrganizeCode(), paramModel.getUserId(), paramModel.getUserInfo(), oqcCheckDb.getOqcNoType(), paramModel.getSn(), paramModel.getWorkOrderNo(), oqcCheckDb.getShiftCode(), oqcCheckDb.getWorkTime(), oqcCheckDb.getOqcNo());
//获取PCN工单条码物料产量信息
SxBuOqcDataModel dataFromPcn = getBuOqcDataModel(result, MesPcnExtEnumUtil.OQC_MANAGE_ACTION_TYPE.SERIAL_NUMBER.getExecClass());
@ -1538,7 +1543,7 @@ public class JxOqcManageService implements IJxOqcManageService {
prodMapList = (CollectionUtils.isEmpty(prodMapList) || CollectionUtils.isEmpty(snList)) ? prodMapList :
prodMapList.stream().filter(o -> (null != o && !snList.contains(o.get(MesPcnExtConstWords.PRODUCT_SN)))).collect(Collectors.toList());
prodMapList = checkProdMapListBySn4CheckUnqualified(prodMapList, result);
prodMapList = checkProdMapListBySn4CheckUnqualified(prodMapList, result, dataFromPcn);
//获取产量统计出货检验
MesOutPutStatisticsOqc outPutStatisticsOqc = outPutStatisticsOqcRepository.getByProperty(

@ -0,0 +1,108 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.bean;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil;
import cn.estsh.i3plus.pojo.base.annotation.AnnoOutputColumn;
import cn.estsh.i3plus.pojo.base.bean.BaseBean;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.hibernate.annotations.ColumnDefault;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import org.springframework.format.annotation.DateTimeFormat;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Index;
import javax.persistence.Table;
import java.io.Serializable;
/**
* @Description:
* @Author: xiangming.liao
* @Date: 2021/01/14 20:03
* @Modify:
*/
@Data
@Entity
@DynamicInsert
@DynamicUpdate
@EqualsAndHashCode(callSuper = true)
@Table(name = "MES_BOM_PENDING_PART", indexes = {
@Index(columnList = "SYSTEM_SYNC_STATUS"),
@Index(columnList = "PART_NO"),
@Index(columnList = "ITEM_PART_NO"),
@Index(columnList = "PART_NO,IS_TOOK_EFFECT"),
@Index(columnList = "IS_REMIND,IS_TOOK_EFFECT")
})
@Api("MES_BOM待生效成品表")
public class MesBomPendingPart extends BaseBean implements Serializable {
private static final long serialVersionUID = 7689475809123434963L;
@Column(name = "PART_NO")
@ApiParam("父零件号")
private String partNo;
@Column(name = "PART_NAME")
@ApiParam("父零件名称")
private String partName;
@Column(name = "UNIT")
@ApiParam("单位")
private String unit;
@Column(name = "QTY" )
@ColumnDefault("0")
@ApiParam(value = "数量",example = "0")
private Double qty;
@Column(name = "ITEM_PART_NO")
@ApiParam("子零件编码")
private String itemPartNo;
@Column(name = "ITEM_PART_NAME")
@ApiParam("子零件名称")
private String itemPartName;
@Column(name = "ITEM_UNIT")
@ApiParam("子零件单位")
private String itemUnit;
@Column(name = "ITEM_QTY")
@ColumnDefault("0")
@ApiParam(value = "子零件数量",example = "0")
private Double itemQty;
@Column(name = "BOM_VERSION")
@ApiParam("BOM版本")
private String bomVersion;
@Column(name = "EFF_START_TIME")
@ApiParam("生效时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private String effStartTime;
@Column(name = "EFF_END_TIME")
@ApiParam("失效时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private String effEndTime;
@Column(name = "IS_REMIND")
@ApiParam("是否已提醒")
@ColumnDefault("2")
@AnnoOutputColumn(refClass = MesPcnExtEnumUtil.TRUE_OR_FALSE.class, refForeignKey = "value", value = "description")
private Integer isReminded;
@Column(name = "IS_TOOK_EFFECT")
@ApiParam("是否已生效")
@ColumnDefault("2")
@AnnoOutputColumn(refClass = MesPcnExtEnumUtil.TRUE_OR_FALSE.class, refForeignKey = "value", value = "description")
private Integer isTookEffect;
@Column(name = "SYSTEM_SYNC_STATUS")
@ColumnDefault("2")
@ApiParam(value = "系统同步标志")
public Integer systemSyncStatus = 2;
}

@ -137,4 +137,8 @@ public class MesEquipmentCheckDetail extends BaseBean implements Serializable {
@ApiParam("结果值")
private String resultValue;
@Column(name = "PROBE_NO")
@ApiParam("探头号")
private String probeNo;
}

@ -4,7 +4,6 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import javax.persistence.Column;
import java.util.List;
/**
@ -16,6 +15,7 @@ import java.util.List;
@Data
@ApiModel("BOM生效model")
public class BomTakeEffectModel {
@ApiParam("WmsBomTotal集合")
private List<WmsBomTotalModel> wmsBomTotalModels;

@ -5,7 +5,6 @@ import io.swagger.annotations.ApiParam;
import lombok.Data;
import org.hibernate.annotations.ColumnDefault;
import javax.persistence.Column;
import java.io.Serializable;
/**

@ -186,6 +186,18 @@ public class JxOqcManageModel implements Serializable {
this.oqcNoType = oqcNoType;
}
public JxOqcManageModel(String organizeCode, String userId, String userInfo, Integer oqcNoType, String productSn, String workOrderNo, String shiftCode, String workTime, String oqcNo) {
this.organizeCode = organizeCode;
this.userId = userId;
this.userInfo = userInfo;
this.oqcNoType = oqcNoType;
this.productSn = productSn;
this.workOrderNo = workOrderNo;
this.shiftCode = shiftCode;
this.workTime = workTime;
this.oqcNo = oqcNo;
}
public JxOqcManageModel(String organizeCode, String userId, String userInfo, String sn, String idStr) {
this.organizeCode = organizeCode;
this.userId = userId;

@ -0,0 +1,15 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.repository;
import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesBomPendingPart;
import cn.estsh.i3plus.pojo.base.jpa.dao.BaseRepository;
import org.springframework.stereotype.Repository;
/**
* @author xinwang.yi
* @version 1.0
* @date 2023/11/16 9:17
**/
@Repository
public interface MesBomPendingPartRepository extends BaseRepository<MesBomPendingPart, Long> {
}

@ -555,6 +555,15 @@ public class MesPcnExtEnumUtil {
return tmp;
}
public static WORK_ORDER_STATUS getByValue(int value) {
for (WORK_ORDER_STATUS valueType : values()) {
if (valueType.getValue() == value) {
return valueType;
}
}
return null;
}
}
/**

Loading…
Cancel
Save