business/src/main/java/com/ycl/controller/ReportController.java
New file @@ -0,0 +1,91 @@ package com.ycl.controller; import com.ycl.common.group.Update; import com.ycl.common.group.Add; import com.ycl.domain.form.ReportReviewForm; import org.springframework.validation.annotation.Validated; import org.springframework.security.access.prepost.PreAuthorize; import lombok.RequiredArgsConstructor; import java.util.List; import org.springframework.validation.annotation.Validated; import javax.validation.constraints.NotEmpty; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import com.ycl.service.ReportService; import com.ycl.common.base.Result; import com.ycl.domain.form.ReportForm; import com.ycl.domain.query.ReportQuery; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; /** * 前端控制器 * * @author zxl * @since 2025-12-18 */ @Validated @RequiredArgsConstructor @Api(value = "", tags = "管理") @RestController @RequestMapping("/report") public class ReportController { private final ReportService reportService; @PostMapping @ApiOperation(value = "添加", notes = "添加") @PreAuthorize("@ss.hasPermi('report:add')") public Result add(@RequestBody @Validated(Add.class) ReportForm form) { return reportService.add(form); } @PutMapping @ApiOperation(value = "修改", notes = "修改") @PreAuthorize("@ss.hasPermi('report:edit')") public Result update(@RequestBody @Validated(Update.class) ReportForm form) { return reportService.update(form); } @DeleteMapping("/{id}") @ApiOperation(value = "ID删除", notes = "ID删除") public Result removeById(@PathVariable("id") String id) { return reportService.removeById(id); } @DeleteMapping("/batch") @ApiOperation(value = "批量删除", notes = "批量删除") @PreAuthorize("@ss.hasPermi('report:del:batch')") public Result remove(@RequestBody @NotEmpty(message = "请选择数据") List<String> ids) { return reportService.remove(ids); } @GetMapping("/listByMonth") @ApiOperation(value = "按年月返回日历以及对应数据", notes = "") public Result listByMonth(ReportQuery query) { return reportService.listByMonth(query); } @GetMapping("/page") public Result page(ReportQuery query){ return reportService.getPage(query); } @GetMapping("/{id}") @ApiOperation(value = "详情", notes = "详情") @PreAuthorize("@ss.hasPermi('report:detail')") public Result detail(@PathVariable("id") Integer id) { return reportService.detail(id); } @GetMapping("/list") @PreAuthorize("@ss.hasPermi('report:list')") @ApiOperation(value = "列表", notes = "列表") public Result list() { return reportService.all(); } @PutMapping("/review") public Result review(ReportReviewForm form) { return reportService.review(form); } } business/src/main/java/com/ycl/domain/entity/Report.java
New file @@ -0,0 +1,38 @@ package com.ycl.domain.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.ycl.system.domain.base.AbsEntity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; /** * nongtou-project-java * 上报 * * @author : zxl * @date : 2025-12-18 09:50 **/ @Data @NoArgsConstructor @AllArgsConstructor @TableName("t_report") public class Report extends AbsEntity { @TableField("content") private String content; @TableField("user_id") private Long userId; @TableField("project_id") private Long projectId; @TableField("project_name") private String projectName; @TableField("remake") private String remake; @TableField("file_url") private String fileUrl; @TableField("status") private String status; } business/src/main/java/com/ycl/domain/form/ReportForm.java
New file @@ -0,0 +1,45 @@ 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.Report; 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-18 */ @Data @ApiModel(value = "Report表单", description = "表单") public class ReportForm extends AbsForm { @NotBlank(message = "不能为空", groups = {Add.class, Update.class}) @ApiModelProperty("") private String content; @NotNull private String projectName; @NotNull(message = "不能为空", groups = {Add.class, Update.class}) @ApiModelProperty("") private Long projectId; private String[] fileUrl; public static Report getEntityByForm(@NonNull ReportForm form, Report entity) { if(entity == null) { entity = new Report(); } BeanUtils.copyProperties(form, entity); return entity; } } business/src/main/java/com/ycl/domain/form/ReportReviewForm.java
New file @@ -0,0 +1,29 @@ package com.ycl.domain.form; import com.ycl.system.domain.base.AbsForm; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; /** * nongtou-project-java * * @author : zxl * @date : 2025-12-22 14:25 **/ @Data @AllArgsConstructor @NoArgsConstructor public class ReportReviewForm extends AbsForm { /** * 驳回描述 可以为null */ private String remake; private Long id; private String status; } business/src/main/java/com/ycl/domain/query/ReportQuery.java
New file @@ -0,0 +1,44 @@ package com.ycl.domain.query; import com.ycl.system.domain.base.AbsQuery; import java.util.Date; import java.util.List; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.lang.NonNull; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * 查询 * * @author zxl * @since 2025-12-18 */ @Data @ApiModel(value = "Report查询参数", description = "查询参数") public class ReportQuery extends AbsQuery { /** * 项目id all查询全部(属于当前用户的项目) */ private String projectId; private List<Long> projectIds; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date startTime; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date endTime; private String projectName; private String status; } business/src/main/java/com/ycl/domain/vo/DailyStatVO.java
@@ -24,4 +24,7 @@ private Date completedTime; private Integer projectId; private String[] fileUrl; private String status; } business/src/main/java/com/ycl/domain/vo/ReportVO.java
New file @@ -0,0 +1,55 @@ package com.ycl.domain.vo; import com.ycl.system.domain.base.AbsVo; import com.ycl.domain.entity.Report; import java.util.List; 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-18 */ @Data @ApiModel(value = "响应数据", description = "响应数据") public class ReportVO extends AbsVo { /** */ @ApiModelProperty("") private String content; private String status; private String fileUrl; private String[] fileUrlArray; /** */ @ApiModelProperty("") private Long projectId; private String remake; /** */ @ApiModelProperty("") private String projectName; /** */ @ApiModelProperty("") private Long userId; private String userName; public static ReportVO getVoByEntity(@NonNull Report entity, ReportVO vo) { if(vo == null) { vo = new ReportVO(); } BeanUtils.copyProperties(entity, vo); return vo; } } business/src/main/java/com/ycl/mapper/ReportMapper.java
New file @@ -0,0 +1,43 @@ package com.ycl.mapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.ycl.domain.entity.Report; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ycl.domain.query.ReportQuery; import com.ycl.domain.query.WorkStationScheduleQuery; import com.ycl.domain.vo.ReportVO; import java.util.Date; import java.util.List; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; /** * Mapper 接口 * * @author zxl * @since 2025-12-18 */ @Mapper public interface ReportMapper extends BaseMapper<Report> { /** * id查找 * @param id * @return */ ReportVO getById(Integer id); /** * 分页 */ IPage getPage(IPage page, @Param("query") ReportQuery query); /** * 按月查询每日上报列表 */ List<ReportVO> groupByProjectAndDate( @Param("userId") Long userId, @Param("projectId") Integer projectId, @Param("startTime") Date startTime, @Param("endTime") Date endTime); } business/src/main/java/com/ycl/service/ReportService.java
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.ycl.common.base.Result; import com.ycl.domain.form.ReportForm; import com.ycl.domain.form.ReportReviewForm; import com.ycl.domain.query.ReportQuery; import java.util.List; @@ -48,8 +49,9 @@ * @param query * @return */ Result page(ReportQuery query); Result listByMonth(ReportQuery query); Result getPage(ReportQuery query); /** * 根据id查找 * @param id @@ -62,4 +64,6 @@ * @return */ Result all(); Result review(ReportReviewForm form); } business/src/main/java/com/ycl/service/impl/ReportServiceImpl.java
New file @@ -0,0 +1,201 @@ package com.ycl.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; import com.ycl.common.enums.business.ReportEnum; import com.ycl.common.utils.DateUtils; import com.ycl.common.utils.SecurityUtils; import com.ycl.common.utils.StringUtils; import com.ycl.domain.entity.ProjectInfo; import com.ycl.domain.entity.Report; import com.ycl.domain.form.ReportReviewForm; import com.ycl.domain.vo.DailyStatVO; import com.ycl.domain.vo.WorkStationScheduleVO; import com.ycl.mapper.ReportMapper; import com.ycl.service.IndexHomeService; import com.ycl.service.ReportService; import com.ycl.common.base.Result; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ycl.domain.form.ReportForm; import com.ycl.domain.vo.ReportVO; import com.ycl.domain.query.ReportQuery; import net.sf.jsqlparser.expression.StringValue; 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.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * 服务实现类 * * @author zxl * @since 2025-12-18 */ @Service @RequiredArgsConstructor public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> implements ReportService { private final ReportMapper reportMapper; private final IndexHomeService indexHomeService; /** * 添加 * @param form * @return */ @Override public Result add(ReportForm form) { Report entity = ReportForm.getEntityByForm(form, null); entity.setUserId(SecurityUtils.getUserId()); entity.setStatus(ReportEnum.PendingReview.name()); // 转换fileUrl for (String a: form.getFileUrl()){ System.out.println(a); } if (form.getFileUrl() != null && form.getFileUrl().length != 0) { entity.setFileUrl(Arrays.stream(form.getFileUrl()) .filter(str -> str != null && !str.isBlank()) // 剔除null和空白元素 .collect(Collectors.joining(","))); } baseMapper.insert(entity); return Result.ok("添加成功"); } @Override public Result getPage(ReportQuery query) { IPage<ReportVO> page = PageUtil.getPage(query, ReportVO.class); baseMapper.getPage(page, query); for (ReportVO vo : page.getRecords()) { if (StringUtils.isNotBlank(vo.getFileUrl())) { String[] fileUrlArray = vo.getFileUrl().split(","); vo.setFileUrlArray(fileUrlArray); } } return Result.ok().data(page.getRecords()).total(page.getTotal()); } /** * 修改 * @param form * @return */ @Override public Result update(ReportForm form) { Report 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 listByMonth(ReportQuery query) { Integer projectId = null; if (!"all".equals(query.getProjectId())) { projectId = Integer.valueOf(query.getProjectId()); } Long userId = SecurityUtils.getUserId(); List<ReportVO> list = baseMapper.groupByProjectAndDate(userId,projectId, query.getStartTime(),query.getEndTime()); List<DailyStatVO> dailyStatVOList = new ArrayList<>(); for (ReportVO vo : list) { if (vo == null) { continue; } DailyStatVO statVO = new DailyStatVO(); statVO.setId(vo.getId() == null ? -1 : vo.getId()); statVO.setTitle(StringUtils.isBlank(vo.getContent()) ? "无内容" : vo.getContent()); Map<String, String> stringTimeMap = DateUtils.splitDateToDateAndTime(vo.getGmtCreate()); String date = StringUtils.defaultIfBlank(stringTimeMap.get("date"), ""); String time = StringUtils.defaultIfBlank(stringTimeMap.get("time"), ""); statVO.setDate(date); statVO.setTime(time); statVO.setProject(StringUtils.isBlank(vo.getProjectName()) ? "未关联项目" : vo.getProjectName()); statVO.setProjectId(Integer.parseInt(vo.getProjectId()+"")); statVO.setCompletedTime(vo.getGmtCreate()); statVO.setStatus(vo.getStatus()); if (StringUtils.isNotBlank(vo.getFileUrl())) { statVO.setFileUrl(vo.getFileUrl().split(",")); } dailyStatVOList.add(statVO); } return Result.ok().data(dailyStatVOList); } /** * 根据id查找 * @param id * @return */ @Override public Result detail(Integer id) { ReportVO vo = baseMapper.getById(id); Assert.notNull(vo, "记录不存在"); return Result.ok().data(vo); } /** * 列表 * @return */ @Override public Result all() { List<Report> entities = baseMapper.selectList(null); List<ReportVO> vos = entities.stream() .map(entity -> ReportVO.getVoByEntity(entity, null)) .collect(Collectors.toList()); return Result.ok().data(vos); } @Override public Result review(ReportReviewForm form) { Report report = baseMapper.selectById(form.getId()); report.setStatus(form.getStatus()); report.setRemake(form.getRemake()); baseMapper.updateById(report); return Result.ok("操作成功"); } } business/src/main/resources/mapper/ReportMapper.xml
New file @@ -0,0 +1,88 @@ <?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.ReportMapper"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.ycl.domain.vo.ReportVO"> <result column="content" property="content" /> <result column="project_id" property="projectId" /> <result column="project_name" property="projectName" /> <result column="user_id" property="userId" /> <result column="file_url" property="fileUrl"/> <result column="user_name" property="userName"/> <result column="status" property="status"/> <result column="remake" property="remake"/> </resultMap> <select id="getById" resultMap="BaseResultMap"> SELECT TR.content, TR.project_id, TR.project_name, TR.user_id, TR.id FROM t_report TR WHERE TR.id = #{id} AND TR.deleted = 0 </select> <select id="getPage" resultMap="BaseResultMap"> SELECT TR.user_id, TR.content, TR.status, TR.file_url, TR.project_id, TR.project_name, TR.gmt_create, TR.gmt_update, SU.user_name, TR.remake, TR.id FROM t_report TR LEFT JOIN sys_user SU on TR.user_id = SU.user_id WHERE TR.deleted = 0 <if test="query.projectName !=null and query.projectName !=''"> and TR.project_name like concat('%', #{query.projectName}, '%') </if> <if test="query.startTime != null"> and TR.gmt_create >= #{query.startTime} </if> <if test="query.endTime != null"> and TR.gmt_create <= #{query.startTime} </if> <if test="query.status != null and query.status !=''"> and TR.status = #{query.status} </if> order by TR.gmt_create desc </select> <select id="groupByProjectAndDate" resultMap="BaseResultMap"> SELECT TR.content, TR.project_id, TR.project_name, TR.user_id, TR.id, TR.gmt_create, TR.file_url, TR.status FROM t_report TR LEFT JOIN t_project_info TPI on TR.project_id = TPI.id WHERE TR.deleted = 0 AND TR.gmt_create BETWEEN #{startTime} AND #{endTime} <if test="projectId != null"> AND TR.project_id = #{projectId} </if> </select> </mapper> business/src/main/resources/mapper/WorkStationScheduleMapper.xml
@@ -32,8 +32,8 @@ TWSS.user_id, TWSS.content, TWSS.status, TWSS.gmtCreate, TWSS.gmtUpdate, TWSS.gmt_create, TWSS.gmt_update, TWSS.id FROM t_work_station_schedule TWSS common/src/main/java/com/ycl/common/enums/business/ReportEnum.java
New file @@ -0,0 +1,22 @@ package com.ycl.common.enums.business; /** * nongtou-project-java * * @author : zxl * @date : 2025-12-19 14:25 **/ public enum ReportEnum { Approved("通过"), Reject("驳回"), PendingReview("待审核"); private String desc; ReportEnum(String desc) { this.desc = desc; } }