|
|
|
|
@ -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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|