Răsfoiți Sursa

fix 工单修改

zoujiajian 3 ani în urmă
părinte
comite
09cb360687

+ 2 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/CmsUser.java

@@ -43,6 +43,8 @@ public class CmsUser extends BaseEntity{
 	 */
 	private String modifiedBy;
 
+	private String authId;
+
 
 	/**
 	 * 管理员是否允许登录

+ 32 - 1
netflix-dao/src/main/java/com/cyksj/model/entity/WorkOrder.java

@@ -20,18 +20,49 @@ public class WorkOrder extends BaseEntity{
 
 	private Long relationId;
 
+	private Long accountId;
+
+	private String account;
+
 	private Long goodsId;
 
 	private Long skuId;
 
 	private Status status;
 
+	/**
+	 * 分配的客服id
+	 */
+	private Long assignCustomerServiceId;
+
 	private Long closeCustomerServiceId;
 
+	/**
+	 * 客服凭证id
+	 */
+	private String customerServiceAuthId;
+
+	private Type type;
+
+
+	@Getter
+	public enum Type {
+		freeze("账号被封"),
+		noMember("无会员"),
+		;
+
+		String desc;
+
+		Type(String desc) {
+		}
+	}
+
 	@Getter
 	public enum Status {
 		waiting("待处理"),
-		close("已关闭");
+		close("已关闭"),
+		normal("无异常"),
+		;
 
 		String desc;
 

+ 4 - 2
netflix-dao/src/main/java/com/cyksj/model/request/WorkOrderReq.java

@@ -1,9 +1,9 @@
 package com.cyksj.model.request;
 
+import com.cyksj.model.entity.WorkOrder;
 import lombok.Getter;
 import lombok.Setter;
 
-import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
 
 /*
@@ -17,12 +17,14 @@ import javax.validation.constraints.NotNull;
 public class WorkOrderReq {
 	private Long userId;
 
-	@NotEmpty(message = "请输入工单主题")
 	private String topic;
 
 	@NotNull(message = "请选择车票")
 	private Long relationId;
 
+	@NotNull(message = "请选择对应问题类型")
+	private WorkOrder.Type type;
+
 	private String content;
 
 	private String imgs;

+ 3 - 0
netflix-dao/src/main/java/com/cyksj/model/views/CmsUserVO.java

@@ -60,6 +60,9 @@ public class CmsUserVO {
 	@DbField("cu.modified_by")
 	private String modifiedBy;
 
+	@DbField("cu.auth_id")
+	private String authId;
+
 	/**
 	 * 权限列表
 	 */

+ 3 - 0
netflix-dao/src/main/java/com/cyksj/model/views/GroupRelationDetailView.java

@@ -27,4 +27,7 @@ public class GroupRelationDetailView {
 
 	@DbField("gdk.goods_id")
 	private Long goodsId;
+
+	@DbField("gt.account_Id")
+	private Long accountId;
 }

+ 48 - 0
netflix-dao/src/main/java/com/cyksj/model/views/UserWorkOrderView.java

@@ -0,0 +1,48 @@
+package com.cyksj.model.views;
+
+import com.cyksj.model.entity.WorkOrder;
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/*
+ *项目名: netflix
+ *文件名: UserWorkOrderView
+ *创建者: JavaZou
+ *创建时间:2023/6/26 9:56
+ */
+@Getter
+@Setter
+@SearchBean(tables = "work_order wo left join goods_don g on g.id = wo.goods_id" +
+		" left join goods_don_sku sku on sku.id = wo.sku_id")
+public class UserWorkOrderView {
+
+	@DbField("wo.user_id")
+	@JsonIgnore
+	private Long userId;
+
+	@DbField("wo.account")
+	private String account;
+
+	@DbField("g.title")
+	private String title;
+
+	@DbField("sku.spec_val")
+	private String specVal;
+
+	@DbField("wo.type")
+	private WorkOrder.Type type;
+
+	@DbField("wo.status")
+	private WorkOrder.Status status;
+
+	@DbField("wo.created_time")
+	private Date createdTime;
+
+	@DbField("wo.customer_service_auth_id")
+	private String customerServiceAuthId;
+}

+ 3 - 0
netflix-dao/src/main/java/com/cyksj/model/views/WorkOrderView.java

@@ -25,6 +25,9 @@ public class WorkOrderView {
 	@DbField("wo.user_id")
 	private Long userId;
 
+	@DbField("wo.assign_customer_service_id")
+	private Long assignCustomerServiceId;
+
 	@DbField("wo.reply_customer_service_id")
 	private Long replyCustomerServiceId;
 

+ 20 - 4
netflix-service/src/main/java/com/cyksj/service/user/impl/WorkOrderFrontServiceImpl.java

@@ -1,15 +1,18 @@
 package com.cyksj.service.user.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.RandomUtil;
 import cn.hutool.core.util.StrUtil;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.enums.GatewayApiCode;
+import com.cyksj.mapper.AccountMapper;
 import com.cyksj.mapper.manage.sys.WorkOrderChatHistoryMapper;
 import com.cyksj.mapper.manage.sys.WorkOrderMapper;
 import com.cyksj.model.entity.User;
 import com.cyksj.model.entity.WorkOrder;
 import com.cyksj.model.entity.WorkOrderChatHistory;
 import com.cyksj.model.request.WorkOrderReq;
+import com.cyksj.model.views.CmsUserVO;
 import com.cyksj.model.views.GroupRelationDetailView;
 import com.cyksj.service.user.UserService;
 import com.cyksj.service.user.WorkOrderFrontService;
@@ -22,6 +25,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
+import java.util.Optional;
 
 /*
  *项目名: netflix
@@ -41,6 +45,8 @@ public class WorkOrderFrontServiceImpl implements WorkOrderFrontService {
 
 	private final UserService userService;
 
+	private final AccountMapper accountMapper;
+
 	@Override
 	@Transactional(rollbackFor = Throwable.class)
 	public void submitWorkOrder(WorkOrderReq workOrderReq) {
@@ -49,11 +55,8 @@ public class WorkOrderFrontServiceImpl implements WorkOrderFrontService {
 		if (user == null) throw BusinessRuntimeException.getGatewayApiCode(GatewayApiCode.CMS_TOKEN_VALID);
 		String content = workOrderReq.getContent();
 		String imgs = workOrderReq.getImgs();
-		if (StrUtil.isEmpty(content) && StrUtil.isEmpty(imgs)) {
-			throw BusinessRuntimeException.getInstance("请输入相关内容");
-		}
 		String topic = workOrderReq.getTopic();
-		if (topic.length() > 32) {
+		if (StrUtil.isNotBlank(topic) && topic.length() > 32) {
 			throw BusinessRuntimeException.getInstance("标题最多输入30字数以内");
 		}
 		if (StrUtil.isNotBlank(content) && content.length() > 200) {
@@ -71,6 +74,19 @@ public class WorkOrderFrontServiceImpl implements WorkOrderFrontService {
 		BeanUtil.copyProperties(workOrderReq, workOrder);
 		workOrder.setGoodsId(detailView.getGoodsId());
 		workOrder.setSkuId(detailView.getSkuId());
+		Optional.ofNullable(accountMapper.selectById(detailView.getAccountId()))
+				.ifPresent(account -> {
+					workOrder.setAccountId(detailView.getAccountId());
+					workOrder.setAccount(account.getAccount());
+				});
+		//随机分配给客服
+		List<CmsUserVO> customers = beanSearcher.searchAll(CmsUserVO.class, MapUtils.builder().field(CmsUserVO::getRoleNames, "客服").op(Operator.Contain).build());
+		if (customers.size() > 0) {
+			int randomIndex = RandomUtil.randomInt(customers.size());
+			CmsUserVO customer = customers.get(randomIndex);
+			workOrder.setAssignCustomerServiceId(customer.getId());
+			workOrder.setCustomerServiceAuthId(customer.getAuthId());
+		}
 		workOrderMapper.insert(workOrder);
 
 		WorkOrderChatHistory workOrderChatHistory = new WorkOrderChatHistory();

+ 19 - 6
netflix-web/src/main/java/com/cyksj/web/controller/manage/sys/WorkOrderController.java

@@ -14,10 +14,13 @@ 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.CmsUserVO;
 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.param.Operator;
+import com.ejlchina.searcher.util.MapBuilder;
 import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
 import org.springframework.transaction.annotation.Transactional;
@@ -55,7 +58,17 @@ public class WorkOrderController {
 	@GetMapping("/get")
 	@SaCheckPermission("workOrder:view")
 	public Result<SearchResult<WorkOrderView>> getWorkOrderList() {
-		SearchResult<WorkOrderView> search = beanSearcher.search(WorkOrderView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+		long adminId = StpUtil.getLoginIdAsLong();
+		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
+		//是不是客服
+		CmsUserVO isCustomer = beanSearcher.searchFirst(CmsUserVO.class, MapUtils.builder()
+				.field(CmsUserVO::getRoleNames, "客服").op(Operator.Contain)
+				.field(CmsUserVO::getId, adminId)
+				.build());
+		if (isCustomer != null) {
+			builder.field(WorkOrderView::getAssignCustomerServiceId, isCustomer.getId());
+		}
+		SearchResult<WorkOrderView> search = beanSearcher.search(WorkOrderView.class, builder.build());
 		search.getDataList().forEach(data -> {
 			Optional.ofNullable(goodsDonMapper.selectById(data.getGoodsId()))
 					.ifPresent(goodsDon -> data.setTitle(goodsDon.getTitle()));
@@ -78,22 +91,22 @@ public class WorkOrderController {
 	 */
 	@PutMapping("/put/{id}")
 	@SaCheckPermission("workOrder:updateStatus")
-	public Result<String> putWorkOrderStatus(@PathVariable Long id) {
+	public Result<String> putWorkOrderStatus(@PathVariable Long id, WorkOrder.Status status) {
 		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.getStatus() != WorkOrder.Status.waiting) {
+			throw BusinessRuntimeException.getInstance("该工单已处理");
 		}
 		if (workOrder.getCloseCustomerServiceId() == 0) {
 			workOrder.setCloseCustomerServiceId(adminId);
 		}
-		workOrder.setStatus(WorkOrder.Status.close);
+		workOrder.setStatus(status);
 		workOrderMapper.updateById(workOrder);
-		return GatewayResponse.SUCCESS.newBuilder().toResult("关闭成功");
+		return GatewayResponse.SUCCESS.newBuilder().toResult("处理成功");
 	}
 
 	/**

+ 3 - 10
netflix-web/src/main/java/com/cyksj/web/controller/user/UserController.java

@@ -17,10 +17,7 @@ import com.cyksj.model.request.ExchangeCodeTicket;
 import com.cyksj.model.request.ReceiveBenefitsReq;
 import com.cyksj.model.request.UserReq;
 import com.cyksj.model.request.WorkOrderReq;
-import com.cyksj.model.views.RenewalView;
-import com.cyksj.model.views.UserAvailableGoodsTicketView;
-import com.cyksj.model.views.UserPersonalView;
-import com.cyksj.model.views.WorkOrderChatHistoryView;
+import com.cyksj.model.views.*;
 import com.cyksj.service.exchange.ExchangeCodeService;
 import com.cyksj.service.order.UserRealOrderBenefitsService;
 import com.cyksj.service.relation.GroupRelationFrontService;
@@ -160,13 +157,9 @@ public class UserController {
      * 用户工单历史列表
      */
     @GetMapping("/workOrder/get")
-    public Result<SearchResult<WorkOrder>> getWorkOrder() {
+    public Result<SearchResult<UserWorkOrderView>> getWorkOrder() {
         long userId = StpUserUtil.getLoginIdAsLong();
-        SearchResult<WorkOrder> search = beanSearcher.search(WorkOrder.class, MapUtils.flatBuilder(request.getParameterMap())
-                .field(WorkOrder::getUserId, userId)
-                .orderBy(WorkOrder::getId).desc()
-                .onlySelect(WorkOrder::getId, WorkOrder::getTopic, WorkOrder::getStatus, WorkOrder::getCreatedTime)
-                .build());
+        SearchResult<UserWorkOrderView> search = beanSearcher.search(UserWorkOrderView.class, MapUtils.builder().field(UserWorkOrderView::getUserId, userId).build());
         return GatewayResponse.SUCCESS.newBuilder().toResult(search);
     }