diff --git a/Cpop-Api/src/main/java/com/cpop/api/tencent/wxWork/handler/WebHookSendHandler.java b/Cpop-Api/src/main/java/com/cpop/api/tencent/wxWork/handler/WebHookSendHandler.java index 8b35e58..a7ff472 100644 --- a/Cpop-Api/src/main/java/com/cpop/api/tencent/wxWork/handler/WebHookSendHandler.java +++ b/Cpop-Api/src/main/java/com/cpop/api/tencent/wxWork/handler/WebHookSendHandler.java @@ -5,7 +5,6 @@ import com.cpop.api.tencent.wxWork.core.config.WxWorkApiConfig; import com.cpop.api.tencent.wxWork.webHook.WebHookSendTextRequest; import okhttp3.*; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; import java.io.IOException; @@ -29,9 +28,8 @@ public class WebHookSendHandler { * @param key 机器人键 * @param phoneList 通知人手机号 * @param content 内容 - * @return java.lang.String */ - public String webHookSendText(String key, List phoneList, String content, Boolean isAll) throws IOException { + public void webHookSendText(String key, List phoneList, String content, Boolean isAll) throws IOException { if (isAll) { phoneList.add("@all"); } @@ -40,19 +38,17 @@ public class WebHookSendHandler { text.setContent(content); text.setMentionedMobileList(phoneList); request.setText(text); - Response response = sendPost(config.getWebhook() + key, JSONObject.toJSONString(request)); - return response.toString(); + sendPost(config.getWebhook() + key, JSONObject.toJSONString(request)); } /** + * @param url 地址 + * @param jsonBody 请求体 * @descriptions 发送post请求 * @author DB * @date 2023/09/15 17:28 - * @param url 地址 - * @param jsonBody 请求体 - * @return okhttp3.Response */ - private Response sendPost(String url,String jsonBody) throws IOException { + private void sendPost(String url, String jsonBody) throws IOException { OkHttpClient client = new OkHttpClient().newBuilder().build(); MediaType mediaType = MediaType.parse("application/json"); RequestBody body = RequestBody.create(mediaType, jsonBody); @@ -61,6 +57,6 @@ public class WebHookSendHandler { .method("POST", body) .addHeader("Content-Type", "application/json") .build(); - return client.newCall(request).execute(); + client.newCall(request).execute(); } } diff --git a/Cpop-Oam/Cpop-Oam-Web/src/test/java/com/cpop/oam/web/CpopApiTests.java b/Cpop-Oam/Cpop-Oam-Web/src/test/java/com/cpop/oam/web/CpopApiTests.java index b3afd62..43bc145 100644 --- a/Cpop-Oam/Cpop-Oam-Web/src/test/java/com/cpop/oam/web/CpopApiTests.java +++ b/Cpop-Oam/Cpop-Oam-Web/src/test/java/com/cpop/oam/web/CpopApiTests.java @@ -31,7 +31,7 @@ public class CpopApiTests { List list = new ArrayList<>(); list.add("17728500831"); try { - System.out.println(webHookSendHandler.webHookSendText("586442ba-6eeb-4a3c-937d-75faa4d9dbb9", list, "测试数据,不用管", false)); + webHookSendHandler.webHookSendText("586442ba-6eeb-4a3c-937d-75faa4d9dbb9", list, "测试数据,不用管", false); } catch (IOException e) { throw new RuntimeException(e); } diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/bo/TaskArchivingPagBo.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/bo/TaskArchivingPagBo.java new file mode 100644 index 0000000..dedc638 --- /dev/null +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/bo/TaskArchivingPagBo.java @@ -0,0 +1,41 @@ +package com.cpop.oam.business.bo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.annotations.ApiParam; +import lombok.Data; +import lombok.experimental.Accessors; +import org.springframework.web.bind.annotation.RequestParam; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @author DB + * @version 1.0.0 + * @since 2023-12-05 17:53 + */ +@Data +@Accessors(chain = true) +@ApiModel(value = "TaskArchivingPagBo") +public class TaskArchivingPagBo { + + /** + * 主体 + */ + @ApiModelProperty("主体") + private String subject; + + /** + * 任务内容 + */ + @ApiModelProperty("任务内容") + private String taskContent; + + /** + * 是否已归档 + */ + @NotNull(message = "不能为空") + @ApiModelProperty(value = "任务内容",required = true) + Boolean isFinish; +} diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/bo/TaskDailyPaperBo.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/bo/TaskDailyPaperBo.java new file mode 100644 index 0000000..be30dba --- /dev/null +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/bo/TaskDailyPaperBo.java @@ -0,0 +1,26 @@ +package com.cpop.oam.business.bo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.experimental.Accessors; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDate; + +/** + * @author DB + * @version 1.0.0 + * @since 2023-12-05 15:09 + */ +@Data +@Accessors(chain = true) +@ApiModel(value = "任务日报对象", description = "任务日报对象") +public class TaskDailyPaperBo { + + /** + * 日期 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate date; +} diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/bo/TaskItemBo.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/bo/TaskItemBo.java index a49caa0..269a948 100644 --- a/Cpop-Oam/src/main/java/com/cpop/oam/business/bo/TaskItemBo.java +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/bo/TaskItemBo.java @@ -17,10 +17,8 @@ import java.io.Serializable; */ @Data @Accessors(chain = true) -@ApiModel(value = "Task进度对象", description = "Task进度对象") -public class TaskItemBo implements Serializable { - - private static final long serialVersionUID = 1L; +@ApiModel(value = "Task项对象", description = "Task项对象") +public class TaskItemBo { /** * 主键 @@ -35,4 +33,10 @@ public class TaskItemBo implements Serializable { @NotNull(message = "任务项不能为空") @ApiModelProperty(value = "任务项(0:待开发;1:待测试:2:待部署;3:已归档)",required = true) private Integer taskItem; + + /** + * 测试转部署文件路径 + */ + @ApiModelProperty(value = "测试转部署文件路径") + private String testToFinishUrl; } diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/bo/TaskMonthStatisticsBo.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/bo/TaskMonthStatisticsBo.java index 39eeb48..fdf2840 100644 --- a/Cpop-Oam/src/main/java/com/cpop/oam/business/bo/TaskMonthStatisticsBo.java +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/bo/TaskMonthStatisticsBo.java @@ -23,8 +23,8 @@ public class TaskMonthStatisticsBo implements Serializable { /** * 主要负责员工id */ - @ApiModelProperty("主要负责员工id") - private String responsibleStaffId; + @ApiModelProperty("技术员工id") + private String technologyStaffId; /** * 任务月份 diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/bo/TaskProgressBo.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/bo/TaskProgressBo.java new file mode 100644 index 0000000..7efd25f --- /dev/null +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/bo/TaskProgressBo.java @@ -0,0 +1,36 @@ +package com.cpop.oam.business.bo; + +import com.cpop.core.annontation.StringArrayConvert; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @author DB + * @version 1.0.0 + * @since 2023-12-04 16:41 + */ +@Data +@Accessors(chain = true) +@ApiModel(value = "Task进度对象", description = "Task进度对象") +public class TaskProgressBo { + + /** + * 主键 + */ + @NotBlank(message = "主键不能为空") + @ApiModelProperty(value = "主键",required = true) + private String id; + + /** + * 任务进度(0:开发文档;1:原型涉及;2:UI涉及;3:前端开发;4:后端开发) + */ + @NotNull(message = "任务进度不能为空") + @ApiModelProperty(value = "任务进度(0:开发文档;1:原型涉及;2:UI涉及;3:前端开发;4:后端开发)",required = true) + @StringArrayConvert + private String taskProgress; +} diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/controller/backstage/TaskTechnologyController.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/controller/backstage/TaskTechnologyController.java index f78a0ea..d3f995d 100644 --- a/Cpop-Oam/src/main/java/com/cpop/oam/business/controller/backstage/TaskTechnologyController.java +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/controller/backstage/TaskTechnologyController.java @@ -48,7 +48,7 @@ public class TaskTechnologyController { * @author DB * @since 2023-11-30 19:41:32 */ - @PreAuthorize("@aps.hasPermission('oamTask:taskTechnology:list')") + //@PreAuthorize("@aps.hasPermission('oamTask:taskTechnology:list')") @ApiOperation("技术模块-今日事务-获取个人工单列表") @GetMapping("/getPersonWorkOrder") public R> getPersonWorkOrder() { @@ -63,7 +63,7 @@ public class TaskTechnologyController { * @author DB * @since 2023-11-29 11:25:28 */ - @PreAuthorize("@aps.hasPermission('oamTask:workOrder:record')") + //@PreAuthorize("@aps.hasPermission('oamTask:workOrder:record')") @ApiOperation("技术模块-今日事务-工单记录列表") @GetMapping("/getWorkOrderRecordList/{workOrderId}") public R> getWorkOrderRecordList(@PathVariable @ApiParam("工单id") @@ -79,7 +79,7 @@ public class TaskTechnologyController { * @author DB * @since 2023-11-29 11:33:35 */ - @PreAuthorize("@aps.hasPermission('oamTask:workOrder:record')") + //@PreAuthorize("@aps.hasPermission('oamTask:workOrder:record')") @ApiOperation("技术模块-今日事务-新增工单记录") @PostMapping("/insertWorkOrderRecord") public R insertWorkOrderRecord(@RequestBody @Validated @@ -98,14 +98,11 @@ public class TaskTechnologyController { * @author DB * @since 2023-11-30 21:11:47 */ - @PreAuthorize("@aps.hasPermission('oamTask:taskArchiving:list')") + //@PreAuthorize("@aps.hasPermission('oamTask:taskArchiving:list')") @ApiOperation("技术模块-任务归档-获取任务归档分页") @GetMapping("/getTaskArchivingPage") - public R> getTaskArchivingPage(@ApiParam(value = "主体") - String subject, @ApiParam(value = "任务内容") - String taskContent, @RequestParam("isFinish") @ApiParam(value = "是否已归档", required = true) - Boolean isFinish) { - Page page = taskService.getTaskArchivingPage(subject, taskContent, isFinish); + public R> getTaskArchivingPage(TaskArchivingPagBo bo) { + Page page = taskService.getTaskArchivingPage(bo); return R.ok(page); } @@ -116,7 +113,7 @@ public class TaskTechnologyController { * @author DB * @since 2023-11-30 21:49:05 */ - @PreAuthorize("@aps.hasPermission('oamTask:taskArchiving:update')") + //@PreAuthorize("@aps.hasPermission('oamTask:taskArchiving:update')") @ApiOperation("技术模块-任务归档-设置任务归档") @PutMapping("/setTaskArchiving/{taskId}") public R setTaskArchiving(@PathVariable @ApiParam("任务id") @@ -134,7 +131,7 @@ public class TaskTechnologyController { * @author DB * @since 2023-11-30 22:21:58 */ - @PreAuthorize("@aps.hasPermission('oamTask:task:list')") + //@PreAuthorize("@aps.hasPermission('oamTask:task:list')") @ApiOperation("技术模块-任务领取-获取领取任务分页") @GetMapping("/getToBeClaimedPage") public R> getToBeClaimedPage(@ApiParam(value = "主体") @@ -152,7 +149,7 @@ public class TaskTechnologyController { * @author DB * @since 2023-12-01 09:45:08 */ - @PreAuthorize("@aps.hasPermission('oamTask:iterateTask:insert')") + //@PreAuthorize("@aps.hasPermission('oamTask:iterateTask:insert')") @ApiOperation("技术模块-任务领取-新增迭代任务") @PostMapping("/insertIterationTask") public R insertIterationTask(@RequestBody @Validated @@ -168,7 +165,7 @@ public class TaskTechnologyController { * @author DB * @since 2023-12-01 10:15:28 */ - @PreAuthorize("@aps.hasPermission('oamTask:iterateTask:update')") + //@PreAuthorize("@aps.hasPermission('oamTask:iterateTask:update')") @ApiOperation("技术模块-任务领取-技术人员领取任务") @PutMapping("/claimTask/{id}") public R claimTask(@PathVariable @ApiParam("任务id") @@ -184,7 +181,7 @@ public class TaskTechnologyController { * @author DB * @since 2023-12-01 10:35:31 */ - @PreAuthorize("@aps.hasPermission('oamTask:taskAudit:update')") + //@PreAuthorize("@aps.hasPermission('oamTask:taskAudit:update')") @ApiOperation("技术模块-任务领取-任务审核") @PutMapping("/setTaskAuditComments") public R setTaskAuditComments(@RequestBody @Validated @@ -200,7 +197,7 @@ public class TaskTechnologyController { * @author DB * @since 2023/12/04 */ - @PreAuthorize("@aps.hasPermission('oamTask:task:list')") + //@PreAuthorize("@aps.hasPermission('oamTask:task:list')") @ApiOperation("技术模块-今日事务-个人任务分页列表") @GetMapping("/getPersonTaskPage") public R> getPersonTaskPage() { @@ -301,15 +298,28 @@ public class TaskTechnologyController { return R.ok(); } - + /** + * 技术模块-今日事务-更新任务进度 + * @author DB + * @since 2023/12/04 + * @param bo 请求参数 + * @return R + */ + @ApiOperation("技术模块-今日事务-更新任务进度") + @PutMapping("/updateTaskProgress") + public R updateTaskProgress(@RequestBody @Validated + TaskProgressBo bo) { + taskService.updateTaskProgress(bo); + return R.ok(); + } /** + * "技术模块-今日事务-转交任务 + * @author DB + * @since 2023/12/04 * @param bo 请求参数 - * @Description: 修改任务进度 - * @return: R - * @Author: DB - * @Date: 2023/5/29 14:58 - **/ + * @return R + */ @ApiOperation("技术模块-今日事务-转交任务") @PutMapping("/updateTaskItem") public R updateTaskItem(@RequestBody @Validated @@ -319,32 +329,42 @@ public class TaskTechnologyController { } /** - * @param id 主键 - * @Description: 完成任务 - * @return: R - * @Author: DB - * @Date: 2023/5/31 16:24 - **/ - @PreAuthorize("@aps.hasPermission('oamTask:task:update')") - @ApiOperation("完成任务") - @PutMapping("/finishTask/{id}") - public R finishTask(@PathVariable - String id) { - taskService.finishTask(id); - return R.ok(); - } - - /** + * 技术模块-数据统计-获取月度任务统计列表 + * @author DB + * @since 2023/12/04 * @param bo 请求参数 - * @Description: 获取月度任务统计列表 - * @return: R> - * @Author: DB - * @Date: 2023/5/15 16:42 - **/ - @ApiOperation("获取月度任务统计列表") + * @return R + */ + @ApiOperation("技术模块-数据统计-获取月度任务统计列表") @GetMapping("/getTaskMonthStatistics") public R getTaskMonthStatistics(TaskMonthStatisticsBo bo) { return R.ok(taskService.getTaskMonthStatistics(bo)); } + /** + * 技术模块-数据统计-获取任务日报 + * @author DB + * @since 2023/12/05 + * @return R + */ + @ApiOperation("技术模块-数据统计-获取任务日报") + @GetMapping("/getTaskDailyPaper") + public R getTaskDailyPaper(TaskDailyPaperBo bo) { + String dailyPaper = taskService.getTaskDailyPaper(bo); + return R.ok(dailyPaper); + } + + /** + * 技术模块-今日事务-个人绩点 + * @author DB + * @since 2023/12/05 + * @return R + */ + @ApiOperation("技术模块-今日事务-个人绩点") + @GetMapping("/getIndividualGpa") + public R getIndividualGpa() { + TaskIndividualGpaVo vo = taskService.getIndividualGpa(); + return R.ok(vo); + } + } diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/entity/Task.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/entity/Task.java index 2222e7d..e14c18b 100644 --- a/Cpop-Oam/src/main/java/com/cpop/oam/business/entity/Task.java +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/entity/Task.java @@ -45,7 +45,7 @@ public class Task extends BaseEntity implements Serializable { private String responsibleStaffId; /** - * 任务状态(-1:失败;0:待审核;1:待接受;2:进行中;3:已完成;4:逾期;5:暂停;6:逾期完成;7:接收超时;8:待部署;9:待归档;10:审核不通过) + * 任务状态(-1:失败;0:待审核;1:待接受;2:进行中;3:待测试;4:逾期;5:暂停;6:逾期完成;7:接收超时;8:待部署;9:已归档;10:审核不通过) */ private Integer taskStatus; @@ -54,6 +54,11 @@ public class Task extends BaseEntity implements Serializable { */ private Integer taskItem; + /** + * 任务进度(0:开发文档;1:原型涉及;2:UI涉及;3:前端开发;4:后端开发) + */ + private String taskProgress; + /** * 任务内容 */ @@ -113,7 +118,7 @@ public class Task extends BaseEntity implements Serializable { /** * 转部署时间 */ - private LocalDateTime toFinishTime; + private LocalDateTime toDeployTime; /** * 是否删除(0否1是) diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/entity/TaskStaffGroup.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/entity/TaskStaffGroup.java index 1b32ec2..62b8c52 100644 --- a/Cpop-Oam/src/main/java/com/cpop/oam/business/entity/TaskStaffGroup.java +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/entity/TaskStaffGroup.java @@ -46,4 +46,9 @@ public class TaskStaffGroup extends BaseEntity implements Serializable { */ private Integer gradePoint; + /** + * 备注 + */ + private String remark; + } diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/service/TaskService.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/service/TaskService.java index 2bec1ba..d933dbb 100644 --- a/Cpop-Oam/src/main/java/com/cpop/oam/business/service/TaskService.java +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/service/TaskService.java @@ -1,13 +1,10 @@ package com.cpop.oam.business.service; -import com.cpop.oam.business.vo.TaskArchivingPagVo; -import com.cpop.oam.business.vo.TaskToBeClaimedPageVo; +import com.cpop.oam.business.vo.*; import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.service.IService; import com.cpop.oam.business.bo.*; import com.cpop.oam.business.entity.Task; -import com.cpop.oam.business.vo.PersonTaskPageVo; -import com.cpop.oam.business.vo.TaskMonthStatisticsVo; /** * OAM-任务表 服务层。 @@ -20,11 +17,10 @@ public interface TaskService extends IService { /** * 技术模块-任务归档-获取任务归档分页 * @author DB - * @param subject 主体 - * @param taskContent 任务内容 + * @param bo 请求 * @since 2023-11-30 21:11:47 */ - Page getTaskArchivingPage(String subject, String taskContent, Boolean isFinish); + Page getTaskArchivingPage(TaskArchivingPagBo bo); /** * 技术模块-任务归档-设置任务归档 @@ -77,12 +73,11 @@ public interface TaskService extends IService { Page getPersonTaskPage(); /** - * @Description: 修改任务进度 + * 技术模块-今日事务-转交任务 + * @author DB + * @since 2023/12/04 * @param bo 请求参数 - * @return: R - * @Author: DB - * @Date: 2023/5/29 14:58 - **/ + */ void updateTaskItem(TaskItemBo bo); /** @@ -94,21 +89,36 @@ public interface TaskService extends IService { void updateTaskResponsibleStaff(TransferTaskBo bo); /** - * @Description: 完成任务 - * @param id 主键 - * @return: R - * @Author: DB - * @Date: 2023/5/31 16:24 - **/ - void finishTask(String id); - - /** - * @Description: 获取月度任务统计列表 + * 技术模块-数据统计-获取月度任务统计列表 + * @author DB + * @since 2023/12/04 * @param bo 请求参数 - * @return: R> - * @Author: DB - * @Date: 2023/5/15 16:42 - **/ + * @return R + */ TaskMonthStatisticsVo getTaskMonthStatistics(TaskMonthStatisticsBo bo); + /** + * 技术模块-今日事务-更新任务进度 + * @author DB + * @since 2023/12/04 + * @param bo 请求参数 + */ + void updateTaskProgress(TaskProgressBo bo); + + /** + * 技术模块-数据统计-获取任务日报 + * @author DB + * @since 2023/12/05 + * @param bo 请求参数 + * @return String + */ + String getTaskDailyPaper(TaskDailyPaperBo bo); + + /** + * 技术模块-今日事务-个人绩点 + * @author DB + * @since 2023/12/05 + * @return TaskIndividualGpaVo + */ + TaskIndividualGpaVo getIndividualGpa(); } diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/service/impl/TaskServiceImpl.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/service/impl/TaskServiceImpl.java index 97b52ac..71b6f32 100644 --- a/Cpop-Oam/src/main/java/com/cpop/oam/business/service/impl/TaskServiceImpl.java +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/service/impl/TaskServiceImpl.java @@ -1,9 +1,8 @@ package com.cpop.oam.business.service.impl; import com.alibaba.fastjson.JSONObject; -import com.cpop.oam.business.vo.TaskArchivingPagVo; -import com.cpop.oam.business.vo.TaskToBeClaimedPageVo; -import com.cpop.system.framework.ws.server.WebSocketServer; +import com.cpop.oam.business.service.*; +import com.cpop.oam.business.vo.*; import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.spring.service.impl.ServiceImpl; @@ -12,10 +11,7 @@ import com.cpop.common.constant.Constants; import com.cpop.common.utils.DateUtils; import com.cpop.common.utils.StringUtils; import com.cpop.common.utils.bean.BeanUtils; -import com.cpop.core.base.entity.LoginUser; import com.cpop.core.base.entity.PageDomain; -import com.cpop.core.base.entity.loginInfo.OamStaffLoginInfo; -import com.cpop.core.base.enums.UserType; import com.cpop.core.base.exception.ServiceException; import com.cpop.core.base.table.SysConfig; import com.cpop.core.service.CoreService; @@ -28,11 +24,6 @@ import com.cpop.oam.business.entity.Staff; import com.cpop.oam.business.entity.Task; import com.cpop.oam.business.entity.TaskStaffGroup; import com.cpop.oam.business.mapper.TaskMapper; -import com.cpop.oam.business.service.StaffService; -import com.cpop.oam.business.service.TaskService; -import com.cpop.oam.business.service.TaskStaffGroupService; -import com.cpop.oam.business.vo.PersonTaskPageVo; -import com.cpop.oam.business.vo.TaskMonthStatisticsVo; import com.cpop.oam.framework.constant.WebHookKeyConstant; import com.cpop.oam.framework.enums.OamConfigEnum; import org.springframework.stereotype.Service; @@ -45,13 +36,15 @@ import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.time.temporal.TemporalAdjusters; import java.util.*; +import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; +import static com.cpop.oam.business.entity.table.DutyTableDef.DUTY; import static com.cpop.oam.business.entity.table.StaffTableDef.STAFF; import static com.cpop.oam.business.entity.table.TaskDemandTableDef.TASK_DEMAND; import static com.cpop.oam.business.entity.table.TaskStaffGroupTableDef.TASK_STAFF_GROUP; import static com.cpop.oam.business.entity.table.TaskTableDef.TASK; -import static com.mybatisflex.core.query.QueryMethods.groupConcat; +import static com.mybatisflex.core.query.QueryMethods.*; import org.springframework.transaction.annotation.Transactional; @@ -66,14 +59,12 @@ public class TaskServiceImpl extends ServiceImpl implements Ta /** * 技术模块-任务归档-获取任务归档分页 - * - * @param subject 品主体牌名 - * @param taskContent 任务内容 * @author DB + * @param bo 请求 * @since 2023-11-30 21:11:47 */ @Override - public Page getTaskArchivingPage(String subject, String taskContent, Boolean isFinish) { + public Page getTaskArchivingPage(TaskArchivingPagBo bo) { // 获取当前员工 JSONObject loginUserInfo = SecurityUtils.getInstance().getLoginUserInfo(); PageDomain pageDomain = SqlUtils.getInstance().getPageDomain(); @@ -86,15 +77,14 @@ public class TaskServiceImpl extends ServiceImpl implements Ta TASK.TASK_RECEIPT_TIME, TASK.TEST_TO_FINISH_URL, TASK.TO_TEST_TIME, - TASK.TO_FINISH_TIME, TASK.SUBJECT) .select(TASK_STAFF_GROUP.GRADE_POINT) .from(TASK) .leftJoin(TASK_STAFF_GROUP) .on(TASK_STAFF_GROUP.TASK_ID.eq(TASK.ID)) .where(TASK_STAFF_GROUP.STAFF_ID.eq(loginUserInfo.getString("id"))) - .and(TASK.TASK_STATUS.eq(isFinish ? 8 : 9).and(TASK.TASK_CONTENT.like(taskContent))) - .and(TASK.SUBJECT.like(subject)), + .and(TASK.TASK_STATUS.eq(bo.getIsFinish() ? 8 : 9).and(TASK.TASK_CONTENT.like(bo.getTaskContent()))) + .and(TASK.SUBJECT.like(bo.getSubject())), TaskArchivingPagVo.class, // 负责人 item -> item.field(TaskArchivingPagVo::getResponsibleStaffName) @@ -124,7 +114,8 @@ public class TaskServiceImpl extends ServiceImpl implements Ta public void setTaskArchiving(String taskId) { this.updateChain() .set(TASK.TASK_STATUS, 9) - .set(TASK.TO_FINISH_TIME, LocalDateTime.now()) + .set(TASK.TASK_ITEM, 3) + .set(TASK.COMPLETION_DATE, LocalDate.now()) .where(TASK.ID.eq(taskId)) .update(); } @@ -347,7 +338,7 @@ public class TaskServiceImpl extends ServiceImpl implements Ta return this.mapper.paginateAs(pageDomain.getPageNum(), pageDomain.getPageSize(), QueryWrapper.create() - .select(TASK.ID, TASK.TASK_STATUS, TASK.TASK_CONTENT, TASK.TASK_ITEM, TASK.TASK_RATING, TASK.TASK_RECEIPT_TIME, TASK.EXPECTED_COMPLETION_DATE) + .select(TASK.ID, TASK.TASK_STATUS, TASK.TASK_CONTENT, TASK.TASK_ITEM, TASK.TASK_RATING, TASK.TASK_RECEIPT_TIME, TASK.EXPECTED_COMPLETION_DATE, TASK.TASK_PROGRESS, TASK.SUBJECT) .select(STAFF.NAME.as(PersonTaskPageVo::getResponsibleStaffName)) //个人绩点 .select(TASK_STAFF_GROUP.GRADE_POINT) @@ -367,16 +358,76 @@ public class TaskServiceImpl extends ServiceImpl implements Ta } /** + * "技术模块-今日事务-转交任务 + * * @param bo 请求参数 - * @Description: 修改任务进度 - * @return: R - * @Author: DB - * @Date: 2023/5/29 14:58 - **/ + * @author DB + * @since 2023/12/04 + */ @Override + @Transactional(rollbackFor = Exception.class) public void updateTaskItem(TaskItemBo bo) { isTaskResponsibleStaff(bo.getId()); - this.updateChain().set(TASK.TASK_ITEM, bo.getTaskItem()).where(TASK.ID.eq(bo.getId())).update(); + //查询任务进度 + Task task = this.getById(bo.getId()); + if (bo.getTaskItem() == 0) { + if (task.getTaskProgress() == null || task.getTaskProgress().split(",").length < 5) { + throw new ServiceException("当前任务的进度尚未完全完成,不允许转交"); + } + LocalDate now = LocalDate.now(); + LocalDate expectedCompletionDate = task.getExpectedCompletionDate(); + long day = expectedCompletionDate.until(now, ChronoUnit.DAYS); + // 逾期完成 + if (day > 0) { + task.setTaskStatus(6); + //扣除绩点 + deductGradePoint(day, bo.getId()); + } else { + task.setTaskStatus(3); + } + task.setToTestTime(LocalDateTime.now()); + } + if (bo.getTaskItem() == 1) { + if (StringUtils.isBlank(bo.getTestToFinishUrl())) { + throw new ServiceException("当前任务未提交测试部署相关文件,不允许转交"); + } + task.setToDeployTime(LocalDateTime.now()) + .setTaskStatus(8); + } + this.updateById(task); + } + + /** + * 逾期扣除绩点 + * + * @param day 逾期日期 + * @param taskId 任务id + * @author DB + * @since 2023/12/04 + */ + private void deductGradePoint(Long day, String taskId) { + //获取所有参与员工的绩点列表 + TaskStaffGroupService taskStaffGroupService = SpringUtils.getBean(TaskStaffGroupService.class); + List taskStaffGroups = taskStaffGroupService.queryChain().where(TASK_STAFF_GROUP.TASK_ID.eq(taskId)).list(); + //逾期完成3天内只计算有效绩点的80% + if (day < 3) { + //3天以上50% + taskStaffGroups.forEach(item -> { + //向下取整 + Integer oldGradePoint = item.getGradePoint(); + double deductGradePoint = Math.floor(item.getGradePoint() * 0.8); + item.setGradePoint(oldGradePoint - (int) deductGradePoint).setRemark("任务完成超时扣除绩点:" + deductGradePoint); + }); + } else { + //3天以上50% + taskStaffGroups.forEach(item -> { + //向下取整 + Integer oldGradePoint = item.getGradePoint(); + double deductGradePoint = Math.floor(item.getGradePoint() * 0.5); + item.setGradePoint(oldGradePoint - (int) deductGradePoint).setRemark("任务完成超时扣除绩点:" + deductGradePoint); + }); + } + taskStaffGroupService.updateBatch(taskStaffGroups); } /** @@ -431,74 +482,25 @@ public class TaskServiceImpl extends ServiceImpl implements Ta private void isTaskResponsibleStaff(String taskId) { // 获取任务 Task task = this.getById(taskId); - // 当前操作员工是否是主要负责人,不是抛出异常 - LoginUser loginUser = SecurityUtils.getInstance().getLoginUser(); - // 读取员工信息 - RedisService redisService = SpringUtils.getBean(RedisService.class); - JSONObject cacheObject = redisService.getCacheObject(UserType.OAM_USER.getKey() + loginUser.getUsername()); - OamStaffLoginInfo loginInfo = cacheObject.getJSONObject("user").toJavaObject(OamStaffLoginInfo.class); - if (!StringUtils.equals(task.getResponsibleStaffId(), loginInfo.getId())) { + JSONObject loginUserInfo = SecurityUtils.getInstance().getLoginUserInfo(); + if (!StringUtils.equals(task.getResponsibleStaffId(), loginUserInfo.getString("id"))) { throw new ServiceException("当前操作员工不是当前任务主要负责人,不允许操作当前任务!"); } } /** - * @param id 主键 - * @Description: 完成任务 - * @return: R - * @Author: DB - * @Date: 2023/5/31 16:24 - **/ - @Override - public void finishTask(String id) { - // 查询任务相关信息 - Task task = this.getById(id); - if (task == null) { - throw new ServiceException("获取任务失败,请联系相关人员!"); - } - if (task.getTaskItem() != 3) { - throw new ServiceException("当前任务没有归档,请归档后再进行完成操作!"); - } - // 判断完成任务日期 - LocalDate now = LocalDate.now(); - LocalDate expectedCompletionDate = task.getExpectedCompletionDate(); - long day = now.until(expectedCompletionDate, ChronoUnit.DAYS); - // 逾期完成 - if (day < 0) { - task.setTaskStatus(6); - } else { - task.setTaskStatus(3); - } - task.setCompletionDate(now); - this.updateById(task); - } - - /** + * 技术模块-数据统计-获取月度任务统计列表 + * * @param bo 请求参数 - * @Description: 获取月度任务统计列表 - * @return: R> - * @Author: DB - * @Date: 2023/5/15 16:42 - **/ + * @return R + * @author DB + * @since 2023/12/04 + */ @Override public TaskMonthStatisticsVo getTaskMonthStatistics(TaskMonthStatisticsBo bo) { - // 员工组绩点信息 - List taskStaffGroups = null; - // 读取员工信息 - JSONObject loginUserInfo = SecurityUtils.getInstance().getLoginUserInfo(); QueryWrapper queryWrapper = QueryWrapper.create(); - if (!Constants.SUPER_ADMIN.equals(loginUserInfo.getString("userName"))) { - // 查询个人涉及到的任务 - TaskStaffGroupService taskStaffGroupService = SpringUtils.getBean(TaskStaffGroupService.class); - taskStaffGroups = taskStaffGroupService - .list(QueryWrapper.create().where(TASK_STAFF_GROUP.STAFF_ID.eq(loginUserInfo.getString("id")))); - if (!taskStaffGroups.isEmpty()) { - queryWrapper.and( - TASK.ID.in(taskStaffGroups.stream().map(TaskStaffGroup::getTaskId).collect(Collectors.toSet()))); - } - if (taskStaffGroups.isEmpty()) { - return new TaskMonthStatisticsVo(); - } + if(StringUtils.isNotBlank(bo.getTechnologyStaffId())){ + queryWrapper.and(TASK_STAFF_GROUP.STAFF_ID.eq(bo.getTechnologyStaffId())); } LocalDate firstDay; if (StringUtils.isNotBlank(bo.getTaskMoth())) { @@ -512,12 +514,19 @@ public class TaskServiceImpl extends ServiceImpl implements Ta LocalDate now = LocalDate.now(); firstDay = now.with(TemporalAdjusters.firstDayOfMonth()); } - List taskList = this.list(queryWrapper.select(TASK.ALL_COLUMNS) + //查询当月所有任务 + List taskList = this.list(queryWrapper.select(distinct(TASK.TASK_STATUS, TASK.ID, TASK.TASK_RECEIPT_TIME, TASK.TASK_CONTENT, TASK.EXPECTED_COMPLETION_DATE)) + .leftJoin(TASK_STAFF_GROUP).on(TASK_STAFF_GROUP.TASK_ID.eq(TASK.ID)) .and(TASK.EXPECTED_COMPLETION_DATE.ge(firstDay)) + .and(TASK.TASK_TYPE.in(0, 1)) + .and(TASK.TASK_STATUS.in(2, 3, 4, 6, 8, 9)) + .groupBy(TASK.ID) .orderBy(TASK.EXPECTED_COMPLETION_DATE.asc())); if (taskList.isEmpty()) { return new TaskMonthStatisticsVo(); } + List taskStaffGroups = SpringUtils.getBean(TaskStaffGroupService.class).queryChain() + .where(TASK_STAFF_GROUP.TASK_ID.in(taskList.stream().map(Task::getId).collect(Collectors.toSet()))).list(); return buildMonthTaskStatistics(taskList, bo, taskStaffGroups); } @@ -528,36 +537,24 @@ public class TaskServiceImpl extends ServiceImpl implements Ta * @Author: DB * @Date: 2023/5/15 17:54 **/ - private TaskMonthStatisticsVo buildMonthTaskStatistics(List taskList, TaskMonthStatisticsBo bo, - List taskStaffGroups) { + private TaskMonthStatisticsVo buildMonthTaskStatistics(List taskList, TaskMonthStatisticsBo bo, List taskStaffGroups) { TaskMonthStatisticsVo statisticsVo = new TaskMonthStatisticsVo(); List vos = new ArrayList<>(); - statisticsVo.setVos(vos); // 统计数据 - // 进行中运营人员 - statisticsVo.setInProgress(taskList.stream().filter(s -> 2 == s.getTaskStatus()).count()); - // 已完成 - Set finishTaskSet = - taskList.stream().filter(s -> 3 == s.getTaskStatus()).map(Task::getId).collect(Collectors.toSet()); + statisticsVo.setVos(vos); + // 进行中(进行中) + statisticsVo.setInProgress(taskList.stream().filter(s -> s.getTaskStatus() == 2).count()); + // 已完成(待部署或已归档) + Set finishTaskSet = taskList.stream().filter(s -> s.getTaskStatus() == 8 || s.getTaskStatus() == 9).map(Task::getId).collect(Collectors.toSet()); statisticsVo.setHaveCompleted(Long.parseLong(String.valueOf(finishTaskSet.size()))); - // 已逾期 - statisticsVo.setOverdue(taskList.stream().filter(s -> 4 == s.getTaskStatus()).count()); - // 暂停 - statisticsVo.setPause(taskList.stream().filter(s -> 5 == s.getTaskStatus()).count()); - // 逾期完成 - statisticsVo.setOverdueCompletion(taskList.stream().filter(s -> 6 == s.getTaskStatus()).count()); - // 逾期完成 - Set overdueCompletionSet = - taskList.stream().filter(s -> 6 == s.getTaskStatus()).map(Task::getId).collect(Collectors.toSet()); + // 已逾期(正常逾期与接收逾期) + statisticsVo.setOverdue(taskList.stream().filter(s -> s.getTaskStatus() == 4 || s.getTaskStatus() == 7).count()); + // 测试中(正常测试与逾期完成) + statisticsVo.setInTest(taskList.stream().filter(s -> s.getTaskStatus() == 3 || s.getTaskStatus() == 6).count()); if (null != taskStaffGroups) { - // 统计绩点(计算已完成的和逾期完成) - Long finishGpa = statisticalGPA(taskStaffGroups.stream() - .filter(s -> finishTaskSet.contains(s.getTaskId())) - .collect(Collectors.toList())); - Long overdueCompletionGpa = statisticalGPA(taskStaffGroups.stream() - .filter(s -> overdueCompletionSet.contains(s.getTaskId())) - .collect(Collectors.toList())); - statisticsVo.setGpaOfTheMonth(finishGpa + overdueCompletionGpa); + // 已完成(待部署或已归档) + Long finishGpa = statisticalGpa(taskStaffGroups.stream().filter(s -> finishTaskSet.contains(s.getTaskId())).collect(Collectors.toList())); + statisticsVo.setGpaOfTheMonth(finishGpa); } List allTheDateOfMonth; // 有传入月份 @@ -575,7 +572,7 @@ public class TaskServiceImpl extends ServiceImpl implements Ta taskList.forEach(task -> { // 接受时间 LocalDate date = task.getTaskReceiptTime().toLocalDate(); - if (localDate.compareTo(date) >= 0 && localDate.compareTo(task.getExpectedCompletionDate()) <= 0) { + if (!localDate.isBefore(date) && !localDate.isAfter(task.getExpectedCompletionDate())) { taskContents.add(task.getTaskContent()); } }); @@ -593,7 +590,7 @@ public class TaskServiceImpl extends ServiceImpl implements Ta * @Author: DB * @Date: 2023/5/29 18:24 **/ - private Long statisticalGPA(List taskStaffGroups) { + private Long statisticalGpa(List taskStaffGroups) { // 获取任务 if (null != taskStaffGroups) { return taskStaffGroups.stream().mapToLong(TaskStaffGroup::getGradePoint).sum(); @@ -601,4 +598,122 @@ public class TaskServiceImpl extends ServiceImpl implements Ta return 0L; } } + + /** + * 技术模块-今日事务-更新任务进度 + * + * @param bo 请求参数 + * @author DB + * @since 2023/12/04 + */ + @Override + public void updateTaskProgress(TaskProgressBo bo) { + this.updateChain().set(TASK.TASK_PROGRESS, bo.getTaskProgress()).where(TASK.ID.eq(bo.getId())).update(); + } + + /** + * 技术模块-数据统计-获取任务日报 + * @author DB + * @since 2023/12/05 + * @param bo 请求参数 + * @return String + */ + @Override + public String getTaskDailyPaper(TaskDailyPaperBo bo) { + //获取当前日期的任务 + List taskList = this.list(QueryWrapper.create().select(distinct(TASK.TASK_STATUS, TASK.ID, TASK.TASK_RECEIPT_TIME, TASK.TASK_CONTENT, TASK.EXPECTED_COMPLETION_DATE)) + .leftJoin(TASK_STAFF_GROUP).on(TASK_STAFF_GROUP.TASK_ID.eq(TASK.ID)) + .and(dateFormat(TASK.TASK_RECEIPT_TIME, "%Y-%m-%d").le(bo.getDate())) + .and(TASK.EXPECTED_COMPLETION_DATE.ge(bo.getDate())) + .and(TASK.TASK_TYPE.in(0, 1)) + .and(TASK.TASK_STATUS.in(2, 3, 4, 6, 8, 9)) + .groupBy(TASK.ID) + .orderBy(TASK.EXPECTED_COMPLETION_DATE.asc())); + if (taskList.isEmpty()){ + return ""; + } + //获取任务所属成员 + Map> taskStaffGroupMap = SpringUtils.getBean(TaskStaffGroupService.class).queryChain() + .where(TASK_STAFF_GROUP.TASK_ID.in(taskList.stream().map(Task::getId).collect(Collectors.toSet()))) + .list() + .stream().collect(Collectors.groupingBy(TaskStaffGroup::getTaskId)); + return createDailyPaper(taskList, taskStaffGroupMap); + } + + /** + * 创建日报 + * @author DB + * @since 2023/12/05 + * @param taskList 任务列表 + * @param taskStaffGroupMap 任务员工组map + * @return String + */ + private String createDailyPaper(List taskList, Map> taskStaffGroupMap) { + //所有技术员工信息 + Map staffMap = SpringUtils.getBean(StaffService.class).queryChain().where(STAFF.STAFF_TYPE.eq(0)).list() + .stream().collect(Collectors.toMap(Staff::getId, item -> item)); + StringBuilder dailyPaper = new StringBuilder(); + dailyPaper.append("开发:\n"); + AtomicReference start = new AtomicReference<>(1); + DateTimeFormatter yyyyMMddHHmmss = DateTimeFormatter.ofPattern("yyyy-MM-dd HH-mm-ss"); + DateTimeFormatter yyyyMMdd = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + taskList.forEach(item -> { + //负责员工信息 + String staffGroupInfo = taskStaffGroupMap.get(item.getId()).stream().map(inner -> staffMap.get(inner.getStaffId()).getName()).collect(Collectors.joining(",")); + //首行 + dailyPaper.append(start.get()).append(":").append(item.getTaskContent()).append("\n") + //负责人 + .append("负责人:").append(staffMap.get(item.getResponsibleStaffId()).getName()).append("(").append(staffGroupInfo).append(")").append("\n") + //进度 + .append("目前进度:").append(item.getTaskProgress() == null ? 0 : item.getTaskProgress().split(",").length * 20).append("%\n") + //开始时间 + .append("开始时间:").append(item.getTaskReceiptTime().format(yyyyMMddHHmmss)).append("\n") + //预计完成日期 + .append("预计完成日期:").append(item.getExpectedCompletionDate().format(yyyyMMdd)).append("\n"); + start.getAndSet(start.get() + 1); + }); + return dailyPaper.toString(); + } + + /** + * 技术模块-今日事务-个人绩点 + * @author DB + * @since 2023/12/05 + * @return TaskIndividualGpaVo + */ + @Override + public TaskIndividualGpaVo getIndividualGpa() { + //获取当前用户信息 + JSONObject loginUserInfo = SecurityUtils.getInstance().getLoginUserInfo(); + LocalDate now = LocalDate.now(); + // 获取目标月的第一天 + LocalDate firstDay = now.with(TemporalAdjusters.firstDayOfMonth()); + // 获取目标月的最后一天 + LocalDate lastDay = now.with(TemporalAdjusters.lastDayOfMonth()); + List individualGpas = this.listAs(QueryWrapper.create() + .select(TASK.ID, TASK.TASK_CONTENT,TASK.TASK_STATUS) + .select(TASK_STAFF_GROUP.GRADE_POINT, TASK_STAFF_GROUP.REMARK) + .leftJoin(TASK_STAFF_GROUP).on(TASK_STAFF_GROUP.TASK_ID.eq(TASK.ID)) + .where(TASK.TASK_STATUS.in(2, 3, 4, 5, 6, 7, 8, 9)) + .and(TASK_STAFF_GROUP.STAFF_ID.eq(loginUserInfo.getString("id"))) + //获取当月绩点 + .and(TASK.COMPLETION_DATE.between(firstDay, lastDay)) + , TaskIndividualGpaVo.IndividualGpa.class); + TaskIndividualGpaVo vo = new TaskIndividualGpaVo(); + if (individualGpas.isEmpty()) { + return vo; + } + //绩点详情 + vo.setGpa(individualGpas); + //获取当天值班信息 + WorkOrderDutyVo workOrderDuty = SpringUtils.getBean(TaskWorkOrderService.class).getWorkOrderDutyStaff(); + vo.setDutyVo(workOrderDuty); + //已完成 + vo.setHaveFinished(individualGpas.stream().filter(item -> item.getTaskStatus() == 8 || item.getTaskStatus() == 9) + .mapToInt(TaskIndividualGpaVo.IndividualGpa::getGradePoint).sum()); + //待完成 + vo.setToBeCompleted(individualGpas.stream().filter(item -> item.getTaskStatus() != 8 && item.getTaskStatus() != 9) + .mapToInt(TaskIndividualGpaVo.IndividualGpa::getGradePoint).sum()); + return vo; + } } diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/service/impl/TaskWorkOrderServiceImpl.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/service/impl/TaskWorkOrderServiceImpl.java index e729aa6..0193e02 100644 --- a/Cpop-Oam/src/main/java/com/cpop/oam/business/service/impl/TaskWorkOrderServiceImpl.java +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/service/impl/TaskWorkOrderServiceImpl.java @@ -41,7 +41,6 @@ import org.springframework.transaction.annotation.Transactional; import java.io.IOException; import java.sql.Date; import java.text.ParseException; -import java.time.Duration; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; @@ -567,15 +566,8 @@ public class TaskWorkOrderServiceImpl extends ServiceImpl= 4800000 - || Duration.between(finishTime, taskWorkOrder.getPauseExpireTime()).toMillis() >= 4800000) { - // 工单正常与暂停期间完成 - task.setTaskStatus(3); - } else { - task.setTaskStatus(6); - } - task.setTaskItem(3); + //直接设置完成 + task.setTaskItem(3).setTaskStatus(9); task.setCompletionDate(LocalDate.now()); taskService.updateById(task); // 更新工单 diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/PersonTaskPageVo.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/PersonTaskPageVo.java index 7e55934..f25d348 100644 --- a/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/PersonTaskPageVo.java +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/PersonTaskPageVo.java @@ -1,5 +1,6 @@ package com.cpop.oam.business.vo; +import com.cpop.core.annontation.StringArrayConvert; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -9,6 +10,7 @@ import lombok.experimental.Accessors; import java.io.Serializable; import java.sql.Timestamp; import java.time.LocalDate; +import java.time.LocalDateTime; /** * Description: @@ -47,6 +49,19 @@ public class PersonTaskPageVo implements Serializable { @ApiModelProperty("任务项(0:待开发;1:待测试:2:待部署;3:已归档)") private Integer taskItem; + /** + * 任务项(0:待开发;1:待测试:2:待部署;3:已归档) + */ + @StringArrayConvert + @ApiModelProperty("任务进度(0:开发文档;1:原型涉及;2:UI涉及;3:前端开发;4:后端开发)") + private String taskProgress; + + /** + * 主体 + */ + @ApiModelProperty("主体") + private String subject; + /** * 任务内容 */ @@ -77,5 +92,5 @@ public class PersonTaskPageVo implements Serializable { */ @ApiModelProperty("任务接收时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") - private Timestamp taskReceiptTime; + private LocalDateTime taskReceiptTime; } diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/RolePageVo.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/RolePageVo.java index f6dec9f..3f63586 100644 --- a/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/RolePageVo.java +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/RolePageVo.java @@ -8,7 +8,7 @@ import lombok.Data; import lombok.experimental.Accessors; import java.io.Serializable; -import java.sql.Timestamp; +import java.time.LocalDateTime; import java.util.List; /** @@ -65,7 +65,7 @@ public class RolePageVo implements Serializable { */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" , timezone = "GMT+8") @ApiModelProperty("更新时间") - private Timestamp updateTime; + private LocalDateTime updateTime; /** * 角色所属菜单id集合 diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/TaskIndividualGpaVo.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/TaskIndividualGpaVo.java new file mode 100644 index 0000000..26ab64a --- /dev/null +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/TaskIndividualGpaVo.java @@ -0,0 +1,88 @@ +package com.cpop.oam.business.vo; + +import com.cpop.oam.business.entity.TaskStaffGroup; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.List; + +/** + * @author DB + * @version 1.0.0 + * @since 2023-12-05 17:34 + */ +@Data +@Accessors(chain = true) +@ApiModel(value = "个人绩点对象", description = "个人绩点对象") +public class TaskIndividualGpaVo { + + /** + * 值班信息 + */ + @ApiModelProperty(value = "值班信息") + private WorkOrderDutyVo dutyVo; + + /** + * 已完成 + */ + @ApiModelProperty(value = "已完成") + private Integer haveFinished; + + /** + * 待完成 + */ + @ApiModelProperty(value = "待完成") + private Integer toBeCompleted; + + /** + * 个人绩点 + */ + @ApiModelProperty(value = "个人绩点") + private List gpa; + + /** + * 个人绩点 + * + * @author DB + * @since 2023/12/05 + */ + @Data + @Accessors(chain = true) + public class IndividualGpa { + + /** + * 任务状态 + */ + @ApiModelProperty(value = "任务状态") + private Integer taskStatus; + + /** + * 任务id + */ + @ApiModelProperty(value = "任务") + private String id; + + /** + * 任务内容 + */ + @ApiModelProperty(value = "任务内容") + private String taskContent; + + /** + * 备注 + */ + @ApiModelProperty(value = "备注") + private String remark; + + /** + * 绩点 + */ + @ApiModelProperty(value = "绩点") + private Integer gradePoint; + + } + + +} diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/TaskMonthStatisticsVo.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/TaskMonthStatisticsVo.java index d7fdfcc..14e1d5c 100644 --- a/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/TaskMonthStatisticsVo.java +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/TaskMonthStatisticsVo.java @@ -35,24 +35,18 @@ public class TaskMonthStatisticsVo implements Serializable { @ApiModelProperty(value = "已完成") private Long haveCompleted = 0L; + /** + * 测试中 + */ + @ApiModelProperty(value = "测试中") + private Long inTest = 0L; + /** * 已逾期 */ @ApiModelProperty(value = "已逾期") private Long overdue = 0L; - /** - * 暂停 - */ - @ApiModelProperty(value = "暂停") - private Long pause = 0L; - - /** - * 逾期完成 - */ - @ApiModelProperty(value = "逾期完成") - private Long overdueCompletion = 0L; - /** * 当月绩点 */ diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/TaskWorkOrderRecordListVo.java b/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/TaskWorkOrderRecordListVo.java index 8e9e9d3..e93cc4e 100644 --- a/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/TaskWorkOrderRecordListVo.java +++ b/Cpop-Oam/src/main/java/com/cpop/oam/business/vo/TaskWorkOrderRecordListVo.java @@ -6,7 +6,8 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; -import java.sql.Timestamp; +import java.time.LocalDateTime; + import com.cpop.core.annontation.StringArrayConvert; /** @@ -74,5 +75,5 @@ public class TaskWorkOrderRecordListVo { */ @ApiModelProperty("创建时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") - private Timestamp createTime; + private LocalDateTime createTime; } diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/framework/tasks/WorkOrderAcceptOverTimeTask.java b/Cpop-Oam/src/main/java/com/cpop/oam/framework/tasks/WorkOrderAcceptOverTimeTask.java index aa0cd83..df811a2 100644 --- a/Cpop-Oam/src/main/java/com/cpop/oam/framework/tasks/WorkOrderAcceptOverTimeTask.java +++ b/Cpop-Oam/src/main/java/com/cpop/oam/framework/tasks/WorkOrderAcceptOverTimeTask.java @@ -39,12 +39,12 @@ public class WorkOrderAcceptOverTimeTask implements Job { TaskStaffGroupService taskStaffGroupService = SpringUtils.getBean(TaskStaffGroupService.class); taskStaffGroupService.updateChain() .set(TASK_STAFF_GROUP.GRADE_POINT, -5) + .set(TASK_STAFF_GROUP.REMARK, "工单接收超时扣除5绩点 ") .where(TASK_STAFF_GROUP.TASK_ID.eq(task.getId()) .and(TASK_STAFF_GROUP.STAFF_ID.eq(task.getResponsibleStaffId()))); // 更新任务为接收超时 taskService.updateChain() .set(TASK.TASK_STATUS, 7) - .set(TASK.REMARK, "工单接收超时扣除5绩点 ") .where(TASK.ID.eq(task.getId())) .update(); } diff --git a/Cpop-Oam/src/main/java/com/cpop/oam/framework/tasks/WorkOrderOvertimeTask.java b/Cpop-Oam/src/main/java/com/cpop/oam/framework/tasks/WorkOrderOvertimeTask.java index c536693..7dcc45a 100644 --- a/Cpop-Oam/src/main/java/com/cpop/oam/framework/tasks/WorkOrderOvertimeTask.java +++ b/Cpop-Oam/src/main/java/com/cpop/oam/framework/tasks/WorkOrderOvertimeTask.java @@ -34,13 +34,13 @@ public class WorkOrderOvertimeTask implements Job { // 扣除5点绩点 TaskStaffGroupService taskStaffGroupService = SpringUtils.getBean(TaskStaffGroupService.class); taskStaffGroupService.updateChain() - .setRaw(TASK_STAFF_GROUP.GRADE_POINT, "grade_point - 5") - .where(TASK_STAFF_GROUP.TASK_ID.eq(workOrderId)); + .setRaw(TASK_STAFF_GROUP.GRADE_POINT, "grade_point - 5") + .set(TASK_STAFF_GROUP.REMARK, "remark + '工单完结超时扣除5绩点'") + .where(TASK_STAFF_GROUP.TASK_ID.eq(workOrderId)); // 更新任务为逾期 taskService.updateChain() - .set(TASK.TASK_STATUS, 4) - .set(TASK.REMARK, "remark + '工单完结超时扣除5绩点'") - .where(TASK.ID.eq(taskWorkOrder.getTaskId())) - .update(); + .set(TASK.TASK_STATUS, 4) + .where(TASK.ID.eq(taskWorkOrder.getTaskId())) + .update(); } } diff --git a/Cpop-System/src/main/java/com/cpop/system/business/bo/DictDataPageBo.java b/Cpop-System/src/main/java/com/cpop/system/business/bo/DictDataPageBo.java index b9a3e25..86272f4 100644 --- a/Cpop-System/src/main/java/com/cpop/system/business/bo/DictDataPageBo.java +++ b/Cpop-System/src/main/java/com/cpop/system/business/bo/DictDataPageBo.java @@ -27,4 +27,10 @@ public class DictDataPageBo { */ @ApiModelProperty("字典类型") private String dictType; + + /** + * 字典状态 + */ + @ApiModelProperty("字典状态") + private Boolean status; } diff --git a/Cpop-System/src/main/java/com/cpop/system/business/controller/DictTypeController.java b/Cpop-System/src/main/java/com/cpop/system/business/controller/DictTypeController.java index b78bca4..39a7aa5 100644 --- a/Cpop-System/src/main/java/com/cpop/system/business/controller/DictTypeController.java +++ b/Cpop-System/src/main/java/com/cpop/system/business/controller/DictTypeController.java @@ -91,7 +91,10 @@ public class DictTypeController { if (!dictTypeService.checkDictTypeUnique(bo)) { throw new ServiceException("新增字典'" + bo.getDictName() + "'失败,字典类型已存在"); } - dictTypeService.save(BeanUtils.mapToClass(bo, DictType.class)); + LoginUser loginUser = SecurityUtils.getInstance().getLoginUser(); + DictType dictType = BeanUtils.mapToClass(bo, DictType.class); + dictType.setUserType(loginUser.getUserType().toString()); + dictTypeService.save(dictType); return R.ok(); } diff --git a/Cpop-System/src/main/java/com/cpop/system/business/service/impl/DictDataServiceImpl.java b/Cpop-System/src/main/java/com/cpop/system/business/service/impl/DictDataServiceImpl.java index 57516e9..c8eff70 100644 --- a/Cpop-System/src/main/java/com/cpop/system/business/service/impl/DictDataServiceImpl.java +++ b/Cpop-System/src/main/java/com/cpop/system/business/service/impl/DictDataServiceImpl.java @@ -20,9 +20,11 @@ import com.cpop.system.business.entity.DictData; import com.cpop.system.business.mapper.DictDataMapper; import com.cpop.system.business.service.DictDataService; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; import static com.cpop.system.business.entity.table.DictDataTableDef.DICT_DATA; @@ -49,10 +51,11 @@ public class DictDataServiceImpl extends ServiceImpl i PageDomain pageDomain = SqlUtils.getInstance().getPageDomain(); return this.pageAs(Page.of(pageDomain.getPageNum(), pageDomain.getPageSize()), QueryWrapper.create() - .select(DICT_DATA.ID, DICT_DATA.DICT_LABEL, DICT_DATA.DICT_VALUE, DICT_DATA.DICT_TYPE, DICT_DATA.UPDATE_TIME) + .select(DICT_DATA.ID, DICT_DATA.DICT_LABEL, DICT_DATA.DICT_VALUE, DICT_DATA.DICT_TYPE, DICT_DATA.UPDATE_TIME,DICT_DATA.STATUS,DICT_DATA.DICT_SORT) .where(DICT_DATA.USER_TYPE.eq(loginUser.getUserType().toString())) .and(DICT_DATA.DICT_TYPE.eq(bo.getDictType())) .and(DICT_DATA.DICT_LABEL.like(bo.getDictLabel())) + .and(DICT_DATA.STATUS.eq(bo.getStatus())) .orderBy(DICT_DATA.DICT_SORT.asc()), DictDataPageVo.class); } @@ -112,6 +115,10 @@ public class DictDataServiceImpl extends ServiceImpl i boolean save = this.save(dictData); if (save) { List dictDatas = getDictDataByDictType(dictData.getDictType()); + //判断新增的数据是否在缓存中 + if (!dictDatas.stream().map(DictData::getId).collect(Collectors.toSet()).contains(dictData.getId())) { + dictDatas.add(dictData); + } DictUtils.setDictCache(dictData.getDictType(), dictDatas); } } @@ -128,7 +135,10 @@ public class DictDataServiceImpl extends ServiceImpl i boolean save = this.updateById(dictData); if (save) { List dictDatas = getDictDataByDictType(dictData.getDictType()); - DictUtils.setDictCache(dictData.getDictType(), dictDatas); + //判断新增的数据是否在缓存中 + List filterList = dictDatas.stream().filter(item -> !StringUtils.equals(item.getId(), dictData.getId())).collect(Collectors.toList()); + filterList.add(getById(dictData.getId())); + DictUtils.setDictCache(dictData.getDictType(), filterList); } } diff --git a/Cpop-System/src/main/java/com/cpop/system/business/service/impl/DictTypeServiceImpl.java b/Cpop-System/src/main/java/com/cpop/system/business/service/impl/DictTypeServiceImpl.java index eff973e..5abe110 100644 --- a/Cpop-System/src/main/java/com/cpop/system/business/service/impl/DictTypeServiceImpl.java +++ b/Cpop-System/src/main/java/com/cpop/system/business/service/impl/DictTypeServiceImpl.java @@ -52,7 +52,7 @@ public class DictTypeServiceImpl extends ServiceImpl i //获取当前登陆用户类型 LoginUser loginUser = SecurityUtils.getInstance().getLoginUser(); return this.pageAs(Page.of(pageDomain.getPageNum(), pageDomain.getPageSize()), - QueryWrapper.create().select(DICT_TYPE.ID, DICT_TYPE.DICT_NAME, DICT_TYPE.DICT_TYPE_, DICT_TYPE.UPDATE_TIME) + QueryWrapper.create().select(DICT_TYPE.ID,DICT_TYPE.STATUS, DICT_TYPE.DICT_NAME, DICT_TYPE.DICT_TYPE_, DICT_TYPE.UPDATE_TIME) .where(DICT_TYPE.USER_TYPE.eq(loginUser.getUserType().toString())) .and(DICT_TYPE.DICT_NAME.like(dictName)), DictTypePageVo.class); diff --git a/Cpop-System/src/main/java/com/cpop/system/business/vo/DictDataPageVo.java b/Cpop-System/src/main/java/com/cpop/system/business/vo/DictDataPageVo.java index 775aa19..c2513c1 100644 --- a/Cpop-System/src/main/java/com/cpop/system/business/vo/DictDataPageVo.java +++ b/Cpop-System/src/main/java/com/cpop/system/business/vo/DictDataPageVo.java @@ -43,6 +43,18 @@ public class DictDataPageVo { @ApiModelProperty(value = "字典类型") private String dictType; + /** + * 状态 + */ + @ApiModelProperty(value = "状态") + private Boolean status; + + /** + * 排序 + */ + @ApiModelProperty(value = "排序") + private Integer dictSort; + /** * 更新时间 */ diff --git a/Cpop-System/src/main/java/com/cpop/system/business/vo/DictTypePageVo.java b/Cpop-System/src/main/java/com/cpop/system/business/vo/DictTypePageVo.java index 52daf0e..7164e86 100644 --- a/Cpop-System/src/main/java/com/cpop/system/business/vo/DictTypePageVo.java +++ b/Cpop-System/src/main/java/com/cpop/system/business/vo/DictTypePageVo.java @@ -4,7 +4,8 @@ import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import org.joda.time.LocalDateTime; + +import java.time.LocalDateTime; /** * 字典类型分页 @@ -34,6 +35,12 @@ public class DictTypePageVo { @ApiModelProperty(value = "字典类型") private String dictType; + /** + * 状态 + */ + @ApiModelProperty(value = "状态") + private Boolean status; + /** * 更新时间 */ diff --git a/Cpop-System/src/main/java/com/cpop/system/business/vo/RolePageVo.java b/Cpop-System/src/main/java/com/cpop/system/business/vo/RolePageVo.java index 5325933..8220956 100644 --- a/Cpop-System/src/main/java/com/cpop/system/business/vo/RolePageVo.java +++ b/Cpop-System/src/main/java/com/cpop/system/business/vo/RolePageVo.java @@ -9,6 +9,7 @@ import lombok.experimental.Accessors; import java.io.Serializable; import java.sql.Timestamp; +import java.time.LocalDateTime; import java.util.List; /** @@ -65,7 +66,7 @@ public class RolePageVo implements Serializable { */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" , timezone = "GMT+8") @ApiModelProperty("更新时间") - private Timestamp updateTime; + private LocalDateTime updateTime; /** * 角色所属菜单id集合 diff --git a/Cpop-System/src/main/java/com/cpop/system/framework/utils/DictUtils.java b/Cpop-System/src/main/java/com/cpop/system/framework/utils/DictUtils.java index f79ca90..47b2255 100644 --- a/Cpop-System/src/main/java/com/cpop/system/framework/utils/DictUtils.java +++ b/Cpop-System/src/main/java/com/cpop/system/framework/utils/DictUtils.java @@ -1,9 +1,13 @@ package com.cpop.system.framework.utils; -import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson2.JSONObject; import com.cpop.common.constant.Constants; import com.cpop.common.utils.StringUtils; +import com.cpop.core.base.entity.LoginUser; +import com.cpop.core.base.enums.UserType; import com.cpop.core.service.RedisService; +import com.cpop.core.utils.SecurityUtils; import com.cpop.core.utils.SpringUtils; import com.cpop.system.business.entity.DictData; import org.springframework.data.redis.cache.RedisCache; @@ -39,7 +43,7 @@ public class DictUtils { public static List getDictCache(String key) { JSONArray arrayCache = SpringUtils.getBean(RedisService.class).getCacheObject(getCacheKey(key)); if (StringUtils.isNotNull(arrayCache)) { - return arrayCache.toList(DictData.class); + return arrayCache.toJavaList(DictData.class); } return null; } @@ -154,6 +158,11 @@ public class DictUtils { * @return 缓存键key */ public static String getCacheKey(String configKey) { - return Constants.SYS_DICT_KEY + configKey; + LoginUser loginUser = SecurityUtils.getInstance().getLoginUser(); + if (loginUser == null) { + return Constants.SYS_DICT_KEY + UserType.OAM_USER + ":" + configKey; + } else { + return Constants.SYS_DICT_KEY + loginUser.getUserType() + ":" + configKey; + } } }