src/main/java/com/ruoyi/device/controller/DeviceMaintenanceController.java
@@ -3,7 +3,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.device.dto.DeviceMaintenanceDto; import com.ruoyi.device.dto.DeviceMonthlyRepairTableDTO; import com.ruoyi.device.dto.DeviceRepairDto; import com.ruoyi.device.dto.RepairAmountGroupDTO; import com.ruoyi.device.pojo.DeviceLedger; import com.ruoyi.device.pojo.DeviceMaintenance; import com.ruoyi.device.pojo.DeviceRepair; @@ -19,6 +21,7 @@ import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @Api(tags = "设å¤ä¿å »") @RestController @@ -87,4 +90,27 @@ } /** * æå¹´ä»½æ¥è¯¢æ¯ææ¥ä¿®éé¢ï¼æè®¾å¤å°è´¦åç»ï¼ * @param year åç«¯ä¼ å ¥ç年份ï¼å¦2025ï¼ */ @GetMapping("/monthlyAmount") @ApiModelProperty("æå¹´ä»½æ¥è¯¢æ¯ææ¥ä¿®éé¢ï¼æè®¾å¤å°è´¦åç»ï¼") public AjaxResult getMonthlyAmount(@RequestParam(defaultValue = "2025", required = true,name = "year") String year) { List<DeviceMonthlyRepairTableDTO> result = deviceMaintenanceService.getMonthlyRepairAmountByYear(year); return AjaxResult.success(result); } /** * æå¹´ä»½æ¥è¯¢æ¥ä¿®éé¢ï¼æè®¾å¤å°è´¦åç»ï¼ * @param year åç«¯ä¼ å ¥ç年份ï¼å¦2025ï¼ */ @GetMapping("/yearlyAmount") @ApiModelProperty("æå¹´ä»½æ¥è¯¢æ¥ä¿®éé¢ï¼æè®¾å¤å°è´¦åç»ï¼") public AjaxResult yearlyAmount(@RequestParam(defaultValue = "2025", required = true,name = "year") String year) { List<RepairAmountGroupDTO> result = deviceMaintenanceService.getRepairAmountByYear(year); return AjaxResult.success(result); } } src/main/java/com/ruoyi/device/controller/DeviceRepairController.java
@@ -2,7 +2,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.device.dto.DeviceMonthlyRepairTableDTO; import com.ruoyi.device.dto.DeviceRepairDto; import com.ruoyi.device.dto.RepairAmountGroupDTO; import com.ruoyi.device.pojo.DeviceLedger; import com.ruoyi.device.pojo.DeviceRepair; import com.ruoyi.device.service.IDeviceLedgerService; @@ -16,6 +18,7 @@ import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @Api(tags = "è®¾å¤æ¥ä¿®ç®¡ç") @RequestMapping("/device/repair") @@ -75,4 +78,27 @@ public void export(HttpServletResponse response, Long[] ids) { deviceRepairService.export(response, ids); } /** * æå¹´ä»½æ¥è¯¢æ¯ææ¥ä¿®éé¢ï¼æè®¾å¤å°è´¦åç»ï¼ * @param year åç«¯ä¼ å ¥ç年份ï¼å¦2025ï¼ */ @GetMapping("/monthlyAmount") @ApiModelProperty("æå¹´ä»½æ¥è¯¢æ¯ææ¥ä¿®éé¢ï¼æè®¾å¤å°è´¦åç»ï¼") public AjaxResult getMonthlyAmount(@RequestParam(defaultValue = "2025", required = true,name = "year") String year) { List<DeviceMonthlyRepairTableDTO> result = deviceRepairService.getMonthlyRepairAmountByYear(year); return AjaxResult.success(result); } /** * æå¹´ä»½æ¥è¯¢æ¥ä¿®éé¢ï¼æè®¾å¤å°è´¦åç»ï¼ * @param year åç«¯ä¼ å ¥ç年份ï¼å¦2025ï¼ */ @GetMapping("/yearlyAmount") @ApiModelProperty("æå¹´ä»½æ¥è¯¢æ¥ä¿®éé¢ï¼æè®¾å¤å°è´¦åç»ï¼") public AjaxResult yearlyAmount(@RequestParam(defaultValue = "2025", required = true,name = "year") String year) { List<RepairAmountGroupDTO> result = deviceRepairService.getRepairAmountByYear(year); return AjaxResult.success(result); } } src/main/java/com/ruoyi/device/dto/DeviceMaintenanceDto.java
@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.Date; @@ -16,6 +17,9 @@ private Long id; @ApiModelProperty("设å¤ä¿å »éé¢") private BigDecimal maintenancePrice; @ApiModelProperty("设å¤å°è´¦id") private Long deviceLedgerId; src/main/java/com/ruoyi/device/dto/DeviceMonthlyRepairTableDTO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,29 @@ package com.ruoyi.device.dto; import lombok.Data; import java.math.BigDecimal; /** * @author :yys * @date : 2025/11/19 10:58 */ @Data public class DeviceMonthlyRepairTableDTO { private String deviceName; // 设å¤åç§° private BigDecimal month1; // 1æéé¢ private BigDecimal month2; // 2æéé¢ private BigDecimal month3; // 3æéé¢ private BigDecimal month4; // 4æéé¢ private BigDecimal month5; // 5æéé¢ private BigDecimal month6; // 6æéé¢ private BigDecimal month7; // 7æéé¢ private BigDecimal month8; // 8æéé¢ private BigDecimal month9; // 9æéé¢ private BigDecimal month10; // 10æéé¢ private BigDecimal month11; // 11æéé¢ private BigDecimal month12; // 12æéé¢ private BigDecimal total; // æ»è®¡ } src/main/java/com/ruoyi/device/dto/DeviceRepairDto.java
@@ -6,6 +6,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.Date; @@ -18,6 +19,9 @@ @ApiModelProperty("设å¤å°è´¦id") private Long deviceLedgerId; @ApiModelProperty("æ¥ä¿®éé¢") private BigDecimal repairPrice; @ApiModelProperty("设å¤åç§°") private String deviceName; src/main/java/com/ruoyi/device/dto/RepairAmountGroupDTO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,23 @@ package com.ruoyi.device.dto; import lombok.Data; import java.math.BigDecimal; /** * @author :yys * @date : 2025/11/19 10:44 */ @Data public class RepairAmountGroupDTO { // å¹´æï¼æ ¼å¼ï¼MMï¼ private String repairYearMonth; // 设å¤å°è´¦id private Long deviceLedgerId; // 设å¤å°è´¦åç§° private String deviceName; // è¯¥è®¾å¤æ¥ä¿®é颿»å private BigDecimal totalRepairPrice; } src/main/java/com/ruoyi/device/execl/DeviceMaintenanceExeclDto.java
@@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.Date; @@ -17,6 +18,11 @@ @Excel(name = "设å¤åç§°") private String deviceName; @ApiModelProperty("设å¤ä¿å »éé¢") @Excel(name = "设å¤ä¿å »éé¢") private BigDecimal maintenancePrice; @Excel(name = "è§æ ¼åå·") @ApiModelProperty("è§æ ¼åå·") private String deviceModel; src/main/java/com/ruoyi/device/execl/DeviceRepairExeclDto.java
@@ -7,6 +7,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.Date; @@ -17,6 +18,10 @@ @Excel(name = "设å¤åç§°") private String deviceName; @ApiModelProperty("æ¥ä¿®éé¢") @Excel(name = "æ¥ä¿®éé¢") private BigDecimal repairPrice; @ApiModelProperty("设å¤åå·") @Excel(name = "设å¤åå·") private String deviceModel; src/main/java/com/ruoyi/device/mapper/DeviceMaintenanceMapper.java
@@ -7,8 +7,11 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.device.dto.DeviceMaintenanceDto; import com.ruoyi.device.dto.DeviceRepairDto; import com.ruoyi.device.dto.RepairAmountGroupDTO; import com.ruoyi.device.pojo.DeviceMaintenance; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import java.util.List; @@ -21,4 +24,31 @@ @InterceptorIgnore(tenantLine = "true") List<DeviceMaintenance> list1(Long id); /** * æâæå®å¹´ä»½çå¹´æ+设å¤å°è´¦idâåç»ï¼æ±åæ¥ä¿®éé¢ * @param year åç«¯ä¼ å ¥ç年份ï¼å¦"2025"ï¼ */ @Select("SELECT " + " DATE_FORMAT(maintenance_actually_time, '%m') AS repairYearMonth, " + " device_ledger_id AS deviceLedgerId, " + " SUM(maintenance_price) AS totalRepairPrice " + "FROM device_maintenance " + "WHERE DATE_FORMAT(maintenance_actually_time, '%Y') = #{year} " + // åªæ¥è¯¢æå®å¹´ä»½çæ°æ® "GROUP BY device_ledger_id,DATE_FORMAT(maintenance_actually_time, '%Y-%m') " + "ORDER BY repairYearMonth ASC") // ææä»½æåºï¼æ¹ä¾¿å端å±ç¤º List<RepairAmountGroupDTO> groupByMonthAndDeviceLedger(@Param("year") String year); /** * æâ设å¤å°è´¦idâåç»ï¼æ±åæ¥ä¿®éé¢ * @param year åç«¯ä¼ å ¥ç年份ï¼å¦"2025"ï¼ */ @Select("SELECT " + " device_ledger_id AS deviceLedgerId, " + " SUM(maintenance_price) AS totalRepairPrice " + "FROM device_maintenance " + "WHERE DATE_FORMAT(maintenance_actually_time, '%Y') = #{year} " + // åªæ¥è¯¢æå®å¹´ä»½çæ°æ® "GROUP BY device_ledger_id ") // ææä»½æåºï¼æ¹ä¾¿å端å±ç¤º List<RepairAmountGroupDTO> groupByDeviceLedger(@Param("year") String year); } src/main/java/com/ruoyi/device/mapper/DeviceRepairMapper.java
@@ -4,13 +4,44 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.device.dto.DeviceRepairDto; import com.ruoyi.device.dto.RepairAmountGroupDTO; import com.ruoyi.device.pojo.DeviceRepair; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import java.util.List; @Mapper public interface DeviceRepairMapper extends BaseMapper<DeviceRepair> { IPage<DeviceRepairDto> queryPage(Page page, @Param("deviceRepairDto") DeviceRepairDto deviceRepairDto); DeviceRepairDto detailById(Long id); /** * æâæå®å¹´ä»½çå¹´æ+设å¤å°è´¦idâåç»ï¼æ±åæ¥ä¿®éé¢ * @param year åç«¯ä¼ å ¥ç年份ï¼å¦"2025"ï¼ */ @Select("SELECT " + " DATE_FORMAT(repair_time, '%m') AS repairYearMonth, " + " device_ledger_id AS deviceLedgerId, " + " SUM(repair_price) AS totalRepairPrice " + "FROM device_repair " + "WHERE DATE_FORMAT(repair_time, '%Y') = #{year} " + // åªæ¥è¯¢æå®å¹´ä»½çæ°æ® "GROUP BY device_ledger_id,DATE_FORMAT(repair_time, '%Y-%m') " + "ORDER BY repairYearMonth ASC") // ææä»½æåºï¼æ¹ä¾¿å端å±ç¤º List<RepairAmountGroupDTO> groupByMonthAndDeviceLedger(@Param("year") String year); /** * æâ设å¤å°è´¦idâåç»ï¼æ±åæ¥ä¿®éé¢ * @param year åç«¯ä¼ å ¥ç年份ï¼å¦"2025"ï¼ */ @Select("SELECT " + " device_ledger_id AS deviceLedgerId, " + " SUM(repair_price) AS totalRepairPrice " + "FROM device_repair " + "WHERE DATE_FORMAT(repair_time, '%Y') = #{year} " + // åªæ¥è¯¢æå®å¹´ä»½çæ°æ® "GROUP BY device_ledger_id ") // ææä»½æåºï¼æ¹ä¾¿å端å±ç¤º List<RepairAmountGroupDTO> groupByDeviceLedger(@Param("year") String year); } src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java
@@ -8,6 +8,7 @@ import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.Date; @@ -22,6 +23,9 @@ @ApiModelProperty("设å¤å°è´¦id") private Long deviceLedgerId; @ApiModelProperty("设å¤ä¿å »éé¢") private BigDecimal maintenancePrice; private String deviceName; src/main/java/com/ruoyi/device/pojo/DeviceRepair.java
@@ -25,6 +25,9 @@ @ApiModelProperty("设å¤å°è´¦id") private Long deviceLedgerId; @ApiModelProperty("æ¥ä¿®éé¢") private BigDecimal repairPrice; private String deviceName; private String deviceModel; src/main/java/com/ruoyi/device/service/IDeviceMaintenanceService.java
@@ -4,10 +4,13 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.device.dto.DeviceMaintenanceDto; import com.ruoyi.device.dto.DeviceMonthlyRepairTableDTO; import com.ruoyi.device.dto.RepairAmountGroupDTO; import com.ruoyi.device.pojo.DeviceMaintenance; import com.ruoyi.framework.web.domain.AjaxResult; import javax.servlet.http.HttpServletResponse; import java.util.List; public interface IDeviceMaintenanceService extends IService<DeviceMaintenance> { @@ -20,4 +23,8 @@ void export(HttpServletResponse response, Long[] ids); DeviceMaintenanceDto detailById(Long id); List<DeviceMonthlyRepairTableDTO> getMonthlyRepairAmountByYear(String year); List<RepairAmountGroupDTO> getRepairAmountByYear(String year); } src/main/java/com/ruoyi/device/service/IDeviceRepairService.java
@@ -3,11 +3,14 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.device.dto.DeviceMonthlyRepairTableDTO; import com.ruoyi.device.dto.DeviceRepairDto; import com.ruoyi.device.dto.RepairAmountGroupDTO; import com.ruoyi.device.pojo.DeviceRepair; import com.ruoyi.framework.web.domain.AjaxResult; import javax.servlet.http.HttpServletResponse; import java.util.List; public interface IDeviceRepairService extends IService<DeviceRepair> { @@ -21,4 +24,8 @@ void export(HttpServletResponse response, Long[] ids); DeviceRepairDto detailById(Long id); List<DeviceMonthlyRepairTableDTO> getMonthlyRepairAmountByYear(String year); List<RepairAmountGroupDTO> getRepairAmountByYear(String year); } src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceServiceImpl.java
@@ -7,18 +7,24 @@ import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.device.dto.DeviceMaintenanceDto; import com.ruoyi.device.dto.DeviceMonthlyRepairTableDTO; import com.ruoyi.device.dto.RepairAmountGroupDTO; import com.ruoyi.device.execl.DeviceMaintenanceExeclDto; import com.ruoyi.device.mapper.DeviceLedgerMapper; import com.ruoyi.device.mapper.DeviceMaintenanceMapper; import com.ruoyi.device.pojo.DeviceLedger; import com.ruoyi.device.pojo.DeviceMaintenance; import com.ruoyi.device.service.IDeviceMaintenanceService; import com.ruoyi.framework.web.domain.AjaxResult; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @Service @@ -73,4 +79,96 @@ return deviceMaintenanceMapper.detailById(id); } @Autowired private DeviceLedgerMapper deviceLedgerMapper; @Override public List<DeviceMonthlyRepairTableDTO> getMonthlyRepairAmountByYear(String year) { List<RepairAmountGroupDTO> repairAmountGroupDTOS = deviceMaintenanceMapper.groupByMonthAndDeviceLedger(year); // 1. å éè¿è®¾å¤å°è´¦idå ³è设å¤åç§°ï¼å¦æRepairAmountGroupDTO没ædeviceNameï¼éå æ¥è®¾å¤å°è´¦è¡¨ï¼ // è¿éåè®¾ä½ è½éè¿deviceLedgerIdè·åå°deviceNameï¼æ¯å¦ï¼ Map<Long, String> deviceNameMap = new HashMap<>(); // key:deviceLedgerId, value:deviceName // ï¼å®é éè°ç¨è®¾å¤å°è´¦çMapperæ¥è¯¢ï¼deviceNameMap = deviceLedgerMapper.listAll().stream().collect(Collectors.toMap(DeviceLedger::getId, DeviceLedger::getDeviceName))ï¼ deviceNameMap = deviceLedgerMapper.selectList(null) .stream() .collect(Collectors.toMap(DeviceLedger::getId, DeviceLedger::getDeviceName)); if(CollectionUtils.isEmpty(deviceNameMap)){ return Collections.emptyList(); } // 2. æè®¾å¤åç§°åç»ï¼å卿¯ä¸ªè®¾å¤çåæéé¢ Map<String, DeviceMonthlyRepairTableDTO> deviceTableMap = new HashMap<>(); for (RepairAmountGroupDTO dto : repairAmountGroupDTOS) { // æårepairYearMonth为æä»½ï¼å¦"2025-01" â "01" â 1ï¼ String yearMonth = dto.getRepairYearMonth(); // æ ¼å¼ï¼yyyy-MM int month = Integer.parseInt(yearMonth); // æåMMå¹¶è½¬ææ°åï¼1-12ï¼ // è·å设å¤åç§° String deviceName = deviceNameMap.get(dto.getDeviceLedgerId()); if (deviceName == null) { deviceName = "æªç¥è®¾å¤"; // å åº } // ä»Mapä¸è·å该设å¤çè¡¨æ ¼DTOï¼ä¸åå¨ååå§å DeviceMonthlyRepairTableDTO tableDTO = deviceTableMap.getOrDefault(deviceName, new DeviceMonthlyRepairTableDTO()); tableDTO.setDeviceName(deviceName); // æ ¹æ®æä»½å¡«å éé¢ï¼BigDecimalé»è®¤0ï¼é¿å nullï¼ BigDecimal amount = dto.getTotalRepairPrice() == null ? BigDecimal.ZERO : dto.getTotalRepairPrice(); switch (month) { case 1: tableDTO.setMonth1(amount); break; case 2: tableDTO.setMonth2(amount); break; case 3: tableDTO.setMonth3(amount); break; case 4: tableDTO.setMonth4(amount); break; case 5: tableDTO.setMonth5(amount); break; case 6: tableDTO.setMonth6(amount); break; case 7: tableDTO.setMonth7(amount); break; case 8: tableDTO.setMonth8(amount); break; case 9: tableDTO.setMonth9(amount); break; case 10: tableDTO.setMonth10(amount); break; case 11: tableDTO.setMonth11(amount); break; case 12: tableDTO.setMonth12(amount); break; } // éæ°æ¾å ¥Map deviceTableMap.put(deviceName, tableDTO); } // 3. è®¡ç®æ¯ä¸ªè®¾å¤çæ»è®¡ï¼å¹¶è¡¥å åºå· List<DeviceMonthlyRepairTableDTO> resultList = new ArrayList<>(); for (DeviceMonthlyRepairTableDTO tableDTO : deviceTableMap.values()) { // è®¡ç®æ»è®¡ï¼1-12æéé¢ç¸å BigDecimal total = Stream.of( tableDTO.getMonth1(), tableDTO.getMonth2(), tableDTO.getMonth3(), tableDTO.getMonth4(), tableDTO.getMonth5(), tableDTO.getMonth6(), tableDTO.getMonth7(), tableDTO.getMonth8(), tableDTO.getMonth9(), tableDTO.getMonth10(), tableDTO.getMonth11(), tableDTO.getMonth12() ) .map(amt -> amt == null ? BigDecimal.ZERO : amt) .reduce(BigDecimal.ZERO, BigDecimal::add); tableDTO.setTotal(total); resultList.add(tableDTO); } return resultList; } @Override public List<RepairAmountGroupDTO> getRepairAmountByYear(String year) { List<RepairAmountGroupDTO> repairAmountGroupDTOS = deviceMaintenanceMapper.groupByDeviceLedger(year); Map<Long, String> deviceNameMap = new HashMap<>(); // key:deviceLedgerId, value:deviceName // ï¼å®é éè°ç¨è®¾å¤å°è´¦çMapperæ¥è¯¢ï¼deviceNameMap = deviceLedgerMapper.listAll().stream().collect(Collectors.toMap(DeviceLedger::getId, DeviceLedger::getDeviceName))ï¼ deviceNameMap = deviceLedgerMapper.selectList(null) .stream() .collect(Collectors.toMap(DeviceLedger::getId, DeviceLedger::getDeviceName)); if(CollectionUtils.isEmpty(deviceNameMap)){ return Collections.emptyList(); } Map<Long, String> finalDeviceNameMap = deviceNameMap; repairAmountGroupDTOS.forEach(dto -> { dto.setDeviceName(finalDeviceNameMap.get(dto.getDeviceLedgerId())); }); return repairAmountGroupDTOS; } } src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java
@@ -6,9 +6,12 @@ import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.device.dto.DeviceDefectRecordDto; import com.ruoyi.device.dto.DeviceMonthlyRepairTableDTO; import com.ruoyi.device.dto.DeviceRepairDto; import com.ruoyi.device.dto.RepairAmountGroupDTO; import com.ruoyi.device.execl.DeviceRepairExeclDto; import com.ruoyi.device.mapper.DeviceDefectRecordMapper; import com.ruoyi.device.mapper.DeviceLedgerMapper; import com.ruoyi.device.mapper.DeviceRepairMapper; import com.ruoyi.device.pojo.DeviceDefectRecord; import com.ruoyi.device.pojo.DeviceLedger; @@ -21,11 +24,13 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @Service @AllArgsConstructor @@ -116,4 +121,96 @@ return deviceRepairMapper.detailById(id); } @Autowired private DeviceLedgerMapper deviceLedgerMapper; @Override public List<DeviceMonthlyRepairTableDTO> getMonthlyRepairAmountByYear(String year) { List<RepairAmountGroupDTO> repairAmountGroupDTOS = deviceRepairMapper.groupByMonthAndDeviceLedger(year); // 1. å éè¿è®¾å¤å°è´¦idå ³è设å¤åç§°ï¼å¦æRepairAmountGroupDTO没ædeviceNameï¼éå æ¥è®¾å¤å°è´¦è¡¨ï¼ // è¿éåè®¾ä½ è½éè¿deviceLedgerIdè·åå°deviceNameï¼æ¯å¦ï¼ Map<Long, String> deviceNameMap = new HashMap<>(); // key:deviceLedgerId, value:deviceName // ï¼å®é éè°ç¨è®¾å¤å°è´¦çMapperæ¥è¯¢ï¼deviceNameMap = deviceLedgerMapper.listAll().stream().collect(Collectors.toMap(DeviceLedger::getId, DeviceLedger::getDeviceName))ï¼ deviceNameMap = deviceLedgerMapper.selectList(null) .stream() .collect(Collectors.toMap(DeviceLedger::getId, DeviceLedger::getDeviceName)); if(CollectionUtils.isEmpty(deviceNameMap)){ return Collections.emptyList(); } // 2. æè®¾å¤åç§°åç»ï¼å卿¯ä¸ªè®¾å¤çåæéé¢ Map<String, DeviceMonthlyRepairTableDTO> deviceTableMap = new HashMap<>(); for (RepairAmountGroupDTO dto : repairAmountGroupDTOS) { // æårepairYearMonth为æä»½ï¼å¦"2025-01" â "01" â 1ï¼ String yearMonth = dto.getRepairYearMonth(); // æ ¼å¼ï¼yyyy-MM int month = Integer.parseInt(yearMonth); // æåMMå¹¶è½¬ææ°åï¼1-12ï¼ // è·å设å¤åç§° String deviceName = deviceNameMap.get(dto.getDeviceLedgerId()); if (deviceName == null) { deviceName = "æªç¥è®¾å¤"; // å åº } // ä»Mapä¸è·å该设å¤çè¡¨æ ¼DTOï¼ä¸åå¨ååå§å DeviceMonthlyRepairTableDTO tableDTO = deviceTableMap.getOrDefault(deviceName, new DeviceMonthlyRepairTableDTO()); tableDTO.setDeviceName(deviceName); // æ ¹æ®æä»½å¡«å éé¢ï¼BigDecimalé»è®¤0ï¼é¿å nullï¼ BigDecimal amount = dto.getTotalRepairPrice() == null ? BigDecimal.ZERO : dto.getTotalRepairPrice(); switch (month) { case 1: tableDTO.setMonth1(amount); break; case 2: tableDTO.setMonth2(amount); break; case 3: tableDTO.setMonth3(amount); break; case 4: tableDTO.setMonth4(amount); break; case 5: tableDTO.setMonth5(amount); break; case 6: tableDTO.setMonth6(amount); break; case 7: tableDTO.setMonth7(amount); break; case 8: tableDTO.setMonth8(amount); break; case 9: tableDTO.setMonth9(amount); break; case 10: tableDTO.setMonth10(amount); break; case 11: tableDTO.setMonth11(amount); break; case 12: tableDTO.setMonth12(amount); break; } // éæ°æ¾å ¥Map deviceTableMap.put(deviceName, tableDTO); } // 3. è®¡ç®æ¯ä¸ªè®¾å¤çæ»è®¡ï¼å¹¶è¡¥å åºå· List<DeviceMonthlyRepairTableDTO> resultList = new ArrayList<>(); for (DeviceMonthlyRepairTableDTO tableDTO : deviceTableMap.values()) { // è®¡ç®æ»è®¡ï¼1-12æéé¢ç¸å BigDecimal total = Stream.of( tableDTO.getMonth1(), tableDTO.getMonth2(), tableDTO.getMonth3(), tableDTO.getMonth4(), tableDTO.getMonth5(), tableDTO.getMonth6(), tableDTO.getMonth7(), tableDTO.getMonth8(), tableDTO.getMonth9(), tableDTO.getMonth10(), tableDTO.getMonth11(), tableDTO.getMonth12() ) .map(amt -> amt == null ? BigDecimal.ZERO : amt) .reduce(BigDecimal.ZERO, BigDecimal::add); tableDTO.setTotal(total); resultList.add(tableDTO); } return resultList; } @Override public List<RepairAmountGroupDTO> getRepairAmountByYear(String year) { List<RepairAmountGroupDTO> repairAmountGroupDTOS = deviceRepairMapper.groupByDeviceLedger(year); Map<Long, String> deviceNameMap = new HashMap<>(); // key:deviceLedgerId, value:deviceName // ï¼å®é éè°ç¨è®¾å¤å°è´¦çMapperæ¥è¯¢ï¼deviceNameMap = deviceLedgerMapper.listAll().stream().collect(Collectors.toMap(DeviceLedger::getId, DeviceLedger::getDeviceName))ï¼ deviceNameMap = deviceLedgerMapper.selectList(null) .stream() .collect(Collectors.toMap(DeviceLedger::getId, DeviceLedger::getDeviceName)); if(CollectionUtils.isEmpty(deviceNameMap)){ return Collections.emptyList(); } Map<Long, String> finalDeviceNameMap = deviceNameMap; repairAmountGroupDTOS.forEach(dto -> { dto.setDeviceName(finalDeviceNameMap.get(dto.getDeviceLedgerId())); }); return repairAmountGroupDTOS; } } src/main/java/com/ruoyi/lavorissue/controller/DeptPositionController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,99 @@ package com.ruoyi.lavorissue.controller; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.controller.BaseController; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.lavorissue.pojo.DeptPosition; import com.ruoyi.lavorissue.service.DeptPositionService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; import java.util.List; /** * @author :yys * @date : 2025/11/19 13:20 */ @RestController @Api(tags = "é¨é¨å²ä½") @RequestMapping("/deptPosition") public class DeptPositionController extends BaseController { @Autowired private DeptPositionService deptPositionService; /** * éå½è·åé¨é¨å²ä½æ å½¢ç»æ * @return */ @GetMapping("/getDeptPositionTree") @Log(title = "éå½è·åé¨é¨å²ä½æ å½¢ç»æ", businessType = BusinessType.OTHER) @ApiOperation("éå½è·åé¨é¨å²ä½æ å½¢ç»æ") public AjaxResult getDeptPositionTree() { return deptPositionService.getDeptPositionTree(); } /** * æ¥è¯¢ææå²ä½å表 */ @GetMapping("/list") @Log(title = "æ¥è¯¢ææå²ä½å表", businessType = BusinessType.OTHER) @ApiOperation("æ¥è¯¢ææå²ä½å表") public AjaxResult list() { return AjaxResult.success(deptPositionService.list(Wrappers.lambdaQuery(DeptPosition.class) .eq(DeptPosition::getType, 2))); } /** * éè¿idé彿¥è¯¢ææçå²ä½,å¨éè¿å²ä½æ¥è¯¢å¯¹åºäººå * @param deptPosition * @return */ @GetMapping("/getDeptPositionByDeptId") @Log(title = "éè¿é¨é¨idé彿¥è¯¢ææçå²ä½", businessType = BusinessType.OTHER) @ApiOperation("éè¿é¨é¨idé彿¥è¯¢ææçå²ä½") public AjaxResult getDeptPositionByDeptId(@RequestBody DeptPosition deptPosition) { return AjaxResult.success(deptPositionService.getDeptPositionByDeptId(deptPosition)); } /** * éè¿idé彿¥è¯¢ææçå²ä½,å¨éè¿å²ä½æ¥è¯¢å¯¹åºå³ä¿ç¨å * @param deptPosition * @return */ @GetMapping("/getDeptPositionByDeptIdLabor") @Log(title = "éè¿idé彿¥è¯¢ææçå²ä½,å¨éè¿å²ä½æ¥è¯¢å¯¹åºå³ä¿ç¨å", businessType = BusinessType.OTHER) @ApiOperation("éè¿idé彿¥è¯¢ææçå²ä½,å¨éè¿å²ä½æ¥è¯¢å¯¹åºå³ä¿ç¨å") public AjaxResult getDeptPositionByDeptIdLabor(@RequestBody DeptPosition deptPosition) { return AjaxResult.success(deptPositionService.getDeptPositionByDeptIdLabor(deptPosition)); } @PostMapping("/addDeptPosition") @Log(title = "æ·»å é¨é¨å²ä½", businessType = BusinessType.INSERT) @ApiOperation("æ·»å é¨é¨å²ä½") public AjaxResult addDeptPosition(@RequestBody DeptPosition deptPosition) { return AjaxResult.success(deptPositionService.save(deptPosition)); } @PostMapping("/updateDeptPosition") @Log(title = "ä¿®æ¹é¨é¨å²ä½", businessType = BusinessType.UPDATE) @ApiOperation("ä¿®æ¹é¨é¨å²ä½") public AjaxResult updateDeptPosition(@RequestBody DeptPosition deptPosition) { return AjaxResult.success(deptPositionService.updateById(deptPosition)); } @DeleteMapping("/deleteDeptPosition") @Log(title = "å é¤é¨é¨å²ä½", businessType = BusinessType.DELETE) @ApiOperation("å é¤é¨é¨å²ä½") public AjaxResult deleteDeptPosition(@RequestBody List<Long> ids) { if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("è¯·éæ©è¦å é¤çé¨é¨å²ä½"); return AjaxResult.success(deptPositionService.removeBatchByIds(ids)); } } src/main/java/com/ruoyi/lavorissue/controller/LaborConfController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,58 @@ package com.ruoyi.lavorissue.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.controller.BaseController; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.lavorissue.pojo.LaborConf; import com.ruoyi.lavorissue.service.LaborConfService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; /** * @author :yys * @date : 2025/11/19 14:02 */ @RestController @Api(tags = "å³ä¿é ç½®") @RequestMapping("/laborConf") public class LaborConfController extends BaseController { @Autowired private LaborConfService laborConfService; @GetMapping("/listPage") @Log(title = "æ¥è¯¢å³ä¿é ç½®", businessType = BusinessType.OTHER) @ApiOperation("æ¥è¯¢å³ä¿é ç½®") public AjaxResult listPage(Page page, LaborConf laborConf) { return laborConfService.listPage(page, laborConf); } @PostMapping("/add") @Log(title = "æ·»å å³ä¿é ç½®", businessType = BusinessType.INSERT) @ApiOperation("æ·»å å³ä¿é ç½®") public AjaxResult add(@RequestBody LaborConf laborConf) { return laborConfService.save(laborConf) ? success() : error(); } @PostMapping("/update") @Log(title = "ä¿®æ¹å³ä¿é ç½®", businessType = BusinessType.UPDATE) @ApiOperation("ä¿®æ¹å³ä¿é ç½®") public AjaxResult update(@RequestBody LaborConf laborConf) { return laborConfService.updateById(laborConf) ? success() : error(); } @DeleteMapping("/delete") @Log(title = "å é¤å³ä¿é ç½®", businessType = BusinessType.DELETE) @ApiOperation("å é¤å³ä¿é ç½®") public AjaxResult delete(@RequestBody List<Long> ids) { return laborConfService.removeBatchByIds(ids) ? success() : error(); } } src/main/java/com/ruoyi/lavorissue/mapper/DeptPositionMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,14 @@ package com.ruoyi.lavorissue.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.lavorissue.pojo.DeptPosition; import java.util.List; /** * @author :yys * @date : 2025/11/19 13:19 */ public interface DeptPositionMapper extends BaseMapper<DeptPosition> { List<DeptPosition> getDeptPositionTree(List<DeptPosition> deptPositions); } src/main/java/com/ruoyi/lavorissue/mapper/LaborConfMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,15 @@ package com.ruoyi.lavorissue.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.lavorissue.pojo.LaborConf; import org.apache.ibatis.annotations.Param; /** * @author :yys * @date : 2025/11/19 14:00 */ public interface LaborConfMapper extends BaseMapper<LaborConf> { IPage<LaborConf> listPage(Page page,@Param("req") LaborConf laborConf); } src/main/java/com/ruoyi/lavorissue/pojo/DeptPosition.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,80 @@ package com.ruoyi.lavorissue.pojo; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDateTime; import java.util.Date; import java.util.List; /** * @author :yys * @date : 2025/11/19 11:58 */ @Data @TableName("dept_position") public class DeptPosition { private static final long serialVersionUID = 1L; @TableId(value = "id", type = IdType.AUTO) private Long id; @ApiModelProperty("ç¶id") private Long parentId; @ApiModelProperty("åç§°") private String name; /** * ç±»åï¼1-é¨é¨ 2-å²ä½ï¼ */ @ApiModelProperty("ç±»åï¼1-é¨é¨ 2-å²ä½ï¼") private Integer type; /** * æåº */ @ApiModelProperty("æåº") private Integer sort; @ApiModelProperty("åæ°æ®ï¼å²ä½ï¼") @TableField(exist = false) private List<DeptPosition> children; /** * å建è */ @TableField(fill = FieldFill.INSERT) private Integer createUser; /** * å建æ¶é´ */ @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; /** * ä¿®æ¹è */ @TableField(fill = FieldFill.INSERT_UPDATE) private Integer updateUser; /** * ä¿®æ¹æ¶é´ */ @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; /** * ç§æ·ID */ @TableField(fill = FieldFill.INSERT) private Long tenantId; } src/main/java/com/ruoyi/lavorissue/pojo/LaborConf.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,85 @@ package com.ruoyi.lavorissue.pojo; import com.baomidou.mybatisplus.annotation.*; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.time.LocalDateTime; import java.util.List; /** * @author :yys * @date : 2025/11/19 13:56 */ @Data @TableName("labor_conf") public class LaborConf { private static final long serialVersionUID = 1L; @TableId(value = "id", type = IdType.AUTO) private Long id; @ApiModelProperty("é¨é¨å²ä½è¡¨id") private Long deptPositionId; /** * é²å ·åç§°-åå ¸ */ @ApiModelProperty("é²å ·åç§°-åå ¸") private String dictId; /** * é²å ·åç§° */ @ApiModelProperty("é²å ·åç§°") @TableField(exist = false) private String dictName; /** * æ°é */ @ApiModelProperty("æ°é") private Integer num; /** * å£åº¦ï¼ç¬¬ä¸å£åº¦-1ç±»æ¨ï¼ */ @ApiModelProperty("å£åº¦ï¼ç¬¬ä¸å£åº¦-1ç±»æ¨ï¼") private Integer quarter; /** * å建è */ @TableField(fill = FieldFill.INSERT) private Integer createUser; /** * å建æ¶é´ */ @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; /** * ä¿®æ¹è */ @TableField(fill = FieldFill.INSERT_UPDATE) private Integer updateUser; /** * ä¿®æ¹æ¶é´ */ @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; /** * ç§æ·ID */ @TableField(fill = FieldFill.INSERT) private Long tenantId; } src/main/java/com/ruoyi/lavorissue/pojo/LaborIssue.java
@@ -34,10 +34,16 @@ private Integer season; /** * é¨é¨åç§° * é¨é¨å²ä½id */ @ApiModelProperty("é¨é¨åç§°") @Excel(name = "é¨é¨åç§°") @ApiModelProperty("é¨é¨å²ä½id") private Integer deptPositionName; /** * é¨é¨å²ä½åç§° */ @ApiModelProperty("é¨é¨å²ä½åç§°") @Excel(name = "é¨é¨å²ä½åç§°") @TableField(exist = false) private String deptName; src/main/java/com/ruoyi/lavorissue/service/DeptPositionService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,27 @@ package com.ruoyi.lavorissue.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.lavorissue.pojo.DeptPosition; import com.ruoyi.lavorissue.pojo.LaborConf; import com.ruoyi.staff.pojo.StaffJoinLeaveRecord; import com.ruoyi.staff.pojo.StaffOnJob; import java.util.List; /** * @author :yys * @date : 2025/11/19 13:21 */ public interface DeptPositionService extends IService<DeptPosition> { /** * éå½è·åé¨é¨å²ä½æ å½¢ç»æ * @return */ AjaxResult getDeptPositionTree(); List<StaffOnJob> getDeptPositionByDeptId(DeptPosition deptPosition); List<LaborConf> getDeptPositionByDeptIdLabor(DeptPosition deptPosition); } src/main/java/com/ruoyi/lavorissue/service/LaborConfService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,14 @@ package com.ruoyi.lavorissue.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.lavorissue.pojo.LaborConf; /** * @author :yys * @date : 2025/11/19 14:00 */ public interface LaborConfService extends IService<LaborConf> { AjaxResult listPage(Page page, LaborConf laborConf); } src/main/java/com/ruoyi/lavorissue/service/impl/DeptPositionServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,207 @@ package com.ruoyi.lavorissue.service.impl; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.lavorissue.mapper.DeptPositionMapper; import com.ruoyi.lavorissue.mapper.LaborConfMapper; import com.ruoyi.lavorissue.pojo.DeptPosition; import com.ruoyi.lavorissue.pojo.LaborConf; import com.ruoyi.lavorissue.service.DeptPositionService; import com.ruoyi.staff.mapper.StaffOnJobMapper; import com.ruoyi.staff.pojo.StaffJoinLeaveRecord; import com.ruoyi.staff.pojo.StaffOnJob; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.util.*; import java.util.stream.Collectors; /** * @author :yys * @date : 2025/11/19 13:21 */ @Service @Slf4j public class DeptPositionServiceImpl extends ServiceImpl<DeptPositionMapper, DeptPosition> implements DeptPositionService { @Autowired private DeptPositionMapper deptPositionMapper; /** * éå½è·åé¨é¨å²ä½æ å½¢ç»æ * @return */ @Override public AjaxResult getDeptPositionTree() { List<DeptPosition> deptPositions = deptPositionMapper.selectList(null); // 2. çéæ ¹é¨é¨ï¼parentId为0ænullï¼ä¸ç±»å为é¨é¨type=1ï¼ List<DeptPosition> rootDepts = deptPositions.stream() .filter(item -> (item.getParentId() == null || item.getParentId() == 0) && item.getType() == 1) // æ ¹èç¹å¿ é¡»æ¯é¨é¨ .sorted(Comparator.comparingInt(DeptPosition::getSort)) // ææåºå段ååº .collect(Collectors.toList()); // 3. 为æ¯ä¸ªæ ¹é¨é¨é彿¥æ¾ä¸å±å²ä½ï¼åéï¼ for (DeptPosition rootDept : rootDepts) { buildDeptChildren(rootDept, deptPositions); } return AjaxResult.success(rootDepts); } @Autowired private StaffOnJobMapper staffOnJobMapper; /** * éè¿idé彿¥è¯¢ææçå²ä½ * @param deptPosition * @return */ @Override public List<StaffOnJob> getDeptPositionByDeptId(DeptPosition deptPosition) { Long deptId = deptPosition.getId(); // 1. æ ¡éªé¨é¨æ¯å¦åå¨ DeptPosition dept = deptPositionMapper.selectById(deptId); if (dept == null) { throw new IllegalArgumentException("æ æçé¨é¨æå²ä½ID"); } if(dept.getType() == 2){ return staffOnJobMapper.selectList(Wrappers.lambdaQuery(StaffOnJob.class) .eq(StaffOnJob::getStaffState, 1) .eq(StaffOnJob::getDeptPositionId, deptId)); } // 2. éå½è·åå½åé¨é¨åææåé¨é¨çIDéå Set<Long> deptIdSet = new HashSet<>(); // å æ·»å å½åé¨é¨ID deptIdSet.add(deptId); // éå½è·åææåé¨é¨ID findAllChildDeptIds(deptId, deptIdSet); // 3. æ¥è¯¢è¿äºé¨é¨ä¸çææå²ä½ï¼type=2ï¼ if (deptIdSet.isEmpty()) { return Collections.emptyList(); } List<DeptPosition> deptPositions = deptPositionMapper.selectList( Wrappers.<DeptPosition>lambdaQuery() .in(DeptPosition::getParentId, deptIdSet) // ç¶IDå¨é¨é¨IDéåä¸ .eq(DeptPosition::getType, 2) // ç±»å为å²ä½ .orderByAsc(DeptPosition::getSort) // ææåºå段ååº ); if(CollectionUtils.isEmpty(deptPositions)){ return Collections.emptyList(); } return staffOnJobMapper.selectList(Wrappers.lambdaQuery(StaffOnJob.class) .eq(StaffOnJob::getStaffState, 1) .in(StaffOnJob::getDeptPositionId, deptPositions .stream() .map(DeptPosition::getId) .collect(Collectors.toSet()))); } @Autowired private LaborConfMapper laborConfMapper; @Override public List<LaborConf> getDeptPositionByDeptIdLabor(DeptPosition deptPosition) { Long deptId = deptPosition.getId(); // 1. æ ¡éªé¨é¨æ¯å¦åå¨ DeptPosition dept = deptPositionMapper.selectById(deptId); if (dept == null) { throw new IllegalArgumentException("æ æçé¨é¨æå²ä½ID"); } if(dept.getType() == 2){ return laborConfMapper.selectList(Wrappers.lambdaQuery(LaborConf.class) .eq(LaborConf::getDeptPositionId, deptId)); } // 2. éå½è·åå½åé¨é¨åææåé¨é¨çIDéå Set<Long> deptIdSet = new HashSet<>(); // å æ·»å å½åé¨é¨ID deptIdSet.add(deptId); // éå½è·åææåé¨é¨ID findAllChildDeptIds(deptId, deptIdSet); // 3. æ¥è¯¢è¿äºé¨é¨ä¸çææå²ä½ï¼type=2ï¼ if (deptIdSet.isEmpty()) { return Collections.emptyList(); } List<DeptPosition> deptPositions = deptPositionMapper.selectList( Wrappers.<DeptPosition>lambdaQuery() .in(DeptPosition::getParentId, deptIdSet) // ç¶IDå¨é¨é¨IDéåä¸ .eq(DeptPosition::getType, 2) // ç±»å为å²ä½ .orderByAsc(DeptPosition::getSort) // ææåºå段ååº ); if(CollectionUtils.isEmpty(deptPositions)){ return Collections.emptyList(); } return laborConfMapper.selectList(Wrappers.lambdaQuery(LaborConf.class) .in(LaborConf::getDeptPositionId, deptPositions.stream() .map(DeptPosition::getId) .collect(Collectors.toSet()))); } /** * éå½è·åææåé¨é¨IDï¼ä» å æ¬type=1çé¨é¨ï¼ * @param parentDeptId ç¶é¨é¨ID * @param deptIdSet åå¨é¨é¨IDçéåï¼å¼ç¨ä¼ éï¼æç»æ·»å åé¨é¨IDï¼ */ private void findAllChildDeptIds(Long parentDeptId, Set<Long> deptIdSet) { // æ¥è¯¢å½åç¶é¨é¨ä¸çææåé¨é¨ï¼type=1ï¼ List<DeptPosition> childDepts = deptPositionMapper.selectList( Wrappers.<DeptPosition>lambdaQuery() .eq(DeptPosition::getParentId, parentDeptId) .eq(DeptPosition::getType, 1) // åªæ¥åé¨é¨ï¼ä¸æ¥å²ä½ ); // è¥æåé¨é¨ï¼æ·»å IDå°éåï¼å¹¶ç»§ç»é彿¥è¯¢å ¶åé¨é¨ if (!childDepts.isEmpty()) { for (DeptPosition childDept : childDepts) { Long childDeptId = childDept.getId(); deptIdSet.add(childDeptId); // æ·»å åé¨é¨ID findAllChildDeptIds(childDeptId, deptIdSet); // é彿¥è¯¢è¯¥åé¨é¨çåé¨é¨ } } } /** * éå½æå»ºé¨é¨çåèç¹ï¼å¯è½æ¯åé¨é¨æå²ä½ï¼ * @param parent ç¶èç¹ï¼é¨é¨ï¼ * @param allList æææ°æ® */ private void buildDeptChildren(DeptPosition parent, List<DeptPosition> allList) { // ç¬¬ä¸æ¥ï¼æ¥æ¾å½åé¨é¨çåé¨é¨ï¼type=1ï¼ï¼æå»ºé¨é¨å±çº§ List<DeptPosition> childDepts = allList.stream() .filter(item -> parent.getId().equals(item.getParentId()) && item.getType() == 1) // åèç¹æ¯é¨é¨ .sorted(Comparator.comparingInt(DeptPosition::getSort)) .collect(Collectors.toList()); // ç¬¬äºæ¥ï¼æ¥æ¾å½åé¨é¨çå²ä½ï¼type=2ï¼ï¼ä½ä¸ºåèç¹ List<DeptPosition> childPositions = allList.stream() .filter(item -> parent.getId().equals(item.getParentId()) && item.getType() == 2) // åèç¹æ¯å²ä½ .sorted(Comparator.comparingInt(DeptPosition::getSort)) .collect(Collectors.toList()); // åå¹¶åé¨é¨åå²ä½ï¼åé¨é¨å¨åï¼å²ä½å¨åï¼ææsortæåºï¼ List<DeptPosition> allChildren = new ArrayList<>(); allChildren.addAll(childDepts); allChildren.addAll(childPositions); // 设置åèç¹ if (!allChildren.isEmpty()) { parent.setChildren(allChildren); // éå½å¤çåé¨é¨ï¼å²ä½æ ééå½ï¼å 为å²ä½æ¯å¶åèç¹ï¼ for (DeptPosition child : childDepts) { buildDeptChildren(child, allList); // åé¨é¨ç»§ç»æ¾å®çåèç¹ } } } } src/main/java/com/ruoyi/lavorissue/service/impl/LaborConfServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,29 @@ package com.ruoyi.lavorissue.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.lavorissue.mapper.LaborConfMapper; import com.ruoyi.lavorissue.pojo.LaborConf; import com.ruoyi.lavorissue.service.LaborConfService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * @author :yys * @date : 2025/11/19 14:01 */ @Service @Slf4j public class LaborConfServiceImpl extends ServiceImpl<LaborConfMapper, LaborConf> implements LaborConfService { @Autowired private LaborConfMapper laborConfMapper; @Override public AjaxResult listPage(Page page, LaborConf laborConf) { return AjaxResult.success(laborConfMapper.listPage(page, laborConf)); } } src/main/java/com/ruoyi/staff/pojo/StaffJoinLeaveRecord.java
@@ -68,10 +68,14 @@ private String nativePlace; /** * å²ä½ * é¨é¨å²ä½id */ // @Excel(name = "å²ä½") private Integer deptPositionId; @TableField(exist = false) @Excel(name = "å²ä½") private String postJob; private String deptPositionName; /** * å®¶åºä½å src/main/java/com/ruoyi/staff/pojo/StaffOnJob.java
@@ -57,10 +57,14 @@ private String nativePlace; /** * å²ä½ * é¨é¨å²ä½id */ // @Excel(name = "å²ä½") private Integer deptPositionId; @TableField(exist = false) @Excel(name = "å²ä½") private String postJob; private String deptPositionName; /** * å®¶åºä½å src/main/resources/application-jyhjCopy.yml
@@ -62,9 +62,9 @@ druid: # ä¸»åºæ°æ®æº master: url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-jyhj?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 url: jdbc:mysql://localhost:3306/product-inventory-management-jyhj?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: xd@123456.. password: 123456 # ä»åºæ°æ®æº slave: # 仿°æ®æºå¼å ³/é»è®¤å ³é src/main/resources/mapper/device/DeviceMaintenanceMapper.xml
@@ -20,7 +20,8 @@ dm.maintenance_actually_name, dl.device_name, dl.device_model, su.user_name as create_user_name su.user_name as create_user_name, dm.maintenance_price from device_maintenance dm left join device_ledger dl on dm.device_ledger_id = dl.id left join sys_user su on dm.create_user = su.user_id src/main/resources/mapper/device/DeviceRepairMapper.xml
@@ -19,6 +19,7 @@ dr.update_time, dr.create_user, dr.update_user, dr.repair_price, dr.tenant_id, dl.device_name, dl.device_model src/main/resources/mapper/lavorissue/LaborConfMapper.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.ruoyi.lavorissue.mapper.LaborConfMapper"> <select id="listPage" resultType="com.ruoyi.lavorissue.pojo.LaborConf"> SELECT t1.*, t3.dict_label as dictName FROM labor_conf t1 left join sys_dict_data t3 on t1.dict_id = t3.dict_value <where> <if test="req.deptPositionId != null"> AND t1.dept_position_id = #{req.deptPositionId} </if> </where> </select> </mapper> src/main/resources/mapper/lavorissue/LavorIssueMapper.xml
@@ -8,11 +8,13 @@ t2.staff_name as staffName, t2.staff_no as staffNo, t3.dict_label as dictName, t4.dict_label as dictTypeName t4.dict_label as dictTypeName, t5.name as deptName from labor_issue t1 left join staff_join_leave_record t2 on t1.staff_id = t2.id left join sys_dict_data t3 on t1.dict_id = t3.dict_value left join sys_dict_data t4 on t1.dict_type = t4.dict_value left join dept_position t5 on t1.dept_position_id = t5.id <where> <if test="req.season != null and req.season != ''"> and (t1.issue_date >= #{req.startDate} and t1.issue_date <= #{req.endDate}) @@ -43,11 +45,13 @@ t2.staff_name as staffName, t2.staff_no as staffNo, t3.dict_label as dictName, t4.dict_label as dictTypeName t4.dict_label as dictTypeName, t5.name as deptName from labor_issue t1 left join staff_join_leave_record t2 on t1.staff_id = t2.id left join sys_dict_data t3 on t1.dict_id = t3.dict_value left join sys_dict_data t4 on t1.dict_type = t4.dict_value left join dept_position t5 on t1.dept_position_id = t5.id <where> <if test="req.adoptedDate != null"> and t1.adopted_date is null src/main/resources/mapper/staff/StaffJoinLeaveRecordMapper.xml
@@ -3,20 +3,22 @@ <mapper namespace="com.ruoyi.staff.mapper.StaffJoinLeaveRecordMapper"> <select id="staffJoinLeaveRecordListPage" resultType="com.ruoyi.staff.pojo.StaffJoinLeaveRecord"> SELECT * FROM staff_join_leave_record t1.*, t2.name as deptPositionName FROM staff_join_leave_record t1 left join dept_position t2 on t1.dept_position_id = t2.id and t2.type = 2 where staff_state = #{staffJoinLeaveRecord.staffState} <if test="staffJoinLeaveRecord.staffName != null and staffJoinLeaveRecord.staffName != '' "> AND staff_name LIKE CONCAT('%',#{staffJoinLeaveRecord.staffName},'%') AND t1.staff_name LIKE CONCAT('%',#{staffJoinLeaveRecord.staffName},'%') </if> <if test="staffJoinLeaveRecord.entryDateStart != null and staffJoinLeaveRecord.entryDateStart != '' "> and contract_start_time like concat('%',#{staffJoinLeaveRecord.entryDateStart},'%') and t1.contract_start_time like concat('%',#{staffJoinLeaveRecord.entryDateStart},'%') </if> <if test="staffJoinLeaveRecord.entryDateEnd != null and staffJoinLeaveRecord.entryDateEnd != '' "> and contract_end_time like concat('%',#{staffJoinLeaveRecord.entryDateEnd},'%') and t1.contract_end_time like concat('%',#{staffJoinLeaveRecord.entryDateEnd},'%') </if> order by create_time desc order by t1.create_time desc </select> <select id="staffJoinLeaveRecordList" resultType="com.ruoyi.staff.pojo.StaffJoinLeaveRecord"> SELECT src/main/resources/mapper/staff/StaffOnJobMapper.xml
@@ -3,20 +3,22 @@ <mapper namespace="com.ruoyi.staff.mapper.StaffOnJobMapper"> <select id="staffOnJobListPage" resultType="com.ruoyi.staff.pojo.StaffOnJob"> SELECT * FROM staff_on_job t1.*, t2.name as deptPositionName FROM staff_on_job t1 left join dept_position t2 on t1.dept_position_id = t2.id and t2.type = 2 where 1=1 <if test="staffOnJob.staffState != null and staffOnJob.staffState != '' "> AND staff_state = #{staffOnJob.staffState} AND t1.staff_state = #{staffOnJob.staffState} </if> <if test="staffOnJob.staffName != null and staffOnJob.staffName != '' "> AND staff_name LIKE CONCAT('%',#{staffOnJob.staffName},'%') AND t1.staff_name LIKE CONCAT('%',#{staffOnJob.staffName},'%') </if> <if test="staffOnJob.entryDateStart != null and staffOnJob.entryDateStart != '' "> AND contract_expire_time >= DATE_FORMAT(#{staffOnJob.entryDateStart},'%Y-%m-%d') AND t1.contract_expire_time >= DATE_FORMAT(#{staffOnJob.entryDateStart},'%Y-%m-%d') </if> <if test="staffOnJob.entryDateEnd != null and staffOnJob.entryDateEnd != '' "> AND contract_expire_time <= DATE_FORMAT(#{staffOnJob.entryDateEnd},'%Y-%m-%d') AND t1.contract_expire_time <= DATE_FORMAT(#{staffOnJob.entryDateEnd},'%Y-%m-%d') </if> </select> <select id="staffOnJobList" resultType="com.ruoyi.staff.pojo.StaffOnJob">