feat(oa): 完善月工时汇总功能

- 新增工时汇总明细子表管理功能
- 添加工时汇总数据预览生成功能
- 优化数据库查询添加部门和负责人关联信息
- 实现工时数据聚合统计功能
- 完善数据校验和事务处理机制
dev
Yangk 2 months ago
parent e41128cfe3
commit 3dc735d1e6

@ -113,4 +113,14 @@ public class ErpTimesheetSummaryController extends BaseController {
return R.ok(list);
}
/**
*
*/
@SaCheckPermission("oa/erp:timesheetSummary:add")
@Log(title = "生成月汇总工时预览", businessType = BusinessType.OTHER)
@PostMapping("/generate")
public R<ErpTimesheetSummaryVo> generate(@RequestBody ErpTimesheetSummaryBo bo) {
return R.ok(erpTimesheetSummaryService.generateSummary(bo.getMonthCode(), bo.getDeptId()));
}
}

@ -4,6 +4,8 @@ import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
@ -52,7 +54,7 @@ public class ErpTimesheetStandardMonth extends TenantEntity {
/**
* (21.021.5)
*/
private Long standardDays;
private BigDecimal standardDays;
/**
*

@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.io.Serial;
/**
@ -55,27 +57,27 @@ public class ErpTimesheetSummary extends TenantEntity {
/**
* ()
*/
private Long standardDays;
private BigDecimal standardDays;
/**
* ()
*/
private Long totalProjectHours;
private BigDecimal totalProjectHours;
/**
* ()
*/
private Long totalDeptHours;
private BigDecimal totalDeptHours;
/**
* ()
*/
private Long totalHours;
private BigDecimal totalHours;
/**
*
*/
private Long staffCount;
private Integer staffCount;
/**
*

@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.io.Serial;
/**
@ -35,7 +37,7 @@ public class ErpTimesheetSummaryDetail extends TenantEntity {
/**
*
*/
private Long sortOrder;
private Integer sortOrder;
/**
* ID
@ -70,7 +72,7 @@ public class ErpTimesheetSummaryDetail extends TenantEntity {
/**
* ()
*/
private Long originalHours;
private BigDecimal originalHours;
/**
* ID
@ -90,7 +92,7 @@ public class ErpTimesheetSummaryDetail extends TenantEntity {
/**
* ()
*/
private Long adjustedHours;
private BigDecimal adjustedHours;
/**
* 1 0

@ -8,6 +8,7 @@ import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.math.BigDecimal;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
@ -54,7 +55,7 @@ public class ErpTimesheetStandardMonthBo extends BaseEntity {
/**
* (21.021.5)
*/
private Long standardDays;
private BigDecimal standardDays;
/**
*

@ -8,6 +8,8 @@ import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.math.BigDecimal;
import java.util.List;
/**
* erp_timesheet_summary
@ -29,7 +31,7 @@ public class ErpTimesheetSummaryBo extends BaseEntity {
/**
*
*/
@NotBlank(message = "汇总编号不能为空", groups = { AddGroup.class, EditGroup.class })
@NotBlank(message = "汇总编号不能为空", groups = { EditGroup.class })
private String summaryCode;
/**
@ -47,7 +49,7 @@ public class ErpTimesheetSummaryBo extends BaseEntity {
/**
* ()ID
*/
@NotNull(message = "汇总人(部门负责人)用户ID不能为空", groups = { AddGroup.class, EditGroup.class })
@NotNull(message = "汇总人(部门负责人)用户ID不能为空", groups = { EditGroup.class })
private Long userId;
/**
@ -58,32 +60,36 @@ public class ErpTimesheetSummaryBo extends BaseEntity {
/**
* ()
*/
private Long standardDays;
private BigDecimal standardDays;
/**
* ()
*/
private Long totalProjectHours;
private BigDecimal totalProjectHours;
/**
* ()
*/
private Long totalDeptHours;
private BigDecimal totalDeptHours;
/**
* ()
*/
private Long totalHours;
private BigDecimal totalHours;
/**
*
*/
private Long staffCount;
private Integer staffCount;
/**
*
*/
private String remark;
/**
*
*/
private List<ErpTimesheetSummaryDetailBo> summaryDetailList;
}

@ -8,6 +8,7 @@ import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.math.BigDecimal;
/**
* erp_timesheet_summary_detail
@ -35,7 +36,7 @@ public class ErpTimesheetSummaryDetailBo extends BaseEntity {
/**
*
*/
private Long sortOrder;
private Integer sortOrder;
/**
* ID
@ -72,7 +73,7 @@ public class ErpTimesheetSummaryDetailBo extends BaseEntity {
/**
* ()
*/
private Long originalHours;
private BigDecimal originalHours;
/**
* ID
@ -92,7 +93,7 @@ public class ErpTimesheetSummaryDetailBo extends BaseEntity {
/**
* ()
*/
private Long adjustedHours;
private BigDecimal adjustedHours;
/**
* 1 0

@ -12,6 +12,7 @@ import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
@ -64,7 +65,7 @@ public class ErpTimesheetStandardMonthVo implements Serializable {
* (21.021.5)
*/
@ExcelProperty(value = "月标准工时天数(如21.0、21.5)")
private Long standardDays;
private BigDecimal standardDays;
/**
*

@ -10,6 +10,7 @@ import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
@ -44,7 +45,7 @@ public class ErpTimesheetSummaryDetailVo implements Serializable {
*
*/
@ExcelProperty(value = "排序号")
private Long sortOrder;
private Integer sortOrder;
/**
* ID
@ -87,7 +88,7 @@ public class ErpTimesheetSummaryDetailVo implements Serializable {
* ()
*/
@ExcelProperty(value = "原项目工时(天)")
private Long originalHours;
private BigDecimal originalHours;
/**
* ID
@ -111,7 +112,7 @@ public class ErpTimesheetSummaryDetailVo implements Serializable {
* ()
*/
@ExcelProperty(value = "修改后工时(天)")
private Long adjustedHours;
private BigDecimal adjustedHours;
/**
* 1 0

@ -10,7 +10,9 @@ import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
@ -68,31 +70,31 @@ public class ErpTimesheetSummaryVo implements Serializable {
* ()
*/
@ExcelProperty(value = "月标准工时天数(冗余,取自标准月表)")
private Long standardDays;
private BigDecimal standardDays;
/**
* ()
*/
@ExcelProperty(value = "项目工时合计(天)")
private Long totalProjectHours;
private BigDecimal totalProjectHours;
/**
* ()
*/
@ExcelProperty(value = "部门工时合计(天)")
private Long totalDeptHours;
private BigDecimal totalDeptHours;
/**
* ()
*/
@ExcelProperty(value = "总工时合计(天)")
private Long totalHours;
private BigDecimal totalHours;
/**
*
*/
@ExcelProperty(value = "汇总人数")
private Long staffCount;
private Integer staffCount;
/**
*
@ -100,5 +102,22 @@ public class ErpTimesheetSummaryVo implements Serializable {
@ExcelProperty(value = "备注")
private String remark;
/**
*
*/
@ExcelProperty(value = "部门名称")
private String deptName;
/**
*
*/
@ExcelProperty(value = "负责人姓名")
private String leaderName;
/**
*
*/
private List<ErpTimesheetSummaryDetailVo> summaryDetailList;
}

@ -1,12 +1,15 @@
package org.dromara.oa.erp.mapper;
import java.util.List;
import java.util.Date;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.dromara.oa.erp.domain.ErpTimesheetSummary;
import org.dromara.oa.erp.domain.vo.ErpTimesheetSummaryVo;
import org.dromara.oa.erp.domain.vo.ErpTimesheetSummaryDetailVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
@ -34,4 +37,14 @@ public interface ErpTimesheetSummaryMapper extends BaseMapperPlus<ErpTimesheetSu
*/
public List<ErpTimesheetSummaryVo> selectCustomErpTimesheetSummaryVoList(@Param(Constants.WRAPPER) MPJLambdaWrapper<ErpTimesheetSummary> queryWrapper);
/**
*
*/
List<ErpTimesheetSummaryDetailVo> selectProjectAggregation(@Param("deptId") Long deptId, @Param("startDate") Date startDate, @Param("endDate") Date endDate);
/**
*
*/
List<ErpTimesheetSummaryDetailVo> selectDeptAggregation(@Param("deptId") Long deptId, @Param("startDate") Date startDate, @Param("endDate") Date endDate);
}

@ -66,4 +66,13 @@ public interface IErpTimesheetSummaryService {
* @return
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
*
*
* @param monthCode
* @param deptId ID
* @return
*/
ErpTimesheetSummaryVo generateSummary(String monthCode, Long deptId);
}

@ -1,10 +1,13 @@
package org.dromara.oa.erp.service.impl;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@ -14,7 +17,17 @@ import org.dromara.oa.erp.domain.bo.ErpTimesheetSummaryBo;
import org.dromara.oa.erp.domain.vo.ErpTimesheetSummaryVo;
import org.dromara.oa.erp.domain.ErpTimesheetSummary;
import org.dromara.oa.erp.mapper.ErpTimesheetSummaryMapper;
import org.dromara.oa.erp.mapper.ErpTimesheetSummaryDetailMapper;
import org.dromara.oa.erp.service.IErpTimesheetSummaryService;
import org.dromara.oa.erp.domain.ErpTimesheetSummaryDetail;
import org.dromara.oa.erp.domain.bo.ErpTimesheetSummaryDetailBo;
import org.springframework.transaction.annotation.Transactional;
import org.dromara.oa.erp.mapper.ErpTimesheetStandardMonthMapper;
import org.dromara.oa.erp.domain.ErpTimesheetStandardMonth;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.oa.erp.domain.vo.ErpTimesheetSummaryDetailVo;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@ -31,6 +44,8 @@ import java.util.Collection;
public class ErpTimesheetSummaryServiceImpl implements IErpTimesheetSummaryService {
private final ErpTimesheetSummaryMapper baseMapper;
private final ErpTimesheetSummaryDetailMapper detailMapper;
private final ErpTimesheetStandardMonthMapper standardMonthMapper;
/**
*
@ -39,23 +54,28 @@ public class ErpTimesheetSummaryServiceImpl implements IErpTimesheetSummaryServi
* @return
*/
@Override
public ErpTimesheetSummaryVo queryById(Long summaryId){
return baseMapper.selectVoById(summaryId);
public ErpTimesheetSummaryVo queryById(Long summaryId) {
ErpTimesheetSummaryVo vo = baseMapper.selectVoById(summaryId);
if (vo != null) {
vo.setSummaryDetailList(detailMapper.selectVoList(Wrappers.<ErpTimesheetSummaryDetail>lambdaQuery()
.eq(ErpTimesheetSummaryDetail::getSummaryId, summaryId)));
}
return vo;
}
/**
*
*
* @param bo
* @param pageQuery
* @return
*/
@Override
public TableDataInfo<ErpTimesheetSummaryVo> queryPageList(ErpTimesheetSummaryBo bo, PageQuery pageQuery) {
MPJLambdaWrapper<ErpTimesheetSummary> lqw = buildQueryWrapper(bo);
Page<ErpTimesheetSummaryVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
*
*
* @param bo
* @param pageQuery
* @return
*/
@Override
public TableDataInfo<ErpTimesheetSummaryVo> queryPageList(ErpTimesheetSummaryBo bo, PageQuery pageQuery) {
MPJLambdaWrapper<ErpTimesheetSummary> lqw = buildQueryWrapper(bo);
Page<ErpTimesheetSummaryVo> result = baseMapper.selectCustomErpTimesheetSummaryVoList(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
*
@ -66,25 +86,25 @@ public class ErpTimesheetSummaryServiceImpl implements IErpTimesheetSummaryServi
@Override
public List<ErpTimesheetSummaryVo> queryList(ErpTimesheetSummaryBo bo) {
MPJLambdaWrapper<ErpTimesheetSummary> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
return baseMapper.selectCustomErpTimesheetSummaryVoList(lqw);
}
private MPJLambdaWrapper<ErpTimesheetSummary> buildQueryWrapper(ErpTimesheetSummaryBo bo) {
Map<String, Object> params = bo.getParams();
MPJLambdaWrapper<ErpTimesheetSummary> lqw = JoinWrappers.lambda(ErpTimesheetSummary.class)
.selectAll(ErpTimesheetSummary.class)
.eq(ErpTimesheetSummary::getDelFlag, "0")
.eq(StringUtils.isNotBlank(bo.getSummaryCode()), ErpTimesheetSummary::getSummaryCode, bo.getSummaryCode())
.eq(StringUtils.isNotBlank(bo.getMonthCode()), ErpTimesheetSummary::getMonthCode, bo.getMonthCode())
.eq(bo.getDeptId() != null, ErpTimesheetSummary::getDeptId, bo.getDeptId())
.eq(bo.getUserId() != null, ErpTimesheetSummary::getUserId, bo.getUserId())
.eq(bo.getStandardMonthId() != null, ErpTimesheetSummary::getStandardMonthId, bo.getStandardMonthId())
.eq(bo.getStandardDays() != null, ErpTimesheetSummary::getStandardDays, bo.getStandardDays())
.eq(bo.getTotalProjectHours() != null, ErpTimesheetSummary::getTotalProjectHours, bo.getTotalProjectHours())
.eq(bo.getTotalDeptHours() != null, ErpTimesheetSummary::getTotalDeptHours, bo.getTotalDeptHours())
.eq(bo.getTotalHours() != null, ErpTimesheetSummary::getTotalHours, bo.getTotalHours())
.eq(bo.getStaffCount() != null, ErpTimesheetSummary::getStaffCount, bo.getStaffCount())
;
.selectAll(ErpTimesheetSummary.class)
.eq(ErpTimesheetSummary::getDelFlag, "0")
.eq(StringUtils.isNotBlank(bo.getSummaryCode()), ErpTimesheetSummary::getSummaryCode,
bo.getSummaryCode())
.eq(StringUtils.isNotBlank(bo.getMonthCode()), ErpTimesheetSummary::getMonthCode, bo.getMonthCode())
.eq(bo.getDeptId() != null, ErpTimesheetSummary::getDeptId, bo.getDeptId())
.eq(bo.getUserId() != null, ErpTimesheetSummary::getUserId, bo.getUserId())
.eq(bo.getStandardMonthId() != null, ErpTimesheetSummary::getStandardMonthId, bo.getStandardMonthId())
.eq(bo.getStandardDays() != null, ErpTimesheetSummary::getStandardDays, bo.getStandardDays())
.eq(bo.getTotalProjectHours() != null, ErpTimesheetSummary::getTotalProjectHours,
bo.getTotalProjectHours())
.eq(bo.getTotalDeptHours() != null, ErpTimesheetSummary::getTotalDeptHours, bo.getTotalDeptHours())
.eq(bo.getTotalHours() != null, ErpTimesheetSummary::getTotalHours, bo.getTotalHours())
.eq(bo.getStaffCount() != null, ErpTimesheetSummary::getStaffCount, bo.getStaffCount());
return lqw;
}
@ -95,12 +115,21 @@ public class ErpTimesheetSummaryServiceImpl implements IErpTimesheetSummaryServi
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean insertByBo(ErpTimesheetSummaryBo bo) {
if (StringUtils.isBlank(bo.getSummaryCode())) {
// 生成规则TS-月份-4位随机数
bo.setSummaryCode("TS" + bo.getMonthCode() + (int) ((Math.random() * 9 + 1) * 1000));
}
if (bo.getUserId() == null) {
bo.setUserId(LoginHelper.getUserId());
}
ErpTimesheetSummary add = MapstructUtils.convert(bo, ErpTimesheetSummary.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setSummaryId(add.getSummaryId());
saveDetails(add.getSummaryId(), bo.getSummaryDetailList());
}
return flag;
}
@ -112,17 +141,109 @@ public class ErpTimesheetSummaryServiceImpl implements IErpTimesheetSummaryServi
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean updateByBo(ErpTimesheetSummaryBo bo) {
ErpTimesheetSummary update = MapstructUtils.convert(bo, ErpTimesheetSummary.class);
validEntityBeforeSave(update);
// 先删除原有的明细
detailMapper.delete(Wrappers.<ErpTimesheetSummaryDetail>lambdaQuery()
.eq(ErpTimesheetSummaryDetail::getSummaryId, bo.getSummaryId()));
// 保存新明细
saveDetails(bo.getSummaryId(), bo.getSummaryDetailList());
return baseMapper.updateById(update) > 0;
}
/**
*
*/
private void saveDetails(Long summaryId, List<ErpTimesheetSummaryDetailBo> detailBoList) {
if (CollUtil.isNotEmpty(detailBoList)) {
List<ErpTimesheetSummaryDetail> details = MapstructUtils.convert(detailBoList,
ErpTimesheetSummaryDetail.class);
for (ErpTimesheetSummaryDetail detail : details) {
detail.setSummaryId(summaryId);
detail.setSummaryDetailId(null);
}
detailMapper.insertBatch(details);
}
}
@Override
public ErpTimesheetSummaryVo generateSummary(String monthCode, Long deptId) {
// 1. 获取标准月份
ErpTimesheetStandardMonth standardMonth = standardMonthMapper
.selectOne(Wrappers.<ErpTimesheetStandardMonth>lambdaQuery()
.eq(ErpTimesheetStandardMonth::getMonthCode, monthCode));
if (standardMonth == null) {
throw new ServiceException("该月份的标准工时未配置");
}
// 2. 聚合项目工时和部门工时
List<ErpTimesheetSummaryDetailVo> projectDetails = baseMapper.selectProjectAggregation(deptId,
standardMonth.getStartDate(), standardMonth.getEndDate());
List<ErpTimesheetSummaryDetailVo> deptDetails = baseMapper.selectDeptAggregation(deptId,
standardMonth.getStartDate(), standardMonth.getEndDate());
// 3. 合并明细并设置默认值
List<ErpTimesheetSummaryDetailVo> allDetails = new ArrayList<>();
int sortOrder = 1;
BigDecimal totalProjectHours = BigDecimal.ZERO;
BigDecimal totalDeptHours = BigDecimal.ZERO;
for (ErpTimesheetSummaryDetailVo pd : projectDetails) {
pd.setSortOrder(sortOrder++);
pd.setAdjustedHours(pd.getOriginalHours());
pd.setAdjustedProjectId(pd.getOriginalProjectId());
pd.setAdjustedProjectCode(pd.getOriginalProjectCode());
pd.setAdjustedProjectName(pd.getOriginalProjectName());
pd.setIsGenerated("1");
allDetails.add(pd);
totalProjectHours = totalProjectHours
.add(pd.getOriginalHours() != null ? pd.getOriginalHours() : BigDecimal.ZERO);
}
for (ErpTimesheetSummaryDetailVo dd : deptDetails) {
dd.setSortOrder(sortOrder++);
dd.setAdjustedHours(dd.getOriginalHours());
dd.setIsGenerated("1");
allDetails.add(dd);
totalDeptHours = totalDeptHours
.add(dd.getOriginalHours() != null ? dd.getOriginalHours() : BigDecimal.ZERO);
}
// 4. 组装主表数据
ErpTimesheetSummaryVo summaryVo = new ErpTimesheetSummaryVo();
summaryVo.setMonthCode(monthCode);
summaryVo.setDeptId(deptId);
summaryVo.setStandardMonthId(standardMonth.getStandardMonthId());
summaryVo.setStandardDays(standardMonth.getStandardDays());
summaryVo.setTotalProjectHours(totalProjectHours);
summaryVo.setTotalDeptHours(totalDeptHours);
summaryVo.setTotalHours(totalProjectHours.add(totalDeptHours));
// 统计不重复的人数
long staffCount = allDetails.stream().map(ErpTimesheetSummaryDetailVo::getStaffUserId).distinct().count();
summaryVo.setStaffCount((int) staffCount);
summaryVo.setSummaryDetailList(allDetails);
return summaryVo;
}
/**
*
*/
private void validEntityBeforeSave(ErpTimesheetSummary entity){
//TODO 做一些数据校验,如唯一约束
private void validEntityBeforeSave(ErpTimesheetSummary entity) {
// 校验同一部门同一月份不能重复生成
boolean exists = baseMapper.exists(Wrappers.<ErpTimesheetSummary>lambdaQuery()
.eq(ErpTimesheetSummary::getDeptId, entity.getDeptId())
.eq(ErpTimesheetSummary::getMonthCode, entity.getMonthCode())
.ne(entity.getSummaryId() != null, ErpTimesheetSummary::getSummaryId, entity.getSummaryId())
.eq(ErpTimesheetSummary::getDelFlag, "0"));
if (exists) {
throw new ServiceException("该部门 " + entity.getMonthCode() + " 月份的工时汇总已存在,请勿重复操作");
}
}
/**
@ -133,10 +254,15 @@ public class ErpTimesheetSummaryServiceImpl implements IErpTimesheetSummaryServi
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
if (isValid) {
// TODO 做一些业务上的校验,判断是否需要校验
}
// 删除关联明细
detailMapper.delete(Wrappers.<ErpTimesheetSummaryDetail>lambdaQuery()
.in(ErpTimesheetSummaryDetail::getSummaryId, ids));
return baseMapper.deleteByIds(ids) > 0;
}
}

@ -6,9 +6,49 @@
<resultMap type="org.dromara.oa.erp.domain.vo.ErpTimesheetSummaryVo" id="ErpTimesheetSummaryResult">
</resultMap>
<select id="selectCustomErpTimesheetSummaryVoList" resultMap="ErpTimesheetSummaryResult">
select summary_id, tenant_id, summary_code, month_code, dept_id, user_id, standard_month_id, standard_days, total_project_hours, total_dept_hours, total_hours, staff_count, remark, del_flag, create_dept, create_by, create_time, update_by, update_time from erp_timesheet_summary t
${ew.getCustomSqlSegment}
<select id="selectCustomErpTimesheetSummaryVoList" resultType="org.dromara.oa.erp.domain.vo.ErpTimesheetSummaryVo">
select t.*, d.dept_name, u.nick_name as leader_name
from erp_timesheet_summary t
left join sys_dept d on t.dept_id = d.dept_id and d.del_flag = '0'
left join sys_user u on d.leader = u.user_id and u.del_flag = '0'
${ew.getCustomSqlSegment}
</select>
<select id="selectProjectAggregation" resultType="org.dromara.oa.erp.domain.vo.ErpTimesheetSummaryDetailVo">
SELECT
i.user_id AS staffUserId,
u.nick_name AS staffName,
'1' AS isProject,
p.project_id AS originalProjectId,
p.project_code AS originalProjectCode,
p.project_name AS originalProjectName,
SUM(p.hours) AS originalHours
FROM erp_timesheet_info i
JOIN erp_timesheet_project p ON i.timesheet_id = p.timesheet_id
LEFT JOIN sys_user u ON i.user_id = u.user_id
WHERE i.dept_id = #{deptId}
AND i.timesheet_status = '3'
AND i.start_time &lt;= #{endDate}
AND i.end_time &gt;= #{startDate}
AND i.del_flag = '0' AND p.del_flag = '0'
GROUP BY i.user_id, u.nick_name, p.project_id, p.project_code, p.project_name
</select>
<select id="selectDeptAggregation" resultType="org.dromara.oa.erp.domain.vo.ErpTimesheetSummaryDetailVo">
SELECT
i.user_id AS staffUserId,
u.nick_name AS staffName,
'0' AS isProject,
SUM(d.hours) AS originalHours
FROM erp_timesheet_info i
JOIN erp_timesheet_dept d ON i.timesheet_id = d.timesheet_id
LEFT JOIN sys_user u ON i.user_id = u.user_id
WHERE i.dept_id = #{deptId}
AND i.timesheet_status = '3'
AND i.start_time &lt;= #{endDate}
AND i.end_time &gt;= #{startDate}
AND i.del_flag = '0' AND d.del_flag = '0'
GROUP BY i.user_id, u.nick_name
</select>
</mapper>

Loading…
Cancel
Save