business/src/main/java/com/ycl/controller/WorkStationScheduleController.java
New file @@ -0,0 +1,84 @@ package com.ycl.controller; import com.ycl.common.group.Update; import com.ycl.common.group.Add; import org.springframework.validation.annotation.Validated; import org.springframework.security.access.prepost.PreAuthorize; import lombok.RequiredArgsConstructor; import java.util.List; import javax.validation.constraints.NotEmpty; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import com.ycl.service.WorkStationScheduleService; import com.ycl.common.base.Result; import com.ycl.domain.form.WorkStationScheduleForm; import com.ycl.domain.query.WorkStationScheduleQuery; import org.springframework.web.bind.annotation.*; /** * 前端控制器 * * @author zxl * @since 2025-12-05 */ @Validated @RequiredArgsConstructor @Api(value = "", tags = "日程管理") @RestController @RequestMapping("/work-station-schedule") public class WorkStationScheduleController { private final WorkStationScheduleService workStationScheduleService; @PostMapping @ApiOperation(value = "添加", notes = "添加") public Result add(@RequestBody @Validated(Add.class) WorkStationScheduleForm form) { return workStationScheduleService.add(form); } @PutMapping @ApiOperation(value = "修改", notes = "修改") public Result update(@RequestBody @Validated(Update.class) WorkStationScheduleForm form) { return workStationScheduleService.update(form); } @DeleteMapping("/{id}") @ApiOperation(value = "ID删除", notes = "ID删除") public Result removeById(@PathVariable("id") String id) { return workStationScheduleService.removeById(id); } @DeleteMapping("/batch") @ApiOperation(value = "批量删除", notes = "批量删除") public Result remove(@RequestBody @NotEmpty(message = "请选择数据") List<String> ids) { return workStationScheduleService.remove(ids); } @GetMapping("/page") @ApiOperation(value = "分页", notes = "分页") public Result page(WorkStationScheduleQuery query) { return workStationScheduleService.page(query); } @GetMapping("/{id}") @ApiOperation(value = "详情", notes = "详情") public Result detail(@PathVariable("id") Integer id) { return workStationScheduleService.detail(id); } @GetMapping("/list") @ApiOperation(value = "列表", notes = "列表") public Result list() { return workStationScheduleService.all(); } /** * * 统计个人成就 * @return */ @GetMapping("/countAchievements") public Result countAchievements(){ return workStationScheduleService.countAchievements(); } } business/src/main/java/com/ycl/domain/entity/WorkStationSchedule.java
New file @@ -0,0 +1,39 @@ package com.ycl.domain.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import java.time.LocalDateTime; import java.util.Date; import com.ycl.system.domain.base.AbsEntity; import lombok.Data; /** * * * @author zxl * @since 2025-12-05 */ @Data @TableName("t_work_station_schedule") public class WorkStationSchedule extends AbsEntity { @TableField("user_id") /** 所属用户id */ private Long userId; @TableField("content") /** 工作内容 */ private String content; @TableField("status") /** 状态 */ private String status; /** * 完成日期 * */ @TableField("completed_time") private Date completedTime; } business/src/main/java/com/ycl/domain/form/WorkStationScheduleForm.java
New file @@ -0,0 +1,54 @@ package com.ycl.domain.form; import com.ycl.common.group.Update; import com.ycl.common.group.Add; import com.ycl.system.domain.base.AbsForm; import com.ycl.domain.entity.WorkStationSchedule; import org.springframework.beans.BeanUtils; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import org.springframework.lang.NonNull; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.Date; /** * 表单 * * @author zxl * @since 2025-12-05 */ @Data @ApiModel(value = "WorkStationSchedule表单", description = "表单") public class WorkStationScheduleForm extends AbsForm { @NotNull(message = "所属用户id不能为空", groups = {Add.class, Update.class}) @ApiModelProperty("所属用户id") private Long userId; @NotBlank(message = "工作内容不能为空", groups = {Add.class, Update.class}) @ApiModelProperty("工作内容") private String content; @NotBlank(message = "状态不能为空", groups = {Add.class, Update.class}) @ApiModelProperty("状态") private String status; @NotNull(message = "不能为空", groups = {Add.class, Update.class}) @ApiModelProperty("") private Date gmtcreate; @NotNull(message = "不能为空", groups = {Add.class, Update.class}) @ApiModelProperty("") private Date gmtupdate; public static WorkStationSchedule getEntityByForm(@NonNull WorkStationScheduleForm form, WorkStationSchedule entity) { if(entity == null) { entity = new WorkStationSchedule(); } BeanUtils.copyProperties(form, entity); return entity; } } business/src/main/java/com/ycl/domain/query/WorkStationScheduleQuery.java
New file @@ -0,0 +1,17 @@ package com.ycl.domain.query; import com.ycl.system.domain.base.AbsQuery; import io.swagger.annotations.ApiModel; import lombok.Data; /** * 查询 * * @author zxl * @since 2025-12-05 */ @Data @ApiModel(value = "WorkStationSchedule查询参数", description = "查询参数") public class WorkStationScheduleQuery extends AbsQuery { } business/src/main/java/com/ycl/domain/vo/WorkStationScheduleVO.java
New file @@ -0,0 +1,50 @@ package com.ycl.domain.vo; import com.ycl.system.domain.base.AbsVo; import com.ycl.domain.entity.WorkStationSchedule; import org.springframework.lang.NonNull; import org.springframework.beans.BeanUtils; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.Date; /** * 展示 * * @author zxl * @since 2025-12-05 */ @Data @ApiModel(value = "响应数据", description = "响应数据") public class WorkStationScheduleVO extends AbsVo { /** 所属用户id */ @ApiModelProperty("所属用户id") private Long userId; /** 工作内容 */ @ApiModelProperty("工作内容") private String content; /** 状态 */ @ApiModelProperty("状态") private String status; /** */ @ApiModelProperty("") private Date gmtcreate; /** */ @ApiModelProperty("") private Date gmtupdate; public static WorkStationScheduleVO getVoByEntity(@NonNull WorkStationSchedule entity, WorkStationScheduleVO vo) { if(vo == null) { vo = new WorkStationScheduleVO(); } BeanUtils.copyProperties(entity, vo); return vo; } } business/src/main/java/com/ycl/mapper/WorkStationScheduleMapper.java
New file @@ -0,0 +1,32 @@ package com.ycl.mapper; import com.ycl.domain.entity.WorkStationSchedule; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ycl.domain.vo.WorkStationScheduleVO; import com.ycl.domain.query.WorkStationScheduleQuery; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; /** * Mapper 接口 * * @author zxl * @since 2025-12-05 */ @Mapper public interface WorkStationScheduleMapper extends BaseMapper<WorkStationSchedule> { /** * id查找 * @param id * @return */ WorkStationScheduleVO getById(Integer id); /** * 分页 */ IPage getPage(IPage page, @Param("query") WorkStationScheduleQuery query); } business/src/main/java/com/ycl/service/WorkStationScheduleService.java
New file @@ -0,0 +1,69 @@ package com.ycl.service; import com.ycl.domain.entity.WorkStationSchedule; import com.baomidou.mybatisplus.extension.service.IService; import com.ycl.common.base.Result; import com.ycl.domain.form.WorkStationScheduleForm; import com.ycl.domain.query.WorkStationScheduleQuery; import java.util.List; /** * 服务类 * * @author zxl * @since 2025-12-05 */ public interface WorkStationScheduleService extends IService<WorkStationSchedule> { /** * 添加 * @param form * @return */ Result add(WorkStationScheduleForm form); /** * 修改 * @param form * @return */ Result update(WorkStationScheduleForm form); /** * 批量删除 * @param ids * @return */ Result remove(List<String> ids); /** * id删除 * @param id * @return */ Result removeById(String id); /** * 分页查询 * @param query * @return */ Result page(WorkStationScheduleQuery query); /** * 根据id查找 * @param id * @return */ Result detail(Integer id); /** * 列表 * @return */ Result all(); Result completedAchievements(Integer id); Result countAchievements(); } business/src/main/java/com/ycl/service/impl/WorkStationScheduleServiceImpl.java
New file @@ -0,0 +1,192 @@ package com.ycl.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.ycl.common.enums.business.WorkStationEnum; import com.ycl.common.utils.SecurityUtils; import com.ycl.domain.entity.WorkStationSchedule; import com.ycl.factory.FlowServiceFactory; import com.ycl.mapper.WorkStationScheduleMapper; import com.ycl.service.WorkStationScheduleService; import com.ycl.common.base.Result; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ycl.domain.form.WorkStationScheduleForm; import com.ycl.domain.vo.WorkStationScheduleVO; import com.ycl.domain.query.WorkStationScheduleQuery; import org.flowable.task.api.history.HistoricTaskInstance; import org.flowable.task.api.history.HistoricTaskInstanceQuery; import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; import com.ycl.framework.utils.PageUtil; import org.springframework.beans.BeanUtils; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import java.util.HashMap; import java.util.List; import java.util.stream.Collectors; /** * 服务实现类 * * @author zxl * @since 2025-12-05 */ @Service @RequiredArgsConstructor public class WorkStationScheduleServiceImpl extends ServiceImpl<WorkStationScheduleMapper, WorkStationSchedule> implements WorkStationScheduleService { private final WorkStationScheduleMapper workStationScheduleMapper; private final FlowServiceFactory flowServiceFactory; /** * 添加 * @param form * @return */ @Override public Result add(WorkStationScheduleForm form) { WorkStationSchedule entity = WorkStationScheduleForm.getEntityByForm(form, null); baseMapper.insert(entity); return Result.ok("添加成功"); } /** * 修改 * @param form * @return */ @Override public Result update(WorkStationScheduleForm form) { WorkStationSchedule entity = baseMapper.selectById(form.getId()); // 为空抛IllegalArgumentException,做全局异常处理 Assert.notNull(entity, "记录不存在"); BeanUtils.copyProperties(form, entity); baseMapper.updateById(entity); return Result.ok("修改成功"); } /** * 批量删除 * @param ids * @return */ @Override public Result remove(List<String> ids) { baseMapper.deleteBatchIds(ids); return Result.ok("删除成功"); } /** * id删除 * @param id * @return */ @Override public Result removeById(String id) { baseMapper.deleteById(id); return Result.ok("删除成功"); } /** * 分页查询 * @param query * @return */ @Override public Result page(WorkStationScheduleQuery query) { IPage<WorkStationScheduleVO> page = PageUtil.getPage(query, WorkStationScheduleVO.class); baseMapper.getPage(page, query); return Result.ok().data(page.getRecords()).total(page.getTotal()); } /** * 根据id查找 * @param id * @return */ @Override public Result detail(Integer id) { WorkStationScheduleVO vo = baseMapper.getById(id); Assert.notNull(vo, "记录不存在"); return Result.ok().data(vo); } /** * 列表 * @return */ @Override public Result all() { List<WorkStationSchedule> entities = baseMapper.selectList(null); List<WorkStationScheduleVO> vos = entities.stream() .map(entity -> WorkStationScheduleVO.getVoByEntity(entity, null)) .collect(Collectors.toList()); return Result.ok().data(vos); } @Override public Result completedAchievements(Integer id) { WorkStationSchedule workStationSchedule = baseMapper.selectById(id); workStationSchedule.setStatus(WorkStationEnum.COMPLETED.name()); baseMapper.updateById(workStationSchedule); return Result.ok(); } @Override public Result countAchievements() { //获得个人已完成流程任务,并计算平均用时 Long userId = SecurityUtils.getUserId(); HistoricTaskInstanceQuery query = flowServiceFactory.getHistoryService() .createHistoricTaskInstanceQuery() .finished() .taskAssignee(userId.toString()) .orderByHistoricTaskInstanceEndTime() .desc(); List<HistoricTaskInstance> taskList = query.list(); long totalDuration = 0L; int taskCount = 0; if (!CollectionUtils.isEmpty(taskList)) { taskCount = taskList.size(); } for (HistoricTaskInstance task : taskList) { // 任务创建时间和完成时间 Long createTime = task.getCreateTime().getTime(); Long endTime = task.getEndTime().getTime(); // 单个任务耗时(毫秒) long duration = endTime - createTime; totalDuration += duration; } double avgDurationMs = (double) totalDuration / taskCount; // 平均耗时(毫秒) double avgDurationSec = avgDurationMs / 1000; // 转换为秒 double avgDurationMin = avgDurationSec / 60; // 转换为分钟 double avgDurationHour = avgDurationMin / 60; // 转换为分钟 System.out.println("用户完成任务总数:" + taskCount); System.out.println("平均耗时(秒):" + avgDurationSec); System.out.println("平均耗时(分钟):" + avgDurationMin); System.out.println("平均耗时(小时):" + avgDurationHour); //查询 日程总数 List<WorkStationSchedule> list = new LambdaQueryChainWrapper<>(baseMapper) .eq(WorkStationSchedule::getUserId, userId) .eq(WorkStationSchedule::getDeleted, Boolean.FALSE) .list(); int count = 0; for (WorkStationSchedule workStationSchedule : list) { if (WorkStationEnum.COMPLETED.name().equals(workStationSchedule.getStatus())){ count++; } } HashMap<String,Object> map = new HashMap<>(); map.put("totalDuration",totalDuration); map.put("avgDurationHour",avgDurationHour); map.put("scheduleCount",list.size()); map.put("completedCount",count); return Result.ok().data(map); } } business/src/main/resources/mapper/WorkStationScheduleMapper.xml
New file @@ -0,0 +1,44 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ycl.mapper.WorkStationScheduleMapper"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.ycl.domain.vo.WorkStationScheduleVO"> <result column="user_id" property="userId" /> <result column="content" property="content" /> <result column="status" property="status" /> <result column="gmtCreate" property="gmtcreate" /> <result column="gmtUpdate" property="gmtupdate" /> </resultMap> <select id="getById" resultMap="BaseResultMap"> SELECT TWSS.user_id, TWSS.content, TWSS.status, TWSS.gmtCreate, TWSS.gmtUpdate, TWSS.id FROM t_work_station_schedule TWSS WHERE TWSS.id = #{id} AND TWSS.deleted = 0 </select> <select id="getPage" resultMap="BaseResultMap"> SELECT TWSS.user_id, TWSS.content, TWSS.status, TWSS.gmtCreate, TWSS.gmtUpdate, TWSS.id FROM t_work_station_schedule TWSS WHERE TWSS.deleted = 0 </select> </mapper> common/src/main/java/com/ycl/common/enums/business/WorkStationEnum.java
New file @@ -0,0 +1,20 @@ package com.ycl.common.enums.business; /** * nongtou-project-java * * @author : zxl * @date : 2025-12-05 10:50 **/ public enum WorkStationEnum { COMPLETED("完成"), Incomplete("未完成"); private final String desc; private WorkStationEnum(String desc) { this.desc = desc; } }