From a29c9c8d4d06aa0b8f867e2caae293f9706b32f4 Mon Sep 17 00:00:00 2001 From: zt Date: Mon, 8 Dec 2025 19:57:28 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SubConstructionUserController.java | 2 +- .../SubConstructionUserFileController.java | 16 ++++ .../SubConstructionUserChangeProjectReq.java | 7 ++ .../SubConstructionUserVo.java | 27 ++++++ .../ISubConstructionUserFileService.java | 9 ++ .../SubConstructionUserFileServiceImpl.java | 91 +++++++++++++++++++ .../impl/SubConstructionUserServiceImpl.java | 39 +++++++- .../controller/BusAttendanceController.java | 8 ++ .../controller/BusProjectTeamController.java | 7 ++ .../domain/BusConstructionUserExit.java | 24 +++++ .../vo/attendance/BusAttendanceListByDay.java | 12 +++ .../BusAttendanceMonthByUserIdCountVo.java | 34 +++++++ .../BusAttendanceMonthByUserIdVo.java | 5 + .../BusConstructionUserExitVo.java | 23 +++++ .../vo/projectteam/BusProjectTeamCountVo.java | 45 +++++++++ .../service/IBusAttendanceService.java | 4 + .../service/IBusProjectTeamService.java | 8 +- .../impl/BusAttendanceServiceImpl.java | 79 +++++++++++++++- .../BusConstructionUserExitServiceImpl.java | 34 +++++++ .../impl/BusProjectTeamMemberServiceImpl.java | 28 +++++- .../impl/BusProjectTeamServiceImpl.java | 51 +++++++++-- 21 files changed, 530 insertions(+), 23 deletions(-) create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/attendance/BusAttendanceMonthByUserIdCountVo.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/projectteam/BusProjectTeamCountVo.java diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/controller/SubConstructionUserController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/controller/SubConstructionUserController.java index 30f2a027..fea2b053 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/controller/SubConstructionUserController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/controller/SubConstructionUserController.java @@ -140,7 +140,7 @@ public class SubConstructionUserController extends BaseController { * * @param id 主键 */ - @SaCheckPermission("contractor:constructionUser:query") +// @SaCheckPermission("contractor:constructionUser:query") @GetMapping("/{id}") public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) { diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/controller/SubConstructionUserFileController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/controller/SubConstructionUserFileController.java index 7ec70011..34c4e7ec 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/controller/SubConstructionUserFileController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/controller/SubConstructionUserFileController.java @@ -21,6 +21,7 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.util.List; +import java.util.Map; /** * 施工人员文件存储 @@ -45,6 +46,21 @@ public class SubConstructionUserFileController extends BaseController { return R.ok(constructionUserFileService.queryList(req)); } + + /** + * 下载用户文件的ZIP(按类型分文件夹) + * @param userId 用户ID + */ + @GetMapping("/downloadFiles") + public void downloadUserFilesByType(Long userId,String type, HttpServletResponse response) { + try { + constructionUserFileService.generateTypeGroupZip(userId,type, response); + } catch (Exception e) { + e.printStackTrace(); + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + } + } + /** * 导出施工人员文件存储列表 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/domain/dto/constructionuser/SubConstructionUserChangeProjectReq.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/domain/dto/constructionuser/SubConstructionUserChangeProjectReq.java index 9e95b14a..5e9848fa 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/domain/dto/constructionuser/SubConstructionUserChangeProjectReq.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/domain/dto/constructionuser/SubConstructionUserChangeProjectReq.java @@ -34,4 +34,11 @@ public class SubConstructionUserChangeProjectReq implements Serializable { */ @NotNull(message = "分包公司id不能为空") private Long contractorId; + + + /** + * 工种 + */ + private String typeOfWork; + } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/domain/vo/constructionuser/SubConstructionUserVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/domain/vo/constructionuser/SubConstructionUserVo.java index b57de4fe..6be001ec 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/domain/vo/constructionuser/SubConstructionUserVo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/domain/vo/constructionuser/SubConstructionUserVo.java @@ -9,12 +9,15 @@ import org.dromara.common.excel.convert.ExcelDictConvert; import org.dromara.common.translation.annotation.Translation; import org.dromara.common.translation.constant.TransConstant; import org.dromara.contractor.domain.SubConstructionUser; +import org.dromara.contractor.domain.vo.constructionuserfile.SubConstructionUserFileVo; +import org.dromara.project.domain.vo.constructionuserexit.BusConstructionUserExitVo; import java.io.Serial; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDate; import java.util.Date; +import java.util.List; /** @@ -295,5 +298,29 @@ public class SubConstructionUserVo implements Serializable { */ private Long sysUserId; + /** + * 岗位(默认为0普通员工,1组长) + */ private String postId; + + /** + * 分包管理人员ID + */ + private String fbId; + + /** + * 分包管理人员名称 + */ + @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "fbId") + private String fbName; + + /** + * 文件 + */ + List subConstructionUserFileVos; + + /** + * 记录 + */ + List busConstructionUserExitVos; } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/service/ISubConstructionUserFileService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/service/ISubConstructionUserFileService.java index 65bcfecc..04af8b5f 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/service/ISubConstructionUserFileService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/service/ISubConstructionUserFileService.java @@ -9,6 +9,7 @@ import org.dromara.contractor.domain.dto.constructionuserfile.SubConstructionUse import org.dromara.contractor.domain.dto.constructionuserfile.SubConstructionUserFileSaveReq; import org.dromara.contractor.domain.dto.constructionuserfile.SubConstructionUserFileTemplateReq; import org.dromara.contractor.domain.vo.constructionuserfile.SubConstructionUserFileVo; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -82,4 +83,12 @@ public interface ISubConstructionUserFileService extends IService getFileByUserId(Long userId); + + /** + * 获取施工人员文件列表 + */ + Map> fileList(Long userId); + + + void generateTypeGroupZip(Long userId,String type, HttpServletResponse response) throws Exception; } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/service/impl/SubConstructionUserFileServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/service/impl/SubConstructionUserFileServiceImpl.java index 70c09e5d..1fb5f21b 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/service/impl/SubConstructionUserFileServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/service/impl/SubConstructionUserFileServiceImpl.java @@ -45,6 +45,9 @@ import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; import java.nio.file.Path; import java.nio.file.Paths; import java.util.*; @@ -470,6 +473,94 @@ public class SubConstructionUserFileServiceImpl extends ServiceImpl> fileList(Long userId) { + + List subConstructionUserFileVos = baseMapper.selectVoList(Wrappers.lambdaQuery() + .eq(SubConstructionUserFile::getUserId, userId)); + Map> resultMap = subConstructionUserFileVos.stream().collect(Collectors.groupingBy(SubConstructionUserFileVo::getFileType)); + return resultMap; + } + + + + + @Override + public void generateTypeGroupZip(Long userId,String type, HttpServletResponse response) throws Exception { + + // 1. 查询该用户的所有文件 + List list = lambdaQuery() + .eq(SubConstructionUserFile::getUserId, userId) + .eq(StrUtil.isNotBlank(type),SubConstructionUserFile::getFileType, type) + .list(); + if (list.isEmpty()) { + throw new ServiceException("该用户没有文件"); + } + List userFileType = dictTypeService.selectDictDataByType("user_file_type"); + Map collect = userFileType.stream().collect(Collectors.toMap(SysDictDataVo::getDictValue, SysDictDataVo::getDictLabel)); + + // 3. 设置响应头(ZIP文件下载) + response.setContentType("application/zip"); + response.setHeader("Content-Disposition", "attachment; filename=\"user_files.zip\""); + + // 4. 压缩流直接写入响应(无临时文件) + try (ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream())) { + // 遍历每个文件类型分组 + for (SubConstructionUserFile entry : list) { + String fileType = entry.getFileType(); // 文件夹名称:文件类型(如"01") + + String fileTypeName = collect.get(fileType); + + String fileUrl = entry.getPath(); + if (StringUtils.isBlank(fileUrl)) { + continue; + } + String[] split = fileUrl.split(","); + List ossIds = Arrays.stream(split).map(Long::valueOf).toList(); + List sysOssVos = ossService.listByIds(ossIds); + for (SysOssVo sysOssVo : sysOssVos) { + String ossVoUrl = sysOssVo.getUrl(); + if (StringUtils.isBlank(ossVoUrl)) { + continue; + } + String zipEntryName = fileTypeName + "/" + sysOssVo.getOriginalName(); + ZipEntry zipEntry = new ZipEntry(zipEntryName); + zipOut.putNextEntry(zipEntry); + // 下载远程文件并写入ZIP + URL url = new URL(ossVoUrl); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("GET"); + connection.setConnectTimeout(5000); + connection.setReadTimeout(10000); + + try (InputStream in = connection.getInputStream()) { + byte[] buffer = new byte[1024 * 8]; + int len; + while ((len = in.read(buffer)) != -1) { + zipOut.write(buffer, 0, len); + } + } finally { + connection.disconnect(); + zipOut.closeEntry(); // 关闭当前条目 + } + } + } + } + } + + + + + + + + + + + + + + /** * 递归扫描指定目录,找到 “姓名-Id” 格式的文件夹并解析 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/service/impl/SubConstructionUserServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/service/impl/SubConstructionUserServiceImpl.java index 19d25689..2217c133 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/service/impl/SubConstructionUserServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/service/impl/SubConstructionUserServiceImpl.java @@ -38,9 +38,11 @@ import org.dromara.contractor.domain.SubConstructionUser; import org.dromara.contractor.domain.SubConstructionUserFile; import org.dromara.contractor.domain.SubContractor; import org.dromara.contractor.domain.dto.constructionuser.*; +import org.dromara.contractor.domain.dto.constructionuserfile.SubConstructionUserFileQueryReq; import org.dromara.contractor.domain.enums.SubConstructionUserFileStatusEnum; import org.dromara.contractor.domain.exportvo.BusConstructionUserExportVo; import org.dromara.contractor.domain.vo.constructionuser.*; +import org.dromara.contractor.domain.vo.constructionuserfile.SubConstructionUserFileVo; import org.dromara.contractor.domain.vo.contractor.SubContractorVo; import org.dromara.contractor.mapper.SubConstructionUserMapper; import org.dromara.contractor.service.ISubConstructionUserFileService; @@ -48,10 +50,12 @@ import org.dromara.contractor.service.ISubConstructionUserService; import org.dromara.contractor.service.ISubContractorService; import org.dromara.project.domain.*; import org.dromara.project.domain.dto.attendance.TodayUserDto; +import org.dromara.project.domain.dto.constructionuserexit.BusConstructionUserExitQueryReq; import org.dromara.project.domain.enums.BusAttendanceClockStatusEnum; import org.dromara.project.domain.enums.BusAttendanceCommuterEnum; import org.dromara.project.domain.enums.BusConstructionUserAttendanceStatusEnum; import org.dromara.project.domain.vo.attendance.AttendanceTodayUserVo; +import org.dromara.project.domain.vo.constructionuserexit.BusConstructionUserExitVo; import org.dromara.project.domain.vo.projectteam.BusProjectTeamAppVo; import org.dromara.project.service.*; import org.dromara.system.domain.SysUser; @@ -157,6 +161,10 @@ public class SubConstructionUserServiceImpl extends ServiceImpl subConstructionUserFileVos = constructionUserFileService.queryList(req); + vo.setSubConstructionUserFileVos(subConstructionUserFileVos); + BusConstructionUserExitQueryReq busConstructionUserExitQueryReq = new BusConstructionUserExitQueryReq(); + busConstructionUserExitQueryReq.setUserId(constructionUser.getSysUserId()); + List busConstructionUserExitVos = busConstructionUserExitService.queryList(busConstructionUserExitQueryReq); + vo.setBusConstructionUserExitVos(busConstructionUserExitVos); + return vo; } /** @@ -661,7 +678,9 @@ public class SubConstructionUserServiceImpl extends ServiceImpl lambdaUpdate = Wrappers.lambdaUpdate(SubConstructionUser.class) .eq(SubConstructionUser::getId, id) .set(SubConstructionUser::getProjectId, req.getProjectId()) - .set(SubConstructionUser::getContractorId, req.getContractorId()); + .set(SubConstructionUser::getContractorId, req.getContractorId()) + .set(SubConstructionUser::getTypeOfWork, req.getTypeOfWork()) + ; userProjectRelevancyService.deleteByUserId(constructionUser.getSysUserId()); @@ -895,6 +914,22 @@ public class SubConstructionUserServiceImpl extends ServiceImpllambdaQuery() + .eq(BusProjectTeamMember::getTeamId, constructionUser.getTeamId()) + .last("limit 1") + ); + if (one != null) { + constructionUserVo.setPostId(one.getPostId()); + } + } + } return constructionUserVo; } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusAttendanceController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusAttendanceController.java index 6f84f6fb..92b8b671 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusAttendanceController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusAttendanceController.java @@ -67,6 +67,14 @@ public class BusAttendanceController extends BaseController { return R.ok(busAttendanceService.listAttendanceMonthListByUserId(req)); } + /** + * 统计施工人员月份考勤列表 + */ + @GetMapping("/count/month/byUserId") + public R countAttendanceMonthListByUserId(BusAttendanceMonthByUserIdReq req) { + return R.ok(busAttendanceService.countAttendanceMonthListByUserId(req)); + } + @GetMapping("/sub/list/month/byUserId") public R> subListAttendanceMonthListByUserId(BusAttendanceMonthByUserIdReq req) { return R.ok(busAttendanceService.subListAttendanceMonthListByUserId(req)); diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusProjectTeamController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusProjectTeamController.java index f9fa5bba..26bb9211 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusProjectTeamController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusProjectTeamController.java @@ -23,6 +23,7 @@ import org.dromara.project.domain.dto.projectteam.BusProjectTeamQueryReq; import org.dromara.project.domain.dto.projectteam.BusProjectTeamUpdateReq; import org.dromara.project.domain.vo.BusProjectPunchrangeVo; import org.dromara.project.domain.vo.projectteam.BusProjectTeamAppVo; +import org.dromara.project.domain.vo.projectteam.BusProjectTeamCountVo; import org.dromara.project.domain.vo.projectteam.BusProjectTeamForemanVo; import org.dromara.project.domain.vo.projectteam.BusProjectTeamVo; import org.dromara.project.service.IBusProjectPunchrangeService; @@ -181,4 +182,10 @@ public class BusProjectTeamController extends BaseController { return R.ok(busProjectTeamService.queryList(req)); } + + @GetMapping("/teamCount") + public R teamCount(BusProjectTeamQueryReq req) { + return R.ok(busProjectTeamService.teamCount(req)); + } + } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/BusConstructionUserExit.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/BusConstructionUserExit.java index 0c83aa24..7a0c58cc 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/BusConstructionUserExit.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/BusConstructionUserExit.java @@ -72,5 +72,29 @@ public class BusConstructionUserExit implements Serializable { */ private String remark; + /** + * 工种 + */ + private String typeOfWork; + + /** + * 项目名称 + */ + private String projectName; + + /** + * 分包公司id + */ + private Long contractorId; + + /** + * 分包公司名称 + */ + private String contractorName; + + /** + * 班组名称 + */ + private String teamName; } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/attendance/BusAttendanceListByDay.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/attendance/BusAttendanceListByDay.java index 29ac1f47..4cf3d63a 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/attendance/BusAttendanceListByDay.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/attendance/BusAttendanceListByDay.java @@ -33,6 +33,17 @@ public class BusAttendanceListByDay { */ private String clockStatus; + /** + * 人脸照 + */ + private String facePic; + + + private String url; + + + + public static BusAttendanceListByDay build(BusAttendance attendance) { if (attendance == null) { return null; @@ -41,6 +52,7 @@ public class BusAttendanceListByDay { attendanceListByDay.setClockType(attendance.getClockType()); attendanceListByDay.setClockTime(attendance.getClockTime()); attendanceListByDay.setClockStatus(attendance.getClockStatus()); + attendanceListByDay.setFacePic(attendance.getFacePic()); return attendanceListByDay; } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/attendance/BusAttendanceMonthByUserIdCountVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/attendance/BusAttendanceMonthByUserIdCountVo.java new file mode 100644 index 00000000..322965b6 --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/attendance/BusAttendanceMonthByUserIdCountVo.java @@ -0,0 +1,34 @@ +package org.dromara.project.domain.vo.attendance; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDate; +import java.util.List; + +/** + * @author lilemy + * @date 2025/4/8 16:58 + */ +@Data +public class BusAttendanceMonthByUserIdCountVo implements Serializable { + + @Serial + private static final long serialVersionUID = -6172238396618801431L; + + /** + * 出勤天数 + */ + private Long full; + /** + * 迟到和早退次数 + */ + private Long half; + /** + * 请假次数 + */ + private Long leave; + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/attendance/BusAttendanceMonthByUserIdVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/attendance/BusAttendanceMonthByUserIdVo.java index 05df4ab7..5b76244e 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/attendance/BusAttendanceMonthByUserIdVo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/attendance/BusAttendanceMonthByUserIdVo.java @@ -37,6 +37,11 @@ public class BusAttendanceMonthByUserIdVo implements Serializable { */ private String Status; + /** + * 当天打卡状态 + */ + private Integer week; + /** * 当天打卡记录 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/constructionuserexit/BusConstructionUserExitVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/constructionuserexit/BusConstructionUserExitVo.java index efff647d..e6648714 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/constructionuserexit/BusConstructionUserExitVo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/constructionuserexit/BusConstructionUserExitVo.java @@ -96,5 +96,28 @@ public class BusConstructionUserExitVo implements Serializable { @ExcelProperty(value = "备注") private String remark; + /** + * 工种 + */ + private String typeOfWork; + /** + * 项目名称 + */ + private String projectName; + + /** + * 分包公司id + */ + private Long contractorId; + + /** + * 分包公司名称 + */ + private String contractorName; + + /** + * 班组名称 + */ + private String teamName; } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/projectteam/BusProjectTeamCountVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/projectteam/BusProjectTeamCountVo.java new file mode 100644 index 00000000..313786dd --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/projectteam/BusProjectTeamCountVo.java @@ -0,0 +1,45 @@ +package org.dromara.project.domain.vo.projectteam; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.project.domain.BusProjectTeam; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + + +/** + * 项目班组视图对象 bus_project_team + * + * @author lilemy + * @date 2025-03-07 + */ +@Data +public class BusProjectTeamCountVo { + + /** + * 总班组 + */ + private Integer total=0; + + /** + * 总人数 + */ + private Long peopleNumber=0L; + + /** + * 限制打卡组数 + */ + private Long limitNumber=0L; + + /** + * 出勤班组数 + */ + private Long attendanceNumber=0L; +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusAttendanceService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusAttendanceService.java index 09b5f68b..489f7aa3 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusAttendanceService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusAttendanceService.java @@ -44,6 +44,10 @@ public interface IBusAttendanceService extends IService{ */ List listAttendanceMonthListByUserId(BusAttendanceMonthByUserIdReq req); + /** + * 统计用户每月考勤 + */ + BusAttendanceMonthByUserIdCountVo countAttendanceMonthListByUserId(BusAttendanceMonthByUserIdReq req); List subListAttendanceMonthListByUserId(BusAttendanceMonthByUserIdReq req); diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusProjectTeamService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusProjectTeamService.java index d686dd09..daef99f4 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusProjectTeamService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusProjectTeamService.java @@ -11,10 +11,7 @@ import org.dromara.project.domain.BusProjectTeam; import org.dromara.project.domain.dto.projectteam.BusProjectTeamCreateReq; import org.dromara.project.domain.dto.projectteam.BusProjectTeamQueryReq; import org.dromara.project.domain.dto.projectteam.BusProjectTeamUpdateReq; -import org.dromara.project.domain.vo.projectteam.BusProjectTeamAppVo; -import org.dromara.project.domain.vo.projectteam.BusProjectTeamForemanVo; -import org.dromara.project.domain.vo.projectteam.BusProjectTeamVo; -import org.dromara.project.domain.vo.projectteam.TeamManageVo; +import org.dromara.project.domain.vo.projectteam.*; import org.dromara.quality.domain.vo.qualityinspection.QltQualityInspectionVo; import org.springframework.web.bind.annotation.PathVariable; @@ -129,4 +126,7 @@ public interface IBusProjectTeamService extends IService { List getManager(Long teamId); List selectByPunchRangeIn(List punchRangeList); + + + BusProjectTeamCountVo teamCount(BusProjectTeamQueryReq req); } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusAttendanceServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusAttendanceServiceImpl.java index 3bf263af..2facfce5 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusAttendanceServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusAttendanceServiceImpl.java @@ -62,6 +62,7 @@ import java.math.BigDecimal; import java.time.*; import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAdjusters; +import java.time.temporal.ValueRange; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; @@ -179,10 +180,29 @@ public class BusAttendanceServiceImpl extends ServiceImpl> dateListMap = this.lambdaQuery() + List list = this.lambdaQuery() .eq(BusAttendance::getUserId, constructionUser.getSysUserId()) .between(BusAttendance::getClockDate, start, end) - .list() + .list(); + //转成Long + // 转换逻辑:将字符串解析为Long + List longList = list.stream() + .filter(attendance -> StringUtils.isNotBlank(attendance.getFacePic())) // 过滤空字符串 + .map(attendance -> { + try { + // 假设facePic是纯数字字符串(如"123456") + return Long.parseLong(attendance.getFacePic()); + } catch (NumberFormatException e) { + // 处理转换失败的情况(如非数字字符串) + // 可选:抛异常/返回null/忽略(此处示例返回null,后续可过滤) + return null; + } + }) + .filter(java.util.Objects::nonNull) // 过滤转换失败的null + .collect(Collectors.toList()); + List sysOssVos = ossService.listByIds(longList); + Map ossMap = sysOssVos.stream().collect(Collectors.toMap(SysOssVo::getOssId, SysOssVo::getUrl)); + Map> dateListMap = list .stream().collect(Collectors.groupingBy(BusAttendance::getClockDate)); // 遍历每天,计算考勤状态 List respList = new ArrayList<>(); @@ -190,6 +210,10 @@ public class BusAttendanceServiceImpl extends ServiceImpl attendanceListByDayList = new ArrayList<>(); String clockInStatus = null; String clockOutStatus = null; @@ -198,6 +222,12 @@ public class BusAttendanceServiceImpl extends ServiceImpl list = this.lambdaQuery() + .eq(BusAttendance::getUserId, constructionUser.getSysUserId()) + .between(BusAttendance::getClockDate, start, end) + .list(); + BusAttendanceMonthByUserIdCountVo vo = new BusAttendanceMonthByUserIdCountVo(); + long count = list.stream().filter(attendance -> ATTENDANCE_LIST.contains(attendance.getClockType())) + .map(BusAttendance::getClockDate).distinct().count(); + vo.setFull(count); + + long late = list.stream().filter(attendance -> LATE.getValue().equals(attendance.getClockStatus()) || LEAVEEARLY.getValue().equals(attendance.getClockStatus())).count(); + vo.setHalf(late); + long leave = list.stream().filter(attendance -> LEAVE.getValue().equals(attendance.getClockStatus())).count(); + vo.setLeave(leave); + return vo; + } + @Override public List subListAttendanceMonthListByUserId(BusAttendanceMonthByUserIdReq req) { Long userId = req.getUserId(); diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusConstructionUserExitServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusConstructionUserExitServiceImpl.java index 699df33c..7c493259 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusConstructionUserExitServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusConstructionUserExitServiceImpl.java @@ -14,8 +14,12 @@ import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.contractor.domain.SubConstructionUser; +import org.dromara.contractor.domain.SubContractor; import org.dromara.contractor.service.ISubConstructionUserService; +import org.dromara.contractor.service.ISubContractorService; import org.dromara.project.domain.BusConstructionUserExit; +import org.dromara.project.domain.BusProject; +import org.dromara.project.domain.BusProjectTeam; import org.dromara.project.domain.BusProjectTeamMember; import org.dromara.project.domain.dto.constructionuserexit.BusConstructionUserExitCreateReq; import org.dromara.project.domain.dto.constructionuserexit.BusConstructionUserExitQueryReq; @@ -23,7 +27,9 @@ import org.dromara.project.domain.dto.constructionuserexit.BusConstructionUserEx import org.dromara.project.domain.vo.constructionuserexit.BusConstructionUserExitVo; import org.dromara.project.mapper.BusConstructionUserExitMapper; import org.dromara.project.service.IBusConstructionUserExitService; +import org.dromara.project.service.IBusProjectService; import org.dromara.project.service.IBusProjectTeamMemberService; +import org.dromara.project.service.IBusProjectTeamService; import org.dromara.system.domain.vo.SysOssVo; import org.dromara.system.service.ISysOssService; import org.springframework.beans.BeanUtils; @@ -55,6 +61,19 @@ public class BusConstructionUserExitServiceImpl extends ServiceImpl selectByPunchRangeIn(List punchRangeList) { return baseMapper.selectByPunchRangeIn(punchRangeList); } + + + @Override + public BusProjectTeamCountVo teamCount(BusProjectTeamQueryReq req) { + BusProjectTeamCountVo vo = new BusProjectTeamCountVo(); + List list = lambdaQuery().eq(BusProjectTeam::getProjectId, req.getProjectId()).list(); + vo.setTotal(list.size()); + List list1 = list.stream().map(BusProjectTeam::getId).toList(); + if(CollUtil.isNotEmpty(list1)){ + long count = constructionUserService.count(Wrappers.lambdaQuery() + .eq(SubConstructionUser::getProjectId, req.getProjectId()) + .in(SubConstructionUser::getTeamId, list1) + ); + vo.setPeopleNumber(count); + } + long count = list.stream().filter(projectTeam -> "0".equals(projectTeam.getIsClockIn())).count(); + vo.setLimitNumber(count); + + + List list2 = attendanceService.lambdaQuery() + .eq(BusAttendance::getProjectId, req.getProjectId()) + .eq(BusAttendance::getClockDate, LocalDate.now()) + .in(BusAttendance::getClockStatus, BusAttendanceClockStatusEnum.ATTENDANCE_LIST) + .list(); + List list11 = list2.stream().map(BusAttendance::getUserId).toList(); + if(CollUtil.isNotEmpty(list11)){ + long count1 = constructionUserService.count(Wrappers.lambdaQuery() + .eq(SubConstructionUser::getProjectId, req.getProjectId()) + .in(SubConstructionUser::getTeamId, list11) + ); + vo.setPeopleNumber(count1); + } + return vo; + } }