From 1f86ea3a7e0d8ff10b5907dc3f85aafaa2ebd2f0 Mon Sep 17 00:00:00 2001 From: gongzuming <gongzuming> Date: 星期四, 22 八月 2024 17:43:07 +0800 Subject: [PATCH] 投诉反馈 --- src/main/resources/mapper/content/FeedbackMapper.xml | 45 +++++++ src/main/java/com/mzl/flower/mapper/content/FeedbackMapper.java | 17 ++ src/main/java/com/mzl/flower/dto/request/content/ReplyFeedbackDTO.java | 19 +++ src/main/java/com/mzl/flower/entity/content/Feedback.java | 30 +++++ src/main/java/com/mzl/flower/dto/response/content/FeedbackDTO.java | 37 ++++++ src/main/java/com/mzl/flower/service/content/FeedbackService.java | 72 ++++++++++++ src/main/java/com/mzl/flower/dto/request/content/QueryFeedBackDTO.java | 39 ++++++ src/main/java/com/mzl/flower/web/content/FeedbackController.java | 70 +++++++++++ src/main/java/com/mzl/flower/dto/request/content/AddFeedbackDTO.java | 10 + 9 files changed, 339 insertions(+), 0 deletions(-) diff --git a/src/main/java/com/mzl/flower/dto/request/content/AddFeedbackDTO.java b/src/main/java/com/mzl/flower/dto/request/content/AddFeedbackDTO.java new file mode 100644 index 0000000..12d323c --- /dev/null +++ b/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; +} diff --git a/src/main/java/com/mzl/flower/dto/request/content/QueryFeedBackDTO.java b/src/main/java/com/mzl/flower/dto/request/content/QueryFeedBackDTO.java new file mode 100644 index 0000000..049757a --- /dev/null +++ b/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; + +} diff --git a/src/main/java/com/mzl/flower/dto/request/content/ReplyFeedbackDTO.java b/src/main/java/com/mzl/flower/dto/request/content/ReplyFeedbackDTO.java new file mode 100644 index 0000000..9ae0c13 --- /dev/null +++ b/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; + +} diff --git a/src/main/java/com/mzl/flower/dto/response/content/FeedbackDTO.java b/src/main/java/com/mzl/flower/dto/response/content/FeedbackDTO.java new file mode 100644 index 0000000..0a6b4bb --- /dev/null +++ b/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; +} diff --git a/src/main/java/com/mzl/flower/entity/content/Feedback.java b/src/main/java/com/mzl/flower/entity/content/Feedback.java new file mode 100644 index 0000000..17f5198 --- /dev/null +++ b/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; + +} diff --git a/src/main/java/com/mzl/flower/mapper/content/FeedbackMapper.java b/src/main/java/com/mzl/flower/mapper/content/FeedbackMapper.java new file mode 100644 index 0000000..9e5d1fc --- /dev/null +++ b/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); +} diff --git a/src/main/java/com/mzl/flower/service/content/FeedbackService.java b/src/main/java/com/mzl/flower/service/content/FeedbackService.java new file mode 100644 index 0000000..039d928 --- /dev/null +++ b/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); + } +} diff --git a/src/main/java/com/mzl/flower/web/content/FeedbackController.java b/src/main/java/com/mzl/flower/web/content/FeedbackController.java new file mode 100644 index 0000000..cc45f82 --- /dev/null +++ b/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); + } + +} diff --git a/src/main/resources/mapper/content/FeedbackMapper.xml b/src/main/resources/mapper/content/FeedbackMapper.xml new file mode 100644 index 0000000..fa3f95c --- /dev/null +++ b/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> \ No newline at end of file -- Gitblit v1.9.3