Просмотр исходного кода

fix 优化企业微信车票列表

zoujiajian 1 месяц назад
Родитель
Сommit
20d7d7ad28

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

@@ -86,6 +86,8 @@ public interface OrderDonMapper extends BaseMapper<OrderDon> {
 
 	UserOrderDetailView getFansToDayOrdersView(@Param("tagIdStr") String tagIdStr, @Param("date") String date);
 
+	List<OrderDon> selectLatestTicketOrders(@Param("relationIds") List<Long> relationIds, @Param("userIds") List<Long> userIds, @Param("noOrderAllStatus") List<String> noOrderAllStatus);
+
 	List<Long> getPayGoodsIds(@Param("userIds") List<Long> relationUserIdList);
 
 	BigDecimal getTotalRefundAmountTime(@Param("startDate") Date startDate, @Param("endDate") Date endDate);

+ 29 - 1
netflix-dao/src/main/resources/mapper/OrderDonMapper.xml

@@ -488,6 +488,34 @@
             and date_format(o.created_time, '%Y-%m-%d') = #{date}
     </select>
 
+    <select id="selectLatestTicketOrders" resultType="com.cyksj.model.entity.OrderDon">
+        select od.id,
+               od.relation_id as relationId,
+               od.user_id as userId,
+               od.order_no as orderNo,
+               od.transaction_id as transactionId,
+               od.status
+        from order_don od
+                 inner join (
+            select relation_id, user_id, max(id) as id
+            from order_don
+            where relation_id in
+            <foreach collection="relationIds" item="item" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+              and user_id in
+            <foreach collection="userIds" item="item" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+              and order_type = 1
+              and status not in
+            <foreach collection="noOrderAllStatus" item="item" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+            group by relation_id, user_id
+        ) latest on latest.id = od.id
+    </select>
+
     <select id="getPayGoodsIds" resultType="java.lang.Long">
         select distinct goods_id from order_don where status not in ('close','noPayment')
         and user_id in
@@ -534,4 +562,4 @@
             and o.created_time &lt; #{endDate}
         </if>
     </select>
-</mapper>
+</mapper>

+ 35 - 10
netflix-web/src/main/java/com/cyksj/web/controller/manage/corp/WxCorpController.java

@@ -55,6 +55,7 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Optional;
 import java.util.stream.Collectors;
 
@@ -473,25 +474,49 @@ public class WxCorpController {
 				.field(TicketView::getGrStatus, List.of("validity", "outside")).op(Operator.InList)
 				.orderBy(TicketView::getExpiryTime).asc()
 				.build());
-		ticketViews.getDataList().forEach(ticket->{
-			OrderDon orderDon = orderDonMapper.selectOne(Wrappers.lambdaQuery(OrderDon.class)
-					.eq(OrderDon::getRelationId, ticket.getRelationId())
-					.eq(OrderDon::getUserId, ticket.getUserId())
-					.eq(OrderDon::getOrderType, 1)
-					.notIn(OrderDon::getStatus, Constant.noOrderAllStatus)
-					.orderByDesc(OrderDon::getId)
-					.last("limit 1"));
+		fillTicketOrderInfo(ticketViews.getDataList());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(ticketViews);
+	}
+
+	private void fillTicketOrderInfo(List<TicketView> tickets) {
+		if (tickets == null || tickets.isEmpty()) {
+			return;
+		}
+		List<Long> relationIds = tickets.stream()
+				.map(TicketView::getRelationId)
+				.filter(Objects::nonNull)
+				.distinct()
+				.collect(Collectors.toList());
+		List<Long> ticketUserIds = tickets.stream()
+				.map(TicketView::getUserId)
+				.filter(Objects::nonNull)
+				.distinct()
+				.collect(Collectors.toList());
+		if (relationIds.isEmpty() || ticketUserIds.isEmpty()) {
+			return;
+		}
+		List<OrderDon> orderDons = orderDonMapper.selectLatestTicketOrders(relationIds, ticketUserIds, Constant.noOrderAllStatus);
+		if (orderDons.isEmpty()) {
+			return;
+		}
+		Map<String, OrderDon> latestOrderMap = orderDons.stream()
+				.collect(Collectors.toMap(orderDon -> ticketOrderKey(orderDon.getRelationId(), orderDon.getUserId()), orderDon -> orderDon));
+		tickets.forEach(ticket -> {
+			OrderDon orderDon = latestOrderMap.get(ticketOrderKey(ticket.getRelationId(), ticket.getUserId()));
 			if (orderDon != null) {
 				ticket.setOrderNo(orderDon.getOrderNo());
 				ticket.setOrderId(orderDon.getId());
 				ticket.setTransactionId(orderDon.getTransactionId());
 				if (ticket.getSecondType() != null && ticket.getSecondType() == 1) {
-					//是否完成邀请 根据订单状态
+					// invite order completion follows order status
 					ticket.setIsComplete(orderDon.getStatus() == OrderDon.Status.complete ? true : false);
 				}
 			}
 		});
-		return GatewayResponse.SUCCESS.newBuilder().toResult(ticketViews);
+	}
+
+	private String ticketOrderKey(Long relationId, Long userId) {
+		return relationId + "_" + userId;
 	}