添加1报工审批2添加我的申请
This commit is contained in:
@@ -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<OaProjectTravelCompareVo> 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);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询项目报工列表
|
||||
*/
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -52,5 +52,11 @@ public interface OaProjectReportMapper extends BaseMapperPlus<OaProjectReportMap
|
||||
|
||||
List<OaProjectReportVo> getClearList(@Param("start") LocalDate start, @Param("end") LocalDate end);
|
||||
|
||||
Page<OaProjectReportVo> selectTravelCompareReportPage(@Param("page") Page<OaProjectReportVo> page,
|
||||
@Param("start") LocalDate start,
|
||||
@Param("end") LocalDate end,
|
||||
@Param("nickName") String nickName,
|
||||
@Param("workPlace") String workPlace);
|
||||
|
||||
List<OaProjectReportVo> getSummaryData(@Param("start") LocalDate start, @Param("end") LocalDate end);
|
||||
}
|
||||
|
||||
@@ -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<OaProjectReportVo> queryPageList(OaProjectReportBo bo, PageQuery pageQuery);
|
||||
|
||||
/**
|
||||
* 查询项目报工列表
|
||||
*/
|
||||
List<OaProjectReportVo> queryList(OaProjectReportBo bo);
|
||||
|
||||
/**
|
||||
* 新增项目报工
|
||||
*/
|
||||
Boolean insertByBo(OaProjectReportBo bo);
|
||||
|
||||
/**
|
||||
* 修改项目报工
|
||||
*/
|
||||
Boolean updateByBo(OaProjectReportBo bo);
|
||||
|
||||
/**
|
||||
* 校验并批量删除项目报工信息
|
||||
*/
|
||||
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||
|
||||
/**
|
||||
* 报工数据看板
|
||||
* @return
|
||||
*/
|
||||
ProjectReportCardVo getCardData();
|
||||
|
||||
public List<ProjectReportTrendVo> getTrend(LocalDate start, LocalDate end);
|
||||
|
||||
public List<ProjectReportPieVo> getDistribution(LocalDate start, LocalDate end);
|
||||
|
||||
|
||||
List<OaProjectReportVo> getRankData(LocalDate start, LocalDate end);
|
||||
|
||||
List<OaProjectReportVo> getProjects(LocalDate start, LocalDate end);
|
||||
|
||||
List<OaProjectReportVo> clearList(LocalDate start, LocalDate end);
|
||||
|
||||
OaProjectReportVo queryById(Long reportId);
|
||||
|
||||
Boolean insertByBo(OaProjectReportBo bo);
|
||||
|
||||
Boolean updateByBo(OaProjectReportBo bo);
|
||||
|
||||
Boolean deleteWithValidByIds(List<Long> ids, Boolean isValid);
|
||||
|
||||
List<OaProjectReportVo> getRankData(LocalDate start, LocalDate end);
|
||||
|
||||
ProjectReportCardVo getCardData();
|
||||
|
||||
List<ProjectReportTrendVo> getTrend(LocalDate start, LocalDate end);
|
||||
|
||||
List<ProjectReportPieVo> getDistribution(LocalDate start, LocalDate end);
|
||||
|
||||
List<OaProjectReportVo> getProjects(LocalDate start, LocalDate end);
|
||||
|
||||
List<OaProjectReportVo> getSummaryData(LocalDate start, LocalDate end);
|
||||
|
||||
/**
|
||||
* 查询当前登录用户今日的报工记录
|
||||
*/
|
||||
OaProjectReportVo getTodayReportByCurrentUser();
|
||||
|
||||
Boolean insertReportSupplement(OaProjectReportBo bo);
|
||||
|
||||
TableDataInfo<OaProjectTravelCompareVo> getTravelCompareList(LocalDate start, LocalDate end, String nickName, String workPlace, PageQuery pageQuery);
|
||||
}
|
||||
|
||||
@@ -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<OaProjectTravelCompareVo> 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<OaProjectReportVo> page = new Page<>(pageNum, pageSize);
|
||||
Page<OaProjectReportVo> reportPage = baseMapper.selectTravelCompareReportPage(page, start, end, nickName, workPlace);
|
||||
List<OaProjectReportVo> reportList = reportPage.getRecords();
|
||||
List<OaProjectTravelCompareVo> rows = new ArrayList<>();
|
||||
List<HrmTravelReqVo> 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<OaProjectTravelCompareVo> table = TableDataInfo.build();
|
||||
table.setRows(rows);
|
||||
table.setTotal(reportPage.getTotal());
|
||||
return table;
|
||||
}
|
||||
|
||||
|
||||
private QueryWrapper<OaProjectReport> buildQueryWrapper(OaProjectReportBo bo) {
|
||||
Map<String, Object> 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 <T> TableDataInfo<T> toPage(List<T> 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<T> records = list.subList(fromIndex, toIndex);
|
||||
TableDataInfo<T> 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<Long> ids, Boolean isValid) {
|
||||
public Boolean deleteWithValidByIds(List<Long> ids, Boolean isValid) {
|
||||
if(isValid){
|
||||
//TODO 做一些业务上的校验,判断是否需要校验
|
||||
}
|
||||
|
||||
@@ -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')
|
||||
<if test="start != null">
|
||||
AND DATE(opr.create_time) >= DATE_FORMAT(#{start}, '%Y-%m-%d')
|
||||
</if>
|
||||
<if test="end != null">
|
||||
AND DATE(opr.create_time) <= DATE_FORMAT(#{end}, '%Y-%m-%d')
|
||||
</if>
|
||||
ORDER BY opr.create_time DESC
|
||||
</select>
|
||||
|
||||
<select id="selectTravelCompareReportPage" resultType="com.ruoyi.oa.domain.vo.OaProjectReportVo">
|
||||
select opr.report_id,
|
||||
opr.user_id,
|
||||
opr.is_trip,
|
||||
opr.work_place,
|
||||
opr.project_id,
|
||||
opr.content,
|
||||
opr.create_time,
|
||||
opr.create_by,
|
||||
opr.update_time,
|
||||
opr.update_by,
|
||||
opr.del_flag,
|
||||
opr.remark,
|
||||
op.project_name,
|
||||
op.project_num,
|
||||
op.project_code,
|
||||
su.nick_name,
|
||||
opr.work_type,
|
||||
sd.dept_name
|
||||
from oa_project_report opr
|
||||
left join sys_oa_project op on opr.project_id = op.project_id
|
||||
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
|
||||
<if test="start != null">
|
||||
AND DATE(opr.create_time) >= DATE_FORMAT(#{start}, '%Y-%m-%d')
|
||||
</if>
|
||||
<if test="end != null">
|
||||
AND DATE(opr.create_time) <= DATE_FORMAT(#{end}, '%Y-%m-%d')
|
||||
</if>
|
||||
<if test="nickName != null and nickName != ''">
|
||||
AND su.nick_name LIKE CONCAT('%', #{nickName}, '%')
|
||||
</if>
|
||||
<if test="workPlace != null and workPlace != ''">
|
||||
AND opr.work_place LIKE CONCAT('%', #{workPlace}, '%')
|
||||
</if>
|
||||
</where>
|
||||
ORDER BY opr.create_time DESC
|
||||
LIMIT 20
|
||||
</select>
|
||||
|
||||
<select id="getSummaryData" resultType="com.ruoyi.oa.domain.vo.OaProjectReportVo">
|
||||
|
||||
Reference in New Issue
Block a user