Przeglądaj źródła

订单客服业绩关联

zoujiajian 2 lat temu
rodzic
commit
fd1bb83423

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/OrderDonCustomerServiceRelateMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.OrderDonCustomerServiceRelate;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: OrderDonCustomerServiceRelateMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/4/1 15:38
+ */
+public interface OrderDonCustomerServiceRelateMapper extends BaseMapper<OrderDonCustomerServiceRelate> {
+}

+ 3 - 0
netflix-dao/src/main/java/com/cyksj/mapper/OrderDonMapper.java

@@ -3,6 +3,7 @@ package com.cyksj.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.cyksj.model.entity.OrderDon;
+import com.cyksj.model.entity.OrderDonCustomerServiceRelate;
 import com.cyksj.model.entity.RealGoodsInterestUser;
 import com.cyksj.model.excel.ExcelOrderDonInfo;
 import com.cyksj.model.views.*;
@@ -74,4 +75,6 @@ public interface OrderDonMapper extends BaseMapper<OrderDon> {
 	List<RealGoodsSourceData> getRealGoodsSourceData(@Param("isGeneral") Boolean isGeneral, @Param("startDate") String startDate, @Param("endDate") String endDate);
 
 	String selectMaxRefundGoodsName(@Param("operator") String operator, @Param("startTime") String startTime, @Param("endTime") String endTime);
+
+	OrderDonCustomerServiceRelate selectOrderRelate(Long orderId);
 }

+ 28 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/OrderDonCustomerServiceRelate.java

@@ -0,0 +1,28 @@
+package com.cyksj.model.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: OrderDonCustomerServiceRelate
+ * 创建者: JavaZou
+ * 创建时间:2024/4/1 15:37
+ */
+@Getter
+@Setter
+public class OrderDonCustomerServiceRelate extends BaseEntity{
+	@NotNull
+	private Long orderId;
+
+	@NotNull
+	private Long cmsUserId;
+
+	@DbIgnore
+	@TableField(exist = false)
+	private String nickname;
+}

+ 12 - 0
netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderDonBackView.java

@@ -259,4 +259,16 @@ public class OrderDonBackView {
 
 	@DbIgnore
 	private List<GoodsDonSkuView> benefitsViews;
+
+	/**
+	 * 客服id
+	 */
+	@DbIgnore
+	private Long cmsUserId;
+
+	/**
+	 * 客服名
+	 */
+	@DbIgnore
+	private String serviceName;
 }

+ 31 - 0
netflix-dao/src/main/java/com/cyksj/model/views/OrderCustomerServiceDataView.java

@@ -0,0 +1,31 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: OrderCustomerServiceDataView
+ * 创建者: JavaZou
+ * 创建时间:2024/4/1 15:30
+ */
+@Getter
+@Setter
+@SearchBean(tables = "order_don_customer_service_relate odr inner join order_don od on odr.order_id = od.id and od.status not in ('close','noPayment','refund')" +
+		" inner join cms_user cu on cu.id = odr.cms_user_id",
+		groupBy = "odr.cms_user_id,od.goods_id")
+public class OrderCustomerServiceDataView {
+	@DbField("count(*)")
+	private Integer orders;
+
+	@DbField("odr.cms_user_id")
+	private Long cmsUserId;
+
+	@DbField("any_value(cu.nickname)")
+	private String nickname;
+
+	@DbField("select title from goods_don where id = od.goods_id limit 1")
+	private String goodsName;
+}

+ 6 - 0
netflix-dao/src/main/resources/mapper/OrderDonMapper.xml

@@ -438,4 +438,10 @@
         group by o.goods_id
         order by count(*) desc limit 1
     </select>
+
+    <select id="selectOrderRelate" resultType="com.cyksj.model.entity.OrderDonCustomerServiceRelate">
+        select cms_user_id, (select nickname from cms_user where id = odr.cms_user_id limit 1) as nickname
+        from order_don_customer_service_relate odr
+        where order_id = #{orderId} limit 1
+    </select>
 </mapper>

+ 31 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsOrderController.java

@@ -49,6 +49,7 @@ import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.dao.DuplicateKeyException;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
@@ -105,6 +106,8 @@ public class CmsOrderController {
 
 	private final OrderDonMapper orderDonMapper;
 
+	private final OrderDonCustomerServiceRelateMapper orderDonCustomerServiceRelateMapper;
+
 
 	@GetMapping("/get")
 	@SaCheckPermission("order:view")
@@ -210,6 +213,13 @@ public class CmsOrderController {
 				data.setRegister(StrUtil.isNotEmpty(user.getUnionid()) ? "wechat" : StrUtil.isNotEmpty(user.getLoginPhone()) ? "phone" : "email");
 
 			}
+			if (data.getGoodsDonType() != null && data.getGoodsDonType() == 1) {
+				//获取订单关联客服
+				Optional.ofNullable(orderDonMapper.selectOrderRelate(data.getId())).ifPresent(e -> {
+					data.setCmsUserId(e.getCmsUserId());
+					data.setNickname(e.getNickname());
+				});
+			}
 		});
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}
@@ -775,4 +785,25 @@ public class CmsOrderController {
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}
 
+	/**
+	 * 设置订单客服
+	 */
+	@PutMapping("/set/service")
+	public Result<String> setOrderCustomerService(@RequestBody OrderDonCustomerServiceRelate relate) {
+		OrderDonCustomerServiceRelate orderDonCustomerServiceRelate = orderDonCustomerServiceRelateMapper.selectOne(Wrappers.lambdaQuery(OrderDonCustomerServiceRelate.class)
+				.eq(OrderDonCustomerServiceRelate::getOrderId, relate.getOrderId()).last("limit 1"));
+		if (orderDonCustomerServiceRelate != null) {
+			relate.setId(orderDonCustomerServiceRelate.getId());
+		}
+		try {
+			if (relate.getId() == null) {
+				orderDonCustomerServiceRelateMapper.insert(relate);
+			} else {
+				orderDonCustomerServiceRelateMapper.updateById(relate);
+
+			}
+		} catch (DuplicateKeyException e) {
+		}
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
 }

+ 20 - 10
netflix-web/src/main/java/com/cyksj/web/controller/manage/statistics/StatisticsDataController.java

@@ -355,11 +355,11 @@ public class StatisticsDataController {
 	}
 
 	@GetMapping("/get/stock")
-	public Result<List<StatisticsStockView>> getStock(HttpServletRequest request, @RequestParam(defaultValue = "0") Long startTime,@RequestParam(defaultValue = "0") Long endTime){
+	public Result<List<StatisticsStockView>> getStock(HttpServletRequest request, @RequestParam(defaultValue = "0") Long startTime, @RequestParam(defaultValue = "0") Long endTime) {
 		List<GoodsDonStock> goodsDonStocks = beanSearcher.searchAll(GoodsDonStock.class, MapUtils.flatBuilder(request.getParameterMap()).build());
 		List<StatisticsStockView> res = new ArrayList<>(goodsDonStocks.size() + 1);
 
-		goodsDonStocks.forEach((stock)->{
+		goodsDonStocks.forEach((stock) -> {
 			List<GoodsDonStockRecord> goodsDonStockRecords = stockRecordMapper.selectList(Wrappers.lambdaQuery(GoodsDonStockRecord.class)
 					.eq(GoodsDonStockRecord::getStockId, stock.getId())
 					.eq(GoodsDonStockRecord::getIsUndo, false)
@@ -378,11 +378,11 @@ public class StatisticsDataController {
 			}
 //			statisticsStockView.setUnavailable(stock.getUnavailable());
 			statisticsStockView.setTitle(stock.getTitle());
-			typeRecordsMap.forEach((type,records)->{
+			typeRecordsMap.forEach((type, records) -> {
 				int sum = records.stream().mapToInt(GoodsDonStockRecord::getNum).sum();
 				BigDecimal price = records.stream().map((record) -> record.getPrice().multiply(BigDecimal.valueOf(record.getNum())))
 						.reduce(BigDecimal.ZERO, BigDecimal::add);
-				statisticsStockView.setTotalWithPrice(type,sum,price);
+				statisticsStockView.setTotalWithPrice(type, sum, price);
 			});
 			res.add(statisticsStockView);
 		});
@@ -391,11 +391,11 @@ public class StatisticsDataController {
 	}
 
 	@GetMapping("/export/stock")
-	public void exportStock(HttpServletRequest request, HttpServletResponse response, @RequestParam(defaultValue = "0") Long startTime,@RequestParam(defaultValue = "0") Long endTime){
+	public void exportStock(HttpServletRequest request, HttpServletResponse response, @RequestParam(defaultValue = "0") Long startTime, @RequestParam(defaultValue = "0") Long endTime) {
 		List<GoodsDonStock> goodsDonStocks = beanSearcher.searchAll(GoodsDonStock.class, MapUtils.flatBuilder(request.getParameterMap()).build());
 		List<StatisticsStockView> res = new ArrayList<>(goodsDonStocks.size() + 1);
 
-		goodsDonStocks.forEach((stock)->{
+		goodsDonStocks.forEach((stock) -> {
 			List<GoodsDonStockRecord> goodsDonStockRecords = stockRecordMapper.selectList(Wrappers.lambdaQuery(GoodsDonStockRecord.class)
 					.eq(GoodsDonStockRecord::getStockId, stock.getId())
 					.eq(GoodsDonStockRecord::getIsUndo, false)
@@ -408,17 +408,17 @@ public class StatisticsDataController {
 			if (put != null) {
 				int sum = put.stream().mapToInt(GoodsDonStockRecord::getAvailable).sum();
 				BigDecimal price = put.stream().map((record) -> record.getPrice().multiply(BigDecimal.valueOf(record.getAvailable())))
-						.reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(100),2, RoundingMode.HALF_EVEN);
+						.reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_EVEN);
 				statisticsStockView.setThenTotal(sum);
 				statisticsStockView.setThenPrice(price);
 			}
 //			statisticsStockView.setUnavailable(stock.getUnavailable());
 			statisticsStockView.setTitle(stock.getTitle());
-			typeRecordsMap.forEach((type,records)->{
+			typeRecordsMap.forEach((type, records) -> {
 				int sum = records.stream().mapToInt(GoodsDonStockRecord::getNum).sum();
 				BigDecimal price = records.stream().map((record) -> record.getPrice().multiply(BigDecimal.valueOf(record.getNum())))
-						.reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(100),2, RoundingMode.HALF_EVEN);
-				statisticsStockView.setTotalWithPrice(type,sum,price);
+						.reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_EVEN);
+				statisticsStockView.setTotalWithPrice(type, sum, price);
 			});
 			res.add(statisticsStockView);
 		});
@@ -496,6 +496,7 @@ public class StatisticsDataController {
 
 	/**
 	 * 渠道后台数据统计折线图
+	 *
 	 * @return
 	 */
 	@GetMapping("/get/channelStatistics/brokenLine")
@@ -602,4 +603,13 @@ public class StatisticsDataController {
 		});
 		return GatewayResponse.SUCCESS.newBuilder().toResult();
 	}
+
+	/**
+	 * 虚拟商品订单客服数据统计
+	 */
+	@GetMapping("/get/order/service/data")
+	public Result<SearchResult<OrderCustomerServiceDataView>> getOrderServiceData() {
+		SearchResult<OrderCustomerServiceDataView> search = beanSearcher.search(OrderCustomerServiceDataView.class, MapUtils.builder().build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
 }