根据生产加工记录产线物料产生的工单报工job测试

tags/yfai-mes-ext-v1.0
gsz 11 months ago
parent 3720a134c5
commit e3fc93ecaa

@ -1,5 +1,8 @@
package cn.estsh.i3plus.ext.mes.api.base;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.bean.MesProductionRecord;
import cn.estsh.i3plus.pojo.mes.bean.MesShift;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder;
import cn.estsh.i3plus.pojo.mes.model.MesWorkOrderModel;
import cn.estsh.i3plus.pojo.model.wms.WmsProductModel;
@ -34,4 +37,13 @@ public interface IMesWorkOrderService extends IBaseMesService<MesWorkOrder> {
@ApiOperation("反向冲销")
void doReportWorkReversal(WmsProductModel model);
List<MesProductionRecord> getPreDayReportMesProductionRecord(String organizeCode , List<MesShift> mesShiftList, String workCenterCode);
List<MesProduceSn> getPreDayReportMesProduceSn(String organizeCode , List<MesProductionRecord> mesProductionRecordList );
public List<MesWorkOrder> insertMesWorkOrder(List<MesProduceSn> mesProduceSns,List<MesShift> mesShiftList,String organizeCode, String userName );
void doPcnJobProductReport(List<MesProduceSn> mesProduceSns,List<MesShift> mesShiftList,String organizeCode, String userName, MesWorkOrder mesWorkOrder);
}

@ -1,11 +1,22 @@
package cn.estsh.i3plus.ext.mes.apiservice.controller.busi;
import cn.estsh.i3plus.ext.mes.api.base.IMesCcscTaskService;
import cn.estsh.i3plus.ext.mes.api.base.IMesConfigService;
import cn.estsh.i3plus.ext.mes.api.base.IMesWorkOrderService;
import cn.estsh.i3plus.ext.mes.api.busi.IMaximoService;
import cn.estsh.i3plus.ext.mes.pojo.model.MaximoParamModel;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.bean.MesProductionRecord;
import cn.estsh.i3plus.pojo.mes.bean.MesShift;
import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder;
import cn.estsh.i3plus.pojo.mes.repository.MesProductionRecordRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesShiftRepository;
import cn.estsh.impp.framework.base.controller.MesBaseController;
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder;
import cn.estsh.impp.framework.boot.util.ResultBean;
import cn.estsh.impp.framework.boot.util.ValidatorBean;
import io.swagger.annotations.Api;
@ -14,8 +25,10 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@RestController
@ -31,6 +44,15 @@ public class MesWhiteListController extends MesBaseController {
@Autowired
private IMesCcscTaskService mesCcscTaskService;
@Autowired
private IMesWorkOrderService workOrderService;
@Autowired
private MesProductionRecordRepository productionRecordRao;
@Autowired
private MesShiftRepository mesShiftRepository;
@Autowired
private IMesConfigService configService;
@PostMapping(value = "/meter/main-data")
@ApiOperation(value = "Maximo仪表主数据", notes = "Maximo仪表主数据")
public Map doMeterMainData(@RequestBody MaximoParamModel paramModel) {
@ -73,5 +95,49 @@ public class MesWhiteListController extends MesBaseController {
}
return ResultBean.success().setSuccess(true);
}
@GetMapping("/reportWorkByPreDayJob")
@ApiOperation(value = "job测试")
public ResultBean queryReworkTaskByPager(String organizeCode) {
try {
//遍历系统参数指定的产线获取对应班次,找到早班的开始时间,
String workCenterCodes = configService.getCfgValue(organizeCode, "MES_PCN_WORK_CENTER_NO");
List<String> workCenterCodeList = Arrays.asList(workCenterCodes.split(","));
String userName = "REPORT_PRE_DAY_JOB";
for (String workCenterCode : workCenterCodeList) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(workCenterCode, "workCenterCode", packBean);
List<MesShift> mesShiftList = mesShiftRepository.findByHqlWhere(packBean);
//1.获取生产加工记录production_record表中report_status为待汇报状态的工单
List<MesProductionRecord> mesProductionRecordList = workOrderService.getPreDayReportMesProductionRecord(organizeCode,mesShiftList,workCenterCode);
if(CollectionUtils.isEmpty(mesProductionRecordList)){
continue;
}
//2. 查询 mesProduceSn
List<MesProduceSn> unReportMesProduceSn = workOrderService.getPreDayReportMesProduceSn(organizeCode,mesProductionRecordList);
if(CollectionUtils.isEmpty(unReportMesProduceSn)){
continue;
}
List<MesWorkOrder> mesWorkOrders = workOrderService.insertMesWorkOrder(unReportMesProduceSn, mesShiftList,organizeCode, userName);
if(CollectionUtils.isEmpty(mesWorkOrders)){
continue;
}
//根据产线+物料产生的工单报工
for (MesWorkOrder mesWorkOrder : mesWorkOrders) {
List<MesProduceSn> mesProduceSnList = unReportMesProduceSn.stream().filter(w -> w.getPartNo().equalsIgnoreCase(mesWorkOrder.getPartNo())).collect(Collectors.toList());
workOrderService.doPcnJobProductReport(mesProduceSnList,mesShiftList,organizeCode,userName, mesWorkOrder);
}
for (MesProductionRecord mesProductionRecord : mesProductionRecordList) {
mesProductionRecord.setReportStatus(20);
ConvertBean.serviceModelUpdate(mesProductionRecord, userName);
}
productionRecordRao.saveAll(mesProductionRecordList);
}
return ResultBean.success("查询成功").setResultList(null);
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
}

@ -8,6 +8,7 @@ import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum;
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.MesPartShippingGroup;
import cn.estsh.i3plus.pojo.mes.bean.shipping.MesLoadingList;
import cn.estsh.i3plus.pojo.mes.bean.shipping.MesLoadingListDetail;
@ -135,6 +136,7 @@ public class MesLoadingListService extends BaseMesService<MesLoadingList> implem
MesLoadingListDetail detail = new MesLoadingListDetail();
k.setOrderCode(finalBean.getOrderCode());
k.setLoadingListId(StringUtil.isEmpty(finalBean.getId()) ? 0 : finalBean.getId());
BeanUtils.copyProperties(k, detail, "id");
detail.setStatus(MesExtEnumUtil.LOADING_ORDER_DETAIL_SHIPPING_STATUS.PUBLISHED.getValue());

@ -18,6 +18,7 @@ import cn.estsh.i3plus.pojo.mes.bean.*;
import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel;
import cn.estsh.i3plus.pojo.mes.model.MesWorkOrderModel;
import cn.estsh.i3plus.pojo.mes.repository.*;
import cn.estsh.i3plus.pojo.mes.repository.shipping.MesWorkOrderToWmsRepository;
import cn.estsh.i3plus.pojo.mes.util.DateUtilExt;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.i3plus.pojo.model.wms.WmsProductModel;
@ -32,6 +33,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
@ -83,6 +85,24 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
@Autowired
private MesPartProdGroupRepository mesPartProdGroupRDao;
@Autowired
private MesWorkOrderRepository workOrderRepository;
@Autowired
private MesProductOffLineRepository mesProductOffLineRDao;
@Autowired
private MesProduceSnRepository mesProduceSnRao;
@Autowired
private MesProductionRecordRepository productionRecordRao;
@Autowired
private MesWorkOrderLogRepository mesWorkOrderLogRepository;
@Autowired
private MesWorkOrderToWmsRepository mesWorkOrderToWmsRDao;
@Autowired
private MesBomRepository mesBomRDao;
@Autowired
private MesPartRepository mesPartRDao;
@Override
public MesWorkOrder insert(MesWorkOrder bean) {
//获取相同类型 相同标识 生产序号最大值的
@ -1176,5 +1196,307 @@ public class MesWorkOrderService extends BaseMesService<MesWorkOrder> implements
ConvertBean.serviceModelInitialize(move, AuthUtil.getSessionUser().getUserName());
return move;
}
@Override
public List<MesProductionRecord> getPreDayReportMesProductionRecord(String organizeCode,List<MesShift> mesShiftList, String workCenterCode ) {
//1.获取生产加工记录production_record表中report_status为待汇报状态的工单
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(workCenterCode,"workCenterCode",ddlPackBean);
DdlPreparedPack.getNumEqualPack( MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_50.getValue(),"reportStatus",ddlPackBean);
//获取前一天的早班到当天早班的区间的所有加工记录,统计个数
DdlPreparedPack.timeBuilder(
new SimpleDateFormat("yyyy-MM-dd").format(TimeTool.getDateBefore(new Date(),1))+" 08:00:00",
TimeTool.getToday()+" 08:00:00",
"completeDateTime", ddlPackBean, true);
return productionRecordRao.findByHqlWhere(ddlPackBean);
}
@Override
public List<MesProduceSn> getPreDayReportMesProduceSn(String organizeCode,List<MesProductionRecord> mesProductionRecordList ) {
DdlPackBean snPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getInPackList(mesProductionRecordList.stream().map(MesProductionRecord::getProductSn).collect(Collectors.toList()),
"productSn",snPackBean);
return mesProduceSnRao.findByHqlWhere(snPackBean);
}
@Override
public List<MesWorkOrder> insertMesWorkOrder(List<MesProduceSn> mesProduceSns,List<MesShift> mesShiftList, String organizeCode, String userName) {
List<MesWorkOrder> mesWorkOrderList=new ArrayList<>();
Map<String, List<MesProduceSn>> snListMap = mesProduceSns.stream().collect(Collectors.groupingBy(sn -> sn.getWorkCenterCode() +"="+ sn.getPartNo()));
for (Map.Entry<String, List<MesProduceSn>> stringListEntry : snListMap.entrySet()) {
List<MesProduceSn> value = stringListEntry.getValue();
MesProduceSn mesProduceSn = value.get(0);
String[] split = stringListEntry.getKey().split("=");
String workCenterCode = split[0];
String partNo = split[1];
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(workCenterCode, "workCenterCode", ddlPackBean);
MesWorkCenter mesWorkCenter = mesWorkCenterRDao.getByProperty(ddlPackBean);
if (Objects.isNull(mesWorkCenter)) {
MesException.throwMesBusiException("产线【%s】不存在",workCenterCode);
}
MesWorkOrder item=new MesWorkOrder();
item.setOrganizeCode(organizeCode);
item.setWorkCenterCode(workCenterCode);
item.setPartNo(partNo);
item.setWorkOrderType(MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue());
item.setOrderFlag(MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.N.getValue());
List<MesShift> collect = mesShiftList.stream().filter(s -> s.getShiftCode().equalsIgnoreCase("1")).collect(Collectors.toList());
MesShift mesShift= collect.get(0);
item.setShiftCode(mesShift.getShiftCode());
item.setShiftCode(mesShift.getShiftName());
String today = TimeTool.getToday();
item.setPlanStartTime(today+" "+mesShift.getStartTime()+":00");
item.setPlanEndTime(today+" "+mesShift.getEndTime()+":00");
//生成工单号
List<String> orderList=new ArrayList<>();
GenSerialNoModel genSerialNoModel = new GenSerialNoModel("MES_WORK_CENTER_ORDER_NO");
genSerialNoModel.setPartNo(workCenterCode);
// orderList = syncFuncService.syncSerialNo(genSerialNoModel,userName, organizeCode, 1).getResultList();
String orderNo = workCenterCode+TimeTool.getNowTime(true);
DdlPackBean orderPackBean = DdlPackBean.getDdlPackBean(item.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(orderNo, "workOrderNo", orderPackBean);
if (mesWorkOrderRDao.isExitByHql(orderPackBean)) {
MesException.throwMesBusiException("单号流水码生成重复");
}
item.setWorkOrderNo(orderNo);
item.setPartName(mesProduceSn.getPartName());
//生产时间新增取当天
item.setProduceTime(TimeTool.getToday());
item.setUnCompleteQty(0d);
item.setQty(value.stream().mapToDouble(MesProduceSn::getQty).sum());
//校验标识
//若工单类型为排序
List<MesWorkOrderToWms> saveMesWorkOrderToWms = new ArrayList<>();
if (item.getWorkOrderType() == MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue()) {
//校验产线类型和工单类型是否匹配
if (!Objects.equals(mesWorkCenter.getCenterType(), MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue())) {
MesException.throwMesBusiException("产线【%s】类型为【%s】请选择非排序产线", mesWorkCenter.getWorkCenterCode(),
MesExtEnumUtil.WORK_CENTER_TYPE.valueOfDescription(mesWorkCenter.getCenterType()));
}
//校验物料生产版本是否存在
MesProductVersion mesProductVersion = checkMesProductVersion(item);
item.setProductVersion(mesProductVersion.getProductVersion());
//获取bom信息
List<MesBom> bomList = findMesBomByPartNoAndBomVersion(item.getPartNo(), item.getOrganizeCode(), mesProductVersion.getAlternativePartList());
item.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue());
//发送工单信息给WMS
saveMesWorkOrderToWms.addAll(saveMesWorkOrderToWms(item, bomList));
}
item.setSystemSyncStatus(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
ConvertBean.serviceModelInitialize(item, userName);
MesWorkOrder mesWorkOrder = workOrderRepository.insert(item);
//保存发送WMS数据
if (CollectionUtils.isNotEmpty(saveMesWorkOrderToWms)) {
mesWorkOrderToWmsRDao.saveAll(saveMesWorkOrderToWms);
}
saveMesWorkOrderLog(mesWorkOrder);
mesWorkOrderList.add(mesWorkOrder);
}
return mesWorkOrderList;
}
public List<MesWorkOrderToWms> saveMesWorkOrderToWms(MesWorkOrder mesWorkOrder, List<MesBom> mesBomList) {
List<MesWorkOrderToWms> mesWorkOrderToWmsList = new ArrayList<>();
MesWorkOrderToWms mesWorkOrderToWms = null;
for (MesBom mesBom : mesBomList) {
mesWorkOrderToWms = new MesWorkOrderToWms();
BeanUtils.copyProperties(mesWorkOrder, mesWorkOrderToWms, "id");
mesWorkOrderToWms.setUnit(mesBom.getUnit());
mesWorkOrderToWms.setItemPartNo(mesBom.getItemPartNo());
mesWorkOrderToWms.setItemPartName(mesBom.getItemPartName());
mesWorkOrderToWms.setItemUnit(mesBom.getItemUnit());
mesWorkOrderToWms.setItemQty(MathOperation.mul(mesWorkOrder.getQty(), mesBom.getItemQty()));
ConvertBean.serviceModelInitialize(mesWorkOrderToWms, mesWorkOrderToWms.getCreateUser());
mesWorkOrderToWmsList.add(mesWorkOrderToWms);
}
return mesWorkOrderToWmsList;
}
public void doPcnJobProductReport(List<MesProduceSn> mesProduceSns,List<MesShift> mesShiftList,String organizeCode, String userName ,MesWorkOrder mesWorkOrderDb) {
//查询物料信息
DdlPackBean ddlPackBeanPart = DdlPackBean.getDdlPackBean(mesWorkOrderDb.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(mesWorkOrderDb.getPartNo(), "partNo", ddlPackBeanPart);
MesPart mesPart = mesPartRDao.getByProperty(ddlPackBeanPart);
if (null == mesPart) {
MesException.throwMesBusiException("物料【%s】信息不存在", mesWorkOrderDb.getPartNo());
}
//查询产线信息
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(mesWorkOrderDb.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(mesWorkOrderDb.getWorkCenterCode(), "workCenterCode", ddlPackBean);
MesWorkCenter mesWorkCenter = mesWorkCenterRDao.getByProperty(ddlPackBean);
if (Objects.isNull(mesWorkCenter)) {
MesException.throwMesBusiException("产线【%s】不存在", mesWorkOrderDb.getWorkCenterCode());
}
//获取生产版本
MesProductVersion mesProductVersion = getMesProductVersion(mesWorkOrderDb);
//物料+生产版本获取bom信息
List<MesBom> mesBoms = findBomList(mesPart.getOrganizeCode(), mesPart, mesProductVersion.getAlternativePartList());
//报工类型
if (MesExtEnumUtil.REPORT_TYPE.REPORT.getValue() == mesWorkOrderDb.getReportType()) {
mesWorkOrderDb.setReportedQty(MathOperation.add(mesWorkOrderDb.getNum(), mesWorkOrderDb.getReportedQty()));
//更新工单状态
double unCompleteQty = MathOperation.sub(mesWorkOrderDb.getQty(), mesWorkOrderDb.getReportedQty());
mesWorkOrderDb.setUnCompleteQty(unCompleteQty > 0 ? unCompleteQty : 0);
if (mesWorkOrderDb.getReportedQty() > mesWorkOrderDb.getQty()) {
MesException.throwMesBusiException("工单报工数量【%s】大于工单数量【%s】,不允许报工",
mesWorkOrderDb.getReportedQty(), mesWorkOrderDb.getQty());
} else if (Objects.equals(mesWorkOrderDb.getReportedQty(), mesWorkOrderDb.getQty())) {
mesWorkOrderDb.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue());
} else {
mesWorkOrderDb.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.PROCESS.getValue());
}
} else {
//报工调整数量加-
mesWorkOrderDb.setAdjustQty((MathOperation.add(mesWorkOrderDb.getNum(), mesWorkOrderDb.getAdjustQty())));
//冲销数量大于工单完成数量报错
if (mesWorkOrderDb.getAdjustQty() > mesWorkOrderDb.getReportedQty()) {
MesException.throwMesBusiException("冲销数量【%s】大于工单完成数量【%s】,不允许冲销",
mesWorkOrderDb.getAdjustQty(), mesWorkOrderDb.getReportedQty());
}
}
//更新工单
updateMesWorkOrder(mesWorkOrderDb, userName );
//生成条码 todo 有条码 不生成
//保存数据
// List<MesProductOffLine> mesProductOffLineList = new ArrayList<>();
// for (MesBom mesBom : mesBoms) {
// mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom, false));
// }
// mesProductOffLineService.insertBatch(mesProductOffLineList);
//保存数据
List<MesProductOffLine> mesProductOffLineList = new ArrayList<>();
MesProductOffLine newMesProductOffLine;
for (MesProduceSn produceSn : mesProduceSns) {
for (MesBom mesBom : mesBoms) {
newMesProductOffLine = new MesProductOffLine();
newMesProductOffLine.setReportPartNo(mesWorkOrderDb.getPartNo());
newMesProductOffLine.setReportPartNameRdd(mesWorkOrderDb.getPartName());
newMesProductOffLine.setItemPartNo(mesBom.getItemPartNo());
newMesProductOffLine.setItemPartName(mesBom.getItemPartName());
newMesProductOffLine.setItemQty(mesBom.getItemQty());
newMesProductOffLine.setAlort(mesProductVersion.getReceiveInventoryPoint());
newMesProductOffLine.setStgeLoc(mesProductVersion.getShipInventoryPoint());
newMesProductOffLine.setQty(1d);
newMesProductOffLine.setReportSn(produceSn.getProductSn());
newMesProductOffLine.setBomVersion(mesWorkOrderDb.getProductVersion());
newMesProductOffLine.setSerialNumber(produceSn.getProductSn());
newMesProductOffLine.setUnit(mesBom.getUnit());
newMesProductOffLine.setItemUnit(mesBom.getItemUnit());
newMesProductOffLine.setWorkOrderNo(mesWorkOrderDb.getWorkOrderNo());
newMesProductOffLine.setWorkCenterCode(mesWorkOrderDb.getWorkCenterCode());
newMesProductOffLine.setWorkCellCode(mesWorkOrderDb.getWorkCellCode());
newMesProductOffLine.setReportType(mesWorkOrderDb.getReportType());
newMesProductOffLine.setSapWorkCenter(mesWorkOrderDb.getErpWorkCenter());
newMesProductOffLine.setOrganizeCode(organizeCode);
ConvertBean.serviceModelInitialize(newMesProductOffLine, userName);
mesProductOffLineList.add(newMesProductOffLine);
}
}
mesProductOffLineRDao.saveAll(mesProductOffLineList);
}
private void updateMesWorkOrder(MesWorkOrder mesWorkOrder, String userName ) {
//修改工单,需要重新同步
mesWorkOrder.setSystemSyncStatus(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
ConvertBean.serviceModelUpdate(mesWorkOrder, userName);
workOrderRepository.update(mesWorkOrder);
//保存记录
saveMesWorkOrderLog(mesWorkOrder);
}
public void saveMesWorkOrderLog(MesWorkOrder mesWorkOrder) {
MesWorkOrderLog workOrderLog = new MesWorkOrderLog();
BeanUtils.copyProperties(mesWorkOrder, workOrderLog, "id");
mesWorkOrderLogRepository.insert(workOrderLog);
}
public List<MesBom> findBomList(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 = findMesBomByPartNoAndBomVersion(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 = MathOperation.div(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);
}
}
}
public List<MesBom> findMesBomByPartNoAndBomVersion(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 (org.springframework.util.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());
}
}

Loading…
Cancel
Save