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