From 7972909aa68c6721132205a667f990bbcfe61250 Mon Sep 17 00:00:00 2001 From: 10001392 <1055202292@qq.com> Date: Fri, 13 Sep 2024 10:34:57 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E3=80=90=E7=89=A9=E6=96=99=E5=8F=98?= =?UTF-8?q?=E6=9B=B4=E3=80=91=E6=89=B9=E9=87=8F=E5=AF=BC=E5=85=A5=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MaterialUpdateImportTaskMapper.java | 7 ++ .../MaterialUpdateImportTaskEntity.java | 88 +++++++++++++++++++ .../service/MaterialUpdateBillService.java | 60 ++++++++++++- .../master/MaterialUpdateImportTaskMapper.xml | 4 + 4 files changed, 158 insertions(+), 1 deletion(-) create mode 100644 nflg_project_dev/material/src/main/java/com/nflg/product/material/mapper/master/MaterialUpdateImportTaskMapper.java create mode 100644 nflg_project_dev/material/src/main/java/com/nflg/product/material/pojo/entity/MaterialUpdateImportTaskEntity.java create mode 100644 nflg_project_dev/material/src/main/resources/mapper/master/MaterialUpdateImportTaskMapper.xml diff --git a/nflg_project_dev/material/src/main/java/com/nflg/product/material/mapper/master/MaterialUpdateImportTaskMapper.java b/nflg_project_dev/material/src/main/java/com/nflg/product/material/mapper/master/MaterialUpdateImportTaskMapper.java new file mode 100644 index 00000000..22ec07fa --- /dev/null +++ b/nflg_project_dev/material/src/main/java/com/nflg/product/material/mapper/master/MaterialUpdateImportTaskMapper.java @@ -0,0 +1,7 @@ +package com.nflg.product.material.mapper.master; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.nflg.product.material.pojo.entity.MaterialUpdateImportTaskEntity; + +public interface MaterialUpdateImportTaskMapper extends BaseMapper { +} diff --git a/nflg_project_dev/material/src/main/java/com/nflg/product/material/pojo/entity/MaterialUpdateImportTaskEntity.java b/nflg_project_dev/material/src/main/java/com/nflg/product/material/pojo/entity/MaterialUpdateImportTaskEntity.java new file mode 100644 index 00000000..ecb5e4cc --- /dev/null +++ b/nflg_project_dev/material/src/main/java/com/nflg/product/material/pojo/entity/MaterialUpdateImportTaskEntity.java @@ -0,0 +1,88 @@ +package com.nflg.product.material.pojo.entity; + + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 物料变更批量导入任务表 + */ + +@Data +@Accessors(chain = true) +@ApiModel(value = "com-nflg-product-material-pojo-entity-MaterialUpdateImportTaskEntity") +@TableName(value = "t_material_update_import_task") +public class MaterialUpdateImportTaskEntity implements Serializable { + + /** + * 行id + */ + @TableId(value = "row_id", type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "行id") + private Long rowId; + + /** + * 文件名称 + */ + @TableField(value = "file_name") + @ApiModelProperty(value = "文件名称") + private String fileName; + + /** + * 总条数 + */ + @TableField(value = "total_num") + @ApiModelProperty(value = "总条数") + private Integer totalNum; + + /** + * 成功条数 + */ + @TableField(value = "success_num") + @ApiModelProperty(value = "成功条数") + private Integer successNum; + + /** + * 失败条数 + */ + @TableField(value = "fail_num") + @ApiModelProperty(value = "失败条数") + private Integer failNum; + + /** + * 失败原因 + */ + @TableField(value = "fail_reason") + @ApiModelProperty(value = "失败原因") + private String failReason; + + /** + * 任务状态:0进行中 1已完成 + */ + @TableField(value = "task_status") + @ApiModelProperty(value = "任务状态:0进行中 1已完成") + private Integer taskStatus; + + /** + * 创建人 + */ + @TableField(value = "created_by", fill = FieldFill.INSERT) + @ApiModelProperty(value = "创建人") + private String createdBy; + + /** + * 创建时间 + */ + @TableField(value = "created_time", fill = FieldFill.INSERT) + @ApiModelProperty(value = "创建时间") + private LocalDateTime createdTime; + + private static final long serialVersionUID = 1L; + +} 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 32798d53..78cfb290 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 @@ -21,6 +21,7 @@ import com.nflg.product.base.core.exception.NflgBusinessException; import com.nflg.product.base.core.vo.PageVO; import com.nflg.product.material.constant.*; import com.nflg.product.material.mapper.master.MaterialUpdateBillMapper; +import com.nflg.product.material.mapper.master.MaterialUpdateImportTaskMapper; import com.nflg.product.material.pojo.dto.ExcelDTO.MaterialStateUpExcelDTO; import com.nflg.product.material.pojo.dto.ExcelDTO.TwentyMaterialTemplateExcelDTO; import com.nflg.product.material.pojo.dto.MaterialMainAddAttrParamDTO; @@ -48,9 +49,12 @@ import org.ttzero.excel.reader.ExcelReader; import javax.annotation.Resource; import java.io.IOException; import java.time.LocalDate; +import java.time.LocalDateTime; import java.time.ZoneId; import java.util.*; import java.util.concurrent.CompletableFuture; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; /** @@ -89,6 +93,8 @@ public class MaterialUpdateBillService extends ServiceImpl redisTemplate; + @Resource + private MaterialUpdateImportTaskMapper materialUpdateImportTaskMapper; private static final String PREFIX = "frontend:material"; @@ -410,11 +416,21 @@ public class MaterialUpdateBillService extends ServiceImpl indexMaterialMap = new HashMap<>(excelContext.size()); + for (int i = 0; i < excelContext.size(); i++) { + indexMaterialMap.put(i + 1, excelContext.get(i).getMaterialNo()); + } + Long rowId = IdWorker.getId(); // 大数据量,子线程分批次提交OA(每批1000条),主线程提前返回结果给前端 CompletableFuture task1 = CompletableFuture.supplyAsync(() -> { long startTime = System.currentTimeMillis(); + insertMaterialUpdateImportTask(rowId, excelContext.size(), file.getOriginalFilename(), userCode); List> lists = Lists.partition(excelContext, 1000); - lists.forEach(items -> this.handleImportDataForState(items, applyDeptName, deptEnt, realName, userCode)); + for (int i = 0; i < lists.size(); i++) { + List items = lists.get(i); + this.handleImportDataForState(items, applyDeptName, deptEnt, realName, userCode); + } + updateMaterialUpdateImportTask(rowId, excelContext.size(), excelContext.size(), 0, ""); long endTime = System.currentTimeMillis(); log.info("物料变更批量导入耗时(ms): {}", endTime - startTime); redisTemplate.delete(buildKey(userCode + ":updateBatchImport")); @@ -423,6 +439,8 @@ public class MaterialUpdateBillService extends ServiceImpl { // 异常处理器,打印异常信息并返回默认值 log.error("物料变更批量导入异常: " + ex.getMessage()); + String errMaterialNo = getErrMaterialNo(ex.getMessage()); + updateMaterialUpdateImportTask(rowId, excelContext.size(), excelContext.size(), 0, ""); redisTemplate.delete(buildKey(userCode + ":updateBatchImport")); return -1; }); @@ -466,6 +484,46 @@ public class MaterialUpdateBillService extends ServiceImpl 0) { + desc += StrUtil.format(",第{}条后因为“{}”而终止", successNum, exceptionMsg); + } + update.setFailReason(desc); + update.setTaskStatus(1); + materialUpdateImportTaskMapper.updateById(update); + } + + + // 从报错信息找到第一个物料号 + private String getErrMaterialNo(String exceptionMsg) { + if (StrUtil.isEmpty(exceptionMsg)) { + return ""; + } + Pattern pattern = Pattern.compile("\\d{10}"); + Matcher matcher = pattern.matcher(exceptionMsg); + if (matcher.find()) { + return matcher.group(); + } + return ""; + } + /** * 状态变更 */ diff --git a/nflg_project_dev/material/src/main/resources/mapper/master/MaterialUpdateImportTaskMapper.xml b/nflg_project_dev/material/src/main/resources/mapper/master/MaterialUpdateImportTaskMapper.xml new file mode 100644 index 00000000..996b323a --- /dev/null +++ b/nflg_project_dev/material/src/main/resources/mapper/master/MaterialUpdateImportTaskMapper.xml @@ -0,0 +1,4 @@ + + + + From 7888566477f1b95f90af0e5a900c23a3b8bc02cd Mon Sep 17 00:00:00 2001 From: 10001392 <1055202292@qq.com> Date: Fri, 13 Sep 2024 16:39:33 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E3=80=90=E7=89=A9=E6=96=99=E5=8F=98?= =?UTF-8?q?=E6=9B=B4=E3=80=91=E6=89=B9=E9=87=8F=E5=AF=BC=E5=85=A5=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/material/MaterialUpdateBillApi.java | 9 ++- .../MaterialUpdateImportTaskMapper.java | 4 ++ .../MaterialUpdateImportTaskEntity.java | 2 +- .../service/MaterialUpdateBillService.java | 60 ++++++++++++++----- .../master/MaterialUpdateImportTaskMapper.xml | 9 +++ 5 files changed, 67 insertions(+), 17 deletions(-) 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 69c391a8..244adbae 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 @@ -4,9 +4,10 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.nflg.product.base.core.api.BaseApi; import com.nflg.product.base.core.exception.NflgBusinessException; import com.nflg.product.material.pojo.dto.MaterialStateUpExcelDTO; -import com.nflg.product.material.pojo.dto.TwentyMaterialTemplateExcelDTO; import com.nflg.product.material.pojo.dto.MaterialUpdateBillDTO; +import com.nflg.product.material.pojo.dto.TwentyMaterialTemplateExcelDTO; import com.nflg.product.material.pojo.entity.MaterialUpdateBillEntity; +import com.nflg.product.material.pojo.entity.MaterialUpdateImportTaskEntity; import com.nflg.product.material.pojo.query.MaterialUpdateBillQuery; import com.nflg.product.material.pojo.vo.MaterialBatchImportVO; import com.nflg.product.material.pojo.vo.MaterialMainVO; @@ -191,4 +192,10 @@ public class MaterialUpdateBillApi extends BaseApi { public void doCalcRecommend() { materialUpdateToOAService.doFreezeState(); } + + @GetMapping("getMaterialUpdateImportTaskList") + @ApiOperation("获取物料变更批量导入任务表") + public ResultVO> getMaterialUpdateImportTaskList() { + return ResultVO.success(materialUpdateBillService.getMaterialUpdateImportTaskList()); + } } diff --git a/nflg_project_dev/material/src/main/java/com/nflg/product/material/mapper/master/MaterialUpdateImportTaskMapper.java b/nflg_project_dev/material/src/main/java/com/nflg/product/material/mapper/master/MaterialUpdateImportTaskMapper.java index 22ec07fa..35f6b42d 100644 --- a/nflg_project_dev/material/src/main/java/com/nflg/product/material/mapper/master/MaterialUpdateImportTaskMapper.java +++ b/nflg_project_dev/material/src/main/java/com/nflg/product/material/mapper/master/MaterialUpdateImportTaskMapper.java @@ -2,6 +2,10 @@ package com.nflg.product.material.mapper.master; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.nflg.product.material.pojo.entity.MaterialUpdateImportTaskEntity; +import org.apache.ibatis.annotations.Param; + +import java.util.List; public interface MaterialUpdateImportTaskMapper extends BaseMapper { + List getMaterialUpdateImportTaskList(@Param("userCode") String userCode); } diff --git a/nflg_project_dev/material/src/main/java/com/nflg/product/material/pojo/entity/MaterialUpdateImportTaskEntity.java b/nflg_project_dev/material/src/main/java/com/nflg/product/material/pojo/entity/MaterialUpdateImportTaskEntity.java index ecb5e4cc..5714d07e 100644 --- a/nflg_project_dev/material/src/main/java/com/nflg/product/material/pojo/entity/MaterialUpdateImportTaskEntity.java +++ b/nflg_project_dev/material/src/main/java/com/nflg/product/material/pojo/entity/MaterialUpdateImportTaskEntity.java @@ -66,7 +66,7 @@ public class MaterialUpdateImportTaskEntity implements Serializable { * 任务状态:0进行中 1已完成 */ @TableField(value = "task_status") - @ApiModelProperty(value = "任务状态:0进行中 1已完成") + @ApiModelProperty(value = "任务状态:0进行中 1已完成 2已中止") private Integer taskStatus; /** 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 78cfb290..744e7703 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 @@ -409,27 +409,25 @@ 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() > batchSize) { if (excelContext.size() > 10000) { return ResultVO.error("导入失败,最多支持10000条批量导入"); } redisTemplate.opsForValue().set(buildKey(userCode + ":updateBatchImport"), file.getOriginalFilename()); - Map indexMaterialMap = new HashMap<>(excelContext.size()); + Map indexMaterialMap = new HashMap<>(excelContext.size()); for (int i = 0; i < excelContext.size(); i++) { - indexMaterialMap.put(i + 1, excelContext.get(i).getMaterialNo()); + indexMaterialMap.put(excelContext.get(i).getMaterialNo(), i + 1); } Long rowId = IdWorker.getId(); // 大数据量,子线程分批次提交OA(每批1000条),主线程提前返回结果给前端 CompletableFuture task1 = CompletableFuture.supplyAsync(() -> { long startTime = System.currentTimeMillis(); insertMaterialUpdateImportTask(rowId, excelContext.size(), file.getOriginalFilename(), userCode); - List> lists = Lists.partition(excelContext, 1000); - for (int i = 0; i < lists.size(); i++) { - List items = lists.get(i); - this.handleImportDataForState(items, applyDeptName, deptEnt, realName, userCode); - } + List> lists = Lists.partition(excelContext, batchSize); + lists.forEach(items -> this.handleImportDataForState(items, applyDeptName, deptEnt, realName, userCode)); updateMaterialUpdateImportTask(rowId, excelContext.size(), excelContext.size(), 0, ""); long endTime = System.currentTimeMillis(); log.info("物料变更批量导入耗时(ms): {}", endTime - startTime); @@ -440,7 +438,14 @@ public class MaterialUpdateBillService extends ServiceImpl excelContext = EecExcelUtil.getExcelContext(file.getInputStream(), TwentyMaterialTemplateExcelDTO.class); - if (CollectionUtil.isNotEmpty(excelContext) && excelContext.size() > 1000) { + if (CollectionUtil.isNotEmpty(excelContext) && excelContext.size() > batchSize) { if (excelContext.size() > 10000) { return ResultVO.error("导入失败,最多支持10000条批量导入"); } redisTemplate.opsForValue().set(buildKey(userCode + ":updateBatchImport"), file.getOriginalFilename()); + Map indexMaterialMap = new HashMap<>(excelContext.size()); + for (int i = 0; i < excelContext.size(); i++) { + indexMaterialMap.put(excelContext.get(i).getMaterialNo(), i + 1); + } + Long rowId = IdWorker.getId(); // 大数据量,子线程分批次提交OA(每批1000条),主线程提前返回结果给前端 CompletableFuture task1 = CompletableFuture.supplyAsync(() -> { long startTime = System.currentTimeMillis(); - List> lists = Lists.partition(excelContext, 1000); + insertMaterialUpdateImportTask(rowId, excelContext.size(), file.getOriginalFilename(), userCode); + List> lists = Lists.partition(excelContext, batchSize); lists.forEach(items -> this.handleImportDataForSummary(items, applyDeptName, deptEnt, realName, userCode)); + updateMaterialUpdateImportTask(rowId, excelContext.size(), excelContext.size(), 0, ""); long endTime = System.currentTimeMillis(); log.info("物料变更批量导入耗时(ms): {}", endTime - startTime); redisTemplate.delete(buildKey(userCode + ":updateBatchImport")); @@ -471,6 +483,15 @@ public class MaterialUpdateBillService extends ServiceImpl { // 异常处理器,打印异常信息并返回默认值 log.error("物料变更批量导入异常: " + ex.getMessage()); + String errMaterialNo = getErrMaterialNo(ex.getMessage()); + int successNum = 0; + int failNum = excelContext.size(); + if (StrUtil.isNotEmpty(errMaterialNo)) { + Integer idx = indexMaterialMap.get(errMaterialNo); + successNum = idx / batchSize; + failNum = excelContext.size() - (idx / batchSize); + } + updateMaterialUpdateImportTask(rowId, excelContext.size(), successNum, failNum, ex.getMessage()); redisTemplate.delete(buildKey(userCode + ":updateBatchImport")); return -1; }); @@ -489,6 +510,8 @@ public class MaterialUpdateBillService extends ServiceImpl 0) { - desc += StrUtil.format(",第{}条后因为“{}”而终止", successNum, exceptionMsg); + desc += StrUtil.format(",第{}条起因为“{}”而中止", successNum + 1, exceptionMsg); + update.setTaskStatus(2); // 已中止 + } else { + update.setTaskStatus(1); // 已完成 } update.setFailReason(desc); - update.setTaskStatus(1); materialUpdateImportTaskMapper.updateById(update); } @@ -1172,4 +1198,8 @@ public class MaterialUpdateBillService extends ServiceImpl getMaterialUpdateImportTaskList() { + return materialUpdateImportTaskMapper.getMaterialUpdateImportTaskList(SessionUtil.getUserCode()); + } } diff --git a/nflg_project_dev/material/src/main/resources/mapper/master/MaterialUpdateImportTaskMapper.xml b/nflg_project_dev/material/src/main/resources/mapper/master/MaterialUpdateImportTaskMapper.xml index 996b323a..5feb00ff 100644 --- a/nflg_project_dev/material/src/main/resources/mapper/master/MaterialUpdateImportTaskMapper.xml +++ b/nflg_project_dev/material/src/main/resources/mapper/master/MaterialUpdateImportTaskMapper.xml @@ -1,4 +1,13 @@ + +