|
|
|
@ -2,38 +2,65 @@ package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base;
|
|
|
|
|
|
|
|
|
|
import cn.estsh.i3plus.ext.mes.api.base.IMesPartPullService;
|
|
|
|
|
import cn.estsh.i3plus.ext.mes.api.base.IMesPullingOrderInfoService;
|
|
|
|
|
import cn.estsh.i3plus.ext.mes.apiservice.utils.MesException;
|
|
|
|
|
import cn.estsh.i3plus.ext.mes.pojo.constant.MesCommonConstant;
|
|
|
|
|
import cn.estsh.i3plus.ext.mes.pojo.util.MesExtConstWords;
|
|
|
|
|
import cn.estsh.i3plus.icloud.core.sdk.ICoreUtilCloud;
|
|
|
|
|
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
|
|
|
|
|
import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum;
|
|
|
|
|
import cn.estsh.i3plus.platform.common.util.WmsConstWords;
|
|
|
|
|
import cn.estsh.i3plus.pojo.base.bean.BaseResultBean;
|
|
|
|
|
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
|
|
|
|
|
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
|
|
|
|
|
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
|
|
|
|
|
import cn.estsh.i3plus.pojo.base.util.StringUtil;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.bean.MesPartPull;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.bean.MesPullingOrderInfo;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.repository.MesPullingOrderPartInfoRepository;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.bean.*;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.repository.*;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
|
|
|
|
|
import cn.estsh.impp.framework.boot.auth.AuthUtil;
|
|
|
|
|
import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder;
|
|
|
|
|
import cn.estsh.impp.framework.boot.util.ValidatorBean;
|
|
|
|
|
import com.alibaba.fastjson.JSON;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
import org.apache.shiro.util.CollectionUtils;
|
|
|
|
|
import org.slf4j.Logger;
|
|
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
|
|
import java.util.HashMap;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
import java.util.*;
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
|
@Service
|
|
|
|
|
@Slf4j
|
|
|
|
|
public class MesPullingOrderInfoService extends BaseMesService<MesPullingOrderInfo> implements IMesPullingOrderInfoService {
|
|
|
|
|
|
|
|
|
|
public static final Logger LOGGER = LoggerFactory.getLogger(MesPullingOrderInfoService.class);
|
|
|
|
|
@Autowired
|
|
|
|
|
private MesPullingOrderInfoRepository mesPullingOrderInfoRepository;
|
|
|
|
|
@Autowired
|
|
|
|
|
private MesPullingOrderPartInfoRepository mesPullingOrderPartInfoRepository;
|
|
|
|
|
@Autowired
|
|
|
|
|
private MesPartPullRepository mesPartPullRDao;
|
|
|
|
|
@Autowired
|
|
|
|
|
private MesPartPullDetailRepository mesPartPullDetailRDao;
|
|
|
|
|
@Autowired
|
|
|
|
|
private MesWorkOrderPartRepository workOrderPartRepository;
|
|
|
|
|
@Autowired
|
|
|
|
|
private MesWorkOrderRepository mesWorkOrderRepository;
|
|
|
|
|
@Autowired
|
|
|
|
|
private ICoreUtilCloud sysOrderNoRuleCloud;
|
|
|
|
|
@Autowired
|
|
|
|
|
private MesWorkCenterRepository mesWorkCenterRepository;
|
|
|
|
|
@Autowired
|
|
|
|
|
private MesPullingOrderExtendsRepository mesPullingOrderExtendsRepository;
|
|
|
|
|
|
|
|
|
|
protected void setPackQueryBean(MesPullingOrderInfo bean, DdlPackBean packBean) {
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(bean.getPullCode(), "pullCode", packBean);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(bean.getPullingOrderNo(), "pullingOrderNo", packBean);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(bean.getWorkCenterCode(), "workCenterCode", packBean);
|
|
|
|
|
DdlPreparedPack.getNumEqualPack(bean.getPullOrderType(), "pullOrderType", packBean);
|
|
|
|
|
DdlPreparedPack.getNumEqualPack(bean.getPrintStatus(), "printStatus", packBean);
|
|
|
|
|
DdlPreparedPack.getNumEqualPack(bean.getPullOrderStatus(), "pullOrderStatus", packBean);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(bean.getWorkOrderNo(), "workOrderNo", packBean);
|
|
|
|
|
DdlPreparedPack.getStringLikerPack(bean.getPartNo(), "partNo", packBean);
|
|
|
|
|
}
|
|
|
|
@ -63,6 +90,175 @@ public class MesPullingOrderInfoService extends BaseMesService<MesPullingOrderIn
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void doCreatePullOrderByPullGroupAndWorkOrder(String organizeCode, String userName) {
|
|
|
|
|
//1.拉动组集合+拉动组明细集合pullingGroupList+ pullingpartlist
|
|
|
|
|
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
|
|
|
|
|
List<MesPartPull> pulliGroupList = mesPartPullRDao.findByHqlWhere(ddlPackBean);
|
|
|
|
|
if (CollectionUtils.isEmpty(pulliGroupList)) {
|
|
|
|
|
LOGGER.info("根据拉动组和生产工单产生拉动单JOB-->{}拉动组不存在", organizeCode);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
Map<String, List<MesPartPull>> pullCodeMap = pulliGroupList.stream().collect(Collectors.groupingBy(MesPartPull::getPullCode));
|
|
|
|
|
|
|
|
|
|
DdlPackBean ddlPackBeanDetail = DdlPackBean.getDdlPackBean(organizeCode);
|
|
|
|
|
List<MesPartPullDetail> pullDetailList = mesPartPullDetailRDao.findByHqlWhere(ddlPackBeanDetail);
|
|
|
|
|
if (CollectionUtils.isEmpty(pullDetailList)) {
|
|
|
|
|
LOGGER.info("根据拉动组和生产工单产生拉动单JOB-->{}拉动组明细不存在", organizeCode);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
Map<String, List<MesPartPullDetail>> partPullDetailListMap = pullDetailList.stream().collect(Collectors.groupingBy(MesPartPullDetail::getPartNo));
|
|
|
|
|
//2.客户物料集合 [PART_NO] in 拉动组明细物料集合
|
|
|
|
|
//3.产线数据
|
|
|
|
|
DdlPackBean workPackBean = DdlPackBean.getDdlPackBean(organizeCode);
|
|
|
|
|
List<String> workCenterList = pulliGroupList.stream().map(MesPartPull::getWorkCenterCode).collect(Collectors.toList());
|
|
|
|
|
DdlPreparedPack.getInPackList(workCenterList, "workCenterCode", workPackBean);
|
|
|
|
|
List<MesWorkCenter> mesWorkCenterList = mesWorkCenterRepository.findByHqlWhere(workPackBean);
|
|
|
|
|
if (CollectionUtils.isEmpty(mesWorkCenterList)) {
|
|
|
|
|
LOGGER.info("根据拉动组和生产工单产生拉动单JOB-->工厂号{},拉动组对应产线信息不存在-->{}", organizeCode, workCenterList);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
Map<String, List<MesWorkCenter>> workCenterListMap = mesWorkCenterList.stream().collect(Collectors.groupingBy(MesWorkCenter::getWorkCenterCode));
|
|
|
|
|
|
|
|
|
|
//4.生产工单 在加工状态 [PULLING_STATUS] =0 未创建
|
|
|
|
|
DdlPackBean packBeanWorkOrder = DdlPackBean.getDdlPackBean(organizeCode);
|
|
|
|
|
DdlPreparedPack.getInPackList(workCenterList, "workCenterCode", packBeanWorkOrder);
|
|
|
|
|
DdlPreparedPack.getInPackList(Arrays.asList(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue(),MesExtEnumUtil.ORDER_STATUS.PROCESS.getValue()), "workOrderStatus", packBeanWorkOrder);
|
|
|
|
|
DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.WORK_ORDER_PULLING_STATUS.NOTCREATE.getValue(), "pullingStatus", packBeanWorkOrder);
|
|
|
|
|
List<MesWorkOrder> workOrderList = mesWorkOrderRepository.findByHqlWhere(packBeanWorkOrder);
|
|
|
|
|
if (CollectionUtils.isEmpty(workOrderList)) {
|
|
|
|
|
LOGGER.info("根据拉动组和生产工单产生拉动单JOB-->工厂号{},产线信息没有【未创建】【在加工】状态的工单-->{}", organizeCode, workCenterList);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
Map<String, List<MesWorkOrder>> workOrderListMap = workOrderList.stream().collect(Collectors.groupingBy(MesWorkOrder::getWorkOrderNo));
|
|
|
|
|
|
|
|
|
|
DdlPackBean packBeanWorkOrderPart = DdlPackBean.getDdlPackBean(organizeCode);
|
|
|
|
|
DdlPreparedPack.getInPackList(workOrderList.stream().map(MesWorkOrder::getWorkOrderNo).collect(Collectors.toList()), "workOrderNo", workPackBean);
|
|
|
|
|
List<MesWorkOrderPart> mesWorkOrderPartList = workOrderPartRepository.findByHqlWhere(packBeanWorkOrderPart);
|
|
|
|
|
if (CollectionUtils.isEmpty(mesWorkOrderPartList)) {
|
|
|
|
|
LOGGER.info("根据拉动组和生产工单产生拉动单JOB-->工厂号{},产线对应的工单对应工单零件不存在-->{}", organizeCode, workCenterList);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
//5.取工单零件和拉动组交集,根据拉动主表对应的类型 生成相应的拉动单和拉动单明细
|
|
|
|
|
Map<String, List<MesWorkOrderPart>> workOrderNoListMap = mesWorkOrderPartList.stream().collect(Collectors.groupingBy(MesWorkOrderPart::getWorkOrderNo));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (Map.Entry<String, List<MesWorkOrderPart>> stringListEntry : workOrderNoListMap.entrySet()) {
|
|
|
|
|
//需要生成拉动单的工单号 对应工单
|
|
|
|
|
List<MesWorkOrder> mesWorkOrders = workOrderListMap.get(stringListEntry.getKey());
|
|
|
|
|
MesWorkOrder mesWorkOrder = mesWorkOrders.get(0);
|
|
|
|
|
|
|
|
|
|
//工单对应的工单零件号
|
|
|
|
|
List<MesWorkOrderPart> workOrderParts = stringListEntry.getValue();
|
|
|
|
|
//待生成的拉动组明细
|
|
|
|
|
List<MesPartPullDetail> pullDetailListNew = new ArrayList<>();
|
|
|
|
|
for (MesWorkOrderPart workOrderPart : workOrderParts) {
|
|
|
|
|
if (!CollectionUtils.isEmpty(partPullDetailListMap.get(workOrderPart.getPartNo()))) {
|
|
|
|
|
pullDetailListNew.addAll(partPullDetailListMap.get(workOrderPart.getPartNo()));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (CollectionUtils.isEmpty(pullDetailListNew)) {
|
|
|
|
|
LOGGER.info("根据拉动组和生产工单产生拉动单JOB-->工厂号{},产线-->{}对应的工单号-->{}没有需要生成拉动单零件",
|
|
|
|
|
organizeCode, mesWorkOrder.getWorkCenterCode(), mesWorkOrder.getWorkOrderNo());
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
Map<String, List<MesWorkOrderPart>> workOrderPartListMap = workOrderParts.stream().collect(Collectors.groupingBy(MesWorkOrderPart::getPartNo));
|
|
|
|
|
//生成拉动单 如果是多个拉动组的话都要产生拉动单
|
|
|
|
|
Map<String, List<MesPartPullDetail>> pullCodeListMap = pullDetailListNew.stream().collect(Collectors.groupingBy(MesPartPullDetail::getPullCode));
|
|
|
|
|
for (Map.Entry<String, List<MesPartPullDetail>> stringListEntryDetail : pullCodeListMap.entrySet()) {
|
|
|
|
|
String pullCode = stringListEntryDetail.getKey();
|
|
|
|
|
List<MesPartPull> mesPartPulls = pullCodeMap.get(pullCode);
|
|
|
|
|
MesPartPull mesPartPull = mesPartPulls.get(0);//拉动组明细拉动单号对应拉动组
|
|
|
|
|
List<MesPartPullDetail> mesPartPullDetails = stringListEntryDetail.getValue();
|
|
|
|
|
//调用平台生成拉动单号流水 -yyyyMMdd00001
|
|
|
|
|
String orderNo = "";
|
|
|
|
|
if (mesPartPull.getPullOrderType() == MesExtEnumUtil.PART_PULL_ORDER_TYPE.KITTING_PULL.getValue()) {
|
|
|
|
|
orderNo = "KITTING";
|
|
|
|
|
} else if (mesPartPull.getPullOrderType() == MesExtEnumUtil.PART_PULL_ORDER_TYPE.JIS_PULL.getValue()) {
|
|
|
|
|
orderNo = "JIS";
|
|
|
|
|
} else if (mesPartPull.getPullOrderType() == MesExtEnumUtil.PART_PULL_ORDER_TYPE.SPS_PULL.getValue()) {
|
|
|
|
|
orderNo = "SPS";
|
|
|
|
|
} else if (mesPartPull.getPullOrderType() == MesExtEnumUtil.PART_PULL_ORDER_TYPE.BENZ_PULL.getValue()) {
|
|
|
|
|
orderNo = "BENZ";
|
|
|
|
|
} else if (mesPartPull.getPullOrderType() == MesExtEnumUtil.PART_PULL_ORDER_TYPE.PICK_PULL.getValue()) {
|
|
|
|
|
orderNo = "PICK";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BaseResultBean<LinkedHashMap> orderResutlBean = sysOrderNoRuleCloud.getOrderNo(MesCommonConstant.MES_PULL_ORDER_NO);
|
|
|
|
|
if (orderResutlBean != null && orderResutlBean.isSuccess()) {
|
|
|
|
|
orderNo += orderResutlBean.getResultObject().get(WmsConstWords.CORE_ORDER_NO).toString();
|
|
|
|
|
} else {
|
|
|
|
|
throw ImppExceptionBuilder.newInstance()
|
|
|
|
|
.setSystemID(CommonEnumUtil.SOFT_TYPE.WMS.getCode())
|
|
|
|
|
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION_DATA_NOT_EXIT.getCode())
|
|
|
|
|
.setErrorDetail("生成单号失败")
|
|
|
|
|
.setErrorSolution("【MES_PULL_ORDER_NO】请重新操作或查看服务!")
|
|
|
|
|
.build();
|
|
|
|
|
}
|
|
|
|
|
MesPullingOrderInfo pullingOrder = new MesPullingOrderInfo();
|
|
|
|
|
pullingOrder.setOrganizeCode(organizeCode);
|
|
|
|
|
pullingOrder.setPullingOrderNo(orderNo);
|
|
|
|
|
pullingOrder.setPullOrderType(mesPartPull.getPullOrderType());
|
|
|
|
|
pullingOrder.setPullGroupFid(mesPartPull.getId());
|
|
|
|
|
pullingOrder.setCustOrderNo(StringUtil.isEmpty(mesWorkOrder.getCustOrderNo()) ? "" : mesWorkOrder.getCustOrderNo());
|
|
|
|
|
pullingOrder.setWorkOrderNo(mesWorkOrder.getWorkOrderNo());
|
|
|
|
|
pullingOrder.setWorkOrderSeq(StringUtil.isEmpty(mesWorkOrder.getWorkOrderSeq()) ? "" : mesWorkOrder.getWorkOrderSeq());
|
|
|
|
|
pullingOrder.setIsPrint(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
|
|
|
|
|
pullingOrder.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.UNPRINT.getValue());
|
|
|
|
|
pullingOrder.setPullOrderStatus(MesExtEnumUtil.PULL_ORDER_STATUS.KITTING_PULL.getValue());
|
|
|
|
|
pullingOrder.setWorkCenterCode(mesPartPull.getWorkCenterCode());
|
|
|
|
|
pullingOrder.setPullCode(mesPartPull.getPullCode());
|
|
|
|
|
pullingOrder.setPartNo(mesWorkOrder.getPartNo());
|
|
|
|
|
pullingOrder.setPartName(mesWorkOrder.getPartName());
|
|
|
|
|
pullingOrder.setCustPartNo(mesWorkOrder.getCustPartNo());
|
|
|
|
|
pullingOrder.setProduceSeq(StringUtil.isEmpty(mesWorkOrder.getProduceSeq()) ? 0 : mesWorkOrder.getProduceSeq());
|
|
|
|
|
|
|
|
|
|
ConvertBean.serviceModelInitialize(pullingOrder, userName);
|
|
|
|
|
mesPullingOrderInfoRepository.insert(pullingOrder);
|
|
|
|
|
|
|
|
|
|
for (MesPartPullDetail partInfo : mesPartPullDetails) {
|
|
|
|
|
MesPullingOrderPartInfo pullingOrderPartInfo = new MesPullingOrderPartInfo();
|
|
|
|
|
pullingOrderPartInfo.setOrganizeCode(organizeCode);
|
|
|
|
|
pullingOrderPartInfo.setPullCode(partInfo.getPullCode());
|
|
|
|
|
pullingOrderPartInfo.setPullingOrderNo(pullingOrder.getPullingOrderNo());
|
|
|
|
|
pullingOrderPartInfo.setWorkOrderNo(pullingOrder.getWorkOrderNo());
|
|
|
|
|
pullingOrderPartInfo.setWorkOrderSeq(pullingOrder.getWorkOrderSeq());
|
|
|
|
|
pullingOrderPartInfo.setCustOrderNo(pullingOrder.getCustOrderNo());
|
|
|
|
|
pullingOrderPartInfo.setPartNo(partInfo.getPartNo());
|
|
|
|
|
pullingOrderPartInfo.setPartName(partInfo.getPartName());
|
|
|
|
|
MesWorkOrderPart mesWorkOrderPart = workOrderPartListMap.get(partInfo.getPartNo()).get(0);
|
|
|
|
|
pullingOrderPartInfo.setPullQty(mesWorkOrderPart.getItemQty());
|
|
|
|
|
pullingOrderPartInfo.setCustOrderNo(pullingOrder.getCustOrderNo());
|
|
|
|
|
pullingOrderPartInfo.setWorkOrderSeq(pullingOrder.getWorkOrderSeq());
|
|
|
|
|
pullingOrderPartInfo.setWaterSeq(pullingOrder.getProduceSeq());
|
|
|
|
|
pullingOrderPartInfo.setWorkCellCode(mesWorkOrderPart.getWorkCellCode());
|
|
|
|
|
pullingOrderPartInfo.setEquipment(partInfo.getEquipment());
|
|
|
|
|
pullingOrderPartInfo.setLocation(partInfo.getPullAddr());//todo
|
|
|
|
|
pullingOrderPartInfo.setStatus(MesExtEnumUtil.PULL_ORDER_PART_STATUS.UN_SENTED.getValue());///明细已送料为1,未送料为0
|
|
|
|
|
pullingOrderPartInfo.setCustPartNo(pullingOrder.getCustPartNo());
|
|
|
|
|
|
|
|
|
|
ConvertBean.serviceModelInitialize(pullingOrderPartInfo, userName);
|
|
|
|
|
mesPullingOrderPartInfoRepository.insert(pullingOrderPartInfo);
|
|
|
|
|
}
|
|
|
|
|
//7.拉动组+加工单号+生成拉动单状态的对应关系中间表,每次新增都要记录
|
|
|
|
|
MesPullingOrderExtends mesPullingOrderExtends= new MesPullingOrderExtends();
|
|
|
|
|
mesPullingOrderExtends.setOrganizeCode(organizeCode);
|
|
|
|
|
mesPullingOrderExtends.setPullCode(pullingOrder.getPullCode());
|
|
|
|
|
mesPullingOrderExtends.setPullingOrderNo(pullingOrder.getPullingOrderNo());
|
|
|
|
|
mesPullingOrderExtends.setWorkOrderNo(pullingOrder.getWorkOrderNo());
|
|
|
|
|
mesPullingOrderExtends.setPullOrderStatus(pullingOrder.getPullOrderStatus());
|
|
|
|
|
ConvertBean.serviceModelInitialize(mesPullingOrderExtends, userName);
|
|
|
|
|
|
|
|
|
|
mesPullingOrderExtendsRepository.insert(mesPullingOrderExtends);
|
|
|
|
|
}
|
|
|
|
|
//6.产生拉动单后更新工单拉动状态为已拉动
|
|
|
|
|
mesWorkOrder.setPullingStatus(MesExtEnumUtil.WORK_ORDER_PULLING_STATUS.SUBMIT.getValue());
|
|
|
|
|
mesWorkOrderRepository.update(mesWorkOrder);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public Map doSPSForEquipment(String assemblyLine, String pullingGroupCode, String organizeCode) {
|
|
|
|
|
Map resultMap = new HashMap();
|
|
|
|
|
//查询拉动单状态为已扫描=20的 拉动单
|
|
|
|
|