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

tags/yfai-mes-ext-v1.0
jun 11 months ago
commit a2e1e427a3

@ -38,7 +38,7 @@ public class MesBtoJobServiceImpl implements IMesBtoJobService {
//1. 根据 organizeCode 和 groupCodeList 查询零件生产组
List<MesPartProdGroup> mesPartProdGroups = mesPartProdGroupService.findMesPartProdGroups(organizeCode, groupCodeList);
for (MesPartProdGroup prodGroup : mesPartProdGroups) {
//2. 根据生产组的infoPointId 获取 过点信息TM_BAS_INFO_POINT
//2. 根据生产组的infoPointCode 获取 过点信息MES_CUSTOMER_MESSAGE_POINT
MesCustomerMessagePoint messagePoint = mesCustomerMessagePointService.getPointByCode(prodGroup.getCustInfoPoint(),organizeCode);
if (messagePoint == null){
log.info("客户的信息点{}不存在",prodGroup.getCustInfoPoint());

@ -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);
}
}

@ -23,8 +23,9 @@ public class WebServiceServerIns {
maximoParamModel.setAssetNum(meterInfo.getASSETNUM());
maximoParamModel.setBaseMeasureUnitId(meterInfo.getBASEMEASUREUNITID());
maximoParamModel.setMeterName(meterInfo.getMETERNAME());
maximoParamModel.setSiteId(meterInfo.getSITEID());
MaximoServiceImpl bean = (MaximoServiceImpl) SpringContextsUtil.getBean("maximoServiceImpl");
return bean.doAssetMainData(maximoParamModel);
return bean.doMeterMainData(maximoParamModel);
}
}

Loading…
Cancel
Save