package com.chinaztt.mes.quality.utils; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.chinaztt.ifs.api.feign.IfsFeignClient; import com.chinaztt.mes.basic.entity.Location; import com.chinaztt.mes.basic.entity.Part; import com.chinaztt.mes.basic.entity.WorkstationLocation; import com.chinaztt.mes.basic.mapper.LocationMapper; import com.chinaztt.mes.basic.mapper.PartMapper; import com.chinaztt.mes.basic.mapper.WorkstationLocationMapper; import com.chinaztt.mes.quality.dto.*; import com.chinaztt.mes.quality.entity.*; import com.chinaztt.mes.quality.mapper.ApplyPartMapper; import com.chinaztt.mes.quality.mapper.FinishedProdInspQtyChangeEventMapper; import com.chinaztt.mes.quality.mapper.QualityMainIfsReportMapper; import com.chinaztt.mes.quality.mapper.ReportMapper; import com.chinaztt.mes.quality.service.impl.ApplyPartServiceImpl; import com.chinaztt.mes.warehouse.dto.StockDTO; import com.chinaztt.mes.warehouse.entity.Stock; import com.chinaztt.mes.warehouse.service.StockService; import com.chinaztt.ztt.admin.api.feign.RemoteParamService; import com.chinaztt.ztt.common.core.constant.SecurityConstants; import com.chinaztt.ztt.common.core.util.R; import com.google.gson.Gson; import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; /** * @Description : 质量模块对接ifs工具类 * @ClassName : QualityModuleDockIfsUtils * @Author : sll * @Date: 2022-07-20 17:35 */ @Service @AllArgsConstructor public class QualityModuleDockIfsUtils{ public static final String SHOP_ORDER_REC = "01";//车间订单接收 public static final String SHOP_ORDER_CANCEL_REC = "02";//车间订单取消接收 public static final String REPORT_OPERATION = "03";//工序报工 public static final String CANCEL_REPORT_OPERATION = "04";//取消工序报工 public static final String SCRAP_OPERATION = "05";//工序报废 public static final String CANCEL_SCRAP_OPERATION = "06";//取消工序报废 public static final String MOVE_PART = "07";//库存件移库 public static final String CANCEL_MOVE_PART = "08";//取消库存件移库 public static final String MOVE_PART_REPLACE = "09";//库存件移库替换 public static final String CANCEL_MOVE_PART_REPLACE = "10";//取消库存件移库替换 public static final String SCRAP_ISSUANCE = "11";//报废发放 public static final String CANCEL_SCRAP_ISSUANCE = "12";//取消报废发放 public static final String MOVE_PART_REPLACE_NO_OUTPUT = "13";// 非产出库存件移库替换 public static final String CANCEL_MOVE_PART_REPLACE_NO_OUTPUT = "14";// 取消非产出库存件移库替换 public static final String MOVE_PART_NO_OUTPUT = "15";// 非产出库存件移库 public static final String CANCEL_MOVE_PART_NO_OUTPUT = "16";// 取消非产出库存件移库 public static final String SHOP_ORDER_REC_V2 = "17";//车间订单接收V2 public static final String SHOP_ORDER_CANCEL_REC_V2 = "18";//车间订单取消接收V2 public static final String MOVE_PART_V2 = "19";//库存件移库V2 public static final String CANCEL_MOVE_PART_V2 = "20";//取消库存件移库V2 public static final String CONTRACT = "IFS_DOMAIN"; private ApplyPartMapper applyPartMapper; private ReportMapper reportMapper; private WorkstationLocationMapper workstationLocationMapper; private LocationMapper locationMapper; private ReportUtils reportUtils; private PartMapper partMapper; private QualityMainIfsReportMapper qualityMainIfsReportMapper; private FinishedProdInspQtyChangeEventMapper finishedProdInspQtyChangeEventMapper; private IfsFeignClient ifsFeignClient; private RemoteParamService remoteParamService; private StockService stockService; /** * 根据检测汇报id对接ifs * @param reportId 检测汇报主表id * @param businessCode 业务类型码 * @param isNeedFinishApply 是否需要成品检处理 */ public void dockIfsByReportId(Long reportId,String businessCode, Boolean isNeedFinishApply){ //根据检测汇报主表id获取汇报材料明细 List applyPartList = applyPartMapper.selectListByReportId(reportId); if(CollectionUtils.isEmpty(applyPartList)){ return;//没有需要待处理的数据 } switch(businessCode){ case SHOP_ORDER_REC: ifsShopOrderRec(applyPartList,businessCode,isNeedFinishApply); break; case SHOP_ORDER_CANCEL_REC: ifsShopOrderCancelRec(applyPartList,businessCode,isNeedFinishApply); break; case REPORT_OPERATION: ifsOperationReport(applyPartList,businessCode,reportId); break; case CANCEL_REPORT_OPERATION: ifsOperationCancelReport(applyPartList,businessCode,reportId); break; case SCRAP_OPERATION: ifsOperationScrap(applyPartList,businessCode); break; case CANCEL_SCRAP_OPERATION: ifsOperationCancelScrap(applyPartList,businessCode); break; case MOVE_PART: ifsMovePart(applyPartList,businessCode); break; case CANCEL_MOVE_PART: ifsCancelMovePart(applyPartList,businessCode); break; case MOVE_PART_REPLACE: ifsMovePartReplace(applyPartList,businessCode,isNeedFinishApply); break; case CANCEL_MOVE_PART_REPLACE: ifsCancelMovePartReplace(applyPartList,businessCode,isNeedFinishApply); break; case SCRAP_ISSUANCE: ifsScrapIssuance(applyPartList,businessCode); break; case CANCEL_SCRAP_ISSUANCE: ifsCancelScrapIssuance(applyPartList,businessCode); break; case MOVE_PART_REPLACE_NO_OUTPUT: ifsMovePartReplaceNoOutput(applyPartList,businessCode); break; case CANCEL_MOVE_PART_REPLACE_NO_OUTPUT: ifsCancelMovePartReplaceNoOutput(applyPartList,businessCode); break; case MOVE_PART_NO_OUTPUT: ifsMovePartNoOutput(applyPartList,businessCode); break; case CANCEL_MOVE_PART_NO_OUTPUT: ifsCancelMovePartNoOutput(applyPartList,businessCode); break; case SHOP_ORDER_REC_V2: ifsShopOrderRecV2(applyPartList,businessCode,isNeedFinishApply); break; case SHOP_ORDER_CANCEL_REC_V2: ifsShopOrderCancelRecV2(applyPartList,businessCode,isNeedFinishApply); break; case MOVE_PART_V2: ifsMovePartV2(applyPartList,businessCode); break; case CANCEL_MOVE_PART_V2: ifsCancelMovePartV2(applyPartList,businessCode); break; default: throw new RuntimeException("根据检测汇报id对接ifs->业务类别码=" + businessCode + "->非法"); } } private void ifsShopOrderRecV2(List applyPartList, String businessCode, Boolean isNeedFinishApply) { List applyPartList_ifs = new ArrayList<>();//需要对接ifs车间订单接收的汇报材料 for(ApplyPart applyPart : applyPartList){ if(reportUtils.getDockingIfsConditionV2(applyPart.getSystemNo(),applyPart.getId()).getIsShopOrderRec() && !isNeedFinishApply){ applyPartList_ifs.add(applyPart); } } ifsShopOrderRecOrCancelRecRealizeCell(applyPartList_ifs,businessCode,isNeedFinishApply); } private void ifsShopOrderCancelRecV2(List applyPartList, String businessCode, Boolean isNeedFinishApply) { List applyPartList_ifs = new ArrayList<>();//需要对接ifs车间订单取消接收的汇报材料 for(ApplyPart applyPart : applyPartList){ if(reportUtils.getDockingIfsConditionV2(applyPart.getSystemNo(),applyPart.getId()).getIsShopOrderCancelRec() && !isNeedFinishApply && "IMPORT_SO_RECEIVE_STD".equals(applyPart.getSyncIfsType())){ applyPartList_ifs.add(applyPart); } } ifsShopOrderRecOrCancelRecRealizeCell(applyPartList_ifs,businessCode,isNeedFinishApply); } private void ifsMovePartNoOutput(List applyPartList, String businessCode) { List applyPartList_ifs = new ArrayList<>();//需要对接ifs库存件移库的汇报材料 for(ApplyPart applyPart : applyPartList){ // 判断是否为工序库存 Stock stock = stockService.getById(applyPart.getStockId()); if(!stock.getOperationStockStatus()){ applyPartList_ifs.add(applyPart); } } if(CollectionUtils.isEmpty(applyPartList_ifs)){ return;//没有需要待处理的数据 } ifsMovePartRealizeCellV2(applyPartList_ifs,businessCode); } private void ifsCancelMovePartNoOutput(List applyPartList, String businessCode) { List applyPartList_ifs = new ArrayList<>();//需要对接ifs库存件移库的汇报材料 for(ApplyPart applyPart : applyPartList){ // 判断是否为工序库存 Stock stock = stockService.getById(applyPart.getStockId()); if(!stock.getOperationStockStatus()){ applyPartList_ifs.add(applyPart); } } if(CollectionUtils.isEmpty(applyPartList_ifs)){ return;//没有需要待处理的数据 } ifsMovePartRealizeCellV2(applyPartList_ifs,businessCode); } private void ifsMovePartReplaceNoOutput(List applyPartList, String businessCode) { List applyPartList_ifs = new ArrayList<>();//需要对接ifs库存件移库的汇报材料 for(ApplyPart applyPart : applyPartList){ // 判断是否为工序库存 Stock stock = stockService.getById(applyPart.getStockId()); if(!stock.getOperationStockStatus()){ applyPartList_ifs.add(applyPart); } } if(CollectionUtils.isEmpty(applyPartList_ifs)){ return;//没有需要待处理的数据 } ifsReplaceReportRealizeCell(applyPartList_ifs,businessCode); } private void ifsCancelMovePartReplaceNoOutput(List applyPartList, String businessCode) { List applyPartList_ifs = new ArrayList<>();//需要对接ifs库存件移库的汇报材料 for(ApplyPart applyPart : applyPartList){ // 判断是否为工序库存 Stock stock = stockService.getById(applyPart.getStockId()); if(!stock.getOperationStockStatus()){ applyPartList_ifs.add(applyPart); } } if(CollectionUtils.isEmpty(applyPartList_ifs)){ return;//没有需要待处理的数据 } ifsReplaceReportRealizeCell(applyPartList_ifs,businessCode); } private void ifsScrapIssuance(List applyPartList, String businessCode) { List applyPartList_ifs = new ArrayList<>();//需要对接ifs库存件移库的汇报材料 for(ApplyPart applyPart : applyPartList){ if (applyPart.getSourceLocationId() != null) { Stock stock = stockService.getById(applyPart.getStockId()); if (!stock.getOperationStockStatus()) { applyPartList_ifs.add(applyPart); } } else { List operationStockStatus = this.applyPartMapper.selectStockOperationStatus(applyPart.getSystemNo()); if (CollectionUtil.isNotEmpty(operationStockStatus) && BooleanUtil.isTrue(operationStockStatus.get(0))) { continue; } //1.根据系统号判断产出记录是否已同步ifs,是则继续 DockingIfsConditionActiveDTO dockingIfsConditionActiveDTO = reportMapper.getDockingIfsConditionActive(applyPart.getId()); if(dockingIfsConditionActiveDTO != null && dockingIfsConditionActiveDTO.getProdOutIfsSync()){ applyPartList_ifs.add(applyPart); } } } if(CollectionUtils.isEmpty(applyPartList_ifs)){ return;//没有需要待处理的数据 } ifsScrapIssuanceRealizeCell(applyPartList_ifs,businessCode); } private void ifsCancelScrapIssuance(List applyPartList, String businessCode) { List applyPartList_ifs = new ArrayList<>();//需要对接ifs库存件移库的汇报材料 for(ApplyPart applyPart : applyPartList){ if (applyPart.getSourceLocationId() != null) { Stock stock = stockService.getById(applyPart.getStockId()); if (!stock.getOperationStockStatus()) { applyPartList_ifs.add(applyPart); } } else { List operationStockStatus = this.applyPartMapper.selectStockOperationStatus(applyPart.getSystemNo()); if (CollectionUtil.isNotEmpty(operationStockStatus) && BooleanUtil.isTrue(operationStockStatus.get(0))) { continue; } //1.根据系统号判断产出记录是否已同步ifs,是则继续 DockingIfsConditionActiveDTO dockingIfsConditionActiveDTO = reportMapper.getDockingIfsConditionActive(applyPart.getId()); if(dockingIfsConditionActiveDTO != null && dockingIfsConditionActiveDTO.getProdOutIfsSync() && !"IMPORT_SO_RECEIVE_STD".equals(applyPart.getSyncIfsType())){ applyPartList_ifs.add(applyPart); } } } if(CollectionUtils.isEmpty(applyPartList_ifs)){ return;//没有需要待处理的数据 } ifsScrapIssuanceRealizeCell(applyPartList_ifs,businessCode); } private void ifsScrapIssuanceRealizeCell(List applyPartList_ifs, String businessCode) { if(CollectionUtils.isEmpty(applyPartList_ifs)){ return; } if(!businessCode.equals(SCRAP_ISSUANCE) && !businessCode.equals(CANCEL_SCRAP_ISSUANCE)){ throw new RuntimeException("库存调整单报废数量发放/取消库存调整单报废数量发放实现单元不接受业务类型码=" + businessCode); } List stocks = new ArrayList<>(); for (ApplyPart applyPart : applyPartList_ifs) { Report report = this.reportMapper.selectById(applyPart.getReportId()); //待检成品库 Long toQualifiedLocationId = workstationLocationMapper.selectFinishToQualifiedLocationIdBySystemNo(applyPart.getSystemNo()); Location releaseLocation = locationMapper.selectById(toQualifiedLocationId); if (applyPart.getSourceLocationId() != null) { releaseLocation = locationMapper.selectById(applyPart.getSourceLocationId()); } else { if (!report.getReportType().equals(Apply.PRODUCT_APPLY)) { Long inspectionLocationId = workstationLocationMapper.selectBySystemNo(applyPart.getSystemNo(), WorkstationLocation.INSPECTION_LOCATION);//产出待检库位 releaseLocation = locationMapper.selectById(inspectionLocationId); } } SubmitReportDTO submitReportDTO = reportMapper.getManufacturingOrderInfo(applyPart.getId()); StockDTO stockDTO = new StockDTO(); stockDTO.setPartId(applyPart.getPartId()); stockDTO.setLocationId(releaseLocation.getId()); stockDTO.setLocationNo(releaseLocation.getIfsLocation()); stockDTO.setPartBatchNo(applyPart.getLotBatchNo()); if (applyPart.getSourceLocationId() != null) { Stock stock = stockService.getById(applyPart.getStockId()); stockDTO.setIfsBatchNo(stock.getIfsBatchNo()); } else { stockDTO.setIfsBatchNo(submitReportDTO.getIfsBatchNo()); } stockDTO.setManualInput(true); stockDTO.setAvailableStockQuantityMove(submitReportDTO.getScrapArrived()); if (businessCode.equals(SCRAP_ISSUANCE)) { stockDTO.setAdjustType("Issue"); stockDTO.setAdjustMemo("库存发放"); } else { stockDTO.setAdjustType("Receive"); stockDTO.setAdjustMemo("库存接收"); } stocks.add(stockDTO); } if (businessCode.equals(SCRAP_ISSUANCE)) { stockService.inventAdjustForRfcable(stocks, "Issue", "R04"); } else { stockService.inventAdjustForRfcable(stocks, "Receive", "R01"); } } private void ifsMovePartV2(List applyPartList, String businessCode) { List applyPartList_ifs = new ArrayList<>();//需要对接ifs库存件移库的汇报材料 for(ApplyPart applyPart : applyPartList){ //1.根据系统号判断产出记录是否已同步ifs,是则继续 //2.判断成品检合格数量改变事件记录表是否存在记录,不存在则继续 DockingIfsConditionActiveDTO dockingIfsConditionActiveDTO = reportMapper.getDockingIfsConditionActive(applyPart.getId()); // 如果是单独做成品检,不做库存件移库 List rules = applyPartMapper.selectTestRulesBySystemNo(applyPart.getSystemNo()); if (rules.size() == 1 && dockingIfsConditionActiveDTO.getReportType().equals(Apply.PRODUCT_APPLY)) { continue; } if(dockingIfsConditionActiveDTO != null && dockingIfsConditionActiveDTO.getProdOutIfsSync()){ applyPartList_ifs.add(applyPart); } } ifsMovePartRealizeCellV2(applyPartList_ifs,businessCode); } private void ifsCancelMovePartV2(List applyPartList, String businessCode) { List applyPartList_ifs = new ArrayList<>();//需要对接ifs取消库存件移库的汇报材料 for(ApplyPart applyPart : applyPartList){ //1.根据系统号判断产出记录是否已同步ifs,是则继续 //2.判断成品检合格数量改变事件记录表是否存在记录,不存在则继续 DockingIfsConditionActiveDTO dockingIfsConditionActiveDTO = reportMapper.getDockingIfsConditionActive(applyPart.getId()); // 如果是单独做成品检,不做库存件移库 List rules = applyPartMapper.selectTestRulesBySystemNo(applyPart.getSystemNo()); if (rules.size() == 1 && dockingIfsConditionActiveDTO.getReportType().equals(Apply.PRODUCT_APPLY)) { continue; } if(dockingIfsConditionActiveDTO != null && dockingIfsConditionActiveDTO.getProdOutIfsSync() && "IMPORT_MOVE_PART_STD".equals(applyPart.getSyncIfsType())){ applyPartList_ifs.add(applyPart); } } ifsMovePartRealizeCellV2(applyPartList_ifs,businessCode); } private void ifsMovePartReplace(List applyPartList, String businessCode, Boolean isNeedFinishApply) { List replacePartList_ifs = new ArrayList<>();//需要对接ifs库存件移库的汇报材料 List applyPartList_ifs = new ArrayList<>();//需要对接ifs库存件移库的汇报材料 for(ApplyPart applyPart : applyPartList){ List operationStockStatus = applyPartMapper.selectStockOperationStatus(applyPart.getSystemNo()); if (CollectionUtil.isNotEmpty(operationStockStatus) && BooleanUtil.isTrue(operationStockStatus.get(0))) { continue; } //1.根据系统号判断产出记录是否已同步ifs,是则继续 DockingIfsConditionActiveDTO dockingIfsConditionActiveDTO = reportMapper.getDockingIfsConditionActive(applyPart.getId()); if(dockingIfsConditionActiveDTO != null && dockingIfsConditionActiveDTO.getProdOutIfsSync()){ replacePartList_ifs.add(applyPart); } else if (reportUtils.getDockingIfsConditionV2(applyPart.getSystemNo(),applyPart.getId()).getIsShopOrderRec() && !isNeedFinishApply) { applyPartList_ifs.add(applyPart); } } //对接ifs if (CollectionUtils.isNotEmpty(replacePartList_ifs)) { ifsReplaceReportRealizeCell(replacePartList_ifs,businessCode); } if(CollectionUtils.isNotEmpty(applyPartList_ifs)){ ifsShopOrderRecOrCancelRecRealizeCell(applyPartList_ifs,businessCode,isNeedFinishApply); } } private void ifsCancelMovePartReplace(List applyPartList, String businessCode, Boolean isNeedFinishApply) { List replacePartList_ifs = new ArrayList<>();//需要对接ifs库存件移库的汇报材料 List applyPartList_ifs = new ArrayList<>();//需要对接ifs库存件移库的汇报材料 for(ApplyPart applyPart : applyPartList){ List operationStockStatus = applyPartMapper.selectStockOperationStatus(applyPart.getSystemNo()); if (CollectionUtil.isNotEmpty(operationStockStatus) && BooleanUtil.isTrue(operationStockStatus.get(0))) { continue; } //1.根据系统号判断产出记录是否已同步ifs,是则继续 DockingIfsConditionActiveDTO dockingIfsConditionActiveDTO = reportMapper.getDockingIfsConditionActive(applyPart.getId()); if(dockingIfsConditionActiveDTO != null && dockingIfsConditionActiveDTO.getProdOutIfsSync() && "INVENT_ADJUST_FOR_STD".equals(applyPart.getSyncIfsType())){ replacePartList_ifs.add(applyPart); } else if (reportUtils.getDockingIfsConditionV2(applyPart.getSystemNo(),applyPart.getId()).getIsShopOrderCancelRec() && !isNeedFinishApply && "IMPORT_SO_RECEIVE_STD".equals(applyPart.getSyncIfsType())) { applyPartList_ifs.add(applyPart); } } if (CollectionUtils.isNotEmpty(replacePartList_ifs)) { ifsReplaceReportRealizeCell(replacePartList_ifs,businessCode); } if (CollectionUtils.isNotEmpty(applyPartList_ifs)) { ifsShopOrderRecOrCancelRecRealizeCell(applyPartList_ifs,businessCode,isNeedFinishApply); } } private void ifsReplaceReportRealizeCell(List applyPartList_ifs, String businessCode) { if(CollectionUtils.isEmpty(applyPartList_ifs)){ return; } if(!businessCode.equals(MOVE_PART_REPLACE) && !businessCode.equals(CANCEL_MOVE_PART_REPLACE) && !businessCode.equals(MOVE_PART_REPLACE_NO_OUTPUT) && !businessCode.equals(CANCEL_MOVE_PART_REPLACE_NO_OUTPUT)){ throw new RuntimeException("库存调整单接收/库存调整单接收实现单元不接受业务类型码=" + businessCode); } // 更新同步类型 applyPartMapper.update(null, Wrappers.lambdaUpdate() .set(ApplyPart::getSyncIfsType, "INVENT_ADJUST_FOR_STD") .in(ApplyPart::getId, applyPartList_ifs.stream().map(ApplyPart::getId).collect(Collectors.toList()))); List stocks = new ArrayList<>(); for (ApplyPart applyPart : applyPartList_ifs) { Report report = this.reportMapper.selectById(applyPart.getReportId()); //待检成品库 Long toQualifiedLocationId = workstationLocationMapper.selectFinishToQualifiedLocationIdBySystemNo(applyPart.getSystemNo()); Location releaseLocation = locationMapper.selectById(toQualifiedLocationId); // 源库位不为空,则取源库位 if (applyPart.getSourceLocationId() != null) { releaseLocation = locationMapper.selectById(applyPart.getSourceLocationId()); } else { if (!report.getReportType().equals(Apply.PRODUCT_APPLY)) { Long inspectionLocationId = workstationLocationMapper.selectBySystemNo(applyPart.getSystemNo(), WorkstationLocation.INSPECTION_LOCATION);//产出待检库位 releaseLocation = locationMapper.selectById(inspectionLocationId); } } SubmitReportDTO submitReportDTO = reportMapper.getManufacturingOrderInfo(applyPart.getId()); StockDTO stockDTO = new StockDTO(); stockDTO.setPartId(applyPart.getPartId()); stockDTO.setLocationId(releaseLocation.getId()); stockDTO.setLocationNo(releaseLocation.getIfsLocation()); stockDTO.setPartBatchNo(applyPart.getLotBatchNo()); if (applyPart.getSourceLocationId() != null) { Stock stock = stockService.getById(applyPart.getStockId()); stockDTO.setIfsBatchNo(stock.getIfsBatchNo()); } else { stockDTO.setIfsBatchNo(submitReportDTO.getIfsBatchNo()); } stockDTO.setManualInput(true); stockDTO.setAvailableStockQuantityMove(submitReportDTO.getTotalLength()); if (businessCode.equals(MOVE_PART_REPLACE) || businessCode.equals(MOVE_PART_REPLACE_NO_OUTPUT)) { stockDTO.setAdjustType("Issue"); stockDTO.setAdjustMemo("库存发放"); } else { stockDTO.setAdjustType("Receive"); stockDTO.setAdjustMemo("库存接收"); } stocks.add(stockDTO); } List receptionStocks = new ArrayList<>(); for (ApplyPart applyPart : applyPartList_ifs) { SubmitReportDTO submitReportDTO = reportMapper.getManufacturingOrderInfo(applyPart.getId()); if (new BigDecimal(applyPart.getQtyArrived()).compareTo(BigDecimal.ZERO) > 0) { Location qualifiedLocation = locationMapper.selectById(workstationLocationMapper.selectQualifiedLocationIdBySystemNo(applyPart.getSystemNo()));//合格品库位 if (applyPart.getSourceLocationId() != null) { qualifiedLocation = locationMapper.selectById(applyPart.getTargetQualifiedLocationId()); } if (qualifiedLocation == null) { throw new RuntimeException("系统号=" + applyPart.getSystemNo() + "的合格品库位不存在"); } // 接收合格品 StockDTO stockDTO = new StockDTO(); stockDTO.setPartId(applyPart.getReplacePartId()); stockDTO.setLocationId(qualifiedLocation.getId()); stockDTO.setLocationNo(qualifiedLocation.getIfsLocation()); stockDTO.setPartBatchNo(applyPart.getLotBatchNo()); if (applyPart.getSourceLocationId() != null) { Stock stock = stockService.getById(applyPart.getStockId()); stockDTO.setIfsBatchNo(stock.getIfsBatchNo()); } else { stockDTO.setIfsBatchNo(submitReportDTO.getIfsBatchNo()); } stockDTO.setManualInput(true); stockDTO.setAvailableStockQuantityMove(new BigDecimal(applyPart.getQtyArrived())); if (businessCode.equals(MOVE_PART_REPLACE) || businessCode.equals(MOVE_PART_REPLACE_NO_OUTPUT)) { stockDTO.setAdjustType("Receive"); stockDTO.setAdjustMemo("库存接收"); } else { stockDTO.setAdjustType("Issue"); stockDTO.setAdjustMemo("库存发放"); } stocks.add(stockDTO); } if (new BigDecimal(applyPart.getUnqualifiedArrived()).compareTo(BigDecimal.ZERO) > 0) { Location disQualifiedLocation = locationMapper.selectById(workstationLocationMapper.selectBySystemNo(applyPart.getSystemNo(), WorkstationLocation.DISQUALIFIED_LOCATION));//不合格品库位 if (applyPart.getSourceLocationId() != null) { disQualifiedLocation = locationMapper.selectById(applyPart.getTargetUnqualifiedLocationId()); } if (disQualifiedLocation == null) { throw new RuntimeException("系统号=" + applyPart.getSystemNo() + "的不合格品库位不存在"); } // 接收不合格品 StockDTO stockDTO = new StockDTO(); stockDTO.setPartId(applyPart.getReplacePartId()); stockDTO.setLocationId(disQualifiedLocation.getId()); stockDTO.setLocationNo(disQualifiedLocation.getIfsLocation()); stockDTO.setPartBatchNo(applyPart.getLotBatchNo()); if (applyPart.getSourceLocationId() != null) { Stock stock = stockService.getById(applyPart.getStockId()); stockDTO.setIfsBatchNo(stock.getIfsBatchNo()); } else { stockDTO.setIfsBatchNo(submitReportDTO.getIfsBatchNo()); } stockDTO.setManualInput(true); stockDTO.setAvailableStockQuantityMove(new BigDecimal(applyPart.getUnqualifiedArrived())); if (businessCode.equals(MOVE_PART_REPLACE) || businessCode.equals(MOVE_PART_REPLACE_NO_OUTPUT)) { stockDTO.setAdjustType("Receive"); stockDTO.setAdjustMemo("库存接收"); } else { stockDTO.setAdjustType("Issue"); stockDTO.setAdjustMemo("库存发放"); } stocks.add(stockDTO); } } stockService.inventAdjustForRfcable(stocks, "", "R01"); } /** * 根据检测汇报材料对接ifs——库存件移库 * @param applyPartList 检测汇报材料 * @param businessCode 业务类型码 */ private void ifsMovePart(List applyPartList,String businessCode){ List applyPartList_ifs = new ArrayList<>();//需要对接ifs库存件移库的汇报材料 for(ApplyPart applyPart : applyPartList){ //1.根据系统号判断产出记录是否已同步ifs,是则继续 //2.判断成品检合格数量改变事件记录表是否存在记录,不存在则继续 DockingIfsConditionActiveDTO dockingIfsConditionActiveDTO = reportMapper.getDockingIfsConditionActive(applyPart.getId()); // 如果是单独做成品检,不做库存件移库 List rules = applyPartMapper.selectTestRulesBySystemNo(applyPart.getSystemNo()); if (rules.size() == 1 && dockingIfsConditionActiveDTO.getReportType().equals(Apply.PRODUCT_APPLY)) { continue; } if(dockingIfsConditionActiveDTO != null && dockingIfsConditionActiveDTO.getProdOutIfsSync()){ applyPartList_ifs.add(applyPart); } } ifsMovePartRealizeCellV2(applyPartList_ifs,businessCode); } /** * 根据检测汇报材料对接ifs——取消库存件移库 * @param applyPartList 检测汇报材料 * @param businessCode 业务类型码 */ private void ifsCancelMovePart(List applyPartList,String businessCode){ List applyPartList_ifs = new ArrayList<>();//需要对接ifs取消库存件移库的汇报材料 for(ApplyPart applyPart : applyPartList){ //1.根据系统号判断产出记录是否已同步ifs,是则继续 //2.判断成品检合格数量改变事件记录表是否存在记录,不存在则继续 DockingIfsConditionActiveDTO dockingIfsConditionActiveDTO = reportMapper.getDockingIfsConditionActive(applyPart.getId()); // 如果是单独做成品检,不做库存件移库 List rules = applyPartMapper.selectTestRulesBySystemNo(applyPart.getSystemNo()); if (rules.size() == 1 && dockingIfsConditionActiveDTO.getReportType().equals(Apply.PRODUCT_APPLY)) { continue; } if(dockingIfsConditionActiveDTO != null && dockingIfsConditionActiveDTO.getProdOutIfsSync()){ applyPartList_ifs.add(applyPart); } } ifsMovePartRealizeCellV2(applyPartList_ifs,businessCode); } /** * 库存件移库/取消移库实现单元 * @param applyPartList_ifs 待处理的检测汇报材料 * @param businessCode 业务类型码 */ private void ifsMovePartRealizeCell(List applyPartList_ifs,String businessCode){ if(CollectionUtils.isEmpty(applyPartList_ifs)){ return; } if(!businessCode.equals(MOVE_PART) && !businessCode.equals(CANCEL_MOVE_PART)){ throw new RuntimeException("库存件移库/取消库存件移库实现单元不接受业务类型码=" + businessCode); } String dir = ""; if(businessCode.equals(MOVE_PART)){ //正向操作 dir = ApplyPartServiceImpl.MOVELIBRARY; }else{ //逆向操作 dir = ApplyPartServiceImpl.UNMOVELIBRARY; } IfsMoveLibraryDTO ifsMoveLibraryDTO = new IfsMoveLibraryDTO(); List dataBeanList = new ArrayList<>();//批量标识 String contract = remoteParamService.getByKey(CONTRACT, SecurityConstants.FROM_IN).getData();//从系统参数中获取ifs域 for(ApplyPart applyPart : applyPartList_ifs){ //根据系统唯一编号查出零件id Long partId = applyPartMapper.selectPartIdBySystemNo(applyPart.getSystemNo()); //根据产出系统唯一编号查出对应工作站的库位 Long disqualifiedLocationId = workstationLocationMapper.selectBySystemNo(applyPart.getSystemNo(), WorkstationLocation.DISQUALIFIED_LOCATION);//产出不合格品库位 //待检成品库 Long toQualifiedLocationId = workstationLocationMapper.selectFinishToQualifiedLocationIdBySystemNo(applyPart.getSystemNo()); //合格库位取工单中库位(一个工作站可能会配置多个合格品库位) Long qualifiedLocationId = workstationLocationMapper.selectQualifiedLocationIdBySystemNo(applyPart.getSystemNo());//合格品库位 //根据库位id获取ifs库位编号 String hgLocation = locationMapper.selectById(qualifiedLocationId).getIfsLocation(); String toQualifiedLocation = locationMapper.selectById(toQualifiedLocationId).getIfsLocation(); String unhgLocation = locationMapper.selectById(disqualifiedLocationId).getIfsLocation(); //判断合格数量是否变更 BigDecimal qtyChange = BigDecimal.ZERO; if (null != toQualifiedLocationId) { qtyChange = reportUtils.getQtyArrivedChange(partId,toQualifiedLocationId,applyPart.getSystemNo(), applyPart.getLotBatchNo(),new BigDecimal(applyPart.getQtyArrived()),dir,applyPart.getReportId(),applyPart.getId()); }else{ qtyChange = reportUtils.getQtyArrivedChange(partId,qualifiedLocationId,applyPart.getSystemNo(),applyPart.getLotBatchNo(),new BigDecimal(applyPart.getQtyArrived()),dir,applyPart.getReportId(),applyPart.getId()); } List operationStockStatus = applyPartMapper.selectStockOperationStatus(applyPart.getSystemNo()); // 如果是工序库存,不进行IFS移库 if (CollectionUtil.isNotEmpty(operationStockStatus) && BooleanUtil.isTrue(operationStockStatus.get(0))) { continue; } switch(qtyChange.compareTo(BigDecimal.ZERO)){ case 0: // 已配置成品待检库,合格数量没有变更,说明待检成品库的数量都为合格数量,都需移到合格库位 if (null != toQualifiedLocationId) { IfsMoveLibraryDTO.DataBean batchInfo = new IfsMoveLibraryDTO.DataBean(); batchInfo.setPART_NO(applyPart.getPartNo());//零件号 batchInfo.setMOVE_QTY(Double.parseDouble(applyPart.getQtyArrived()));//移库数量 if (StringUtils.equals(businessCode, MOVE_PART)) { batchInfo.setLOCATION_NO(toQualifiedLocation); batchInfo.setTO_LOCATION_NO(hgLocation); }else { batchInfo.setLOCATION_NO(hgLocation); batchInfo.setTO_LOCATION_NO(toQualifiedLocation); } batchInfo.setTO_CONTRACT(contract);//目标域 SubmitReportDTO submitReportDTO = reportMapper.getManufacturingOrderInfo(applyPart.getId()); batchInfo.setSERIAL_NO(submitReportDTO.getIfsSequenceNo());//序列号 batchInfo.setENG_CHG_LEVEL(submitReportDTO.getEngChgLevel());//版本号 Part part = partMapper.selectById(applyPart.getPartId()); batchInfo.setLOT_BATCH_NO(submitReportDTO.getIfsBatchNo());//ifs批次号 //判断是否启用批次管理 if (part.getLotTrackingIfs() != null && part.getLotTrackingIfs()) { batchInfo.setWAIV_DEV_REJ_NO(submitReportDTO.getOutBatchNo());//mes的批次号作为ifs的wdr号 } else { batchInfo.setWAIV_DEV_REJ_NO("*");//wdr号 } // 因为现在多个 mes库位可能对应一个 ifs库位 所以 执行移库操作之前需要判断一下库位是否相同 // xcg 20230413 if (!StrUtil.equals(batchInfo.getLOCATION_NO(), batchInfo.getTO_LOCATION_NO())) { dataBeanList.add(batchInfo); } } break; case 1: //合格数量变少 //将变更的数量有合格品库位移至不合格品库位 case -1: // 存在成品待检库位,qtyArrived为合格数量,需从待检库位移到合格库位;变更数量为不合格数量,需从待检成品库位移到不合格库位 if (null != toQualifiedLocationId) { // 处理合格数量移库,待检成品库->合格库 IfsMoveLibraryDTO.DataBean batchInfo = new IfsMoveLibraryDTO.DataBean(); batchInfo.setPART_NO(applyPart.getPartNo());//零件号 //batchInfo.setLOT_BATCH_NO(applyPart.getLotBatchNo());//批次号 batchInfo.setMOVE_QTY(Double.parseDouble(applyPart.getQtyArrived()));//移库数量 if(businessCode.equals(MOVE_PART)){ batchInfo.setLOCATION_NO(toQualifiedLocation);//待检成品库位 batchInfo.setTO_LOCATION_NO(hgLocation);//不合格品库位 }else{ batchInfo.setLOCATION_NO(hgLocation);//不合格品库位 batchInfo.setTO_LOCATION_NO(toQualifiedLocation);//待检成品库位 } batchInfo.setTO_CONTRACT(contract);//目标域 SubmitReportDTO submitReportDTO = reportMapper.getManufacturingOrderInfo(applyPart.getId()); batchInfo.setSERIAL_NO(submitReportDTO.getIfsSequenceNo());//序列号 batchInfo.setENG_CHG_LEVEL(submitReportDTO.getEngChgLevel());//版本号 Part part = partMapper.selectById(applyPart.getPartId()); batchInfo.setLOT_BATCH_NO(submitReportDTO.getIfsBatchNo());//ifs批次号 //判断是否启用批次管理 if (part.getLotTrackingIfs() != null && part.getLotTrackingIfs()) { batchInfo.setWAIV_DEV_REJ_NO(submitReportDTO.getOutBatchNo());//mes的批次号作为ifs的wdr号 } else { batchInfo.setWAIV_DEV_REJ_NO("*");//wdr号 } // 如果合格数量为0,不需要移库 if (batchInfo.getMOVE_QTY() != 0) { dataBeanList.add(batchInfo); } } //合格数量变多 //将变更的数量由合格品库位移至不合格品库位 //ifs库存件移库支持负数 // 处理变更数量,就是不合格数量 IfsMoveLibraryDTO.DataBean batchInfo = new IfsMoveLibraryDTO.DataBean(); batchInfo.setPART_NO(applyPart.getPartNo());//零件号 //batchInfo.setLOT_BATCH_NO(applyPart.getLotBatchNo());//批次号 batchInfo.setMOVE_QTY(Double.valueOf(qtyChange + ""));//移库数量 if(businessCode.equals(MOVE_PART)){ batchInfo.setLOCATION_NO(null != toQualifiedLocation ? toQualifiedLocation : hgLocation);//合格品库位 batchInfo.setTO_LOCATION_NO(unhgLocation);//不合格品库位 }else{ batchInfo.setLOCATION_NO(unhgLocation);//不合格品库位 batchInfo.setTO_LOCATION_NO(null != toQualifiedLocation ? toQualifiedLocation : hgLocation);//合格品库位 } batchInfo.setTO_CONTRACT(contract);//目标域 SubmitReportDTO submitReportDTO = reportMapper.getManufacturingOrderInfo(applyPart.getId()); batchInfo.setSERIAL_NO(submitReportDTO.getIfsSequenceNo());//序列号 batchInfo.setENG_CHG_LEVEL(submitReportDTO.getEngChgLevel());//版本号 Part part = partMapper.selectById(applyPart.getPartId()); batchInfo.setLOT_BATCH_NO(submitReportDTO.getIfsBatchNo());//ifs批次号 //判断是否启用批次管理 if (part.getLotTrackingIfs() != null && part.getLotTrackingIfs()) { batchInfo.setWAIV_DEV_REJ_NO(submitReportDTO.getOutBatchNo());//mes的批次号作为ifs的wdr号 } else { batchInfo.setWAIV_DEV_REJ_NO("*");//wdr号 } // 因为现在多个 mes库位可能对应一个 ifs库位 所以 执行移库操作之前需要判断一下库位是否相同 // xcg 20230413 if (!StrUtil.equals(batchInfo.getLOCATION_NO(), batchInfo.getTO_LOCATION_NO())) { dataBeanList.add(batchInfo); } break; default: break; } } if(CollectionUtils.isEmpty(dataBeanList)){ return; } ifsMoveLibraryDTO.setBATCH_INFO(dataBeanList); Gson gson = new Gson(); String jsonstr = gson.toJson(ifsMoveLibraryDTO); JSONObject jsonObject = JSONObject.parseObject(jsonstr);//解决序列化时自动将大写转小写问题 R res = ifsFeignClient.importMovePartStd(jsonObject,true); if(res.getCode() != 0){ throw new RuntimeException("ifs库存件移库失败;erromsg:" + res.getMsg()); } } /** * 库存件移库/取消移库实现单元 * @param applyPartList_ifs 待处理的检测汇报材料 * @param businessCode 业务类型码 */ private void ifsMovePartRealizeCellV2(List applyPartList_ifs,String businessCode){ if(CollectionUtils.isEmpty(applyPartList_ifs)){ return; } if(!businessCode.equals(MOVE_PART) && !businessCode.equals(CANCEL_MOVE_PART) && !businessCode.equals(MOVE_PART_NO_OUTPUT) && !businessCode.equals(CANCEL_MOVE_PART_NO_OUTPUT) && !businessCode.equals(MOVE_PART_V2) && !businessCode.equals(CANCEL_MOVE_PART_V2)) { throw new RuntimeException("库存件移库/取消库存件移库实现单元不接受业务类型码=" + businessCode); } String dir = ""; if(businessCode.equals(MOVE_PART) || businessCode.equals(MOVE_PART_NO_OUTPUT) || businessCode.equals(MOVE_PART_V2)) { //正向操作 dir = ApplyPartServiceImpl.MOVELIBRARY; } else { //逆向操作 dir = ApplyPartServiceImpl.UNMOVELIBRARY; } // 更新同步类型 applyPartMapper.update(null, Wrappers.lambdaUpdate() .set(ApplyPart::getSyncIfsType, "IMPORT_MOVE_PART_STD") .in(ApplyPart::getId, applyPartList_ifs.stream().map(ApplyPart::getId).collect(Collectors.toList()))); IfsMoveLibraryDTO ifsMoveLibraryDTO = new IfsMoveLibraryDTO(); List dataBeanList = new ArrayList<>();//批量标识 String contract = remoteParamService.getByKey(CONTRACT, SecurityConstants.FROM_IN).getData();//从系统参数中获取ifs域 for(ApplyPart applyPart : applyPartList_ifs){ //根据产出系统唯一编号查出对应工作站的库位 Long disqualifiedLocationId = workstationLocationMapper.selectBySystemNo(applyPart.getSystemNo(), WorkstationLocation.DISQUALIFIED_LOCATION);//产出不合格品库位 //待检成品库 Long toQualifiedLocationId = workstationLocationMapper.selectFinishToQualifiedLocationIdBySystemNo(applyPart.getSystemNo()); //合格库位取工单中库位(一个工作站可能会配置多个合格品库位) Long qualifiedLocationId = workstationLocationMapper.selectQualifiedLocationIdBySystemNo(applyPart.getSystemNo());//合格品库位 if (applyPart.getSourceLocationId() != null) { toQualifiedLocationId = applyPart.getSourceLocationId(); qualifiedLocationId = applyPart.getTargetQualifiedLocationId(); disqualifiedLocationId = applyPart.getTargetUnqualifiedLocationId(); } //根据库位id获取ifs库位编号 String hgLocation = qualifiedLocationId == null ? null : locationMapper.selectById(qualifiedLocationId).getIfsLocation(); String toQualifiedLocation = locationMapper.selectById(toQualifiedLocationId).getIfsLocation(); String unhgLocation = disqualifiedLocationId == null ? null : locationMapper.selectById(disqualifiedLocationId).getIfsLocation(); List operationStockStatus = applyPartMapper.selectStockOperationStatus(applyPart.getSystemNo()); // 如果是工序库存,不进行IFS移库 if (CollectionUtil.isNotEmpty(operationStockStatus) && BooleanUtil.isTrue(operationStockStatus.get(0))) { continue; } // 已配置成品待检库,合格数量没有变更,说明待检成品库的数量都为合格数量,都需移到合格库位 if (new BigDecimal(applyPart.getQtyArrived()).compareTo(BigDecimal.ZERO) > 0) { if (applyPart.getSourceLocationId() != null) { toQualifiedLocation = locationMapper.selectById(applyPart.getSourceLocationId()).getIfsLocation(); hgLocation = locationMapper.selectById(applyPart.getTargetQualifiedLocationId()).getIfsLocation(); } IfsMoveLibraryDTO.DataBean batchInfo = new IfsMoveLibraryDTO.DataBean(); batchInfo.setPART_NO(applyPart.getPartNo());//零件号 batchInfo.setMOVE_QTY(Double.parseDouble(applyPart.getQtyArrived()));//移库数量 if (StringUtils.equals(dir, ApplyPartServiceImpl.MOVELIBRARY)) { batchInfo.setLOCATION_NO(toQualifiedLocation); batchInfo.setTO_LOCATION_NO(hgLocation); }else { batchInfo.setLOCATION_NO(hgLocation); batchInfo.setTO_LOCATION_NO(toQualifiedLocation); } batchInfo.setTO_CONTRACT(contract);//目标域 SubmitReportDTO submitReportDTO = reportMapper.getManufacturingOrderInfo(applyPart.getId()); if (applyPart.getSourceLocationId() != null) { Stock stock = stockService.getById(applyPart.getStockId()); submitReportDTO = new SubmitReportDTO(); submitReportDTO.setOutBatchNo(stock.getPartBatchNo()); submitReportDTO.setIfsBatchNo(stock.getIfsBatchNo()); } else { batchInfo.setSERIAL_NO(submitReportDTO.getIfsSequenceNo());//序列号 batchInfo.setENG_CHG_LEVEL(submitReportDTO.getEngChgLevel());//版本号 } Part part = partMapper.selectById(applyPart.getPartId()); batchInfo.setLOT_BATCH_NO(submitReportDTO.getIfsBatchNo());//ifs批次号 //判断是否启用批次管理 if (part.getLotTrackingIfs() != null && part.getLotTrackingIfs()) { batchInfo.setWAIV_DEV_REJ_NO(submitReportDTO.getOutBatchNo());//mes的批次号作为ifs的wdr号 } else { batchInfo.setWAIV_DEV_REJ_NO("*");//wdr号 } if (!StrUtil.equals(batchInfo.getLOCATION_NO(), batchInfo.getTO_LOCATION_NO())) { dataBeanList.add(batchInfo); } } if (new BigDecimal(applyPart.getUnqualifiedArrived()).compareTo(BigDecimal.ZERO) > 0) { if (applyPart.getSourceLocationId() != null) { toQualifiedLocation = locationMapper.selectById(applyPart.getSourceLocationId()).getIfsLocation(); unhgLocation = locationMapper.selectById(applyPart.getTargetUnqualifiedLocationId()).getIfsLocation(); } IfsMoveLibraryDTO.DataBean batchInfo = new IfsMoveLibraryDTO.DataBean(); batchInfo.setPART_NO(applyPart.getPartNo());//零件号 batchInfo.setMOVE_QTY(Double.parseDouble(applyPart.getUnqualifiedArrived()));//移库数量 if (StringUtils.equals(dir, ApplyPartServiceImpl.MOVELIBRARY)) { batchInfo.setLOCATION_NO(toQualifiedLocation); batchInfo.setTO_LOCATION_NO(unhgLocation); }else { batchInfo.setLOCATION_NO(unhgLocation); batchInfo.setTO_LOCATION_NO(toQualifiedLocation); } batchInfo.setTO_CONTRACT(contract);//目标域 SubmitReportDTO submitReportDTO = reportMapper.getManufacturingOrderInfo(applyPart.getId()); if (applyPart.getSourceLocationId() != null) { Stock stock = stockService.getById(applyPart.getStockId()); submitReportDTO = new SubmitReportDTO(); submitReportDTO.setOutBatchNo(stock.getPartBatchNo()); submitReportDTO.setIfsBatchNo(stock.getIfsBatchNo()); } else { batchInfo.setSERIAL_NO(submitReportDTO.getIfsSequenceNo());//序列号 batchInfo.setENG_CHG_LEVEL(submitReportDTO.getEngChgLevel());//版本号 } Part part = partMapper.selectById(applyPart.getPartId()); batchInfo.setLOT_BATCH_NO(submitReportDTO.getIfsBatchNo());//ifs批次号 //判断是否启用批次管理 if (part.getLotTrackingIfs() != null && part.getLotTrackingIfs()) { batchInfo.setWAIV_DEV_REJ_NO(submitReportDTO.getOutBatchNo());//mes的批次号作为ifs的wdr号 } else { batchInfo.setWAIV_DEV_REJ_NO("*");//wdr号 } // 因为现在多个 mes库位可能对应一个 ifs库位 所以 执行移库操作之前需要判断一下库位是否相同 // xcg 20230413 if (!StrUtil.equals(batchInfo.getLOCATION_NO(), batchInfo.getTO_LOCATION_NO())) { dataBeanList.add(batchInfo); } } } if(CollectionUtils.isEmpty(dataBeanList)){ return; } ifsMoveLibraryDTO.setBATCH_INFO(dataBeanList); Gson gson = new Gson(); String jsonstr = gson.toJson(ifsMoveLibraryDTO); JSONObject jsonObject = JSONObject.parseObject(jsonstr);//解决序列化时自动将大写转小写问题 R res = ifsFeignClient.importMovePartStd(jsonObject,true); if(res.getCode() != 0){ throw new RuntimeException("ifs库存件移库失败;erromsg:" + res.getMsg()); } } /** * 根据检测汇报材料对接ifs——车间订单接收 * @param applyPartList 检测汇报材料 * @param businessCode 业务类型码 */ private void ifsShopOrderRec(List applyPartList,String businessCode,Boolean isNeedFinishApply){ List applyPartList_ifs = new ArrayList<>();//需要对接ifs车间订单接收的汇报材料 for(ApplyPart applyPart : applyPartList){ if(reportUtils.getDockingIfsCondition(applyPart.getSystemNo(),applyPart.getId()).getIsShopOrderRec()){ applyPartList_ifs.add(applyPart); } } ifsShopOrderRecOrCancelRecRealizeCell(applyPartList_ifs,businessCode,isNeedFinishApply); } /** * 根据检测汇报材料对接ifs——车间订单取消接收 * @param applyPartList 检测汇报材料 * @param businessCode 业务类型码 */ private void ifsShopOrderCancelRec(List applyPartList,String businessCode,Boolean isNeedFinishApply){ List applyPartList_ifs = new ArrayList<>();//需要对接ifs车间订单取消接收的汇报材料 for(ApplyPart applyPart : applyPartList){ if(reportUtils.getDockingIfsCondition(applyPart.getSystemNo(),applyPart.getId()).getIsShopOrderCancelRec()){ applyPartList_ifs.add(applyPart); } } ifsShopOrderRecOrCancelRecRealizeCell(applyPartList_ifs,businessCode,isNeedFinishApply); } /** * 车间订单接收/取消接收实现单元 * @param applyPartList_ifs 待处理的检测汇报材料 * @param businessCode 业务类型码 */ private void ifsShopOrderRecOrCancelRecRealizeCell(List applyPartList_ifs,String businessCode,Boolean isNeedFinishApply){ if(CollectionUtils.isEmpty(applyPartList_ifs)){ return; } if(!businessCode.equals(SHOP_ORDER_REC) && !businessCode.equals(SHOP_ORDER_CANCEL_REC) && !businessCode.equals(SHOP_ORDER_REC_V2) && !businessCode.equals(SHOP_ORDER_CANCEL_REC_V2) && !businessCode.equals(MOVE_PART_REPLACE) && !businessCode.equals(CANCEL_MOVE_PART_REPLACE)) { throw new RuntimeException("车间订单接收/取消接收实现单元不接受业务类型码=" + businessCode); } // 更新同步类型 applyPartMapper.update(null, Wrappers.lambdaUpdate() .set(ApplyPart::getSyncIfsType, "IMPORT_SO_RECEIVE_STD") .in(ApplyPart::getId, applyPartList_ifs.stream().map(ApplyPart::getId).collect(Collectors.toList()))); //接收合格 List applyPartList_ifs_qualified = applyPartList_ifs.stream().filter(o -> new BigDecimal(o.getQtyArrived()).compareTo(BigDecimal.ZERO) == 1).collect(Collectors.toList()); //接收不合格 List applyPartList_ifs_unQualified = applyPartList_ifs.stream().filter(o -> new BigDecimal(o.getUnqualifiedArrived()).compareTo(BigDecimal.ZERO) == 1).collect(Collectors.toList()); IfsShopOrderDTO ifsShopOrderDTO = new IfsShopOrderDTO(); ifsShopOrderDTO.setRECORD_ID(UUID.randomUUID().toString().replace("-", "")); List dataBeanList = new ArrayList<>();//批量标识 for(ApplyPart applyPart : applyPartList_ifs_qualified){ //合格品库位(取工单中库位) Long qualifiedLocationId = workstationLocationMapper.selectFinishToQualifiedLocationIdBySystemNo(applyPart.getSystemNo()); if (!isNeedFinishApply) { qualifiedLocationId = workstationLocationMapper.selectQualifiedLocationIdBySystemNo(applyPart.getSystemNo()); } //通过库位id转获取ifs库位号 String ifsqualifiedLocationNo = locationMapper.selectById(qualifiedLocationId).getIfsLocation(); SubmitReportDTO submitReportDTO = reportMapper.getManufacturingOrderInfo(applyPart.getId()); IfsShopOrderDTO.DataBean batchInfo = new IfsShopOrderDTO.DataBean(); batchInfo.setORDER_NO(submitReportDTO.getIfsOrderNo());//车间订单号 batchInfo.setRELEASE_NO(submitReportDTO.getIfsReleaseNo());//下达号 batchInfo.setSEQUENCE_NO(submitReportDTO.getIfsSequenceNo());//序列号 Part part; if (applyPart.getReplacePartId() != null) { part = partMapper.selectById(applyPart.getReplacePartId()); batchInfo.setPART_NO(applyPart.getReplacePartNo());//零件号 } else { part = partMapper.selectById(applyPart.getPartId()); batchInfo.setPART_NO(submitReportDTO.getPartNo());//零件号 } //判断是否启用批次管理 if (part.getLotTrackingIfs() != null && part.getLotTrackingIfs()) { batchInfo.setWAIV_DEV_REJ_NO(submitReportDTO.getOutBatchNo()); } else { batchInfo.setWAIV_DEV_REJ_NO("*"); } batchInfo.setENG_CHG_LEVEL(part.getEngChgLevel()); batchInfo.setLOT_BATCH_NO(submitReportDTO.getIfsBatchNo());//批次号 batchInfo.setQUANTITY(Double.valueOf(applyPart.getQtyArrived()));//接收数量(合格) batchInfo.setLOCATION_NO(ifsqualifiedLocationNo); batchInfo.setSHIFT_DATE(submitReportDTO.getNowDutyDate());//班次日期 if("早".equals(submitReportDTO.getShiftName().substring(0,1))){ batchInfo.setSHIFT_TYPE("白"); }else if("夜".equals(submitReportDTO.getShiftName().substring(0,1))) { batchInfo.setSHIFT_TYPE("夜"); } batchInfo.setOUT_SYS_LOT_BAT_NO(submitReportDTO.getOutBatchNo());//SN号 dataBeanList.add(batchInfo); //更新产出已同步/未同步ifs if(businessCode.equals(SHOP_ORDER_REC) || businessCode.equals(SHOP_ORDER_REC_V2) || businessCode.equals(MOVE_PART_REPLACE)){ reportMapper.updateProductOutIsSynIfs(applyPart.getSystemNo(),true); }else{ reportMapper.updateProductOutIsSynIfs(applyPart.getSystemNo(),false); } } for(ApplyPart applyPart : applyPartList_ifs_unQualified){ //产出不合格品库位 Long disqualifiedLocationId = workstationLocationMapper.selectBySystemNo(applyPart.getSystemNo(), WorkstationLocation.DISQUALIFIED_LOCATION); //通过库位id转获取ifs库位号 String ifsDisqualifiedLocationNo = locationMapper.selectById(disqualifiedLocationId).getIfsLocation(); SubmitReportDTO submitReportDTO = reportMapper.getManufacturingOrderInfo(applyPart.getId()); IfsShopOrderDTO.DataBean batchInfo = new IfsShopOrderDTO.DataBean(); batchInfo.setORDER_NO(submitReportDTO.getIfsOrderNo());//车间订单号 batchInfo.setRELEASE_NO(submitReportDTO.getIfsReleaseNo());//下达号 batchInfo.setSEQUENCE_NO(submitReportDTO.getIfsSequenceNo());//序列号 Part part; if (applyPart.getReplacePartId() != null) { part = partMapper.selectById(applyPart.getReplacePartId()); batchInfo.setPART_NO(applyPart.getReplacePartNo());//零件号 } else { part = partMapper.selectById(applyPart.getPartId()); batchInfo.setPART_NO(submitReportDTO.getPartNo());//零件号 } //判断是否启用批次管理 if (part.getLotTrackingIfs() != null && part.getLotTrackingIfs()) { batchInfo.setWAIV_DEV_REJ_NO(submitReportDTO.getOutBatchNo()); } else { batchInfo.setWAIV_DEV_REJ_NO("*"); } batchInfo.setENG_CHG_LEVEL(part.getEngChgLevel()); batchInfo.setLOT_BATCH_NO(submitReportDTO.getIfsBatchNo());//批次号 batchInfo.setQUANTITY(Double.valueOf(applyPart.getUnqualifiedArrived()));//接收数量(不合格) batchInfo.setLOCATION_NO(ifsDisqualifiedLocationNo); batchInfo.setSHIFT_DATE(submitReportDTO.getNowDutyDate());//班次日期 if("早".equals(submitReportDTO.getShiftName().substring(0,1))){ batchInfo.setSHIFT_TYPE("白"); }else if("夜".equals(submitReportDTO.getShiftName().substring(0,1))) { batchInfo.setSHIFT_TYPE("夜"); } batchInfo.setOUT_SYS_LOT_BAT_NO(submitReportDTO.getOutBatchNo());//SN号 dataBeanList.add(batchInfo); //更新产出已同步/未同步ifs if(businessCode.equals(SHOP_ORDER_REC)|| businessCode.equals(SHOP_ORDER_REC_V2) || businessCode.equals(MOVE_PART_REPLACE)){ reportMapper.updateProductOutIsSynIfs(applyPart.getSystemNo(),true); } else { reportMapper.updateProductOutIsSynIfs(applyPart.getSystemNo(),false); } } if(CollectionUtils.isEmpty(dataBeanList)){ return; } ifsShopOrderDTO.setBATCH_INFO(dataBeanList); Gson gson = new Gson(); String jsonstr = gson.toJson(ifsShopOrderDTO); JSONObject jsonObject = JSONObject.parseObject(jsonstr);//解决序列化时自动将大写转小写问题 //批量接收/取消接收 R res; if(businessCode.equals(SHOP_ORDER_REC) || businessCode.equals(SHOP_ORDER_REC_V2) || businessCode.equals(MOVE_PART_REPLACE)){ res = ifsFeignClient.importSoReceiveStd(jsonObject,true); }else{ res = ifsFeignClient.importSoUnReceiveStd(jsonObject,true); } if(res.getCode() != 0){ if(businessCode.equals(SHOP_ORDER_REC) || businessCode.equals(SHOP_ORDER_REC_V2) || businessCode.equals(MOVE_PART_REPLACE)){ throw new RuntimeException("IFS车间订单接收失败->" + res.getMsg()); }else{ throw new RuntimeException("IFS车间订单取消接收失败->" + res.getMsg()); } } } /** * 对接ifs——工序报工 * @param applyPartList 检测汇报材料 * @param businessCode 业务类型码 * @param reportId 检测汇报id */ private void ifsOperationReport(List applyPartList,String businessCode,Long reportId){ //报产出数量,与合格与否没有关系 List applyPartList_ifs = new ArrayList<>();//需要对接ifs车间订单取消接收的汇报材料 for(ApplyPart applyPart : applyPartList){ if(reportUtils.getDockingIfsCondition(applyPart.getSystemNo(),applyPart.getId()).getIsReportOperation()){ applyPartList_ifs.add(applyPart); } } //获取待处理的产出系统号 Set systemNoList = applyPartList_ifs.stream().map(o -> o.getSystemNo()).collect(Collectors.toSet()); ifsOperationReportOrCancelReportRealizeCell(systemNoList,businessCode,reportId); } /** * 对接ifs——取消工序报工 * @param applyPartList 检测汇报材料 * @param businessCode 业务类型码 * @param reportId 检测汇报id */ private void ifsOperationCancelReport(List applyPartList,String businessCode,Long reportId){ List applyPartList_ifs = new ArrayList<>();//需要对接ifs车间订单取消接收的汇报材料 for(ApplyPart applyPart : applyPartList){ if(reportUtils.getDockingIfsCondition(applyPart.getSystemNo(),applyPart.getId()).getIsCancelReportOperation()){ applyPartList_ifs.add(applyPart); } } //获取待处理的产出系统号 Set systemNoList = applyPartList_ifs.stream().map(o -> o.getSystemNo()).collect(Collectors.toSet()); ifsOperationReportOrCancelReportRealizeCell(systemNoList,businessCode,reportId); } private void ifsOperationReportOrCancelReportRealizeCell(Set systemNoList,String businessCode,Long reportId){ if(CollectionUtils.isEmpty(systemNoList)){ return; } if(!businessCode.equals(REPORT_OPERATION) && !businessCode.equals(CANCEL_REPORT_OPERATION)){ throw new RuntimeException("工序报工/取消工序报工实现单元不接受业务类型码=" + businessCode); } IfsOperationReportDTO ifsOperationReportDTO = new IfsOperationReportDTO(); if(businessCode.equals(REPORT_OPERATION)){ ifsOperationReportDTO.setSYSMODEL("检测汇报工序报工"); }else if(businessCode.equals(CANCEL_REPORT_OPERATION)){ ifsOperationReportDTO.setSYSMODEL("检测汇报取消工序报工"); } List dataBeanList = new ArrayList<>();//批量标识 if(businessCode.equals(CANCEL_REPORT_OPERATION)){ //通过ifs事务id进行取消工序报工 List qualityMainIfsReportList = qualityMainIfsReportMapper.getQualityMainIfsReportListByReportId(reportId); if(CollectionUtils.isNotEmpty(qualityMainIfsReportList)){ for(QualityMainIfsReport qualityMainIfsReport : qualityMainIfsReportList){ if(false){//报工人工、报工工序事务id存行,不存列,万一有可能不对称 if(null != qualityMainIfsReport.getIfsOpfeedId()){ IfsOperationReportDTO.DataBean dataBean = new IfsOperationReportDTO.DataBean(); dataBean.setTRANSACTION_ID(qualityMainIfsReport.getIfsOpfeedId()); dataBeanList.add(dataBean); } if(null != qualityMainIfsReport.getIfsLaborId()){ IfsOperationReportDTO.DataBean dataBean1 = new IfsOperationReportDTO.DataBean(); dataBean1.setTRANSACTION_ID(qualityMainIfsReport.getIfsLaborId()); dataBeanList.add(dataBean1); } } if(null != qualityMainIfsReport.getTransactionId()){ IfsOperationReportDTO.DataBean dataBean = new IfsOperationReportDTO.DataBean(); dataBean.setTRANSACTION_ID(qualityMainIfsReport.getTransactionId()); dataBeanList.add(dataBean); } } } }else{ //工序报工 int offset = 1000; for(String systemNo : systemNoList){ //提示:将system_no转成批次号,方便对批次号分组汇总产量进行工序报工(工序报工不管合格与否,所以不能取汇报材料中的数量) IfsOperationReportDTO.DataBean dataBean_tmp = reportMapper.getIfsOperationReportDTOBeanBySystemNo(systemNo); if(dataBean_tmp != null && dataBean_tmp.getMO_ID() != null){ //通过制造订单id获取所有ifs工序号 List operationNoList = reportMapper.getIfsOperationReportAllOperationNo(dataBean_tmp.getMO_ID()); if(CollectionUtils.isNotEmpty(operationNoList)){ for(Integer i : operationNoList){ IfsOperationReportDTO.DataBean dataBean = new IfsOperationReportDTO.DataBean(); dataBean.setORDER_NO(dataBean_tmp.getORDER_NO()); dataBean.setRELEASE_NO(dataBean_tmp.getRELEASE_NO()); dataBean.setSEQUENCE_NO(dataBean_tmp.getSEQUENCE_NO()); dataBean.setOPERATION_NO(i); dataBean.setREPORTED_QTY(dataBean_tmp.getREPORTED_QTY()); dataBean.setMesParams("{\"qualityReportId\":" + reportId + "}"); dataBean.setMES_REPORT_ID(i + offset);//增加偏移量,保证每次的id不一样 dataBeanList.add(dataBean); } } } ++offset; } } if(CollectionUtils.isEmpty(dataBeanList)){ return; } ifsOperationReportDTO.setBATCH_INFO(dataBeanList); Gson gson = new Gson(); JSONObject jsonObject = JSONObject.parseObject(gson.toJson(ifsOperationReportDTO));//解决序列化时自动将大写转小写问题 R res; if(businessCode.equals(REPORT_OPERATION)){ res = ifsFeignClient.importSoOperReportStd(jsonObject, true); }else{ res = ifsFeignClient.importSoOperUnreportStd(jsonObject,true); } if(res.getCode() == 0){ if(businessCode.equals(REPORT_OPERATION)){ JSONObject data = (JSONObject) JSON.toJSON(res.getData()); try{ if(data.getJSONArray("LIST_INFO").isEmpty()){ return;//ifs关闭后避免报错(ifs开关处于关闭状态才会返回LIST_INFO节点) } }catch(Exception e){ ;//说明没有LIST_INFO节点,即ifs开关处于打开状态 } if (!data.getString("OPERATION_TYPE").equals("1")) { throw new RuntimeException("ifs工序报工失败->" + data.getString("ErrorMsg")); }else{ // 保存ifs工序报告id和人工id,用于取消 JSONArray reportInfosList = data.getJSONArray("REPORT_INFOS"); for (int i = 0; i < reportInfosList.size(); i++) { JSONArray reportInfo = reportInfosList.getJSONObject(i).getJSONArray("REPORT_INFO"); if (CollectionUtil.isNotEmpty(reportInfo)) { Long ifsOpfeedId = null;//ifs报告工序id Long ifsLaborId = null;//ifs报告人工id Map transactionMap = new HashMap<>(); for (int j = 0; j < reportInfo.size(); j++) { if (reportInfo.getJSONObject(j).getString("TRANSACTION_CODE").equals("OPFEED")) { //ifsOpfeedId = reportInfo.getJSONObject(j).getLongValue("TRANSACTION_ID"); transactionMap.put(reportInfo.getJSONObject(j).getLongValue("TRANSACTION_ID"),"OPFEED"); } else if(reportInfo.getJSONObject(j).getString("TRANSACTION_CODE").equals("LABOR_RPT")){ //ifsLaborId = reportInfo.getJSONObject(j).getLongValue("TRANSACTION_ID"); transactionMap.put(reportInfo.getJSONObject(j).getLongValue("TRANSACTION_ID"),"LABOR_RPT"); } } for(Map.Entry vo : transactionMap.entrySet()){ QualityMainIfsReport qualityMainIfsReport = new QualityMainIfsReport(); qualityMainIfsReport.setQualityReportId(reportId);//检测汇报id //qualityMainIfsReport.setIfsOpfeedId(ifsOpfeedId); //qualityMainIfsReport.setIfsLaborId(ifsLaborId); qualityMainIfsReport.setTransactionId(vo.getKey());//事务id qualityMainIfsReport.setTransactionCode(vo.getValue());//事务类别 qualityMainIfsReportMapper.insert(qualityMainIfsReport); } } } } }else{ //取消成功后删除检测汇报对接ifs工序报工回应对照表 qualityMainIfsReportMapper.delRecordsByReportId(reportId); } }else{ if(businessCode.equals(REPORT_OPERATION)){ throw new RuntimeException("IFS工序报工失败->" + res.getMsg()); }else{ throw new RuntimeException("IFS取消工序报工失败->" + res.getMsg()); } } } /** * 对接ifs——工序报废/取消报废 * @param applyPartList 检测汇报材料 * @param businessCode 业务类型码 */ private void ifsOperationScrap(List applyPartList,String businessCode){ //报废数量从产出明细中获取,报废数量单独存在产出表中,需要根据批次号进行累加求和 List applyPartList_ifs = new ArrayList<>();//需要对接ifs工序报废的汇报材料 for(ApplyPart applyPart : applyPartList){ if(reportUtils.getDockingIfsCondition(applyPart.getSystemNo(),applyPart.getId()).getIsReportOperation()){ applyPartList_ifs.add(applyPart); } } //获取待处理的产出批次号 Set lotBatchNoList = applyPartList_ifs.stream().map(o -> o.getLotBatchNo()).collect(Collectors.toSet()); ifsOperationScrapOrCancelScrapRealizeCell(lotBatchNoList,businessCode); } /** * 对接ifs——取消工序报废 * @param applyPartList 检测汇报材料 * @param businessCode 业务类型码 */ private void ifsOperationCancelScrap(List applyPartList,String businessCode){ //报废数量从产出明细中获取,报废数量单独存在产出表中,需要根据批次号进行累加求和 List applyPartList_ifs = new ArrayList<>();//需要对接ifs工序报废的汇报材料 for(ApplyPart applyPart : applyPartList){ if(reportUtils.getDockingIfsCondition(applyPart.getSystemNo(),applyPart.getId()).getIsCancelReportOperation()){ applyPartList_ifs.add(applyPart); } } //获取待处理的产出批次号 Set lotBatchNoList = applyPartList_ifs.stream().map(o -> o.getLotBatchNo()).collect(Collectors.toSet()); ifsOperationScrapOrCancelScrapRealizeCell(lotBatchNoList,businessCode); } /** * 工序报废/取消报废实现单元 * @param lotBatchNoList 待处理的产出批次号 * @param businessCode 业务类型码 */ private void ifsOperationScrapOrCancelScrapRealizeCell(Set lotBatchNoList,String businessCode){ if(CollectionUtils.isEmpty(lotBatchNoList)){ return; } if(!businessCode.equals(SCRAP_OPERATION) && !businessCode.equals(CANCEL_SCRAP_OPERATION)){ throw new RuntimeException("工序报废/取消报废实现单元不接受业务类型码=" + businessCode); } IfsOperationScrapDTO ifsOperationScrapDTO = new IfsOperationScrapDTO(); if(businessCode.equals(SCRAP_OPERATION)){ ifsOperationScrapDTO.setSYSMODEL("检测汇报工序报废"); }else if(businessCode.equals(CANCEL_SCRAP_OPERATION)){ ifsOperationScrapDTO.setSYSMODEL("检测汇报取消工序报废"); } List dataBeanList = new ArrayList<>();//批量标识 for(String lotBatchNo : lotBatchNoList){ IfsOperationScrapDTO.DataBean dataBean = reportMapper.getIfsOperationScrapDTODataBeanByBatchNo(lotBatchNo); if(dataBean != null){ dataBeanList.add(dataBean); } } if(CollectionUtils.isEmpty(dataBeanList)){ return;//没有报废 } ifsOperationScrapDTO.setBATCH_INFO(dataBeanList); Gson gson = new Gson(); JSONObject jsonObject = JSONObject.parseObject(gson.toJson(ifsOperationScrapDTO));//解决序列化时自动将大写转小写问题 R res; if(businessCode.equals(SCRAP_OPERATION)){ res = ifsFeignClient.importSoOperScrapStd(jsonObject, true); }else{ res = ifsFeignClient.importSoOperUnscrapStd(jsonObject,true); } if(res.getCode() != 0){ if(businessCode.equals(SCRAP_OPERATION)){ throw new RuntimeException("IFS工序报废失败->" + res.getMsg()); }else{ throw new RuntimeException("IFS取消工序报废失败->" + res.getMsg()); } } } }