xdd пре 3 недеља
родитељ
комит
fd7008ba4c

+ 106 - 0
fs-admin/src/main/java/com/fs/his/controller/FsComplaintCategoryController.java

@@ -0,0 +1,106 @@
+package com.fs.his.controller;
+
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.R;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
+import com.fs.complaint.domain.FsComplaintCategory;
+import com.fs.complaint.mapper.FsComplaintCategoryMapper;
+import com.fs.complaint.param.FsComplaintCategoryParam;
+import com.fs.complaint.service.FsComplaintCategoryService;
+import com.fs.complaint.vo.FsComplaintCategoryListVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@Slf4j
+@Api("投诉接口")
+@RestController
+@RequestMapping(value="/complaint")
+public class FsComplaintCategoryController extends BaseController {
+
+    @Autowired
+    private FsComplaintCategoryMapper fsComplaintCategoryMapper;
+
+    @Autowired
+    private FsComplaintCategoryService fsComplaintCategoryService;
+
+
+    /**
+     * 查询投诉分类列表
+     */
+    @ApiOperation("查询投诉分类列表")
+    @PreAuthorize("@ss.hasPermi('complaint:category:list')")
+    @GetMapping("/category/list")
+    public TableDataInfo list(FsComplaintCategoryParam param)
+    {
+        startPage();
+        List<FsComplaintCategoryListVO> list = fsComplaintCategoryMapper.selectFsComplaintCategoryListVO(param);
+        return getDataTable(list);
+    }
+    /**
+     * 根据ID查询投诉分类详情
+     */
+    @ApiOperation("查询投诉分类详情")
+    @PreAuthorize("@ss.hasPermi('complaint:category:query')")
+    @GetMapping("/category/{id}")
+    public R getInfo(@PathVariable("id") Long id)
+    {
+        return R.ok().put("data",fsComplaintCategoryService.selectFsComplaintCategoryById(id));
+    }
+
+    /**
+     * 新增投诉分类
+     */
+    @ApiOperation("新增投诉分类")
+    @PreAuthorize("@ss.hasPermi('complaint:category:add')")
+    @Log(title = "投诉分类", businessType = BusinessType.INSERT)
+    @PostMapping("/category")
+    public R add(@RequestBody FsComplaintCategory fsComplaintCategory)
+    {
+        fsComplaintCategoryService.insertFsComplaintCategory(fsComplaintCategory);
+        return R.ok();
+    }
+    @ApiOperation("修改投诉分类")
+    @PreAuthorize("@ss.hasPermi('complaint:category:edit')")
+    @Log(title = "投诉分类", businessType = BusinessType.UPDATE)
+    @PutMapping("/category")
+    public R edit(@RequestBody FsComplaintCategory fsComplaintCategory)
+    {
+        log.info("修改投诉分类 参数:{}",fsComplaintCategory);
+        fsComplaintCategoryService.updateFsComplaintCategory(fsComplaintCategory);
+        return R.ok();
+    }
+    /**
+     * 删除投诉分类
+     */
+    @ApiOperation("删除投诉分类")
+    @PreAuthorize("@ss.hasPermi('complaint:category:remove')")
+    @Log(title = "投诉分类", businessType = BusinessType.DELETE)
+    @DeleteMapping("/category/{ids}")
+    public R remove(@PathVariable Long[] ids)
+    {
+        fsComplaintCategoryService.deleteFsComplaintCategoryByIds(ids);
+        return R.ok();
+    }
+    /**
+     * 修改投诉分类状态
+     */
+    @ApiOperation("修改投诉分类状态")
+    @PreAuthorize("@ss.hasPermi('complaint:category:edit')")
+    @Log(title = "投诉分类状态", businessType = BusinessType.UPDATE)
+    @PutMapping("/category/status")
+    public R changeStatus(@RequestBody FsComplaintCategory fsComplaintCategory)
+    {
+        log.info("投诉分类状态 参数:{}",fsComplaintCategory);
+        fsComplaintCategoryService.updateFsComplaintCategoryStatus(fsComplaintCategory);
+        return R.ok();
+    }
+
+}

+ 47 - 60
fs-admin/src/main/java/com/fs/his/controller/FsComplaintController.java

@@ -5,12 +5,17 @@ import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
+import com.fs.complaint.domain.FsComplaint;
 import com.fs.complaint.domain.FsComplaintCategory;
+import com.fs.complaint.dto.ComplaintQueryDTO;
 import com.fs.complaint.dto.SubmitComplaintDTO;
+import com.fs.complaint.dto.UpdateComplaintDTO;
 import com.fs.complaint.mapper.FsComplaintCategoryMapper;
+import com.fs.complaint.mapper.FsComplaintMapper;
 import com.fs.complaint.param.FsComplaintCategoryParam;
 import com.fs.complaint.service.FsComplaintCategoryService;
 import com.fs.complaint.service.FsComplaintService;
+import com.fs.complaint.vo.ComplaintVO;
 import com.fs.complaint.vo.FsComplaintCategoryListVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -18,7 +23,9 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
+import shade.kotlin.Result;
 
+import javax.validation.Valid;
 import java.util.List;
 
 @Slf4j
@@ -28,78 +35,58 @@ import java.util.List;
 public class FsComplaintController extends BaseController {
 
     @Autowired
-    private FsComplaintCategoryMapper fsComplaintCategoryMapper;
-
+    private FsComplaintService fsComplaintService;
     @Autowired
     private FsComplaintCategoryService fsComplaintCategoryService;
 
-
-    /**
-     * 查询投诉分类列表
-     */
-    @ApiOperation("查询投诉分类列表")
-    @PreAuthorize("@ss.hasPermi('complaint:category:list')")
-    @GetMapping("/category/list")
-    public TableDataInfo list(FsComplaintCategoryParam param)
-    {
-        startPage();
-        List<FsComplaintCategoryListVO> list = fsComplaintCategoryMapper.selectFsComplaintCategoryListVO(param);
-        return getDataTable(list);
-    }
     /**
-     * 根据ID查询投诉分类详情
+     * 查询所有投诉分类
+     * @return R
      */
-    @ApiOperation("查询投诉分类详情")
-    @PreAuthorize("@ss.hasPermi('complaint:category:query')")
-    @GetMapping("/category/{id}")
-    public R getInfo(@PathVariable("id") Long id)
-    {
-        return R.ok().put("data",fsComplaintCategoryService.selectFsComplaintCategoryById(id));
+    @PostMapping("/queryAllCategory")
+    public R queryAllCategory(){
+        List<FsComplaintCategory> categoryList = fsComplaintCategoryService.queryAllCategory();
+        return R.ok().put("data",categoryList);
     }
 
-    /**
-     * 新增投诉分类
-     */
-    @ApiOperation("新增投诉分类")
-    @PreAuthorize("@ss.hasPermi('complaint:category:add')")
-    @Log(title = "投诉分类", businessType = BusinessType.INSERT)
-    @PostMapping("/category")
-    public R add(@RequestBody FsComplaintCategory fsComplaintCategory)
-    {
-        fsComplaintCategoryService.insertFsComplaintCategory(fsComplaintCategory);
+    @ApiOperation("提交投诉")
+    @PostMapping
+    public R submitComplaint(@Valid @RequestBody SubmitComplaintDTO dto) {
+        fsComplaintService.submitComplaint(dto);
         return R.ok();
     }
-    @ApiOperation("修改投诉分类")
-    @PreAuthorize("@ss.hasPermi('complaint:category:edit')")
-    @Log(title = "投诉分类", businessType = BusinessType.UPDATE)
-    @PutMapping("/category")
-    public R edit(@RequestBody FsComplaintCategory fsComplaintCategory)
-    {
-        fsComplaintCategoryService.updateFsComplaintCategory(fsComplaintCategory);
-        return R.ok();
+
+    @ApiOperation("根据ID查询投诉详情")
+    @GetMapping("/{id}")
+    public R getComplaintById(@PathVariable Long id) {
+        ComplaintVO complaintVO = fsComplaintService.getComplaintById(id);
+        return R.ok().put("data", complaintVO);
     }
-    /**
-     * 删除投诉分类
-     */
-    @ApiOperation("删除投诉分类")
-    @PreAuthorize("@ss.hasPermi('complaint:category:remove')")
-    @Log(title = "投诉分类", businessType = BusinessType.DELETE)
-    @DeleteMapping("/category/{ids}")
-    public R remove(@PathVariable Long[] ids)
-    {
-        fsComplaintCategoryService.deleteFsComplaintCategoryByIds(ids);
+    @ApiOperation("根据投诉单号查询投诉详情")
+    @GetMapping("/no/{complaintNo}")
+    public R getComplaintByNo(@PathVariable String complaintNo) {
+        ComplaintVO complaintVO = fsComplaintService.getComplaintByNo(complaintNo);
+        return R.ok().put("data", complaintVO);
+    }
+    @ApiOperation("分页查询投诉列表")
+    @PostMapping("/list")
+    public TableDataInfo getComplaintPage(@RequestBody ComplaintQueryDTO queryDTO) {
+        startPage();
+
+        List<FsComplaint> result = fsComplaintService.getComplaintPage(queryDTO);
+
+        return getDataTable(result);
+    }
+    @ApiOperation("更新投诉信息")
+    @PutMapping("/{id}")
+    public R updateComplaint(@PathVariable Long id, @Valid @RequestBody UpdateComplaintDTO dto) {
+        fsComplaintService.updateComplaint(id, dto);
         return R.ok();
     }
-    /**
-     * 修改投诉分类状态
-     */
-    @ApiOperation("修改投诉分类状态")
-    @PreAuthorize("@ss.hasPermi('complaint:category:edit')")
-    @Log(title = "投诉分类状态", businessType = BusinessType.UPDATE)
-    @PutMapping("/category/status")
-    public R changeStatus(@RequestBody FsComplaintCategory fsComplaintCategory)
-    {
-        fsComplaintCategoryService.updateFsComplaintCategoryStatus(fsComplaintCategory);
+    @ApiOperation("删除投诉")
+    @DeleteMapping("/{id}")
+    public R deleteComplaint(@PathVariable Long id) {
+        fsComplaintService.deleteComplaint(id);
         return R.ok();
     }
 

+ 2 - 1
fs-service/src/main/java/com/fs/complaint/domain/FsComplaintCategory.java

@@ -4,6 +4,7 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serializable;
 import java.time.LocalDateTime;
 
 /**
@@ -12,7 +13,7 @@ import java.time.LocalDateTime;
 @Data
 @AllArgsConstructor
 @NoArgsConstructor
-public class FsComplaintCategory {
+public class FsComplaintCategory implements Serializable {
 
     /**
      * 主键ID

+ 19 - 0
fs-service/src/main/java/com/fs/complaint/dto/ComplaintQueryDTO.java

@@ -0,0 +1,19 @@
+package com.fs.complaint.dto;
+
+import lombok.Data;
+
+/**
+ * 投诉查询条件参数
+ */
+@Data
+public class ComplaintQueryDTO {
+
+    private String complaintNo;
+    private Long categoryId;
+    private Integer status;
+    private String contactPhone;
+    private String startTime;
+    private String endTime;
+    private Integer pageNum = 1;
+    private Integer pageSize = 10;
+}

+ 16 - 0
fs-service/src/main/java/com/fs/complaint/dto/UpdateComplaintDTO.java

@@ -0,0 +1,16 @@
+package com.fs.complaint.dto;
+
+import lombok.Data;
+
+/**
+ * 更新投诉请求参数
+ */
+@Data
+public class UpdateComplaintDTO {
+
+    private Long categoryId;
+    private String content;
+    private String contactPhone;
+    private String contactEmail;
+    private Integer status;
+}

+ 2 - 2
fs-service/src/main/java/com/fs/complaint/mapper/FsComplaintCategoryMapper.java

@@ -28,7 +28,7 @@ public interface FsComplaintCategoryMapper {
     /**
      * 查询所有分类列表
      */
-    @Select("SELECT * FROM fs_complaint_category ORDER BY sort_order ASC")
+    @Select("SELECT * FROM fs_complaint_category where status=1 ORDER BY sort_order ASC")
     List<FsComplaintCategory> selectAll();
 
     /**
@@ -43,7 +43,7 @@ public interface FsComplaintCategoryMapper {
      * 更新分类信息
      */
 
-    int update(FsComplaintCategory category);
+    int updateById(FsComplaintCategory category);
 
     /**
      * 根据ID删除分类信息

+ 85 - 12
fs-service/src/main/java/com/fs/complaint/mapper/FsComplaintMapper.java

@@ -1,8 +1,7 @@
 package com.fs.complaint.mapper;
 
 import com.fs.complaint.domain.FsComplaint;
-import com.fs.complaint.param.FsComplaintCategoryParam;
-import com.fs.complaint.vo.FsComplaintCategoryListVO;
+import com.fs.complaint.dto.ComplaintQueryDTO;
 import org.apache.ibatis.annotations.*;
 
 import java.util.List;
@@ -26,31 +25,105 @@ public interface FsComplaintMapper {
     FsComplaint selectByComplaintNo(String complaintNo);
 
     /**
-     * 分页查询投诉列表
+     * 条件查询投诉总数
      */
-    @Select("SELECT * FROM fs_complaint ORDER BY create_time DESC LIMIT #{offset}, #{limit}")
-    List<FsComplaint> selectPage(@Param("offset") int offset, @Param("limit") int limit);
+    @SelectProvider(type = ComplaintSqlProvider.class, method = "countByCondition")
+    int countByCondition(ComplaintQueryDTO queryDTO);
+
+    /**
+     * 条件分页查询投诉列表
+     */
+    @SelectProvider(type = ComplaintSqlProvider.class, method = "selectByCondition")
+    List<FsComplaint> selectByCondition(ComplaintQueryDTO queryDTO);
 
     /**
      * 插入投诉信息
      */
-    @Insert("INSERT INTO fs_complaint(complaint_no, category_id, content, contact_phone, contact_email, status) " +
-            "VALUES(#{complaintNo}, #{categoryId}, #{content}, #{contactPhone}, #{contactEmail}, #{status})")
+    @Insert("INSERT INTO fs_complaint(complaint_no, category_id, content, contact_phone, contact_email, status, create_time, update_time) " +
+            "VALUES(#{complaintNo}, #{categoryId}, #{content}, #{contactPhone}, #{contactEmail}, #{status}, #{createTime}, #{updateTime})")
     @Options(useGeneratedKeys = true, keyProperty = "id")
     int insert(FsComplaint complaint);
 
     /**
      * 更新投诉信息
      */
-    @Update("UPDATE fs_complaint SET category_id = #{categoryId}, content = #{content}, " +
-            "contact_phone = #{contactPhone}, contact_email = #{contactEmail}, status = #{status} " +
-            "WHERE id = #{id}")
-    int update(FsComplaint complaint);
+    @UpdateProvider(type = ComplaintSqlProvider.class, method = "updateSelective")
+    int updateSelective(FsComplaint complaint);
 
     /**
      * 根据ID删除投诉信息
      */
-    @Update("DELETE FROM fs_complaint WHERE id = #{id}")
+    @Delete("DELETE FROM fs_complaint WHERE id = #{id}")
     int deleteById(Long id);
 
+    /**
+     * SQL构建器
+     */
+    class ComplaintSqlProvider {
+
+        public String countByCondition(ComplaintQueryDTO queryDTO) {
+            return buildConditionSql("SELECT COUNT(*) FROM fs_complaint", queryDTO, false);
+        }
+
+        public String selectByCondition(ComplaintQueryDTO queryDTO) {
+            String sql = buildConditionSql("SELECT * FROM fs_complaint", queryDTO, true);
+            int offset = (queryDTO.getPageNum() - 1) * queryDTO.getPageSize();
+            return sql + " LIMIT " + offset + ", " + queryDTO.getPageSize();
+        }
+
+        public String updateSelective(FsComplaint complaint) {
+            StringBuilder sql = new StringBuilder("UPDATE fs_complaint SET update_time = #{updateTime}");
+
+            if (complaint.getCategoryId() != null) {
+                sql.append(", category_id = #{categoryId}");
+            }
+            if (complaint.getContent() != null) {
+                sql.append(", content = #{content}");
+            }
+            if (complaint.getContactPhone() != null) {
+                sql.append(", contact_phone = #{contactPhone}");
+            }
+            if (complaint.getContactEmail() != null) {
+                sql.append(", contact_email = #{contactEmail}");
+            }
+            if (complaint.getStatus() != null) {
+                sql.append(", status = #{status}");
+            }
+
+            sql.append(" WHERE id = #{id}");
+            return sql.toString();
+        }
+
+        private String buildConditionSql(String baseSql, ComplaintQueryDTO queryDTO, boolean needOrder) {
+            StringBuilder sql = new StringBuilder(baseSql);
+            StringBuilder where = new StringBuilder(" WHERE 1=1");
+
+            if (queryDTO.getComplaintNo() != null && !queryDTO.getComplaintNo().trim().isEmpty()) {
+                where.append(" AND complaint_no LIKE CONCAT('%', #{complaintNo}, '%')");
+            }
+            if (queryDTO.getCategoryId() != null) {
+                where.append(" AND category_id = #{categoryId}");
+            }
+            if (queryDTO.getStatus() != null) {
+                where.append(" AND status = #{status}");
+            }
+            if (queryDTO.getContactPhone() != null && !queryDTO.getContactPhone().trim().isEmpty()) {
+                where.append(" AND contact_phone LIKE CONCAT('%', #{contactPhone}, '%')");
+            }
+            if (queryDTO.getStartTime() != null && !queryDTO.getStartTime().trim().isEmpty()) {
+                where.append(" AND create_time >= #{startTime}");
+            }
+            if (queryDTO.getEndTime() != null && !queryDTO.getEndTime().trim().isEmpty()) {
+                where.append(" AND create_time <= #{endTime}");
+            }
+
+            sql.append(where);
+
+            if (needOrder) {
+                sql.append(" ORDER BY create_time DESC");
+            }
+
+            return sql.toString();
+        }
+    }
 }

+ 5 - 0
fs-service/src/main/java/com/fs/complaint/service/FsComplaintCategoryService.java

@@ -44,4 +44,9 @@ public interface FsComplaintCategoryService {
      */
     int updateFsComplaintCategoryStatus(FsComplaintCategory fsComplaintCategory);
 
+    /**
+     * 查询所有分类
+     * @return List<FsComplaintCategory>
+     */
+    List<FsComplaintCategory> queryAllCategory();
 }

+ 32 - 3
fs-service/src/main/java/com/fs/complaint/service/FsComplaintService.java

@@ -1,14 +1,43 @@
 package com.fs.complaint.service;
 
-import com.fs.complaint.domain.FsComplaintCategory;
+import cn.hutool.db.PageResult;
+import com.fs.complaint.domain.FsComplaint;
+import com.fs.complaint.dto.ComplaintQueryDTO;
 import com.fs.complaint.dto.SubmitComplaintDTO;
-import com.fs.complaint.param.FsComplaintCategoryParam;
-import com.fs.complaint.vo.FsComplaintCategoryListVO;
+import com.fs.complaint.dto.UpdateComplaintDTO;
+import com.fs.complaint.vo.ComplaintVO;
 
 import java.util.List;
 
 public interface FsComplaintService {
+
+    /**
+     * 提交投诉
+     */
     void submitComplaint(SubmitComplaintDTO dto);
 
+    /**
+     * 根据ID查询投诉详情
+     */
+    ComplaintVO getComplaintById(Long id);
+
+    /**
+     * 根据投诉单号查询投诉详情
+     */
+    ComplaintVO getComplaintByNo(String complaintNo);
+
+    /**
+     * 分页查询投诉列表
+     */
+    List<FsComplaint> getComplaintPage(ComplaintQueryDTO queryDTO);
+
+    /**
+     * 更新投诉信息
+     */
+    void updateComplaint(Long id, UpdateComplaintDTO dto);
 
+    /**
+     * 删除投诉
+     */
+    void deleteComplaint(Long id);
 }

+ 7 - 2
fs-service/src/main/java/com/fs/complaint/service/impl/FsComplaintCategoryServiceImpl.java

@@ -43,7 +43,7 @@ public class FsComplaintCategoryServiceImpl implements FsComplaintCategoryServic
     public int updateFsComplaintCategory(FsComplaintCategory fsComplaintCategory) {
 
         fsComplaintCategory.setUpdateTime(LocalDateTime.now());
-        return fsComplaintCategoryMapper.update(fsComplaintCategory);
+        return fsComplaintCategoryMapper.updateById(fsComplaintCategory);
 
     }
 
@@ -57,7 +57,12 @@ public class FsComplaintCategoryServiceImpl implements FsComplaintCategoryServic
     @Override
     public int updateFsComplaintCategoryStatus(FsComplaintCategory fsComplaintCategory) {
         fsComplaintCategory.setUpdateTime(LocalDateTime.now());
-        return fsComplaintCategoryMapper.update(fsComplaintCategory);
+        return fsComplaintCategoryMapper.updateById(fsComplaintCategory);
+    }
+
+    @Override
+    public List<FsComplaintCategory> queryAllCategory() {
+        return fsComplaintCategoryMapper.selectAll();
     }
 
 }

+ 122 - 0
fs-service/src/main/java/com/fs/complaint/service/impl/FsComplaintServiceImpl.java

@@ -2,15 +2,21 @@ package com.fs.complaint.service.impl;
 
 import cn.hutool.core.lang.Snowflake;
 import cn.hutool.core.util.IdUtil;
+import cn.hutool.db.PageResult;
 import com.fs.common.utils.FileNameExtractor;
+import com.fs.common.utils.bean.BeanUtils;
 import com.fs.complaint.domain.FsComplaint;
 import com.fs.complaint.domain.FsComplaintAttachment;
+import com.fs.complaint.dto.ComplaintQueryDTO;
 import com.fs.complaint.dto.SubmitComplaintDTO;
+import com.fs.complaint.dto.UpdateComplaintDTO;
 import com.fs.complaint.mapper.FsComplaintAttachmentMapper;
 import com.fs.complaint.mapper.FsComplaintMapper;
 import com.fs.complaint.param.FsComplaintCategoryParam;
 import com.fs.complaint.service.FsComplaintService;
+import com.fs.complaint.vo.ComplaintVO;
 import com.fs.complaint.vo.FsComplaintCategoryListVO;
+import lombok.extern.slf4j.Slf4j;
 import org.bouncycastle.oer.its.etsi102941.Url;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -18,10 +24,14 @@ import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Random;
+import java.util.stream.Collectors;
 
+@Slf4j
 @Service
 public class FsComplaintServiceImpl implements FsComplaintService {
     @Autowired
@@ -62,5 +72,117 @@ public class FsComplaintServiceImpl implements FsComplaintService {
         fsComplaintAttachmentMapper.batchInsert(attachments);
     }
 
+    @Override
+    public ComplaintVO getComplaintById(Long id) {
+        log.info("根据ID查询投诉详情,ID:{}", id);
+
+        FsComplaint complaint = fsComplaintMapper.selectById(id);
+        if (complaint == null) {
+            throw new RuntimeException("投诉信息不存在");
+        }
+
+        return convertToVO(complaint);
+    }
+
+    @Override
+    public ComplaintVO getComplaintByNo(String complaintNo) {
+        log.info("根据投诉单号查询投诉详情,投诉单号:{}", complaintNo);
+
+        FsComplaint complaint = fsComplaintMapper.selectByComplaintNo(complaintNo);
+        if (complaint == null) {
+            throw new RuntimeException("投诉信息不存在");
+        }
+
+        return convertToVO(complaint);
+    }
+
+    @Override
+    public List<FsComplaint> getComplaintPage(ComplaintQueryDTO queryDTO) {
+        log.info("分页查询投诉列表,参数:{}", queryDTO);
+
+        // 查询总数
+        int total = fsComplaintMapper.countByCondition(queryDTO);
+
+        // 查询列表
+        List<FsComplaint> complaints = fsComplaintMapper.selectByCondition(queryDTO);
+
+        return complaints;
+    }
+
+    @Override
+    public void updateComplaint(Long id, UpdateComplaintDTO dto) {
+        log.info("更新投诉信息,ID:{},参数:{}", id, dto);
+
+        // 检查投诉是否存在
+        FsComplaint existComplaint = fsComplaintMapper.selectById(id);
+        if (existComplaint == null) {
+            throw new RuntimeException("投诉信息不存在");
+        }
+
+        FsComplaint complaint = new FsComplaint();
+        BeanUtils.copyProperties(dto, complaint);
+        complaint.setId(id);
+        complaint.setUpdateTime(LocalDateTime.now());
+
+        int result = fsComplaintMapper.updateSelective(complaint);
+        if (result <= 0) {
+            throw new RuntimeException("更新投诉信息失败");
+        }
+
+        log.info("投诉信息更新成功,ID:{}", id);
+    }
+
+    @Override
+    public void deleteComplaint(Long id) {
+        log.info("删除投诉,ID:{}", id);
+
+        // 检查投诉是否存在
+        FsComplaint existComplaint = fsComplaintMapper.selectById(id);
+        if (existComplaint == null) {
+            throw new RuntimeException("投诉信息不存在");
+        }
+
+        int result = fsComplaintMapper.deleteById(id);
+        if (result <= 0) {
+            throw new RuntimeException("删除投诉失败");
+        }
+
+        log.info("投诉删除成功,ID:{}", id);
+    }
+
+    /**
+     * 生成投诉单号
+     */
+    private String generateComplaintNo() {
+        String timestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
+        String random = String.format("%04d", new Random().nextInt(10000));
+        return "TS" + timestamp + random;
+    }
+
+    /**
+     * 转换为VO对象
+     */
+    private ComplaintVO convertToVO(FsComplaint complaint) {
+        ComplaintVO vo = new ComplaintVO();
+        BeanUtils.copyProperties(complaint, vo);
+        vo.setStatusName(getStatusName(complaint.getStatus()));
+        return vo;
+    }
+
+    /**
+     * 获取状态名称
+     */
+    private String getStatusName(Integer status) {
+        if (status == null) {
+            return "";
+        }
+        switch (status) {
+            case 1: return "待处理";
+            case 2: return "处理中";
+            case 3: return "已完成";
+            case 4: return "已关闭";
+            default: return "未知状态";
+        }
+    }
 
 }

+ 22 - 0
fs-service/src/main/java/com/fs/complaint/vo/ComplaintVO.java

@@ -0,0 +1,22 @@
+package com.fs.complaint.vo;
+
+import lombok.Data;
+import java.time.LocalDateTime;
+
+/**
+ * 投诉信息返回对象
+ */
+@Data
+public class ComplaintVO {
+
+    private Long id;
+    private String complaintNo;
+    private Long categoryId;
+    private String content;
+    private String contactPhone;
+    private String contactEmail;
+    private Integer status;
+    private String statusName;
+    private LocalDateTime createTime;
+    private LocalDateTime updateTime;
+}

+ 1 - 0
fs-service/src/main/resources/application-config-dev.yml

@@ -7,6 +7,7 @@ logging:
     org.springframework.web: debug
     com.github.binarywang.demo.wx.cp: DEBUG
     me.chanjar.weixin: DEBUG
+    com.fs: debug
 wx:
   miniapp:
     configs:

+ 4 - 4
fs-service/src/main/resources/mapper/complaint/FsComplaintCategoryMapper.xml

@@ -18,19 +18,19 @@
         select id, category_name, category_code, sort_order, status, create_time, update_time
         from fs_complaint_category
     </sql>
-    <update id="update">
+    <update id="updateById">
         UPDATE fs_complaint_category
         <set>
-            <if test="categoryName != null and categoryName != ''">
+            <if test="categoryName != null">
                 category_name = #{categoryName},
             </if>
-            <if test="categoryCode != null and categoryCode != ''">
+            <if test="categoryCode != null">
                 category_code = #{categoryCode},
             </if>
             <if test="sortOrder != null">
                 sort_order = #{sortOrder},
             </if>
-            <if test="status != null and status != ''">
+            <if test="status != null">
                 status = #{status},
             </if>
         </set>