feat(oa/erp): 优化工时汇总明细功能

- 在ErpTimesheetSummaryDetailBo中新增summaryCode和summaryDetailIds字段
- 新增关联查询支持按汇总主表编号进行筛选
- 优化工时汇总明细VO的Excel导出配置
- 改进汇总编号生成策略为TS+月份+递增序列
- 在汇总主表查询中新增工作描述聚合功能
dev
Yangk 2 months ago
parent 3dc735d1e6
commit 72bc701970

@ -33,6 +33,11 @@ public class ErpTimesheetSummaryDetailBo extends BaseEntity {
@NotNull(message = "关联汇总主表ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long summaryId;
/**
*
*/
private String summaryCode;
/**
*
*/
@ -110,5 +115,10 @@ public class ErpTimesheetSummaryDetailBo extends BaseEntity {
*/
private String remark;
/**
* ID()
*/
private String summaryDetailIds;
}

@ -32,25 +32,27 @@ public class ErpTimesheetSummaryDetailVo implements Serializable {
/**
* ID
*/
@ExcelProperty(value = "汇总明细ID")
private Long summaryDetailId;
/**
* ID
*/
@ExcelProperty(value = "关联汇总主表ID")
private Long summaryId;
/**
*
*/
@ExcelProperty(value = "关联汇总主表编号")
private String summaryCode;
/**
*
*/
@ExcelProperty(value = "排序号")
private Integer sortOrder;
/**
* ID
*/
@ExcelProperty(value = "员工用户ID")
private Long staffUserId;
/**
@ -69,49 +71,47 @@ public class ErpTimesheetSummaryDetailVo implements Serializable {
/**
* ID()
*/
@ExcelProperty(value = "原项目ID(填报时的项目)")
private Long originalProjectId;
/**
* ()
*/
@ExcelProperty(value = "原项目编码(冗余)")
@ExcelProperty(value = "原项目编码")
private String originalProjectCode;
/**
* ()
*/
@ExcelProperty(value = "原项目名称(冗余)")
@ExcelProperty(value = "原项目名称")
private String originalProjectName;
/**
* ()
*/
@ExcelProperty(value = "原项目工时(天)")
@ExcelProperty(value = "原项目工时")
private BigDecimal originalHours;
/**
* ID
*/
@ExcelProperty(value = "修改后项目ID")
private Long adjustedProjectId;
/**
* ()
*/
@ExcelProperty(value = "修改后项目编码(冗余)")
@ExcelProperty(value = "修改后项目编码")
private String adjustedProjectCode;
/**
* ()
*/
@ExcelProperty(value = "修改后项目名称(冗余)")
@ExcelProperty(value = "修改后项目名称")
private String adjustedProjectName;
/**
* ()
*/
@ExcelProperty(value = "修改后工时(天)")
@ExcelProperty(value = "修改后工时")
private BigDecimal adjustedHours;
/**

@ -17,21 +17,6 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
*/
public interface ErpTimesheetSummaryDetailMapper extends BaseMapperPlus<ErpTimesheetSummaryDetail, ErpTimesheetSummaryDetailVo> {
/**
*
*
* @param page
* @param queryWrapper
* @return
*/
public Page<ErpTimesheetSummaryDetailVo> selectCustomErpTimesheetSummaryDetailVoList(@Param("page") Page<ErpTimesheetSummaryDetailVo> page, @Param(Constants.WRAPPER) MPJLambdaWrapper<ErpTimesheetSummaryDetail> queryWrapper);
/**
*
*
* @param queryWrapper
* @return
*/
public List<ErpTimesheetSummaryDetailVo> selectCustomErpTimesheetSummaryDetailVoList(@Param(Constants.WRAPPER) MPJLambdaWrapper<ErpTimesheetSummaryDetail> queryWrapper);
}

@ -12,6 +12,7 @@ import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.dromara.oa.erp.domain.bo.ErpTimesheetSummaryDetailBo;
import org.dromara.oa.erp.domain.vo.ErpTimesheetSummaryDetailVo;
import org.dromara.oa.erp.domain.ErpTimesheetSummary;
import org.dromara.oa.erp.domain.ErpTimesheetSummaryDetail;
import org.dromara.oa.erp.mapper.ErpTimesheetSummaryDetailMapper;
import org.dromara.oa.erp.service.IErpTimesheetSummaryDetailService;
@ -50,12 +51,11 @@ public class ErpTimesheetSummaryDetailServiceImpl implements IErpTimesheetSummar
* @param pageQuery
* @return
*/
@Override
public TableDataInfo<ErpTimesheetSummaryDetailVo> queryPageList(ErpTimesheetSummaryDetailBo bo, PageQuery pageQuery) {
MPJLambdaWrapper<ErpTimesheetSummaryDetail> lqw = buildQueryWrapper(bo);
Page<ErpTimesheetSummaryDetailVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
@Override
public TableDataInfo<ErpTimesheetSummaryDetailVo> queryPageList(ErpTimesheetSummaryDetailBo bo, PageQuery pageQuery) {
MPJLambdaWrapper<ErpTimesheetSummaryDetail> lqw = buildQueryWrapper(bo);
return TableDataInfo.build(baseMapper.selectJoinPage(pageQuery.build(), ErpTimesheetSummaryDetailVo.class, lqw));
}
/**
*
@ -66,15 +66,18 @@ public class ErpTimesheetSummaryDetailServiceImpl implements IErpTimesheetSummar
@Override
public List<ErpTimesheetSummaryDetailVo> queryList(ErpTimesheetSummaryDetailBo bo) {
MPJLambdaWrapper<ErpTimesheetSummaryDetail> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
return baseMapper.selectJoinList(ErpTimesheetSummaryDetailVo.class, lqw);
}
private MPJLambdaWrapper<ErpTimesheetSummaryDetail> buildQueryWrapper(ErpTimesheetSummaryDetailBo bo) {
Map<String, Object> params = bo.getParams();
MPJLambdaWrapper<ErpTimesheetSummaryDetail> lqw = JoinWrappers.lambda(ErpTimesheetSummaryDetail.class)
.selectAll(ErpTimesheetSummaryDetail.class)
.selectAs(ErpTimesheetSummary::getSummaryCode, ErpTimesheetSummaryDetailVo::getSummaryCode)
.leftJoin(ErpTimesheetSummary.class, ErpTimesheetSummary::getSummaryId, ErpTimesheetSummaryDetail::getSummaryId)
.eq(ErpTimesheetSummaryDetail::getDelFlag, "0")
.eq(bo.getSummaryId() != null, ErpTimesheetSummaryDetail::getSummaryId, bo.getSummaryId())
.eq(StringUtils.isNotBlank(bo.getSummaryCode()), ErpTimesheetSummary::getSummaryCode, bo.getSummaryCode())
.eq(bo.getSortOrder() != null, ErpTimesheetSummaryDetail::getSortOrder, bo.getSortOrder())
.eq(bo.getStaffUserId() != null, ErpTimesheetSummaryDetail::getStaffUserId, bo.getStaffUserId())
.like(StringUtils.isNotBlank(bo.getStaffName()), ErpTimesheetSummaryDetail::getStaffName, bo.getStaffName())
@ -89,7 +92,8 @@ public class ErpTimesheetSummaryDetailServiceImpl implements IErpTimesheetSummar
.eq(bo.getAdjustedHours() != null, ErpTimesheetSummaryDetail::getAdjustedHours, bo.getAdjustedHours())
.eq(StringUtils.isNotBlank(bo.getIsGenerated()), ErpTimesheetSummaryDetail::getIsGenerated, bo.getIsGenerated())
.eq(StringUtils.isNotBlank(bo.getWorkDescription()), ErpTimesheetSummaryDetail::getWorkDescription, bo.getWorkDescription())
;
.in(StringUtils.isNotBlank(bo.getSummaryDetailIds()), ErpTimesheetSummaryDetail::getSummaryDetailId,
StringUtils.isNotBlank(bo.getSummaryDetailIds()) ? List.of(bo.getSummaryDetailIds().split(",")) : null);
return lqw;
}

@ -1,5 +1,6 @@
package org.dromara.oa.erp.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.core.utils.MapstructUtils;
@ -118,8 +119,23 @@ public class ErpTimesheetSummaryServiceImpl implements IErpTimesheetSummaryServi
@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));
// 生成规则TS + 月份代码(yyyyMM) + 4位递增序列(0001)
String prefix = "TS" + bo.getMonthCode();
ErpTimesheetSummary lastOne = baseMapper.selectOne(new LambdaQueryWrapper<ErpTimesheetSummary>()
.likeRight(ErpTimesheetSummary::getSummaryCode, prefix)
.orderByDesc(ErpTimesheetSummary::getSummaryCode)
.last("limit 1"));
int nextNum = 1;
if (lastOne != null) {
String lastCode = lastOne.getSummaryCode();
if (lastCode.length() >= 4) {
try {
nextNum = Integer.parseInt(lastCode.substring(lastCode.length() - 4)) + 1;
} catch (NumberFormatException ignored) {
}
}
}
bo.setSummaryCode(prefix + String.format("%04d", nextNum));
}
if (bo.getUserId() == null) {
bo.setUserId(LoginHelper.getUserId());

@ -6,9 +6,6 @@
<resultMap type="org.dromara.oa.erp.domain.vo.ErpTimesheetSummaryDetailVo" id="ErpTimesheetSummaryDetailResult">
</resultMap>
<select id="selectCustomErpTimesheetSummaryDetailVoList" resultMap="ErpTimesheetSummaryDetailResult">
select summary_detail_id, tenant_id, summary_id, sort_order, staff_user_id, staff_name, is_project, original_project_id, original_project_code, original_project_name, original_hours, adjusted_project_id, adjusted_project_code, adjusted_project_name, adjusted_hours, is_generated, work_description, remark, del_flag, create_dept, create_by, create_time, update_by, update_time from erp_timesheet_summary_detail t
${ew.getCustomSqlSegment}
</select>
</mapper>

@ -39,6 +39,7 @@
i.user_id AS staffUserId,
u.nick_name AS staffName,
'0' AS isProject,
GROUP_CONCAT(DISTINCT d.work_description SEPARATOR '; ') AS workDescription,
SUM(d.hours) AS originalHours
FROM erp_timesheet_info i
JOIN erp_timesheet_dept d ON i.timesheet_id = d.timesheet_id

Loading…
Cancel
Save