字典管理;任务数据统计;个人绩点统计

This commit is contained in:
DB 2023-12-05 21:12:42 +08:00
parent de7e7d72e7
commit dd0948e875
28 changed files with 641 additions and 245 deletions

View File

@ -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<String> phoneList, String content, Boolean isAll) throws IOException {
public void webHookSendText(String key, List<String> 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();
}
}

View File

@ -31,7 +31,7 @@ public class CpopApiTests {
List<String> 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);
}

View File

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

View File

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

View File

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

View File

@ -23,8 +23,8 @@ public class TaskMonthStatisticsBo implements Serializable {
/**
* 主要负责员工id
*/
@ApiModelProperty("主要负责员工id")
private String responsibleStaffId;
@ApiModelProperty("技术员工id")
private String technologyStaffId;
/**
* 任务月份

View File

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

View File

@ -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<List<TaskWorkOrderPersonVo>> 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<List<TaskWorkOrderRecordListVo>> 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<Void> 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<Page<TaskArchivingPagVo>> getTaskArchivingPage(@ApiParam(value = "主体")
String subject, @ApiParam(value = "任务内容")
String taskContent, @RequestParam("isFinish") @ApiParam(value = "是否已归档", required = true)
Boolean isFinish) {
Page<TaskArchivingPagVo> page = taskService.getTaskArchivingPage(subject, taskContent, isFinish);
public R<Page<TaskArchivingPagVo>> getTaskArchivingPage(TaskArchivingPagBo bo) {
Page<TaskArchivingPagVo> 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<Void> 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<Page<TaskToBeClaimedPageVo>> 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<Void> 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<Void> 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<Void> 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<Page<PersonTaskPageVo>> getPersonTaskPage() {
@ -301,15 +298,28 @@ public class TaskTechnologyController {
return R.ok();
}
/**
* 技术模块-今日事务-更新任务进度
* @author DB
* @since 2023/12/04
* @param bo 请求参数
* @return R<Void>
*/
@ApiOperation("技术模块-今日事务-更新任务进度")
@PutMapping("/updateTaskProgress")
public R<Void> updateTaskProgress(@RequestBody @Validated
TaskProgressBo bo) {
taskService.updateTaskProgress(bo);
return R.ok();
}
/**
* "技术模块-今日事务-转交任务
* @author DB
* @since 2023/12/04
* @param bo 请求参数
* @Description: 修改任务进度
* @return: R<Void>
* @Author: DB
* @Date: 2023/5/29 14:58
**/
* @return R<Void>
*/
@ApiOperation("技术模块-今日事务-转交任务")
@PutMapping("/updateTaskItem")
public R<Void> updateTaskItem(@RequestBody @Validated
@ -319,32 +329,42 @@ public class TaskTechnologyController {
}
/**
* @param id 主键
* @Description: 完成任务
* @return: R<Void>
* @Author: DB
* @Date: 2023/5/31 16:24
**/
@PreAuthorize("@aps.hasPermission('oamTask:task:update')")
@ApiOperation("完成任务")
@PutMapping("/finishTask/{id}")
public R<Void> finishTask(@PathVariable
String id) {
taskService.finishTask(id);
return R.ok();
}
/**
* 技术模块-数据统计-获取月度任务统计列表
* @author DB
* @since 2023/12/04
* @param bo 请求参数
* @Description: 获取月度任务统计列表
* @return: R<List < TaskListVo>>
* @Author: DB
* @Date: 2023/5/15 16:42
**/
@ApiOperation("获取月度任务统计列表")
* @return R<TaskMonthStatisticsVo>
*/
@ApiOperation("技术模块-数据统计-获取月度任务统计列表")
@GetMapping("/getTaskMonthStatistics")
public R<TaskMonthStatisticsVo> getTaskMonthStatistics(TaskMonthStatisticsBo bo) {
return R.ok(taskService.getTaskMonthStatistics(bo));
}
/**
* 技术模块-数据统计-获取任务日报
* @author DB
* @since 2023/12/05
* @return R<TaskMonthStatisticsVo>
*/
@ApiOperation("技术模块-数据统计-获取任务日报")
@GetMapping("/getTaskDailyPaper")
public R<String> getTaskDailyPaper(TaskDailyPaperBo bo) {
String dailyPaper = taskService.getTaskDailyPaper(bo);
return R.ok(dailyPaper);
}
/**
* 技术模块-今日事务-个人绩点
* @author DB
* @since 2023/12/05
* @return R<TaskIndividualGpaVo>
*/
@ApiOperation("技术模块-今日事务-个人绩点")
@GetMapping("/getIndividualGpa")
public R<TaskIndividualGpaVo> getIndividualGpa() {
TaskIndividualGpaVo vo = taskService.getIndividualGpa();
return R.ok(vo);
}
}

View File

@ -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是)

View File

@ -46,4 +46,9 @@ public class TaskStaffGroup extends BaseEntity implements Serializable {
*/
private Integer gradePoint;
/**
* 备注
*/
private String remark;
}

View File

@ -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<Task> {
/**
* 技术模块-任务归档-获取任务归档分页
* @author DB
* @param subject 主体
* @param taskContent 任务内容
* @param bo 请求
* @since 2023-11-30 21:11:47
*/
Page<TaskArchivingPagVo> getTaskArchivingPage(String subject, String taskContent, Boolean isFinish);
Page<TaskArchivingPagVo> getTaskArchivingPage(TaskArchivingPagBo bo);
/**
* 技术模块-任务归档-设置任务归档
@ -77,12 +73,11 @@ public interface TaskService extends IService<Task> {
Page<PersonTaskPageVo> getPersonTaskPage();
/**
* @Description: 修改任务进度
* 技术模块-今日事务-转交任务
* @author DB
* @since 2023/12/04
* @param bo 请求参数
* @return: R<Void>
* @Author: DB
* @Date: 2023/5/29 14:58
**/
*/
void updateTaskItem(TaskItemBo bo);
/**
@ -94,21 +89,36 @@ public interface TaskService extends IService<Task> {
void updateTaskResponsibleStaff(TransferTaskBo bo);
/**
* @Description: 完成任务
* @param id 主键
* @return: R<Void>
* @Author: DB
* @Date: 2023/5/31 16:24
**/
void finishTask(String id);
/**
* @Description: 获取月度任务统计列表
* 技术模块-数据统计-获取月度任务统计列表
* @author DB
* @since 2023/12/04
* @param bo 请求参数
* @return: R<List<TaskListVo>>
* @Author: DB
* @Date: 2023/5/15 16:42
**/
* @return R<TaskMonthStatisticsVo>
*/
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();
}

View File

@ -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<TaskMapper, Task> implements Ta
/**
* 技术模块-任务归档-获取任务归档分页
*
* @param subject 品主体牌名
* @param taskContent 任务内容
* @author DB
* @param bo 请求
* @since 2023-11-30 21:11:47
*/
@Override
public Page<TaskArchivingPagVo> getTaskArchivingPage(String subject, String taskContent, Boolean isFinish) {
public Page<TaskArchivingPagVo> getTaskArchivingPage(TaskArchivingPagBo bo) {
// 获取当前员工
JSONObject loginUserInfo = SecurityUtils.getInstance().getLoginUserInfo();
PageDomain pageDomain = SqlUtils.getInstance().getPageDomain();
@ -86,15 +77,14 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> 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<TaskMapper, Task> 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<TaskMapper, Task> 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<TaskMapper, Task> implements Ta
}
/**
* "技术模块-今日事务-转交任务
*
* @param bo 请求参数
* @Description: 修改任务进度
* @return: R<Void>
* @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<TaskStaffGroup> 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<TaskMapper, Task> 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<Void>
* @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<List < TaskListVo>>
* @Author: DB
* @Date: 2023/5/15 16:42
**/
* @return R<TaskMonthStatisticsVo>
* @author DB
* @since 2023/12/04
*/
@Override
public TaskMonthStatisticsVo getTaskMonthStatistics(TaskMonthStatisticsBo bo) {
// 员工组绩点信息
List<TaskStaffGroup> 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<TaskMapper, Task> implements Ta
LocalDate now = LocalDate.now();
firstDay = now.with(TemporalAdjusters.firstDayOfMonth());
}
List<Task> taskList = this.list(queryWrapper.select(TASK.ALL_COLUMNS)
//查询当月所有任务
List<Task> 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<TaskStaffGroup> 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<TaskMapper, Task> implements Ta
* @Author: DB
* @Date: 2023/5/15 17:54
**/
private TaskMonthStatisticsVo buildMonthTaskStatistics(List<Task> taskList, TaskMonthStatisticsBo bo,
List<TaskStaffGroup> taskStaffGroups) {
private TaskMonthStatisticsVo buildMonthTaskStatistics(List<Task> taskList, TaskMonthStatisticsBo bo, List<TaskStaffGroup> taskStaffGroups) {
TaskMonthStatisticsVo statisticsVo = new TaskMonthStatisticsVo();
List<TaskMonthStatisticsVo.DataStatisticsVo> vos = new ArrayList<>();
statisticsVo.setVos(vos);
// 统计数据
// 进行中运营人员
statisticsVo.setInProgress(taskList.stream().filter(s -> 2 == s.getTaskStatus()).count());
// 已完成
Set<String> 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<String> 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<String> 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<Date> allTheDateOfMonth;
// 有传入月份
@ -575,7 +572,7 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> 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<TaskMapper, Task> implements Ta
* @Author: DB
* @Date: 2023/5/29 18:24
**/
private Long statisticalGPA(List<TaskStaffGroup> taskStaffGroups) {
private Long statisticalGpa(List<TaskStaffGroup> taskStaffGroups) {
// 获取任务
if (null != taskStaffGroups) {
return taskStaffGroups.stream().mapToLong(TaskStaffGroup::getGradePoint).sum();
@ -601,4 +598,122 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> 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<Task> 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<String, List<TaskStaffGroup>> 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<Task> taskList, Map<String, List<TaskStaffGroup>> taskStaffGroupMap) {
//所有技术员工信息
Map<String, Staff> 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<Integer> 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<TaskIndividualGpaVo.IndividualGpa> 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;
}
}

View File

@ -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<TaskWorkOrderMapper, T
// 设置工单完成
TaskService taskService = SpringUtils.getBean(TaskService.class);
Task task = taskService.getOne(QueryWrapper.create().where(TASK.ID.eq(taskWorkOrder.getTaskId())));
// 超时设置逾期
if (Duration.between(finishTime, task.getTaskReceiptTime()).toMillis() >= 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);
// 更新工单

View File

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

View File

@ -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集合

View File

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

View File

@ -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;
/**
* 当月绩点
*/

View File

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

View File

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

View File

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

View File

@ -27,4 +27,10 @@ public class DictDataPageBo {
*/
@ApiModelProperty("字典类型")
private String dictType;
/**
* 字典状态
*/
@ApiModelProperty("字典状态")
private Boolean status;
}

View File

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

View File

@ -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<DictDataMapper, DictData> 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<DictDataMapper, DictData> i
boolean save = this.save(dictData);
if (save) {
List<DictData> 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<DictDataMapper, DictData> i
boolean save = this.updateById(dictData);
if (save) {
List<DictData> dictDatas = getDictDataByDictType(dictData.getDictType());
DictUtils.setDictCache(dictData.getDictType(), dictDatas);
//判断新增的数据是否在缓存中
List<DictData> filterList = dictDatas.stream().filter(item -> !StringUtils.equals(item.getId(), dictData.getId())).collect(Collectors.toList());
filterList.add(getById(dictData.getId()));
DictUtils.setDictCache(dictData.getDictType(), filterList);
}
}

View File

@ -52,7 +52,7 @@ public class DictTypeServiceImpl extends ServiceImpl<DictTypeMapper, DictType> 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);

View File

@ -43,6 +43,18 @@ public class DictDataPageVo {
@ApiModelProperty(value = "字典类型")
private String dictType;
/**
* 状态
*/
@ApiModelProperty(value = "状态")
private Boolean status;
/**
* 排序
*/
@ApiModelProperty(value = "排序")
private Integer dictSort;
/**
* 更新时间
*/

View File

@ -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;
/**
* 更新时间
*/

View File

@ -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集合

View File

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