|
|
|
@ -3,6 +3,7 @@ package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base;
|
|
|
|
|
import cn.estsh.i3plus.ext.mes.api.base.*;
|
|
|
|
|
import cn.estsh.i3plus.ext.mes.apiservice.dao.IMesWorkOrderDao;
|
|
|
|
|
import cn.estsh.i3plus.ext.mes.apiservice.unit.exception.MesException;
|
|
|
|
|
import cn.estsh.i3plus.ext.mes.apiservice.utils.BeanMapUtilsExt;
|
|
|
|
|
import cn.estsh.i3plus.ext.mes.pojo.constant.MesCommonConstant;
|
|
|
|
|
import cn.estsh.i3plus.mes.api.iservice.busi.ISyncFuncService;
|
|
|
|
|
import cn.estsh.i3plus.mes.apiservice.util.DateUtil;
|
|
|
|
@ -30,8 +31,6 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
import org.springframework.util.StringUtils;
|
|
|
|
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
|
|
import java.math.RoundingMode;
|
|
|
|
|
import java.util.*;
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
@ -47,7 +46,7 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
@Autowired
|
|
|
|
|
private MesProductVersionRepository mesProductVersionRDao;
|
|
|
|
|
@Autowired
|
|
|
|
|
private MesBomRepository mesBomRDao;
|
|
|
|
|
private IMesBomService mesBomService;
|
|
|
|
|
@Autowired
|
|
|
|
|
private IMesProductOffLineService mesProductOffLineService;
|
|
|
|
|
@Autowired
|
|
|
|
@ -76,6 +75,12 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
private IMesPartSapService mesPartSapService;
|
|
|
|
|
@Autowired
|
|
|
|
|
private MesMoveRepository mesMoveRDao;
|
|
|
|
|
@Autowired
|
|
|
|
|
private IMesWorkOrderToWmsService mesWorkOrderToWmsService;
|
|
|
|
|
@Autowired
|
|
|
|
|
private MesPartSapRepository mesPartSapRDao;
|
|
|
|
|
@Autowired
|
|
|
|
|
private MesPartProdGroupRepository mesPartProdGroupRDao;
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public MesWorkOrder insert(MesWorkOrder bean) {
|
|
|
|
@ -89,36 +94,33 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{"produceSeq"}, orderPackBean);
|
|
|
|
|
MesWorkOrder result = baseRDao.getByProperty(orderPackBean);
|
|
|
|
|
|
|
|
|
|
//生成工单号
|
|
|
|
|
GenSerialNoModel genSerialNoModel = new GenSerialNoModel(MesCommonConstant.MES_WORK_ORDER_NO);
|
|
|
|
|
List<String> orderList = syncFuncService.syncSerialNo(genSerialNoModel, bean.getCreateUser(), bean.getOrganizeCode(), 1).getResultList();
|
|
|
|
|
String orderNo = orderList.get(0);
|
|
|
|
|
orderPackBean = DdlPackBean.getDdlPackBean(bean.getOrganizeCode());
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(orderNo, "workOrderNo", orderPackBean);
|
|
|
|
|
if (baseRDao.isExitByHql(orderPackBean)) {
|
|
|
|
|
MesException.throwMesBusiException("单号流水码生成重复");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
GenSerialNoModel genSerialNoModel = new GenSerialNoModel();
|
|
|
|
|
//若工单类型为排序 则根据排序插入工单数量插入多行 工单数量为1
|
|
|
|
|
if (bean.getWorkOrderType() == MesExtEnumUtil.ORDER_TYPE.SORT.getValue()) {
|
|
|
|
|
Long produceSeq = 0L;
|
|
|
|
|
if (null != result && result.getProduceSeq() != null) {
|
|
|
|
|
produceSeq = (long) Math.toIntExact(result.getProduceSeq());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//生成工单号
|
|
|
|
|
genSerialNoModel = new GenSerialNoModel(MesCommonConstant.MES_WORK_ORDER_NO);
|
|
|
|
|
List<String> resultList = syncFuncService.syncSerialNo(genSerialNoModel, bean.getCreateUser(), bean.getOrganizeCode(), 1).getResultList();
|
|
|
|
|
|
|
|
|
|
MesWorkOrder copyMesWorkOrder = new MesWorkOrder();
|
|
|
|
|
BeanUtils.copyProperties(bean, copyMesWorkOrder);
|
|
|
|
|
copyMesWorkOrder.setProduceSeq((long) (produceSeq + 1));
|
|
|
|
|
copyMesWorkOrder.setQty(1D);
|
|
|
|
|
copyMesWorkOrder.setWorkOrderNo(resultList.get(0));
|
|
|
|
|
copyMesWorkOrder.setWorkOrderNo(orderNo);
|
|
|
|
|
copyMesWorkOrder.setSystemSyncStatus(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
|
|
|
|
|
ConvertBean.serviceModelInitialize(copyMesWorkOrder, bean.getCreateUser());
|
|
|
|
|
|
|
|
|
|
baseRDao.insert(copyMesWorkOrder);
|
|
|
|
|
workOrderLogService.saveMesWorkOrderLog(copyMesWorkOrder);
|
|
|
|
|
return bean;
|
|
|
|
|
} else if (bean.getWorkOrderType() == MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue()) {
|
|
|
|
|
//生成工单号
|
|
|
|
|
genSerialNoModel = new GenSerialNoModel(MesCommonConstant.MES_WORK_ORDER_NO);
|
|
|
|
|
} else {
|
|
|
|
|
//生成工单号
|
|
|
|
|
genSerialNoModel = new GenSerialNoModel(MesCommonConstant.MES_WORK_ORDER_NO);
|
|
|
|
|
} else if (bean.getWorkOrderType() == MesExtEnumUtil.ORDER_TYPE.BTO.getValue()) {
|
|
|
|
|
Long produceSeq = 0L;
|
|
|
|
|
if (null != result && result.getProduceSeq() != null) {
|
|
|
|
|
produceSeq = (long) Math.toIntExact(result.getProduceSeq());
|
|
|
|
@ -127,10 +129,8 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
GenSerialNoModel orderSeqSerialNoModel = new GenSerialNoModel(MesCommonConstant.ORDER_NO_BTO_SEQ);
|
|
|
|
|
List<String> resultList = syncFuncService.syncSerialNo(orderSeqSerialNoModel, bean.getCreateUser(), bean.getOrganizeCode(), 1).getResultList();
|
|
|
|
|
bean.setWorkOrderSeq(resultList.get(0));
|
|
|
|
|
// bean.setOrderSeq(Integer.parseInt(resultList.get(0)));
|
|
|
|
|
}
|
|
|
|
|
List<String> resultList = syncFuncService.syncSerialNo(genSerialNoModel, bean.getCreateUser(), bean.getOrganizeCode(), 1).getResultList();
|
|
|
|
|
bean.setWorkOrderNo(resultList.get(0));
|
|
|
|
|
bean.setWorkOrderNo(orderNo);
|
|
|
|
|
bean.setQty(bean.getQty());
|
|
|
|
|
bean.setSystemSyncStatus(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
|
|
|
|
|
ConvertBean.serviceModelInitialize(bean, bean.getCreateUser());
|
|
|
|
@ -153,9 +153,9 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
//更新工单数量
|
|
|
|
|
if (!bean.getQty().equals(result.getQty()) && result.getWorkOrderStatus() > MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue()) {
|
|
|
|
|
MesException.throwMesBusiException(String.format("工单状态为【%s】不允许更新工单数量", MesExtEnumUtil.ORDER_STATUS.valueOfDescription(result.getWorkOrderStatus())));
|
|
|
|
|
}else{
|
|
|
|
|
} else {
|
|
|
|
|
result.setQty(bean.getQty());
|
|
|
|
|
result.setUnCompleteQty(MathOperation.sub(bean.getQty(),result.getReportedQty()));
|
|
|
|
|
result.setUnCompleteQty(MathOperation.sub(bean.getQty(), result.getReportedQty()));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//在加工的工单不能修改物料信息
|
|
|
|
@ -167,7 +167,16 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//更新状态
|
|
|
|
|
if(result.getWorkOrderStatus().intValue() != bean.getWorkOrderStatus().intValue()){
|
|
|
|
|
if (result.getWorkOrderStatus().intValue() != bean.getWorkOrderStatus().intValue()) {
|
|
|
|
|
if (result.getWorkOrderStatus() == MesExtEnumUtil.ORDER_STATUS.CREATE.getValue()
|
|
|
|
|
&& bean.getWorkOrderStatus() == MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue()) {
|
|
|
|
|
//校验物料生产版本是否存在
|
|
|
|
|
MesProductVersion mesProductVersion = checkMesProductVersion(result);
|
|
|
|
|
//获取bom信息
|
|
|
|
|
List<MesBom> bomList = mesBomService.findMesBomByPartNoAndBomVersion(result.getPartNo(), result.getOrganizeCode(), mesProductVersion.getAlternativePartList());
|
|
|
|
|
//发送工单信息给WMS
|
|
|
|
|
mesWorkOrderToWmsService.insertBatch(mesWorkOrderToWmsService.saveMesWorkOrderToWms(result, bomList));
|
|
|
|
|
}
|
|
|
|
|
result.setWorkOrderStatus(bean.getWorkOrderStatus());
|
|
|
|
|
}
|
|
|
|
|
//修改工单,工单标识需要改为未同步
|
|
|
|
@ -196,10 +205,11 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
DdlPreparedPack.getStringSmallerPack(bean.getEndTimeEnd(), "planEndTime", packBean);
|
|
|
|
|
packBean.setOrderByStr(" order by createDatetime desc,workOrderSeq asc,workOrderNo asc ");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
protected void setBeanModel(List<MesWorkOrder> mesWorkOrderList) {
|
|
|
|
|
//查询工作中心名称
|
|
|
|
|
if(CollectionUtils.isEmpty(mesWorkOrderList)){
|
|
|
|
|
if (CollectionUtils.isEmpty(mesWorkOrderList)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
MesWorkOrder mesWorkOrder = mesWorkOrderList.iterator().next();
|
|
|
|
@ -207,10 +217,10 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
DdlPreparedPack.getInPackList(mesWorkOrderList.stream().map(MesWorkOrder::getWorkCenterCode).filter(workCenterCode -> !StringUtils.isEmpty(workCenterCode)).distinct().collect(Collectors.toList()), "workCenterCode", ddlPackBean);
|
|
|
|
|
List<MesWorkCenter> mesWorkCenterList = mesWorkCenterRDao.findByHqlWhere(ddlPackBean);
|
|
|
|
|
if (CollectionUtils.isEmpty(mesWorkCenterList)) {
|
|
|
|
|
return;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
Map<String, String> mesWorkCenterMap = mesWorkCenterList.stream().collect(Collectors.toMap(MesWorkCenter::getWorkCenterCode, MesWorkCenter::getWorkCenterName));
|
|
|
|
|
mesWorkOrderList.forEach(t->{
|
|
|
|
|
mesWorkOrderList.forEach(t -> {
|
|
|
|
|
t.setWorkCenterName(mesWorkCenterMap.get(t.getWorkCenterCode()));
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
@ -223,7 +233,6 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
ValidatorBean.checkNotNull(item.getWorkOrderType(), "工单类型不能为空");
|
|
|
|
|
ValidatorBean.checkNotNull(item.getWorkCenterCode(), "产线不能为空");
|
|
|
|
|
ValidatorBean.checkNotNull(item.getPartNo(), "零件号不能为空");
|
|
|
|
|
|
|
|
|
|
ValidatorBean.checkNotNull(item.getShiftCode(), "班次不能为空");
|
|
|
|
|
|
|
|
|
|
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(item.getOrganizeCode());
|
|
|
|
@ -233,30 +242,36 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
MesException.throwMesBusiException("产线【%s】不存在", item.getWorkCenterCode());
|
|
|
|
|
}
|
|
|
|
|
item.setErpWorkCenter(mesWorkCenter.getErpWorkCenter());
|
|
|
|
|
//客户物料信息
|
|
|
|
|
if (StringUtil.isEmpty(item.getCustPartNo())) {
|
|
|
|
|
getCustomerPart(item);
|
|
|
|
|
}
|
|
|
|
|
//校验标识
|
|
|
|
|
//若工单类型为排序
|
|
|
|
|
List<MesWorkOrderToWms> saveMesWorkOrderToWms = new ArrayList<>();
|
|
|
|
|
if (item.getWorkOrderType() == MesExtEnumUtil.ORDER_TYPE.SORT.getValue()) {
|
|
|
|
|
ValidatorBean.checkNotNull(item.getOrderFlag(), "标识不能为空");
|
|
|
|
|
//校验产线类型和工单类型是否匹配
|
|
|
|
|
if (!Objects.equals(mesWorkCenter.getCenterType(), MesExtEnumUtil.ORDER_TYPE.SORT.getValue())) {
|
|
|
|
|
MesException.throwMesBusiException("产线【%s】类型为【%s】,请选择排序产线", mesWorkCenter.getWorkCenterCode(),
|
|
|
|
|
MesExtEnumUtil.WORK_CENTER_TYPE.valueOfDescription(mesWorkCenter.getCenterType()));
|
|
|
|
|
}
|
|
|
|
|
//若工单类型为排序 标识为 N E P S
|
|
|
|
|
if (!MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.E.getValue().equals(item.getOrderFlag())&&
|
|
|
|
|
!MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.N.getValue().equals(item.getOrderFlag())&&
|
|
|
|
|
!MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.S.getValue().equals(item.getOrderFlag())&&
|
|
|
|
|
!MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.P.getValue().equals(item.getOrderFlag())){
|
|
|
|
|
if (!MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.E.getValue().equals(item.getOrderFlag()) &&
|
|
|
|
|
!MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.N.getValue().equals(item.getOrderFlag()) &&
|
|
|
|
|
!MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.S.getValue().equals(item.getOrderFlag()) &&
|
|
|
|
|
!MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.P.getValue().equals(item.getOrderFlag())) {
|
|
|
|
|
MesException.throwMesBusiException(String.format("工单标识为【%s】请选择 【%s】、【%s】、【%s】、【%s】 标识",
|
|
|
|
|
item.getOrderFlag(), MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.E.getValue()
|
|
|
|
|
, MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.N.getValue(),
|
|
|
|
|
MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.S.getValue(),
|
|
|
|
|
MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.P.getValue()));
|
|
|
|
|
}
|
|
|
|
|
if (StringUtil.isEmpty(item.getPlanStartTime()) || StringUtil.isEmpty(item.getPlanEndTime())) {
|
|
|
|
|
packPlanTime(item);
|
|
|
|
|
}
|
|
|
|
|
//生产版本为空
|
|
|
|
|
if (StringUtil.isEmpty(item.getProductVersion())) {
|
|
|
|
|
MesProductVersion mesProductVersion = getMesProductVersion(item, mesWorkCenter);
|
|
|
|
|
item.setProductVersion(mesProductVersion.getProductVersion());
|
|
|
|
|
item.getOrderFlag(), MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.E.getValue()
|
|
|
|
|
, MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.N.getValue(),
|
|
|
|
|
MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.S.getValue(),
|
|
|
|
|
MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.P.getValue()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//获取生产版本
|
|
|
|
|
MesProductVersion mesProductVersion = getMesProductVersion(item, mesWorkCenter);
|
|
|
|
|
item.setProductVersion(mesProductVersion.getProductVersion());
|
|
|
|
|
//获取bom信息
|
|
|
|
|
List<MesBom> bomList = mesBomService.findMesBomByPartNoAndBomVersion(item.getPartNo(), item.getOrganizeCode(), mesProductVersion.getAlternativePartList());
|
|
|
|
|
if (!StringUtil.isEmpty(item.getVinCode())) {
|
|
|
|
|
//校验vin号是否重复
|
|
|
|
|
ddlPackBean = DdlPackBean.getDdlPackBean(item.getOrganizeCode());
|
|
|
|
@ -265,51 +280,68 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
MesException.throwMesBusiException("vin号【%s】重复", item.getVinCode());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//排序工单数量为1
|
|
|
|
|
item.setQty(1d);
|
|
|
|
|
//校验零件生产组信息
|
|
|
|
|
if (StringUtil.isEmpty(item.getPartProdGroupCode())) {
|
|
|
|
|
MesPartProdGroup mesPartProdGroup = getMesPartProdGroup(item);
|
|
|
|
|
MesPartProdGroup mesPartProdGroup = null;
|
|
|
|
|
if(StringUtil.isEmpty(item.getPartProdGroupCode())){
|
|
|
|
|
mesPartProdGroup = getMesPartProdGroup(item);
|
|
|
|
|
item.setPartProdGroupCode(mesPartProdGroup.getPartProdGroupCode());
|
|
|
|
|
item.setPartProdGroupName(mesPartProdGroup.getPartProdGroupName());
|
|
|
|
|
}else{
|
|
|
|
|
ddlPackBean = DdlPackBean.getDdlPackBean(item.getOrganizeCode());
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(item.getPartProdGroupCode(), "partProdGroupCode", ddlPackBean);
|
|
|
|
|
mesPartProdGroup = mesPartProdGroupRDao.getByProperty(ddlPackBean);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//排序工单数量为1
|
|
|
|
|
item.setQty(1d);
|
|
|
|
|
item.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.CREATE.getValue());
|
|
|
|
|
//自动发布
|
|
|
|
|
if (CommonEnumUtil.VALID == mesPartProdGroup.getIsAutoRelease()) {
|
|
|
|
|
item.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue());
|
|
|
|
|
//发送工单信息给WMS
|
|
|
|
|
saveMesWorkOrderToWms.addAll(mesWorkOrderToWmsService.saveMesWorkOrderToWms(item, bomList));
|
|
|
|
|
} else {
|
|
|
|
|
item.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.CREATE.getValue());
|
|
|
|
|
}
|
|
|
|
|
} else if (item.getWorkOrderType() == MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue()) {
|
|
|
|
|
ValidatorBean.checkNotNull(item.getOrderFlag(), "标识不能为空");
|
|
|
|
|
ValidatorBean.checkNotNull(item.getProductVersion(), "生产版本不能为空");
|
|
|
|
|
if (!MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.E.getValue().equals(item.getOrderFlag())&&
|
|
|
|
|
!MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.N.getValue().equals(item.getOrderFlag())&&
|
|
|
|
|
!MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.P.getValue().equals(item.getOrderFlag())){
|
|
|
|
|
if (Objects.isNull(item.getQty()) || item.getQty() <= 0d) {
|
|
|
|
|
MesException.throwMesBusiException("生产数量不能小于等于0");
|
|
|
|
|
}
|
|
|
|
|
//校验产线类型和工单类型是否匹配
|
|
|
|
|
if (!Objects.equals(mesWorkCenter.getCenterType(), MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue())) {
|
|
|
|
|
MesException.throwMesBusiException("产线【%s】类型为【%s】,请选择非排序产线", mesWorkCenter.getWorkCenterCode(),
|
|
|
|
|
MesExtEnumUtil.WORK_CENTER_TYPE.valueOfDescription(mesWorkCenter.getCenterType()));
|
|
|
|
|
}
|
|
|
|
|
if (!MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.E.getValue().equals(item.getOrderFlag()) &&
|
|
|
|
|
!MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.N.getValue().equals(item.getOrderFlag()) &&
|
|
|
|
|
!MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.P.getValue().equals(item.getOrderFlag())) {
|
|
|
|
|
MesException.throwMesBusiException(String.format("工单标识为【%s】请选择 【%s】、【%s】、【%s】 标识",
|
|
|
|
|
item.getOrderFlag(), MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.E.getValue()
|
|
|
|
|
, MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.N.getValue(),
|
|
|
|
|
MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.P.getValue()));
|
|
|
|
|
}
|
|
|
|
|
if (StringUtil.isEmpty(item.getPlanStartTime()) || StringUtil.isEmpty(item.getPlanEndTime())) {
|
|
|
|
|
packPlanTime(item);
|
|
|
|
|
}
|
|
|
|
|
if (StringUtil.isEmpty(item.getCustPartNo())) {
|
|
|
|
|
getCustomerPart(item);
|
|
|
|
|
}
|
|
|
|
|
//校验物料生产版本是否存在
|
|
|
|
|
checkMesProductVersion(item, mesWorkCenter);
|
|
|
|
|
MesProductVersion mesProductVersion = checkMesProductVersion(item);
|
|
|
|
|
//获取bom信息
|
|
|
|
|
List<MesBom> bomList = mesBomService.findMesBomByPartNoAndBomVersion(item.getPartNo(), item.getOrganizeCode(), mesProductVersion.getAlternativePartList());
|
|
|
|
|
//发送工单信息给WMS
|
|
|
|
|
saveMesWorkOrderToWms.addAll(mesWorkOrderToWmsService.saveMesWorkOrderToWms(item, bomList));
|
|
|
|
|
|
|
|
|
|
item.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue());
|
|
|
|
|
} else {
|
|
|
|
|
ValidatorBean.checkNotNull(item.getPlanStartTime(), "计划开始时间不能为空");
|
|
|
|
|
ValidatorBean.checkNotNull(item.getPlanEndTime(), "计划结束时间不能为空");
|
|
|
|
|
//生产版本为空
|
|
|
|
|
if (StringUtil.isEmpty(item.getProductVersion())) {
|
|
|
|
|
MesProductVersion mesProductVersion = getMesProductVersion(item, mesWorkCenter);
|
|
|
|
|
item.setProductVersion(mesProductVersion.getProductVersion());
|
|
|
|
|
}
|
|
|
|
|
if (StringUtil.isEmpty(item.getCustPartNo())) {
|
|
|
|
|
getCustomerPart(item);
|
|
|
|
|
if (Objects.isNull(item.getQty()) || item.getQty() <= 0d) {
|
|
|
|
|
MesException.throwMesBusiException("生产数量不能小于等于0");
|
|
|
|
|
}
|
|
|
|
|
//拼接
|
|
|
|
|
// item.setPlanStartTime(item.getPlanStartTime() + " " + "00:00:00");
|
|
|
|
|
// item.setPlanEndTime(item.getPlanEndTime() + " " + "23:59:59");
|
|
|
|
|
//获取生产版本
|
|
|
|
|
MesProductVersion mesProductVersion = getMesProductVersion(item, mesWorkCenter);
|
|
|
|
|
item.setProductVersion(mesProductVersion.getProductVersion());
|
|
|
|
|
//获取bom信息
|
|
|
|
|
List<MesBom> bomList = mesBomService.findMesBomByPartNoAndBomVersion(item.getPartNo(), item.getOrganizeCode(), mesProductVersion.getAlternativePartList());
|
|
|
|
|
//发送工单信息给WMS
|
|
|
|
|
saveMesWorkOrderToWms.addAll(mesWorkOrderToWmsService.saveMesWorkOrderToWms(item, bomList));
|
|
|
|
|
item.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue());
|
|
|
|
|
}
|
|
|
|
|
//物料名称不存在,从物料信息中获取
|
|
|
|
@ -321,7 +353,10 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
item.setProduceTime(TimeTool.getToday());
|
|
|
|
|
}
|
|
|
|
|
item.setUnCompleteQty(item.getQty());
|
|
|
|
|
|
|
|
|
|
//保存发送WMS数据
|
|
|
|
|
if (CollectionUtils.isNotEmpty(saveMesWorkOrderToWms)) {
|
|
|
|
|
mesWorkOrderToWmsService.insertBatch(saveMesWorkOrderToWms);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private MesPartProdGroup getMesPartProdGroup(MesWorkOrder item) {
|
|
|
|
@ -344,19 +379,20 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
MesCustomerPart customerPart = mesCustomerPartRDao.getByProperty(ddlPackBean);
|
|
|
|
|
if (!Objects.isNull(customerPart)) {
|
|
|
|
|
item.setCustPartNo(customerPart.getCustPartNo());
|
|
|
|
|
item.setCustomerPartName(customerPart.getCustPartName());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void checkMesProductVersion(MesWorkOrder item, MesWorkCenter mesWorkCenter) {
|
|
|
|
|
private MesProductVersion checkMesProductVersion(MesWorkOrder item) {
|
|
|
|
|
DdlPackBean ddlPackBean;
|
|
|
|
|
ddlPackBean = DdlPackBean.getDdlPackBean(item.getOrganizeCode());
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(item.getPartNo(), "partNo", ddlPackBean);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(mesWorkCenter.getErpWorkCenter(), "workCenterCode", ddlPackBean);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(item.getErpWorkCenter(), "workCenterCode", ddlPackBean);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(item.getProductVersion(), "productVersion", ddlPackBean);
|
|
|
|
|
if (!mesProductVersionRDao.isExitByHql(ddlPackBean)) {
|
|
|
|
|
MesException.throwMesBusiException("物料【%s】产线【%s】生产版本【%s】信息不存在", item.getPartNo(), mesWorkCenter.getWorkCenterCode(), item.getProductVersion());
|
|
|
|
|
MesProductVersion mesProductVersion = mesProductVersionRDao.getByProperty(ddlPackBean);
|
|
|
|
|
if (Objects.isNull(mesProductVersion)) {
|
|
|
|
|
MesException.throwMesBusiException("物料【%s】产线【%s】生产版本【%s】信息不存在", item.getPartNo(), item.getWorkCenterCode(), item.getProductVersion());
|
|
|
|
|
}
|
|
|
|
|
return mesProductVersion;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private MesProductVersion getMesProductVersion(MesWorkOrder item, MesWorkCenter mesWorkCenter) {
|
|
|
|
@ -373,8 +409,7 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
return mesProductVersion;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void packPlanTime(MesWorkOrder item) {
|
|
|
|
|
DdlPackBean ddlPackBean;
|
|
|
|
|
private void packPlanTime(MesWorkOrder item, Map<String, List<MesShift>> mesShiftMap) {
|
|
|
|
|
ValidatorBean.checkNotNull(item.getPlanDate(), "计划日期不能为空");
|
|
|
|
|
ValidatorBean.checkNotNull(item.getShiftCode(), "班次不能为空");
|
|
|
|
|
//工单导入:计划时间不能为当天之前日期
|
|
|
|
@ -388,10 +423,8 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
MesException.throwMesBusiException("计划日期格式异常");
|
|
|
|
|
}
|
|
|
|
|
//查询班次信息
|
|
|
|
|
ddlPackBean = DdlPackBean.getDdlPackBean(item.getOrganizeCode());
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(item.getWorkCenterCode(), "workCenterCode", ddlPackBean);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(item.getShiftCode(), "shiftCode", ddlPackBean);
|
|
|
|
|
MesShift mesShift = mesShiftRDao.getByProperty(ddlPackBean);
|
|
|
|
|
List<MesShift> mesShifts = mesShiftMap.get(item.getWorkCenterCode() + item.getShiftCode());
|
|
|
|
|
MesShift mesShift = CollectionUtils.isEmpty(mesShifts) ? null : mesShifts.iterator().next();
|
|
|
|
|
if (Objects.isNull(mesShift)) {
|
|
|
|
|
MesException.throwMesBusiException("产线【%s】班次【%s】信息不存在", item.getWorkCenterCode(), item.getShiftCode());
|
|
|
|
|
}
|
|
|
|
@ -411,6 +444,313 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void saveMesWorkOrderExcel(List<MesWorkOrder> mesWorkOrderList) {
|
|
|
|
|
MesWorkOrder next = mesWorkOrderList.iterator().next();
|
|
|
|
|
//属性校验&字段填充
|
|
|
|
|
List<MesWorkOrderToWms> mesWorkOrderToWmsList = checkData(mesWorkOrderList, next.getOrganizeCode());
|
|
|
|
|
//生成工单号
|
|
|
|
|
GenSerialNoModel genSerialNoModel = new GenSerialNoModel(MesCommonConstant.MES_WORK_ORDER_NO);
|
|
|
|
|
List<String> orderList = syncFuncService.syncSerialNo(genSerialNoModel, next.getCreateUser(), next.getOrganizeCode(), mesWorkOrderList.size()).getResultList();
|
|
|
|
|
//查询工单是否已经存在
|
|
|
|
|
DdlPackBean orderPackBean = DdlPackBean.getDdlPackBean(next.getOrganizeCode());
|
|
|
|
|
DdlPreparedPack.getInPackList(orderList, "workOrderNo", orderPackBean);
|
|
|
|
|
if (baseRDao.isExitByHql(orderPackBean)) {
|
|
|
|
|
MesException.throwMesBusiException("单号已存在");
|
|
|
|
|
}
|
|
|
|
|
//BTO序号
|
|
|
|
|
List<String> seqList = new ArrayList<>();
|
|
|
|
|
if (MesExtEnumUtil.ORDER_TYPE.BTO.getValue() == next.getWorkOrderType()) {
|
|
|
|
|
GenSerialNoModel orderSeqSerialNoModel = new GenSerialNoModel(MesCommonConstant.ORDER_NO_BTO_SEQ);
|
|
|
|
|
seqList = syncFuncService.syncSerialNo(orderSeqSerialNoModel, next.getCreateUser(), next.getOrganizeCode(), mesWorkOrderList.size()).getResultList();
|
|
|
|
|
}
|
|
|
|
|
List<MesWorkOrderLog> mesWorkOrderLogList = new ArrayList<>();
|
|
|
|
|
int index = 0;
|
|
|
|
|
for (MesWorkOrder item : mesWorkOrderList) {
|
|
|
|
|
//获取相同类型 相同标识 生产序号最大值的
|
|
|
|
|
orderPackBean = DdlPackBean.getDdlPackBean(item.getOrganizeCode());
|
|
|
|
|
DdlPreparedPack.getNumEqualPack(item.getWorkOrderStatus(), "workOrderStatus", orderPackBean);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(item.getOrderFlag(), "orderFlag", orderPackBean);
|
|
|
|
|
DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{"produceSeq"}, orderPackBean);
|
|
|
|
|
MesWorkOrder result = baseRDao.getByProperty(orderPackBean);
|
|
|
|
|
|
|
|
|
|
//若工单类型为排序 则根据排序插入工单数量插入多行 工单数量为1
|
|
|
|
|
if (item.getWorkOrderType() == MesExtEnumUtil.ORDER_TYPE.SORT.getValue()) {
|
|
|
|
|
Long produceSeq = 0L;
|
|
|
|
|
if (null != result && result.getProduceSeq() != null) {
|
|
|
|
|
produceSeq = (long) Math.toIntExact(result.getProduceSeq());
|
|
|
|
|
}
|
|
|
|
|
MesWorkOrder copyMesWorkOrder = new MesWorkOrder();
|
|
|
|
|
BeanUtils.copyProperties(item, copyMesWorkOrder);
|
|
|
|
|
copyMesWorkOrder.setProduceSeq((long) (produceSeq + 1));
|
|
|
|
|
copyMesWorkOrder.setWorkOrderNo(orderList.get(index));
|
|
|
|
|
copyMesWorkOrder.setSystemSyncStatus(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
|
|
|
|
|
ConvertBean.serviceModelInitialize(copyMesWorkOrder, item.getCreateUser());
|
|
|
|
|
index++;
|
|
|
|
|
baseRDao.insert(copyMesWorkOrder);
|
|
|
|
|
//保存记录
|
|
|
|
|
MesWorkOrderLog workOrderLog = new MesWorkOrderLog();
|
|
|
|
|
BeanUtils.copyProperties(item, workOrderLog, "id");
|
|
|
|
|
mesWorkOrderLogList.add(workOrderLog);
|
|
|
|
|
continue;
|
|
|
|
|
} else if (item.getWorkOrderType() == MesExtEnumUtil.ORDER_TYPE.BTO.getValue()) {
|
|
|
|
|
Long produceSeq = 0L;
|
|
|
|
|
if (null != result && result.getProduceSeq() != null) {
|
|
|
|
|
produceSeq = (long) Math.toIntExact(result.getProduceSeq());
|
|
|
|
|
}
|
|
|
|
|
item.setProduceSeq(produceSeq + 1);
|
|
|
|
|
item.setWorkOrderSeq(seqList.get(index));
|
|
|
|
|
}
|
|
|
|
|
item.setWorkOrderNo(orderList.get(index));
|
|
|
|
|
item.setQty(item.getQty());
|
|
|
|
|
item.setSystemSyncStatus(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
|
|
|
|
|
ConvertBean.serviceModelInitialize(item, item.getCreateUser());
|
|
|
|
|
baseRDao.insert(item);
|
|
|
|
|
index++;
|
|
|
|
|
//保存记录
|
|
|
|
|
MesWorkOrderLog workOrderLog = new MesWorkOrderLog();
|
|
|
|
|
BeanUtils.copyProperties(item, workOrderLog, "id");
|
|
|
|
|
mesWorkOrderLogList.add(workOrderLog);
|
|
|
|
|
}
|
|
|
|
|
//保存发送WMS数据
|
|
|
|
|
if (CollectionUtils.isNotEmpty(mesWorkOrderToWmsList)) {
|
|
|
|
|
mesWorkOrderToWmsService.insertBatch(mesWorkOrderToWmsList);
|
|
|
|
|
}
|
|
|
|
|
//保存工单记录
|
|
|
|
|
if (CollectionUtils.isNotEmpty(mesWorkOrderLogList)) {
|
|
|
|
|
workOrderLogService.insertBatch(mesWorkOrderLogList);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private List<MesWorkOrderToWms> checkData(List<MesWorkOrder> mesWorkOrderList, String organizeCode) {
|
|
|
|
|
String nowDate = TimeTool.getNowTime(true);
|
|
|
|
|
//获取产线信息
|
|
|
|
|
List<String> workCenterCodeList = mesWorkOrderList.stream().map(MesWorkOrder::getWorkCenterCode).distinct().collect(Collectors.toList());
|
|
|
|
|
Map<String, MesWorkCenter> workCenterMap = BeanMapUtilsExt.getBeanMap(mesWorkCenterRDao, "workCenterCode", organizeCode, workCenterCodeList, "产线信息");
|
|
|
|
|
//获取班次信息
|
|
|
|
|
List<MesShift> mesShiftList = getMesShifts(organizeCode, nowDate, workCenterCodeList);
|
|
|
|
|
Map<String, List<MesShift>> mesShiftMap = mesShiftList.stream().collect(Collectors.groupingBy(t -> t.getWorkCenterCode() + t.getShiftCode()));
|
|
|
|
|
//获取生产版本
|
|
|
|
|
List<String> partNoList = mesWorkOrderList.stream().map(MesWorkOrder::getPartNo).distinct().collect(Collectors.toList());
|
|
|
|
|
List<MesProductVersion> mesProductVersionList = BeanMapUtilsExt.getBeanList(mesProductVersionRDao, "partNo", organizeCode, partNoList, "生产版本信息");
|
|
|
|
|
Map<String, List<MesProductVersion>> mesProductVersionMap = mesProductVersionList.stream().collect(Collectors.groupingBy(t -> t.getWorkCenterCode() + t.getPartNo()));
|
|
|
|
|
//客户物料信息
|
|
|
|
|
Map<String, MesCustomerPart> mesCustomerPartMap = null;
|
|
|
|
|
try {
|
|
|
|
|
mesCustomerPartMap = BeanMapUtilsExt.getBeanMap(mesCustomerPartRDao, "erpPartNo", organizeCode, partNoList, "客户物料信息");
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
mesCustomerPartMap = null;
|
|
|
|
|
}
|
|
|
|
|
//获取物料信息
|
|
|
|
|
Map<String, MesPartSap> mesPartSapMap = BeanMapUtilsExt.getBeanMap(mesPartSapRDao, "partNo", organizeCode, partNoList, "物料信息");
|
|
|
|
|
//获取获取vin号
|
|
|
|
|
List<String> vinCodeList = mesWorkOrderList.stream().map(MesWorkOrder::getVinCode).filter(Objects::nonNull).distinct().collect(Collectors.toList());
|
|
|
|
|
if (!CollectionUtils.isEmpty(vinCodeList)) {
|
|
|
|
|
List<MesWorkOrder> mesWorkOrders = null;
|
|
|
|
|
try {
|
|
|
|
|
mesWorkOrders = BeanMapUtilsExt.getBeanList(baseRDao, "vinCode", organizeCode, vinCodeList, "生产工单");
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
}
|
|
|
|
|
if (!CollectionUtils.isEmpty(mesWorkOrders)) {
|
|
|
|
|
List<String> list = mesWorkOrders.stream().map(MesWorkOrder::getVinCode).collect(Collectors.toList());
|
|
|
|
|
MesException.throwMesBusiException("vin号【%s】已存在", list);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//BOM信息
|
|
|
|
|
Map<String, List<MesBom>> mesBomMap = new HashMap<>();
|
|
|
|
|
//vin号
|
|
|
|
|
Map<String, String> vinCodeMap = new HashMap<>();
|
|
|
|
|
//零件生产组
|
|
|
|
|
Map<String, MesPartProdGroup> mesPartProdGroupMap = new HashMap<>();
|
|
|
|
|
//发送wms数据
|
|
|
|
|
List<MesWorkOrderToWms> mesWorkOrderToWmsList = new ArrayList<>();
|
|
|
|
|
for (MesWorkOrder item : mesWorkOrderList) {
|
|
|
|
|
// 数据校验
|
|
|
|
|
ValidatorBean.checkNotNull(item.getWorkOrderType(), "工单类型不能为空");
|
|
|
|
|
ValidatorBean.checkNotNull(item.getWorkCenterCode(), "产线不能为空");
|
|
|
|
|
ValidatorBean.checkNotNull(item.getPartNo(), "零件号不能为空");
|
|
|
|
|
|
|
|
|
|
ValidatorBean.checkNotNull(item.getShiftCode(), "班次不能为空");
|
|
|
|
|
MesWorkCenter mesWorkCenter = workCenterMap.get(item.getWorkCenterCode());
|
|
|
|
|
|
|
|
|
|
if (Objects.isNull(mesWorkCenter)) {
|
|
|
|
|
MesException.throwMesBusiException("产线【%s】不存在", item.getWorkCenterCode());
|
|
|
|
|
}
|
|
|
|
|
item.setErpWorkCenter(mesWorkCenter.getErpWorkCenter());
|
|
|
|
|
//获取客户物料信息
|
|
|
|
|
MesCustomerPart customerPart = null == mesCustomerPartMap ? null : mesCustomerPartMap.get(item.getPartNo());
|
|
|
|
|
if (!Objects.isNull(customerPart)) {
|
|
|
|
|
item.setCustPartNo(customerPart.getCustPartNo());
|
|
|
|
|
item.setCustomerPartName(customerPart.getCustPartName());
|
|
|
|
|
}
|
|
|
|
|
//物料名称不存在,从物料信息中获取
|
|
|
|
|
MesPartSap mesPart = mesPartSapMap.get(item.getPartNo());
|
|
|
|
|
if (Objects.isNull(mesPart)) {
|
|
|
|
|
MesException.throwMesBusiException("物料【%s】信息不存在", item.getPartNo());
|
|
|
|
|
}
|
|
|
|
|
item.setPartName(mesPart.getPartName());
|
|
|
|
|
item.setUnit(mesPart.getUnit());
|
|
|
|
|
//生产时间新增取当天
|
|
|
|
|
if (StringUtil.isEmpty(item.getProduceTime())) {
|
|
|
|
|
item.setProduceTime(TimeTool.getToday());
|
|
|
|
|
}
|
|
|
|
|
//若工单类型为排序
|
|
|
|
|
if (item.getWorkOrderType() == MesExtEnumUtil.ORDER_TYPE.SORT.getValue()) {
|
|
|
|
|
ValidatorBean.checkNotNull(item.getOrderFlag(), "标识不能为空");
|
|
|
|
|
//校验产线类型和工单类型是否匹配
|
|
|
|
|
if (!Objects.equals(mesWorkCenter.getCenterType(), MesExtEnumUtil.ORDER_TYPE.SORT.getValue())) {
|
|
|
|
|
MesException.throwMesBusiException("产线【%s】类型为【%s】,请选择排序产线", mesWorkCenter.getWorkCenterCode(),
|
|
|
|
|
MesExtEnumUtil.WORK_CENTER_TYPE.valueOfDescription(mesWorkCenter.getCenterType()));
|
|
|
|
|
}
|
|
|
|
|
//若工单类型为排序 标识为 N E P S
|
|
|
|
|
if (!MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.E.getValue().equals(item.getOrderFlag()) &&
|
|
|
|
|
!MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.N.getValue().equals(item.getOrderFlag()) &&
|
|
|
|
|
!MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.S.getValue().equals(item.getOrderFlag()) &&
|
|
|
|
|
!MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.P.getValue().equals(item.getOrderFlag())) {
|
|
|
|
|
MesException.throwMesBusiException(String.format("工单标识为【%s】请选择 【%s】、【%s】、【%s】、【%s】 标识",
|
|
|
|
|
item.getOrderFlag(), MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.E.getValue()
|
|
|
|
|
, MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.N.getValue(),
|
|
|
|
|
MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.S.getValue(),
|
|
|
|
|
MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.P.getValue()));
|
|
|
|
|
}
|
|
|
|
|
//计划开始时间,计划结束时间拼接
|
|
|
|
|
packPlanTime(item, mesShiftMap);
|
|
|
|
|
//获取生产版本
|
|
|
|
|
List<MesProductVersion> mesProductVersions = mesProductVersionMap.get(mesWorkCenter.getErpWorkCenter() + item.getPartNo());
|
|
|
|
|
if (CollectionUtils.isEmpty(mesProductVersions)) {
|
|
|
|
|
MesException.throwMesBusiException("物料【%s】工作中心【%s】对应的生产版本信息不存在", item.getPartNo(),
|
|
|
|
|
mesWorkCenter.getErpWorkCenter());
|
|
|
|
|
}
|
|
|
|
|
MesProductVersion mesProductVersion = mesProductVersions.iterator().next();
|
|
|
|
|
item.setProductVersion(mesProductVersion.getProductVersion());
|
|
|
|
|
//发送工单信息给WMS
|
|
|
|
|
List<MesBom> mesBomList = null;
|
|
|
|
|
if (mesBomMap.containsKey(item.getPartNo() + mesProductVersion.getAlternativePartList())) {
|
|
|
|
|
mesBomList = mesBomMap.get(item.getPartNo() + mesProductVersion.getAlternativePartList());
|
|
|
|
|
} else {
|
|
|
|
|
//获取bom信息
|
|
|
|
|
mesBomList = mesBomService.findMesBomByPartNoAndBomVersion(item.getPartNo(), item.getOrganizeCode(), mesProductVersion.getAlternativePartList());
|
|
|
|
|
mesBomMap.put(item.getPartNo() + mesProductVersion.getAlternativePartList(), mesBomList);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!StringUtil.isEmpty(item.getVinCode())) {
|
|
|
|
|
if (vinCodeMap.containsKey(item.getVinCode())) {
|
|
|
|
|
MesException.throwMesBusiException("vin号【%s】重复", item.getVinCode());
|
|
|
|
|
} else {
|
|
|
|
|
vinCodeMap.put(item.getVinCode(), item.getVinCode());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//校验零件生产组信息
|
|
|
|
|
MesPartProdGroup mesPartProdGroup;
|
|
|
|
|
if (mesPartProdGroupMap.containsKey(item.getWorkCenterCode() + item.getPartNo())) {
|
|
|
|
|
mesPartProdGroup = mesPartProdGroupMap.get(item.getWorkCenterCode() + item.getPartNo());
|
|
|
|
|
} else {
|
|
|
|
|
mesPartProdGroup = getMesPartProdGroup(item);
|
|
|
|
|
mesPartProdGroupMap.put(item.getWorkCenterCode() + item.getPartNo(), mesPartProdGroup);
|
|
|
|
|
}
|
|
|
|
|
item.setPartProdGroupCode(mesPartProdGroup.getPartProdGroupCode());
|
|
|
|
|
item.setPartProdGroupName(mesPartProdGroup.getPartProdGroupName());
|
|
|
|
|
//排序工单数量为1
|
|
|
|
|
item.setQty(1d);
|
|
|
|
|
//自动发布
|
|
|
|
|
if (CommonEnumUtil.VALID == mesPartProdGroup.getIsAutoRelease()) {
|
|
|
|
|
item.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue());
|
|
|
|
|
//发送工单信息给WMS
|
|
|
|
|
mesWorkOrderToWmsList.addAll(mesWorkOrderToWmsService.saveMesWorkOrderToWms(item, mesBomList));
|
|
|
|
|
} else {
|
|
|
|
|
item.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.CREATE.getValue());
|
|
|
|
|
}
|
|
|
|
|
} else if (item.getWorkOrderType() == MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue()) {
|
|
|
|
|
ValidatorBean.checkNotNull(item.getOrderFlag(), "标识不能为空");
|
|
|
|
|
ValidatorBean.checkNotNull(item.getProductVersion(), "生产版本不能为空");
|
|
|
|
|
if (Objects.isNull(item.getQty()) || item.getQty() <= 0d) {
|
|
|
|
|
MesException.throwMesBusiException("生产数量不能小于等于0");
|
|
|
|
|
}
|
|
|
|
|
//校验产线类型和工单类型是否匹配
|
|
|
|
|
if (!Objects.equals(mesWorkCenter.getCenterType(), MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue())) {
|
|
|
|
|
MesException.throwMesBusiException("产线【%s】类型为【%s】,请选择非排序产线", mesWorkCenter.getWorkCenterCode(),
|
|
|
|
|
MesExtEnumUtil.WORK_CENTER_TYPE.valueOfDescription(mesWorkCenter.getCenterType()));
|
|
|
|
|
}
|
|
|
|
|
if (!MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.E.getValue().equals(item.getOrderFlag()) &&
|
|
|
|
|
!MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.N.getValue().equals(item.getOrderFlag()) &&
|
|
|
|
|
!MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.P.getValue().equals(item.getOrderFlag())) {
|
|
|
|
|
MesException.throwMesBusiException(String.format("工单标识为【%s】请选择 【%s】、【%s】、【%s】 标识",
|
|
|
|
|
item.getOrderFlag(), MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.E.getValue()
|
|
|
|
|
, MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.N.getValue(),
|
|
|
|
|
MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.P.getValue()));
|
|
|
|
|
}
|
|
|
|
|
//拼接时间
|
|
|
|
|
packPlanTime(item, mesShiftMap);
|
|
|
|
|
//校验物料生产版本是否存在
|
|
|
|
|
List<MesProductVersion> mesProductVersions = mesProductVersionMap.get(mesWorkCenter.getErpWorkCenter() + item.getPartNo());
|
|
|
|
|
if (CollectionUtils.isEmpty(mesProductVersions)) {
|
|
|
|
|
MesException.throwMesBusiException("物料【%s】工作中心【%s】对应的生产版本信息不存在", item.getPartNo(),
|
|
|
|
|
mesWorkCenter.getErpWorkCenter());
|
|
|
|
|
}
|
|
|
|
|
List<MesProductVersion> versionList = mesProductVersions.stream().filter(t -> Objects.equals(item.getProductVersion(), t.getProductVersion())).collect(Collectors.toList());
|
|
|
|
|
if (CollectionUtils.isEmpty(versionList)) {
|
|
|
|
|
MesException.throwMesBusiException("物料【%s】产线【%s】生产版本【%s】信息不存在", item.getPartNo(), mesWorkCenter.getWorkCenterCode(), item.getProductVersion());
|
|
|
|
|
}
|
|
|
|
|
MesProductVersion mesProductVersion = versionList.iterator().next();
|
|
|
|
|
//获取bom信息
|
|
|
|
|
List<MesBom> mesBomList = null;
|
|
|
|
|
if (mesBomMap.containsKey(item.getPartNo() + mesProductVersion.getAlternativePartList())) {
|
|
|
|
|
mesBomList = mesBomMap.get(item.getPartNo() + mesProductVersion.getAlternativePartList());
|
|
|
|
|
} else {
|
|
|
|
|
//获取bom信息
|
|
|
|
|
mesBomList = mesBomService.findMesBomByPartNoAndBomVersion(item.getPartNo(), item.getOrganizeCode(), mesProductVersion.getAlternativePartList());
|
|
|
|
|
mesBomMap.put(item.getPartNo() + mesProductVersion.getAlternativePartList(), mesBomList);
|
|
|
|
|
}
|
|
|
|
|
//发送工单信息给WMS
|
|
|
|
|
mesWorkOrderToWmsList.addAll(mesWorkOrderToWmsService.saveMesWorkOrderToWms(item, mesBomList));
|
|
|
|
|
|
|
|
|
|
item.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue());
|
|
|
|
|
} else {
|
|
|
|
|
ValidatorBean.checkNotNull(item.getPlanStartTime(), "计划开始时间不能为空");
|
|
|
|
|
ValidatorBean.checkNotNull(item.getPlanEndTime(), "计划结束时间不能为空");
|
|
|
|
|
if (Objects.isNull(item.getQty()) || item.getQty() <= 0d) {
|
|
|
|
|
MesException.throwMesBusiException("生产数量不能小于等于0");
|
|
|
|
|
}
|
|
|
|
|
//获取生产版本
|
|
|
|
|
List<MesProductVersion> mesProductVersions = mesProductVersionMap.get(mesWorkCenter.getErpWorkCenter() + item.getPartNo());
|
|
|
|
|
if (CollectionUtils.isEmpty(mesProductVersions)) {
|
|
|
|
|
MesException.throwMesBusiException("物料【%s】工作中心【%s】对应的生产版本信息不存在", item.getPartNo(),
|
|
|
|
|
mesWorkCenter.getErpWorkCenter());
|
|
|
|
|
}
|
|
|
|
|
MesProductVersion mesProductVersion = mesProductVersions.iterator().next();
|
|
|
|
|
item.setProductVersion(mesProductVersion.getProductVersion());
|
|
|
|
|
//获取bom信息
|
|
|
|
|
List<MesBom> mesBomList = null;
|
|
|
|
|
if (mesBomMap.containsKey(item.getPartNo() + mesProductVersion.getAlternativePartList())) {
|
|
|
|
|
mesBomList = mesBomMap.get(item.getPartNo() + mesProductVersion.getAlternativePartList());
|
|
|
|
|
} else {
|
|
|
|
|
//获取bom信息
|
|
|
|
|
mesBomList = mesBomService.findMesBomByPartNoAndBomVersion(item.getPartNo(), item.getOrganizeCode(), mesProductVersion.getAlternativePartList());
|
|
|
|
|
mesBomMap.put(item.getPartNo() + mesProductVersion.getAlternativePartList(), mesBomList);
|
|
|
|
|
}
|
|
|
|
|
//发送工单信息给WMS
|
|
|
|
|
mesWorkOrderToWmsList.addAll(mesWorkOrderToWmsService.saveMesWorkOrderToWms(item, mesBomList));
|
|
|
|
|
item.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue());
|
|
|
|
|
}
|
|
|
|
|
item.setUnCompleteQty(item.getQty());
|
|
|
|
|
}
|
|
|
|
|
return mesWorkOrderToWmsList;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private List<MesShift> getMesShifts(String organizeCode, String nowDate, List<String> workCenterCodeList) {
|
|
|
|
|
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
|
|
|
|
|
DdlPreparedPack.getInPackList(workCenterCodeList, "workCenterCode", packBean);
|
|
|
|
|
DdlPreparedPack.getStringSmallerPack(nowDate, "beginDate", packBean);
|
|
|
|
|
DdlPreparedPack.getStringBiggerPack(nowDate, "endDate", packBean);
|
|
|
|
|
List<MesShift> mesShiftList = mesShiftRDao.findByHqlWhere(packBean);
|
|
|
|
|
if (CollectionUtils.isEmpty(mesShiftList)) {
|
|
|
|
|
MesException.throwMesBusiException("有效期内的班次信息不存在");
|
|
|
|
|
}
|
|
|
|
|
return mesShiftList;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void doProductReport(MesWorkOrder mesWorkOrder) {
|
|
|
|
|
MesWorkOrder mesWorkOrderDb = baseRDao.getById(mesWorkOrder.getId());
|
|
|
|
|
if (Objects.isNull(mesWorkOrderDb)) {
|
|
|
|
@ -428,7 +768,7 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
//获取生产版本
|
|
|
|
|
MesProductVersion mesProductVersion = getMesProductVersion(mesWorkOrderDb);
|
|
|
|
|
//物料+生产版本获取bom信息
|
|
|
|
|
List<MesBom> mesBoms = getBomList(mesPart.getOrganizeCode(), mesPart, mesProductVersion.getAlternativePartList());
|
|
|
|
|
List<MesBom> mesBoms = mesBomService.findBomList(mesPart.getOrganizeCode(), mesPart, mesProductVersion.getAlternativePartList());
|
|
|
|
|
//报工类型
|
|
|
|
|
if (MesExtEnumUtil.REPORT_TYPE.REPORT.getValue() == mesWorkOrder.getReportType()) {
|
|
|
|
|
mesWorkOrderDb.setReportedQty(MathOperation.add(mesWorkOrder.getNum(), mesWorkOrderDb.getReportedQty()));
|
|
|
|
@ -456,85 +796,15 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
updateMesWorkOrder(mesWorkOrderDb);
|
|
|
|
|
|
|
|
|
|
//生成条码
|
|
|
|
|
List<String> resultList = getStringList(mesWorkOrder);
|
|
|
|
|
String sn = getStringList(mesWorkOrder);
|
|
|
|
|
//保存数据
|
|
|
|
|
List<MesProductOffLine> mesProductOffLineList = new ArrayList<>();
|
|
|
|
|
for (String sn : resultList) {
|
|
|
|
|
for (MesBom mesBom : mesBoms) {
|
|
|
|
|
mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom, false));
|
|
|
|
|
}
|
|
|
|
|
for (MesBom mesBom : mesBoms) {
|
|
|
|
|
mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom, false));
|
|
|
|
|
}
|
|
|
|
|
mesProductOffLineService.insertBatch(mesProductOffLineList);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public List<MesBom> getBomList(String organizeCode, MesPart mesPart, String bomVersion) {
|
|
|
|
|
List<MesBom> bomData = new ArrayList<>();
|
|
|
|
|
// 递归展开 BOM
|
|
|
|
|
expendBomChild(organizeCode, mesPart.getPartNo(), bomVersion, bomData);
|
|
|
|
|
|
|
|
|
|
if (bomData.size() == 0) {
|
|
|
|
|
MesException.throwMesBusiException("零件号 %s 没找找到 ERP 同步的原始 BOM 数据,请检查接口是否正常!", mesPart.getPartNo());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Iterator<MesBom> iterator = bomData.iterator();
|
|
|
|
|
while (iterator.hasNext()) {
|
|
|
|
|
MesBom item = iterator.next();
|
|
|
|
|
// 删除虚零件
|
|
|
|
|
if (Objects.equals("X", item.getPartType())) {
|
|
|
|
|
iterator.remove();
|
|
|
|
|
} else {
|
|
|
|
|
item.setPartNo(mesPart.getPartNo());
|
|
|
|
|
item.setPartName(mesPart.getPartName());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Map<String, MesBom> summaryBomMap = new HashMap<>();
|
|
|
|
|
|
|
|
|
|
for (MesBom item : bomData) {
|
|
|
|
|
String key = String.format("%s:%s", item.getPartNo().toUpperCase().trim(),
|
|
|
|
|
item.getItemPartNo().toUpperCase().trim());
|
|
|
|
|
if (!summaryBomMap.containsKey(key)) {
|
|
|
|
|
summaryBomMap.put(key, item);
|
|
|
|
|
} else {
|
|
|
|
|
MesBom tempItem = summaryBomMap.get(key);
|
|
|
|
|
// 子零件重复的累加数量
|
|
|
|
|
tempItem.setItemQty(MathOperation.add(tempItem.getItemQty(), item.getItemQty()));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// 返回汇总数据
|
|
|
|
|
return new ArrayList<>(summaryBomMap.values());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 递归展开 BOM
|
|
|
|
|
*
|
|
|
|
|
* @param organizeCode 工厂代码
|
|
|
|
|
* @param partNo 父零件号
|
|
|
|
|
* @param bomData 存放 BOM 数据的集合
|
|
|
|
|
*/
|
|
|
|
|
private void expendBomChild(String organizeCode, String partNo, String bomVersion, List<MesBom> bomData) {
|
|
|
|
|
List<MesBom> bomDetails = getMesBoms(partNo, organizeCode, bomVersion);
|
|
|
|
|
|
|
|
|
|
for (MesBom item : bomDetails) {
|
|
|
|
|
MesBom newItem = new MesBom();
|
|
|
|
|
BeanUtils.copyProperties(item, newItem);
|
|
|
|
|
// 处理父零件用量不为 1 的情况
|
|
|
|
|
if (newItem.getQty() != 1.0 && newItem.getQty() > 0.0) {
|
|
|
|
|
Double rateQty = divide(newItem.getItemQty(), newItem.getQty(), 8);
|
|
|
|
|
newItem.setQty(1.0);
|
|
|
|
|
newItem.setItemQty(rateQty);
|
|
|
|
|
}
|
|
|
|
|
// 加入到 BOM 清单中
|
|
|
|
|
bomData.add(newItem);
|
|
|
|
|
// 如果有子阶,继续递归
|
|
|
|
|
if (Objects.equals("X", item.getPartType())) {
|
|
|
|
|
expendBomChild(organizeCode, newItem.getItemPartNo(), null, bomData);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void doProductReportExt(MesWorkOrder mesWorkOrderNew) {
|
|
|
|
|
MesWorkOrder mesWorkOrder = baseRDao.getById(mesWorkOrderNew.getId());
|
|
|
|
@ -572,9 +842,9 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
//获取生产版本
|
|
|
|
|
MesProductVersion mesProductVersion = getMesProductVersion(mesWorkOrder);
|
|
|
|
|
//物料+生产版本获取bom信息
|
|
|
|
|
List<MesBom> mesBoms = getBomList(mesPart.getOrganizeCode(), mesPart, mesProductVersion.getAlternativePartList());
|
|
|
|
|
List<MesBom> mesBoms = mesBomService.findBomList(mesPart.getOrganizeCode(), mesPart, mesProductVersion.getAlternativePartList());
|
|
|
|
|
//生成条码
|
|
|
|
|
List<String> resultList = getStringList(mesWorkOrderNew);
|
|
|
|
|
String sn = getStringList(mesWorkOrderNew);
|
|
|
|
|
//保存数据
|
|
|
|
|
List<MesProductOffLine> mesProductOffLineList = new ArrayList<>();
|
|
|
|
|
List<MesMove> mesMoveList = new ArrayList<>();
|
|
|
|
@ -596,7 +866,7 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
isReport = true;
|
|
|
|
|
isMove = true;
|
|
|
|
|
} else if (MesExtEnumUtil.MES_REPORT_TYPE.CUSTOMER_SUPPLY_MOVE.getValue() == mesProdRuleSortCfg.getReportType()) {
|
|
|
|
|
customerSupplyMove(mesWorkOrder, mesProductVersion, mesBoms, resultList, mesProductOffLineList, mesMoveList);
|
|
|
|
|
customerSupplyMove(mesWorkOrderNew, mesProductVersion, mesBoms, sn, mesProductOffLineList, mesMoveList);
|
|
|
|
|
} else {
|
|
|
|
|
log.info("工单{}排序加工规则报工类型未维护", mesWorkOrder.getWorkOrderNo());
|
|
|
|
|
return;
|
|
|
|
@ -605,29 +875,26 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
if (MesExtEnumUtil.MES_REPORT_TYPE.CUSTOMER_SUPPLY_MOVE.getValue() != mesProdRuleSortCfg.getReportType()) {
|
|
|
|
|
//查询SAP物料信息
|
|
|
|
|
MesPartSap mesPartSap = mesPartSapService.getMesPartSapByPartNo(mesWorkOrder.getPartNo(), mesWorkOrder.getOrganizeCode());
|
|
|
|
|
for (String sn : resultList) {
|
|
|
|
|
//成品汇报
|
|
|
|
|
if (isReport) {
|
|
|
|
|
for (MesBom mesBom : mesBoms) {
|
|
|
|
|
mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom, false));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//成品移库
|
|
|
|
|
if (isMove) {
|
|
|
|
|
MesMove move = createMove(mesPartSap, mesProdRuleSortCfg.getSrcErpLocation(), mesProdRuleSortCfg.getDestErpLocation(), mesWorkOrder.getOrganizeCode(), 1d, sn, MesExtEnumUtil.MOVE_TYPE.FINISH_PRODUCTS_MOVE.getValue());
|
|
|
|
|
move.setMatnr(mesWorkOrder.getPartNo());
|
|
|
|
|
mesMoveList.add(move);
|
|
|
|
|
//成品汇报
|
|
|
|
|
if (isReport) {
|
|
|
|
|
for (MesBom mesBom : mesBoms) {
|
|
|
|
|
mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrderNew, mesProductVersion, sn, mesBom, false));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//成品移库
|
|
|
|
|
if (isMove) {
|
|
|
|
|
MesMove move = createMove(mesPartSap, mesProdRuleSortCfg.getSrcErpLocation(), mesProdRuleSortCfg.getDestErpLocation(), mesWorkOrder.getOrganizeCode(), mesWorkOrderNew.getNum(), sn, MesExtEnumUtil.MOVE_TYPE.FINISH_PRODUCTS_MOVE.getValue());
|
|
|
|
|
move.setMatnr(mesWorkOrder.getPartNo());
|
|
|
|
|
mesMoveList.add(move);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else if (MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue() == mesWorkOrder.getWorkOrderType()) {
|
|
|
|
|
MesProdRuleNosortCfg mesProdRuleNoSortCfg = mesProdRuleNosortCfgService.findMesProdRuleNosortCfgByWorkCenterCode(mesWorkOrder.getWorkCenterCode(), mesWorkOrder.getPartNo(), mesWorkOrder.getOrganizeCode());
|
|
|
|
|
if (CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == mesProdRuleNoSortCfg.getReportType()) {
|
|
|
|
|
for (String sn : resultList) {
|
|
|
|
|
for (MesBom mesBom : mesBoms) {
|
|
|
|
|
mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrderNew, mesProductVersion, sn, mesBom, false));
|
|
|
|
|
}
|
|
|
|
|
if (MesExtEnumUtil.NOSORT_REPORT_TYPE.REPORT.getValue() == mesProdRuleNoSortCfg.getReportType()) {
|
|
|
|
|
for (MesBom mesBom : mesBoms) {
|
|
|
|
|
mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrderNew, mesProductVersion, sn, mesBom, false));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
log.info("工单{}排序规则不属于排序工单和非排序工单", mesWorkOrder.getWorkOrderNo());
|
|
|
|
@ -666,7 +933,7 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
//获取生产版本
|
|
|
|
|
MesProductVersion mesProductVersion = getMesProductVersion(model);
|
|
|
|
|
//获取bom
|
|
|
|
|
List<MesBom> mesBoms = getBomList(mesPart.getOrganizeCode(), mesPart, mesProductVersion.getAlternativePartList());
|
|
|
|
|
List<MesBom> mesBoms = mesBomService.findBomList(mesPart.getOrganizeCode(), mesPart, mesProductVersion.getAlternativePartList());
|
|
|
|
|
//保存数据
|
|
|
|
|
List<MesProductOffLine> mesProductOffLineList = new ArrayList<>();
|
|
|
|
|
for (MesBom mesBom : mesBoms) {
|
|
|
|
@ -690,6 +957,7 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
newMesProductOffLine.setItemPartNo(mesBom.getItemPartNo());
|
|
|
|
|
newMesProductOffLine.setItemPartName(mesBom.getItemPartName());
|
|
|
|
|
newMesProductOffLine.setItemQty(MathOperation.mul(model.getQty(), mesBom.getItemQty()));
|
|
|
|
|
newMesProductOffLine.setWorkCenterCode(mesProductVersion.getWorkCenterCode());
|
|
|
|
|
newMesProductOffLine.setAlort(mesProductVersion.getReceiveInventoryPoint());
|
|
|
|
|
newMesProductOffLine.setStgeLoc(mesProductVersion.getShipInventoryPoint());
|
|
|
|
|
newMesProductOffLine.setQty(model.getQty());
|
|
|
|
@ -718,7 +986,7 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
return mesProductVersion;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void customerSupplyMove(MesWorkOrder mesWorkOrder, MesProductVersion mesProductVersion, List<MesBom> mesBoms, List<String> resultList, List<MesProductOffLine> mesProductOffLineList, List<MesMove> mesMoveList) {
|
|
|
|
|
private void customerSupplyMove(MesWorkOrder mesWorkOrder, MesProductVersion mesProductVersion, List<MesBom> mesBoms, String sn, List<MesProductOffLine> mesProductOffLineList, List<MesMove> mesMoveList) {
|
|
|
|
|
boolean isItemMove;
|
|
|
|
|
boolean isItemReport;
|
|
|
|
|
MesMoveRule moveRule;
|
|
|
|
@ -730,39 +998,37 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
Map<String, List<MesPartSap>> mesPartSapMap = getPartSapMap(mesWorkOrder, itemPartNoList);
|
|
|
|
|
//获取物料信息
|
|
|
|
|
Map<String, List<MesPart>> itemPartMap = getItemPartMap(mesWorkOrder, itemPartNoList);
|
|
|
|
|
for (String sn : resultList) {
|
|
|
|
|
for (MesBom mesBom : mesBoms) {
|
|
|
|
|
isItemReport = false;
|
|
|
|
|
isItemMove = false;
|
|
|
|
|
moveRule = null;
|
|
|
|
|
if (itemPartMap.containsKey(mesBom.getItemPartNo())) {
|
|
|
|
|
MesPart itemPart = itemPartMap.get(mesBom.getItemPartNo()).iterator().next();
|
|
|
|
|
if (!StringUtil.isEmpty(itemPart.getEsd()) && mesMoveRuleMap.containsKey(itemPart.getEsd())) {
|
|
|
|
|
moveRule = mesMoveRuleMap.get(itemPart.getEsd()).iterator().next();
|
|
|
|
|
if (MesExtEnumUtil.MOVE_TYPE_REPORT_TYPE.REPORT_MOVE.getValue() == moveRule.getReportType()) {
|
|
|
|
|
isItemMove = true;
|
|
|
|
|
isItemReport = true;
|
|
|
|
|
} else if (MesExtEnumUtil.MOVE_TYPE_REPORT_TYPE.REPORT.getValue() == moveRule.getReportType()) {
|
|
|
|
|
isItemReport = true;
|
|
|
|
|
} else if (MesExtEnumUtil.MOVE_TYPE_REPORT_TYPE.MOVE.getValue() == moveRule.getReportType()) {
|
|
|
|
|
isItemMove = true;
|
|
|
|
|
}
|
|
|
|
|
for (MesBom mesBom : mesBoms) {
|
|
|
|
|
isItemReport = false;
|
|
|
|
|
isItemMove = false;
|
|
|
|
|
moveRule = null;
|
|
|
|
|
if (itemPartMap.containsKey(mesBom.getItemPartNo())) {
|
|
|
|
|
MesPart itemPart = itemPartMap.get(mesBom.getItemPartNo()).iterator().next();
|
|
|
|
|
if (!StringUtil.isEmpty(itemPart.getEsd()) && mesMoveRuleMap.containsKey(itemPart.getEsd())) {
|
|
|
|
|
moveRule = mesMoveRuleMap.get(itemPart.getEsd()).iterator().next();
|
|
|
|
|
if (MesExtEnumUtil.MOVE_TYPE_REPORT_TYPE.REPORT_MOVE.getValue() == moveRule.getReportType()) {
|
|
|
|
|
isItemMove = true;
|
|
|
|
|
isItemReport = true;
|
|
|
|
|
} else if (MesExtEnumUtil.MOVE_TYPE_REPORT_TYPE.REPORT.getValue() == moveRule.getReportType()) {
|
|
|
|
|
isItemReport = true;
|
|
|
|
|
} else if (MesExtEnumUtil.MOVE_TYPE_REPORT_TYPE.MOVE.getValue() == moveRule.getReportType()) {
|
|
|
|
|
isItemMove = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//汇报
|
|
|
|
|
if (isItemReport) {
|
|
|
|
|
mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom, true));
|
|
|
|
|
}
|
|
|
|
|
//移库
|
|
|
|
|
if (isItemMove) {
|
|
|
|
|
MesPartSap mesPartSap = null;
|
|
|
|
|
if (mesPartSapMap.containsKey(mesBom.getItemPartNo())) {
|
|
|
|
|
mesPartSap = mesPartSapMap.get(mesBom.getItemPartNo()).iterator().next();
|
|
|
|
|
}
|
|
|
|
|
MesMove move = createMove(mesPartSap, moveRule.getErpSrcLocateNo(), moveRule.getErpDestLocateNo(), mesBom.getOrganizeCode(), mesBom.getItemQty(), "", MesExtEnumUtil.MOVE_TYPE.RAW_MATERIAL_MOVE.getValue());
|
|
|
|
|
move.setMatnr(mesBom.getItemPartNo());
|
|
|
|
|
mesMoveList.add(move);
|
|
|
|
|
}
|
|
|
|
|
//汇报
|
|
|
|
|
if (isItemReport) {
|
|
|
|
|
mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom, true));
|
|
|
|
|
}
|
|
|
|
|
//移库
|
|
|
|
|
if (isItemMove) {
|
|
|
|
|
MesPartSap mesPartSap = null;
|
|
|
|
|
if (mesPartSapMap.containsKey(mesBom.getItemPartNo())) {
|
|
|
|
|
mesPartSap = mesPartSapMap.get(mesBom.getItemPartNo()).iterator().next();
|
|
|
|
|
}
|
|
|
|
|
MesMove move = createMove(mesPartSap, moveRule.getErpSrcLocateNo(), moveRule.getErpDestLocateNo(), mesBom.getOrganizeCode(), mesBom.getItemQty(), "", MesExtEnumUtil.MOVE_TYPE.RAW_MATERIAL_MOVE.getValue());
|
|
|
|
|
move.setMatnr(mesBom.getItemPartNo());
|
|
|
|
|
mesMoveList.add(move);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -790,26 +1056,12 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
return mesProdRuleSortCfg;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private List<String> getStringList(MesWorkOrder mesWorkOrder) {
|
|
|
|
|
private String getStringList(MesWorkOrder mesWorkOrder) {
|
|
|
|
|
GenSerialNoModel genSerialNoModel = new GenSerialNoModel(MesCommonConstant.REPORT_SN);
|
|
|
|
|
List<String> resultList = syncFuncService.syncSerialNo(genSerialNoModel, mesWorkOrder.getCreateUser(), mesWorkOrder.getOrganizeCode(), mesWorkOrder.getNum()).getResultList();
|
|
|
|
|
return resultList;
|
|
|
|
|
List<String> resultList = syncFuncService.syncSerialNo(genSerialNoModel, mesWorkOrder.getCreateUser(), mesWorkOrder.getOrganizeCode(), 1).getResultList();
|
|
|
|
|
return resultList.iterator().next();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private List<MesBom> getMesBoms(String partNo, String organizeCode, String bomVersion) {
|
|
|
|
|
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(partNo, "partNo", ddlPackBean);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(bomVersion, "bomVersion", ddlPackBean);
|
|
|
|
|
DdlPreparedPack.getStringSmallerPack(TimeTool.getNowTime(true), "effStartTime", ddlPackBean);
|
|
|
|
|
DdlPreparedPack.getOrderBy("effStartTime", CommonEnumUtil.ASC_OR_DESC.DESC.getValue(), ddlPackBean);
|
|
|
|
|
List<MesBom> mesBoms = mesBomRDao.findByHqlWhere(ddlPackBean);
|
|
|
|
|
if (CollectionUtils.isEmpty(mesBoms)) {
|
|
|
|
|
MesException.throwMesBusiException("物料【%s】生产版本【%s】对应bom信息不存在", partNo, bomVersion);
|
|
|
|
|
}
|
|
|
|
|
MesBom next = mesBoms.iterator().next();
|
|
|
|
|
//如果存在多个bomCode取最新的一个
|
|
|
|
|
return mesBoms.stream().collect(Collectors.groupingBy(MesBom::getBomCode)).get(next.getBomCode());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private MesProductVersion getMesProductVersion(MesWorkOrder mesWorkOrder) {
|
|
|
|
|
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(mesWorkOrder.getOrganizeCode());
|
|
|
|
@ -836,10 +1088,10 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
newMesProductOffLine.setReportSn(sn);
|
|
|
|
|
newMesProductOffLine.setItemPartNo(mesBom.getItemPartNo());
|
|
|
|
|
newMesProductOffLine.setItemPartName(mesBom.getItemPartName());
|
|
|
|
|
newMesProductOffLine.setItemQty(mesBom.getItemQty());
|
|
|
|
|
newMesProductOffLine.setItemQty(MathOperation.mul(mesWorkOrder.getNum(), mesBom.getItemQty()));
|
|
|
|
|
newMesProductOffLine.setAlort(mesProductVersion.getReceiveInventoryPoint());
|
|
|
|
|
newMesProductOffLine.setStgeLoc(mesProductVersion.getShipInventoryPoint());
|
|
|
|
|
newMesProductOffLine.setQty(1d);
|
|
|
|
|
newMesProductOffLine.setQty(Double.valueOf(mesWorkOrder.getNum()));
|
|
|
|
|
newMesProductOffLine.setBomVersion(mesWorkOrder.getProductVersion());
|
|
|
|
|
newMesProductOffLine.setSerialNumber(sn);
|
|
|
|
|
newMesProductOffLine.setUnit(mesBom.getUnit());
|
|
|
|
@ -893,20 +1145,4 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
|
|
|
|
|
return move;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 提供(相对)精确的除法运算。 当发生除不尽的情况时,由scale参数指定精度,以后的数字四舍五入。
|
|
|
|
|
*
|
|
|
|
|
* @param dividend 被除数
|
|
|
|
|
* @param divisor 除数
|
|
|
|
|
* @param scale 表示表示需要精确到小数点以后几位。
|
|
|
|
|
* @return 两个参数的商
|
|
|
|
|
*/
|
|
|
|
|
public Double divide(Double dividend, Double divisor, Integer scale) {
|
|
|
|
|
if (scale < 0) {
|
|
|
|
|
throw new IllegalArgumentException("The scale must be a positive integer or zero");
|
|
|
|
|
}
|
|
|
|
|
BigDecimal b1 = new BigDecimal(Double.toString(dividend));
|
|
|
|
|
BigDecimal b2 = new BigDecimal(Double.toString(divisor));
|
|
|
|
|
return b1.divide(b2, scale, RoundingMode.HALF_UP).doubleValue();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|