diff --git a/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmAppropriationReqController.java b/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmAppropriationReqController.java index 062f914..1ddbc8e 100644 --- a/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmAppropriationReqController.java +++ b/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmAppropriationReqController.java @@ -6,6 +6,7 @@ import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.hrm.domain.bo.HrmAppropriationReqBo; import com.ruoyi.hrm.domain.vo.HrmAppropriationReqVo; import com.ruoyi.hrm.service.IHrmAppropriationReqService; @@ -31,6 +32,7 @@ public class HrmAppropriationReqController extends BaseController { @GetMapping("/list") public TableDataInfo list(HrmAppropriationReqBo bo, PageQuery pageQuery) { + bo.setCreateBy(LoginHelper.getUsername()); return service.queryPageList(bo, pageQuery); } @@ -59,6 +61,7 @@ public class HrmAppropriationReqController extends BaseController { @GetMapping("/all") public R> all(HrmAppropriationReqBo bo) { + bo.setCreateBy(String.valueOf(LoginHelper.getUserId())); return R.ok(service.queryList(bo)); } } diff --git a/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmEmployeeController.java b/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmEmployeeController.java index d603df7..0734053 100644 --- a/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmEmployeeController.java +++ b/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmEmployeeController.java @@ -64,11 +64,9 @@ public class HrmEmployeeController extends BaseController { */ @GetMapping("/byUserId/{userId}") public R getByUserId(@PathVariable @NotNull Long userId) { - HrmEmployeeBo bo = new HrmEmployeeBo(); - bo.setUserId(userId); - List list = service.queryList(bo); - if (list != null && !list.isEmpty()) { - return R.ok(list.get(0)); + HrmEmployeeVo vo = service.queryByUserId(userId); + if (vo != null) { + return R.ok(vo); } return R.fail("未找到该用户对应的员工信息"); } diff --git a/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmLeaveReqController.java b/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmLeaveReqController.java index 7f7d165..500f185 100644 --- a/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmLeaveReqController.java +++ b/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmLeaveReqController.java @@ -6,7 +6,7 @@ import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; -import com.ruoyi.hrm.domain.HrmLeaveReq; +import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.hrm.domain.bo.HrmLeaveReqBo; import com.ruoyi.hrm.domain.vo.HrmLeaveReqVo; import com.ruoyi.hrm.domain.vo.HrmLeaveStatsVo; @@ -30,6 +30,7 @@ public class HrmLeaveReqController extends BaseController { @GetMapping("/list") public TableDataInfo list(HrmLeaveReqBo bo, PageQuery pageQuery) { + bo.setCreateBy(LoginHelper.getUsername()); return service.queryPageList(bo, pageQuery); } @@ -58,6 +59,7 @@ public class HrmLeaveReqController extends BaseController { @GetMapping("/all") public R> all(HrmLeaveReqBo bo) { + bo.setCreateBy(LoginHelper.getUsername()); return R.ok(service.queryList(bo)); } diff --git a/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmMyApplyController.java b/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmMyApplyController.java new file mode 100644 index 0000000..f61e362 --- /dev/null +++ b/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmMyApplyController.java @@ -0,0 +1,127 @@ +package com.ruoyi.hrm.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.PageQuery; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.helper.LoginHelper; +import com.ruoyi.hrm.domain.HrmEmployee; +import com.ruoyi.hrm.domain.bo.HrmAppropriationReqBo; +import com.ruoyi.hrm.domain.bo.HrmLeaveReqBo; +import com.ruoyi.hrm.domain.bo.HrmReimburseReqBo; +import com.ruoyi.hrm.domain.bo.HrmSealReqBo; +import com.ruoyi.hrm.domain.bo.HrmTravelReqBo; +import com.ruoyi.hrm.domain.vo.HrmAppropriationReqVo; +import com.ruoyi.hrm.domain.vo.HrmLeaveReqVo; +import com.ruoyi.hrm.domain.vo.HrmMyApplyVo; +import com.ruoyi.hrm.domain.vo.HrmReimburseReqVo; +import com.ruoyi.hrm.domain.vo.HrmSealReqVo; +import com.ruoyi.hrm.domain.vo.HrmTravelReqVo; +import com.ruoyi.hrm.mapper.HrmAppropriationReqMapper; +import com.ruoyi.hrm.mapper.HrmEmployeeMapper; +import com.ruoyi.hrm.mapper.HrmLeaveReqMapper; +import com.ruoyi.hrm.mapper.HrmReimburseReqMapper; +import com.ruoyi.hrm.mapper.HrmSealReqMapper; +import com.ruoyi.hrm.mapper.HrmTravelReqMapper; +import com.ruoyi.system.mapper.SysUserMapper; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +@RequiredArgsConstructor +@RestController +@RequestMapping("/hrm/my-apply") +public class HrmMyApplyController extends BaseController { + + private final HrmEmployeeMapper employeeMapper; + private final SysUserMapper sysUserMapper; + private final HrmLeaveReqMapper leaveReqMapper; + private final HrmTravelReqMapper travelReqMapper; + private final HrmSealReqMapper sealReqMapper; + private final HrmReimburseReqMapper reimburseReqMapper; + private final HrmAppropriationReqMapper appropriationReqMapper; + + @GetMapping("/list") + public TableDataInfo list(String bizType, String status, String keyword, PageQuery pageQuery) { + Long currentUserId = LoginHelper.getUserId(); + if (currentUserId == null) { + return TableDataInfo.build(); + } + HrmEmployee emp = employeeMapper.selectOne(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() + .eq(HrmEmployee::getUserId, currentUserId)); + if (emp == null) { + return TableDataInfo.build(); + } + SysUser sysUser = sysUserMapper.selectUserById(emp.getUserId()); + String nickName = sysUser != null ? sysUser.getNickName() : null; + + List all = new ArrayList<>(); + if (bizType == null || bizType.isEmpty() || "leave".equals(bizType)) { + all.addAll(mapLeave(leaveReqMapper.selectVoWithProjectList(buildLeaveBo(emp.getEmpId(), status)), nickName)); + } + if (bizType == null || bizType.isEmpty() || "travel".equals(bizType)) { + all.addAll(mapTravel(travelReqMapper.selectVoWithProjectList(buildTravelBo(emp.getEmpId(), status)), nickName)); + } + if (bizType == null || bizType.isEmpty() || "seal".equals(bizType)) { + all.addAll(mapSeal(sealReqMapper.selectVoWithProjectList(buildSealBo(emp.getEmpId(), status)), nickName)); + } + if (bizType == null || bizType.isEmpty() || "reimburse".equals(bizType)) { + all.addAll(mapReimburse(reimburseReqMapper.selectVoWithProjectList(buildReimburseBo(emp.getEmpId(), status)), nickName)); + } + if (bizType == null || bizType.isEmpty() || "appropriation".equals(bizType)) { + all.addAll(mapAppropriation(appropriationReqMapper.selectVoWithProjectList(buildAppropriationBo(emp.getEmpId(), status)), nickName)); + } + + if (keyword != null && !keyword.isEmpty()) { + String lower = keyword.toLowerCase(); + all = all.stream().filter(v -> contains(v, lower)).collect(Collectors.toList()); + } + all.sort(Comparator.comparing(HrmMyApplyVo::getCreateTime, Comparator.nullsLast(Comparator.naturalOrder())).reversed()); + + long start = (pageQuery.getPageNum() - 1L) * pageQuery.getPageSize(); + long end = Math.min(start + pageQuery.getPageSize(), all.size()); + Page page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize(), all.size()); + page.setRecords(start >= all.size() ? new ArrayList<>() : all.subList((int) start, (int) end)); + return TableDataInfo.build(page); + } + + private boolean contains(HrmMyApplyVo v, String lower) { + return Objects.toString(v.getTitle(), "").toLowerCase().contains(lower) + || Objects.toString(v.getRemark(), "").toLowerCase().contains(lower) + || Objects.toString(v.getNickName(), "").toLowerCase().contains(lower) + || Objects.toString(v.getEmpName(), "").toLowerCase().contains(lower) + || Objects.toString(v.getBizId(), "").contains(lower); + } + + private HrmLeaveReqBo buildLeaveBo(Long empId, String status) { HrmLeaveReqBo bo = new HrmLeaveReqBo(); bo.setEmpId(empId); bo.setStatus(status); return bo; } + private HrmTravelReqBo buildTravelBo(Long empId, String status) { HrmTravelReqBo bo = new HrmTravelReqBo(); bo.setEmpId(empId); bo.setStatus(status); return bo; } + private HrmSealReqBo buildSealBo(Long empId, String status) { HrmSealReqBo bo = new HrmSealReqBo(); bo.setEmpId(empId); bo.setStatus(status); return bo; } + private HrmReimburseReqBo buildReimburseBo(Long empId, String status) { HrmReimburseReqBo bo = new HrmReimburseReqBo(); bo.setEmpId(empId); bo.setStatus(status); return bo; } + private HrmAppropriationReqBo buildAppropriationBo(Long empId, String status) { HrmAppropriationReqBo bo = new HrmAppropriationReqBo(); bo.setEmpId(empId); bo.setStatus(status); return bo; } + + private List mapLeave(List list, String nickName) { return list.stream().map(v -> toVo("leave", v.getBizId(), v.getEmpId(), nickName, v.getReason(), v.getStatus(), v.getCreateTime())).collect(Collectors.toList()); } + private List mapTravel(List list, String nickName) { return list.stream().map(v -> toVo("travel", v.getBizId(), v.getEmpId(), nickName, v.getReason(), v.getStatus(), v.getCreateTime())).collect(Collectors.toList()); } + private List mapSeal(List list, String nickName) { return list.stream().map(v -> toVo("seal", v.getBizId(), v.getEmpId(), nickName, v.getRemark(), v.getStatus(), v.getCreateTime())).collect(Collectors.toList()); } + private List mapReimburse(List list, String nickName) { return list.stream().map(v -> toVo("reimburse", v.getBizId(), v.getEmpId(), nickName, v.getReason(), v.getStatus(), v.getCreateTime())).collect(Collectors.toList()); } + private List mapAppropriation(List list, String nickName) { return list.stream().map(v -> toVo("appropriation", v.getBizId(), v.getEmpId(), nickName, v.getReason(), v.getStatus(), v.getCreateTime())).collect(Collectors.toList()); } + + private HrmMyApplyVo toVo(String bizType, Long bizId, Long empId, String nickName, String title, String status, java.util.Date createTime) { + HrmMyApplyVo vo = new HrmMyApplyVo(); + vo.setBizType(bizType); + vo.setBizId(bizId); + vo.setEmpId(empId); + vo.setNickName(nickName); + vo.setTitle(title); + vo.setStatus(status); + vo.setCreateTime(createTime); + return vo; + } +} diff --git a/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmReimburseReqController.java b/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmReimburseReqController.java index fc82ea8..7b477f2 100644 --- a/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmReimburseReqController.java +++ b/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmReimburseReqController.java @@ -6,6 +6,7 @@ import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.hrm.domain.bo.HrmReimburseReqBo; import com.ruoyi.hrm.domain.vo.HrmReimburseReqVo; import com.ruoyi.hrm.service.IHrmReimburseReqService; @@ -31,6 +32,7 @@ public class HrmReimburseReqController extends BaseController { @GetMapping("/list") public TableDataInfo list(HrmReimburseReqBo bo, PageQuery pageQuery) { + bo.setCreateBy(LoginHelper.getUsername()); return service.queryPageList(bo, pageQuery); } @@ -59,6 +61,7 @@ public class HrmReimburseReqController extends BaseController { @GetMapping("/all") public R> all(HrmReimburseReqBo bo) { + bo.setCreateBy(LoginHelper.getUsername()); return R.ok(service.queryList(bo)); } } diff --git a/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmSealReqController.java b/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmSealReqController.java index 452441e..5efb1df 100644 --- a/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmSealReqController.java +++ b/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmSealReqController.java @@ -6,6 +6,7 @@ import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.hrm.domain.bo.HrmSealReqBo; import com.ruoyi.hrm.domain.bo.HrmSealStampBo; import com.ruoyi.hrm.domain.vo.HrmSealReqVo; @@ -32,6 +33,7 @@ public class HrmSealReqController extends BaseController { @GetMapping("/list") public TableDataInfo list(HrmSealReqBo bo, PageQuery pageQuery) { + bo.setCreateBy(LoginHelper.getUsername()); return service.queryPageList(bo, pageQuery); } diff --git a/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmTravelReqController.java b/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmTravelReqController.java index 7f624fa..3fc9f75 100644 --- a/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmTravelReqController.java +++ b/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmTravelReqController.java @@ -1,12 +1,12 @@ package com.ruoyi.hrm.controller; import com.ruoyi.common.annotation.Log; -import com.ruoyi.common.core.AjaxResult; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.hrm.domain.bo.HrmTravelReqBo; import com.ruoyi.hrm.domain.vo.HrmTravelReqVo; import com.ruoyi.hrm.service.IHrmTravelReqService; @@ -40,6 +40,7 @@ public class HrmTravelReqController extends BaseController { @GetMapping("/list") public TableDataInfo list(HrmTravelReqBo bo, PageQuery pageQuery) { + bo.setCreateBy(LoginHelper.getUsername()); return service.queryPageList(bo, pageQuery); } @@ -82,6 +83,7 @@ public class HrmTravelReqController extends BaseController { @GetMapping("/all") public R> all(HrmTravelReqBo bo) { + bo.setCreateBy(LoginHelper.getUsername()); return R.ok(service.queryList(bo)); } } diff --git a/fad-hrm/src/main/java/com/ruoyi/hrm/domain/vo/HrmMyApplyVo.java b/fad-hrm/src/main/java/com/ruoyi/hrm/domain/vo/HrmMyApplyVo.java new file mode 100644 index 0000000..099daa1 --- /dev/null +++ b/fad-hrm/src/main/java/com/ruoyi/hrm/domain/vo/HrmMyApplyVo.java @@ -0,0 +1,24 @@ +package com.ruoyi.hrm.domain.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +@Data +public class HrmMyApplyVo implements Serializable { + private static final long serialVersionUID = 1L; + + private String bizType; + private Long bizId; + private Long empId; + private String empName; + private Long userId; + private String nickName; + private String title; + private String status; + private Date createTime; + private Date endTime; + private Date actualEndTime; + private String remark; +} diff --git a/fad-hrm/src/main/java/com/ruoyi/hrm/service/IHrmEmployeeService.java b/fad-hrm/src/main/java/com/ruoyi/hrm/service/IHrmEmployeeService.java index 9b375a4..8a2cd80 100644 --- a/fad-hrm/src/main/java/com/ruoyi/hrm/service/IHrmEmployeeService.java +++ b/fad-hrm/src/main/java/com/ruoyi/hrm/service/IHrmEmployeeService.java @@ -15,6 +15,8 @@ public interface IHrmEmployeeService { List queryList(HrmEmployeeBo bo); + HrmEmployeeVo queryByUserId(Long userId); + Boolean insertByBo(HrmEmployeeBo bo); Boolean updateByBo(HrmEmployeeBo bo); diff --git a/fad-hrm/src/main/java/com/ruoyi/hrm/service/IHrmMyApplyService.java b/fad-hrm/src/main/java/com/ruoyi/hrm/service/IHrmMyApplyService.java new file mode 100644 index 0000000..b3266c7 --- /dev/null +++ b/fad-hrm/src/main/java/com/ruoyi/hrm/service/IHrmMyApplyService.java @@ -0,0 +1,9 @@ +package com.ruoyi.hrm.service; + +import com.ruoyi.common.core.domain.PageQuery; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.hrm.domain.vo.HrmMyApplyVo; + +public interface IHrmMyApplyService { + TableDataInfo queryPageList(String bizType, String status, String keyword, PageQuery pageQuery); +} diff --git a/fad-hrm/src/main/java/com/ruoyi/hrm/service/impl/HrmEmployeeServiceImpl.java b/fad-hrm/src/main/java/com/ruoyi/hrm/service/impl/HrmEmployeeServiceImpl.java index 4001fee..256c504 100644 --- a/fad-hrm/src/main/java/com/ruoyi/hrm/service/impl/HrmEmployeeServiceImpl.java +++ b/fad-hrm/src/main/java/com/ruoyi/hrm/service/impl/HrmEmployeeServiceImpl.java @@ -29,6 +29,11 @@ public class HrmEmployeeServiceImpl implements IHrmEmployeeService { return baseMapper.selectVoById(empId); } + @Override + public HrmEmployeeVo queryByUserId(Long userId) { + return baseMapper.selectVoOne(Wrappers.lambdaQuery().eq(HrmEmployee::getUserId, userId)); + } + @Override public TableDataInfo queryPageList(HrmEmployeeBo bo, PageQuery pageQuery) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); diff --git a/ruoyi-oa/pom.xml b/ruoyi-oa/pom.xml index c50d8a3..2827d04 100644 --- a/ruoyi-oa/pom.xml +++ b/ruoyi-oa/pom.xml @@ -73,6 +73,12 @@ xxl-job-core + + com.ruoyi + fad-hrm + + + diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaProjectReportController.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaProjectReportController.java index 9074c8c..df48c3a 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaProjectReportController.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaProjectReportController.java @@ -12,6 +12,7 @@ import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.oa.domain.bo.OaProjectReportBo; import com.ruoyi.oa.domain.vo.OaProjectReportVo; +import com.ruoyi.oa.domain.vo.OaProjectTravelCompareVo; import com.ruoyi.oa.domain.vo.ProjectReportCardVo; import com.ruoyi.oa.domain.vo.ProjectReportPieVo; import com.ruoyi.oa.domain.vo.ProjectReportTrendVo; @@ -51,6 +52,15 @@ public class OaProjectReportController extends BaseController { return iOaProjectReportService.queryPageList(bo, pageQuery); } + @GetMapping("/travel-compare") + public TableDataInfo travelCompare(@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate start, + @RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate end, + @RequestParam(required = false) String nickName, + @RequestParam(required = false) String workPlace, + PageQuery pageQuery) { + return iOaProjectReportService.getTravelCompareList(start, end, nickName, workPlace, pageQuery); + } + /** * 查询项目报工列表 */ diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaProjectTravelCompareVo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaProjectTravelCompareVo.java new file mode 100644 index 0000000..8d62852 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaProjectTravelCompareVo.java @@ -0,0 +1,47 @@ +package com.ruoyi.oa.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDate; + +/** + * 报工出差比对结果 + */ +@Data +public class OaProjectTravelCompareVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 用户昵称 */ + private String nickName; + + /** 比对日期(一天) */ + @JsonFormat(pattern = "yyyy-MM-dd") + private LocalDate compareDate; + + /** 是否出差 */ + private Long isTrip; + + /** 是否出差(中文) */ + private String trip; + + /** 报工地点 */ + private String workPlace; + + /** 实际出差地点 */ + private String travelPlace; + + /** 机器比对结果 */ + private String compareResult; + + /** 是否通过 */ + private Boolean pass; + + /** 出差记录ID */ + private Long travelBizId; + + /** 报工ID */ + private Long reportId; +} diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaProjectReportMapper.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaProjectReportMapper.java index 85462de..554f288 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaProjectReportMapper.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/mapper/OaProjectReportMapper.java @@ -52,5 +52,11 @@ public interface OaProjectReportMapper extends BaseMapperPlus getClearList(@Param("start") LocalDate start, @Param("end") LocalDate end); + Page selectTravelCompareReportPage(@Param("page") Page page, + @Param("start") LocalDate start, + @Param("end") LocalDate end, + @Param("nickName") String nickName, + @Param("workPlace") String workPlace); + List getSummaryData(@Param("start") LocalDate start, @Param("end") LocalDate end); } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaProjectReportService.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaProjectReportService.java index 717edd5..3dcb36b 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaProjectReportService.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaProjectReportService.java @@ -1,78 +1,48 @@ package com.ruoyi.oa.service; -import com.ruoyi.oa.domain.vo.OaProjectReportVo; -import com.ruoyi.oa.domain.bo.OaProjectReportBo; -import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.domain.PageQuery; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.oa.domain.bo.OaProjectReportBo; +import com.ruoyi.oa.domain.vo.OaProjectReportVo; +import com.ruoyi.oa.domain.vo.OaProjectTravelCompareVo; import com.ruoyi.oa.domain.vo.ProjectReportCardVo; import com.ruoyi.oa.domain.vo.ProjectReportPieVo; import com.ruoyi.oa.domain.vo.ProjectReportTrendVo; import java.time.LocalDate; -import java.util.Collection; import java.util.List; -/** - * 项目报工Service接口 - * - * @author hdka - * @date 2025-06-16 - */ public interface IOaProjectReportService { - /** - * 查询项目报工 - */ - OaProjectReportVo queryById(Long reportId); - - /** - * 查询项目报工列表 - */ TableDataInfo queryPageList(OaProjectReportBo bo, PageQuery pageQuery); - /** - * 查询项目报工列表 - */ List queryList(OaProjectReportBo bo); - /** - * 新增项目报工 - */ - Boolean insertByBo(OaProjectReportBo bo); - - /** - * 修改项目报工 - */ - Boolean updateByBo(OaProjectReportBo bo); - - /** - * 校验并批量删除项目报工信息 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); - - /** - * 报工数据看板 - * @return - */ - ProjectReportCardVo getCardData(); - - public List getTrend(LocalDate start, LocalDate end); - - public List getDistribution(LocalDate start, LocalDate end); - - - List getRankData(LocalDate start, LocalDate end); - - List getProjects(LocalDate start, LocalDate end); - List clearList(LocalDate start, LocalDate end); + OaProjectReportVo queryById(Long reportId); + + Boolean insertByBo(OaProjectReportBo bo); + + Boolean updateByBo(OaProjectReportBo bo); + + Boolean deleteWithValidByIds(List ids, Boolean isValid); + + List getRankData(LocalDate start, LocalDate end); + + ProjectReportCardVo getCardData(); + + List getTrend(LocalDate start, LocalDate end); + + List getDistribution(LocalDate start, LocalDate end); + + List getProjects(LocalDate start, LocalDate end); + List getSummaryData(LocalDate start, LocalDate end); - /** - * 查询当前登录用户今日的报工记录 - */ OaProjectReportVo getTodayReportByCurrentUser(); Boolean insertReportSupplement(OaProjectReportBo bo); + + TableDataInfo getTravelCompareList(LocalDate start, LocalDate end, String nickName, String workPlace, PageQuery pageQuery); } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaProjectReportServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaProjectReportServiceImpl.java index fc42743..0d60930 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaProjectReportServiceImpl.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaProjectReportServiceImpl.java @@ -1,30 +1,35 @@ package com.ruoyi.oa.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.core.domain.PageQuery; +import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.core.page.TableDataInfo; -import com.ruoyi.common.core.domain.PageQuery; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.ruoyi.hrm.domain.bo.HrmTravelReqBo; +import com.ruoyi.hrm.domain.vo.HrmTravelReqVo; +import com.ruoyi.hrm.service.IHrmTravelReqService; +import com.ruoyi.oa.domain.OaProjectReport; +import com.ruoyi.oa.domain.bo.OaProjectReportBo; +import com.ruoyi.oa.domain.vo.OaProjectReportVo; +import com.ruoyi.oa.domain.vo.OaProjectTravelCompareVo; import com.ruoyi.oa.domain.vo.ProjectReportCardVo; import com.ruoyi.oa.domain.vo.ProjectReportPieVo; import com.ruoyi.oa.domain.vo.ProjectReportTrendVo; -import lombok.RequiredArgsConstructor; -import org.apache.ibatis.annotations.Param; -import org.springframework.stereotype.Service; -import com.ruoyi.oa.domain.bo.OaProjectReportBo; -import com.ruoyi.oa.domain.vo.OaProjectReportVo; -import com.ruoyi.oa.domain.OaProjectReport; import com.ruoyi.oa.mapper.OaProjectReportMapper; import com.ruoyi.oa.service.IOaProjectReportService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.*; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; /** * 项目报工Service业务层处理 @@ -37,6 +42,7 @@ import java.util.*; public class OaProjectReportServiceImpl implements IOaProjectReportService { private final OaProjectReportMapper baseMapper; + private final IHrmTravelReqService hrmTravelReqService; /** * 查询项目报工 @@ -64,6 +70,77 @@ public class OaProjectReportServiceImpl implements IOaProjectReportService { return baseMapper.selectAll(bo); } + @Override + public TableDataInfo getTravelCompareList(LocalDate start, LocalDate end, String nickName, String workPlace, PageQuery pageQuery) { + int pageNum = pageQuery.getPageNum() == null || pageQuery.getPageNum() <= 0 ? 1 : pageQuery.getPageNum(); + int pageSize = pageQuery.getPageSize() == null || pageQuery.getPageSize() <= 0 ? 50 : pageQuery.getPageSize(); + Page page = new Page<>(pageNum, pageSize); + Page reportPage = baseMapper.selectTravelCompareReportPage(page, start, end, nickName, workPlace); + List reportList = reportPage.getRecords(); + List rows = new ArrayList<>(); + List travelList = hrmTravelReqService.queryList(new HrmTravelReqBo()); + + for (OaProjectReportVo report : reportList) { + OaProjectTravelCompareVo vo = new OaProjectTravelCompareVo(); + vo.setNickName(report.getNickName()); + vo.setCompareDate(toLocalDate(report.getCreateTime())); + vo.setWorkPlace(safeString(report.getWorkPlace())); + vo.setReportId(report.getReportId()); + vo.setIsTrip(report.getIsTrip()); + vo.setTrip(report.getTrip()); + + if (report.getIsTrip() == null || report.getIsTrip() != 1) { + vo.setTravelPlace("无出差记录"); + vo.setPass(false); + vo.setCompareResult("该员工未出差"); + rows.add(vo); + continue; + } + + HrmTravelReqVo matchedTravel = null; + LocalDate reportDate = vo.getCompareDate(); + if (reportDate != null) { + for (HrmTravelReqVo travel : travelList) { + if (travel.getEmpId() == null || report.getUserId() == null || !travel.getEmpId().equals(report.getUserId())) { + continue; + } + if (travel.getStartTime() == null) { + continue; + } + LocalDate travelStart = toLocalDate(travel.getStartTime()); + LocalDate travelEnd = toLocalDate(travel.getActualEndTime() != null ? travel.getActualEndTime() : travel.getEndTime()); + if (travelStart == null || travelEnd == null) { + continue; + } + if (!reportDate.isBefore(travelStart) && !reportDate.isAfter(travelEnd)) { + matchedTravel = travel; + break; + } + } + } + + if (matchedTravel == null) { + vo.setTravelPlace("无出差记录"); + vo.setPass(false); + vo.setCompareResult("该员工未出差"); + } else { + String travelPlace = safeString(matchedTravel.getDestination()); + boolean pass = isLocationMatched(vo.getWorkPlace(), travelPlace); + vo.setTravelPlace(travelPlace); + vo.setPass(pass); + vo.setCompareResult(pass ? "通过" : "异常"); + vo.setTravelBizId(matchedTravel.getBizId()); + } + + rows.add(vo); + } + + TableDataInfo table = TableDataInfo.build(); + table.setRows(rows); + table.setTotal(reportPage.getTotal()); + return table; + } + private QueryWrapper buildQueryWrapper(OaProjectReportBo bo) { Map params = bo.getParams(); @@ -110,6 +187,45 @@ public class OaProjectReportServiceImpl implements IOaProjectReportService { return lqw; } + private LocalDate toLocalDate(Date date) { + if (date == null) return null; + return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + } + + private String safeString(String value) { + return value == null ? "" : value.trim(); + } + + private boolean isLocationMatched(String a, String b) { + if (StringUtils.isBlank(a) || StringUtils.isBlank(b)) { + return false; + } + String left = normalizeLocation(a); + String right = normalizeLocation(b); + return !left.isEmpty() && left.equals(right); + } + + private String normalizeLocation(String value) { + String normalized = value.trim(); + if (normalized.length() >= 2) { + normalized = normalized.substring(0, 2); + } + return normalized; + } + + private TableDataInfo toPage(List list, PageQuery pageQuery) { + int pageNum = pageQuery.getPageNum() == null || pageQuery.getPageNum() <= 0 ? 1 : pageQuery.getPageNum(); + int pageSize = pageQuery.getPageSize() == null || pageQuery.getPageSize() <= 0 ? 50 : pageQuery.getPageSize(); + long total = list.size(); + int fromIndex = Math.min((pageNum - 1) * pageSize, list.size()); + int toIndex = Math.min(fromIndex + pageSize, list.size()); + List records = list.subList(fromIndex, toIndex); + TableDataInfo tableDataInfo = TableDataInfo.build(); + tableDataInfo.setRows(records); + tableDataInfo.setTotal(total); + return tableDataInfo; + } + /** * 新增项目报工 */ @@ -168,7 +284,7 @@ public class OaProjectReportServiceImpl implements IOaProjectReportService { * 批量删除项目报工 */ @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + public Boolean deleteWithValidByIds(List ids, Boolean isValid) { if(isValid){ //TODO 做一些业务上的校验,判断是否需要校验 } diff --git a/ruoyi-oa/src/main/resources/mapper/oa/OaProjectReportMapper.xml b/ruoyi-oa/src/main/resources/mapper/oa/OaProjectReportMapper.xml index 8536a2f..7e32528 100644 --- a/ruoyi-oa/src/main/resources/mapper/oa/OaProjectReportMapper.xml +++ b/ruoyi-oa/src/main/resources/mapper/oa/OaProjectReportMapper.xml @@ -195,11 +195,54 @@ left join sys_user su on su.user_id = opr.user_id left join sys_dept sd on su.dept_id = sd.dept_id WHERE opr.del_flag = 0 - AND DATE(opr.create_time) - BETWEEN DATE_FORMAT(#{start}, '%Y-%m-%d') - AND DATE_FORMAT(#{end}, '%Y-%m-%d') + + AND DATE(opr.create_time) >= DATE_FORMAT(#{start}, '%Y-%m-%d') + + + AND DATE(opr.create_time) <= DATE_FORMAT(#{end}, '%Y-%m-%d') + + ORDER BY opr.create_time DESC + + +