From 891365236256428db3233df1499ef31b8e06c4ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E7=8E=89=E4=B8=9C?= <129883742+liyudong2018@users.noreply.github.com> Date: Mon, 11 Aug 2025 15:07:39 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E6=8C=87=E6=A0=87=E5=AD=90=E9=9B=86?= =?UTF-8?q?=E6=98=A0=E5=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../indicator/bean/IndicatorMapperBean.java | 19 +++ .../IndicatorBottomCsvMapperController.java | 18 -- .../controller/IndicatorController.java | 158 ++++++++++++------ .../controller/IndicatorCsvController.java | 18 -- .../mapper/IndicatorFormMapperMapper.java | 2 +- .../IndicatorBottomCsvMapperService.java | 17 +- .../IndicatorBottomFormMapperService.java | 15 ++ .../service/IndicatorCsvColumnService.java | 17 ++ .../service/IndicatorCsvService.java | 17 ++ .../service/IndicatorFromMapperService.java | 8 +- .../indicator/service/IndicatorService.java | 19 ++- .../IndicatorBottomCsvMapperServiceImpl.java | 16 +- .../IndicatorBottomMapperServiceImpl.java | 14 ++ .../impl/IndicatorCsvColumnServiceImpl.java | 27 +++ .../service/impl/IndicatorCsvServiceImpl.java | 21 ++- .../impl/IndicatorFormMapperServiceImpl.java | 14 +- .../service/impl/IndicatorServiceImpl.java | 74 +++++++- .../hshh/model/entity/FormFieldConfig.java | 10 +- .../mapper/IndicatorFormMapperMapper.xml | 6 +- .../main/resources/static/js/HttpClient.js | 72 ++++++-- .../src/main/resources/templates/home.html | 8 + .../templates/indicator/evaluation_list.html | 2 +- .../{mapper.html => indicator_mapper.html} | 123 ++++++++++++-- manager-system/pom.xml | 5 + pom.xml | 5 + 25 files changed, 548 insertions(+), 157 deletions(-) create mode 100644 manager-admin/src/main/java/com/hshh/indicator/bean/IndicatorMapperBean.java delete mode 100644 manager-admin/src/main/java/com/hshh/indicator/controller/IndicatorBottomCsvMapperController.java delete mode 100644 manager-admin/src/main/java/com/hshh/indicator/controller/IndicatorCsvController.java rename manager-admin/src/main/resources/templates/indicator/{mapper.html => indicator_mapper.html} (63%) diff --git a/manager-admin/src/main/java/com/hshh/indicator/bean/IndicatorMapperBean.java b/manager-admin/src/main/java/com/hshh/indicator/bean/IndicatorMapperBean.java new file mode 100644 index 0000000..5c0ca88 --- /dev/null +++ b/manager-admin/src/main/java/com/hshh/indicator/bean/IndicatorMapperBean.java @@ -0,0 +1,19 @@ +package com.hshh.indicator.bean; + +import com.hshh.indicator.entity.IndicatorBottomCsvMapper; +import com.hshh.indicator.entity.IndicatorBottomFormMapper; +import java.util.List; +import lombok.Data; + +/** + * 映射保存bean. + * + * @author LiDongYU + * @since 2025/7/22 + */ +@Data +public class IndicatorMapperBean { + private Integer indicatorTopId; + private List csvList; + private List formList; +} diff --git a/manager-admin/src/main/java/com/hshh/indicator/controller/IndicatorBottomCsvMapperController.java b/manager-admin/src/main/java/com/hshh/indicator/controller/IndicatorBottomCsvMapperController.java deleted file mode 100644 index 0c92323..0000000 --- a/manager-admin/src/main/java/com/hshh/indicator/controller/IndicatorBottomCsvMapperController.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.hshh.indicator.controller; - -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.stereotype.Controller; - -/** - *

- * 保存底部指标和csv列的映射关系 前端控制器 - *

- * - * @author liDongYu - * @since 2025-08-10 - */ -@Controller -@RequestMapping("/indicator/indicatorBottomCsvMapper") -public class IndicatorBottomCsvMapperController { - -} diff --git a/manager-admin/src/main/java/com/hshh/indicator/controller/IndicatorController.java b/manager-admin/src/main/java/com/hshh/indicator/controller/IndicatorController.java index 1a3c4ea..6d9b4ba 100644 --- a/manager-admin/src/main/java/com/hshh/indicator/controller/IndicatorController.java +++ b/manager-admin/src/main/java/com/hshh/indicator/controller/IndicatorController.java @@ -1,9 +1,11 @@ package com.hshh.indicator.controller; +import com.hshh.indicator.bean.IndicatorMapperBean; import com.hshh.indicator.entity.Indicator; import com.hshh.indicator.entity.IndicatorBottomCsvMapper; import com.hshh.indicator.entity.IndicatorBottomFormMapper; import com.hshh.indicator.entity.IndicatorCsv; +import com.hshh.indicator.entity.IndicatorCsvColumn; import com.hshh.indicator.entity.IndicatorFormMapper; import com.hshh.indicator.service.IndicatorBottomCsvMapperService; import com.hshh.indicator.service.IndicatorBottomFormMapperService; @@ -273,67 +275,76 @@ public class IndicatorController extends BaseController { } /** - * 导航到mapper页面. 1. 顶级指标放入session . 2. 底层指标放入session容器. 3. form表单字段放入session容器 . - * 4.form表单列表放入session容器 5. csv对应session容器 6. csv字段session容器 7. 底部指标对应form字段session容器 8. - * 底部指标对应csv列session容器. + * 导航到mapper页面. * * @param model session容器 - * @param formId 表单ID - * @param csvId csvID * @param indicatorTopId 指标顶级ID - * @return /indicator/mapper.html + * @return /indicator/indicator_mapper.html */ @GetMapping("/mapper") - public String mapper(Model model, final Integer indicatorTopId, final Integer formId, - final Integer csvId) { + public String mapper(Model model, final Integer indicatorTopId) { setNavigateTitle(model, "/indicator/mapper"); //设置导航 + //查询所有根指标 + List rootList = indicatorService.queryRootList(); - List rootList = indicatorService.queryRootList(); //查询所有根指标 - setChecked(rootList, indicatorTopId); //设置根指标的选中状态 - model.addAttribute("rootList", rootList); // 1. 顶级指标放入session容器 - model.addAttribute("childrenIndicator", - indicatorService.selectNoChildByTopId(indicatorTopId)); // 2. 底层指标放入session容器 - //处理form表单 - modelForm(model, indicatorTopId, formId); // 3. form表单字段放入session容器.4.form表单列表放入session容器 - //处理csv file - csvFile(model, indicatorTopId); // 5. csv对应session容器 6. csv字段session容器 + //设置根指标的选中状态 + setChecked(rootList, indicatorTopId, true); + + // 顶级指标放入session容器 + model.addAttribute("rootList", rootList); + // 底层指标放入session容器 + model.addAttribute("childrenIndicator", indicatorService.selectNoChildByTopId( + indicatorTopId == null ? (rootList.isEmpty() ? 0 : rootList.get(0).getId()) + : indicatorTopId)); + + // form表单和顶级指标对应列表放入session容器 + modelForm(model, (indicatorTopId == null ? (rootList.isEmpty() ? 0 : rootList.get(0).getId()) + : indicatorTopId)); + + // csv字段和顶级指标session容器 + csvFile(model, (indicatorTopId == null ? (rootList.isEmpty() ? 0 : rootList.get(0).getId()) + : indicatorTopId)); //放入底部指标和form表单字段对应关系到容器 List bottomList = bottomFormMapperService.queryListByIndicatorId( - indicatorTopId); - Map bottomFormMap = bottomList.stream() - .collect(Collectors.toMap(IndicatorBottomFormMapper::getFormFieldId, a -> a)); - model.addAttribute("bottomFormMap", bottomFormMap); // 7. 底部指标对应form字段session容器 + indicatorTopId == null ? (rootList.isEmpty() ? 0 : rootList.get(0).getId()) + : indicatorTopId); + Map bottomFormMap = bottomList.stream() + .filter(a -> a.getFormFieldId() != null) + .collect( + Collectors.toMap(IndicatorBottomFormMapper::getIndicatorId, + IndicatorBottomFormMapper::getFormFieldId)); + model.addAttribute("bottomFormMap", bottomFormMap); //放入底部指标和csv列对应关系到容器 List bottomCsvColumnList = bottomCsvMapperService.queryListByIndicatorTopId( - indicatorTopId); - Map bottomCsvColumnMap = bottomCsvColumnList.stream() - .collect(Collectors.toMap(IndicatorBottomCsvMapper::getCsvColumnId, a -> a)); - model.addAttribute("bottomCsvColumnMap", bottomCsvColumnMap); // 8.底部指标对应csv列session容器 + (indicatorTopId == null ? (rootList.isEmpty() ? 0 : rootList.get(0).getId()) + : indicatorTopId)); + Map bottomCsvColumnMap = bottomCsvColumnList.stream() + .filter(a -> a.getCsvColumnId() != null) + .collect( + Collectors.toMap(IndicatorBottomCsvMapper::getIndicatorId, + IndicatorBottomCsvMapper::getCsvColumnId)); + model.addAttribute("bottomCsvColumnMap", bottomCsvColumnMap); - return "/indicator/mapper"; + return "indicator/indicator_mapper"; } - private void modelForm(Model model, final Integer indicatorTopId, Integer formId) { + private void modelForm(Model model, final Integer indicatorTopId) { //表单相关 - List mapperList = indicatorTopMapperService.selectModelAndCsvNameByIndicator( + List mapperList = indicatorTopMapperService.selectModelIdByIndicator( indicatorTopId); //查看form和顶指标映射关系 + List modelList = modelDefineService.list(); //查询所有form表单列表 //查询form表单字段 - if (formId != null) { - - model.addAttribute("formFieldList", - formFieldConfigService.getFormFieldConfigByModelId(formId));//3.form表单字段放入session容器 - } else if (!mapperList.isEmpty()) { + if (!mapperList.isEmpty()) { List formFieldList = formFieldConfigService.getFormFieldConfigByModelId( mapperList.get(0).getIndicatorModelId()); + setChecked(modelList, mapperList.get(0).getIndicatorModelId(), false); //设置form表单列表的选中状态 model.addAttribute("formFieldList", formFieldList); //3.form表单字段放入session容器 } - List modelList = modelDefineService.list(); //查询所有form表单列表 - setChecked(modelList, mapperList.isEmpty() ? null - : (formId != null ? formId : mapperList.get(0).getIndicatorModelId())); //设置form表单列表的选中状态 + model.addAttribute("modelList", modelList); //4.所有form表单放入session容器 } @@ -375,32 +386,48 @@ public class IndicatorController extends BaseController { * * @param file 文件 * @param indicatorTopId 指标 - * @param formId modelID * @return 操作结果 */ - @PostMapping("/uploadCsvAndSetTopMapper") - public OperateResult uploadCsvAndSetTopMapper(@RequestParam("file") MultipartFile file, - Integer indicatorTopId, Integer formId) { - indicatorService.saveIndicatorTopCsvMapper(indicatorTopId, formId, file); - return OperateResult.success(); + @PostMapping("/uploadCsv") + @ResponseBody + public OperateResult> uploadCsv(@RequestParam("file") MultipartFile file, + Integer indicatorTopId) throws IOException { + List list = indicatorService.saveIndicatorTopCsvMapper(indicatorTopId, + file); + if (list == null) { + return OperateResult.error(null, "无法解析CSC文件或者表头为空", + ErrorCode.BUSINESS_ERROR.getCode()); + } + return OperateResult.success(list, ErrorMessage.SUCCESS.getMessage()); } /** * 保存指标和form表单ID的映射关系. * - * @param indicatorTopId 指标顶级ID - * @param formId 表单ID + * @param formMapper formMapper对象 * @return 操作结果 */ @PostMapping("/indicatorFormMapper") - public OperateResult saveIndicatorFormMapper(Integer indicatorTopId, Integer formId) { - indicatorTopMapperService.saveFormMapper(indicatorTopId, formId); - return OperateResult.success(); + @ResponseBody + public OperateResult> saveIndicatorFormMapper( + @RequestBody IndicatorFormMapper formMapper) { + indicatorTopMapperService.saveFormMapper(formMapper); + return OperateResult.success( + formFieldConfigService.getFormFieldConfigByModelId(formMapper.getIndicatorModelId()), + ErrorMessage.SUCCESS.getMessage()); } - private void setChecked(List list, Integer id) { + /** + * 设置元素默认选中状态. + * + * @param list 元素列表 + * @param id 匹配的ID + * @param flag 如果匹配ID为空,当为true时,设置第一个为选中; + * @param 泛型,集成checkedBean + */ + private void setChecked(List list, Integer id, boolean flag) { if (list != null && !list.isEmpty()) { - if (id == null || id.equals(0)) { + if ((id == null || id.equals(0)) && flag) { list.get(0).setChecked(true); return; } @@ -411,4 +438,37 @@ public class IndicatorController extends BaseController { } } } + + /** + * 保存映射关系. + * + * @param mapperBean 要保存的数据 + * @return 操作结果 + */ + @PostMapping("/saveMapper") + @ResponseBody + public OperateResult saveMapper(@RequestBody IndicatorMapperBean mapperBean) { + //检查是否form对应是否重复 + Map dupFormFieldCount = mapperBean.getFormList().stream() + .filter(x -> x.getFormFieldId() != null).collect(Collectors.collectingAndThen( + Collectors.groupingBy(IndicatorBottomFormMapper::getFormFieldId, Collectors.counting()), + m -> m.entrySet().stream().filter(e -> e.getValue() > 1) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)))); + if (!dupFormFieldCount.isEmpty()) { + return OperateResult.error(null, "表单映射有重复的对应关系", + ErrorCode.BUSINESS_ERROR.getCode()); + } + //检查csv对应是否重复 + Map dupCsvFieldCount = mapperBean.getCsvList().stream() + .filter(x -> x.getCsvColumnId() != null).collect(Collectors.collectingAndThen( + Collectors.groupingBy(IndicatorBottomCsvMapper::getCsvColumnId, Collectors.counting()), + m -> m.entrySet().stream().filter(e -> e.getValue() > 1) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)))); + if (!dupCsvFieldCount.isEmpty()) { + return OperateResult.error(null, "CSV映射有重复的对应关系", + ErrorCode.BUSINESS_ERROR.getCode()); + } + indicatorService.saveBottomMapper(mapperBean); + return OperateResult.success(); + } } diff --git a/manager-admin/src/main/java/com/hshh/indicator/controller/IndicatorCsvController.java b/manager-admin/src/main/java/com/hshh/indicator/controller/IndicatorCsvController.java deleted file mode 100644 index 48de144..0000000 --- a/manager-admin/src/main/java/com/hshh/indicator/controller/IndicatorCsvController.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.hshh.indicator.controller; - -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.stereotype.Controller; - -/** - *

- * 记录顶级指标和csv的对应关系 前端控制器 - *

- * - * @author liDongYu - * @since 2025-08-10 - */ -@Controller -@RequestMapping("/indicator/indicatorCsv") -public class IndicatorCsvController { - -} diff --git a/manager-admin/src/main/java/com/hshh/indicator/mapper/IndicatorFormMapperMapper.java b/manager-admin/src/main/java/com/hshh/indicator/mapper/IndicatorFormMapperMapper.java index dde389c..6f79f6c 100644 --- a/manager-admin/src/main/java/com/hshh/indicator/mapper/IndicatorFormMapperMapper.java +++ b/manager-admin/src/main/java/com/hshh/indicator/mapper/IndicatorFormMapperMapper.java @@ -18,5 +18,5 @@ public interface IndicatorFormMapperMapper extends BaseMapper selectModelAndCsvNameByIndicator(Integer id); + List selectModelIdByIndicator(Integer id); } diff --git a/manager-admin/src/main/java/com/hshh/indicator/service/IndicatorBottomCsvMapperService.java b/manager-admin/src/main/java/com/hshh/indicator/service/IndicatorBottomCsvMapperService.java index c8966d9..1299246 100644 --- a/manager-admin/src/main/java/com/hshh/indicator/service/IndicatorBottomCsvMapperService.java +++ b/manager-admin/src/main/java/com/hshh/indicator/service/IndicatorBottomCsvMapperService.java @@ -11,5 +11,20 @@ import java.util.List; * @since 2025-08-10 */ public interface IndicatorBottomCsvMapperService extends IService { - List queryListByIndicatorTopId(Integer indicatorTopId); + + List queryListByIndicatorTopId(Integer indicatorTopId); + + /** + * 保存指标和csv的对应关系. + * + * @param list 对应关系 + */ + void saveBottomCsvMapper(List list); + + /** + * 根据顶部指标删除对应关系. + * + * @param indicatorTopId 顶部指标ID + */ + void deleteByIndicatorTopId(Integer indicatorTopId); } diff --git a/manager-admin/src/main/java/com/hshh/indicator/service/IndicatorBottomFormMapperService.java b/manager-admin/src/main/java/com/hshh/indicator/service/IndicatorBottomFormMapperService.java index 1ef0ae1..16f9ef5 100644 --- a/manager-admin/src/main/java/com/hshh/indicator/service/IndicatorBottomFormMapperService.java +++ b/manager-admin/src/main/java/com/hshh/indicator/service/IndicatorBottomFormMapperService.java @@ -19,4 +19,19 @@ public interface IndicatorBottomFormMapperService extends IService queryListByIndicatorId(Integer topId); + + /** + * 删除顶部指标对应的映射. + * + * @param id 顶部指标ID + */ + void deleteByIndicatorId(Integer id); + + /** + * 保存映射关系. + * + * @param indicatorBottomFormMapperList 映射关系列表 + */ + void saveMapper(List indicatorBottomFormMapperList); + } diff --git a/manager-admin/src/main/java/com/hshh/indicator/service/IndicatorCsvColumnService.java b/manager-admin/src/main/java/com/hshh/indicator/service/IndicatorCsvColumnService.java index 6bf0532..fd6a812 100644 --- a/manager-admin/src/main/java/com/hshh/indicator/service/IndicatorCsvColumnService.java +++ b/manager-admin/src/main/java/com/hshh/indicator/service/IndicatorCsvColumnService.java @@ -19,4 +19,21 @@ public interface IndicatorCsvColumnService extends IService * @return csv文件列 */ List listByIdOrderByColumn(Integer id); + + /** + * 根据顶级指标ID删除列. + * + * @param id 顶级指标ID + */ + void deleteByTopId(Integer id); + + /** + * 保存csv列信息 + * + * @param headerList csv头 + * @param indicatorId 指标ID + * @param csvId csvID + * @return 保存的列表对象 + */ + List save(List headerList, Integer indicatorId, Integer csvId); } diff --git a/manager-admin/src/main/java/com/hshh/indicator/service/IndicatorCsvService.java b/manager-admin/src/main/java/com/hshh/indicator/service/IndicatorCsvService.java index 732b04b..b8c152f 100644 --- a/manager-admin/src/main/java/com/hshh/indicator/service/IndicatorCsvService.java +++ b/manager-admin/src/main/java/com/hshh/indicator/service/IndicatorCsvService.java @@ -18,4 +18,21 @@ public interface IndicatorCsvService extends IService { * @return 对应关系(除了csv实际数据) */ IndicatorCsv selectByIndicatorId(Integer topId); + + /** + * 保存csv文件信息. + * + * @param indicatorTopId 指标ID + * @param data 原始数据 + * @param csvName 文件名称 + * @return 主键 + */ + Integer saveCsv(Integer indicatorTopId, byte[] data, String csvName); + + /** + * 删除指定顶级topID对应的记录. + * + * @param indicatorTopId 指标topId + */ + void removeByIndicatorId(Integer indicatorTopId); } diff --git a/manager-admin/src/main/java/com/hshh/indicator/service/IndicatorFromMapperService.java b/manager-admin/src/main/java/com/hshh/indicator/service/IndicatorFromMapperService.java index 78368e2..8ac017e 100644 --- a/manager-admin/src/main/java/com/hshh/indicator/service/IndicatorFromMapperService.java +++ b/manager-admin/src/main/java/com/hshh/indicator/service/IndicatorFromMapperService.java @@ -20,15 +20,15 @@ public interface IndicatorFromMapperService extends IService selectModelAndCsvNameByIndicator(Integer id); + List selectModelIdByIndicator(Integer id); /** * 保存form和指标的映射关系. * - * @param topId 顶级指标ID - * @param formId form表单ID + + * @param mapper 数据 */ - void saveFormMapper(Integer topId, Integer formId); + void saveFormMapper(IndicatorFormMapper mapper); /** * 根据指标顶级ID删除对应关系. diff --git a/manager-admin/src/main/java/com/hshh/indicator/service/IndicatorService.java b/manager-admin/src/main/java/com/hshh/indicator/service/IndicatorService.java index 9a6535a..75bdd7d 100644 --- a/manager-admin/src/main/java/com/hshh/indicator/service/IndicatorService.java +++ b/manager-admin/src/main/java/com/hshh/indicator/service/IndicatorService.java @@ -1,7 +1,10 @@ package com.hshh.indicator.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.hshh.indicator.bean.IndicatorMapperBean; import com.hshh.indicator.entity.Indicator; +import com.hshh.indicator.entity.IndicatorCsvColumn; +import java.io.IOException; import java.util.List; import org.springframework.web.multipart.MultipartFile; @@ -58,9 +61,17 @@ public interface IndicatorService extends IService { /** * 保存顶级映射关系;记录对应的表单ID和csv信息. * - * @param topId 顶级指标ID - * @param modelId 表单ID - * @param file csv文件 + * @param topId 顶级指标ID + * @param file csv文件 + * @return 返回csv文件头 */ - void saveIndicatorTopCsvMapper(Integer topId, Integer modelId, MultipartFile file); + List saveIndicatorTopCsvMapper(Integer topId, MultipartFile file) + throws IOException; + + /** + * 保存映射关系. + * + * @param mapperBean 映射数据 + */ + void saveBottomMapper(IndicatorMapperBean mapperBean); } diff --git a/manager-admin/src/main/java/com/hshh/indicator/service/impl/IndicatorBottomCsvMapperServiceImpl.java b/manager-admin/src/main/java/com/hshh/indicator/service/impl/IndicatorBottomCsvMapperServiceImpl.java index 8e41f5e..ca73c3e 100644 --- a/manager-admin/src/main/java/com/hshh/indicator/service/impl/IndicatorBottomCsvMapperServiceImpl.java +++ b/manager-admin/src/main/java/com/hshh/indicator/service/impl/IndicatorBottomCsvMapperServiceImpl.java @@ -7,11 +7,10 @@ import com.hshh.indicator.mapper.IndicatorBottomCsvMapperMapper; import com.hshh.indicator.service.IndicatorBottomCsvMapperService; import java.util.List; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; /** - * 保存底部指标和csv列的映射关系 服务实现类. - * * @author liDongYu * @since 2025-08-10 @@ -27,4 +26,17 @@ public class IndicatorBottomCsvMapperServiceImpl extends queryWrapper.eq("indicator_top_id", indicatorTopId); return this.list(queryWrapper); } + + @Transactional(rollbackFor = Exception.class) + @Override + public void saveBottomCsvMapper(List list) { + list.forEach(this::save); + } + + @Override + public void deleteByIndicatorTopId(Integer indicatorTopId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("indicator_top_id", indicatorTopId); + remove(queryWrapper); + } } diff --git a/manager-admin/src/main/java/com/hshh/indicator/service/impl/IndicatorBottomMapperServiceImpl.java b/manager-admin/src/main/java/com/hshh/indicator/service/impl/IndicatorBottomMapperServiceImpl.java index 580205a..3a37aca 100644 --- a/manager-admin/src/main/java/com/hshh/indicator/service/impl/IndicatorBottomMapperServiceImpl.java +++ b/manager-admin/src/main/java/com/hshh/indicator/service/impl/IndicatorBottomMapperServiceImpl.java @@ -7,6 +7,7 @@ import com.hshh.indicator.mapper.IndicatorBottomMapperMapper; import com.hshh.indicator.service.IndicatorBottomFormMapperService; import java.util.List; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; /** *

@@ -27,4 +28,17 @@ public class IndicatorBottomMapperServiceImpl extends queryWrapper.eq("indicator_top_id", topId); return this.list(queryWrapper); } + + @Override + public void deleteByIndicatorId(Integer id) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("indicator_top_id", id); + remove(queryWrapper); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void saveMapper(List indicatorBottomFormMapperList) { + indicatorBottomFormMapperList.forEach(this::save); + } } diff --git a/manager-admin/src/main/java/com/hshh/indicator/service/impl/IndicatorCsvColumnServiceImpl.java b/manager-admin/src/main/java/com/hshh/indicator/service/impl/IndicatorCsvColumnServiceImpl.java index f58d632..62630ab 100644 --- a/manager-admin/src/main/java/com/hshh/indicator/service/impl/IndicatorCsvColumnServiceImpl.java +++ b/manager-admin/src/main/java/com/hshh/indicator/service/impl/IndicatorCsvColumnServiceImpl.java @@ -5,8 +5,10 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.hshh.indicator.entity.IndicatorCsvColumn; import com.hshh.indicator.mapper.IndicatorCsvColumnMapper; import com.hshh.indicator.service.IndicatorCsvColumnService; +import java.util.ArrayList; import java.util.List; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; /** * 指标对应的csv模板中的列,只保留最近一次的记录 服务实现类. @@ -26,4 +28,29 @@ public class IndicatorCsvColumnServiceImpl extends queryWrapper.orderByAsc("csv_column_num"); return this.list(queryWrapper); } + + @Override + public void deleteByTopId(Integer id) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("indicator_top_id", id); + remove(queryWrapper); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public List save(List headerList, Integer indicatorId, + Integer csvId) { + List list = new ArrayList<>(); + for (int i = 0; i < headerList.size(); i++) { + IndicatorCsvColumn indicatorCsvColumn = new IndicatorCsvColumn(); + indicatorCsvColumn.setCsvColumnName(headerList.get(i)); + indicatorCsvColumn.setCsvColumnNum(i + 1); + indicatorCsvColumn.setIndicatorCsvId(csvId); + indicatorCsvColumn.setIndicatorTopId(indicatorId); + list.add(indicatorCsvColumn); + + } + list.forEach(this::save); + return list; + } } diff --git a/manager-admin/src/main/java/com/hshh/indicator/service/impl/IndicatorCsvServiceImpl.java b/manager-admin/src/main/java/com/hshh/indicator/service/impl/IndicatorCsvServiceImpl.java index acb4abb..b618acf 100644 --- a/manager-admin/src/main/java/com/hshh/indicator/service/impl/IndicatorCsvServiceImpl.java +++ b/manager-admin/src/main/java/com/hshh/indicator/service/impl/IndicatorCsvServiceImpl.java @@ -9,9 +9,7 @@ import java.util.List; import org.springframework.stereotype.Service; /** - *

- * 记录顶级指标和csv的对应关系 服务实现类 - *

+ * 记录顶级指标和csv的对应关系 服务实现类. * * @author liDongYu * @since 2025-08-10 @@ -31,4 +29,21 @@ public class IndicatorCsvServiceImpl extends } return null; } + + @Override + public Integer saveCsv(Integer indicatorTopId, byte[] data, String csvName) { + IndicatorCsv indicatorCsv = new IndicatorCsv(); + indicatorCsv.setIndicatorTopId(indicatorTopId); + indicatorCsv.setCsvData(data); + indicatorCsv.setCsvName(csvName); + this.save(indicatorCsv); + return indicatorCsv.getId(); + } + + @Override + public void removeByIndicatorId(Integer indicatorTopId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("indicator_top_id", indicatorTopId); + remove(queryWrapper); + } } diff --git a/manager-admin/src/main/java/com/hshh/indicator/service/impl/IndicatorFormMapperServiceImpl.java b/manager-admin/src/main/java/com/hshh/indicator/service/impl/IndicatorFormMapperServiceImpl.java index 77baccf..6f83fb3 100644 --- a/manager-admin/src/main/java/com/hshh/indicator/service/impl/IndicatorFormMapperServiceImpl.java +++ b/manager-admin/src/main/java/com/hshh/indicator/service/impl/IndicatorFormMapperServiceImpl.java @@ -21,18 +21,16 @@ public class IndicatorFormMapperServiceImpl extends IndicatorFromMapperService { @Override - public List selectModelAndCsvNameByIndicator(Integer id) { - return this.baseMapper.selectModelAndCsvNameByIndicator(id); + public List selectModelIdByIndicator(Integer id) { + return this.baseMapper.selectModelIdByIndicator(id); } @Transactional(rollbackFor = Exception.class) @Override - public void saveFormMapper(Integer topId, Integer formId) { - deleteFormMapperByIndicatorId(formId); - IndicatorFormMapper formMapper = new IndicatorFormMapper(); - formMapper.setIndicatorTopId(topId); - formMapper.setIndicatorModelId(formId); - save(formMapper); + public void saveFormMapper(IndicatorFormMapper mapper) { + deleteFormMapperByIndicatorId(mapper.getIndicatorTopId()); + + save(mapper); } diff --git a/manager-admin/src/main/java/com/hshh/indicator/service/impl/IndicatorServiceImpl.java b/manager-admin/src/main/java/com/hshh/indicator/service/impl/IndicatorServiceImpl.java index e4cf4f4..0bd135b 100644 --- a/manager-admin/src/main/java/com/hshh/indicator/service/impl/IndicatorServiceImpl.java +++ b/manager-admin/src/main/java/com/hshh/indicator/service/impl/IndicatorServiceImpl.java @@ -2,13 +2,27 @@ package com.hshh.indicator.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.hshh.indicator.bean.IndicatorMapperBean; import com.hshh.indicator.entity.Indicator; +import com.hshh.indicator.entity.IndicatorCsvColumn; import com.hshh.indicator.mapper.IndicatorMapper; +import com.hshh.indicator.service.IndicatorBottomCsvMapperService; +import com.hshh.indicator.service.IndicatorBottomFormMapperService; +import com.hshh.indicator.service.IndicatorCsvColumnService; +import com.hshh.indicator.service.IndicatorCsvService; import com.hshh.indicator.service.IndicatorService; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import javax.annotation.Resource; import javax.validation.constraints.NotNull; +import org.apache.commons.csv.CSVFormat; +import org.apache.commons.csv.CSVParser; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; @@ -25,6 +39,20 @@ import org.springframework.web.multipart.MultipartFile; public class IndicatorServiceImpl extends ServiceImpl implements IndicatorService { + @Resource + private IndicatorCsvService csvService; + @Resource + private IndicatorCsvColumnService csvColumnService; + /** + * csv-指标对应关系服务类. + */ + @Resource + private IndicatorBottomCsvMapperService indicatorBottomCsvMapperService; + /** + * form表单-指标 映射关系. + */ + @Resource + private IndicatorBottomFormMapperService indicatorBottomFormMapperService; @Override public List queryList(@NotNull Integer topId, @NotNull String name, @@ -87,16 +115,44 @@ public class IndicatorServiceImpl extends ServiceImpl saveIndicatorTopCsvMapper(Integer topId, MultipartFile file) + throws IOException { + Reader reader = new InputStreamReader(file.getInputStream(), StandardCharsets.UTF_8); + CSVParser parser = CSVFormat.DEFAULT.builder().setHeader() // 表示第一行是表头 + .setSkipHeaderRecord(true) // 解析时跳过表头行 + .build().parse(reader); + ArrayList headerList = new ArrayList<>(parser.getHeaderMap().keySet()); + if (headerList.isEmpty()) { + return null; + } + //删除表中m_data_indicator_csv原来topID对应记录 + csvService.removeByIndicatorId(topId); + //添加m_data_indicator_csv记录 + Integer csvId = csvService.saveCsv(topId, file.getBytes(), file.getOriginalFilename()); + //删除m_data_indicator_csv_column 原topID对应的记录 + csvColumnService.deleteByTopId(topId); + //添加对应记录 + return csvColumnService.save(headerList, topId, csvId); + } - - //添加m_data_indicator_csv记录 - - //删除m_data_indicator_csv_column 原topID对应的记录 - - - //添加对应记录 + /** + * 保存底部指标映射关系. + * + * @param mapperBean 映射数据 + */ + @Transactional(rollbackFor = Exception.class) + @Override + public void saveBottomMapper(IndicatorMapperBean mapperBean) { + //保存csv映射关系 + if (!mapperBean.getCsvList().isEmpty()) { + indicatorBottomCsvMapperService.deleteByIndicatorTopId(mapperBean.getIndicatorTopId()); + indicatorBottomCsvMapperService.saveBottomCsvMapper(mapperBean.getCsvList()); + } + //保存form表单和指标映射关系 + if (!mapperBean.getFormList().isEmpty()) { + indicatorBottomFormMapperService.deleteByIndicatorId(mapperBean.getIndicatorTopId()); + indicatorBottomFormMapperService.saveMapper(mapperBean.getFormList()); + } } } diff --git a/manager-admin/src/main/java/com/hshh/model/entity/FormFieldConfig.java b/manager-admin/src/main/java/com/hshh/model/entity/FormFieldConfig.java index f4b4631..c5c0343 100644 --- a/manager-admin/src/main/java/com/hshh/model/entity/FormFieldConfig.java +++ b/manager-admin/src/main/java/com/hshh/model/entity/FormFieldConfig.java @@ -33,16 +33,16 @@ public class FormFieldConfig implements Serializable { private Integer dataModelId; @NotBlank(message = "字段名称不能为空") - @Size(max = 10, message = "字段名称不能超过10字符") - @Pattern(regexp = "^[A-Za-z]+$", message = "字段ID只能包含英文字符") + @Size(max = 50, message = "字段名称不能超过50字符") + @Pattern(regexp = "^[A-Za-z_]+$", message = "字段ID只能包含英文字符") private String fieldName; @NotBlank(message = "字段ID不能为空") - @Size(max = 10, message = "字段ID不能超过10字符") - @Pattern(regexp = "^[A-Za-z]+$", message = "字段ID只能包含英文字符") + @Size(max = 50, message = "字段ID不能超过50字符") + @Pattern(regexp = "^[A-Za-z_]+$", message = "字段ID只能包含英文字符") private String fieldId; @NotBlank(message = "字段标签不能为空") - @Size(max = 20, message = "字段标签不能超过20字符") + @Size(max = 50, message = "字段标签不能超过50字符") private String fieldLabel; private String fieldDefaultValue; diff --git a/manager-admin/src/main/resources/mapper/IndicatorFormMapperMapper.xml b/manager-admin/src/main/resources/mapper/IndicatorFormMapperMapper.xml index 5c76f80..6fb9bcd 100644 --- a/manager-admin/src/main/resources/mapper/IndicatorFormMapperMapper.xml +++ b/manager-admin/src/main/resources/mapper/IndicatorFormMapperMapper.xml @@ -1,8 +1,8 @@ - + select t.indicator_model_id + from m_data_indicator_form t where t.indicator_top_id=#{topId} diff --git a/manager-admin/src/main/resources/static/js/HttpClient.js b/manager-admin/src/main/resources/static/js/HttpClient.js index ebd546d..43e2399 100644 --- a/manager-admin/src/main/resources/static/js/HttpClient.js +++ b/manager-admin/src/main/resources/static/js/HttpClient.js @@ -1,6 +1,6 @@ class HttpClient { // GET 请求 - get(url, callback,formId) { + get(url, callback, formId) { const xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.onreadystatechange = function () { @@ -12,18 +12,16 @@ class HttpClient { if (contentType && contentType.indexOf('application/json') !== -1) { try { response = JSON.parse(response); - if(response.code === 0) { + if (response.code === 0) { callback(null, response, xhr); - }else{ - errorsHandler(response,formId); + } else { + errorsHandler(response, formId); } } catch (e) { // JSON 解析失败,仍返回原始文本 } - - - }else{ + } else { callback(null, response, xhr); } @@ -43,7 +41,7 @@ class HttpClient { * @param callback 回调函数 * @param formId formID */ - post(url, data, callback, formId,dialogId) { + post(url, data, callback, formId, dialogId) { const xhr = new XMLHttpRequest(); xhr.open('POST', url, true); xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8'); @@ -63,9 +61,15 @@ class HttpClient { if (response.code === 0) { callback(null, response, xhr); } else { - removeValidCss(formId); + if (formId) { + removeValidCss(formId); + } + //字段验证提示错误 - errorsHandler(response,formId,dialogId); + if (formId && dialogId) { + errorsHandler(response, formId, dialogId); + } + } } else { @@ -75,9 +79,45 @@ class HttpClient { }; xhr.send(JSON.stringify(data)); } + /** + * 提交 new formData数据 + * @param url + * @param data + * @param callback + * @param formId + * @param dialogId + */ + postFormData(url, data, callback, formId, dialogId) { + $.ajax({ + url: url, // 你的 Spring Boot 接口 + type: 'POST', + data: data, + processData: false, // 必须 + contentType: false, // 必须 + xhr: function () { // 进度(可选) + const xhr = $.ajaxSettings.xhr(); + xhr.upload.onprogress = e => { + if (e.lengthComputable) { + + } + }; + return xhr; + }, + success: function (res) { + if (res.code === 10001) { + errorsHandler(res, formId, dialogId); + } + if(res.code===0){ + callback(null, res, null); + } + }, + error: err => console.error('失败', err.responseText || err) + }); + } + } -function errorsHandler(response,formId,dialogId) { +function errorsHandler(response, formId, dialogId) { if (response.code === -1) {//输入字段提示 let errors = response.errors; @@ -95,10 +135,12 @@ function errorsHandler(response,formId,dialogId) { } //业务错误 if (response.code === 10001) { - closeDialog(dialogId); - - showAlert("danger",response.message) + if (dialogId) { + closeDialog(dialogId); + } + showAlert("danger", response.message) } -} \ No newline at end of file +} + diff --git a/manager-admin/src/main/resources/templates/home.html b/manager-admin/src/main/resources/templates/home.html index 316cdf9..3ddad23 100644 --- a/manager-admin/src/main/resources/templates/home.html +++ b/manager-admin/src/main/resources/templates/home.html @@ -193,6 +193,14 @@ hideContextMenu && hideContextMenu(); }); } + if(evt.detail.target.querySelector('[data-page="indicator_mapper"]')){ + + if(typeof csvListen === 'function'){ + + csvListen(); + } + + } } }); diff --git a/manager-admin/src/main/resources/templates/indicator/evaluation_list.html b/manager-admin/src/main/resources/templates/indicator/evaluation_list.html index 076edb4..0c27e69 100644 --- a/manager-admin/src/main/resources/templates/indicator/evaluation_list.html +++ b/manager-admin/src/main/resources/templates/indicator/evaluation_list.html @@ -9,7 +9,7 @@ white-space: nowrap; } -
+
diff --git a/manager-admin/src/main/resources/templates/indicator/mapper.html b/manager-admin/src/main/resources/templates/indicator/indicator_mapper.html similarity index 63% rename from manager-admin/src/main/resources/templates/indicator/mapper.html rename to manager-admin/src/main/resources/templates/indicator/indicator_mapper.html index 2d45f0c..9290a84 100644 --- a/manager-admin/src/main/resources/templates/indicator/mapper.html +++ b/manager-admin/src/main/resources/templates/indicator/indicator_mapper.html @@ -1,5 +1,5 @@ -
+ @@ -103,29 +109,29 @@ - + - + - + + th:text="${field.fieldLabel}" th:selected="${field.id == (bottomFormMap != null ? bottomFormMap[item.id] : '')}"> > - + + th:text="${column.getCsvColumnName()}" th:selected="${column.id == (bottomCsvColumnMap != null ? bottomCsvColumnMap[item.id] : '')}"> > @@ -239,8 +245,93 @@ diff --git a/manager-system/pom.xml b/manager-system/pom.xml index 593e56b..73dcfd3 100644 --- a/manager-system/pom.xml +++ b/manager-system/pom.xml @@ -67,6 +67,11 @@ org.apache.logging.log4j log4j-core + + org.apache.commons + commons-csv + 1.11.0 + diff --git a/pom.xml b/pom.xml index 92fa097..6286ce0 100644 --- a/pom.xml +++ b/pom.xml @@ -111,6 +111,11 @@ spring-boot-starter-validation 2.6.13 + + org.apache.commons + commons-csv + 1.11.0 +