zxl
2025-12-22 cc4a3ff932b1e768914a4aff0eeaa866d08f9b91
上报
3个文件已修改
10个文件已添加
669 ■■■■■ 已修改文件
business/src/main/java/com/ycl/controller/ReportController.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/domain/entity/Report.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/domain/form/ReportForm.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/domain/form/ReportReviewForm.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/domain/query/ReportQuery.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/domain/vo/DailyStatVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/domain/vo/ReportVO.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/mapper/ReportMapper.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/service/ReportService.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/service/impl/ReportServiceImpl.java 201 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/resources/mapper/ReportMapper.xml 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/resources/mapper/WorkStationScheduleMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
common/src/main/java/com/ycl/common/enums/business/ReportEnum.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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 &lt;= #{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;
    }
}