From 7baf801d812ae8c727868f3e90e71a2a7b3ca05a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E7=B1=B3?= <470431449@qq.com> Date: Sun, 25 Feb 2024 17:36:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8E=9F=E5=A7=8BBOM-=E5=8F=8D=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../product/bomnew/config/TaskPoolConfig.java | 31 ++++++ .../master/BomNewOriginalChildMapper.java | 23 ++++- .../bomnew/pojo/vo/ReverseReportVO.java | 15 +++ .../service/BomNewOriginalParentService.java | 61 ++++++++---- .../ReverseReport/OriginalBomQuery.java | 63 +++++++++--- .../master/BomNewOriginalChildMapper.xml | 97 +++++++++++++------ 6 files changed, 228 insertions(+), 62 deletions(-) create mode 100644 nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/config/TaskPoolConfig.java diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/config/TaskPoolConfig.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/config/TaskPoolConfig.java new file mode 100644 index 00000000..710bf2b7 --- /dev/null +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/config/TaskPoolConfig.java @@ -0,0 +1,31 @@ +package com.nflg.product.bomnew.config; + + +import cn.hutool.core.thread.ThreadFactoryBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.ThreadPoolExecutor; + +@Configuration +public class TaskPoolConfig { + + + /** + * 原始BOM-同步到正式表线程池 + * @return + */ + @Bean("syncOriginalBomToFormalPool") + public ThreadPoolTaskExecutor searcherThreadPool() { + ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); + taskExecutor.setCorePoolSize(10); + taskExecutor.setMaxPoolSize(20); + taskExecutor.setQueueCapacity(2000); + taskExecutor.setKeepAliveSeconds(100); + taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + //设置线程池的线程名称,方便日志追踪 + taskExecutor.setThreadFactory(new ThreadFactoryBuilder().setNamePrefix("plm-searcher-thread-").build()); + return taskExecutor; + } +} diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/mapper/master/BomNewOriginalChildMapper.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/mapper/master/BomNewOriginalChildMapper.java index aa0a8c07..ff00ace2 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/mapper/master/BomNewOriginalChildMapper.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/mapper/master/BomNewOriginalChildMapper.java @@ -2,6 +2,7 @@ package com.nflg.product.bomnew.mapper.master; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.nflg.product.bomnew.pojo.entity.BomNewOriginalChildEntity; +import com.nflg.product.bomnew.pojo.vo.ReverseReportVO; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -18,5 +19,25 @@ public interface BomNewOriginalChildMapper extends BaseMapper rowIds ,@Param("parentRowId") Long parentRowId); - List selectMaterialParent(@Param("drawingNo") String drawingNo) ; + + + /** + * 原始BOM-反查报表 + * @param drawingNos + * @return + */ + List originalReverseReport(@Param("drawingNos") List drawingNos); + + /** + * 原始BOM-反查报表 + * @param drawingNos + * @return + */ + void delOriginalFormalBom(@Param("drawingNos") List drawingNos); + + /** + * 原始BOM-同步到正式表 + * @param rowIds + */ + void syncOriginalBomToFormal(@Param("rowIds") List rowIds); } diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/ReverseReportVO.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/ReverseReportVO.java index 7c04443a..f7d2b2be 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/ReverseReportVO.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/ReverseReportVO.java @@ -15,9 +15,15 @@ import java.util.Objects; @Data public class ReverseReportVO { + @ApiModelProperty("bom-rowId(parent表)") + private Long rowId; + @ApiModelProperty("层级") private String orderNumber; + @ApiModelProperty("图号") + private String drawingNo; + @ApiModelProperty("物料编码") private String materialNo; @@ -48,6 +54,15 @@ public class ReverseReportVO { @ApiModelProperty(value = "版本过期时间=下个版本的创建时间") private LocalDateTime expireEndTime; + @ApiModelProperty("是否子级 0-否 1-是") + private Integer childIs; + + @ApiModelProperty("父级行ID") + private Long parentRowId; + + @ApiModelProperty("子级报表") + private String childDrawingNo; + public LocalDateTime getExpireEndTime(){ return Objects.isNull(expireEndTime)? LocalDateTime.parse("9999-12-31 23:59:59", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")):expireEndTime; diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/BomNewOriginalParentService.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/BomNewOriginalParentService.java index e68dbf4d..0a5ccc56 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/BomNewOriginalParentService.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/BomNewOriginalParentService.java @@ -31,6 +31,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.map.LinkedMap; import org.bouncycastle.cert.dane.DANEEntry; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; @@ -83,12 +84,14 @@ public class BomNewOriginalParentService extends ServiceImpl getParentDrawingNoByMaterialNo(List drawingNos) { - List draringEnts = originalMaterialUseService.lambdaQuery().in(BomNewOriginalMaterialUseEntity::getDrawingNo, drawingNos).list(); - List draringNosList = draringEnts.stream().map(u -> StrUtil.split(u.getParentDrawingNos(), ",") ).collect(Collectors.toList()); + public Set getParentDrawingNoByMaterialNo(List drawingNos) { + List draringEnts = originalMaterialUseService.lambdaQuery().in(BomNewOriginalMaterialUseEntity::getDrawingNo, drawingNos).list(); + List draringNosList = draringEnts.stream().map(u -> StrUtil.split(u.getParentDrawingNos(), ",")).collect(Collectors.toList()); List draringNos = draringNosList.stream().flatMap(Arrays::stream).collect(Collectors.toList()); Set result = new HashSet<>(); if (CollUtil.isNotEmpty(draringNos)) { @@ -103,7 +106,7 @@ public class BomNewOriginalParentService extends ServiceImpl getOriginalBomListPage(OriginalBomQuery query) { - Page result= new Page<>(); + Page result = new Page<>(); //物料编码搜索或图号搜索 if (CollUtil.isNotEmpty(query.getMaterialNos()) || CollUtil.isNotEmpty(query.getDrawingNos())) { - List queryDrawingNos= new ArrayList<>(); + List queryDrawingNos = new ArrayList<>(); queryDrawingNos.addAll(query.getDrawingNos()); if (CollUtil.isNotEmpty(query.getMaterialNos())) { List drawingNos = this.getBaseMapper().getDrawingNoByMaterialNos(query.getMaterialNos()); @@ -165,7 +168,7 @@ public class BomNewOriginalParentService extends ServiceImpl(query.getPage(), query.getPageSize()), query, SessionUtil.getUserCode()); materialMainService.intiMaterialInfo(result.getRecords()); @@ -174,8 +177,6 @@ public class BomNewOriginalParentService extends ServiceImpl bomAllChildList = this.getBomTree(parent.getRowId()); - + BomOriginalListVO parentVO = Convert.convert(BomOriginalListVO.class, parent); parentVO.setEBomRowId(eBomRowId); @@ -513,22 +514,44 @@ public class BomNewOriginalParentService extends ServiceImpl { + syncToFormal(convert.getHasHandlerParentIds()); + },syncOriginalBomToFormalPool ); } //记录子级BOM版本行ID - List originalChildEntities=new ArrayList<>(); - bomAllChildList.forEach(k->{ - BomNewOriginalChildEntity entChild=new BomNewOriginalChildEntity(); + List originalChildEntities = new ArrayList<>(); + bomAllChildList.forEach(k -> { + BomNewOriginalChildEntity entChild = new BomNewOriginalChildEntity(); entChild.setRowId(k.getRowId()); entChild.setBomVersionRowId(k.getBomRowId()); originalChildEntities.add(entChild); }); - if(CollUtil.isNotEmpty(originalChildEntities)){ + if (CollUtil.isNotEmpty(originalChildEntities)) { originalChildService.updateBatchById(originalChildEntities); } } + /** + * 同步到历史正式表(只保留最新版) + */ + private void syncToFormal(List parentRowIds) { + List originalParents = this.getBaseMapper().selectBatchIds(parentRowIds); + + List drawingNos = originalParents.stream().distinct().map(u -> u.getDrawingNo()).collect(Collectors.toList()); + + if (CollUtil.isNotEmpty(drawingNos)) { + //删除正式版中已有图号的BOM + originalChildService.getBaseMapper().delOriginalFormalBom(drawingNos); + //同步新的BOM版本 + originalChildService.getBaseMapper().syncOriginalBomToFormal(parentRowIds); + } + + + } + public static ThreadLocal rowNum = new ThreadLocal<>(); public static ThreadLocal> excelContextTL = new ThreadLocal<>(); @@ -558,7 +581,7 @@ public class BomNewOriginalParentService extends ServiceImpl noMaterialNoList = excelContext.stream().filter(u -> StrUtil.isBlank(u.getMaterialNo())).collect(Collectors.toList()); materialMainService.initMaterialForDrawdingNo(noMaterialNoList, BomNewOriginalExcelDTO::getChartNo, BomNewOriginalExcelDTO::setMaterialNo, BomNewOriginalExcelDTO::setMaterialName); - List errResult=new ArrayList<>(); + List errResult = new ArrayList<>(); //转换 for (BomNewOriginalExcelDTO data : excelContext) { PlmBomToOriginalConvert convert = new PlmBomToOriginalConvert(); @@ -590,7 +613,7 @@ public class BomNewOriginalParentService extends ServiceImpl reportResult; + @Getter + private List reportResult = new ArrayList<>(); - private RedisService redisService= SpringUtil.getBean(RedisService.class); + private RedisService redisService = SpringUtil.getBean(RedisService.class); - private BomNewOriginalChildService originalChildService=SpringUtil.getBean(BomNewOriginalChildService.class); + private BomNewOriginalChildService originalChildService = SpringUtil.getBean(BomNewOriginalChildService.class); - public OriginalBomQuery(ReverseReportQuery inQueryParam){ - this.queryParam=inQueryParam; + public OriginalBomQuery(ReverseReportQuery inQueryParam) { + this.queryParam = inQueryParam; } - public void report(){ - if(queryParam.getQueryType().equals(ReportConstant.QueryTypeEnum.SINGLE.getValue())){ + public void report() { + if (queryParam.getQueryType().equals(ReportConstant.QueryTypeEnum.SINGLE.getValue())) { singleLevelReport(); + } else { + multipleLevelReport(ImmutableList.of(queryParam.getDrawingNo())); } } /** * 单层报表 */ - public void singleLevelReport(){ - List parentRowIds = originalChildService.getBaseMapper().selectMaterialParent(queryParam.getDrawingNo()); - - - + public void singleLevelReport() { + reportResult = originalChildService.getBaseMapper().originalReverseReport(ImmutableList.of(queryParam.getDrawingNo())); } + Map> resultMap = new HashMap<>(); + + /** + * 多层 + */ + public void multipleLevelReport(List drawingNos) { + + List parentList = originalChildService.getBaseMapper().originalReverseReport(drawingNos); + + if (CollUtil.isNotEmpty(parentList)) { + drawingNos.forEach(k -> { + List drawingParents = parentList.stream().filter(u -> u.getChildDrawingNo().equals(k)).collect(Collectors.toList()); + Map> nMap = ListCommonUtil.listGroupMap(drawingParents, ReverseReportVO::getDrawingNo); + nMap.keySet().forEach(u->{ + if(resultMap.containsKey(k)) { + nMap.get(u).addAll(resultMap.get(k)); + } + resultMap.put(u, nMap.get(u)); + }); + resultMap.remove(k); + }); + List dawNos = parentList.stream().map(u -> u.getDrawingNo()).distinct().collect(Collectors.toList()); + multipleLevelReport(dawNos); + } + else { + resultMap.forEach((k, v) -> { + reportResult.addAll(v); + }); + } + + } } diff --git a/nflg_project_dev/nflg-bom-new/src/main/resources/mapper/master/BomNewOriginalChildMapper.xml b/nflg_project_dev/nflg-bom-new/src/main/resources/mapper/master/BomNewOriginalChildMapper.xml index 6fdf03db..4e0a0c1e 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/resources/mapper/master/BomNewOriginalChildMapper.xml +++ b/nflg_project_dev/nflg-bom-new/src/main/resources/mapper/master/BomNewOriginalChildMapper.xml @@ -1,47 +1,88 @@ - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - row_id, parent_row_id, order_number, drawing_no, material_no, material_name, material_desc, unit_weight, num, total_weight ,remark,created_by,created_time ,edit_status ,material_texture ,should_bom_exist ,bom_version_row_id + row_id, parent_row_id, order_number, drawing_no, material_no, material_name, material_desc, unit_weight, num, + total_weight ,remark,created_by,created_time ,edit_status ,material_texture ,should_bom_exist + ,bom_version_row_id + - delete from t_bom_new_original_child where parent_row_id=#{parentRowId} and row_id not in + delete from t_bom_new_original_child where parent_row_id=#{parentRowId} and row_id not in #{rowId} - - + select b.* , a.drawing_no as childDrawingNo from t_bom_new_original_child_formal a + join t_bom_new_original_parent_formal b on a.parent_row_id=b.row_id + where + a.drawing_no in + + #{drawingNo} + + + + delete from t_bom_new_original_child_formal where parent_row_id in + ( select row_id from t_bom_new_original_parent_formal where drawing_no in + + #{drawingNo} + + ); + + delete from t_bom_new_original_parent_formal where drawing_no in + + #{drawingNo} + + ); + + + + + INSERT INTO `nflg`.`t_bom_new_original_parent_formal` (`row_id`, `batch_no`, `drawing_no`, `material_no`, `material_name`, `material_desc`, `current_version`, `num`, `root_is`, `user_root_is`, `bom_exist`, `should_bom_exist`, `last_version_is`, `material_texture`, `unit_weight`, `total_weight`, `devise_user_code`, `devise_name`, `status`, `edit_status`, `convert_to_ebom_time`, `dept_row_id`, `dept_name`, `source`, `remark`, `created_by`, `created_time`, `expire_end_time`, `level_num`) + + select `row_id`, `batch_no`, `drawing_no`, `material_no`, `material_name`, `material_desc`, `current_version`, `num`, `root_is`, `user_root_is`, `bom_exist`, `should_bom_exist`, `last_version_is`, `material_texture`, `unit_weight`, `total_weight`, `devise_user_code`, `devise_name`, `status`, `edit_status`, `convert_to_ebom_time`, `dept_row_id`, `dept_name`, `source`, `remark`, `created_by`, `created_time`, `expire_end_time`, `level_num` + from t_bom_new_original_parent where row_id in + + #{rowId} + ; + + INSERT INTO `t_bom_new_original_child_formal` (`row_id`, `parent_row_id`, `order_number`, `drawing_no`, `material_no`, `material_name`, `material_desc`, `unit_weight`, `num`, `total_weight`, `remark`, `created_time`, `created_by`, `edit_status`, `status`, `material_texture`, `should_bom_exist`, `bom_version_row_id`) + select `row_id`, `parent_row_id`, `order_number`, `drawing_no`, `material_no`, `material_name`, `material_desc`, `unit_weight`, `num`, `total_weight`, `remark`, `created_time`, `created_by`, `edit_status`, `status`, `material_texture`, `should_bom_exist`, `bom_version_row_id` + from t_bom_new_original_child + where parent_row_id in + + #{rowId} + ; +