diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/jx/controller/admin/DriveSchoolCarController.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/jx/controller/admin/DriveSchoolCarController.java index a0d012be..7b01e65a 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/jx/controller/admin/DriveSchoolCarController.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/jx/controller/admin/DriveSchoolCarController.java @@ -129,4 +129,20 @@ public class DriveSchoolCarController extends BaseController public CommonResult getCarNoAll(){ return success(driveSchoolCarService.getCarNoAll()); } + + /** + * 根据教练id获取车牌号 + */ + @GetMapping("/getCarNoByCoachId") + public CommonResult getCarNoByCoachId(Long coachId){ + return success(driveSchoolCarService.getCarNoByCoachId(coachId)); + } + + /** + * 根据车牌号获取教练信息 + */ + @GetMapping("/getCoachInfoByCarNo") + public CommonResult getCoachInfoByCarNo(String carNo){ + return success(driveSchoolCarService.getCoachInfoByCarNo(carNo)); + } } diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/jx/service/IDriveSchoolCarService.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/jx/service/IDriveSchoolCarService.java index 5fc49901..5e2d4eca 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/jx/service/IDriveSchoolCarService.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/jx/service/IDriveSchoolCarService.java @@ -73,4 +73,14 @@ public interface IDriveSchoolCarService extends IService */ List getCarNoByCoachUserId(Long userId); List getCarNoAll(); + + /** + * 根据教练id获取车牌号 + */ + List getCarNoByCoachId(Long coachId); + + /** + * 根据车牌号获取教练信息 + */ + List getCoachInfoByCarNo(String carNo); } diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/jx/service/impl/DriveSchoolCarServiceImpl.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/jx/service/impl/DriveSchoolCarServiceImpl.java index f5fedc63..65e610ec 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/jx/service/impl/DriveSchoolCarServiceImpl.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/jx/service/impl/DriveSchoolCarServiceImpl.java @@ -317,4 +317,31 @@ public class DriveSchoolCarServiceImpl extends ServiceImpl getCarNoByCoachId(Long coachId) { + return driveSchoolCarMapper.selectList( + new LambdaQueryWrapper() + .eq(DriveSchoolCar::getUserId, coachId) + .eq(DriveSchoolCar::getDeleted, 0) + .orderByDesc(DriveSchoolCar::getCreateTime) + ); + } + + + /** + * 根据车牌号获取教练信息 + */ + @Override + public List getCoachInfoByCarNo(String carNo) { + return driveSchoolCarMapper.selectList( + new LambdaQueryWrapper() + .eq(DriveSchoolCar::getCarNo, carNo) + .eq(DriveSchoolCar::getDeleted, 0) + .orderByDesc(DriveSchoolCar::getCreateTime) + ); + } } diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/controller/admin/DriveSchoolCoachClockController.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/controller/admin/DriveSchoolCoachClockController.java index e6df310d..096762de 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/controller/admin/DriveSchoolCoachClockController.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/controller/admin/DriveSchoolCoachClockController.java @@ -2,14 +2,12 @@ package cn.iocoder.yudao.module.train.controller.admin; import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore; import cn.iocoder.yudao.module.train.entity.DriveSchoolCoachClock; import cn.iocoder.yudao.module.train.service.IDriveSchoolCoachClockService; -import cn.iocoder.yudao.module.train.vo.DriveSchoolCoachClockVO; -import cn.iocoder.yudao.module.train.vo.TrainCarCountVO; -import cn.iocoder.yudao.module.train.vo.TrainDetailsByCarVO; -import cn.iocoder.yudao.module.train.vo.TrainVO; +import cn.iocoder.yudao.module.train.vo.*; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.v3.oas.annotations.Operation; @@ -17,7 +15,10 @@ import org.springframework.scheduling.annotation.Scheduled; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Arrays; import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @@ -40,8 +41,8 @@ public class DriveSchoolCoachClockController { public CommonResult> getPage(DriveSchoolCoachClockVO pageReqVO, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) { - Page page = new Page<>(pageNo,pageSize); - return success(coachClockService.queryListPage(pageReqVO,page)); + Page page = new Page<>(pageNo, pageSize); + return success(coachClockService.queryListPage(pageReqVO, page)); } /** @@ -57,13 +58,13 @@ public class DriveSchoolCoachClockController { @PostMapping("/create") @Operation(summary = "教练到场打卡") - public CommonResult createObj( @RequestBody DriveSchoolCoachClockVO coachClockVO) { + public CommonResult createObj(@RequestBody DriveSchoolCoachClockVO coachClockVO) { return success(coachClockService.createObj(coachClockVO)); } @PutMapping("/update") @Operation(summary = "教练离场打卡") - public CommonResult updateObj( @RequestBody DriveSchoolCoachClockVO coachClockVO) { + public CommonResult updateObj(@RequestBody DriveSchoolCoachClockVO coachClockVO) { coachClockService.updateObj(coachClockVO); return success(true); } @@ -87,6 +88,7 @@ public class DriveSchoolCoachClockController { /** * 车辆打卡数据列表 + * * @param trainCarCountVO * @return */ @@ -111,4 +113,67 @@ public class DriveSchoolCoachClockController { public void noClockInRemind() { coachClockService.noClockInRemind(); } + + /** + * PC端打卡统计数据获取 + */ + @GetMapping("getCloakAndTrainCount") + public CommonResult getCloakAndTrainCount(CloakAndTrainCountVO cloakAndTrainCountVO) { + return success(coachClockService.getCloakAndTrainCount(cloakAndTrainCountVO)); + } + + + /** + * 导出数据获取 + */ + @GetMapping("coachClockAll") + public CommonResult> coachClockAll(CoachClockExportVO coachClockExportVO, + @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) { + Page page = new Page<>(pageNo, pageSize); + return success(coachClockService.coachClockAll(coachClockExportVO, page)); + } + + + /** + * 导出 + * + * @param exportVO + * @param response + * @throws IOException + */ + @GetMapping("/coachClockRecordExport") + public void exportCommission(CoachClockExportVO exportVO, HttpServletResponse response) throws IOException { + // 校验导出类型 + if (exportVO.getExportType() == null || !Arrays.asList("current", "all", "range").contains(exportVO.getExportType())) { + throw new IllegalArgumentException("无效的导出类型: " + exportVO.getExportType()); + } + + // 根据不同类型查询数据 + List exportData; + String fileName = "教练打卡记录"; + + switch (exportVO.getExportType()) { + case "current": + exportData = coachClockService.getCoachClockRecordList(exportVO); + fileName += "_第" + exportVO.getPageNo() + "页"; + break; + case "all": + exportData = coachClockService.getAllCoachClockRecordList(exportVO); + fileName += "_全部数据"; + break; + case "range": + exportData = coachClockService.getCoachClockListByRange(exportVO); + fileName += "_" + exportVO.getStartPage() + "-" + exportVO.getEndPage() + "页"; + break; + default: + throw new IllegalArgumentException("无效的导出类型: " + exportVO.getExportType()); + } + + + // 导出Excel + ExcelUtils.write(response, fileName + ".xlsx", "教练打卡记录", CoachClockExportVO.class, exportData); + } + + } diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/controller/admin/TrainController.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/controller/admin/TrainController.java index f53be03c..931343a2 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/controller/admin/TrainController.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/controller/admin/TrainController.java @@ -2,18 +2,21 @@ package cn.iocoder.yudao.module.train.controller.admin; import cn.hutool.core.date.DateUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore; import cn.iocoder.yudao.module.base.entity.DlDriveSchoolStudent; import cn.iocoder.yudao.module.base.mapper.DlDriveSchoolStudentMapper; import cn.iocoder.yudao.module.base.vo.DlDriveSchoolStudentVO; import cn.iocoder.yudao.module.course.service.ProcessService; +import cn.iocoder.yudao.module.course.vo.CommissionExportVO; import cn.iocoder.yudao.module.jx.domain.DriveSchoolCar; import cn.iocoder.yudao.module.jx.mapper.DriveSchoolCarMapper; import cn.iocoder.yudao.module.jx.vo.DriveSchoolCarVO; import cn.iocoder.yudao.module.train.entity.Train; import cn.iocoder.yudao.module.train.service.TrainService; import cn.iocoder.yudao.module.train.vo.NoClockInRemindVO; +import cn.iocoder.yudao.module.train.vo.TrainExportVO; import cn.iocoder.yudao.module.train.vo.TrainStudentCountVO; import cn.iocoder.yudao.module.train.vo.TrainVO; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -27,7 +30,10 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Arrays; import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @@ -249,4 +255,51 @@ public class TrainController { public CommonResult> getTrainStudentList(@RequestParam(value = "coachClockId") String coachClockId){ return success(trainService.getTrainStudentList(coachClockId)); } + + /** + * 获取学员导出数据列表 + */ + @GetMapping("getExportList") + public CommonResult> getExportList(TrainExportVO exportVO, + @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize){ + Page page = new Page<>(pageNo, pageSize); + return success(trainService.getExportList(exportVO,page)); + } + + /** + * 导出数据(支持三种模式) + * @param exportVO 包含导出类型(exportType)、分页参数等 + */ + @GetMapping("/export") + public void exportCommission(TrainExportVO exportVO, HttpServletResponse response) throws IOException { + // 校验导出类型 + if (exportVO.getExportType() == null || !Arrays.asList("current", "all", "range").contains(exportVO.getExportType())) { + throw new IllegalArgumentException("无效的导出类型: " + exportVO.getExportType()); + } + + // 根据不同类型查询数据 + List exportData; + String fileName = "学员训练记录"; + + switch (exportVO.getExportType()) { + case "current": + exportData = trainService.getTrainList(exportVO); + fileName += "_第" + exportVO.getPageNo() + "页"; + break; + case "all": + exportData = trainService.getAllTrainList(exportVO); + fileName += "_全部数据"; + break; + case "range": + exportData = trainService.getTrainListByRange(exportVO); + fileName += "_" + exportVO.getStartPage() + "-" + exportVO.getEndPage() + "页"; + break; + default: + throw new IllegalArgumentException("无效的导出类型: " + exportVO.getExportType()); + } + + // 导出Excel + ExcelUtils.write(response, fileName + ".xlsx", "学员训练记录", TrainExportVO.class, exportData); + } } diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/mapper/DriveSchoolCoachClockMapper.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/mapper/DriveSchoolCoachClockMapper.java index 1482338e..8d1070bf 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/mapper/DriveSchoolCoachClockMapper.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/mapper/DriveSchoolCoachClockMapper.java @@ -1,9 +1,7 @@ package cn.iocoder.yudao.module.train.mapper; import cn.iocoder.yudao.module.train.entity.DriveSchoolCoachClock; -import cn.iocoder.yudao.module.train.vo.DriveSchoolCoachClockVO; -import cn.iocoder.yudao.module.train.vo.TrainCarCountVO; -import cn.iocoder.yudao.module.train.vo.TrainDetailsByCarVO; +import cn.iocoder.yudao.module.train.vo.*; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -37,4 +35,15 @@ public interface DriveSchoolCoachClockMapper extends BaseMapper noClockInRemind(); + + /** + * 导出数据获取 + */ + IPage coachClockExport(@Param("entity") CoachClockExportVO coachClockExportVO, Page page); + + + CloakAndTrainCountVO getTrainStudentCount(@Param("entity") CloakAndTrainCountVO cloakAndTrainCountVO); + CloakAndTrainCountVO getTrainCarCount(@Param("entity") CloakAndTrainCountVO cloakAndTrainCountVO); + + } diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/mapper/TrainMapper.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/mapper/TrainMapper.java index 7d7b71aa..a9863a97 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/mapper/TrainMapper.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/mapper/TrainMapper.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.train.mapper; import cn.iocoder.yudao.module.train.entity.Train; import cn.iocoder.yudao.module.train.vo.NoClockInRemindVO; +import cn.iocoder.yudao.module.train.vo.TrainExportVO; import cn.iocoder.yudao.module.train.vo.TrainStudentCountVO; import cn.iocoder.yudao.module.train.vo.TrainVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; @@ -38,4 +39,9 @@ public interface TrainMapper extends BaseMapper { */ List selectStudentByCoachClockId(String coachClockId); + /** + * 获取学员导出数据列表 + */ + IPage getExportList(@Param("entity") TrainExportVO entity, Page page); + } diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/service/IDriveSchoolCoachClockService.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/service/IDriveSchoolCoachClockService.java index efe02600..3f2d69a0 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/service/IDriveSchoolCoachClockService.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/service/IDriveSchoolCoachClockService.java @@ -1,10 +1,8 @@ package cn.iocoder.yudao.module.train.service; +import cn.iocoder.yudao.module.base.vo.BusinessRecordExportVO; import cn.iocoder.yudao.module.train.entity.DriveSchoolCoachClock; -import cn.iocoder.yudao.module.train.vo.DriveSchoolCoachClockVO; -import cn.iocoder.yudao.module.train.vo.TrainCarCountVO; -import cn.iocoder.yudao.module.train.vo.TrainDetailsByCarVO; -import cn.iocoder.yudao.module.train.vo.TrainVO; +import cn.iocoder.yudao.module.train.vo.*; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; @@ -61,9 +59,28 @@ public interface IDriveSchoolCoachClockService extends IService trainClockByCarDetail(TrainDetailsByCarVO trainDetailsByCarVO); + /** + * PC端打卡统计数据获取 + */ + CloakAndTrainCountVO getCloakAndTrainCount(CloakAndTrainCountVO cloakAndTrainCountVO); + /** * 每天晚上7点提醒未进行离场打卡的教练进行打卡 */ void noClockInRemind(); + /** + * 导出数据获取 + */ + IPage coachClockAll(CoachClockExportVO exportVO, Page page); + + /** + * 导出的三种形式 + * @param exportVO + * @return + */ + List getCoachClockRecordList(CoachClockExportVO exportVO); + List getAllCoachClockRecordList(CoachClockExportVO exportVO); + List getCoachClockListByRange(CoachClockExportVO exportVO); + } diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/service/TrainService.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/service/TrainService.java index f84c2ccd..dd6c41cf 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/service/TrainService.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/service/TrainService.java @@ -1,7 +1,9 @@ package cn.iocoder.yudao.module.train.service; +import cn.iocoder.yudao.module.course.vo.CommissionExportVO; import cn.iocoder.yudao.module.train.entity.Train; import cn.iocoder.yudao.module.train.vo.NoClockInRemindVO; +import cn.iocoder.yudao.module.train.vo.TrainExportVO; import cn.iocoder.yudao.module.train.vo.TrainVO; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -97,4 +99,16 @@ public interface TrainService extends IService { * 根据教练打卡id,获取对应学员列表信息 */ List getTrainStudentList(String coachClockId); + + /** + * 获取学员导出数据列表 + */ + IPage getExportList(TrainExportVO exportVO, Page page); + + /** + * 三种导出 + */ + List getTrainList(TrainExportVO exportVO); + List getAllTrainList(TrainExportVO exportVO); + List getTrainListByRange(TrainExportVO exportVO); } diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/service/impl/DriveSchoolCoachClockServiceImpl.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/service/impl/DriveSchoolCoachClockServiceImpl.java index c676e94c..304fcea2 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/service/impl/DriveSchoolCoachClockServiceImpl.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/service/impl/DriveSchoolCoachClockServiceImpl.java @@ -4,26 +4,27 @@ import cn.hutool.core.date.DateUtil; import cn.iocoder.yudao.module.base.constant.SchoolBaseConstants; import cn.iocoder.yudao.module.base.entity.DlDriveSchoolCoach; import cn.iocoder.yudao.module.base.service.SchoolNotifyMessageSendService; +import cn.iocoder.yudao.module.base.vo.BusinessRecordExportVO; import cn.iocoder.yudao.module.course.entity.Process; import cn.iocoder.yudao.module.train.entity.DriveSchoolCoachClock; import cn.iocoder.yudao.module.train.entity.Train; import cn.iocoder.yudao.module.train.mapper.DriveSchoolCoachClockMapper; import cn.iocoder.yudao.module.train.mapper.TrainMapper; import cn.iocoder.yudao.module.train.service.IDriveSchoolCoachClockService; -import cn.iocoder.yudao.module.train.vo.DriveSchoolCoachClockVO; -import cn.iocoder.yudao.module.train.vo.NoClockInRemindVO; -import cn.iocoder.yudao.module.train.vo.TrainCarCountVO; -import cn.iocoder.yudao.module.train.vo.TrainDetailsByCarVO; +import cn.iocoder.yudao.module.train.vo.*; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.math.BigDecimal; +import java.text.SimpleDateFormat; import java.time.Duration; import java.time.LocalDateTime; import java.util.ArrayList; @@ -248,6 +249,42 @@ public class DriveSchoolCoachClockServiceImpl extends ServiceImpl coachClockAll(CoachClockExportVO exportVO, Page page) { + String startTime = ""; + String endTime = ""; + + if ("more".equals(exportVO.getTimeType())) { + if (StringUtils.isNotEmpty(exportVO.getTrainStartTimeStr())) { + startTime = exportVO.getTrainStartTimeStr(); + } + if (StringUtils.isNotEmpty(exportVO.getTrainEndTimeStr())) { + endTime = exportVO.getTrainEndTimeStr(); + } + } else if ("month".equals(exportVO.getTimeType())) { + //当月 + startTime = DateUtil.format(DateUtil.beginOfMonth(DateUtil.date()), "yyyy-MM-dd"); + endTime = DateUtil.format(DateUtil.endOfMonth(DateUtil.date()), "yyyy-MM-dd"); + } else if ("day".equals(exportVO.getTimeType())) { + //当天 + startTime = DateUtil.formatDate(DateUtil.date()); + endTime = DateUtil.formatDate(DateUtil.date()); + } + + exportVO.setTrainStartTimeStr(startTime); + exportVO.setTrainEndTimeStr(endTime); + + IPage coachClockExportVOIPage = driveSchoolCoachClockMapper.coachClockExport(exportVO, page); + List records = coachClockExportVOIPage.getRecords(); + + List resultList = new ArrayList<>(records.size()); + + for (CoachClockExportVO record : records) { + List studentTrainList = trainMapper.selectStudentByCoachClockId(record.getId()); + CoachClockExportVO resultVO = new CoachClockExportVO(); + BeanUtils.copyProperties(record, resultVO); + resultVO.setStudentTrainList(studentTrainList); + + resultList.add(resultVO); + } + + return coachClockExportVOIPage.setRecords(resultList); + } + + + /** + * 导出的三种形式 + * @param exportVO + * @return + */ + @Override + public List getCoachClockRecordList(CoachClockExportVO exportVO) { + Page page = new Page<>(exportVO.getPageNo(), exportVO.getPageSize()); + IPage result = driveSchoolCoachClockMapper.coachClockExport(exportVO, page); + List records = result.getRecords(); + + // 对每条记录追加 studentTrainList 和 studentTrainStr + return enrichCoachClockExport(records); + } + + @Override + public List getAllCoachClockRecordList(CoachClockExportVO exportVO) { + Page page = new Page<>(1, Integer.MAX_VALUE); + IPage result = driveSchoolCoachClockMapper.coachClockExport(exportVO, page); + List records = result.getRecords(); + + return enrichCoachClockExport(records); + } + + @Override + public List getCoachClockListByRange(CoachClockExportVO exportVO) { + List allData = new ArrayList<>(); + + for (int i = exportVO.getStartPage(); i <= exportVO.getEndPage(); i++) { + Page page = new Page<>(i, exportVO.getPageSize()); + IPage result = driveSchoolCoachClockMapper.coachClockExport(exportVO, page); + List records = result.getRecords(); + allData.addAll(records); + + if (i >= result.getPages()) { + break; + } + } + + return enrichCoachClockExport(allData); + } + + private List enrichCoachClockExport(List records) { + for (CoachClockExportVO record : records) { + List studentTrainList = trainMapper.selectStudentByCoachClockId(record.getId()); + record.setStudentTrainList(studentTrainList); + + if (studentTrainList != null && !studentTrainList.isEmpty()) { + StringBuilder sb = new StringBuilder(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + + for (Train train : studentTrainList) { + String subjectStr = convertSubjectToStr(train.getSubject()); + String userName = train.getUserName() != null ? train.getUserName() : ""; + String carNo = train.getCarNo() != null ? train.getCarNo() : ""; + String startTimeStr = train.getStartTime() != null ? sdf.format(train.getStartTime()) : ""; + String endTimeStr = train.getEndTime() != null ? sdf.format(train.getEndTime()) : ""; + String trainTimeStr = train.getTrainTime() != null ? train.getTrainTime().intValue() + " 分钟" : "0 分钟"; + + // 学员排在科目前面 + sb.append(" ").append(userName) + .append(" | ").append(subjectStr) + .append(" | ").append(carNo) + .append(" | 到场:").append(startTimeStr) + .append(" | 离场:").append(endTimeStr) + .append(" | 训练时长:").append(trainTimeStr) + .append("\n"); + } + + record.setStudentTrainStr(sb.toString().trim()); + } + } + + return records; + } + + private String convertSubjectToStr(Integer subject) { + if (subject == null) { + return "未知科目"; + } + switch (subject) { + case 1: return "科目一"; + case 2: return "科目二"; + case 3: return "科目三"; + case 4: return "科目四"; + default: return "未知科目"; + } + } + + } diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/service/impl/TrainServiceImpl.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/service/impl/TrainServiceImpl.java index 40fe53a5..be6465f4 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/service/impl/TrainServiceImpl.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/service/impl/TrainServiceImpl.java @@ -7,10 +7,12 @@ import cn.iocoder.yudao.module.base.constant.SchoolBaseConstants; import cn.iocoder.yudao.module.base.service.SchoolNotifyMessageSendService; import cn.iocoder.yudao.module.course.entity.Process; import cn.iocoder.yudao.module.course.service.ProcessService; +import cn.iocoder.yudao.module.course.vo.CommissionExportVO; import cn.iocoder.yudao.module.train.entity.Train; import cn.iocoder.yudao.module.train.mapper.TrainMapper; import cn.iocoder.yudao.module.train.service.TrainService; import cn.iocoder.yudao.module.train.vo.NoClockInRemindVO; +import cn.iocoder.yudao.module.train.vo.TrainExportVO; import cn.iocoder.yudao.module.train.vo.TrainVO; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -21,6 +23,7 @@ import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.List; @@ -205,4 +208,50 @@ public class TrainServiceImpl extends ServiceImpl implements } + /** + * 获取学员导出数据列表 + */ + @Override + public IPage getExportList(TrainExportVO exportVO, Page page) { + return trainMapper.getExportList(exportVO,page); + } + + + /** + * 三种导出 + */ + @Override + public List getTrainList(TrainExportVO exportVO) { + // 分页查询当前页 + Page page = new Page<>(exportVO.getPageNo(), exportVO.getPageSize()); + IPage result = trainMapper.getExportList(exportVO, page); + return result.getRecords(); + } + + @Override + public List getAllTrainList(TrainExportVO exportVO) { + // 不分页查询全部数据 + Page page = new Page<>(1, Integer.MAX_VALUE); + IPage result = trainMapper.getExportList(exportVO, page); + return result.getRecords(); + } + + @Override + public List getTrainListByRange(TrainExportVO exportVO) { + List allData = new ArrayList<>(); + + // 循环查询指定范围内的数据 + for (int i = exportVO.getStartPage(); i <= exportVO.getEndPage(); i++) { + Page page = new Page<>(i, exportVO.getPageSize()); + IPage result = trainMapper.getExportList(exportVO, page); + allData.addAll(result.getRecords()); + + if (i >= result.getPages()) { + break; + } + } + return allData; + } + + } diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/vo/CloakAndTrainCountVO.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/vo/CloakAndTrainCountVO.java new file mode 100644 index 00000000..7d935968 --- /dev/null +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/vo/CloakAndTrainCountVO.java @@ -0,0 +1,52 @@ +package cn.iocoder.yudao.module.train.vo; + +import lombok.Data; + +@Data +public class CloakAndTrainCountVO { + + /** 总人次 */ + private String totalStudentCount; + + /** 科目二人次 */ + private String subject2StudentCount; + + /** 科目三人次 */ + private String subject3StudentCount; + + /** 总台次 */ + private String totalCarCount; + + /** 科目二台次 */ + private String subject2CarCount; + + /** 科目三台次 */ + private String subject3CarCount; + + /** 查询的时间类型 */ + private String timeType; + + /** 教练id */ + private Long coachId; + + /** 查询的开始时间 */ + private String trainStartTimeStr; + + /** 查询的结束时间 */ + private String trainEndTimeStr; + + /** 车辆的id */ + private String carId; + + /** 车牌号 */ + private String carNo; + + /** 教练姓名 */ + private String userName; + + /** 打卡的科目 */ + private Integer subject; + + private String userMobile; + +} diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/vo/CoachClockExportVO.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/vo/CoachClockExportVO.java new file mode 100644 index 00000000..63f26bfc --- /dev/null +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/vo/CoachClockExportVO.java @@ -0,0 +1,144 @@ +package cn.iocoder.yudao.module.train.vo; + +import cn.iocoder.yudao.module.train.entity.Train; +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Date; +import java.util.List; + +@Data +public class CoachClockExportVO { + + @ExcelIgnore + private String id; + + @ExcelIgnore + private Long coachId; + + @ExcelProperty(value = "教练", index = 0) + private String coachName; + + @ExcelProperty(value = "教练手机号", index = 1) + private String coachPhone; + + @ExcelProperty(value = "科目", index = 2) + private String subjectStr; + + @ExcelIgnore + private Integer subject; + + public void setSubject(Integer subject) { + this.subject = subject; + this.subjectStr = convertSubjectToStr(subject); + } + + private String convertSubjectToStr(Integer subject) { + if (subject == null) { + return ""; + } + switch (subject) { + case 1: return "科目一"; + case 2: return "科目二"; + case 3: return "科目三"; + case 4: return "科目四"; + default: return "未知科目"; + } + } + + @ExcelIgnore + private String carId; + + @ExcelProperty(value = "车牌号", index = 3) + private String carNo; + + @ExcelProperty(value = "训练日期", index = 4) + private String trainDay; + + @ExcelProperty(value = "训练地址", index = 5) + private String addr; + + @ExcelProperty(value = "到场时间", index = 6) + private String startTimeStr; + + @ExcelIgnore + private LocalDateTime startTime; + + public void setStartTime(LocalDateTime startTime) { + this.startTime = startTime; + if (startTime != null) { + this.startTimeStr = startTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")); + } + } + + @ExcelProperty(value = "到场备注", index = 7) + private String startRemark; + + @ExcelProperty(value = "离场时间", index = 8) + private String endTimeStr; + + @ExcelIgnore + private LocalDateTime endTime; + + public void setEndTime(LocalDateTime endTime) { + this.endTime = endTime; + if (endTime != null) { + this.endTimeStr = endTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")); + } + } + + @ExcelProperty(value = "离场备注", index = 9) + private String endRemark; + + @ExcelProperty(value = "训练时长(分钟)", index = 10) + private Double trainTime; + + @ExcelProperty(value = "学员训练记录", index = 11) + private String studentTrainStr; + + @ExcelIgnore + private List studentTrainList; + + @ExcelIgnore + private String startImages; + + @ExcelIgnore + private String endImages; + + + @ExcelIgnore + private String trainStartTimeStr; + @ExcelIgnore + private String trainEndTimeStr; + + @ExcelIgnore + private String timeType; + + /** + * 分页参数 + */ + @ExcelIgnore + private Integer pageNo = 1; + @ExcelIgnore + private Integer pageSize = 10; + + /** + * 导出类型:all(全部)、current(当前页)、range(自定义范围) + */ + @ExcelIgnore + private String exportType; + + /** + * 自定义范围参数 + */ + @ExcelIgnore + private Integer startPage; + @ExcelIgnore + private Integer endPage; + + +} diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/vo/TrainCarCountVO.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/vo/TrainCarCountVO.java index b4bf09a2..2398eed1 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/vo/TrainCarCountVO.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/vo/TrainCarCountVO.java @@ -44,6 +44,12 @@ public class TrainCarCountVO { /** 训练总时长 */ private String trainTimeCount; + /** 科目二时长 */ + private String subject2TrainTime; + + /** 科目三时长 */ + private String subject3TrainTime; + /** 总学员数 */ private String studentCount; } diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/vo/TrainExportVO.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/vo/TrainExportVO.java new file mode 100644 index 00000000..1eb58e08 --- /dev/null +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/vo/TrainExportVO.java @@ -0,0 +1,139 @@ +package cn.iocoder.yudao.module.train.vo; + +import cn.iocoder.yudao.module.train.entity.Train; +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; + +@Data +public class TrainExportVO { + + @ExcelIgnore + private String id; + + @ExcelIgnore + private Long userId; + + @ExcelProperty(value = "学员", index = 0) + private String userName; + + @ExcelProperty(value = "学员手机号", index = 1) + private String userMobile; + + @ExcelIgnore + private Long coachId; + + @ExcelProperty(value = "课程", index = 2) + private String courseName; + + @ExcelProperty(value = "教练", index = 3) + private String coachName; + + @ExcelProperty(value = "科目", index = 4) + private String subjectStr; + + @ExcelIgnore + private Integer subject; + + public void setSubject(Integer subject) { + this.subject = subject; + this.subjectStr = convertSubjectToStr(subject); + } + + private String convertSubjectToStr(Integer subject) { + if (subject == null) { + return ""; + } + switch (subject) { + case 1: return "科目一"; + case 2: return "科目二"; + case 3: return "科目三"; + case 4: return "科目四"; + default: return "未知科目"; + } + } + + @ExcelIgnore + private String carId; + + @ExcelProperty(value = "车牌号", index = 5) + private String carNo; + + @ExcelProperty(value = "训练日期", index = 6) + private String trainDay; + + @ExcelProperty(value = "训练地址", index = 7) + private String addr; + + @ExcelProperty(value = "到场时间", index = 8) + private String startTimeStr; + + @ExcelIgnore + private LocalDateTime startTime; + + public void setStartTime(LocalDateTime startTime) { + this.startTime = startTime; + if (startTime != null) { + this.startTimeStr = startTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")); + } + } + + @ExcelProperty(value = "到场备注", index = 9) + private String startRemark; + + @ExcelProperty(value = "离场时间", index = 10) + private String endTimeStr; + + @ExcelIgnore + private LocalDateTime endTime; + + public void setEndTime(LocalDateTime endTime) { + this.endTime = endTime; + if (endTime != null) { + this.endTimeStr = endTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")); + } + } + + @ExcelProperty(value = "离场备注", index = 11) + private String endRemark; + + @ExcelProperty(value = "训练时长(分钟)", index = 12) + private Double trainTime; + + + @ExcelIgnore + private String trainStartTimeStr; + @ExcelIgnore + private String trainEndTimeStr; + + @ExcelIgnore + private String timeType; + + /** + * 分页参数 + */ + @ExcelIgnore + private Integer pageNo = 1; + @ExcelIgnore + private Integer pageSize = 10; + + /** + * 导出类型:all(全部)、current(当前页)、range(自定义范围) + */ + @ExcelIgnore + private String exportType; + + /** + * 自定义范围参数 + */ + @ExcelIgnore + private Integer startPage; + @ExcelIgnore + private Integer endPage; + + +} diff --git a/dl-module-jx/src/main/resources/mapper/train/DriveSchoolCoachClockMapper.xml b/dl-module-jx/src/main/resources/mapper/train/DriveSchoolCoachClockMapper.xml index 61084756..2ed14b8b 100644 --- a/dl-module-jx/src/main/resources/mapper/train/DriveSchoolCoachClockMapper.xml +++ b/dl-module-jx/src/main/resources/mapper/train/DriveSchoolCoachClockMapper.xml @@ -43,6 +43,9 @@ AND user_id = #{entity.userId} + + AND car_no = #{entity.carNo} + AND train_day >= #{entity.trainDayStartTime} @@ -60,7 +63,9 @@ SUM(CASE WHEN dscc.subject = 2 THEN 1 ELSE 0 END) AS subject2Count, SUM(CASE WHEN dscc.subject = 3 THEN 1 ELSE 0 END) AS subject3Count, SUM(dscc.train_time) AS trainTimeCount, - COUNT(dst.coach_clock_id) AS studentCount + COUNT(dst.coach_clock_id) AS studentCount, + SUM(CASE WHEN dscc.subject = 2 THEN dscc.train_time ELSE 0 END) AS subject2TrainTime, + SUM(CASE WHEN dscc.subject = 3 THEN dscc.train_time ELSE 0 END) AS subject3TrainTime FROM drive_school_coach_clock dscc LEFT JOIN @@ -104,7 +109,8 @@ start_time, end_time, car_id, - car_no + car_no, + train_time FROM drive_school_coach_clock WHERE car_id = #{entity.carId} @@ -122,7 +128,7 @@ + + + + + + + + diff --git a/dl-module-jx/src/main/resources/mapper/train/TrainMapper.xml b/dl-module-jx/src/main/resources/mapper/train/TrainMapper.xml index d1844486..d5b25b62 100644 --- a/dl-module-jx/src/main/resources/mapper/train/TrainMapper.xml +++ b/dl-module-jx/src/main/resources/mapper/train/TrainMapper.xml @@ -57,12 +57,12 @@ COALESCE(SUM(CASE WHEN subject = 2 THEN 1 ELSE 0 END), 0) AS subject2Count, COALESCE(SUM(CASE WHEN subject = 3 THEN 1 ELSE 0 END), 0) AS subject3Count FROM - drive_school_train + drive_school_train WHERE - deleted = 0 - AND subject IS NOT NULL - AND user_id IS NOT NULL - AND course_id IS NOT NULL + deleted = 0 + AND subject IS NOT NULL + AND user_id IS NOT NULL + AND course_id IS NOT NULL AND coach_id = #{coachId} @@ -149,7 +149,10 @@ SELECT subject, user_name, - train_time + train_time, + start_time, + end_time, + car_no FROM drive_school_train WHERE deleted = 0 @@ -158,4 +161,50 @@ ORDER BY train_time DESC + +