gongzuming
2024-08-22 1f86ea3a7e0d8ff10b5907dc3f85aafaa2ebd2f0
投诉反馈
已添加9个文件
339 ■■■■■ 文件已修改
src/main/java/com/mzl/flower/dto/request/content/AddFeedbackDTO.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/dto/request/content/QueryFeedBackDTO.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/dto/request/content/ReplyFeedbackDTO.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/dto/response/content/FeedbackDTO.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/entity/content/Feedback.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/mapper/content/FeedbackMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/service/content/FeedbackService.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/web/content/FeedbackController.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/content/FeedbackMapper.xml 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/dto/request/content/AddFeedbackDTO.java
对比新文件
@@ -0,0 +1,10 @@
package com.mzl.flower.dto.request.content;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class AddFeedbackDTO {
    @ApiModelProperty("投诉反馈内容")
    private String feedBack;
}
src/main/java/com/mzl/flower/dto/request/content/QueryFeedBackDTO.java
对比新文件
@@ -0,0 +1,39 @@
package com.mzl.flower.dto.request.content;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class QueryFeedBackDTO {
    @ApiModelProperty("是否处理")
    private Boolean handled;
    @ApiModelProperty("商户名称")
    private String name;
    @ApiModelProperty("商户电话")
    private String tel;
    @ApiModelProperty("创建日期(yyyy-mm-dd)")
    private String createDateBeginStr;
    @ApiModelProperty("创建日期(yyyy-mm-dd)")
    private String createDateEndStr;
    @ApiModelProperty(value = "创建日期(yyyy-mm-dd)",hidden = true)
    private LocalDateTime createDateBegin;
    @ApiModelProperty(value = "创建日期(yyyy-mm-dd)", hidden = true)
    private LocalDateTime createDateEnd;
    @ApiModelProperty(value = "用户ID",hidden = true)
    private String userId;
    @ApiModelProperty(value = "ID",hidden = true)
    private Long id;
}
src/main/java/com/mzl/flower/dto/request/content/ReplyFeedbackDTO.java
对比新文件
@@ -0,0 +1,19 @@
package com.mzl.flower.dto.request.content;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Data
public class ReplyFeedbackDTO {
    @NotNull(message = "id不能为空")
    private Long id;
    @ApiModelProperty("回复内容")
    @NotBlank(message = "回复内容不能为空")
    private String reply;
}
src/main/java/com/mzl/flower/dto/response/content/FeedbackDTO.java
对比新文件
@@ -0,0 +1,37 @@
package com.mzl.flower.dto.response.content;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class FeedbackDTO {
    private Long id;
    @ApiModelProperty("用户ID")
    private String userId;
    @ApiModelProperty("投诉反馈内容")
    private String feedBack;
    @ApiModelProperty("回复内容")
    private String reply;
    @ApiModelProperty("是否处理")
    private Boolean handled;
    @ApiModelProperty("回复时间")
    private LocalDateTime replyTime;
    @ApiModelProperty("提交时间")
    private LocalDateTime createTime;
    @ApiModelProperty("用户姓名")
    private String customerName;
    @ApiModelProperty("用户电话")
    private String customerTel;
}
src/main/java/com/mzl/flower/entity/content/Feedback.java
对比新文件
@@ -0,0 +1,30 @@
package com.mzl.flower.entity.content;
import com.baomidou.mybatisplus.annotation.TableName;
import com.mzl.flower.base.BaseAutoEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@TableName("t_feedback")
public class Feedback extends BaseAutoEntity {
    @ApiModelProperty("用户ID")
    private String userId;
    @ApiModelProperty("投诉反馈内容")
    private String feedBack;
    @ApiModelProperty("回复内容")
    private String reply;
    @ApiModelProperty("是否处理")
    private Boolean handled;
    @ApiModelProperty("回复时间")
    private LocalDateTime replyTime;
}
src/main/java/com/mzl/flower/mapper/content/FeedbackMapper.java
对比新文件
@@ -0,0 +1,17 @@
package com.mzl.flower.mapper.content;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mzl.flower.dto.request.content.QueryFeedBackDTO;
import com.mzl.flower.dto.response.content.FeedbackDTO;
import com.mzl.flower.entity.content.Feedback;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface FeedbackMapper extends BaseMapper<Feedback> {
    List<FeedbackDTO> queryPage(@Param("dto") QueryFeedBackDTO dto, Page page);
}
src/main/java/com/mzl/flower/service/content/FeedbackService.java
对比新文件
@@ -0,0 +1,72 @@
package com.mzl.flower.service.content;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mzl.flower.config.exception.ValidationException;
import com.mzl.flower.config.security.SecurityUtils;
import com.mzl.flower.dto.request.content.AddFeedbackDTO;
import com.mzl.flower.dto.request.content.QueryFeedBackDTO;
import com.mzl.flower.dto.request.content.ReplyFeedbackDTO;
import com.mzl.flower.dto.response.content.FeedbackDTO;
import com.mzl.flower.entity.content.Feedback;
import com.mzl.flower.mapper.content.FeedbackMapper;
import com.mzl.flower.utils.DateUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.List;
@Service
@Transactional
public class FeedbackService {
    private final FeedbackMapper feedbackMapper;
    public FeedbackService(FeedbackMapper feedbackMapper) {
        this.feedbackMapper = feedbackMapper;
    }
    public void add(AddFeedbackDTO dto) {
        Feedback feedback = new Feedback();
        feedback.setFeedBack(dto.getFeedBack());
        feedback.setUserId(SecurityUtils.getUserId());
        feedback.setHandled(false);
        feedback.create(SecurityUtils.getUserId());
        feedbackMapper.insert(feedback);
    }
    public Page<FeedbackDTO> queryPage(QueryFeedBackDTO dto, Page page) {
        if(StringUtils.isNotBlank(dto.getCreateDateBeginStr())){
            dto.setCreateDateBegin(DateUtils.dateToLocalDateTime(dto.getCreateDateBeginStr(),true));
        }
        if(StringUtils.isNotBlank(dto.getCreateDateEndStr())){
            dto.setCreateDateEnd(DateUtils.dateToLocalDateTime(dto.getCreateDateEndStr(),false));
        }
        List<FeedbackDTO> list = feedbackMapper.queryPage(dto, page);
        page.setRecords(list);
        return page;
    }
    public FeedbackDTO detail(Long id) {
        QueryFeedBackDTO dto = new QueryFeedBackDTO();
        dto.setId(id);
        List<FeedbackDTO> list = feedbackMapper.queryPage(dto, new Page(1,1));
        if(list != null && list.size() > 0){
            return list.get(0);
        }
        return null;
    }
    public void reply(ReplyFeedbackDTO dto) {
        Feedback feedback = feedbackMapper.selectById(dto.getId());
        if(feedback == null){
            throw new ValidationException("投诉反馈不存在");
        }
        feedback.setReply(dto.getReply());
        feedback.setHandled(true);
        feedback.setReplyTime(LocalDateTime.now());
        feedbackMapper.updateById(feedback);
    }
}
src/main/java/com/mzl/flower/web/content/FeedbackController.java
对比新文件
@@ -0,0 +1,70 @@
package com.mzl.flower.web.content;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mzl.flower.base.BaseController;
import com.mzl.flower.base.R;
import com.mzl.flower.base.ReturnDataDTO;
import com.mzl.flower.config.security.SecurityUtils;
import com.mzl.flower.dto.request.content.AddFeedbackDTO;
import com.mzl.flower.dto.request.content.QueryFeedBackDTO;
import com.mzl.flower.dto.request.content.ReplyFeedbackDTO;
import com.mzl.flower.dto.response.content.FeedbackDTO;
import com.mzl.flower.service.content.FeedbackService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotNull;
@RestController
@RequestMapping("/api/feedback")
@Api(value = "运营-banner管理", tags = "运营-banner管理")
@Validated
@Slf4j
public class FeedbackController extends BaseController {
    private final FeedbackService feedbackService;
    public FeedbackController(FeedbackService feedbackService) {
        this.feedbackService = feedbackService;
    }
    @PostMapping("/page/new")
    @ApiOperation(value = "用户提交投诉反馈", notes = "提交投诉反馈")
    public ResponseEntity<ReturnDataDTO> add(@Validated @RequestBody AddFeedbackDTO dto) {
        feedbackService.add(dto);
        return returnData(R.SUCCESS.getCode(),null);
    }
    @GetMapping("/my/feedback/list")
    @ApiOperation(value = "用户查询我的投诉反馈", notes = "用户查询我的投诉反馈")
    public ResponseEntity<ReturnDataDTO<Page<FeedbackDTO>>> queryMyPage(Page page) {
        QueryFeedBackDTO dto = new QueryFeedBackDTO();
        dto.setUserId(SecurityUtils.getUserId());
        return returnData(R.SUCCESS.getCode(), feedbackService.queryPage(dto,page));
    }
    @GetMapping("/page/view")
    @ApiOperation(value = "详情", notes = "详情")
    public ResponseEntity<ReturnDataDTO<FeedbackDTO>> detail(@NotNull(message = "id不能为空") Long id) {
        return returnData(R.SUCCESS.getCode(),feedbackService.detail(id));
    }
    @GetMapping("/page")
    @ApiOperation(value = "运营查询-分页", notes = "查询-分页")
    public ResponseEntity<ReturnDataDTO<Page<FeedbackDTO>>> queryPage(QueryFeedBackDTO dto, Page page) {
        return returnData(R.SUCCESS.getCode(), feedbackService.queryPage(dto,page));
    }
    @PostMapping("/page/reply")
    @ApiOperation(value = "运营回复投诉反馈", notes = "运营回复投诉反馈")
    public ResponseEntity<ReturnDataDTO> reply(@Validated @RequestBody ReplyFeedbackDTO dto)  {
        feedbackService.reply(dto);
        return returnData(R.SUCCESS.getCode(), null);
    }
}
src/main/resources/mapper/content/FeedbackMapper.xml
对比新文件
@@ -0,0 +1,45 @@
<?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.mzl.flower.mapper.content.FeedbackMapper">
    <select id="queryPage" resultType="com.mzl.flower.dto.response.content.FeedbackDTO">
        SELECT
        f.*,
        c.`name` AS customerName,
        u.tel AS customerTel
        FROM
        t_feedback f
        LEFT JOIN t_user u ON f.user_id = u.id
        LEFT JOIN t_customer_info c ON f.user_id = c.user_id
        WHERE
        f.deleted = 0
        <if test="dto.id != null and dto.name != 0">
            and f.id = #{dto.id}
        </if>
        <if test="dto.name != null and dto.name != ''">
            and c.name like concat('%', #{dto.name}, '%')
        </if>
        <if test="dto.tel != null and dto.tel != ''">
            and u.tel like concat('%', #{dto.tel}, '%')
        </if>
        <if test="dto.handled != null and dto.handled">
            and f.handled = 1
        </if>
        <if test="dto.handled != null and !dto.handled">
            and f.handled = 0
        </if>
        <if test="dto.userId != null and dto.userId != ''">
            and f.user_id = #{dto.userId}
        </if>
        <if test="dto.createDateBegin!=null ">
            <![CDATA[
               AND t.create_time >= #{dto.createDateBegin}
            ]]>
        </if>
        <if test="dto.createDateEnd!=null ">
            <![CDATA[
               AND t.create_time <= #{dto.createDateEnd}
            ]]>
        </if>
        order by t.create_time desc
    </select>
</mapper>