|
|
@@ -0,0 +1,155 @@
|
|
|
+package com.cyksj.web.controller.manage.sys;
|
|
|
+
|
|
|
+import cn.dev33.satoken.annotation.SaCheckPermission;
|
|
|
+import cn.dev33.satoken.stp.StpUtil;
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
+import com.cyksj.common.exception.BusinessRuntimeException;
|
|
|
+import com.cyksj.dto.Result;
|
|
|
+import com.cyksj.enums.GatewayResponse;
|
|
|
+import com.cyksj.mapper.GoodsDonMapper;
|
|
|
+import com.cyksj.mapper.GoodsDonSkuMapper;
|
|
|
+import com.cyksj.mapper.UserMapper;
|
|
|
+import com.cyksj.mapper.manage.sys.WorkOrderChatHistoryMapper;
|
|
|
+import com.cyksj.mapper.manage.sys.WorkOrderMapper;
|
|
|
+import com.cyksj.model.entity.WorkOrder;
|
|
|
+import com.cyksj.model.entity.WorkOrderChatHistory;
|
|
|
+import com.cyksj.model.views.WorkOrderChatHistoryView;
|
|
|
+import com.cyksj.model.views.WorkOrderView;
|
|
|
+import com.ejlchina.searcher.BeanSearcher;
|
|
|
+import com.ejlchina.searcher.SearchResult;
|
|
|
+import com.ejlchina.searcher.util.MapUtils;
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+import org.springframework.util.Assert;
|
|
|
+import org.springframework.validation.annotation.Validated;
|
|
|
+import org.springframework.web.bind.annotation.*;
|
|
|
+
|
|
|
+import javax.servlet.http.HttpServletRequest;
|
|
|
+import java.util.Optional;
|
|
|
+
|
|
|
+/*
|
|
|
+ *项目名: netflix
|
|
|
+ *文件名: WorkOrderController
|
|
|
+ *创建者: JavaZou
|
|
|
+ *创建时间:2023/4/19 15:08
|
|
|
+ */
|
|
|
+@RestController
|
|
|
+@RequestMapping("/manage/work/order")
|
|
|
+@RequiredArgsConstructor
|
|
|
+public class WorkOrderController {
|
|
|
+ private final BeanSearcher beanSearcher;
|
|
|
+
|
|
|
+ private final HttpServletRequest request;
|
|
|
+
|
|
|
+ private final GoodsDonMapper goodsDonMapper;
|
|
|
+
|
|
|
+ private final GoodsDonSkuMapper goodsDonSkuMapper;
|
|
|
+
|
|
|
+ private final WorkOrderMapper workOrderMapper;
|
|
|
+
|
|
|
+ private final WorkOrderChatHistoryMapper historyMapper;
|
|
|
+
|
|
|
+ private final UserMapper userMapper;
|
|
|
+
|
|
|
+ @GetMapping("/get")
|
|
|
+ @SaCheckPermission("workOrder:view")
|
|
|
+ public Result<SearchResult<WorkOrderView>> getWorkOrderList() {
|
|
|
+ SearchResult<WorkOrderView> search = beanSearcher.search(WorkOrderView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
|
|
|
+ search.getDataList().forEach(data -> {
|
|
|
+ Optional.ofNullable(goodsDonMapper.selectById(data.getGoodsId()))
|
|
|
+ .ifPresent(goodsDon -> data.setTitle(goodsDon.getTitle()));
|
|
|
+
|
|
|
+ Optional.ofNullable(goodsDonSkuMapper.selectById(data.getSkuId()))
|
|
|
+ .ifPresent(sku -> data.setSpecVal(sku.getSpecVal()));
|
|
|
+
|
|
|
+ Optional.ofNullable(historyMapper.selectOne(Wrappers.lambdaQuery(WorkOrderChatHistory.class)
|
|
|
+ .eq(WorkOrderChatHistory::getWorkOrderId, data.getId()).orderByDesc(WorkOrderChatHistory::getId)
|
|
|
+ .last("limit 1")
|
|
|
+ .select(WorkOrderChatHistory::getCreatedTime)))
|
|
|
+ .ifPresent(last -> data.setFinalReplyTime(last.getCreatedTime()));
|
|
|
+ });
|
|
|
+
|
|
|
+ return GatewayResponse.SUCCESS.newBuilder().toResult(search);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 修改工单状态
|
|
|
+ */
|
|
|
+ @PutMapping("/put/{id}")
|
|
|
+ @SaCheckPermission("workOrder:updateStatus")
|
|
|
+ public Result<String> putWorkOrderStatus(@PathVariable Long id) {
|
|
|
+ long adminId = StpUtil.getLoginIdAsLong();
|
|
|
+ WorkOrder workOrder = workOrderMapper.selectById(id);
|
|
|
+
|
|
|
+ if (workOrder == null) {
|
|
|
+ throw BusinessRuntimeException.getInstance("该工单不存在");
|
|
|
+ }
|
|
|
+ if (workOrder.getStatus() == WorkOrder.Status.close) {
|
|
|
+ throw BusinessRuntimeException.getInstance("该工单已关闭");
|
|
|
+ }
|
|
|
+ if (workOrder.getCloseCustomerServiceId() == 0) {
|
|
|
+ workOrder.setCloseCustomerServiceId(adminId);
|
|
|
+ }
|
|
|
+ workOrder.setStatus(WorkOrder.Status.close);
|
|
|
+ workOrderMapper.updateById(workOrder);
|
|
|
+ return GatewayResponse.SUCCESS.newBuilder().toResult("关闭成功");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查看聊天
|
|
|
+ */
|
|
|
+ @GetMapping("/get/chat/history")
|
|
|
+ @SaCheckPermission("workOrder:detail")
|
|
|
+ public Result<SearchResult<WorkOrderChatHistoryView>> getChatHistoryById() {
|
|
|
+ SearchResult<WorkOrderChatHistoryView> search = beanSearcher.search(WorkOrderChatHistoryView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
|
|
|
+ search.getDataList().forEach(data->{
|
|
|
+ Optional.ofNullable(userMapper.selectById(data.getUserId()))
|
|
|
+ .ifPresent(user -> data.setNickname(user.getNickname()));
|
|
|
+ });
|
|
|
+ return GatewayResponse.SUCCESS.newBuilder().toResult(search);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 客服回复用户工单
|
|
|
+ */
|
|
|
+ @PostMapping("/customer/reply")
|
|
|
+ @SaCheckPermission("workOrder:reply")
|
|
|
+ @Transactional(rollbackFor = Throwable.class)
|
|
|
+ public Result<String> customerReplyWorkOrder(@RequestBody @Validated WorkOrderChatHistory history) {
|
|
|
+ long adminId = StpUtil.getLoginIdAsLong();
|
|
|
+ //回复内容字数
|
|
|
+ Long workOrderId = history.getWorkOrderId();
|
|
|
+ WorkOrder workOrder = workOrderMapper.selectById(workOrderId);
|
|
|
+ Assert.notNull(workOrder, "该工单不存在");
|
|
|
+ if (workOrder.getStatus() == WorkOrder.Status.close) {
|
|
|
+ throw BusinessRuntimeException.getInstance("该工单已被关闭");
|
|
|
+ }
|
|
|
+ history.setFromUser(WorkOrderChatHistory.Messenger.root);
|
|
|
+ history.setToUser(WorkOrderChatHistory.Messenger.user);
|
|
|
+ history.setReplyCustomerServiceId(adminId);
|
|
|
+ history.setUserId(workOrder.getUserId());
|
|
|
+ String content = history.getContent();
|
|
|
+ String imgs = history.getImgs();
|
|
|
+ if (StrUtil.isEmpty(content) && StrUtil.isEmpty(imgs)) {
|
|
|
+ throw BusinessRuntimeException.getInstance("请回复相关内容");
|
|
|
+ }
|
|
|
+ if (StrUtil.isNotBlank(content) && content.length() > 200) {
|
|
|
+ throw BusinessRuntimeException.getInstance("回复内容最多200字数以内");
|
|
|
+ }
|
|
|
+ if (StrUtil.isNotBlank(imgs)) {
|
|
|
+ if (!imgs.contains("[") && !imgs.contains("]")) {
|
|
|
+ imgs = String.format("[\"%s\"]", imgs);
|
|
|
+ }
|
|
|
+ if (imgs.length() > 2000) throw BusinessRuntimeException.getInstance("选择图片过多");
|
|
|
+ history.setImgs(imgs);
|
|
|
+ }
|
|
|
+ historyMapper.insert(history);
|
|
|
+ if (workOrder.getCloseCustomerServiceId() == 0) {
|
|
|
+ //记录首次回复聊天的客服
|
|
|
+ workOrder.setReplyCustomerServiceId(adminId);
|
|
|
+ workOrderMapper.updateById(workOrder);
|
|
|
+ }
|
|
|
+ return GatewayResponse.SUCCESS.newBuilder().toResult();
|
|
|
+ }
|
|
|
+}
|