Commit f58b666fdd69ae05926294326134753c4e450caa
1 parent
253d1832
feat: 按照时间段导出日期
Showing
6 changed files
with
101 additions
and
3 deletions
Bsth-admin/src/main/java/com/ruoyi/common/ReportProperties.java
Bsth-admin/src/main/java/com/ruoyi/driver/mapper/DriverSchedulingMapper.java
| @@ -2,6 +2,7 @@ package com.ruoyi.driver.mapper; | @@ -2,6 +2,7 @@ package com.ruoyi.driver.mapper; | ||
| 2 | 2 | ||
| 3 | import com.ruoyi.domain.DriverScheduling; | 3 | import com.ruoyi.domain.DriverScheduling; |
| 4 | import com.ruoyi.driver.domain.Driver; | 4 | import com.ruoyi.driver.domain.Driver; |
| 5 | +import com.ruoyi.pojo.response.ExportReportViewResponseVo; | ||
| 5 | import org.apache.ibatis.annotations.Param; | 6 | import org.apache.ibatis.annotations.Param; |
| 6 | import org.apache.ibatis.annotations.Select; | 7 | import org.apache.ibatis.annotations.Select; |
| 7 | 8 | ||
| @@ -29,5 +30,6 @@ public interface DriverSchedulingMapper { | @@ -29,5 +30,6 @@ public interface DriverSchedulingMapper { | ||
| 29 | @Select("select count(*) from equipment") | 30 | @Select("select count(*) from equipment") |
| 30 | Integer queryNumberByDevice(); | 31 | Integer queryNumberByDevice(); |
| 31 | 32 | ||
| 32 | - void updateDriverInfo(@Param("driver") Driver driver,@Param("date")String date); | 33 | + |
| 34 | + List<DriverScheduling> queryByMonth(@Param("startDate") String startDate,@Param("endDate") String endDate); | ||
| 33 | } | 35 | } |
Bsth-admin/src/main/java/com/ruoyi/pojo/request/ReportViewRequestVo.java
| @@ -49,4 +49,10 @@ public class ReportViewRequestVo { | @@ -49,4 +49,10 @@ public class ReportViewRequestVo { | ||
| 49 | @ApiModelProperty("查询各个阶段超时的人员 0 全部 1 第一次打卡 2 第二卡打卡 3 第三次打卡 4 第四次打卡") | 49 | @ApiModelProperty("查询各个阶段超时的人员 0 全部 1 第一次打卡 2 第二卡打卡 3 第三次打卡 4 第四次打卡") |
| 50 | Integer stage; | 50 | Integer stage; |
| 51 | 51 | ||
| 52 | + @ApiModelProperty("开始时间") | ||
| 53 | + String startDate; | ||
| 54 | + | ||
| 55 | + @ApiModelProperty("结束时间") | ||
| 56 | + String endDate; | ||
| 57 | + | ||
| 52 | } | 58 | } |
Bsth-admin/src/main/java/com/ruoyi/pojo/response/ExportReportViewResponseVo.java
| @@ -4,11 +4,13 @@ import com.alibaba.excel.annotation.ExcelProperty; | @@ -4,11 +4,13 @@ import com.alibaba.excel.annotation.ExcelProperty; | ||
| 4 | import com.alibaba.excel.annotation.write.style.ColumnWidth; | 4 | import com.alibaba.excel.annotation.write.style.ColumnWidth; |
| 5 | import com.alibaba.excel.annotation.write.style.HeadFontStyle; | 5 | import com.alibaba.excel.annotation.write.style.HeadFontStyle; |
| 6 | import com.alibaba.excel.annotation.write.style.HeadRowHeight; | 6 | import com.alibaba.excel.annotation.write.style.HeadRowHeight; |
| 7 | +import com.fasterxml.jackson.annotation.JsonFormat; | ||
| 7 | import com.ruoyi.common.utils.bean.BeanUtils; | 8 | import com.ruoyi.common.utils.bean.BeanUtils; |
| 8 | import com.ruoyi.domain.DriverScheduling; | 9 | import com.ruoyi.domain.DriverScheduling; |
| 9 | import io.swagger.annotations.ApiModel; | 10 | import io.swagger.annotations.ApiModel; |
| 10 | import io.swagger.annotations.ApiModelProperty; | 11 | import io.swagger.annotations.ApiModelProperty; |
| 11 | import lombok.Data; | 12 | import lombok.Data; |
| 13 | +import org.springframework.format.annotation.DateTimeFormat; | ||
| 12 | 14 | ||
| 13 | import java.math.BigDecimal; | 15 | import java.math.BigDecimal; |
| 14 | import java.util.Date; | 16 | import java.util.Date; |
| @@ -157,6 +159,8 @@ public class ExportReportViewResponseVo { | @@ -157,6 +159,8 @@ public class ExportReportViewResponseVo { | ||
| 157 | @ApiModelProperty("排班日期") | 159 | @ApiModelProperty("排班日期") |
| 158 | @ExcelProperty(value = "排班日期") | 160 | @ExcelProperty(value = "排班日期") |
| 159 | @ColumnWidth(20) | 161 | @ColumnWidth(20) |
| 162 | + @DateTimeFormat(pattern = "yyyy-MM-dd") | ||
| 163 | + @JsonFormat(pattern = "yyyy-MM-dd") | ||
| 160 | private Date scheduleDate; | 164 | private Date scheduleDate; |
| 161 | 165 | ||
| 162 | public ExportReportViewResponseVo(List<DriverScheduling> driverScheduling) { | 166 | public ExportReportViewResponseVo(List<DriverScheduling> driverScheduling) { |
Bsth-admin/src/main/java/com/ruoyi/service/ReportService.java
| @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollectionUtil; | @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollectionUtil; | ||
| 4 | import com.ruoyi.common.global.Result; | 4 | import com.ruoyi.common.global.Result; |
| 5 | import com.ruoyi.common.global.ResultCode; | 5 | import com.ruoyi.common.global.ResultCode; |
| 6 | import com.ruoyi.common.utils.SecurityUtils; | 6 | import com.ruoyi.common.utils.SecurityUtils; |
| 7 | +import com.ruoyi.common.utils.StringUtils; | ||
| 7 | import com.ruoyi.driver.mapper.DriverMapper; | 8 | import com.ruoyi.driver.mapper.DriverMapper; |
| 8 | import com.ruoyi.driver.mapper.DriverSchedulingMapper; | 9 | import com.ruoyi.driver.mapper.DriverSchedulingMapper; |
| 9 | import com.ruoyi.eexception.mapper.EquipmentExceptionMapper; | 10 | import com.ruoyi.eexception.mapper.EquipmentExceptionMapper; |
| @@ -27,7 +28,11 @@ import javax.validation.constraints.NotBlank; | @@ -27,7 +28,11 @@ import javax.validation.constraints.NotBlank; | ||
| 27 | import java.time.LocalDate; | 28 | import java.time.LocalDate; |
| 28 | import java.time.YearMonth; | 29 | import java.time.YearMonth; |
| 29 | import java.time.format.DateTimeFormatter; | 30 | import java.time.format.DateTimeFormatter; |
| 31 | +import java.time.temporal.ChronoUnit; | ||
| 30 | import java.util.*; | 32 | import java.util.*; |
| 33 | +import java.util.concurrent.ExecutorService; | ||
| 34 | +import java.util.concurrent.Executors; | ||
| 35 | +import java.util.concurrent.TimeUnit; | ||
| 31 | import java.util.regex.Matcher; | 36 | import java.util.regex.Matcher; |
| 32 | import java.util.regex.Pattern; | 37 | import java.util.regex.Pattern; |
| 33 | import java.util.stream.Collectors; | 38 | import java.util.stream.Collectors; |
| @@ -35,8 +40,7 @@ import java.util.stream.Collectors; | @@ -35,8 +40,7 @@ import java.util.stream.Collectors; | ||
| 35 | import static com.ruoyi.common.ApiProperties.PERSONNEL_API_KEY; | 40 | import static com.ruoyi.common.ApiProperties.PERSONNEL_API_KEY; |
| 36 | import static com.ruoyi.common.ConstDriverProperties.BC_TYPE_OUT; | 41 | import static com.ruoyi.common.ConstDriverProperties.BC_TYPE_OUT; |
| 37 | import static com.ruoyi.common.ConstSignInConstSignInProperties.*; | 42 | import static com.ruoyi.common.ConstSignInConstSignInProperties.*; |
| 38 | -import static com.ruoyi.common.ReportProperties.DAY; | ||
| 39 | -import static com.ruoyi.common.ReportProperties.MONTH; | 43 | +import static com.ruoyi.common.ReportProperties.*; |
| 40 | 44 | ||
| 41 | /** | 45 | /** |
| 42 | * @author 20412 | 46 | * @author 20412 |
| @@ -101,9 +105,74 @@ public class ReportService { | @@ -101,9 +105,74 @@ public class ReportService { | ||
| 101 | else if (requestVo.getExportFlag().equals(MONTH)) { | 105 | else if (requestVo.getExportFlag().equals(MONTH)) { |
| 102 | return getMonthReportTableResponseVo(requestVo); | 106 | return getMonthReportTableResponseVo(requestVo); |
| 103 | } | 107 | } |
| 108 | + // 处理导出任意时间段 后台追加限制条件 366 天为最长导出时间 | ||
| 109 | + else if (requestVo.getExportFlag().equals(TIME_PERIOD)) { | ||
| 110 | + return getTimePeriodReportTableResponseVo(requestVo); | ||
| 111 | + } | ||
| 104 | return null; | 112 | return null; |
| 105 | } | 113 | } |
| 106 | 114 | ||
| 115 | + private List<ExportReportViewResponseVo> getTimePeriodReportTableResponseVo(ReportViewRequestVo requestVo) { | ||
| 116 | + String startDate = requestVo.getStartDate(); | ||
| 117 | + String endDate = requestVo.getEndDate(); | ||
| 118 | + LocalDate startLocalDate = LocalDate.parse(startDate); | ||
| 119 | + LocalDate endLocalDate = LocalDate.parse(endDate); | ||
| 120 | + | ||
| 121 | + long days = ChronoUnit.DAYS.between(startLocalDate, endLocalDate); | ||
| 122 | + long timePeriod = 366; | ||
| 123 | + if (days > timePeriod) { | ||
| 124 | + throw new RuntimeException("时间段不能超过" + timePeriod + "天"); | ||
| 125 | + } | ||
| 126 | + List<ExportReportViewResponseVo> voList = new ArrayList<>(); | ||
| 127 | + // 分段查询 | ||
| 128 | + spiteQueryResult(startLocalDate, endLocalDate, voList); | ||
| 129 | + | ||
| 130 | + return voList; | ||
| 131 | + } | ||
| 132 | + | ||
| 133 | + private void spiteQueryResult(LocalDate startLocalDate, LocalDate endLocalDate, List<ExportReportViewResponseVo> voList) { | ||
| 134 | + // 1 时间按月分段 | ||
| 135 | + String split = "p"; | ||
| 136 | + List<String> localDates = splitByMonth(startLocalDate, endLocalDate, split); | ||
| 137 | + // 2 按月创建多线程 | ||
| 138 | + ExecutorService pool = Executors.newFixedThreadPool(localDates.size()); | ||
| 139 | + // 3 | ||
| 140 | + for (String date : localDates) { | ||
| 141 | + pool.execute(new Runnable() { | ||
| 142 | + @Override | ||
| 143 | + public void run() { | ||
| 144 | + String[] dateSplit = date.split(split); | ||
| 145 | + List<DriverScheduling> vos = schedulingMapper.queryByMonth(dateSplit[0], dateSplit[1]); | ||
| 146 | + Map<String, List<DriverScheduling>> resultMap = new HashMap<>(); | ||
| 147 | + handlerResultMap(resultMap, vos); | ||
| 148 | + handleResultList(voList, resultMap); | ||
| 149 | + } | ||
| 150 | + }); | ||
| 151 | + } | ||
| 152 | + pool.shutdown(); | ||
| 153 | + try { | ||
| 154 | + // 等待所有任务执行完毕或超时 | ||
| 155 | + pool.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); | ||
| 156 | + } catch (InterruptedException e) { | ||
| 157 | + throw new RuntimeException("导出失败,请尝试刷新页面重新导出或者联系管理员"); | ||
| 158 | + } | ||
| 159 | + } | ||
| 160 | + | ||
| 161 | + private static List<String> splitByMonth(LocalDate startDate, LocalDate endDate, String split) { | ||
| 162 | + List<String> dates = new ArrayList<>(); | ||
| 163 | + LocalDate currentMonthStart = startDate; | ||
| 164 | + LocalDate currentMonthEnd; | ||
| 165 | + while (currentMonthStart.isBefore(endDate) || currentMonthStart.isEqual(endDate)) { | ||
| 166 | + currentMonthEnd = currentMonthStart.withDayOfMonth(currentMonthStart.lengthOfMonth()); | ||
| 167 | + if (currentMonthEnd.isAfter(endDate)) { | ||
| 168 | + currentMonthEnd = endDate; | ||
| 169 | + } | ||
| 170 | + dates.add(currentMonthStart + split + currentMonthEnd); | ||
| 171 | + currentMonthStart = currentMonthEnd.plusDays(1); | ||
| 172 | + } | ||
| 173 | + return dates; | ||
| 174 | + } | ||
| 175 | + | ||
| 107 | private List<ExportReportViewResponseVo> getDayReportTableResponseVo(String date) { | 176 | private List<ExportReportViewResponseVo> getDayReportTableResponseVo(String date) { |
| 108 | List<DriverScheduling> schedulingList = schedulingMapper.queryToDay(date, null, null, null); | 177 | List<DriverScheduling> schedulingList = schedulingMapper.queryToDay(date, null, null, null); |
| 109 | Map<String, List<DriverScheduling>> resultMap = new HashMap<>(800); | 178 | Map<String, List<DriverScheduling>> resultMap = new HashMap<>(800); |
| @@ -131,6 +200,17 @@ public class ReportService { | @@ -131,6 +200,17 @@ public class ReportService { | ||
| 131 | } | 200 | } |
| 132 | } | 201 | } |
| 133 | 202 | ||
| 203 | + private void handlerResultMap(Map<String, List<DriverScheduling>> resultMap, List<DriverScheduling> schedulingList) { | ||
| 204 | + for (DriverScheduling item : schedulingList) { | ||
| 205 | + String key = item.getScheduleDate() + item.getJobCode(); | ||
| 206 | + if (Objects.isNull(resultMap.get(key))) { | ||
| 207 | + resultMap.put(key, new ArrayList<>(Arrays.asList(item))); | ||
| 208 | + } else { | ||
| 209 | + resultMap.get(key).add(item); | ||
| 210 | + } | ||
| 211 | + } | ||
| 212 | + } | ||
| 213 | + | ||
| 134 | private List<ExportReportViewResponseVo> getMonthReportTableResponseVo(ReportViewRequestVo requestVo) { | 214 | private List<ExportReportViewResponseVo> getMonthReportTableResponseVo(ReportViewRequestVo requestVo) { |
| 135 | List<ExportReportViewResponseVo> responseVos = new ArrayList<>(10000); | 215 | List<ExportReportViewResponseVo> responseVos = new ArrayList<>(10000); |
| 136 | List<String> days = getNowMonthAllDay(requestVo.getDate()); | 216 | List<String> days = getNowMonthAllDay(requestVo.getDate()); |
Bsth-admin/src/main/resources/mapper/driver_scheduling/DriverSchedulingMapper.xml
| @@ -70,4 +70,9 @@ | @@ -70,4 +70,9 @@ | ||
| 70 | </if> | 70 | </if> |
| 71 | 71 | ||
| 72 | </select> | 72 | </select> |
| 73 | + <select id="queryByMonth" resultType="com.ruoyi.domain.DriverScheduling" resultMap="Scheduling"> | ||
| 74 | + select scheduling.*,driver.fleet_name fleetName from | ||
| 75 | + scheduling left join driver on driver.job_code = scheduling.job_code | ||
| 76 | + where schedule_date >= #{startDate} and schedule_date <= #{endDate} | ||
| 77 | + </select> | ||
| 73 | </mapper> | 78 | </mapper> |
| 74 | \ No newline at end of file | 79 | \ No newline at end of file |