diff --git a/nflg_project_dev/material/src/main/java/com/nflg/product/material/api/user/material/MaterialMainApi.java b/nflg_project_dev/material/src/main/java/com/nflg/product/material/api/user/material/MaterialMainApi.java index 5e34713f..c7f09d5b 100644 --- a/nflg_project_dev/material/src/main/java/com/nflg/product/material/api/user/material/MaterialMainApi.java +++ b/nflg_project_dev/material/src/main/java/com/nflg/product/material/api/user/material/MaterialMainApi.java @@ -7,6 +7,7 @@ import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.google.common.collect.ImmutableMap; import com.nflg.product.base.core.api.BaseApi; +import com.nflg.product.base.core.conmon.util.SessionUtil; import com.nflg.product.base.core.exception.NflgBusinessException; import com.nflg.product.material.pojo.dto.FindLastAttrValuesDTO; import com.nflg.product.material.pojo.dto.MaterialMainDTO; @@ -94,7 +95,7 @@ public class MaterialMainApi extends BaseApi { @GetMapping("selectByRowId") @ApiOperation("auto-根据rowId查询物料主数据表") public ResultVO selectByRowId(@RequestParam("rowId") Long rowId, @RequestParam("type") Integer type) { - return ResultVO.success(materialMainService.selectByRowId(rowId, type)); + return ResultVO.success(materialMainService.selectByRowId(rowId, type, SessionUtil.getUserCode())); } /** diff --git a/nflg_project_dev/material/src/main/java/com/nflg/product/material/api/user/material/MaterialUpdateBillApi.java b/nflg_project_dev/material/src/main/java/com/nflg/product/material/api/user/material/MaterialUpdateBillApi.java index 7b427dd7..69c391a8 100644 --- a/nflg_project_dev/material/src/main/java/com/nflg/product/material/api/user/material/MaterialUpdateBillApi.java +++ b/nflg_project_dev/material/src/main/java/com/nflg/product/material/api/user/material/MaterialUpdateBillApi.java @@ -8,6 +8,7 @@ import com.nflg.product.material.pojo.dto.TwentyMaterialTemplateExcelDTO; import com.nflg.product.material.pojo.dto.MaterialUpdateBillDTO; import com.nflg.product.material.pojo.entity.MaterialUpdateBillEntity; import com.nflg.product.material.pojo.query.MaterialUpdateBillQuery; +import com.nflg.product.material.pojo.vo.MaterialBatchImportVO; import com.nflg.product.material.pojo.vo.MaterialMainVO; import com.nflg.product.material.pojo.vo.MaterialUpdateBillVO; import com.nflg.product.material.service.MaterialUpdateBillService; @@ -132,7 +133,7 @@ public class MaterialUpdateBillApi extends BaseApi { @ApiOperation("批量变更") @PostMapping("batchImport") @Transactional(rollbackFor = Exception.class) - public ResultVO batchImport(@RequestParam(required = true, value = "file") MultipartFile file) throws IOException { + public ResultVO batchImport(@RequestParam(required = true, value = "file") MultipartFile file) throws IOException { try { return materialUpdateBillService.batchImport(file); } catch (Exception ex) { diff --git a/nflg_project_dev/material/src/main/java/com/nflg/product/material/pojo/vo/MaterialBatchImportVO.java b/nflg_project_dev/material/src/main/java/com/nflg/product/material/pojo/vo/MaterialBatchImportVO.java new file mode 100644 index 00000000..da77376f --- /dev/null +++ b/nflg_project_dev/material/src/main/java/com/nflg/product/material/pojo/vo/MaterialBatchImportVO.java @@ -0,0 +1,10 @@ +package com.nflg.product.material.pojo.vo; + +import lombok.Data; + +@Data +public class MaterialBatchImportVO { + + private Boolean inBatches; // 是否分批次 + +} diff --git a/nflg_project_dev/material/src/main/java/com/nflg/product/material/service/MaterialMainService.java b/nflg_project_dev/material/src/main/java/com/nflg/product/material/service/MaterialMainService.java index 3b6727f0..05057f9a 100644 --- a/nflg_project_dev/material/src/main/java/com/nflg/product/material/service/MaterialMainService.java +++ b/nflg_project_dev/material/src/main/java/com/nflg/product/material/service/MaterialMainService.java @@ -823,12 +823,12 @@ public class MaterialMainService extends ServiceImpl list) { + private void initFavoritesState(List list, String userCode) { if (list.size() <= 0) { return; } List materialRowIds = list.stream().map(MaterialMainVO::getRowId).collect(Collectors.toList()); - List favorityList = materialFavoritesService.lambdaQuery().eq(MaterialFavoritesEntity::getUserCode, SessionUtil.getUserCode()).in(MaterialFavoritesEntity::getMaterialRowId, materialRowIds).list(); + List favorityList = materialFavoritesService.lambdaQuery().eq(MaterialFavoritesEntity::getUserCode, userCode).in(MaterialFavoritesEntity::getMaterialRowId, materialRowIds).list(); Map favorityMap = ListCommonUtil.listToMap(favorityList, MaterialFavoritesEntity::getMaterialRowId); list.forEach(k -> { k.setFavoritesState(0); @@ -862,7 +862,7 @@ public class MaterialMainService extends ServiceImpl { List list = new ArrayList<>(); list.add(materialMainVO); - initFavoritesState(list); + initFavoritesState(list, userCode); //})); long Date20 = new Date().getTime(); @@ -1108,7 +1108,7 @@ public class MaterialMainService extends ServiceImpl 0) { throw new NflgBusinessException(STATE.ParamErr, materialMainVO.getMaterialNo().concat("物料已提交,不能重复提交")); diff --git a/nflg_project_dev/material/src/main/java/com/nflg/product/material/service/MaterialUpdateBillService.java b/nflg_project_dev/material/src/main/java/com/nflg/product/material/service/MaterialUpdateBillService.java index f2320700..425cfe3b 100644 --- a/nflg_project_dev/material/src/main/java/com/nflg/product/material/service/MaterialUpdateBillService.java +++ b/nflg_project_dev/material/src/main/java/com/nflg/product/material/service/MaterialUpdateBillService.java @@ -28,10 +28,7 @@ import com.nflg.product.material.pojo.dto.MaterialMainAttrDTO; import com.nflg.product.material.pojo.dto.MaterialUpdateBillDTO; import com.nflg.product.material.pojo.entity.*; import com.nflg.product.material.pojo.query.MaterialUpdateBillQuery; -import com.nflg.product.material.pojo.vo.MaterialHomeMainVO; -import com.nflg.product.material.pojo.vo.MaterialMainAttrValuesVO; -import com.nflg.product.material.pojo.vo.MaterialMainVO; -import com.nflg.product.material.pojo.vo.MaterialUpdateBillVO; +import com.nflg.product.material.pojo.vo.*; import com.nflg.product.material.util.EecExcelUtil; import lombok.extern.slf4j.Slf4j; import nflg.product.common.constant.STATE; @@ -40,6 +37,7 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.RequestBody; @@ -89,6 +87,11 @@ public class MaterialUpdateBillService extends ServiceImpl redisTemplate; + + private static final String PREFIX = "frontend:material"; + /** * 分页查询所有数据 * @@ -347,7 +350,7 @@ public class MaterialUpdateBillService extends ServiceImpl ents = new ArrayList<>(); for (MaterialStateUpExcelDTO data : excelContext) { MaterialMainEntity material = materialMainService.lambdaQuery().eq(MaterialMainEntity::getMaterialNo, data.getMaterialNo()).one(); - MaterialMainVO materialMainVO = materialMainService.selectByRowId(material.getRowId(), MaterialMainTypeEnum.ONE.getCode()); + MaterialMainVO materialMainVO = materialMainService.selectByRowId(material.getRowId(), MaterialMainTypeEnum.ONE.getCode(), SessionUtil.getUserCode()); MaterialUpdateBillEntity ent = new MaterialUpdateBillEntity(); ent.setMaterialNo(data.getMaterialNo()); ent.setOldMaterialState(material.getMaterialState()); @@ -364,13 +367,17 @@ public class MaterialUpdateBillService extends ServiceImpl batchImport(MultipartFile file) throws IOException { + public ResultVO batchImport(MultipartFile file) throws IOException { if (file != null && !file.getOriginalFilename().endsWith("xls") && !file.getOriginalFilename().endsWith("xlsx")) { return ResultVO.error("上传的文件非Excel文件"); } + Object cacheFileName = redisTemplate.boundValueOps(buildKey(SessionUtil.getUserCode() + ":updateBatchImport")).get(); + if (ObjectUtil.isNotEmpty(cacheFileName) && file.getOriginalFilename().equals(cacheFileName)) { + return ResultVO.error("当前Excel文件正在处理中,请勿重复导入"); + } int lastColIndex = ExcelReader.read(file.getInputStream()).sheet(0).getHeader().getLastColumnIndex(); @@ -392,43 +399,74 @@ public class MaterialUpdateBillService extends ServiceImpl excelContext = EecExcelUtil.getExcelContext(file.getInputStream(), MaterialStateUpExcelDTO.class); - if (CollectionUtil.isNotEmpty(excelContext) && excelContext.size() > 1000) { + if (CollectionUtil.isNotEmpty(excelContext) && excelContext.size() > 100) { + redisTemplate.opsForValue().set(buildKey(userCode + "1:updateBatchImport"), file.getOriginalFilename()); + redisTemplate.opsForValue().set(buildKey(userCode + "2:updateBatchImport"), file.getOriginalFilename()); + redisTemplate.opsForValue().set(buildKey(userCode + "3:updateBatchImport"), file.getOriginalFilename()); // 大数据量,子线程分批次提交OA(每批1000条),主线程提前返回结果给前端 - CompletableFuture task1 = CompletableFuture.runAsync(() -> { - List> lists = Lists.partition(excelContext, 1000); - lists.forEach(items -> this.handleImportDataForState(items, applyDeptName, deptEnt)); + CompletableFuture task1 = CompletableFuture.supplyAsync(() -> { + long startTime = System.currentTimeMillis(); + List> lists = Lists.partition(excelContext, 100); + lists.forEach(items -> this.handleImportDataForState(items, applyDeptName, deptEnt, realName, userCode)); + long endTime = System.currentTimeMillis(); + log.info("物料变更批量导入耗时(ms): {}", endTime - startTime); + redisTemplate.delete(buildKey(userCode + ":updateBatchImport")); + return 1; }); - task1.join(); + task1.exceptionally(ex -> { + // 异常处理器,打印异常信息并返回默认值 + log.error("物料变更批量导入异常: " + ex.getMessage()); + redisTemplate.delete(buildKey(userCode + ":updateBatchImport")); + return -1; + }); +// task1.join(); // 阻塞获取结果 + importVO.setInBatches(true); + return ResultVO.success(importVO); } else { - this.handleImportDataForState(excelContext, applyDeptName, deptEnt); + this.handleImportDataForState(excelContext, applyDeptName, deptEnt, realName, userCode); } } else { // 制作物料 List excelContext = EecExcelUtil.getExcelContext(file.getInputStream(), TwentyMaterialTemplateExcelDTO.class); if (CollectionUtil.isNotEmpty(excelContext) && excelContext.size() > 1000) { // 大数据量,子线程分批次提交OA(每批1000条),主线程提前返回结果给前端 - CompletableFuture task1 = CompletableFuture.runAsync(() -> { + CompletableFuture task1 = CompletableFuture.supplyAsync(() -> { + long startTime = System.currentTimeMillis(); List> lists = Lists.partition(excelContext, 1000); - lists.forEach(items -> this.handleImportDataForSummary(items, applyDeptName, deptEnt)); + lists.forEach(items -> this.handleImportDataForSummary(items, applyDeptName, deptEnt, realName, userCode)); + long endTime = System.currentTimeMillis(); + log.info("物料变更批量导入耗时(ms): {}", endTime - startTime); + return 1; }); - task1.join(); + task1.exceptionally(ex -> { + // 异常处理器,打印异常信息并返回默认值 + log.error("物料变更批量导入异常: " + ex.getMessage()); + return -1; + }); +// task1.join(); // 阻塞获取结果 + importVO.setInBatches(true); + return ResultVO.success(importVO); } else { - this.handleImportDataForSummary(excelContext, applyDeptName, deptEnt); + this.handleImportDataForSummary(excelContext, applyDeptName, deptEnt, realName, userCode); } } - return ResultVO.success(Boolean.TRUE); + return ResultVO.success(importVO); } /** * 状态变更 */ - private ResultVO handleImportDataForState(List excelContext, String applyDeptName, AuthorityDepartmentEntity deptEnt) { + private void handleImportDataForState(List excelContext, String applyDeptName, AuthorityDepartmentEntity deptEnt, String realName, String userCode) { List ents = new ArrayList<>(); excelContext = excelContext.stream().filter(u -> StrUtil.isNotBlank(u.getMaterialNo())).collect(Collectors.toList()); if (excelContext.size() <= 0) { - return ResultVO.error("导入内容不允许为空"); + throw new NflgBusinessException(STATE.ParamErr, "导入内容不允许为空"); } List upMaterialNos = excelContext.stream().map(MaterialStateUpExcelDTO::getMaterialNo).collect(Collectors.toList()); @@ -463,11 +501,11 @@ public class MaterialUpdateBillService extends ServiceImpl notFreezeSet = new HashSet<>(); for (MaterialStateUpExcelDTO data : excelContext) { MaterialMainEntity material = materialMainService.lambdaQuery().eq(MaterialMainEntity::getMaterialNo, data.getMaterialNo()).one(); - MaterialMainVO materialMainVO = materialMainService.selectByRowId(material.getRowId(), MaterialMainTypeEnum.ONE.getCode()); + MaterialMainVO materialMainVO = materialMainService.selectByRowId(material.getRowId(), MaterialMainTypeEnum.ONE.getCode(), userCode); String checkMaterialState = checkMaterialState(material); if (ObjectUtil.isNotEmpty(checkMaterialState)) { - return ResultVO.error(checkMaterialState); + throw new NflgBusinessException(STATE.ParamErr, checkMaterialState); } // 如果物料是状态变更,且变更状态为冻结或完全弃用,物料昨日库得值 大于 0时,不允许申请冻结 @@ -481,7 +519,7 @@ public class MaterialUpdateBillService extends ServiceImpl handleImportDataForSummary(List excelContext, String applyDeptName, AuthorityDepartmentEntity deptEnt) { + private void handleImportDataForSummary(List excelContext, String applyDeptName, AuthorityDepartmentEntity deptEnt, String realName, String userCode) { List ents = new ArrayList<>(); excelContext = excelContext.stream().filter(u -> StrUtil.isNotBlank(u.getMaterialNo())).collect(Collectors.toList()); if (excelContext.size() <= 0) { - return ResultVO.error("导入内容不允许为空"); + throw new NflgBusinessException(STATE.ParamErr, "导入内容不允许为空"); } List upMaterialNos = excelContext.stream().map(TwentyMaterialTemplateExcelDTO::getMaterialNo).collect(Collectors.toList()); @@ -602,7 +639,7 @@ public class MaterialUpdateBillService extends ServiceImpl checkMaterialDesc = checkMaterialDesc(ent); if (Objects.nonNull(checkMaterialDesc)) { log.info("【checkMaterialDesc校验结果】:" + checkMaterialDesc.getMsg()); - return ResultVO.error(checkMaterialDesc.getMsg()); + throw new NflgBusinessException(STATE.ParamErr, checkMaterialDesc.getMsg()); } } this.validateFreezeStateChangeOther(ents, deptEnt.getDptCode()); this.saveBatch(ents); //同步OA - materialUpdateToOAService.sysnToOa(ents); + materialUpdateToOAService.sysnToOa(ents, userCode); } // 申请部门是 营销中心,11,21变更,由冻结改成其他状态,不允许改成激活 @@ -885,7 +922,7 @@ public class MaterialUpdateBillService extends ServiceImpl rowIds) { List entityList = materialUpdateBillService.lambdaQuery().in(MaterialUpdateBillEntity::getRowId, rowIds).list(); - sysnToOa(entityList); + sysnToOa(entityList, SessionUtil.getUserCode()); } - public Map getHttpMap() { + public Map getHttpMap(String userCode) { Map result = new LinkedHashMap<>(); - result.put("userid", SessionUtil.getUserCode()); + result.put("userid", userCode); result.put("summary", NacosConfig.getNacosConfig().getSummary()); return result; } @@ -89,9 +89,9 @@ public class MaterialUpdateToOAService { * 同步OA变更状态 * @param data */ - public void sysncToOaOnleState(List data) { + public void sysncToOaOnleState(List data, String userCode) { - Map result = getHttpMap(); + Map result = getHttpMap(userCode); List> list = new ArrayList<>(); data.forEach(u -> { Map material = new LinkedHashMap<>(); @@ -133,14 +133,14 @@ public class MaterialUpdateToOAService { httpStateToOa(result, data); } - public void sysnToOa(List data) { + public void sysnToOa(List data, String userCode) { // 批量提交,校验是否有重复物料变更 Set materialNoSet = data.stream().map(MaterialUpdateBillEntity::getMaterialNo).collect(Collectors.toSet()); if (data.size() != materialNoSet.size()) { throw new NflgBusinessException(STATE.BusinessError, "批量提交的物料含重复项,请先删除重复项"); } - Map result = getHttpMap(); + Map result = getHttpMap(userCode); List> list = new ArrayList<>(); preHandleCategoryNameTree(data); data.forEach(u -> { diff --git a/nflg_project_dev/material/src/main/resources/bootstrap-dev.properties b/nflg_project_dev/material/src/main/resources/bootstrap-dev.properties index 74ba7641..aab9162f 100644 --- a/nflg_project_dev/material/src/main/resources/bootstrap-dev.properties +++ b/nflg_project_dev/material/src/main/resources/bootstrap-dev.properties @@ -1,4 +1,14 @@ #nacos.server-addr=114.132.64.230:8123 nacos.server-addr=192.168.0.194:8848 - +spring.cache.type=redis +spring.redis.database=1 +spring.redis.host=192.168.0.194 +spring.redis.password= +spring.redis.port=6379 +spring.redis.timeout=0 +spring.redis.ssl=false +spring.redis.lettuce.pool.max-wait=-1ms +spring.redis.lettuce.pool.max-active=8 +spring.redis.lettuce.pool.max-idle=8 +spring.redis.lettuce.pool.min-idle=0 diff --git a/nflg_project_dev/material/src/main/resources/bootstrap-prod.properties b/nflg_project_dev/material/src/main/resources/bootstrap-prod.properties index f648f2ca..1577d718 100644 --- a/nflg_project_dev/material/src/main/resources/bootstrap-prod.properties +++ b/nflg_project_dev/material/src/main/resources/bootstrap-prod.properties @@ -1 +1,12 @@ -nacos.server-addr=192.168.0.191:8848 \ No newline at end of file +nacos.server-addr=192.168.0.191:8848 +spring.cache.type=redis +spring.redis.database=0 +spring.redis.host=192.168.0.191 +spring.redis.password= +spring.redis.port=6379 +spring.redis.timeout=0 +spring.redis.ssl=false +spring.redis.lettuce.pool.max-wait=-1ms +spring.redis.lettuce.pool.max-active=8 +spring.redis.lettuce.pool.max-idle=8 +spring.redis.lettuce.pool.min-idle=0 diff --git a/nflg_project_dev/material/src/main/resources/bootstrap-sit.properties b/nflg_project_dev/material/src/main/resources/bootstrap-sit.properties index 74ba7641..aab9162f 100644 --- a/nflg_project_dev/material/src/main/resources/bootstrap-sit.properties +++ b/nflg_project_dev/material/src/main/resources/bootstrap-sit.properties @@ -1,4 +1,14 @@ #nacos.server-addr=114.132.64.230:8123 nacos.server-addr=192.168.0.194:8848 - +spring.cache.type=redis +spring.redis.database=1 +spring.redis.host=192.168.0.194 +spring.redis.password= +spring.redis.port=6379 +spring.redis.timeout=0 +spring.redis.ssl=false +spring.redis.lettuce.pool.max-wait=-1ms +spring.redis.lettuce.pool.max-active=8 +spring.redis.lettuce.pool.max-idle=8 +spring.redis.lettuce.pool.min-idle=0