package com.cloudroam.controller.v1; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.cloudroam.bo.ProjectDailyBO; import com.cloudroam.common.LocalUser; import com.cloudroam.common.util.PageUtil; import com.cloudroam.dto.projectDaily.*; import com.cloudroam.common.enumeration.DailyCommitEnum; import com.cloudroam.common.enumeration.DailyConfirmEnum; import com.cloudroam.common.enumeration.DailyStatusEnum; import com.cloudroam.model.UserDO; import com.cloudroam.service.MailService; import com.cloudroam.service.ProjectDailyService; import com.cloudroam.util.JsonUtil; import com.cloudroam.vo.*; import com.cloudroam.vo.projectDaily.ProjectDailyBoardVO; import com.cloudroam.vo.projectDaily.ProjectDailyHourVO; import io.github.talelin.autoconfigure.exception.ForbiddenException; import io.github.talelin.autoconfigure.exception.NotFoundException; import io.github.talelin.core.annotation.Logger; import io.github.talelin.core.annotation.LoginRequired; import io.github.talelin.core.annotation.PermissionMeta; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import com.cloudroam.model.ProjectDailyDO; import org.springframework.web.bind.annotation.*; import java.math.BigDecimal; import java.util.Date; import java.util.List; /** * @author generator@TaoJie * @since 2023-08-09 */ @RestController @RequestMapping("/v1/projectDaily") @Validated public class ProjectDailyController { @Autowired private ProjectDailyService projectDailyService; @Autowired private MailService mailService; @PostMapping("") @LoginRequired @PermissionMeta(value = "日志创建", module = "工作日志",mount = false) @Logger(template = "{user.nickname} 创建了日志 ") public CreatedVO create(@RequestBody @Validated CreateOrUpdateProjectDailyDTO validator) { projectDailyService.createProjectDailyWithInit(validator); return new CreatedVO(); } @PostMapping("/saveBatch") @LoginRequired @PermissionMeta(value = "日志批量创建", module = "工作日志",mount = false) @Logger(template = "{user.nickname} 批量创建了日志 ") public CreatedVO createBatch(@RequestBody CreateBatchDTO dto) { if(StrUtil.isBlank(dto.getDailyList())){ throw new ForbiddenException(10301); } projectDailyService.createProjectDailyBatchWithInit(dto); return new CreatedVO(); } @PostMapping("/batch/task") @LoginRequired @PermissionMeta(value = "任务日志批量创建", module = "工作日志",mount = false) @Logger(template = "{user.nickname} 批量创建了日志 ") public CreatedVO createBatchNew( @Validated @RequestBody CreateBatchTaskDTO dto) { projectDailyService.createProjectDailyBatchWithTask(dto); return new CreatedVO(); } @GetMapping("/existsHours") @LoginRequired // @PermissionMeta(value = "日志已存在的工时", module = "工作日志",mount = false) // @Logger(template = "{user.nickname} 批量创建了日志 ") public ProjectDailyHourVO existsHours(DailyHourDTO dto) { ProjectDailyHourVO projectDailyHourVO= projectDailyService.existsHours(dto); return projectDailyHourVO; } @PostMapping("/supplementaryBatch") @LoginRequired @PermissionMeta(value = "日志批量补录", module = "工作日志",mount = false) @Logger(template = "{user.nickname} 批量补录了日志 ") public CreatedVO supplementaryBatch(@RequestBody CreateBatchDTO dto) { if(StrUtil.isBlank(dto.getDailyList())){ throw new ForbiddenException(10301); } // 将json串反序列化成数组 List list= JsonUtil.json2List(dto.getDailyList(),ProjectDailyDO.class); projectDailyService.supplementaryProjectDailyBatch(list); return new CreatedVO(); } @PutMapping("/{id}") @LoginRequired @PermissionMeta(value = "日志更新", module = "工作日志",mount = false) @Logger(template = "{user.nickname} 更新了日志 ") public UpdatedVO update(@RequestBody @Validated CreateOrUpdateProjectDailyDTO validator) { if(StrUtil.isBlank(validator.getId())){ throw new NotFoundException("传入的Id不能为空"); } ProjectDailyDO projectDailyDO=projectDailyService.getById(validator.getId()); if(projectDailyDO == null){ throw new NotFoundException("日志不存在"); } projectDailyService.updateProjectDailyWithInit(validator); return new UpdatedVO(); } @PutMapping("/actualHours/{id}") @LoginRequired @PermissionMeta(value = "实际工时提交", module = "工作日志",mount = false) @Logger(template = "{user.nickname} 提交实际工时 ") public UpdatedVO updateActualHours(@PathVariable String id,@RequestBody @Validated CreateOrUpdateProjectDailyDTO validator) { if(StrUtil.isBlank(id)){ throw new NotFoundException("传入的Id不能为空"); } ProjectDailyDO projectDailyDO=projectDailyService.getById(id); if(projectDailyDO == null){ throw new NotFoundException("日志不存在"); } // 如果日志状态被关闭了,则不需要填写工时,但是需要写备注 if(validator.getDailyStatus().equals(DailyStatusEnum.CLOSED.getCode())&&StrUtil.isBlank(validator.getRemark())){ throw new ForbiddenException(10306); }else if(!validator.getDailyStatus().equals(DailyStatusEnum.CLOSED.getCode())&&(null==validator.getActualHours()||validator.getActualHours().compareTo(BigDecimal.ZERO)==0)){ throw new ForbiddenException(10305); } validator.setId(id); projectDailyService.updateActualHours(validator); return new UpdatedVO(); } @PutMapping("/actualHours/batch") @LoginRequired @PermissionMeta(value = "实际工时提交", module = "工作日志",mount = false) @Logger(template = "{user.nickname} 提交实际工时 ") public UpdatedVO updateActualHoursBatch(@RequestBody ConfirmActualBatchDTO dto) { boolean result=projectDailyService.updateActualHoursBatch(dto.getDailyList()); if(result){ return new UpdatedVO("确认工时成功"); }else{ return new UpdatedVO("确认工时失败"); } } @LoginRequired @DeleteMapping("/{id}") @PermissionMeta(value = "日志删除", module = "工作日志",mount = false) @Logger(template = "{user.nickname} 删除了日志 ") public DeletedVO delete(@PathVariable String id) { if(StrUtil.isBlank(id)){ throw new NotFoundException("id不能为空"); } ProjectDailyDO projectDailyDO=projectDailyService.getById(id); if (projectDailyDO == null) { throw new NotFoundException("日志不存在"); } // projectDailyService.removeById(id); projectDailyService.removeByIdLogic(id,projectDailyDO.getDailyDate()); return new DeletedVO(); } @GetMapping("/{id}") public ProjectDailyDO get(@PathVariable(value = "id") String id) { if(StrUtil.isBlank(id)){ throw new NotFoundException("id不能为空"); } return projectDailyService.getById(id); } @LoginRequired @GetMapping("/byDate/{dailyDate}") public List getByDailyDate(@PathVariable(value = "dailyDate") String dailyDate) { if(StrUtil.isBlank(dailyDate)){ throw new NotFoundException("dailyDate不能为空"); } return projectDailyService.getByDailyDate(dailyDate); } @GetMapping("/page") @PermissionMeta(value = "全部日志", module = "工作日志") @Logger(template = "{user.nickname} 查看了工作日志列表 ") @LoginRequired public PageResponseVO page( @Validated QueryProjectDailyDTO dto ) { // 只显示已经提交的日志 // dto.setIsCommit(DailyCommitEnum.COMMITED.getCode()); IPage iPage=projectDailyService.getProjectDailyPage(dto); return PageUtil.build(iPage); } @GetMapping("/pagePersonal") @PermissionMeta(value = "我的日志", module = "工作日志",mount = true) @Logger(template = "{user.nickname} 查看了工作日志 ") @LoginRequired public PageResponseVO pagePersonal( @Validated QueryProjectDailyDTO dto ) { UserDO userDO=LocalUser.getLocalUser(); dto.setCreateUserId(String.valueOf(userDO.getId())); IPage iPage=projectDailyService.getProjectDailyPage(dto); return PageUtil.build(iPage); } /** * 只是在工作日志下新增了一个工时统计菜单权限 * @param dto * @return */ @GetMapping("/hour/statistics") @PermissionMeta(value = "工时统计", module = "工作日志",mount = true) @Logger(template = "{user.nickname} 查看了工时统计 ") @LoginRequired public PageResponseVO hourStatistics( @Validated QueryProjectDailyDTO dto ) { return PageUtil.build(null); } @PutMapping("/commit/{id}") @LoginRequired // @PermissionMeta(value = "日志提交", module = "工作日志") // @Logger(template = "{user.nickname} 提交了日志 ") public UpdatedVO commit(@PathVariable String id) { if(StrUtil.isBlank(id)){ throw new NotFoundException("传入的Id不能为空"); } ProjectDailyDO projectDailyDO=projectDailyService.getById(id); if(projectDailyDO == null){ throw new NotFoundException("日志不存在"); } projectDailyService.commit(id); return new UpdatedVO(); } @PutMapping("/commit-batch") @LoginRequired @PermissionMeta(value = "日志批量提交", module = "工作日志",mount = false) @Logger(template = "{user.nickname} 批量提交了日志 ") public UpdatedVO commitBatch(@RequestBody CommitBatchDTO dto) { UserDO userDO = LocalUser.getLocalUser(); QueryProjectDailyDTO projectDailyDTO=new QueryProjectDailyDTO(); BeanUtils.copyProperties(dto,projectDailyDTO); // 设置当前要提交人的id projectDailyDTO.setCreateUserId(String.valueOf(userDO.getId())); List dailyList=projectDailyService.getProjectDailyList(projectDailyDTO); if(null==dailyList||dailyList.size()==0){ throw new ForbiddenException(10302); } projectDailyService.commitBatch(dto); // 邮件确认 // mailService.sendCommitDailyMail(userDO,dto.getDailyDate()); return new UpdatedVO(); } @PutMapping("/confirm/{id}") @LoginRequired @PermissionMeta(value = "日志确认", module = "工作日志") @Logger(template = "{user.nickname} 确认了日志 ") public UpdatedVO confirm(@PathVariable String id,@RequestBody ConfirmBatchDTO dto) { if(StrUtil.isBlank(id)){ throw new NotFoundException("传入的Id不能为空"); } ProjectDailyDO projectDailyDO=projectDailyService.getById(id); if(projectDailyDO == null){ throw new NotFoundException("日志不存在"); } UserDO user = LocalUser.getLocalUser(); projectDailyDO=new ProjectDailyDO(); projectDailyDO.setId(id); if(dto.getIsConfirm().equals(DailyConfirmEnum.UNPASS.getCode())){ projectDailyDO.setIsCommit(DailyCommitEnum.UNCOMMITED.getCode()); projectDailyDO.setCommitTime(new Date()); projectDailyDO.setCommitUserId(String.valueOf(user.getId())); projectDailyDO.setCommitUserName(user.getNickname()); } projectDailyDO.setIsConfirm(dto.getIsConfirm()); projectDailyDO.setConfirmTime(new Date()); projectDailyDO.setConfirmUserId(String.valueOf(user.getId())); projectDailyDO.setConfirmUserName(user.getNickname()); projectDailyDO.setConfirmContent(dto.getConfirmContent()); projectDailyService.updateById(projectDailyDO); return new UpdatedVO(); } @PutMapping("/confirm-batch") @LoginRequired @PermissionMeta(value = "日志确认", module = "工作日志",mount = false) @Logger(template = "{user.nickname} 确认了日志 ") public UpdatedVO confirmBatch(@RequestBody ConfirmBatchDTO dto) { UserDO userDO = LocalUser.getLocalUser(); // 根据条件查找要批量确认的是不是有存在未提交的,如果存在未提交的则不允许确认 List unCommitDailyList=projectDailyService.getUncommitDailyList(dto); if(null!=unCommitDailyList && unCommitDailyList.size()>0){ throw new ForbiddenException(10307); } // 查看当前的人是否有需要确认的 List waitConfirmDailyList=projectDailyService.getWaitConfirmDailyList(dto); if(null==waitConfirmDailyList||waitConfirmDailyList.size()==0){ // 此人没有需要确认的日志 throw new ForbiddenException(10303); } // 批量日志的确认 projectDailyService.confirmBatch(dto); // if(dto.getIsConfirm().equals(DailyConfirmEnum.CONFIRM.getCode())){ // // projectDailyService.confirmBatch(dto); // // // 邮件确认 // // 这里判断如果用户是-1的话,则需要查找到所有有未确认的人,进行遍历 // /* if("-1".equals(dto.getCreateUserId())){ // // 获取所有未确认日志的人,并循环发送邮件 // List userDOList=projectDailyService.getUnComfirmedPeoples(dto.getDailyDate()); // userDOList.forEach(userDO1 -> // mailService.sendConfirmDailyMail(userDO,dto.getDailyDate(),String.valueOf(userDO1.getId()),dto.getConfirmContent())); // // }else{ // mailService.sendConfirmDailyMail(userDO,dto.getDailyDate(),dto.getCreateUserId(),dto.getConfirmContent()); // // }*/ // // }else if(dto.getIsConfirm().equals(DailyConfirmEnum.UNPASS.getCode())){ // // projectDailyService.confirmBatch(dto); // // // 邮件审核不通过 //// mailService.sendConfirmUnPassDailyMail(userDO,dto.getDailyDate(),dto.getCreateUserId(),dto.getConfirmContent()); // } return new UpdatedVO(); } @PutMapping("/unconfirm-batch") @LoginRequired @PermissionMeta(value = "日志未确认", module = "工作日志",mount = false) @Logger(template = "{user.nickname} 将日志设为了为未确认 ") public UpdatedVO unConfirmBatch(@RequestBody ConfirmBatchDTO dto) { UserDO userDO = LocalUser.getLocalUser(); QueryProjectDailyDTO projectDailyDTO=new QueryProjectDailyDTO(); BeanUtils.copyProperties(dto,projectDailyDTO); // projectDailyDTO.setIsCommit(DailyCommitEnum.COMMITED.getCode()); projectDailyDTO.setIsConfirm(DailyConfirmEnum.CONFIRM.getCode()); if("-1".equals(dto.getCreateUserId())){ projectDailyDTO.setCreateUserId(null); } List dailyList=projectDailyService.getProjectDailyList(projectDailyDTO); if(null==dailyList||dailyList.size()==0){ // 此人没有需要确认的日志 throw new ForbiddenException(10304); } projectDailyService.unConfirmBatch(dto); // 邮件确认 // mailService.sendUnConfirmDailyMail(userDO,dto.getDailyDate(),dto.getCreateUserId()); return new UpdatedVO(); } @PutMapping("/unConfirm/{id}") @LoginRequired // @PermissionMeta(value = "日志未确认", module = "工作日志") // @Logger(template = "{user.nickname} 未确认了日志 ") public UpdatedVO unConfirm(@PathVariable String id) { if(StrUtil.isBlank(id)){ throw new NotFoundException("传入的Id不能为空"); } ProjectDailyDO projectDailyDO=projectDailyService.getById(id); if(projectDailyDO == null){ throw new NotFoundException("日志不存在"); } UserDO user = LocalUser.getLocalUser(); projectDailyDO=new ProjectDailyDO(); projectDailyDO.setId(id); projectDailyDO.setIsConfirm(DailyConfirmEnum.UNCONFIRM.getCode()); projectDailyDO.setConfirmTime(new Date()); projectDailyDO.setConfirmUserId(String.valueOf(user.getId())); projectDailyDO.setConfirmUserName(user.getNickname()); projectDailyService.updateById(projectDailyDO); return new UpdatedVO(); } @GetMapping("/userList") public List getAllUsers( @Validated QueryProjectDailyDTO dto ) { List list=projectDailyService.getAllUsers(dto); return list; } @LoginRequired @PermissionMeta(value = "日志看板", module = "工作日志",mount = true) @Logger(template = "{user.nickname} 查看了日志看板 ") @GetMapping("/dailyBoardList") public ProjectDailyBoardVO getDailyBoardList( @Validated QueryProjectDailyBoardDTO dto ) { return projectDailyService.getProjectDailyBoardList(dto); } @GetMapping("/dailyDateList") @LoginRequired public List getDailyDateList( @Validated CommitBatchDTO dto ) { UserDO userDO=new UserDO(); QueryProjectDailyDTO dailyDTO=new QueryProjectDailyDTO(); BeanUtils.copyProperties(dto,dailyDTO); dailyDTO.setCreateUserId(String.valueOf(userDO.getId())); List dailyList=projectDailyService.getProjectDailyList(dailyDTO); return dailyList; } @GetMapping("/dailyDatePlanTime") @LoginRequired public Double getDailyDatePlanTime( @Validated WorkTimeDTO dto ) { Double planTime=projectDailyService.getDailyDatePlanTime(dto); return planTime; } @GetMapping("/dailyDateActualTime") @LoginRequired public Double getDailyDateActualTime( @Validated WorkTimeDTO dto ) { Double planTime=projectDailyService.getDailyDateActualTime(dto); return planTime; } }