package com.chinaztt.mes.production.service.impl; import cn.hutool.core.collection.CollectionUtil; import com.alibaba.csp.sentinel.util.StringUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 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.PartFamily; import com.chinaztt.mes.basic.mapper.LocationMapper; import com.chinaztt.mes.basic.mapper.PartFamilyMapper; import com.chinaztt.mes.basic.mapper.PartMapper; import com.chinaztt.mes.production.dto.ExaminerDTO; import com.chinaztt.mes.production.dto.FeederCertificateSelectDTO; import com.chinaztt.mes.production.dto.IfsFeederCertificateDTO; import com.chinaztt.mes.production.entity.Examiner; import com.chinaztt.mes.production.entity.FeederCertificate; import com.chinaztt.mes.production.entity.ProductOutput; import com.chinaztt.mes.production.mapper.ExaminerMapper; import com.chinaztt.mes.production.mapper.FeederCertificateMapper; import com.chinaztt.mes.production.mapper.ProductOutputMapper; import com.chinaztt.mes.production.service.FeederCertificateService; import com.chinaztt.mes.quality.entity.BasicCustomerPartRelationMap; import com.chinaztt.mes.quality.mapper.BasicCustomerPartRelationMapMapper; import com.chinaztt.mes.warehouse.dto.*; import com.chinaztt.mes.warehouse.entity.Stock; import com.chinaztt.mes.warehouse.mapper.StockMapper; 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.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; /** * 馈线合格证 * * @author yy * @date 2022-11-17 09:11:25 */ @Service @AllArgsConstructor @Transactional(rollbackFor = Exception.class) public class FeederCertificateServiceImpl extends ServiceImpl implements FeederCertificateService { private StockService stockService; private StockMapper stockMapper; private PartMapper partMapper; private IfsFeignClient ifsFeignClient; private LocationMapper locationMapper; private ExaminerMapper examinerMapper; private ProductOutputMapper productOutputMapper; private BasicCustomerPartRelationMapMapper basicCustomerPartRelationMapMapper; private RemoteParamService remoteParamService; private PartFamilyMapper partFamilyMapper; @Override public FeederCertificateDTO getFeederCertificateBySn(String sn,String commonSn) { FeederCertificate feederCertificate = baseMapper.selectOne(Wrappers.lambdaQuery() .eq(FeederCertificate::getSn, sn)); if(feederCertificate!=null){ throw new RuntimeException("已有该sn号,不能重复提交"); } //实时库存中的库存数量大于零且在合格库位 List locationList = locationMapper.selectList(Wrappers.lambdaQuery().eq(Location::getLocType, "2")); List locationIdList = locationList.stream().map(Location::getId).collect(Collectors.toList()); FeederCertificateDTO feederCertificateBySn = stockMapper.getFeederCertificate(sn,locationIdList); if(feederCertificateBySn==null){ throw new RuntimeException("该sn号在实时库存没有合格库记录"); } Part origPart = null; Part partAfter = null; List productOutputList = productOutputMapper.selectList(Wrappers.lambdaQuery() .eq(ProductOutput::getOutBatchNo, feederCertificateBySn.getSn())); if(CollectionUtil.isNotEmpty(productOutputList) && productOutputList.get(0).getOrigPartId()!=null){ origPart = partMapper.selectById(productOutputList.get(0).getOrigPartId()); partAfter = partMapper.selectById(productOutputList.get(0).getPartId()); }else { origPart = partMapper.selectList(Wrappers.lambdaQuery().eq(Part::getPartNo, feederCertificateBySn.getPartNo())).get(0); partAfter = origPart; } //同类SN校验 if(StringUtils.isNotBlank(commonSn)){ FeederCertificate commonFeederCertificate = baseMapper.selectOne(Wrappers.lambdaQuery() .eq(FeederCertificate::getSn, commonSn)); if(commonFeederCertificate!=null){ throw new RuntimeException("已有该同类sn号,不能重复提交"); } FeederCertificateDTO commonFeederCertificateBySn = stockMapper.getFeederCertificate(commonSn,locationIdList); if(commonFeederCertificateBySn==null){ throw new RuntimeException("该同类sn号在实时库存没有合格库记录"); } if(feederCertificateBySn.getStockQuantity().compareTo(commonFeederCertificateBySn.getStockQuantity())!=0){ throw new RuntimeException("同类sn号和初始sn号生产长度不同"); } if(!feederCertificateBySn.getLocationId().equals(commonFeederCertificateBySn.getLocationId())){ throw new RuntimeException("同类sn号和初始sn号所在库位不一样"); } List commonProductOutputList = productOutputMapper.selectList(Wrappers.lambdaQuery() .eq(ProductOutput::getOutBatchNo, commonFeederCertificateBySn.getSn())); Long commonOrigPartId = null; if(CollectionUtil.isNotEmpty(commonProductOutputList) && commonProductOutputList.get(0).getOrigPartId()!=null){ commonOrigPartId = partMapper.selectById(commonProductOutputList.get(0).getOrigPartId()).getId(); }else{ commonOrigPartId = partMapper.selectList(Wrappers.lambdaQuery().eq(Part::getPartNo,commonFeederCertificateBySn.getPartNo())).get(0).getId(); } if(!origPart.getId().equals(commonOrigPartId)){ throw new RuntimeException("同类sn号和初始sn号生产零件号不同"); } return commonFeederCertificateBySn; } //根据入库零件号找零件族编号 if(partAfter.getPartFamilyId()!=null){ PartFamily partFamily = partFamilyMapper.selectById(partAfter.getPartFamilyId()); if(partFamily!=null){ feederCertificateBySn.setPartFamilyNo(partFamily.getPartFamilyNo()); } } feederCertificateBySn.setPartNo(origPart.getPartNo()); feederCertificateBySn.setPartNoAfter(partAfter.getPartNo()); feederCertificateBySn.setExaminer(origPart.getExaminer()); feederCertificateBySn.setSpecs(partAfter.getSpecs()); feederCertificateBySn.setPartModel(partAfter.getPartModel()); feederCertificateBySn.setProdName(partAfter.getProdName()); BasicCustomerPartRelationMap basicCustomerPartRelationMap = basicCustomerPartRelationMapMapper.selectOne(Wrappers.lambdaQuery() .eq(BasicCustomerPartRelationMap::getPartNo, feederCertificateBySn.getPartNo())); if(basicCustomerPartRelationMap!=null) { feederCertificateBySn.setCusMaterialCode(basicCustomerPartRelationMap.getCusMaterialCode()); } Calendar calendar = Calendar.getInstance(); String year = calendar.get(Calendar.YEAR) + ""; String month = (calendar.get(Calendar.MONTH) + 1) + ""; String date = year + "." + month; feederCertificateBySn.setDate(date); return feederCertificateBySn; } @Override public List changeExaminer(String partNo) { List examinerList = examinerMapper.selectList(Wrappers.lambdaQuery() .eq(Examiner::getPartNo, partNo)); /* if(CollectionUtil.isEmpty(examinerList)){ throw new RuntimeException("零件降级配置尚未配置"); }*/ List examinerAfterList = examinerList.stream().map(Examiner::getExaminerAfter).collect(Collectors.toList()); return examinerAfterList; } @Override public List saveSnBatch(List feederCertificateList) { List snList = feederCertificateList.stream().map(FeederCertificate::getSn).collect(Collectors.toList()); List feederCertificateListBySnList = baseMapper.selectList(Wrappers.lambdaQuery() .in(FeederCertificate::getSn, snList)); if(CollectionUtil.isNotEmpty(feederCertificateListBySnList)){ throw new RuntimeException("已有该sn号,不能重复提交"); } //实时库存中的库存数量大于零且在合格库位 List locationList = locationMapper.selectList(Wrappers.lambdaQuery().eq(Location::getLocType, "2")); List locationIdList = locationList.stream().map(Location::getId).collect(Collectors.toList()); List stockList = stockMapper.selectList(Wrappers.lambdaQuery() .in(Stock::getPartBatchNo,snList) .in(Stock::getLocationId,locationIdList) .gt(Stock::getAvailableStockQuantity,BigDecimal.ZERO)); if(CollectionUtil.isEmpty(stockList)){ throw new RuntimeException("库存表合格库位没有该sn号"); } saveBatch(feederCertificateList); Part partAfter = partMapper.selectOne(Wrappers.lambdaQuery() .eq(Part::getPartNo, feederCertificateList.get(0).getPartNoAfter())); stockList.stream().forEach( a-> a.setPartId(partAfter.getId()) ); stockService.updateBatchById(stockList); //库存发放 List provideFeederCertificateList = new ArrayList<>(); for (FeederCertificate feederCertificate:feederCertificateList) { if(feederCertificate.getStockQuantity().subtract(feederCertificate.getStockQuantityAfter()).compareTo(BigDecimal.ZERO)>0){ provideFeederCertificateList.add(feederCertificate); } } if(CollectionUtil.isNotEmpty(provideFeederCertificateList)){ List provideSnList = provideFeederCertificateList.stream().map(FeederCertificate::getSn).collect(Collectors.toList()); List provideStockBySnList = stockMapper.getStockBySnList(provideSnList); for (StockDTO stockDTO:provideStockBySnList) { for (FeederCertificate provideFeederCertificate:provideFeederCertificateList) { if(stockDTO.getPartBatchNo().equals(provideFeederCertificate.getSn())){ stockDTO.setAvailableStockQuantityMove(provideFeederCertificate.getStockQuantity() .subtract(provideFeederCertificate.getStockQuantityAfter())); stockDTO.setSynIfs(true); } } } stockService.deleteStock(provideStockBySnList); } //ifs更新wdr接口 List ifsFeederCertificateList = baseMapper.getIfsFeederCertificateList(snList); IfsImportChangeWdrStdDTO ifsImportChangeWdrStdDTO = new IfsImportChangeWdrStdDTO(); ifsImportChangeWdrStdDTO.setRECORD_ID(UUID.randomUUID().toString().replace("-", "")); List dataBeanList = new ArrayList<>();//批量标识 for(IfsFeederCertificateDTO ifsFeederCertificate:ifsFeederCertificateList){ FeederCertificate feederCertificate = baseMapper.selectOne(Wrappers.lambdaQuery() .eq(FeederCertificate::getSn, ifsFeederCertificate.getPartBatchNo())); String wdr = null; if(feederCertificate.getExaminerAfter()==null){ wdr = feederCertificate.getExaminer(); }else{ wdr = feederCertificate.getExaminerAfter(); } IfsImportChangeWdrStdDTO.DataBean batchInfo = new IfsImportChangeWdrStdDTO.DataBean(); batchInfo.setPART_NO(ifsFeederCertificate.getPartNo());//零件号 batchInfo.setLOT_BATCH_NO(ifsFeederCertificate.getIfsBatchNo());//ifs批次号 batchInfo.setMOVE_QTY(ifsFeederCertificate.getStockQuantity());//移库数量 //判断是否启用批次管理 //WDR号 if(ifsFeederCertificate.getLotTrackingIfs() != null && ifsFeederCertificate.getLotTrackingIfs()){ batchInfo.setWAIV_DEV_REJ_NO(feederCertificate.getSn()); }else{ batchInfo.setWAIV_DEV_REJ_NO("*"); } //版本号 batchInfo.setENG_CHG_LEVEL(ifsFeederCertificate.getEngChgLevel()); //库位号 batchInfo.setLOCATION_NO(ifsFeederCertificate.getLocationNo()); //至WDR号 batchInfo.setTO_WAIV_DEV_REJ_NO(wdr); dataBeanList.add(batchInfo); } ifsImportChangeWdrStdDTO.setBATCH_INFO(dataBeanList); Gson gson = new Gson(); String jsonstr = gson.toJson(ifsImportChangeWdrStdDTO); JSONObject jsonObject = JSONObject.parseObject(jsonstr); R res = ifsFeignClient.importChangeWdrStd(jsonObject, true); if(res.getCode() != 0){ throw new RuntimeException("ifs更新wdr接口失败;erromsg:" + res.getMsg()); } List idList = feederCertificateList.stream().map(FeederCertificate::getId).collect(Collectors.toList()); return idList; } @Override public List getExaminer(String partNo) { List examinerList = examinerMapper.selectList(Wrappers.lambdaQuery() .eq(Examiner::getPartNo, partNo)); if(CollectionUtil.isNotEmpty(examinerList)){ List examinerAfterList = examinerList.stream().map(Examiner::getExaminerAfter).collect(Collectors.toList()); return examinerAfterList; }else{ return null; } } @Override public IPage> getPage(Page page, QueryWrapper gen) { return baseMapper.getPage(page, gen); } /** * 更新打印次数 * * @param ids * @param copies * @return */ @Override public Boolean updatePrintNum(List ids, Long copies) { List feederCertificateList = baseMapper.selectBatchIds(ids); for (FeederCertificate feederCertificate:feederCertificateList) { if(feederCertificate.getPrintNum()==null){ feederCertificate.setPrintNum(copies); }else{ feederCertificate.setPrintNum(feederCertificate.getPrintNum()+copies); } } updateBatchById(feederCertificateList); return true; } @Override public Boolean checkPrintNumPassword(String password) { String res = remoteParamService.getByKey("WORKBENCH_LABEL_REPRINT", SecurityConstants.FROM_IN).getData(); if (null != res) { return res.equals(password); }else{ return false; } } }