feat(oa/erp): 添加预投工时分配功能查询可用源项目接口

- 新增 listAvailableSourceProjects 接口用于查询当前部门指定月份已填报工时的来源预投项目
- 实现服务层 listAvailableSourceProjects 方法,通过月度汇总数据查找符合条件的预投项目
- 添加 getSingleSummaryOrNull 私有方法用于获取单个月度汇总记录并处理异常情况
- 引入 ErpProjectInfoVo 对象用于返回项目信息数据
- 集成权限校验注解确保接口访问安全
dev
yangk 1 month ago
parent 1d35ca444e
commit db869123dd

@ -17,6 +17,7 @@ import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.oa.erp.domain.vo.ErpProjectInfoVo;
import org.dromara.oa.erp.domain.vo.ErpTimesheetPreAllocVo;
import org.dromara.oa.erp.domain.bo.ErpTimesheetPreAllocBo;
import org.dromara.oa.erp.domain.vo.PreAllocDetailVo;
@ -80,6 +81,15 @@ public class ErpTimesheetPreAllocController extends BaseController {
return R.ok(erpTimesheetPreAllocService.getStaffAllocDetails(monthCode, projectId));
}
/**
*
*/
@SaCheckPermission("oa/erp:timesheetPreAlloc:query")
@GetMapping("/listAvailableSourceProjects")
public R<List<ErpProjectInfoVo>> listAvailableSourceProjects(@NotBlank(message = "月份编码不能为空") String monthCode) {
return R.ok(erpTimesheetPreAllocService.listAvailableSourceProjects(monthCode));
}
/**
*
*/

@ -4,6 +4,7 @@ import org.dromara.oa.erp.domain.vo.ErpTimesheetPreAllocVo;
import org.dromara.oa.erp.domain.bo.ErpTimesheetPreAllocBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.oa.erp.domain.vo.ErpProjectInfoVo;
import org.dromara.oa.erp.domain.vo.PreAllocDetailVo;
import java.util.Collection;
@ -59,6 +60,14 @@ public interface IErpTimesheetPreAllocService {
*/
PreAllocDetailVo getStaffAllocDetails(String monthCode, Long projectId);
/**
*
*
* @param monthCode (YYYYMM)
* @return
*/
List<ErpProjectInfoVo> listAvailableSourceProjects(String monthCode);
/**
*
*

@ -19,6 +19,7 @@ import org.dromara.oa.erp.domain.ErpTimesheetSummaryDetail;
import org.dromara.oa.erp.domain.bo.ErpTimesheetPreAllocBo;
import org.dromara.oa.erp.domain.bo.PreAllocStaffAllocBo;
import org.dromara.oa.erp.domain.bo.PreAllocTargetBo;
import org.dromara.oa.erp.domain.vo.ErpProjectInfoVo;
import org.dromara.oa.erp.domain.vo.ErpTimesheetPreAllocVo;
import org.dromara.oa.erp.domain.vo.PreAllocDetailVo;
import org.dromara.oa.erp.domain.vo.PreAllocStaffAllocVo;
@ -214,6 +215,45 @@ public class ErpTimesheetPreAllocServiceImpl implements IErpTimesheetPreAllocSer
return detailVo;
}
/**
*
*
* @param monthCode (YYYYMM)
* @return
*/
@Override
public List<ErpProjectInfoVo> listAvailableSourceProjects(String monthCode) {
validateMonthCode(monthCode);
Long deptId = LoginHelper.getDeptId();
ErpTimesheetSummary summary = getSingleSummaryOrNull(monthCode, deptId);
if (summary == null) {
return Collections.emptyList();
}
List<ErpTimesheetSummaryDetail> detailList = summaryDetailMapper.selectList(Wrappers.<ErpTimesheetSummaryDetail>lambdaQuery()
.select(ErpTimesheetSummaryDetail::getOriginalProjectId)
.eq(ErpTimesheetSummaryDetail::getSummaryId, summary.getSummaryId())
.eq(ErpTimesheetSummaryDetail::getIsProject, PROJECT_WORK)
.eq(ErpTimesheetSummaryDetail::getDelFlag, DEL_FLAG_NORMAL)
.isNotNull(ErpTimesheetSummaryDetail::getOriginalProjectId)
.gt(ErpTimesheetSummaryDetail::getOriginalHours, BigDecimal.ZERO));
List<Long> projectIds = detailList.stream()
.map(ErpTimesheetSummaryDetail::getOriginalProjectId)
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.toList());
if (projectIds.isEmpty()) {
return Collections.emptyList();
}
return projectInfoMapper.selectVoList(Wrappers.<ErpProjectInfo>lambdaQuery()
.in(ErpProjectInfo::getProjectId, projectIds)
.eq(ErpProjectInfo::getProjectCategory, PRE_PROJECT_CATEGORY)
.eq(ErpProjectInfo::getDelFlag, DEL_FLAG_NORMAL)
.orderByAsc(ErpProjectInfo::getProjectCode)
.orderByAsc(ErpProjectInfo::getProjectName));
}
/**
*
*
@ -349,6 +389,23 @@ public class ErpTimesheetPreAllocServiceImpl implements IErpTimesheetPreAllocSer
return summaries.get(0);
}
private ErpTimesheetSummary getSingleSummaryOrNull(String monthCode, Long deptId) {
if (deptId == null) {
throw new ServiceException("当前登录用户未绑定部门,无法进行预投工时分配");
}
List<ErpTimesheetSummary> summaries = summaryMapper.selectList(Wrappers.<ErpTimesheetSummary>lambdaQuery()
.eq(ErpTimesheetSummary::getMonthCode, monthCode)
.eq(ErpTimesheetSummary::getDeptId, deptId)
.eq(ErpTimesheetSummary::getDelFlag, DEL_FLAG_NORMAL));
if (summaries.isEmpty()) {
return null;
}
if (summaries.size() > 1) {
throw new ServiceException("当前部门该月份存在多个月汇总工时,请先修正月汇总数据");
}
return summaries.get(0);
}
private ErpTimesheetSummary lockSummary(Long summaryId) {
ErpTimesheetSummary summary = summaryMapper.selectOne(Wrappers.<ErpTimesheetSummary>lambdaQuery()
.eq(ErpTimesheetSummary::getSummaryId, summaryId)

Loading…
Cancel
Save