package com.ruoyi.basic.service.impl; import cn.hutool.json.JSONUtil; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; 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.ruoyi.common.utils.QueryWrappers; import com.ruoyi.basic.mapper.StandardMethodMapper; import com.ruoyi.basic.mapper.StandardProductListMapper; import com.ruoyi.basic.mapper.StructureItemParameterMapper; import com.ruoyi.basic.pojo.StandardMethod; import com.ruoyi.basic.pojo.StandardProductList; import com.ruoyi.basic.pojo.StructureItemParameter; import com.ruoyi.basic.service.StandardMethodService; import com.ruoyi.basic.service.StandardProductListService; import com.ruoyi.basic.service.StructureItemParameterService; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.*; import java.util.concurrent.CompletableFuture; /** * @author Administrator * @description 针对表【standard_method(标准方法)】的数据库操作Service实现 * @createDate 2024-03-03 19:21:41 */ @Service @AllArgsConstructor public class StandardMethodServiceImpl extends ServiceImpl implements StandardMethodService { private StandardMethodMapper standardMethodMapper; StandardProductListMapper standardProductListMapper; StandardProductListService standardProductListService; StructureItemParameterMapper structureItemParameterMapper; StructureItemParameterService structureItemParameterService; @Override public IPage selectStandardMethodList(Page page, StandardMethod standardMethod) { return standardMethodMapper.selectStandardMethodList(page, QueryWrappers.queryWrappers(standardMethod)); } @Override public List selectStandardMethods() { return standardMethodMapper.selectList(Wrappers.lambdaQuery().select(StandardMethod::getId, StandardMethod::getCode, StandardMethod::getName).ne(StandardMethod::getId, 0)); } @Override public int addStandardMethod(StandardMethod standardMethod) { int insert = standardMethodMapper.insert(standardMethod); return insert; } @Override public int delStandardMethod(Integer id) { int i = standardMethodMapper.deleteById(id); return i; } @Override public int upStandardMethod(StandardMethod standardMethod) { StandardMethod oldStandardMethod = standardMethodMapper.selectById(standardMethod.getId()); if (!oldStandardMethod.getCode().equals(standardMethod.getCode())) { CompletableFuture.supplyAsync(() -> replaceMethod(oldStandardMethod.getCode(), standardMethod.getCode())); } int i = standardMethodMapper.updateById(standardMethod); return i; } //编辑method后全部替换 public String replaceMethod(String oldCode, String code) { //查询StandardProductList中所有Method如果包含之前的则替换 List standardProductLists = standardProductListMapper.selectList(null); for (StandardProductList standardProductList : standardProductLists) { if (standardProductList.getMethod().contains(oldCode)) { String[] split = standardProductList.getMethod().split(","); String a = null; for (int i = 0; i < split.length; i++) { String methodName = split[i].substring(1, split[i].length() - 1); if (i == 0) { methodName = split[i].substring(2, split[i].length() - 1); } else if (i == split.length - 1) { methodName = split[i].substring(1, split[i].length() - 2); } if (methodName.equals(oldCode)) { methodName = code; } a += "\"" + methodName + "\","; } String method = "[\"" + a.substring(0, a.length() - 1) + "\"]"; standardProductList.setMethod(method); } } standardProductListService.updateBatchById(standardProductLists); //查询StructureItemParameter中所有Method如果包含之前的则替换 List structureItemParameters = structureItemParameterMapper.selectList(null); for (StructureItemParameter structureItemParameter : structureItemParameters) { if (structureItemParameter.getMethod().contains(oldCode)) { String[] split = structureItemParameter.getMethod().split(","); String a = null; for (int i = 0; i < split.length; i++) { String methodName = split[i].substring(1, split[i].length() - 1); if (i == 0) { methodName = split[i].substring(2, split[i].length() - 1); } else if (i == split.length - 1) { methodName = split[i].substring(1, split[i].length() - 2); } if (methodName.equals(oldCode)) { methodName = code; } a += "\"" + methodName + "\","; } String method = "[\"" + a.substring(0, a.length() - 1) + "\"]"; structureItemParameter.setMethod(method); } } structureItemParameterService.updateBatchById(structureItemParameters); return "替换完毕!"; } @Transactional(rollbackFor = Exception.class) @Override public void inputExcel(MultipartFile file) throws IOException { // 存储检测对象List Set structureTestObjectIdSet = new HashSet<>(); List result = new ArrayList<>(); EasyExcel.read(file.getInputStream(), StandardMethod.class, new AnalysisEventListener() { @Override public void invoke(StandardMethod data, AnalysisContext context) { // 去除第一行表头,EasyExcel 自动处理表头,这里无需额外处理 // 存储唯一检测对象 String structureTestObjectId = data.getStructureTestObjectId(); Object idObj = getFirstIdFromJson(structureTestObjectId); if (idObj != null) { structureTestObjectIdSet.add(idObj); } result.add(data); } @Override public void doAfterAllAnalysed(AnalysisContext context) { // 解析完成后执行添加操作 addStructureTest(new ArrayList<>(structureTestObjectIdSet), result); } }).sheet().doRead(); } private Object getFirstIdFromJson(String json) { // 简单解析 JSON 数组获取第一个元素 if (json != null && json.startsWith("[") && json.contains(",")) { return json.substring(2, json.indexOf(",")); } else if (json != null && json.startsWith("[")) { return json.substring(1, json.length() - 1); } return null; } public void addStructureTest(List structureTestObjectIdList, List standardMethodList) { // 用于存储新增、更新和删除的数据 List updateList = new ArrayList<>(); List deleteListId = new ArrayList<>(); List addList = new ArrayList<>(); // 先将 Excel 数据按 code 分组,并合并 field Map excelDataMap = new HashMap<>(); for (StandardMethod excelMethod : standardMethodList) { String key = generateKey(excelMethod); if (excelDataMap.containsKey(key)) { // 如果已存在相同的 code,则合并 field StandardMethod existingMethod = excelDataMap.get(key); String mergedField = mergeFields(existingMethod.getField(), excelMethod.getField()); existingMethod.setField(mergedField); } else { // 否则直接添加到 map 中 excelDataMap.put(key, excelMethod); } } // 查询数据库中的分组数据 List allDbMethods = new ArrayList<>(); for (Object j : structureTestObjectIdList) { List standardMethods = baseMapper.selectList( new LambdaQueryWrapper() .apply("JSON_CONTAINS(structure_test_object_id, {0})", j) // MySQL JSON 查询 ); allDbMethods.addAll(standardMethods); } // 将数据库数据按 code 分组,并合并 field Map dbDataMap = new HashMap<>(); for (StandardMethod dbMethod : allDbMethods) { String key = generateKey(dbMethod); if (dbDataMap.containsKey(key)) { // 如果已存在相同的 code,则合并 field StandardMethod existingMethod = dbDataMap.get(key); String mergedField = mergeFields(existingMethod.getField(), dbMethod.getField()); existingMethod.setField(mergedField); } else { // 否则直接添加到 map 中 dbDataMap.put(key, dbMethod); } } // 处理更新和新增 for (Map.Entry entry : excelDataMap.entrySet()) { String key = entry.getKey(); StandardMethod excelMethod = entry.getValue(); StandardMethod dbMethod = dbDataMap.get(key); if (dbMethod != null) { // 更新 excelMethod.setId(dbMethod.getId()); updateList.add(excelMethod); } else { // 新增 addList.add(excelMethod); } } // 处理删除 for (Map.Entry entry : dbDataMap.entrySet()) { String key = entry.getKey(); if (!excelDataMap.containsKey(key)) { StandardMethod dbMethod = entry.getValue(); deleteListId.add(dbMethod.getId()); } } // 执行批量操作 if (!addList.isEmpty()) { // 新增 baseMapper.insertBatchSomeColumn(addList); } if (!deleteListId.isEmpty()) { // 删除 baseMapper.deleteBatchIds(deleteListId); } if (!updateList.isEmpty()) { // 更新 updateList.forEach(i -> { baseMapper.updateById(i); }); } } private String mergeFields(String field1, String field2) { if (field1 == null || field1.isEmpty()) { return field2; } if (field2 == null || field2.isEmpty()) { return field1; } // 使用 Set 去重 String[] fields1 = field1.split(","); String[] fields2 = field2.split(","); Set uniqueFields = new HashSet<>(Arrays.asList(fields1)); uniqueFields.addAll(Arrays.asList(fields2)); // 返回逗号拼接的结果 return String.join(",", uniqueFields); } private String generateKey(StandardMethod method) { return method.getCode(); } // 格式化数据 public StandardMethod formatData(List list) { StandardMethod standardMethod = new StandardMethod(); standardMethod.setField(list.get(1).toString()); // 造格式 List> structureTestObjectId = new ArrayList<>(); if (ObjectUtils.isEmpty(list.get(3))) { structureTestObjectId.add(Arrays.asList(list.get(2))); } else { structureTestObjectId.add(Arrays.asList(list.get(2), list.get(3))); } standardMethod.setStructureTestObjectId(JSONUtil.toJsonStr(structureTestObjectId)); standardMethod.setCode(list.get(4).toString()); standardMethod.setName(list.get(5).toString()); standardMethod.setNameEn(list.get(6).toString()); if (!Objects.equals(list.get(7), null)) { standardMethod.setRemark(list.get(7).toString()); } standardMethod.setQualificationId(list.get(8).toString()); if (ObjectUtils.isNotEmpty(list.get(9))) { if (list.get(9).equals("是")) { standardMethod.setIsProduct(1); } else if (list.get(9).equals("否")) { standardMethod.setIsProduct(0); } } if (ObjectUtils.isNotEmpty(list.get(10))) { if (list.get(10).equals("是")) { standardMethod.setIsUse(1); } else if (list.get(9).equals("否")) { standardMethod.setIsUse(0); } } return standardMethod; } }