Bladeren bron

fix 虚拟实物多组合优惠加购

zoujiajian 3 jaren geleden
bovenliggende
commit
143a7923d3

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/OrderDiscountPlusPurchaseSkuRelation.java

@@ -22,4 +22,9 @@ public class OrderDiscountPlusPurchaseSkuRelation extends BaseEntity{
 	private String plusSkuIds;
 
 	private String relationIds;
+
+	/**
+	 * 额外订单ids
+	 */
+	private String plusOrderIds;
 }

+ 2 - 0
netflix-service/src/main/java/com/cyksj/redis/RedisService.java

@@ -633,6 +633,8 @@ public class RedisService {
         ORDER_COMMENT_KEY("order_comment_key:", "订单评价", 10l),
         USER_BIND_ACCOUNT_INFO_KEY("user_bind_account_info_key:", "用户绑定其他账号key", 10l),
         TASK_RECEIVED_KEY("task_received_key:%s:%s", "领取任务奖励key", 10l),
+        CORP_GROUP_CHAT_LIST("corp_group_chat_list:%s", "企业微信客户群列表", 60 * 60 * 24),
+        PLUS_GOODS_ADDRESS_KEY("plus_goods_address_key:", "优惠加购实物地址key", 10 * 60l),
         ;
 
         private String name;

+ 4 - 0
netflix-service/src/main/java/com/cyksj/service/exchange/impl/ExchangeCodeServiceImpl.java

@@ -309,6 +309,10 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 			//兑换码兑换
 			orderDon.setType(orderDonTye);
 			orderDon.setUserId(user.getId());
+			StringBuilder payTitle = new StringBuilder();
+			payTitle.append(goodsDon.getTitle());
+			payTitle.append(sku.getSpecVal());
+			orderDon.setPayTitle(payTitle.toString());
 			orderDonMapper.insert(orderDon);
 			log.info("用户{}兑换规格:{}车位成功", user.getId(), orderDon.getSkuId());
 		}

+ 30 - 0
netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java

@@ -284,6 +284,17 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
         String refundType = refundReq.getRefundType();
         //校验订单是否符合退款
         checkOrderRefund(orderDon, goodsDon, sku, refundReq);
+        //空订单关闭
+        if (orderDon.getMoney().compareTo(BigDecimal.ZERO) == 0 && orderDon.getBalance().compareTo(BigDecimal.ZERO) == 0
+                && orderDon.getRelationId() == 0) {
+            orderDon.setStatus(OrderDon.Status.refund);
+            orderDonMapper.updateById(orderDon);
+            if (goodsDon.getType() == 2) {
+                //扣除用户自身实物权益
+                userRealOrderBenefitsService.deductUserRealGoodsBenefits(orderDon.getId());
+            }
+            return;
+        }
         OrderDon.Type type = orderDon.getType();
         String outNo = StrUtil.EMPTY;
         if (type == OrderDon.Type.WeChat && !refundType.equals(OrderDon.Type.BALANCE.getType())) {
@@ -676,6 +687,25 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
                         } catch (Exception e) {
                         }
                     }
+                    String plusOrderIds = discountPlusPurchaseSkuRelation.getPlusOrderIds();
+                    if (StrUtil.isNotBlank(plusOrderIds)) {
+                        try {
+                            log.info("关闭优惠加购orderId:{}关联实物订单", orderDon.getId());
+                            List<Long> plusOrderIdList = Jsons.parseList(plusOrderIds, Long.class);
+                            List<OrderDon> relate_orderDons = orderDonMapper.selectList(Wrappers.lambdaQuery(OrderDon.class)
+                                    .in(OrderDon::getId, plusOrderIdList)
+                                    .in(OrderDon::getStatus, Constant.noOrderStatus));
+                            relate_orderDons.forEach(relate_o->{
+                                //扣除用户自身实物权益
+                                userRealOrderBenefitsService.deductUserRealGoodsBenefits(relate_o.getId());
+                            });
+                            orderDonMapper.update(null, Wrappers.lambdaUpdate(OrderDon.class)
+                                    .set(OrderDon::getStatus, OrderDon.Status.refund)
+                                    .in(OrderDon::getId, plusOrderIdList)
+                                    .ne(OrderDon::getStatus, OrderDon.Status.refund));
+                        } catch (Exception e) {
+                        }
+                    }
                 }
             }
         });

+ 82 - 26
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -296,9 +296,6 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 		List<Long> dpSkuIds = payRequest.getDpSkuIds();
 		if (CollUtil.isNotEmpty(dpSkuIds)) {
-			if (dpSkuIds.size() > 1) {
-				throw BusinessRuntimeException.getInstance("暂只支持优惠加购一件商品");
-			}
 			//是否满足关联
 			List<GoodsDiscountPlusPurchaseRelation> ds_relations = discountPlusPurchaseRelationMapper.selectList(Wrappers.lambdaQuery(GoodsDiscountPlusPurchaseRelation.class)
 					.eq(GoodsDiscountPlusPurchaseRelation::getSkuId, sku.getId())
@@ -395,6 +392,10 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		if (Constant.realGoodsType.contains(goodsDon.getType()) && !goodsDon.getId().equals(27l)) {
 			saveTransport(payRequest.getAddressId(), orderDon.getId());
 		}
+		//保存加购发货地址
+		if (orderDon.getIsDp() && payRequest.getAddressId() != null) {
+			redisService.set(RedisService.key.PLUS_GOODS_ADDRESS_KEY.getName() + orderDon.getId(), payRequest.getAddressId(), RedisService.key.PLUS_GOODS_ADDRESS_KEY.getTimeout());
+		}
 		if (orderDon.getStatus() == OrderDon.Status.noPayment) {
 			jobManager.addJob(EXPIRY_TIME, () -> {
 				closeOrder(orderDon.getId(), null);
@@ -608,11 +609,11 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			}
 		});
 
-		TASK_POOL.execute(()->{
+		TASK_POOL.execute(() -> {
 			try {
 				orderDonPostService.postData((order.getId()));
 			} catch (Exception e) {
-				log.error("回传错误 {}",StringUtil.getErrorText(e));
+				log.error("回传错误 {}", StringUtil.getErrorText(e));
 			}
 		});
 	}
@@ -959,11 +960,11 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			}
 		});
 
-		TASK_POOL.execute(()->{
+		TASK_POOL.execute(() -> {
 			try {
 				orderDonPostService.postData((orderDon.getId()));
 			} catch (Exception e) {
-				log.error("回传错误 {}",StringUtil.getErrorText(e));
+				log.error("回传错误 {}", StringUtil.getErrorText(e));
 			}
 		});
 	}
@@ -997,15 +998,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		if (address == null) {
 			throw new BusinessRuntimeException("请添加收货地址.");
 		}
-		OrderDonTransport transport = new OrderDonTransport();
-		transport.setOrderId(orderId);
-		transport.setReceiver(address.getReceiver());
-		transport.setPhone(address.getPhone());
-		transport.setProvince(address.getProvince());
-		transport.setCity(address.getCity());
-		transport.setDistrict(address.getDistrict());
-		transport.setAddress(address.getAddress());
-		orderDonTransportMapper.insert(transport);
+		saveTransportByAddress(address, orderId);
 	}
 
 	@Override
@@ -1129,6 +1122,9 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		if (orderDon.getMoney().compareTo(BigDecimal.ZERO) > 0) {
 			throw BusinessRuntimeException.getInstance("订单异常");
 		}
+		if (orderDon.getStatus() != OrderDon.Status.noPayment) {
+			throw BusinessRuntimeException.getInstance("订单状态已修改");
+		}
 		GoodsDon goodsDon = goodsDonMapper.selectById(orderDon.getGoodsId());
 		GoodsDonSku sku = goodsDonSkuMapper.selectById(orderDon.getSkuId());
 		orderDon.setStatus(goodsDon.getType() == 1 && goodsDon.getSecondType() == 2 ? OrderDon.Status.complete : OrderDon.Status.hasPayment);
@@ -1236,21 +1232,49 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 						try {
 							List<Long> plusSkuIds = Jsons.parseList(plusSkuIdsStr, Long.class);
 							//发送优惠加购 规格车票
-							List<Long> dis_relation_ids = new ArrayList<>();
-							plusSkuIds.forEach(plus_skuId -> {
+							List<Long> dis_relation_ids = null;
+							List<Long> plus_order_ids = null;
+							Address address = null;
+							for (Long plus_skuId : plusSkuIds) {
 								GoodsDonSku plus_sku = goodsDonSkuMapper.selectById(plus_skuId);
 								if (plus_sku == null) {
 									log.error("订单id:{}优惠加购规格已被删除 skuId:{},车票未发送", order.getId(), plus_skuId);
-									return;
+									continue;
+								}
+								GoodsDon plus_goods = goodsDonMapper.selectById(plus_sku.getGoodsId());
+								if (plus_goods.getType() != 1) {
+									log.info("orderId:{}存在非虚拟规格加购,添加{}发货信息", order.getId(), plus_goods.getTitle());
+									if (plus_order_ids == null) {
+										plus_order_ids = new ArrayList<>();
+									}
+									if (address == null) {
+										Long addressId = Long.parseLong(redisService.getStr(RedisService.key.PLUS_GOODS_ADDRESS_KEY.getName() + order.getId()));
+										if (addressId == null) {
+											log.error("用户userId{}缓存的收货地址addressId:{}不存在", order.getUserId(), addressId);
+											continue;
+										}
+										address = addressMapper.selectById(addressId);
+										if (address == null) {
+											log.error("用户userId{}收货地址addressId:{}已不存在", order.getUserId(), addressId);
+											continue;
+										}
+									}
+									//生成实物订单 0元实物订单
+									createRealOrderAndTransport(order.getUserId(), address, plus_goods, plus_sku, plus_order_ids);
+									continue;
+								}
+								if (dis_relation_ids == null) {
+									dis_relation_ids = new ArrayList<>();
 								}
 								GroupsRelation relationNoOrder = exchangeCodeService.getRelationNoOrder(plus_sku, order.getUserId());
 								dis_relation_ids.add(relationNoOrder.getId());
-							});
+							}
+							redisService.del(RedisService.key.PLUS_GOODS_ADDRESS_KEY.getName() + order.getId());
 							//保存订单关联优惠加购车票
 							orderDiscountPlusPurchaseSkuRelationMapper.update(null, Wrappers.lambdaUpdate(OrderDiscountPlusPurchaseSkuRelation.class)
-									.set(OrderDiscountPlusPurchaseSkuRelation::getRelationIds, dis_relation_ids.toString())
-									.eq(OrderDiscountPlusPurchaseSkuRelation::getOrderId, order.getId())
-									.isNull(OrderDiscountPlusPurchaseSkuRelation::getRelationIds));
+									.set(CollUtil.isNotEmpty(dis_relation_ids), OrderDiscountPlusPurchaseSkuRelation::getRelationIds, Jsons.toJson(dis_relation_ids))
+									.set(CollUtil.isNotEmpty(plus_order_ids), OrderDiscountPlusPurchaseSkuRelation::getPlusOrderIds, Jsons.toJson(plus_order_ids))
+									.eq(OrderDiscountPlusPurchaseSkuRelation::getOrderId, order.getId()));
 						} catch (Exception e) {
 						}
 					}
@@ -1957,14 +1981,14 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			relation = groupRelationFrontService.getSimilarExpiredGroupRelation(sku.getId(), sku.getDays(), sku.getMonths(), null);
 			if (relation == null) {
 				//TODO 如果没指定座位,等待逻辑确认
-				GroupsTrips groups = groupsMapper.selectOne( Wrappers.lambdaQuery(GroupsTrips.class)
+				GroupsTrips groups = groupsMapper.selectOne(Wrappers.lambdaQuery(GroupsTrips.class)
 						.eq(GroupsTrips::getSkuId, sku.getId())
 						.gt(GroupsTrips::getAvailableNum, 0).last("limit 1")
 						.eq(GroupsTrips::getStatus, GroupsTrips.Status.validity)
 						.orderByAsc(GroupsTrips::getAvailableNum));
 				//待发车
 				if (groups == null) {
-					groups = groupsMapper.selectOne( Wrappers.lambdaQuery(GroupsTrips.class)
+					groups = groupsMapper.selectOne(Wrappers.lambdaQuery(GroupsTrips.class)
 							.eq(GroupsTrips::getSkuId, sku.getId())
 							.gt(GroupsTrips::getAvailableNum, 0).last("limit 1")
 							.eq(GroupsTrips::getStatus, GroupsTrips.Status.waiting)
@@ -2072,7 +2096,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 
 	@Override
-	public void orderNotify(OrderDon orderDon){
+	public void orderNotify(OrderDon orderDon) {
 		Long goodsId = orderDon.getGoodsId();
 		if (orderDon.getIsNoLogin()) {
 			orderDon.setExCode(exchangeCodeService.getExCode(goodsId, orderDon.getSkuId(), 1));
@@ -2133,4 +2157,36 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			}
 		});
 	}
+
+	/**
+	 * 生成实物订单
+	 */
+	public void createRealOrderAndTransport(Long userId, Address address, GoodsDon goodsDon, GoodsDonSku sku, List<Long> plusOrderIds) {
+		OrderDon orderDon = new OrderDon();
+		orderDon.setUserId(userId);
+		orderDon.setRelationId(0l);
+		orderDon.setMoney(BigDecimal.ZERO);
+		orderDon.setIsDp(true);
+		orderDon.setSkuId(sku.getId());
+		orderDon.setGoodsId(goodsDon.getId());
+		orderDon.setPayTitle(goodsDon.getTitle() + sku.getSpecVal());
+		orderDon.setStatus(OrderDon.Status.hasPayment);
+		orderDonMapper.insert(orderDon);
+		//处理收货地址
+		saveTransportByAddress(address, orderDon.getId());
+
+		plusOrderIds.add(orderDon.getId());
+	}
+
+	public void saveTransportByAddress(Address address,Long orderId) {
+		OrderDonTransport transport = new OrderDonTransport();
+		transport.setOrderId(orderId);
+		transport.setReceiver(address.getReceiver());
+		transport.setPhone(address.getPhone());
+		transport.setProvince(address.getProvince());
+		transport.setCity(address.getCity());
+		transport.setDistrict(address.getDistrict());
+		transport.setAddress(address.getAddress());
+		orderDonTransportMapper.insert(transport);
+	}
 }

+ 2 - 0
netflix-service/src/main/java/com/cyksj/service/order/impl/UserRealOrderBenefitsImpl.java

@@ -65,6 +65,7 @@ public class UserRealOrderBenefitsImpl implements UserRealOrderBenefitsService {
 			Long skuId = sku.getId();
 			sku = goodsDonSkuMapper.selectById(skuId);
 			Long goodsId = sku.getGoodsId();
+			log.info("开始发放实物订单orderId:{}权益规格:{}", orderId, skuId);
 //			List<GroupsRelationView> relationViewList = beanSearcher.searchAll(GroupsRelationView.class, MapUtils.builder()
 //					.field(GroupsRelationView::getGoodsId, goodsId)
 //					.field(GroupsRelationView::getUserId, userId)
@@ -86,6 +87,7 @@ public class UserRealOrderBenefitsImpl implements UserRealOrderBenefitsService {
 			} else if (relationViewList.size() == 1) {
 				//若有且只有一张增加时长
 				GroupsRelationView groupsRelationView = relationViewList.get(0);
+				log.info("存在对应规格:{}的车票,增加车票:relationId:{}时长", sku.getId(), groupsRelationView.getId());
 				Date expiryTime = groupsRelationView.getExpiryTime();
 				if (expiryTime == null) {
 					throw BusinessRuntimeException.getInstance("用户存在未发车的车票,请发车后再进行发货");