|
|
|
@ -2,16 +2,17 @@ package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base.roundness;
|
|
|
|
|
|
|
|
|
|
import cn.estsh.i3plus.ext.mes.api.base.strategy.IRoundnessStrategy;
|
|
|
|
|
import cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base.MesCustSoftInfoServiceImpl;
|
|
|
|
|
import cn.estsh.i3plus.ext.mes.pojo.constant.MesCommonConstant;
|
|
|
|
|
import cn.estsh.i3plus.mes.api.iservice.busi.ISyncFuncService;
|
|
|
|
|
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
|
|
|
|
|
import cn.estsh.i3plus.platform.common.tool.TimeTool;
|
|
|
|
|
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
|
|
|
|
|
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
|
|
|
|
|
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.bean.*;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.bean.shipping.MesCustSortInfo;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.repository.IMesProdGroupPartBtoCountRepository;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.repository.MesPartSapRepository;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.repository.MesProductVersionRepository;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.repository.MesWorkOrderRepository;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.repository.*;
|
|
|
|
|
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
|
|
|
|
|
import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder;
|
|
|
|
|
import org.slf4j.Logger;
|
|
|
|
@ -20,7 +21,9 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
|
|
import java.text.DateFormat;
|
|
|
|
|
import java.text.ParseException;
|
|
|
|
|
import java.text.SimpleDateFormat;
|
|
|
|
|
import java.util.Calendar;
|
|
|
|
|
import java.util.Comparator;
|
|
|
|
|
import java.util.Date;
|
|
|
|
|
import java.util.List;
|
|
|
|
@ -52,98 +55,158 @@ public class MesTimeRoundnessService implements IRoundnessStrategy {
|
|
|
|
|
@Autowired
|
|
|
|
|
private MesCustSoftInfoServiceImpl custSoftInfoService;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private ISyncFuncService syncFuncService;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private MesWorkCenterRepository mesWorkCenterRao;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private MesShiftRepository mesShiftRao;
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void execute(MesPartProdGroup partProdGroup, List<MesCustSortInfo> sortInfoList, List<MesPartProdGroupDetail> details) {
|
|
|
|
|
DateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
|
|
|
|
|
Long createSeq = Long.parseLong(dateFormat.format(new Date()));
|
|
|
|
|
//遍历零件生产组零件,过滤出
|
|
|
|
|
for (MesPartProdGroupDetail detail : details) {
|
|
|
|
|
//根据detail.id 获取
|
|
|
|
|
MesProdGroupPartBtoCount btoCountInfo = getByGroupPartId(detail.getId(), detail.getOrganizeCode());
|
|
|
|
|
//历史累计差异
|
|
|
|
|
double btoCount = btoCountInfo.getCurrentQty();
|
|
|
|
|
//获取圆整数量
|
|
|
|
|
double roundQty = detail.getRoundQty();
|
|
|
|
|
List<MesCustSortInfo> sortInfos = sortInfoList.stream().filter(info -> info.getCustPartNo().equals(detail.getCustPartNo())).collect(Collectors.toList());
|
|
|
|
|
if (sortInfos.isEmpty()) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
//本次排序需要的数量
|
|
|
|
|
Double qty = sortInfoList.stream().map(MesCustSortInfo::getQty).reduce(Double::sum).get() * detail.getProductPartQty();
|
|
|
|
|
qty -= btoCount;
|
|
|
|
|
//倍数
|
|
|
|
|
int multiple;
|
|
|
|
|
//如果上次累计的差异值大于当前排序信息累计值,则不需要生成加工单
|
|
|
|
|
if (qty <= 0) {
|
|
|
|
|
multiple = 0;
|
|
|
|
|
} else {
|
|
|
|
|
//看看多少倍,乘以圆整数量就是需求数,QTY就是多累积数
|
|
|
|
|
multiple = (int) Math.round(Math.ceil(Math.ceil(qty / roundQty)));
|
|
|
|
|
}
|
|
|
|
|
try {
|
|
|
|
|
//遍历零件生产组零件,过滤出
|
|
|
|
|
for (MesPartProdGroupDetail detail : details) {
|
|
|
|
|
//根据detail.id 获取
|
|
|
|
|
MesProdGroupPartBtoCount btoCountInfo = getByGroupPartId(detail.getId(), detail.getOrganizeCode());
|
|
|
|
|
//历史累计差异
|
|
|
|
|
double btoCount = btoCountInfo.getCurrentQty();
|
|
|
|
|
//获取圆整数量
|
|
|
|
|
double roundQty = detail.getRoundQty();
|
|
|
|
|
List<MesCustSortInfo> sortInfos = sortInfoList.stream().filter(info -> info.getCustPartNo().equals(detail.getCustPartNo())).collect(Collectors.toList());
|
|
|
|
|
if (sortInfos.isEmpty()) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
//本次排序需要的数量
|
|
|
|
|
double qty = sortInfos.stream().map(MesCustSortInfo::getQty).reduce(Double::sum).get() * detail.getProductPartQty();
|
|
|
|
|
qty -= btoCount;
|
|
|
|
|
//倍数
|
|
|
|
|
int multiple;
|
|
|
|
|
//如果上次累计的差异值大于当前排序信息累计值,则不需要生成加工单
|
|
|
|
|
if (qty <= 0) {
|
|
|
|
|
multiple = 0;
|
|
|
|
|
} else {
|
|
|
|
|
//看看多少倍,乘以圆整数量就是需求数,QTY就是多累积数
|
|
|
|
|
multiple = (int) Math.round(Math.ceil(Math.ceil(qty / roundQty)));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//获取生产零件信息
|
|
|
|
|
MesPartSap mesPartSap = getMesPart(detail.getProductPartNo(), detail.getOrganizeCode());
|
|
|
|
|
if (mesPartSap.getId() == null) {
|
|
|
|
|
log.info("零件生成组零件:{}找不到对应的零件信息", detail.getProductPartNo());
|
|
|
|
|
throw ImppExceptionBuilder.newInstance().setErrorDetail("零件生成组零件:{}找不到对应的零件信息", detail.getProductPartNo()).build();
|
|
|
|
|
}
|
|
|
|
|
MesWorkOrder mesWorkOrder = new MesWorkOrder();
|
|
|
|
|
//工单号生成规则 【工厂号+yyyyMMdd+5位流水】
|
|
|
|
|
GenSerialNoModel genSerialNoModel = new GenSerialNoModel(MesCommonConstant.MES_WORK_ORDER_NO);
|
|
|
|
|
List<String> resultList = syncFuncService.syncSerialNo(genSerialNoModel,"JOB", detail.getOrganizeCode(), 1).getResultList();
|
|
|
|
|
mesWorkOrder.setWorkOrderNo(resultList.get(0));
|
|
|
|
|
mesWorkOrder.setWorkOrderType(MesExtEnumUtil.ORDER_TYPE.BTO.getValue());
|
|
|
|
|
mesWorkOrder.setWorkOrderSeq(createSeq.toString());
|
|
|
|
|
mesWorkOrder.setProduceSeq(createSeq);
|
|
|
|
|
mesWorkOrder.setCustPartNo(sortInfos.get(0).getCustPartNo());
|
|
|
|
|
//标识 -空
|
|
|
|
|
//状态 --- 根据零件发运组看是自动发布
|
|
|
|
|
if (partProdGroup.getIsAutoRelease() == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()){
|
|
|
|
|
mesWorkOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue());
|
|
|
|
|
}{
|
|
|
|
|
mesWorkOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.CREATE.getValue());
|
|
|
|
|
}
|
|
|
|
|
//车型大类-空
|
|
|
|
|
mesWorkOrder.setOrganizeCode(detail.getOrganizeCode());
|
|
|
|
|
//erpWorkCenter 需要根据产线查询 组织模型
|
|
|
|
|
DdlPackBean workCenterPackBean = DdlPackBean.getDdlPackBean(detail.getOrganizeCode());
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(detail.getWorkCenterCode(),"workCenterCode",workCenterPackBean);
|
|
|
|
|
List<MesWorkCenter> centerList = mesWorkCenterRao.findByHqlWhere(workCenterPackBean);
|
|
|
|
|
if (!centerList.isEmpty()){
|
|
|
|
|
mesWorkOrder.setErpWorkCenter(centerList.get(0).getErpWorkCenter());
|
|
|
|
|
}
|
|
|
|
|
//产线
|
|
|
|
|
mesWorkOrder.setWorkCenterCode(detail.getWorkCenterCode());
|
|
|
|
|
//工位
|
|
|
|
|
mesWorkOrder.setWorkCellCode(detail.getWorkCellCode());
|
|
|
|
|
//生产日期,计划时间
|
|
|
|
|
List<MesCustSortInfo> sortInfosSorted = sortInfos.stream().sorted(Comparator.comparing(MesCustSortInfo::getMatchTime)).collect(Collectors.toList());
|
|
|
|
|
|
|
|
|
|
// 10. 根据工厂,产线,planStartTime 获取班次名称
|
|
|
|
|
String matchTime = sortInfosSorted.get(0).getMatchTime();
|
|
|
|
|
// 计划开始时间 工单创建时间(获取到的时间)
|
|
|
|
|
mesWorkOrder.setPlanStartTime(matchTime);
|
|
|
|
|
//计划结束时间 工单创建时间(获取到的时间)
|
|
|
|
|
mesWorkOrder.setPlanEndTime(matchTime);
|
|
|
|
|
// 生产时间 工单获取计划开始时间日期
|
|
|
|
|
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
|
|
Date parse = format.parse(matchTime);
|
|
|
|
|
String productTime = format.format(parse);
|
|
|
|
|
mesWorkOrder.setProductTime(productTime);
|
|
|
|
|
// 11. 是否将生成日期减一天
|
|
|
|
|
// 班次 根据产线+计划时间匹配班次
|
|
|
|
|
DdlPackBean shiftPackBean = DdlPackBean.getDdlPackBean(detail.getOrganizeCode());
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(detail.getWorkCenterCode(),"workCenterCode",shiftPackBean);
|
|
|
|
|
List<MesShift> shiftList = mesShiftRao.findByHqlWhere(shiftPackBean);
|
|
|
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
|
|
Date date = sdf.parse(matchTime);
|
|
|
|
|
Calendar calendar = Calendar.getInstance();
|
|
|
|
|
calendar.setTime(date);
|
|
|
|
|
int hours = calendar.get(Calendar.HOUR_OF_DAY);
|
|
|
|
|
int minutes = calendar.get(Calendar.MINUTE);
|
|
|
|
|
int shiftTime = Integer.parseInt(hours+""+minutes);
|
|
|
|
|
for (MesShift shift : shiftList) {
|
|
|
|
|
int startTime = Integer.parseInt(shift.getStartTime() );
|
|
|
|
|
int endTime = Integer.parseInt(shift.getEndTime() );
|
|
|
|
|
if (shiftTime >= startTime && shiftTime <= endTime) {
|
|
|
|
|
mesWorkOrder.setShiftName(shift.getShiftName());
|
|
|
|
|
mesWorkOrder.setShiftCode(shift.getShiftCode());
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// 12.零件相关
|
|
|
|
|
mesWorkOrder.setPartNo(mesPartSap.getPartNo());
|
|
|
|
|
mesWorkOrder.setPartName(mesPartSap.getPartName());
|
|
|
|
|
// 13.生产版本 organizeCode + partNo
|
|
|
|
|
MesProductVersion prodVersion = getProdVersion(detail.getOrganizeCode(), mesPartSap.getPartNo());
|
|
|
|
|
if (prodVersion == null) {
|
|
|
|
|
log.info("请配置工厂:{},partNo:{}的生产版本", detail.organizeCode, mesPartSap.getPartNo());
|
|
|
|
|
}
|
|
|
|
|
String productVersion = prodVersion.getProductVersion();
|
|
|
|
|
mesWorkOrder.setProductVersion(productVersion);
|
|
|
|
|
// 14.bomCode partNo + 生产版本+ organizeCode
|
|
|
|
|
// 数量
|
|
|
|
|
double realQty = roundQty * multiple;
|
|
|
|
|
mesWorkOrder.setQty(realQty);
|
|
|
|
|
mesWorkOrder.setUnCompleteQty(realQty);
|
|
|
|
|
mesWorkOrder.setUnit(mesPartSap.getUnit());
|
|
|
|
|
// if (partProdGroup.getIsAutoRelease() == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) {
|
|
|
|
|
// mesWorkOrder.setStatus(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue());
|
|
|
|
|
// } else {
|
|
|
|
|
// mesWorkOrder.setStatus(MesExtEnumUtil.ORDER_STATUS.CREATE.getValue());
|
|
|
|
|
// }
|
|
|
|
|
mesWorkOrder.setPartProdGroupCode(partProdGroup.getPartProdGroupCode());
|
|
|
|
|
|
|
|
|
|
//bto
|
|
|
|
|
btoCountInfo.setGroupPartId(detail.getId());
|
|
|
|
|
btoCountInfo.setOrganizeCode(detail.getOrganizeCode());
|
|
|
|
|
btoCountInfo.setRoundnessQty(roundQty);
|
|
|
|
|
btoCountInfo.setCurrentQty(realQty-qty);
|
|
|
|
|
ConvertBean.saveOrUpdate(btoCountInfo,"edi");
|
|
|
|
|
btoCountRao.save(btoCountInfo);
|
|
|
|
|
|
|
|
|
|
// 保存工单
|
|
|
|
|
ConvertBean.saveOrUpdate(mesWorkOrder, "edi");
|
|
|
|
|
mesWorkOrderRao.insert(mesWorkOrder);
|
|
|
|
|
//更新 custSortInfo 状态已解析
|
|
|
|
|
for (MesCustSortInfo sortInfo : sortInfos) {
|
|
|
|
|
sortInfo.setServiceFlag(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue());
|
|
|
|
|
custSoftInfoService.updateCustSortInfo(sortInfo);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//获取生产零件信息
|
|
|
|
|
MesPartSap mesPartSap = getMesPart(detail.getProductPartNo(), detail.getOrganizeCode());
|
|
|
|
|
if (mesPartSap.getId() == null) {
|
|
|
|
|
log.info("零件生成组零件:{}找不到对应的零件信息", detail.getProductPartNo());
|
|
|
|
|
throw ImppExceptionBuilder.newInstance().setErrorDetail("零件生成组零件:{}找不到对应的零件信息", detail.getProductPartNo()).build();
|
|
|
|
|
}
|
|
|
|
|
MesWorkOrder mesWorkOrder = new MesWorkOrder();
|
|
|
|
|
mesWorkOrder.setWorkOrderType(MesExtEnumUtil.ORDER_TYPE.BTO.getValue());
|
|
|
|
|
mesWorkOrder.setWorkOrderSeq(createSeq.toString());
|
|
|
|
|
mesWorkOrder.setProduceSeq(createSeq);
|
|
|
|
|
mesWorkOrder.setOrganizeCode(detail.getOrganizeCode());
|
|
|
|
|
//产线
|
|
|
|
|
mesWorkOrder.setWorkCenterCode(detail.getWorkCenterCode());
|
|
|
|
|
//工位
|
|
|
|
|
mesWorkOrder.setWorkCellCode(detail.getWorkCellCode());
|
|
|
|
|
//生产日期,计划时间
|
|
|
|
|
List<MesCustSortInfo> sortInfosSorted = sortInfos.stream().sorted(Comparator.comparing(MesCustSortInfo::getMatchTime)).collect(Collectors.toList());
|
|
|
|
|
// workorderinfo.ProductDate = custsortinfopartlist.Min(d => d.MatchTime.GetValueOrDefault()).ToString("yyyy-MM-dd");
|
|
|
|
|
// workorderinfo.PlanStartTime = custsortinfopartlist.Min(d => d.MatchTime.GetValueOrDefault());
|
|
|
|
|
// workorderinfo.PlanEndTime = custsortinfopartlist.Max(d => d.MatchTime.GetValueOrDefault());
|
|
|
|
|
// 10. 根据工厂,产线,planStartTime 获取班次名称
|
|
|
|
|
String matchTime = sortInfosSorted.get(0).getMatchTime();
|
|
|
|
|
// 11. 是否将生成日期减一天
|
|
|
|
|
// 12.零件相关
|
|
|
|
|
mesWorkOrder.setPartNo(mesPartSap.getPartNo());
|
|
|
|
|
mesWorkOrder.setPartName(mesPartSap.getPartName());
|
|
|
|
|
// 13.生产版本 organizeCode + partNo
|
|
|
|
|
MesProductVersion prodVersion = getProdVersion(detail.getOrganizeCode(), mesPartSap.getPartNo());
|
|
|
|
|
if (prodVersion == null) {
|
|
|
|
|
log.info("请配置工厂:{},partNo:{}的生产版本", detail.organizeCode, mesPartSap.getPartNo());
|
|
|
|
|
}
|
|
|
|
|
String productVersion = prodVersion.getProductVersion();
|
|
|
|
|
mesWorkOrder.setProductVersion(productVersion);
|
|
|
|
|
// 14.bomCode partNo + 生产版本+ organizeCode
|
|
|
|
|
// 数量
|
|
|
|
|
double realQty = roundQty * multiple;
|
|
|
|
|
mesWorkOrder.setQty(realQty);
|
|
|
|
|
mesWorkOrder.setUnCompleteQty(realQty);
|
|
|
|
|
mesWorkOrder.setUnit(mesPartSap.getUnit());
|
|
|
|
|
// if (partProdGroup.getIsAutoRelease() == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) {
|
|
|
|
|
// mesWorkOrder.setStatus(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue());
|
|
|
|
|
// } else {
|
|
|
|
|
// mesWorkOrder.setStatus(MesExtEnumUtil.ORDER_STATUS.CREATE.getValue());
|
|
|
|
|
// }
|
|
|
|
|
mesWorkOrder.setPartProdGroupCode(partProdGroup.getPartProdGroupCode());
|
|
|
|
|
|
|
|
|
|
//bto
|
|
|
|
|
btoCountInfo.setGroupPartId(detail.getId());
|
|
|
|
|
btoCountInfo.setOrganizeCode(detail.getOrganizeCode());
|
|
|
|
|
btoCountInfo.setRoundnessQty(roundQty);
|
|
|
|
|
btoCountInfo.setCurrentQty(realQty-qty);
|
|
|
|
|
ConvertBean.saveOrUpdate(btoCountInfo,"edi");
|
|
|
|
|
btoCountRao.save(btoCountInfo);
|
|
|
|
|
|
|
|
|
|
// 保存工单
|
|
|
|
|
ConvertBean.saveOrUpdate(mesWorkOrder, "edi");
|
|
|
|
|
mesWorkOrderRao.insert(mesWorkOrder);
|
|
|
|
|
//更新 custSortInfo 状态已解析
|
|
|
|
|
for (MesCustSortInfo sortInfo : sortInfos) {
|
|
|
|
|
sortInfo.setServiceFlag(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue());
|
|
|
|
|
custSoftInfoService.updateCustSortInfo(sortInfo);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} catch (ParseException e) {
|
|
|
|
|
throw new RuntimeException(e);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|