From 9ad44e727e6e5a0572ba545abc56f6b4ccc99697 Mon Sep 17 00:00:00 2001 From: dfdg <2710245601@qq.com> Date: Sat, 20 Sep 2025 20:13:38 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E7=BA=A7=E5=A4=A7=E5=B1=8F?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E3=80=81=E4=BA=BA=E5=91=98=E4=BB=BB=E5=91=BD?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E5=AF=BC=E5=87=BA=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EnterpriseBigScreenController.java | 79 +++--- .../ProjectBigScreenController.java | 145 ++++++---- .../domain/vo/EnterpriseKeyIndexVo.java | 9 + .../mapper/ProjectBigScreenMapper.java | 74 +++--- .../impl/EnterpriseBigScreenServiceImpl.java | 2 + .../design/controller/DesUserController.java | 192 ++++++++++++++ .../design/domain/DesUserExcelData.java | 30 +++ .../design/service/IDesUserService.java | 3 + .../service/impl/DesUserServiceImpl.java | 251 ++++++++++++++++++ .../impl/DesVolumeCatalogServiceImpl.java | 4 +- .../dromara/project/domain/BusProject.java | 5 + .../dto/project/BusProjectCreateReq.java | 5 + .../domain/vo/project/BusProjectVo.java | 7 + .../project/mapper/BusProjectMapper.java | 5 + .../project/service/IBusProjectService.java | 19 ++ .../service/impl/BusProjectServiceImpl.java | 67 +++++ .../dromara/system/mapper/SysUserMapper.java | 11 +- .../system/service/ISysDictDataService.java | 2 +- .../system/service/ISysUserService.java | 2 + .../service/impl/SysDictDataServiceImpl.java | 4 +- .../service/impl/SysUserServiceImpl.java | 5 + .../mapper/project/BusProjectMapper.xml | 9 + .../resources/mapper/system/SysUserMapper.xml | 12 + 23 files changed, 802 insertions(+), 140 deletions(-) create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/domain/DesUserExcelData.java diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/EnterpriseBigScreenController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/EnterpriseBigScreenController.java index 9b3d1753..2b7da484 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/EnterpriseBigScreenController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/EnterpriseBigScreenController.java @@ -1,6 +1,7 @@ package org.dromara.bigscreen.controller; import cn.dev33.satoken.annotation.SaCheckPermission; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import jakarta.annotation.Resource; import org.dromara.bigscreen.domain.dto.WeatherQueryReq; import org.dromara.bigscreen.domain.vo.*; @@ -10,6 +11,7 @@ import org.dromara.common.core.domain.R; import org.dromara.common.core.utils.DateUtils; import org.dromara.common.utils.BigDecimalUtil; import org.dromara.manager.weathermanager.vo.WeatherVo; +import org.dromara.project.domain.BusAttendance; import org.dromara.project.domain.BusProject; import org.dromara.project.domain.BusUserProjectRelevancy; import org.dromara.project.service.IBusAttendanceService; @@ -27,9 +29,10 @@ import java.math.RoundingMode; import java.text.DecimalFormat; import java.time.LocalDate; import java.time.temporal.ChronoUnit; -import java.util.List; +import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; /** * 企业级大屏 @@ -138,19 +141,19 @@ public class EnterpriseBigScreenController { .map(BusUserProjectRelevancy::getUserId) .distinct().count()); -// peopleCountVo.setManagersCount(list.stream().filter(item -> "2".equals(item.getUserType())) -// .map(BusUserProjectRelevancy::getUserId) -// .distinct().count()); - peopleCountVo.setManagersCount(69L); + peopleCountVo.setManagersCount(list.stream().filter(item -> "2".equals(item.getUserType())) + .map(BusUserProjectRelevancy::getUserId) + .distinct().count()); +// peopleCountVo.setManagersCount(69L); -// peopleCountVo.setSubcontractorsCount(list.stream().filter(item -> "3".equals(item.getUserType())) -// .map(BusUserProjectRelevancy::getUserId) -// .distinct().count()); + peopleCountVo.setSubcontractorsCount(list.stream().filter(item -> "3".equals(item.getUserType())) + .map(BusUserProjectRelevancy::getUserId) + .distinct().count()); - peopleCountVo.setManagersCount(9L); +// peopleCountVo.setManagersCount(9L); - Integer projectUserCount = projectBigScreenMapper.getUserCount(); - peopleCountVo.setConstructionPersonnelCount(Long.valueOf(projectUserCount)); +// Integer projectUserCount = projectBigScreenMapper.getUserCount(); +// peopleCountVo.setConstructionPersonnelCount(Long.valueOf(projectUserCount)); return R.ok(peopleCountVo); } @@ -162,15 +165,14 @@ public class EnterpriseBigScreenController { @GetMapping("/allAttendanceCount") public R getAllAttendanceCount() { TodayAttendanceCountVo todayAttendanceCountVo = new TodayAttendanceCountVo(); - List projectList = projectService.listByIds(List.of(1897160897167638529L, 1897161054676336641L)); - Integer countUser = 0; - Integer countAttendance = 0; - for (BusProject project : projectList) { - Long projectId = project.getGoId(); - countUser = countUser + projectBigScreenMapper.getProjectUserCount(projectId); - countAttendance = countAttendance + projectBigScreenMapper.getAttendanceCount(projectId, DateUtils.getDate()); - } -/* +// List projectList = projectService.listByIds(List.of(1897160897167638529L, 1897161054676336641L)); +// Integer countUser = 0; +// Integer countAttendance = 0; +// for (BusProject project : projectList) { +// Long projectId = project.getGoId(); +// countUser = countUser + projectBigScreenMapper.getProjectUserCount(projectId); +// countAttendance = countAttendance + projectBigScreenMapper.getAttendanceCount(projectId, DateUtils.getDate()); +// } List list = attendanceService.list(Wrappers.lambdaQuery() .eq(BusAttendance::getClockDate, LocalDate.now()) .in(BusAttendance::getClockStatus, Arrays.asList("1", "2", "3")) @@ -182,17 +184,16 @@ public class EnterpriseBigScreenController { // 查询总人数 List relevancyList = userProjectRelevancyService.list(); long totalUserCount = relevancyList.stream().map(BusUserProjectRelevancy::getUserId).distinct().count(); -*/ // 计算考勤率(保留一位小数) - if (countUser > 0) { - BigDecimal rate = new BigDecimal(countAttendance * 100) - .divide(new BigDecimal(countUser), 1, RoundingMode.HALF_UP); + if (totalUserCount > 0) { + BigDecimal rate = new BigDecimal(attendanceCount * 100) + .divide(new BigDecimal(totalUserCount), 1, RoundingMode.HALF_UP); todayAttendanceCountVo.setAttendanceRate(rate.doubleValue()); } else { todayAttendanceCountVo.setAttendanceRate(0.0); } - todayAttendanceCountVo.setAttendanceCount(Long.valueOf(countAttendance)); + todayAttendanceCountVo.setAttendanceCount(attendanceCount); return R.ok(todayAttendanceCountVo); } @@ -203,19 +204,19 @@ public class EnterpriseBigScreenController { @GetMapping("/projectAttendanceCount") public R> getProjectAttendanceCount() { - List projectList = projectService.listByIds(List.of(1897160897167638529L, 1897161054676336641L)); - return R.ok(projectList.stream().map(busProject -> { - ProjectAttendanceCountVo vo = new ProjectAttendanceCountVo(); - vo.setProjectId(busProject.getId()); - vo.setProjectName(busProject.getProjectName()); - Long projectId = busProject.getGoId(); - Integer projectUserCount = projectBigScreenMapper.getProjectUserCount(projectId); - Integer attendanceCount = projectBigScreenMapper.getAttendanceCount(projectId, DateUtils.getDate()); - vo.setAttendanceCount(Long.valueOf(attendanceCount)); - vo.setAttendanceRate(BigDecimalUtil.toPercentage(BigDecimal.valueOf(attendanceCount), BigDecimal.valueOf(projectUserCount)).doubleValue()); - return vo; - }).toList()); - /*ArrayList projectAttendanceCountVos = new ArrayList<>(); +// List projectList = projectService.listByIds(List.of(1897160897167638529L, 1897161054676336641L)); +// return R.ok(projectList.stream().map(busProject -> { +// ProjectAttendanceCountVo vo = new ProjectAttendanceCountVo(); +// vo.setProjectId(busProject.getId()); +// vo.setProjectName(busProject.getProjectName()); +// Long projectId = busProject.getGoId(); +// Integer projectUserCount = projectBigScreenMapper.getProjectUserCount(projectId); +// Integer attendanceCount = projectBigScreenMapper.getAttendanceCount(projectId, DateUtils.getDate()); +// vo.setAttendanceCount(Long.valueOf(attendanceCount)); +// vo.setAttendanceRate(BigDecimalUtil.toPercentage(BigDecimal.valueOf(attendanceCount), BigDecimal.valueOf(projectUserCount)).doubleValue()); +// return vo; +// }).toList()); + ArrayList projectAttendanceCountVos = new ArrayList<>(); List list = attendanceService.list(Wrappers.lambdaQuery() .eq(BusAttendance::getClockDate, LocalDate.now()) @@ -257,7 +258,7 @@ public class EnterpriseBigScreenController { projectAttendanceCountVos.add(projectAttendanceCountVo); } - return R.ok(projectAttendanceCountVos);*/ + return R.ok(projectAttendanceCountVos); } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/ProjectBigScreenController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/ProjectBigScreenController.java index 5e2b56fa..df81962d 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/ProjectBigScreenController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/ProjectBigScreenController.java @@ -188,52 +188,52 @@ public class ProjectBigScreenController { @GetMapping("/people/{projectId}") public R getProjectPeople(@NotNull(message = "主键不能为空") @PathVariable Long projectId) { - BusProject project = projectService.getById(projectId); - projectId = project.getGoId(); - Integer projectUserCount = projectBigScreenMapper.getProjectUserCount(projectId); - ProjectPeopleVo vo = new ProjectPeopleVo(); - vo.setPeopleCount(BigDecimal.valueOf(projectUserCount)); - Integer attendanceCount = projectBigScreenMapper.getAttendanceCount(projectId, DateUtils.getDate()); - vo.setAttendanceCount(BigDecimal.valueOf(attendanceCount)); - vo.setAttendanceRate(BigDecimalUtil.toPercentage(BigDecimal.valueOf(attendanceCount), BigDecimal.valueOf(projectUserCount))); - List projectUserList = projectBigScreenMapper.getProjectUserList(projectId); - List teamList = projectBigScreenMapper.getTeamList(projectId); - - List teamAttendanceList = new ArrayList<>(); - String punchRange = project.getPunchRange(); - String punchTime = ""; - if (punchRange != null) { - String start = punchRange.split(",")[0]; - punchTime = LocalDate.now() + " " + start; - } - if (projectUserList != null && teamList != null) { - projectUserList = projectUserList.stream().filter(user -> user.getTeamId() != null).toList(); - Map> userMap = projectUserList.stream() - .collect(Collectors.groupingBy(BusConstructionUser::getTeamId)); - for (BusProjectTeamByGo team : teamList) { - ProjectTeamAttendanceVo vo1 = new ProjectTeamAttendanceVo(); - vo1.setId(team.getId()); - vo1.setTeamName(team.getName()); - vo1.setAttendanceTime(punchTime); - vo1.setAttendanceNumber(BigDecimal.ZERO); - List userList = userMap.get(team.getId()); - if (CollUtil.isNotEmpty(userList)) { - List list = userList.stream().map(BusConstructionUser::getOpenid).distinct().toList(); - Integer aCount = projectBigScreenMapper.getAttendanceCountByOpenIds(list, LocalDate.now()); - vo1.setAttendanceNumber(BigDecimal.valueOf(aCount)); - } - vo1.setAllNumber(BigDecimal.valueOf(userMap.getOrDefault(team.getId(), List.of()).size())); - if (vo1.getAttendanceNumber() != null && vo1.getAllNumber() != null && vo1.getAllNumber().compareTo(BigDecimal.ZERO) != 0) { - vo1.setAttendanceRate(BigDecimalUtil.toPercentage(vo1.getAttendanceNumber(), vo1.getAllNumber())); - } else { - vo1.setAttendanceRate(BigDecimal.ZERO); - } - teamAttendanceList.add(vo1); - } - } - vo.setTeamAttendanceList(teamAttendanceList); - return R.ok(vo); -// return R.ok(projectBigScreenService.getProjectPeople(projectId)); +// BusProject project = projectService.getById(projectId); +// projectId = project.getGoId(); +// Integer projectUserCount = projectBigScreenMapper.getProjectUserCount(projectId); +// ProjectPeopleVo vo = new ProjectPeopleVo(); +// vo.setPeopleCount(BigDecimal.valueOf(projectUserCount)); +// Integer attendanceCount = projectBigScreenMapper.getAttendanceCount(projectId, DateUtils.getDate()); +// vo.setAttendanceCount(BigDecimal.valueOf(attendanceCount)); +// vo.setAttendanceRate(BigDecimalUtil.toPercentage(BigDecimal.valueOf(attendanceCount), BigDecimal.valueOf(projectUserCount))); +// List projectUserList = projectBigScreenMapper.getProjectUserList(projectId); +// List teamList = projectBigScreenMapper.getTeamList(projectId); +// +// List teamAttendanceList = new ArrayList<>(); +// String punchRange = project.getPunchRange(); +// String punchTime = ""; +// if (punchRange != null) { +// String start = punchRange.split(",")[0]; +// punchTime = LocalDate.now() + " " + start; +// } +// if (projectUserList != null && teamList != null) { +// projectUserList = projectUserList.stream().filter(user -> user.getTeamId() != null).toList(); +// Map> userMap = projectUserList.stream() +// .collect(Collectors.groupingBy(BusConstructionUser::getTeamId)); +// for (BusProjectTeamByGo team : teamList) { +// ProjectTeamAttendanceVo vo1 = new ProjectTeamAttendanceVo(); +// vo1.setId(team.getId()); +// vo1.setTeamName(team.getName()); +// vo1.setAttendanceTime(punchTime); +// vo1.setAttendanceNumber(BigDecimal.ZERO); +// List userList = userMap.get(team.getId()); +// if (CollUtil.isNotEmpty(userList)) { +// List list = userList.stream().map(BusConstructionUser::getOpenid).distinct().toList(); +// Integer aCount = projectBigScreenMapper.getAttendanceCountByOpenIds(list, LocalDate.now()); +// vo1.setAttendanceNumber(BigDecimal.valueOf(aCount)); +// } +// vo1.setAllNumber(BigDecimal.valueOf(userMap.getOrDefault(team.getId(), List.of()).size())); +// if (vo1.getAttendanceNumber() != null && vo1.getAllNumber() != null && vo1.getAllNumber().compareTo(BigDecimal.ZERO) != 0) { +// vo1.setAttendanceRate(BigDecimalUtil.toPercentage(vo1.getAttendanceNumber(), vo1.getAllNumber())); +// } else { +// vo1.setAttendanceRate(BigDecimal.ZERO); +// } +// teamAttendanceList.add(vo1); +// } +// } +// vo.setTeamAttendanceList(teamAttendanceList); +// return R.ok(vo); + return R.ok(projectBigScreenService.getProjectPeople(projectId)); } /** @@ -253,18 +253,18 @@ public class ProjectBigScreenController { @GetMapping("/generalize/{projectId}") public R getProjectGeneralize(@NotNull(message = "主键不能为空") @PathVariable Long projectId) { - BusProject project = projectService.getById(projectId); - if (project != null) { - Long goId = project.getGoId(); - if (goId != null) { - List sysProjectIntroduces = projectBigScreenMapper.selectByProjectId(goId); - if (CollUtil.isNotEmpty(sysProjectIntroduces)) { - return R.ok(sysProjectIntroduces.getFirst().getRichText()); - } - } - } -// return R.ok(projectBigScreenService.getProjectGeneralize(projectId)); - return R.ok(); +// BusProject project = projectService.getById(projectId); +// if (project != null) { +// Long goId = project.getGoId(); +// if (goId != null) { +// List sysProjectIntroduces = projectBigScreenMapper.selectByProjectId(goId); +// if (CollUtil.isNotEmpty(sysProjectIntroduces)) { +// return R.ok(sysProjectIntroduces.getFirst().getRichText()); +// } +// } +// } + return R.ok(projectBigScreenService.getProjectGeneralize(projectId)); +// return R.ok(); } /** @@ -354,6 +354,35 @@ public class ProjectBigScreenController { projectBigScreenService.setList(bo); } + /** + * 查询地图项目分类 + */ +// @SaCheckPermission("project:bigScreen:getProjectMapList") + @GetMapping("/getProjectMapList") + public R>>> getProjectMapList() { + return R.ok(projectService.getProjectMapList()); + } + + + + /** + * 查询项目地域分散图 + */ +// @SaCheckPermission("project:bigScreen:getProjectMapList") + @GetMapping("/getProjectDiYv") + public R> getProjectDiYv() { + return R.ok(projectService.getProjectDiYv()); + } + + /** + * 计划和实际容量对比 + */ +// @SaCheckPermission("project:bigScreen:getProjectMapList") + @GetMapping("/getProjectCapacity") + public R>> getProjectCapacity() { + return R.ok(projectService.getProjectCapacity()); + } + // public List> setSxt() { // List> sxtChildrenMap = new ArrayList<>(); diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/EnterpriseKeyIndexVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/EnterpriseKeyIndexVo.java index bb988b43..794fa811 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/EnterpriseKeyIndexVo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/EnterpriseKeyIndexVo.java @@ -35,4 +35,13 @@ public class EnterpriseKeyIndexVo implements Serializable { * 风电项目总容量 */ private BigDecimal windElectricityTotalCapacity; + + /** + * 业绩数量 + */ + private Long performanceCount; + /** + * 典型业绩 + */ + private Long typicalPerformance; } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/mapper/ProjectBigScreenMapper.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/mapper/ProjectBigScreenMapper.java index d7b5563b..49209014 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/mapper/ProjectBigScreenMapper.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/mapper/ProjectBigScreenMapper.java @@ -19,41 +19,41 @@ public interface ProjectBigScreenMapper { @Select("select * from bus_corporate_events limit 10") List getBusCorporateEvents(); - - @Select("select * from sys_project_introduce where project_id = #{projectId}") - List selectByProjectId(@Param("projectId") Long projectId); - - @Select("select count(*) from bus_construction_user where project_id = #{projectId} && deleted_at is NULL") - Integer getProjectUserCount(@Param("projectId") Long projectId); - - @Select("select count(*) from bus_construction_user where project_id in (60,59) && deleted_at is NULL") - Integer getUserCount(); - - @Select("select count(*) from bus_attendance where project_id = #{projectId} && printing_date = #{printingDate} && commuter = '1'") - Integer getAttendanceCount(@Param("projectId") Long projectId, - @Param("printingDate") String printingDate); - - @Select("SELECT * FROM sys_project_team WHERE project_id = #{projectId} && deleted_at is NULL") - List getTeamList(@Param("projectId") Long projectId); - - @Select("SELECT * FROM bus_construction_user WHERE project_id = #{projectId} && deleted_at is NULL") - List getProjectUserList(@Param("projectId") Long projectId); - - @Select({ - "" - }) - Integer getAttendanceCountByOpenIds(@Param("openIds") List openIds, - @Param("printingDate") LocalDate printingDate); - - @Select("SELECT * FROM bus_tour WHERE project_id = #{projectId} AND deleted_at IS NULL LIMIT 10") - List selectTourByProjectId(@Param("projectId") Long projectId); +// +// @Select("select * from sys_project_introduce where project_id = #{projectId}") +// List selectByProjectId(@Param("projectId") Long projectId); +// +// @Select("select count(*) from bus_construction_user where project_id = #{projectId} && deleted_at is NULL") +// Integer getProjectUserCount(@Param("projectId") Long projectId); +// +// @Select("select count(*) from bus_construction_user where project_id in (60,59) && deleted_at is NULL") +// Integer getUserCount(); +// +// @Select("select count(*) from bus_attendance where project_id = #{projectId} && printing_date = #{printingDate} && commuter = '1'") +// Integer getAttendanceCount(@Param("projectId") Long projectId, +// @Param("printingDate") String printingDate); +// +// @Select("SELECT * FROM sys_project_team WHERE project_id = #{projectId} && deleted_at is NULL") +// List getTeamList(@Param("projectId") Long projectId); +// +// @Select("SELECT * FROM bus_construction_user WHERE project_id = #{projectId} && deleted_at is NULL") +// List getProjectUserList(@Param("projectId") Long projectId); +// +// @Select({ +// "" +// }) +// Integer getAttendanceCountByOpenIds(@Param("openIds") List openIds, +// @Param("printingDate") LocalDate printingDate); +// +// @Select("SELECT * FROM bus_tour WHERE project_id = #{projectId} AND deleted_at IS NULL LIMIT 10") +// List selectTourByProjectId(@Param("projectId") Long projectId); } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/impl/EnterpriseBigScreenServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/impl/EnterpriseBigScreenServiceImpl.java index 75211478..2d27e118 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/impl/EnterpriseBigScreenServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/service/impl/EnterpriseBigScreenServiceImpl.java @@ -124,6 +124,8 @@ public class EnterpriseBigScreenServiceImpl implements EnterpriseBigScreenServic vo.setWindElectricityCount(windElectricityCount); vo.setPhotovoltaicTotalCapacity(photovoltaicTotalCapacity); vo.setWindElectricityTotalCapacity(windElectricityTotalCapacity); + vo.setPerformanceCount(52L); + vo.setTypicalPerformance(22L); return vo; } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/controller/DesUserController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/controller/DesUserController.java index 9b619dd6..8629b908 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/controller/DesUserController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/controller/DesUserController.java @@ -1,12 +1,32 @@ package org.dromara.design.controller; +import java.io.IOException; +import java.io.InputStream; +import java.rmi.ServerException; +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; import java.util.List; +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import lombok.RequiredArgsConstructor; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.*; import cn.dev33.satoken.annotation.SaCheckPermission; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.DateUtil; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +//import org.dromara.design.domain.DesUserExcelData; +import org.dromara.design.domain.DesUserExcelData; +import org.dromara.design.domain.dto.ExcelData; import org.dromara.design.domain.dto.desUser.DesUserBatchDto; +import org.dromara.design.domain.dto.volumecatalog.DesVolumeCatalogCreateReq; import org.springframework.web.bind.annotation.*; import org.springframework.validation.annotation.Validated; import org.dromara.common.idempotent.annotation.RepeatSubmit; @@ -22,6 +42,7 @@ import org.dromara.design.domain.vo.DesUserVo; import org.dromara.design.domain.bo.DesUserBo; import org.dromara.design.service.IDesUserService; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.springframework.web.multipart.MultipartFile; /** * 设计人员 @@ -57,6 +78,51 @@ public class DesUserController extends BaseController { ExcelUtil.exportExcel(list, "设计人员", DesUserVo.class, response); } + /** + * 收资清单模板导出 + */ + @SaCheckPermission("design:user:exportExcel") + @Log(title = "收资清单", businessType = BusinessType.EXPORT) + @PostMapping("/exportExcel") + public void exportExcelByProjectId(@RequestParam("deptId") Long deptId, HttpServletResponse response){ + desUserService.exportExcelByProjectId(deptId, response); + } + + + /** + * 导入卷册目录 + */ + @SaCheckPermission("design:user:importData") + @Log(title = "导入卷册目录", businessType = BusinessType.IMPORT) + @PostMapping("/importData") + public R importData(@RequestParam("file") MultipartFile file,Long projectId) throws IOException { + if (projectId == null) { + return R.fail("项目ID不能为空"); + } + List dataList = readExcel(file); + if (CollectionUtils.isEmpty(dataList)) { + throw new ServerException("导入数据为空"); + } + Collections.reverse(dataList); + List desUserBos = new ArrayList<>(); + for (DesUserExcelData desUserBo : dataList) { + DesUserBo userBo = new DesUserBo(); + userBo.setProjectId(projectId); + userBo.setUserId(desUserBo.getUserId()); + userBo.setUserName(desUserBo.getUser()); + userBo.setUserType(desUserBo.getUserTypeId()); + if (!"1".equals(desUserBo.getUserTypeId())) { + userBo.setUserMajor(desUserBo.getUserMajorId()); + } + desUserBos.add(userBo); + } + DesUserBatchDto dto = new DesUserBatchDto(); + dto.setProjectId(projectId); + dto.setList(desUserBos); + desUserService.batchAddOrUpdate(dto); + return toAjax(true); + } + /** * 获取设计人员详细信息 * @@ -114,5 +180,131 @@ public class DesUserController extends BaseController { return toAjax(desUserService.batchAddOrUpdate(dto)); } + public static List readExcel(MultipartFile file) throws IOException { + List dataList = new ArrayList<>(); + + try (InputStream inputStream = file.getInputStream(); + XSSFWorkbook workbook = new XSSFWorkbook(inputStream)) { + + XSSFSheet sheet = workbook.getSheetAt(0); + + // 从第二行(index=1)开始读取数据,跳过表头 + for (int rowIndex = 1; rowIndex <= sheet.getLastRowNum(); rowIndex++) { + Row row = sheet.getRow(rowIndex); + if (hasValidData(row)) { + String userMajor = getCellValue(row.getCell(0)); + String userMajorId = getCellValue(row.getCell(1)); + String user = getCellValue(row.getCell(2)); + Long userId = Long.valueOf(getCellValue(row.getCell(3))); + String userType = getCellValue(row.getCell(4)); + String userTypeId = getCellValue(row.getCell(5)); + if (!"1".equals(userMajorId)) { + if (user == null || user.isEmpty()){ + throw new ServerException("设计人员不能为空"); + } + if (userType == null || userType.isEmpty()){ + throw new ServerException("人员类型不能为空"); + } + } + DesUserExcelData excelData = new DesUserExcelData( + userMajor,userMajorId,user, userId, userType, + userTypeId + ); + dataList.add(excelData); + } + } + } + + return dataList; + } + private static boolean hasValidData(Row row) { + // 遍历行中的所有单元格 + for (int cellIndex = 0; cellIndex < row.getLastCellNum(); cellIndex++) { + Cell cell = row.getCell(cellIndex, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK); + String cellValue = getCellValue(cell).trim(); + + // 只要有一个单元格有非空值,就认为是有效行 + if (!cellValue.isEmpty()) { + return true; + } + } + return false; + } + + private static String getCellValue(Cell cell) { + if (cell == null) { + return ""; + } + // 使用CellType枚举判断单元格类型(POI 4.0+版本推荐方式) + CellType cellType = cell.getCellType(); + // 对于公式单元格,获取其计算结果的类型 + if (cellType == CellType.FORMULA) { + cellType = cell.getCachedFormulaResultType(); + } + + switch (cellType) { + case STRING: + return cell.getStringCellValue().trim(); + case NUMERIC: + if (DateUtil.isCellDateFormatted(cell)) { + Date date = cell.getDateCellValue(); + return date.toString(); + } else { + // 处理数字类型,避免科学计数法 + return String.valueOf((long) cell.getNumericCellValue()); + } + case BOOLEAN: + return String.valueOf(cell.getBooleanCellValue()); + default: + return ""; + } + } + + private static LocalDate getLocalDateValue(Cell cell) { + if (cell == null) { + return null; + } + + CellType cellType = cell.getCellType(); + if (cellType == CellType.FORMULA) { + cellType = cell.getCachedFormulaResultType(); + } + + try { + if (cellType == CellType.NUMERIC) { + if (DateUtil.isCellDateFormatted(cell)) { + Date date = cell.getDateCellValue(); + return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + } else { + // 如果是数字但不是日期,就尝试转为 LocalDate (例如 20250730) + double numericValue = cell.getNumericCellValue(); + String text = String.valueOf((long) numericValue); + return LocalDate.parse(text); + } + } else if (cellType == CellType.STRING) { + String text = cell.getStringCellValue().trim(); + if (text.isEmpty()) { + return null; + } + // 尝试解析不同格式 + try { + return LocalDate.parse(text); // 默认 ISO 格式 yyyy-MM-dd + } catch (Exception e) { + // 如果 Excel 是 yyyy/MM/dd 或 yyyy.MM.dd,可以额外处理 + try { + return LocalDate.parse(text, java.time.format.DateTimeFormatter.ofPattern("yyyy/MM/dd")); + } catch (Exception ignored) {} + try { + return LocalDate.parse(text, java.time.format.DateTimeFormatter.ofPattern("yyyy.MM.dd")); + } catch (Exception ignored) {} + return null; // 不识别的格式就返回 null + } + } + } catch (Exception e) { + return null; + } + return null; + } + } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/domain/DesUserExcelData.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/domain/DesUserExcelData.java new file mode 100644 index 00000000..de057c8d --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/domain/DesUserExcelData.java @@ -0,0 +1,30 @@ +package org.dromara.design.domain; + +import lombok.Data; + +import java.time.LocalDate; + +/** + * @Author 铁憨憨 + * @Date 2025/8/12 22:53 + * @Version 1.0 + */ +@Data +public class DesUserExcelData { + private String userMajor; + private String userMajorId; + private String user; + private Long userId; + private String userType; + private String userTypeId; + + // 构造函数 + public DesUserExcelData(String userMajor, String userMajorId, String user, Long userId, String userType, String userTypeId) { + this.userMajor = userMajor; + this.userMajorId = userMajorId; + this.user = user; + this.userId = userId; + this.userType = userType; + this.userTypeId = userTypeId; + } +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/service/IDesUserService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/service/IDesUserService.java index 80969f1c..7d388509 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/service/IDesUserService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/service/IDesUserService.java @@ -1,5 +1,6 @@ package org.dromara.design.service; +import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.NotNull; import org.dromara.design.domain.dto.desUser.DesUserBatchDto; import org.dromara.design.domain.vo.DesUserVo; @@ -96,4 +97,6 @@ public interface IDesUserService extends IService{ Map getUserList(DesUserBo desUserBo); Long getCount(String principal, String specialty, Long projectId); + + void exportExcelByProjectId(Long deptId, HttpServletResponse response); } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/service/impl/DesUserServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/service/impl/DesUserServiceImpl.java index a6348dd7..b4f4d552 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/service/impl/DesUserServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/service/impl/DesUserServiceImpl.java @@ -1,6 +1,11 @@ package org.dromara.design.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import jakarta.servlet.http.HttpServletResponse; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddressList; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.TableDataInfo; @@ -10,8 +15,11 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; import org.dromara.design.domain.dto.desUser.DesUserBatchDto; +import org.dromara.system.domain.bo.SysUserBo; import org.dromara.system.domain.vo.SysDictDataVo; +import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.service.ISysDictDataService; +import org.dromara.system.service.ISysUserService; import org.springframework.stereotype.Service; import org.dromara.design.domain.bo.DesUserBo; import org.dromara.design.domain.vo.DesUserVo; @@ -19,6 +27,9 @@ import org.dromara.design.domain.DesUser; import org.dromara.design.mapper.DesUserMapper; import org.dromara.design.service.IDesUserService; +import java.io.IOException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.util.*; import java.util.stream.Collectors; @@ -36,6 +47,8 @@ public class DesUserServiceImpl extends ServiceImpl impl private final ISysDictDataService sysDictDataService; + private final ISysUserService sysUserService; + /** * 查询设计人员 * @@ -186,4 +199,242 @@ public class DesUserServiceImpl extends ServiceImpl impl .eq(DesUser::getUserId, Long.valueOf(principal)) .eq(DesUser::getUserMajor, specialty)); } + + public Map getSysUserList(SysUserBo sysUserBo) { + List sysUserVos = sysUserService.selectUserListByDeptByType(sysUserBo); + Map map = new HashMap<>(); + for (SysUserVo sysUserVo : sysUserVos) { + map.put(sysUserVo.getUserId().toString(), sysUserVo.getNickName()); + } + return map; + } + + @Override + public void exportExcelByProjectId(Long deptId, HttpServletResponse response) { + SysUserBo sysUserBo = new SysUserBo(); + sysUserBo.setDeptId(deptId); + sysUserBo.setUserType("sys_user"); + List list = sysDictDataService.selectByDictType("des_user_major"); + List typeList = sysDictDataService.selectByDictType("des_user_type"); + Map uniqueMajors = list.stream().filter(Objects::nonNull).collect(Collectors + .toMap(SysDictDataVo::getDictValue, SysDictDataVo::getDictLabel, (existing, existing1) -> existing)); + if (uniqueMajors.isEmpty()) { + throw new ServiceException("请完成专业配置!!"); + } + Map userTypeMap = typeList.stream().filter(Objects::nonNull).collect(Collectors + .toMap(SysDictDataVo::getDictValue, SysDictDataVo::getDictLabel, (existing, existing1) -> existing)); + if (userTypeMap.isEmpty()) { + throw new ServiceException("请联系管理员设置设计人员类型!!"); + } + Map userList = getSysUserList(sysUserBo); + if (userList == null || userList.isEmpty()) { + throw new ServiceException("找不到人员!"); + } + + Workbook workbook = new XSSFWorkbook(); + // 创建主 Sheet 和隐藏 Sheet + Sheet mainSheet = workbook.createSheet("设计人员配置模板"); + Sheet dataSheet = workbook.createSheet("DropdownData"); + workbook.setSheetHidden(workbook.getSheetIndex(dataSheet), true); + + // 3. 创建单元格样式 + + CellStyle editableStyle = createEditableCellStyle(workbook); // 可编辑单元格样式 + CellStyle protectedStyle = createProtectedCellStyle(workbook); // 受保护单元格样式(ID列用 + + //填充隐藏数据Sheet + int rowIndex = 0; + + // 填充专业和专业ID(A列和B列) + for (Map.Entry entry : uniqueMajors.entrySet()) { + Row row = dataSheet.createRow(rowIndex++); + row.createCell(0).setCellValue(entry.getValue()); // A列:专业ID + row.createCell(1).setCellValue(entry.getKey()); // B列:专业名称 + } + + // 重置行索引,填充人员和人员ID(C列和D列) + rowIndex = 0; + for (Map.Entry entry : userList.entrySet()) { + Row row = dataSheet.getRow(rowIndex); + if (row == null) { + row = dataSheet.createRow(rowIndex); + } + row.createCell(2).setCellValue(entry.getValue()); // C列:人员ID + row.createCell(3).setCellValue(entry.getKey()); // D列:人员名称 + rowIndex++; + } + rowIndex = 0; + // 填充专业和专业ID(A列和B列) + for (Map.Entry entry : userTypeMap.entrySet()) { + Row row = dataSheet.getRow(rowIndex); + if (row == null) { + row = dataSheet.createRow(rowIndex); + } + row.createCell(4).setCellValue(entry.getValue()); // A列:专业ID + row.createCell(5).setCellValue(entry.getKey()); // B列:专业名称 + rowIndex++; + } + + // 主 Sheet 设置表头 + Row sheetRow = mainSheet.createRow(0); + String[] headers = {"专业", "专业编码", + "设计人员", "设计人员编码", "人员类型", "人员人员编码"}; + for (int i = 0; i < headers.length; i++) { + Cell cell = sheetRow.createCell(i); + cell.setCellValue(headers[i]); + } + + // 6. 设置专业下拉列表(第二列) + setMajorDropdown(mainSheet, uniqueMajors.size()); + + // 8. 设置人员下拉列表(第四列) + setPersonDropdown(mainSheet, userList.size()); + + setTypeDropdown(mainSheet, typeList.size()); + + + String formulaTemplate = "IFERROR(INDEX(DropdownData!$B$1:$B$" + uniqueMajors.size() + ", MATCH(A{rowNum}, DropdownData!$A$1:$A$" + uniqueMajors.size() + ", 0)),\"\")"; + + String formulaTemplate1 = "IFERROR(INDEX(DropdownData!$D$1:$D$" + userList.size() + ", MATCH(C{rowNum}, DropdownData!$C$1:$C$" + userList.size() + ", 0)),\"\")"; + String formulaTemplate2 = "IFERROR(INDEX(DropdownData!$F$1:$F$" + userTypeMap.size() + ", MATCH(E{rowNum}, DropdownData!$E$1:$E$" + userTypeMap.size() + ", 0)),\"\")"; + + + for (int i = 1; i <= 100; i++) { // 从第2行到101行 + Row row = mainSheet.createRow(i); + int currentRowNum = i + 1; // Excel行号从1开始 + String formula = formulaTemplate.replace("{rowNum}", String.valueOf(currentRowNum)); + + Cell cell = row.createCell(0); + cell.setCellStyle(editableStyle); //专业不锁定 + + Cell idCell = row.createCell(1); + idCell.setCellFormula(formula); + idCell.setCellStyle(protectedStyle); // 应用隐藏公式样式 + + String formula1 = formulaTemplate1.replace("{rowNum}", String.valueOf(currentRowNum)); + + Cell cell2 = row.createCell(2); + cell2.setCellStyle(editableStyle); + + Cell idCell2 = row.createCell(3); + idCell2.setCellFormula(formula1); + idCell2.setCellStyle(protectedStyle); + + String formula2 = formulaTemplate2.replace("{rowNum}", String.valueOf(currentRowNum)); + + Cell cell3 = row.createCell(4); + cell3.setCellStyle(editableStyle); + + Cell idCell3 = row.createCell(5); + idCell3.setCellFormula(formula2); + idCell3.setCellStyle(protectedStyle); + + } + + + // 保护工作表,仅允许编辑未锁定的单元格 + mainSheet.protectSheet("123456"); // 空密码 + + // 核心:锁定表头(第1行)和前1列(包含ID列) + mainSheet.createFreezePane(0, 1, 0, 1); + + + // 调整列宽 + mainSheet.setColumnWidth(0, 20 * 200); + mainSheet.setColumnWidth(1, 20 * 300); + mainSheet.setColumnWidth(2, 20 * 200); + mainSheet.setColumnWidth(3, 20 * 300); + mainSheet.setColumnWidth(4, 20 * 200); + mainSheet.setColumnWidth(5, 20 * 300); + // 2. 设置响应头 + // 设置响应头,指定Excel格式和下载文件名 + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("设计人员配置模板.xlsx", StandardCharsets.UTF_8)); + // 直接写入响应输出流 + try { + workbook.write(response.getOutputStream()); + workbook.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + /** + * 创建可编辑单元格样式 + */ + private CellStyle createEditableCellStyle(Workbook workbook) { + CellStyle style = workbook.createCellStyle(); + style.setLocked(false); // 关键:允许编辑 + return style; + } + + /** + * 创建受保护单元格样式(用于ID列) + */ + private CellStyle createProtectedCellStyle(Workbook workbook) { + CellStyle style = workbook.createCellStyle(); + DataFormat dataFormat = workbook.createDataFormat(); + short formatIndex = dataFormat.getFormat("0"); // 匹配“自定义→0”格式 + style.setDataFormat(formatIndex); + style.setHidden(true); // 隐藏公式 + style.setLocked(true); + return style; + } + + /** + * 设置专业下拉列表(第二列,索引1) + */ + private void setMajorDropdown(Sheet mainSheet, int majorCount) { + DataValidationHelper helper = mainSheet.getDataValidationHelper(); + + // 专业数据范围:数据Sheet的A列(从第1行到专业数量行) + String majorRange = "DropdownData!$A$1:$A$" + majorCount; + + DataValidationConstraint constraint = helper.createFormulaListConstraint(majorRange); + // 作用范围:第2行到100行,第二列 + CellRangeAddressList addressList = new CellRangeAddressList(1, 100, 0, 0); + + DataValidation validation = helper.createValidation(constraint, addressList); + validation.setShowErrorBox(true); + mainSheet.addValidationData(validation); + + } + + /** + * 设置人员下拉列表(第四列,索引3) + */ + private void setPersonDropdown(Sheet mainSheet, int personCount) { + DataValidationHelper helper = mainSheet.getDataValidationHelper(); + + // 人员数据范围:数据Sheet的C列(从第1行到人员数量行) + String personRange = "DropdownData!$C$1:$C$" + personCount; + + DataValidationConstraint constraint = helper.createFormulaListConstraint(personRange); + // 作用范围:第2行到100行,第四列 + CellRangeAddressList addressList = new CellRangeAddressList(1, 100, 2, 2); + + DataValidation validation = helper.createValidation(constraint, addressList); + validation.setShowErrorBox(true); + mainSheet.addValidationData(validation); + + } + /** + * 设置人员下拉列表(第四列,索引3) + */ + private void setTypeDropdown(Sheet mainSheet, int personCount) { + DataValidationHelper helper = mainSheet.getDataValidationHelper(); + + // 人员数据范围:数据Sheet的C列(从第1行到人员数量行) + String personRange = "DropdownData!$E$1:$E$" + personCount; + + DataValidationConstraint constraint = helper.createFormulaListConstraint(personRange); + // 作用范围:第2行到100行,第四列 + CellRangeAddressList addressList = new CellRangeAddressList(1, 100, 4, 4); + + DataValidation validation = helper.createValidation(constraint, addressList); + validation.setShowErrorBox(true); + mainSheet.addValidationData(validation); + + } } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/service/impl/DesVolumeCatalogServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/service/impl/DesVolumeCatalogServiceImpl.java index d053ae6d..636240d3 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/service/impl/DesVolumeCatalogServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/design/service/impl/DesVolumeCatalogServiceImpl.java @@ -438,11 +438,11 @@ public class DesVolumeCatalogServiceImpl extends ServiceImpl uniqueMajors = desUserService.getUserMajor(desUserBo); if (uniqueMajors == null || uniqueMajors.isEmpty()) { - throw new ServiceException("请完成专业配置!!",502); + throw new ServiceException("请完成专业配置!!"); } Map userList = desUserService.getUserList(desUserBo); if (userList == null || userList.isEmpty()) { - throw new ServiceException("请完成人员任命!",502); + throw new ServiceException("请完成人员任命!"); } Workbook workbook = new XSSFWorkbook(); diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/BusProject.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/BusProject.java index 60bb5137..3cee7816 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/BusProject.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/BusProject.java @@ -161,4 +161,9 @@ public class BusProject extends BaseEntity { */ private Long goId; + /** + * 省份 + */ + private String province; + } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/project/BusProjectCreateReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/project/BusProjectCreateReq.java index 732bbeba..fc35d6e6 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/project/BusProjectCreateReq.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/dto/project/BusProjectCreateReq.java @@ -124,4 +124,9 @@ public class BusProjectCreateReq implements Serializable { * 显示隐藏(0显示 1隐藏) */ private String showHidden; + + /** + * 省份 + */ + private String province; } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/project/BusProjectVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/project/BusProjectVo.java index 5f7f2d55..77462f00 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/project/BusProjectVo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/project/BusProjectVo.java @@ -201,4 +201,11 @@ public class BusProjectVo implements Serializable { */ private Long goId; + /** + * 省份 + */ + private String province; + + private Long count; + } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/mapper/BusProjectMapper.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/mapper/BusProjectMapper.java index d8b7bfc6..655334a9 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/mapper/BusProjectMapper.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/mapper/BusProjectMapper.java @@ -4,6 +4,9 @@ import org.dromara.project.domain.BusProject; import org.dromara.project.domain.vo.project.BusProjectVo; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import java.util.List; +import java.util.Map; + /** * 项目Mapper接口 * @@ -12,4 +15,6 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; */ public interface BusProjectMapper extends BaseMapperPlus { + List getProjectDiYv(); + } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusProjectService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusProjectService.java index 7146cc82..33ac015e 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusProjectService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusProjectService.java @@ -218,4 +218,23 @@ public interface IBusProjectService extends IService { BusProjectVo selectById(Long projectId); List selectProjectVoList(); + + /** + *查询地图项目分类 + * @return + */ + Map>> getProjectMapList(); + + /** + * 查询项目地域分散图 + * @return + */ + Map getProjectDiYv(); + + /** + * 计划和实际容量对比 + * @return + */ + Map> getProjectCapacity(); + } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusProjectServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusProjectServiceImpl.java index e75d43bc..fd6ea4b4 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusProjectServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusProjectServiceImpl.java @@ -51,6 +51,8 @@ import org.dromara.project.mapper.BusProjectMapper; import org.dromara.project.service.*; import org.dromara.quality.service.IQltKnowledgeDocumentService; import org.dromara.safety.service.IHseKnowledgeDocumentService; +import org.dromara.system.domain.vo.SysDictDataVo; +import org.dromara.system.service.ISysDictDataService; import org.dromara.workflow.service.IFlwDefinitionService; import org.springframework.beans.BeanUtils; import org.springframework.cache.annotation.Cacheable; @@ -136,6 +138,9 @@ public class BusProjectServiceImpl extends ServiceImpl WEATHER_CACHE = Caffeine.newBuilder().initialCapacity(1024) .maximumSize(10000L) @@ -1113,6 +1118,68 @@ public class BusProjectServiceImpl extends ServiceImpl>> getProjectMapList() { + //获取项目类型列表 + List projectTypes = dictDataService.selectByDictType("project_type"); + if (projectTypes == null || projectTypes.isEmpty()) { + return Collections.emptyMap(); + } + //获取项目列表 + List projectVos = baseMapper.selectVoList(new LambdaQueryWrapper().eq(BusProject::getPId,0).eq(BusProject::getIsDelete,0)); + if (projectVos == null || projectVos.isEmpty()) { + return Collections.emptyMap(); + } + Map>> map = new HashMap<>(); + for (SysDictDataVo projectType : projectTypes) { + Map> map1 = new HashMap<>(); + //获取迭代器 + Iterator iterator = projectVos.iterator(); + while (iterator.hasNext()) { + //指向下一个元素 + BusProjectVo project = iterator.next(); + if (projectType.getDictValue().equals(project.getProjectType())) { + Map map2 = new HashMap<>(); + map2.put("lng",project.getLng()); + map2.put("lat",project.getLat()); + map2.put("projectId",project.getId().toString()); + map1.put(project.getProjectName(),map2); + //当满足条件时删除该元素 + iterator.remove(); + } + } + map.put(projectType.getDictLabel(),map1); + } + return map; + } + + @Override + public Map getProjectDiYv() { + List projectVos = baseMapper.getProjectDiYv(); + Map map = new HashMap<>(); + for (BusProjectVo vo : projectVos) { + map.put(StringUtils.isNotBlank(vo.getProvince())?vo.getProvince():"未知地区",vo.getCount()); + } + return map; + } + + @Override + public Map> getProjectCapacity() { + //获取项目列表 + List projectVos = baseMapper.selectVoList(new LambdaQueryWrapper().eq(BusProject::getPId,0).eq(BusProject::getIsDelete,0)); + if (projectVos == null || projectVos.isEmpty()) { + return Collections.emptyMap(); + } + Map> map = new HashMap<>(); + for (BusProjectVo project : projectVos) { + Map map2 = new HashMap<>(); + map2.put("actual",project.getActual()); + map2.put("plan",project.getPlan()); + map.put(project.getProjectName(),map2); + } + return map; + } + /** * 构造分项工程树 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java index 8307c289..16ecfda9 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java @@ -123,5 +123,14 @@ public interface SysUserMapper extends BaseMapperPlus { List thisAlldepIds(@Param("depId") Long deptId); - + /** + * 查询用户列表 + * @param sysUserWrapper + * @return + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "u.dept_id"), + @DataColumn(key = "userName", value = "u.user_id") + }) + List selectVoListByDept(@Param(Constants.WRAPPER) Wrapper sysUserWrapper); } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictDataService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictDataService.java index abec6a6b..ff6d56e7 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictDataService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictDataService.java @@ -73,5 +73,5 @@ public interface ISysDictDataService { */ boolean checkDictDataUnique(SysDictDataBo dict); - List selectByDictType(String desUserMajor); + List selectByDictType(String dictType); } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java index 7458a81c..74a13246 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java @@ -264,4 +264,6 @@ public interface ISysUserService { Long save(SysUser sysUser); Boolean updateAppUserType(Long userId,String appUserType); + + List selectUserListByDeptByType(SysUserBo sysUserBo); } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java index e3d3db78..f2a2f428 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java @@ -155,8 +155,8 @@ public class SysDictDataServiceImpl implements ISysDictDataService { } @Override - public List selectByDictType(String desUserMajor) { - return baseMapper.selectVoList(new LambdaQueryWrapper().eq(SysDictData::getDictType, desUserMajor)); + public List selectByDictType(String dictType) { + return baseMapper.selectVoList(new LambdaQueryWrapper().eq(SysDictData::getDictType, dictType)); } } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index 4c6d3f45..061af597 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -837,6 +837,11 @@ public class SysUserServiceImpl implements ISysUserService, UserService { .eq(SysUser::getUserId, userId)) > 0; } + @Override + public List selectUserListByDeptByType(SysUserBo sysUserBo) { + return baseMapper.selectVoListByDept(this.buildQueryWrapper(sysUserBo)); + } + /** * 通过用户ID查询用户账户 * diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/project/BusProjectMapper.xml b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/project/BusProjectMapper.xml index 366b854a..b62b4354 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/project/BusProjectMapper.xml +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/project/BusProjectMapper.xml @@ -4,4 +4,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml index 93872e76..cccc67ee 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -109,6 +109,18 @@ WHERE is_show = '1' ORDER BY level, order_num; +