Просмотр исходного кода

企业微信私有化部署测试

QuYueTing 3 недель назад
Родитель
Сommit
4784396966
24 измененных файлов с 1120 добавлено и 0 удалено
  1. 87 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ConstructionMainController.java
  2. 110 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ConstructionStageController.java
  3. 310 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectConstructionStageController.java
  4. 39 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportProjectConstructionController.java
  5. 42 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ConstructionMain.java
  6. 86 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ConstructionStage.java
  7. 57 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectConstructionStage.java
  8. 65 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ReportProjectConstruction.java
  9. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ConstructionMainMapper.java
  10. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ConstructionStageMapper.java
  11. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectConstructionStageMapper.java
  12. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ReportProjectConstructionMapper.java
  13. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ConstructionMainService.java
  14. 18 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ConstructionStageService.java
  15. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectConstructionStageService.java
  16. 18 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportProjectConstructionService.java
  17. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ConstructionMainServiceImpl.java
  18. 41 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ConstructionStageServiceImpl.java
  19. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectConstructionStageServiceImpl.java
  20. 34 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportProjectConstructionServiceImpl.java
  21. 17 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ConstructionMainMapper.xml
  22. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ConstructionStageMapper.xml
  23. 19 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectConstructionStageMapper.xml
  24. 21 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportProjectConstructionMapper.xml

+ 87 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ConstructionMainController.java

@@ -0,0 +1,87 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.management.platform.entity.ConstructionMain;
+import com.management.platform.entity.ConstructionStage;
+import com.management.platform.entity.Project;
+import com.management.platform.service.*;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2026-04-15
+ */
+@RestController
+@RequestMapping("/construction-main")
+public class ConstructionMainController {
+    @Resource
+    private ConstructionMainService constructionMainService;
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    private ReportService reportService;
+    @Resource
+    private ConstructionStageService constructionStageService;
+
+    @Value(value = "${upload.path}")
+    private String path;
+
+
+    @RequestMapping("/addOrUpdate")
+    public HttpRespMsg addOrUpdate(ConstructionMain constructionStage){
+        HttpRespMsg msg=new HttpRespMsg();
+        Integer count;
+        if(constructionStage.getId()==null){
+            count=constructionMainService.count(new LambdaQueryWrapper<ConstructionMain>().eq(ConstructionMain::getName,constructionStage.getName()));
+        }else {
+            count=constructionMainService.count(new LambdaQueryWrapper<ConstructionMain>().eq(ConstructionMain::getName,constructionStage.getName()).ne(ConstructionMain::getId,constructionStage.getId()));
+        }
+        if(count>0){
+            msg.setError("名称:"+constructionStage.getName()+"已存在");
+            return msg;
+        }
+        constructionMainService.saveOrUpdate(constructionStage);
+        return msg;
+    }
+
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id){
+        HttpRespMsg msg=new HttpRespMsg();
+        List<ConstructionStage> stages = constructionStageService.list(new LambdaQueryWrapper<ConstructionStage>().eq(ConstructionStage::getMainId, id));
+        if(stages.size()>0){
+            msg.setError("存在使用当前数据的施工分项工程,无法删除");
+            return msg;
+        }
+        if(!constructionMainService.removeById(id)){
+            msg.setError("删除失败");
+        }
+        return msg;
+    }
+
+    @RequestMapping("/list")
+    public HttpRespMsg list(String constructionType){
+        HttpRespMsg msg=new HttpRespMsg();
+        LambdaQueryWrapper<ConstructionMain> wrapper = new LambdaQueryWrapper<ConstructionMain>().orderByAsc(ConstructionMain::getId);
+        if (!StringUtils.isEmpty(constructionType)) {
+            wrapper.eq(ConstructionMain::getConstructionType,constructionType);
+        }
+        List<ConstructionMain> list = constructionMainService.list(wrapper);
+        msg.setData(list);
+        return msg;
+    }
+}
+

+ 110 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ConstructionStageController.java

@@ -0,0 +1,110 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.*;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.*;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2026-04-13
+ */
+@RestController
+@RequestMapping("/construction-stage")
+public class ConstructionStageController {
+    @Resource
+    private ConstructionStageService constructionStageService;
+    @Resource
+    private ConstructionMainService constructionMainService;
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    private ReportService reportService;
+    @Resource
+    private UserService userService;
+    @Resource
+    private ExcelExportService excelExportService;
+    @Resource
+    private WxCorpInfoService wxCorpInfoService;
+    @Resource
+    private CompanyDingdingService companyDingdingService;
+    @Resource
+    private ReportProjectConstructionService reportProjectConstructionService;
+
+    @Value(value = "${upload.path}")
+    private String path;
+
+
+    @RequestMapping("/addOrUpdate")
+    public HttpRespMsg addOrUpdate(ConstructionStage constructionStage){
+        HttpRespMsg msg=new HttpRespMsg();
+        Integer count;
+        if(constructionStage.getId()==null){
+            count=constructionStageService.count(new LambdaQueryWrapper<ConstructionStage>().eq(ConstructionStage::getName,constructionStage.getName()));
+        }else {
+            count=constructionStageService.count(new LambdaQueryWrapper<ConstructionStage>().eq(ConstructionStage::getName,constructionStage.getName()).ne(ConstructionStage::getId,constructionStage.getId()));
+        }
+        if(count>0){
+            msg.setError("名称:"+constructionStage.getName()+"已存在");
+            return msg;
+        }
+        constructionStageService.saveOrUpdate(constructionStage);
+        return msg;
+    }
+
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id){
+        HttpRespMsg msg=new HttpRespMsg();
+        Integer count = reportProjectConstructionService.count(new LambdaQueryWrapper<ReportProjectConstruction>().eq(ReportProjectConstruction::getConstructionStageId, id));
+        if(count>0){
+            msg.setError("存在使用当前数据的日报,无法删除");
+            return msg;
+        }
+        if(!constructionStageService.removeById(id)){
+            msg.setError("删除失败");
+        }
+        return msg;
+    }
+
+    @RequestMapping("/list")
+    public HttpRespMsg list(String constructionType,Integer constructionMainId){
+        HttpRespMsg msg=new HttpRespMsg();
+        LambdaQueryWrapper<ConstructionStage> wrapper = new LambdaQueryWrapper<ConstructionStage>().orderByAsc(ConstructionStage::getMainId).orderByAsc(ConstructionStage::getId);
+        if (constructionMainId != null) {
+            wrapper.eq(ConstructionStage::getMainId, constructionMainId);
+        }
+        if (constructionType != null) {
+            wrapper.eq(ConstructionStage::getConstructionType, constructionType);
+        }
+        List<ConstructionStage> list = constructionStageService.list(wrapper);
+        List<ConstructionMain> mainList = constructionMainService.list(new LambdaQueryWrapper<ConstructionMain>().orderByAsc(ConstructionMain::getId));
+        for (ConstructionStage stage : list) {
+            for (ConstructionMain main : mainList) {
+                if (stage.getMainId() != null && stage.getMainId().equals(main.getId())) {
+                    stage.setMainName(main.getName());
+                }
+            }
+        }
+        msg.setData(list);
+        return msg;
+    }
+
+
+}
+

+ 310 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectConstructionStageController.java

@@ -0,0 +1,310 @@
+package com.management.platform.controller;
+
+
+import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.ConstructionMain;
+import com.management.platform.entity.ConstructionStage;
+import com.management.platform.entity.ProjectConstructionStage;
+import com.management.platform.entity.ReportProjectConstruction;
+import com.management.platform.mapper.ProjectMapper;
+import com.management.platform.mapper.ReportProjectConstructionMapper;
+import com.management.platform.service.ConstructionMainService;
+import com.management.platform.service.ConstructionStageService;
+import com.management.platform.service.ProjectConstructionStageService;
+import com.management.platform.service.ReportProjectConstructionService;
+import com.management.platform.util.ExcelUtil;
+import com.management.platform.util.HttpRespMsg;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2026-04-19
+ */
+@RestController
+@RequestMapping("/project-construction-stage")
+public class ProjectConstructionStageController {
+    @Value("${upload.path}")
+    private String uploadPath;
+
+    @Resource
+    private ProjectConstructionStageService projectConstructionStageService;
+    @Resource
+    private ConstructionStageService constructionStageService;
+    @Resource
+    private ConstructionMainService constructionMainService;
+    @Autowired
+    private ReportProjectConstructionMapper reportProjectConstructionMapper;
+    @Resource
+    private ProjectMapper projectMapper;
+
+    @RequestMapping("/save")
+    public HttpRespMsg save(String json, Integer projectId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        List<ConstructionStage> constructionStages = JSONArray.parseArray(json, ConstructionStage.class);
+        List<ProjectConstructionStage> projectConstructionStageList = projectConstructionStageService.list(new QueryWrapper<ProjectConstructionStage>().eq("project_id", projectId));
+        List<Integer> removeIds = projectConstructionStageList.stream().map(ProjectConstructionStage::getId).collect(Collectors.toList());
+        List<ProjectConstructionStage> data = new ArrayList<>();
+        for (ConstructionStage constructionStage : constructionStages) {
+            ProjectConstructionStage stage = new ProjectConstructionStage();
+            stage.setProjectId(projectId);
+            stage.setStageId(constructionStage.getId());
+            stage.setPercent(constructionStage.getPercent());
+            stage.setDesignNumber(constructionStage.getDesignNumber());
+            ProjectConstructionStage oldItem = projectConstructionStageList.stream().filter(pro->pro.getStageId().equals(constructionStage.getId())).findFirst().orElse(null);
+            if (oldItem != null) {
+                removeIds.remove(oldItem.getId());
+                stage.setId(oldItem.getId());
+            }
+            data.add(stage);
+        }
+        if (removeIds.size() > 0) {
+            projectConstructionStageService.removeByIds(removeIds);
+        }
+        projectConstructionStageService.saveOrUpdateBatch(data);
+        return msg;
+    }
+
+    @RequestMapping("get")
+    public HttpRespMsg get(Integer projectId, String constructionType) {
+        HttpRespMsg msg = new HttpRespMsg();
+        if (constructionType == null) {
+            return msg;
+        }
+        //没有数据,返回基础的项目施工的节点数据
+        String[] types = constructionType.split(",");
+        List<ConstructionStage> stages = constructionStageService.list(new QueryWrapper<ConstructionStage>().in("construction_type", Arrays.asList(types)).orderByAsc("construction_type").orderByAsc("main_id"));
+        List<ConstructionMain> mainList = constructionMainService.list(new QueryWrapper<ConstructionMain>().in("construction_type", Arrays.asList(types)));
+        for (ConstructionStage stage : stages) {
+            stage.setDesignNumber(0.0);
+            ConstructionMain main = mainList.stream().filter(mainItem->mainItem.getId().equals(stage.getMainId())).findFirst().orElse(null);
+            if (main != null) {
+                stage.setMainName(main.getName());
+            }
+        }
+
+        List<ProjectConstructionStage> projectConstructionStages = (projectId == null || projectId == -1) ? new ArrayList<>() : projectConstructionStageService.list(new QueryWrapper<ProjectConstructionStage>().eq("project_id", projectId));
+        if (!projectConstructionStages.isEmpty()) {
+            stages.forEach(stage -> {
+                projectConstructionStages.stream().filter(p -> p.getStageId().equals(stage.getId())).findFirst().ifPresent(p -> {
+                    stage.setDesignNumber(p.getDesignNumber());
+                    stage.setPercent(p.getPercent());
+                });
+            });
+        }
+
+        msg.data = stages;
+        return msg;
+    }
+
+    @RequestMapping("getByProjectId")
+    public HttpRespMsg getByProjectId(Integer projectId, Integer reportId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        List<ProjectConstructionStage> projectConstructionStages = projectConstructionStageService.list(new QueryWrapper<ProjectConstructionStage>().eq("project_id", projectId));
+        List<Integer> stageIds = projectConstructionStages.stream().map(ProjectConstructionStage::getStageId).collect(Collectors.toList());
+
+        //没有数据,返回基础的项目施工的节点数据
+        List<ConstructionStage> stages = constructionStageService.list(new QueryWrapper<ConstructionStage>().in("id", stageIds).orderByAsc("construction_type").orderByAsc("main_id").orderByAsc("id"));
+        if (reportId != null) {
+            List<ReportProjectConstruction> rpcList = reportProjectConstructionMapper.selectList(new QueryWrapper<ReportProjectConstruction>().eq("report_id", reportId));
+            for (ConstructionStage stage : stages) {
+                rpcList.stream().filter(rpc->rpc.getConstructionStageId().equals(stage.getId())).findFirst().ifPresent(rpc->stage.setFinishNumber(rpc.getFinishNumber()));
+            }
+        }
+
+        msg.data = stages;
+        return msg;
+    }
+
+    @RequestMapping("export")
+    public HttpRespMsg export(Integer projectId, String constructionType) {
+        String pName = null;
+        if (projectId != null) {
+            pName = projectMapper.selectById(projectId).getProjectName();
+        }
+        HttpRespMsg msg = get(projectId, constructionType);
+        List<ConstructionStage> stages = (List<ConstructionStage>) msg.data;
+        List<List<String>> data = new ArrayList<>();
+        List<String> header = new ArrayList<>();
+        //id, 一级工程分类,施工分项,施工节点,占比,设计量
+        header.add("id");
+        header.add("一级工程分类");
+        header.add("施工分项");
+        header.add("施工节点");
+        header.add("占比(%)");
+        header.add("设计量");
+        header.add("单位");
+        data.add(header);
+        for (ConstructionStage stage : stages) {
+            List<String> list = new ArrayList<String>();
+            list.add(""+stage.getId());
+            list.add(stage.getConstructionType());
+            list.add(stage.getMainName());
+            list.add(stage.getName());
+            list.add(""+stage.getPercent());
+            list.add(""+stage.getDesignNumber());
+            list.add(stage.getUnit());
+            data.add(list);
+        }
+        HttpRespMsg retMsg = new HttpRespMsg();
+        String fileName = (pName == null?"":(pName+"-"))+"项目施工节点设置"+"_"+System.currentTimeMillis();
+
+        retMsg.data = ExcelUtil.exportGeneralExcelByTitleAndList(fileName, data, uploadPath);
+        return retMsg;
+    }
+
+    @RequestMapping("import")
+    public HttpRespMsg importData(Integer projectId, MultipartFile file) {
+        HttpRespMsg msg = new HttpRespMsg();
+        try {
+            if (file == null || file.isEmpty()) {
+                msg.setError("文件不能为空");
+                return msg;
+            }
+            if (projectId == null) {
+                msg.setError("项目ID不能为空");
+                return msg;
+            }
+            // 读取Excel文件
+            InputStream inputStream = file.getInputStream();
+            Workbook workbook = new XSSFWorkbook(inputStream);
+            Sheet sheet = workbook.getSheetAt(0);
+
+            // 解析Excel数据
+            List<ConstructionStage> constructionStages = new ArrayList<>();
+
+            // 从第二行开始读取数据(第一行是表头)
+            for (int i = 1; i <= sheet.getLastRowNum(); i++) {
+                Row row = sheet.getRow(i);
+                if (row == null) {
+                    continue;
+                }
+                try {
+                    // 读取各列数据
+                    Cell idCell = row.getCell(0);
+                    Cell percentCell = row.getCell(4);
+                    Cell designNumberCell = row.getCell(5);
+                    if (idCell == null) {
+                        continue;
+                    }
+
+                    ConstructionStage stage = new ConstructionStage();
+
+                    // 读取ID
+                    if (idCell.getCellTypeEnum() == CellType.NUMERIC) {
+                        stage.setId((int) idCell.getNumericCellValue());
+                    } else if (idCell.getCellTypeEnum() == CellType.STRING) {
+                        stage.setId(Integer.parseInt(idCell.getStringCellValue()));
+                    }
+
+                    // 读取占比
+                    if (percentCell != null) {
+                        if (percentCell.getCellTypeEnum() == CellType.NUMERIC) {
+                            stage.setPercent((double) percentCell.getNumericCellValue());
+                        } else if (percentCell.getCellTypeEnum() == CellType.STRING) {
+                            String value = percentCell.getStringCellValue();
+                            if (value != null && !value.trim().isEmpty()) {
+                                stage.setPercent(Double.parseDouble(value));
+                            } else {
+                                stage.setPercent(0.0);
+                            }
+                        } else {
+                            stage.setPercent(0.0);
+                        }
+                    } else {
+                        stage.setPercent(0.0);
+                    }
+
+                    // 读取设计量
+                    if (designNumberCell != null) {
+                        if (designNumberCell.getCellTypeEnum() == CellType.NUMERIC) {
+                            stage.setDesignNumber(designNumberCell.getNumericCellValue());
+                        } else if (designNumberCell.getCellTypeEnum() == CellType.STRING) {
+                            String value = designNumberCell.getStringCellValue();
+                            if (value != null && !value.trim().isEmpty()) {
+                                stage.setDesignNumber(Double.parseDouble(value));
+                            } else {
+                                stage.setDesignNumber(0.0);
+                            }
+                        } else {
+                            stage.setDesignNumber(0.0);
+                        }
+                    } else {
+                        stage.setDesignNumber(0.0);
+                    }
+
+                    constructionStages.add(stage);
+                } catch (Exception e) {
+                    // 跳过解析失败的行
+                    continue;
+                }
+            }
+
+            workbook.close();
+            inputStream.close();
+
+            if (constructionStages.isEmpty()) {
+                msg.setError("没有可导入的数据");
+                return msg;
+            }
+
+            // 使用与save接口相同的逻辑处理数据
+            List<ProjectConstructionStage> projectConstructionStageList = projectConstructionStageService.list(
+                new QueryWrapper<ProjectConstructionStage>().eq("project_id", projectId)
+            );
+            List<Integer> removeIds = projectConstructionStageList.stream()
+                .map(ProjectConstructionStage::getId)
+                .collect(Collectors.toList());
+            List<ProjectConstructionStage> data = new ArrayList<>();
+
+            for (ConstructionStage constructionStage : constructionStages) {
+                ProjectConstructionStage stage = new ProjectConstructionStage();
+                stage.setProjectId(projectId);
+                stage.setStageId(constructionStage.getId());
+                stage.setPercent(constructionStage.getPercent());
+                stage.setDesignNumber(constructionStage.getDesignNumber());
+
+                ProjectConstructionStage oldItem = projectConstructionStageList.stream()
+                    .filter(pro -> pro.getStageId().equals(constructionStage.getId()))
+                    .findFirst()
+                    .orElse(null);
+
+                if (oldItem != null) {
+                    removeIds.remove(oldItem.getId());
+                    stage.setId(oldItem.getId());
+                }
+                data.add(stage);
+            }
+
+            if (removeIds.size() > 0) {
+                projectConstructionStageService.removeByIds(removeIds);
+            }
+            projectConstructionStageService.saveOrUpdateBatch(data);
+
+            msg.msg = "导入成功,共导入 " + constructionStages.size() + " 条数据";
+        } catch (Exception e) {
+            msg.setError("导入失败:" + e.getMessage());
+            e.printStackTrace();
+        }
+        return msg;
+    }
+}
+

+ 39 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportProjectConstructionController.java

@@ -0,0 +1,39 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.ReportProjectConstruction;
+import com.management.platform.service.ReportProjectConstructionService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2026-04-19
+ */
+@RestController
+@RequestMapping("/report-project-construction")
+public class ReportProjectConstructionController {
+
+    @Resource
+    private ReportProjectConstructionService  reportProjectConstructionService;
+
+    @RequestMapping("/getProjectConstructionStageData")
+    public HttpRespMsg getProjectConstructionStageData(List<Integer> reportIds) {
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = reportProjectConstructionService.getProjectConstructionStageData(reportIds);
+        return msg;
+    }
+
+
+}
+

+ 42 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ConstructionMain.java

@@ -0,0 +1,42 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2026-04-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ConstructionMain extends Model<ConstructionMain> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("name")
+    private String name;
+
+    @TableField("construction_type")
+    private String constructionType;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 86 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ConstructionStage.java

@@ -0,0 +1,86 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2026-04-13
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ConstructionStage extends Model<ConstructionStage> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 分项工程名称
+     */
+    @TableField("name")
+    private String name;
+
+    /**
+     * 主分类
+     */
+    @TableField("construction_type")
+    private String constructionType;
+
+    /**
+     * 单位
+     */
+    @TableField("unit")
+    private String unit;
+
+    /**
+     * 权重
+     */
+    @TableField("percent")
+    private Double percent;
+
+    /**
+     * 父级类型id
+     */
+    @TableField("main_id")
+    private Integer mainId;
+
+    @TableField(exist = false)
+    private String mainName;
+
+    /**
+     * 总设计量
+     */
+    @TableField(exist = false)
+    private Double designNumber;
+
+    /**
+     * 总完成量
+     */
+    @TableField(exist = false)
+    private Double finishNumber;
+
+    /**
+     * 完成率
+     */
+    @TableField(exist = false)
+    private long finishRate;
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 57 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectConstructionStage.java

@@ -0,0 +1,57 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2026-04-19
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ProjectConstructionStage extends Model<ProjectConstructionStage> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("project_id")
+    private Integer projectId;
+
+    @TableField("stage_id")
+    private Integer stageId;
+
+    /**
+     * 设计量
+     */
+    @TableField("design_number")
+    private Double designNumber;
+
+    /**
+     * 占比
+     */
+    @TableField("percent")
+    private Double percent;
+
+    @TableField(exist = false)
+    private Double finishNumber;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 65 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ReportProjectConstruction.java

@@ -0,0 +1,65 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import java.time.LocalDate;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2026-04-19
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ReportProjectConstruction extends Model<ReportProjectConstruction> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("report_id")
+    private Integer reportId;
+
+    @TableField("project_id")
+    private Integer projectId;
+
+    @TableField("construction_stage_id")
+    private Integer constructionStageId;
+
+    /**
+     * 完成率
+     */
+    @TableField("finish_number")
+    private Double finishNumber;
+
+    /**
+     * 员工
+     */
+    @TableField("user_id")
+    private String userId;
+
+    /**
+     * 日报日期
+     */
+    @TableField("work_date")
+    private LocalDate workDate;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ConstructionMainMapper.java

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.ConstructionMain;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2026-04-15
+ */
+public interface ConstructionMainMapper extends BaseMapper<ConstructionMain> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ConstructionStageMapper.java

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.ConstructionStage;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2026-04-13
+ */
+public interface ConstructionStageMapper extends BaseMapper<ConstructionStage> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectConstructionStageMapper.java

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.ProjectConstructionStage;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2026-04-19
+ */
+public interface ProjectConstructionStageMapper extends BaseMapper<ProjectConstructionStage> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ReportProjectConstructionMapper.java

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.ReportProjectConstruction;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2026-04-19
+ */
+public interface ReportProjectConstructionMapper extends BaseMapper<ReportProjectConstruction> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ConstructionMainService.java

@@ -0,0 +1,16 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.ConstructionMain;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2026-04-15
+ */
+public interface ConstructionMainService extends IService<ConstructionMain> {
+
+}

+ 18 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ConstructionStageService.java

@@ -0,0 +1,18 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.ConstructionStage;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2026-04-13
+ */
+public interface ConstructionStageService extends IService<ConstructionStage> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectConstructionStageService.java

@@ -0,0 +1,16 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.ProjectConstructionStage;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2026-04-19
+ */
+public interface ProjectConstructionStageService extends IService<ProjectConstructionStage> {
+
+}

+ 18 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportProjectConstructionService.java

@@ -0,0 +1,18 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.ReportProjectConstruction;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2026-04-19
+ */
+public interface ReportProjectConstructionService extends IService<ReportProjectConstruction> {
+    List<ReportProjectConstruction> getProjectConstructionStageData(List<Integer> reportIds);
+}

+ 20 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ConstructionMainServiceImpl.java

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.ConstructionMain;
+import com.management.platform.mapper.ConstructionMainMapper;
+import com.management.platform.service.ConstructionMainService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2026-04-15
+ */
+@Service
+public class ConstructionMainServiceImpl extends ServiceImpl<ConstructionMainMapper, ConstructionMain> implements ConstructionMainService {
+
+}

+ 41 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ConstructionStageServiceImpl.java

@@ -0,0 +1,41 @@
+package com.management.platform.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.*;
+import com.management.platform.mapper.ConstructionMainMapper;
+import com.management.platform.mapper.ConstructionStageMapper;
+import com.management.platform.mapper.ProjectMapper;
+import com.management.platform.mapper.ReportMapper;
+import com.management.platform.service.ConstructionStageService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.service.ProjectConstructionStageService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2026-04-13
+ */
+@Service
+public class ConstructionStageServiceImpl extends ServiceImpl<ConstructionStageMapper, ConstructionStage> implements ConstructionStageService {
+
+    @Resource
+    private ConstructionStageMapper constructionStageMapper;
+    @Resource
+    private ReportMapper reportMapper;
+    @Autowired
+    private ProjectMapper projectMapper;
+    @Autowired
+    private ConstructionMainMapper constructionMainMapper;
+    @Autowired
+    private ProjectConstructionStageService projectConstructionStageService;
+}

+ 20 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectConstructionStageServiceImpl.java

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.ProjectConstructionStage;
+import com.management.platform.mapper.ProjectConstructionStageMapper;
+import com.management.platform.service.ProjectConstructionStageService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2026-04-19
+ */
+@Service
+public class ProjectConstructionStageServiceImpl extends ServiceImpl<ProjectConstructionStageMapper, ProjectConstructionStage> implements ProjectConstructionStageService {
+
+}

+ 34 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportProjectConstructionServiceImpl.java

@@ -0,0 +1,34 @@
+package com.management.platform.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.ReportProjectConstruction;
+import com.management.platform.mapper.ReportProjectConstructionMapper;
+import com.management.platform.service.ReportProjectConstructionService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2026-04-19
+ */
+@Service
+public class ReportProjectConstructionServiceImpl extends ServiceImpl<ReportProjectConstructionMapper, ReportProjectConstruction> implements ReportProjectConstructionService {
+
+    @Resource
+    private ReportProjectConstructionMapper reportProjectConstructionMapper;
+    @Override
+    public List<ReportProjectConstruction> getProjectConstructionStageData(List<Integer> reportIds) {
+        if (reportIds.size() > 0) {
+            return reportProjectConstructionMapper.selectList(new QueryWrapper<ReportProjectConstruction>().in("report_id", reportIds));
+        }
+        return Collections.emptyList();
+    }
+}

+ 17 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ConstructionMainMapper.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.management.platform.mapper.ConstructionMainMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.ConstructionMain">
+        <id column="id" property="id" />
+        <result column="name" property="name" />
+        <result column="construction_type" property="constructionType" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, name, construction_type
+    </sql>
+
+</mapper>

+ 20 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ConstructionStageMapper.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.management.platform.mapper.ConstructionStageMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.ConstructionStage">
+        <id column="id" property="id" />
+        <result column="name" property="name" />
+        <result column="construction_type" property="constructionType" />
+        <result column="unit" property="unit" />
+        <result column="percent" property="percent" />
+        <result column="main_id" property="mainId" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, name, construction_type, unit, percent, main_id
+    </sql>
+
+</mapper>

+ 19 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectConstructionStageMapper.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.management.platform.mapper.ProjectConstructionStageMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.ProjectConstructionStage">
+        <id column="id" property="id" />
+        <result column="project_id" property="projectId" />
+        <result column="stage_id" property="stageId" />
+        <result column="design_number" property="designNumber" />
+        <result column="percent" property="percent" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, project_id, stage_id, design_number, percent
+    </sql>
+
+</mapper>

+ 21 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportProjectConstructionMapper.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.management.platform.mapper.ReportProjectConstructionMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.ReportProjectConstruction">
+        <id column="id" property="id" />
+        <result column="report_id" property="reportId" />
+        <result column="project_id" property="projectId" />
+        <result column="construction_stage_id" property="constructionStageId" />
+        <result column="finish_number" property="finishNumber" />
+        <result column="user_id" property="userId" />
+        <result column="work_date" property="workDate" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, report_id, project_id, construction_stage_id, finish_number, user_id, work_date
+    </sql>
+
+</mapper>