feat:填报工时添加删除功能

main^2
chenhao 2024-11-01 10:11:49 +08:00
parent ecc2b56c6f
commit f9b4b3d49d
3 changed files with 71 additions and 55 deletions

View File

@ -24,8 +24,7 @@ import java.util.List;
*/ */
@RestController @RestController
@RequestMapping("/business/project") @RequestMapping("/business/project")
public class ProjectController extends BaseController public class ProjectController extends BaseController {
{
@Autowired @Autowired
private IProjectService service; private IProjectService service;
@Autowired @Autowired
@ -36,8 +35,7 @@ public class ProjectController extends BaseController
*/ */
// @PreAuthorize("@ss.hasPermi('system:dept:list')") // @PreAuthorize("@ss.hasPermi('system:dept:list')")
@GetMapping("/list") @GetMapping("/list")
public TableDataInfo list(Project project) public TableDataInfo list(Project project) {
{
startPage(); startPage();
List<Project> projectList = service.permissisonList(project); List<Project> projectList = service.permissisonList(project);
return getDataTable(projectList); return getDataTable(projectList);
@ -49,41 +47,40 @@ public class ProjectController extends BaseController
// @PreAuthorize("@ss.hasPermi('system:dept:list')") // @PreAuthorize("@ss.hasPermi('system:dept:list')")
@PostMapping("/add") @PostMapping("/add")
@Log(title = "项目管理", businessType = BusinessType.INSERT) @Log(title = "项目管理", businessType = BusinessType.INSERT)
public AjaxResult addData(@RequestBody Project project) public AjaxResult addData(@RequestBody Project project) {
{
service.insert(project); service.insert(project);
return success(project); return success(project);
} }
/** /**
* *
*/ */
// @PreAuthorize("@ss.hasPermi('system:dept:list')") // @PreAuthorize("@ss.hasPermi('system:dept:list')")
@PostMapping("/updateCheck") @PostMapping("/updateCheck")
public AjaxResult updateCheck(@RequestBody Project project) public AjaxResult updateCheck(@RequestBody Project project) {
{
return AjaxResult.success(service.updateCheck(project)); return AjaxResult.success(service.updateCheck(project));
} }
/** /**
* *
*/ */
// @PreAuthorize("@ss.hasPermi('system:dept:list')") // @PreAuthorize("@ss.hasPermi('system:dept:list')")
@PutMapping("/update") @PutMapping("/update")
@Log(title = "项目管理", businessType = BusinessType.UPDATE) @Log(title = "项目管理", businessType = BusinessType.UPDATE)
public AjaxResult updateDate(@RequestBody Project project) public AjaxResult updateDate(@RequestBody Project project) {
{
service.update(project); service.update(project);
return success(); return success();
} }
/** /**
* *
*
* @return * @return
*/ */
@GetMapping("/getCode") @GetMapping("/getCode")
public AjaxResult getCode(){ public AjaxResult getCode() {
return AjaxResult.success("",IdUtils.fastUUID()); return AjaxResult.success("", IdUtils.fastUUID());
} }
/** /**
@ -92,65 +89,64 @@ public class ProjectController extends BaseController
// @PreAuthorize("@ss.hasPermi('system:dept:remove')") // @PreAuthorize("@ss.hasPermi('system:dept:remove')")
@Log(title = "项目人员管理", businessType = BusinessType.DELETE) @Log(title = "项目人员管理", businessType = BusinessType.DELETE)
@DeleteMapping("/team/{teamId}") @DeleteMapping("/team/{teamId}")
public AjaxResult teamRemove(@PathVariable Integer teamId) public AjaxResult teamRemove(@PathVariable Integer teamId) {
{
return toAjax(teamService.deleteById(teamId)); return toAjax(teamService.deleteById(teamId));
} }
/** /**
* *
*/ */
// @PreAuthorize("@ss.hasPermi('system:dept:remove')") // @PreAuthorize("@ss.hasPermi('system:dept:remove')")
@Log(title = "项目人员管理", businessType = BusinessType.UPDATE) @Log(title = "项目人员管理", businessType = BusinessType.UPDATE)
@PostMapping("/team") @PostMapping("/team")
public AjaxResult personnelChanges(@RequestBody ProjectTeam team) public AjaxResult personnelChanges(@RequestBody ProjectTeam team) {
{
return success(teamService.personnelChanges(team)); return success(teamService.personnelChanges(team));
} }
/** /**
* *
*/ */
// @PreAuthorize("@ss.hasPermi('system:dept:remove')") // @PreAuthorize("@ss.hasPermi('system:dept:remove')")
@Log(title = "项目管理", businessType = BusinessType.DELETE) @Log(title = "项目管理", businessType = BusinessType.DELETE)
@DeleteMapping("/{projectId}") @DeleteMapping("/{projectId}")
public AjaxResult remove(@PathVariable Integer projectId) public AjaxResult remove(@PathVariable Integer projectId) {
{
return toAjax(service.deleteById(projectId)); return toAjax(service.deleteById(projectId));
} }
/** /**
* *
*/ */
// @PreAuthorize("@ss.hasPermi('system:dept:remove')") // @PreAuthorize("@ss.hasPermi('system:dept:remove')")
@GetMapping("/{projectId}") @GetMapping("/{projectId}")
public AjaxResult getTeamInfo(@PathVariable Integer projectId) public AjaxResult getTeamInfo(@PathVariable Integer projectId) {
{
return success(service.getTeamInfo(projectId)); return success(service.getTeamInfo(projectId));
} }
/** /**
* *
*/ */
// @PreAuthorize("@ss.hasPermi('system:dept:remove')") // @PreAuthorize("@ss.hasPermi('system:dept:remove')")
@GetMapping("/info/{projectId}") @GetMapping("/info/{projectId}")
public AjaxResult getProject(@PathVariable Integer projectId) public AjaxResult getProject(@PathVariable Integer projectId) {
{
return success(service.queryById(projectId)); return success(service.queryById(projectId));
} }
/** /**
* *
*/ */
// @PreAuthorize("@ss.hasPermi('system:dept:remove')") // @PreAuthorize("@ss.hasPermi('system:dept:remove')")
@PostMapping("/executionInfo") @PostMapping("/executionInfo")
public AjaxResult executionInfo(@RequestBody WorkLogger workLogger) public AjaxResult executionInfo(@RequestBody WorkLogger workLogger) {
{
return success(service.executionInfo(workLogger)); return success(service.executionInfo(workLogger));
} }
/** /**
* *
*/ */
// @PreAuthorize("@ss.hasPermi('system:dept:remove')") // @PreAuthorize("@ss.hasPermi('system:dept:remove')")
@PostMapping("/workInfo") @PostMapping("/workInfo")
public AjaxResult workInfo(@RequestBody ProjectQueryDto dto) public AjaxResult workInfo(@RequestBody ProjectQueryDto dto) {
{
return success(service.workInfo(dto)); return success(service.workInfo(dto));
} }
} }

View File

@ -41,6 +41,16 @@ public class WorkHourController extends BaseController {
* *
*/ */
// @PreAuthorize("@ss.hasPermi('system:dept:list')") // @PreAuthorize("@ss.hasPermi('system:dept:list')")
@DeleteMapping("/{id}")
@Log(title = "工作日志", businessType = BusinessType.INSERT)
public AjaxResult deleteData(@PathVariable Integer id) {
service.deleteById(id);
return success();
}
/**
*
*/
// @PreAuthorize("@ss.hasPermi('system:dept:list')")
@PutMapping("/update") @PutMapping("/update")
@Log(title = "工作日志", businessType = BusinessType.UPDATE) @Log(title = "工作日志", businessType = BusinessType.UPDATE)
public AjaxResult updateData(@RequestBody WorkLogger workLogger) { public AjaxResult updateData(@RequestBody WorkLogger workLogger) {

View File

@ -12,7 +12,6 @@ import tech.unissense.pms.business.project.vo.ProjectExecutionVo;
import tech.unissense.pms.business.project.vo.ProjectWorkInfoVo; import tech.unissense.pms.business.project.vo.ProjectWorkInfoVo;
import tech.unissense.pms.business.projectteam.domain.ProjectTeam; import tech.unissense.pms.business.projectteam.domain.ProjectTeam;
import tech.unissense.pms.business.projectteam.service.IProjectTeamService; import tech.unissense.pms.business.projectteam.service.IProjectTeamService;
import tech.unissense.pms.business.projectteam.vo.TeamStaticsVo; import tech.unissense.pms.business.projectteam.vo.TeamStaticsVo;
import tech.unissense.pms.business.work.logger.domain.WorkLogger; import tech.unissense.pms.business.work.logger.domain.WorkLogger;
import tech.unissense.pms.business.work.logger.service.IWorkLoggerService; import tech.unissense.pms.business.work.logger.service.IWorkLoggerService;
@ -57,7 +56,6 @@ public class ProjectServiceImpl implements IProjectService {
@Autowired @Autowired
private RedisCache redisCache; private RedisCache redisCache;
/** /**
* ID * ID
* *
@ -98,20 +96,23 @@ public class ProjectServiceImpl implements IProjectService {
private void dataPermissions(Project project) { private void dataPermissions(Project project) {
SysUser user = SecurityUtils.getLoginUser().getUser(); SysUser user = SecurityUtils.getLoginUser().getUser();
StringBuilder sql = new StringBuilder(); StringBuilder sql = new StringBuilder();
if (user.isAdmin()){ if (user.isAdmin()) {
return; return;
} }
if (CollUtil.isEmpty(user.getRoles())){ if (CollUtil.isEmpty(user.getRoles())) {
sql.append(" and 1=2"); sql.append(" and 1=2");
project.getParams().put("dataScope",sql); project.getParams().put("dataScope", sql);
return; return;
} }
if (user.getRoles().stream().anyMatch(item-> "企业管理员".equals(item.getRoleName())|| "公司领导".equals(item.getRoleName()))){ if (user.getRoles().stream()
.anyMatch(item -> "企业管理员".equals(item.getRoleName()) || "公司领导".equals(item.getRoleName()))) {
}else if (user.getRoles().stream().anyMatch(item -> "项目经理".equals(item.getRoleName()))){ } else if (user.getRoles().stream().anyMatch(item -> "项目经理".equals(item.getRoleName()))) {
sql.append("and (t1.project_id in (select project_id from pms_project_team where user_id={} ) or t1.project_leader={} or t1.create_by={})"); sql.append(
project.getParams().put("dataScope", StringUtils.format(sql.toString(), user.getUserId(), user.getUserId(), user.getUserId())); "and (t1.project_id in (select project_id from pms_project_team where user_id={} ) or t1.project_leader={} or t1.create_by={})");
}else{ project.getParams().put("dataScope",
StringUtils.format(sql.toString(), user.getUserId(), user.getUserId(), user.getUserId()));
} else {
sql.append("and (t1.project_id in (select project_id from pms_project_team where user_id={} ))"); sql.append("and (t1.project_id in (select project_id from pms_project_team where user_id={} ))");
project.getParams().put("dataScope", StringUtils.format(sql.toString(), user.getUserId())); project.getParams().put("dataScope", StringUtils.format(sql.toString(), user.getUserId()));
} }
@ -126,6 +127,7 @@ public class ProjectServiceImpl implements IProjectService {
} }
return ""; return "";
} }
/** /**
* *
* *
@ -138,7 +140,7 @@ public class ProjectServiceImpl implements IProjectService {
if (StringUtils.isNotEmpty(errorMsg)) { if (StringUtils.isNotEmpty(errorMsg)) {
throw new ServiceException(errorMsg); throw new ServiceException(errorMsg);
} }
if (StringUtils.isEmpty(project.getState())){ if (StringUtils.isEmpty(project.getState())) {
project.setState("0"); project.setState("0");
} }
if (StringUtils.isEmpty(project.getProjectCode())) { if (StringUtils.isEmpty(project.getProjectCode())) {
@ -153,9 +155,11 @@ public class ProjectServiceImpl implements IProjectService {
String existProjectCode = projectMapper.selectProjectCode(DateUtils.toDate(currentDate)); String existProjectCode = projectMapper.selectProjectCode(DateUtils.toDate(currentDate));
int initValue = 1; int initValue = 1;
try { try {
initValue = StringUtils.isNotEmpty(existProjectCode) ? Integer.parseInt(existProjectCode.substring(existProjectCode.length() - 4)) + 1 : 1; initValue = StringUtils.isNotEmpty(existProjectCode)
? Integer.parseInt(existProjectCode.substring(existProjectCode.length() - 4)) + 1
: 1;
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
log.error("项目编码格式化错误,项目编码为:{}",existProjectCode); log.error("项目编码格式化错误,项目编码为:{}", existProjectCode);
} }
return new AtomicInteger(initValue); return new AtomicInteger(initValue);
} else { } else {
@ -172,7 +176,8 @@ public class ProjectServiceImpl implements IProjectService {
} }
// 新增项目 // 新增项目
this.projectMapper.insert(project); this.projectMapper.insert(project);
// project.getProjectTeamList().forEach(item -> item.setProjectId(project.getProjectId())); // project.getProjectTeamList().forEach(item ->
// item.setProjectId(project.getProjectId()));
// // 新增项目人员 // // 新增项目人员
// teamService.insertBatch(project.getProjectTeamList()); // teamService.insertBatch(project.getProjectTeamList());
return project; return project;
@ -226,7 +231,7 @@ public class ProjectServiceImpl implements IProjectService {
return projectTeamList.stream().map(item -> { return projectTeamList.stream().map(item -> {
String userIdStr = String.valueOf(item.getUserId()); String userIdStr = String.valueOf(item.getUserId());
BigDecimal workTime = workHourVo.getOrDefault(userIdStr, BigDecimal.ZERO); BigDecimal workTime = workHourVo.getOrDefault(userIdStr, BigDecimal.ZERO);
TeamStaticsVo teamStaticsVo = new TeamStaticsVo(); TeamStaticsVo teamStaticsVo = new TeamStaticsVo();
teamStaticsVo.setTeamId(item.getTeamId()); teamStaticsVo.setTeamId(item.getTeamId());
teamStaticsVo.setUserName(item.getUserName()); teamStaticsVo.setUserName(item.getUserName());
@ -259,7 +264,8 @@ public class ProjectServiceImpl implements IProjectService {
Map<String, BigDecimal> workTimeMap = workLoggerService.list(workLogger).stream() Map<String, BigDecimal> workTimeMap = workLoggerService.list(workLogger).stream()
.filter(item -> teamSet.contains(item.getProjectId() + "_" + item.getUserId())) .filter(item -> teamSet.contains(item.getProjectId() + "_" + item.getUserId()))
.collect(Collectors.toMap( .collect(Collectors.toMap(
item -> item.getProjectId() + "_" + DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, item.getLoggerDate()), item -> item.getProjectId() + "_"
+ DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, item.getLoggerDate()),
item -> new BigDecimal(item.getWorkTime()), item -> new BigDecimal(item.getWorkTime()),
BigDecimal::add)); BigDecimal::add));
@ -270,8 +276,10 @@ public class ProjectServiceImpl implements IProjectService {
List<BigDecimal> tempList = Stream.iterate(startDate, date -> date.plusDays(1)) List<BigDecimal> tempList = Stream.iterate(startDate, date -> date.plusDays(1))
.limit(ChronoUnit.DAYS.between(startDate, endDate) + 1) .limit(ChronoUnit.DAYS.between(startDate, endDate) + 1)
.map(localDate -> { .map(localDate -> {
if (localDate.isAfter(project.getEndDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()) || if (localDate.isAfter(
localDate.isBefore(project.getStartDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate())) { project.getEndDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()) ||
localDate.isBefore(project.getStartDate().toInstant().atZone(ZoneId.systemDefault())
.toLocalDate())) {
return BigDecimal.ZERO; return BigDecimal.ZERO;
} }
return workTimeMap.getOrDefault(project.getProjectId() + "_" + localDate, BigDecimal.ZERO); return workTimeMap.getOrDefault(project.getProjectId() + "_" + localDate, BigDecimal.ZERO);
@ -297,20 +305,21 @@ public class ProjectServiceImpl implements IProjectService {
List<WorkLogger> workLoggerList = workLoggerService.listUser(workLogger); List<WorkLogger> workLoggerList = workLoggerService.listUser(workLogger);
ProjectTeam projectTeam = new ProjectTeam(); ProjectTeam projectTeam = new ProjectTeam();
projectTeam.setProjectId(projectQueryDto.getProjectId()); projectTeam.setProjectId(projectQueryDto.getProjectId());
Set<Integer> projectTeamSet = teamService.list(projectTeam).stream().map(ProjectTeam::getUserId).collect(Collectors.toSet()); Set<Integer> projectTeamSet = teamService.list(projectTeam).stream().map(ProjectTeam::getUserId)
.collect(Collectors.toSet());
// 使用流按日期分组并对每个日期的工人按用户ID去重保留最后一次记录 // 使用流按日期分组并对每个日期的工人按用户ID去重保留最后一次记录
Map<String, List<WorkLogger>> workersByDateMap = workLoggerList.stream().filter(item->projectTeamSet.contains(item.getUserId())) Map<String, List<WorkLogger>> workersByDateMap = workLoggerList.stream()
.filter(item -> projectTeamSet.contains(item.getUserId()))
.collect(Collectors.groupingBy( .collect(Collectors.groupingBy(
logger -> DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, logger.getLoggerDate()), logger -> DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, logger.getLoggerDate()),
Collectors.collectingAndThen( Collectors.collectingAndThen(
Collectors.toMap( Collectors.toMap(
WorkLogger::getUserId, WorkLogger::getUserId,
logger -> logger, logger -> logger,
(existing, replacement) -> existing.getCreateTime().after(replacement.getCreateTime()) ? existing : replacement (existing,
), replacement) -> existing.getCreateTime()
map -> new ArrayList<>(map.values()) .after(replacement.getCreateTime()) ? existing : replacement),
) map -> new ArrayList<>(map.values()))));
));
LocalDate startDate = projectQueryDto.getStartDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); LocalDate startDate = projectQueryDto.getStartDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate endDate = projectQueryDto.getEndDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); LocalDate endDate = projectQueryDto.getEndDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
@ -332,7 +341,8 @@ public class ProjectServiceImpl implements IProjectService {
WorkLogger workLogger = new WorkLogger(); WorkLogger workLogger = new WorkLogger();
workLogger.setProjectId(project.getProjectId()); workLogger.setProjectId(project.getProjectId());
List<WorkLogger> list = workLoggerService.list(workLogger); List<WorkLogger> list = workLoggerService.list(workLogger);
if (list.stream().anyMatch(item -> item.getLoggerDate().before(project.getStartDate()) || item.getLoggerDate().after(project.getEndDate()))) { if (list.stream().anyMatch(item -> item.getLoggerDate().before(project.getStartDate())
|| item.getLoggerDate().after(project.getEndDate()))) {
return false; return false;
} }
return true; return true;