zoujiajian пре 3 година
родитељ
комит
8e2de8faa5
16 измењених фајлова са 505 додато и 194 уклоњено
  1. 3 0
      netflix-dao/src/main/java/com/cyksj/mapper/OrderDonMapper.java
  2. 10 0
      netflix-dao/src/main/java/com/cyksj/model/entity/OrderDon.java
  3. 6 0
      netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderDonView.java
  4. 2 0
      netflix-dao/src/main/java/com/cyksj/model/request/OrderPayRequest.java
  5. 95 0
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonPopularizeView.java
  6. 12 0
      netflix-dao/src/main/resources/mapper/OrderDonMapper.xml
  7. 5 0
      netflix-service/src/main/java/com/cyksj/service/exchange/ExchangeCodeService.java
  8. 60 26
      netflix-service/src/main/java/com/cyksj/service/exchange/impl/ExchangeCodeServiceImpl.java
  9. 1 10
      netflix-service/src/main/java/com/cyksj/service/market/impl/MarketFrontServiceImpl.java
  10. 1 6
      netflix-service/src/main/java/com/cyksj/service/order/OrderDonService.java
  11. 146 125
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java
  12. 19 0
      netflix-service/src/main/java/com/cyksj/service/template/TemplateCommonService.java
  13. 57 0
      netflix-service/src/main/java/com/cyksj/service/template/impl/TemplateCommonServiceImpl.java
  14. 73 3
      netflix-web/src/main/java/com/cyksj/web/controller/goods/GoodsDonController.java
  15. 0 14
      netflix-web/src/main/java/com/cyksj/web/controller/manage/statistics/StatisticsDataController.java
  16. 15 10
      netflix-web/src/main/java/com/cyksj/web/controller/payment/OrderController.java

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

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.cyksj.model.entity.OrderDon;
 import com.cyksj.model.entity.RealGoodsInterestUser;
 import com.cyksj.model.excel.ExcelOrderDonInfo;
+import com.cyksj.model.manage.views.OrderDonView;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.Date;
@@ -25,4 +26,6 @@ public interface OrderDonMapper extends BaseMapper<OrderDon> {
 	Integer updateHasPaymentInterestRealGoods();
 
 	void updateHasPaymentInterestRealGoodsPayTime();
+
+	OrderDonView getOrderDetail(Long orderId);
 }

+ 10 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/OrderDon.java

@@ -111,6 +111,16 @@ public class OrderDon extends BaseEntity implements Serializable {
      */
     private Long popularizeId;
 
+    /**
+     * 是否是推广未登录用户购买订单
+     */
+    private Boolean isNoLogin;
+
+    /**
+     * 关联兑换码
+     */
+    private String exCode;
+
     public enum Status {
         /**
          * 订单状态

+ 6 - 0
netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderDonView.java

@@ -99,6 +99,12 @@ public class OrderDonView {
     @DbField("cp.id")
     private Long popularizeId;
 
+    @DbField("o.pay_time")
+    private Date payTime;
+
+    @DbField("o.ex_code")
+    private String exCode;
+
     @DbIgnore
     private OrderDonWaybill waybill;
 

+ 2 - 0
netflix-dao/src/main/java/com/cyksj/model/request/OrderPayRequest.java

@@ -71,4 +71,6 @@ public class OrderPayRequest {
      * 渠道链接id
      */
     private Long popularizeId;
+
+    private Boolean isNoLogin;
 }

+ 95 - 0
netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonPopularizeView.java

@@ -0,0 +1,95 @@
+package com.cyksj.model.views;
+
+import com.cyksj.model.entity.GoodsDonSku;
+import com.cyksj.model.entity.GoodsDonSpec;
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/*
+ *项目名: netflix
+ *文件名: GoodsDonPopularizeView
+ *创建者: JavaZou
+ *创建时间:2023/1/10 13:42
+ */
+@Getter
+@Setter
+@SearchBean(tables = "goods_don g")
+public class GoodsDonPopularizeView {
+	@DbField("g.id")
+	private Long id;
+
+	/**
+	 * 商品名称
+	 */
+	@DbField("g.title")
+	private String title;
+
+	/**
+	 * 标签
+	 */
+	@DbField("g.tags")
+	private String tags;
+
+	/**
+	 * 缩略图
+	 */
+	@DbField("g.logo")
+	private String logo;
+
+	/**
+	 * 背景图
+	 */
+	@DbField("g.img")
+	private String img;
+
+	/**
+	 * 描述
+	 */
+	@DbField("g.remark")
+	private String remark;
+
+	@DbField("g.type")
+	private Integer type;
+
+	/**
+	 * true 上架 / false 下架
+	 */
+	@DbField("g.status")
+	private Boolean status;
+
+	/**
+	 * true 存在 / false 删除
+	 */
+	@DbField("g.deleted")
+	private Boolean deleted;
+
+	/**
+	 * 最低规格价格
+	 */
+	@DbField("select ifnull(min(price),0) from goods_don_sku gdk where gdk.status is true and gdk.goods_id = g.id")
+	private BigDecimal price;
+
+	/**
+	 * 已售
+	 */
+	@DbField("select count(*) from order_don od where od.status not in ('close','noPayment') and od.goods_id = g.id")
+	private Integer sold;
+
+	/**
+	 * 购买通知信息
+	 */
+	@DbIgnore
+	private String notifyMsg;
+
+	@DbIgnore
+	private List<GoodsDonSku> skuList;
+
+	@DbIgnore
+	private GoodsDonSpec specs;
+}

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

@@ -79,4 +79,16 @@
         where not EXISTS(
                 select id from `order_don` where user_id = s.user_id and goods_id = s.goods_id and status !='close')
     </select>
+
+    <select id="getOrderDetail" resultType="com.cyksj.model.manage.views.OrderDonView">
+        select od.*,
+               gdk.spec_val,
+               gd.title,
+               gd.logo,
+               gd.type as goodsDonType
+        from `order_don` od
+                 left join `goods_don_sku` gdk on gdk.id = od.sku_id
+                 left join `goods_don` gd on gd.id = od.goods_id
+        where od.id = #{orderId}
+    </select>
 </mapper>

+ 5 - 0
netflix-service/src/main/java/com/cyksj/service/exchange/ExchangeCodeService.java

@@ -25,4 +25,9 @@ public interface ExchangeCodeService extends IService<ExchangeCode> {
 	 * 兑换码兑换
 	 */
 	Result<String> getTicketByExchangeCode(ExchangeCodeTicket exchangeCodeTicket, Long userId);
+
+	/**
+	 * 获取兑换码
+	 */
+	String getExCode(Long goodsId, Long skuId, Integer type);
 }

+ 60 - 26
netflix-service/src/main/java/com/cyksj/service/exchange/impl/ExchangeCodeServiceImpl.java

@@ -23,7 +23,8 @@ import com.cyksj.model.request.ExchangeCodeReq;
 import com.cyksj.model.request.ExchangeCodeTicket;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.exchange.ExchangeCodeService;
-import com.cyksj.service.order.OrderDonService;
+import com.cyksj.service.template.TemplateCommonService;
+import com.cyksj.task.StatisticsDataScheduler;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
@@ -64,14 +65,14 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 
 	private final OrderDonMapper orderDonMapper;
 
-	private final OrderDonService orderDonService;
-
 	private static final GlobalThreadPoolTaskExecutor THREAD_POOL_TASK_EXECUTOR = GlobalThreadPoolTaskExecutor.getInstance();
 
 	private final CustomerServiceMapper customerServiceMapper;
 
 	private final LuckyDrawRecordMapper luckyDrawRecordMapper;
 
+	private final TemplateCommonService templateCommonService;
+
 	@Override
 	@Transactional(rollbackFor = Throwable.class)
 	public List<ExcelExchangeCodeData> createExchangeCode(ExchangeCodeReq exchangeCodeReq) {
@@ -138,8 +139,17 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 		if (update != 1) {
 			throw BusinessRuntimeException.getInstance("该兑换码已使用");
 		}
+		//是否是推广用户未登录订单关联的兑换码
+		OrderDon orderDon = orderDonMapper.selectOne(Wrappers.lambdaQuery(OrderDon.class)
+				.eq(OrderDon::getIsNoLogin, true)
+				.eq(OrderDon::getExCode, exchangeCode.getCode())
+				.notIn(OrderDon::getStatus, StatisticsDataScheduler.noOrderStatus)
+				.last("limit 1"));
+		if (orderDon.getStatus() == OrderDon.Status.refund) {
+			throw BusinessRuntimeException.getInstance("您的订单已退款,无法使用该兑换码");
+		}
 		//生成车票订单
-		getGroupTripsTicket(goodsDonSkuMapper.selectById(exchangeCode.getSkuId()), userId);
+		getGroupTripsTicket(goodsDonSkuMapper.selectById(exchangeCode.getSkuId()), userId, orderDon);
 		log.info("用户:{}通过兑换码:{}兑换成功", userId, exchangeCodeTicket.getCode());
 		if (exchangeCode.getType() == 1) {
 			luckyDrawRecordMapper.updateExCodeStatus(userId, exchangeCode.getCode());
@@ -147,6 +157,23 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 		return GatewayResponse.SUCCESS.newBuilder().toResult("兑换成功");
 	}
 
+	@Override
+	public String getExCode(Long goodsId, Long skuId, Integer type) {
+		ExchangeCodeReq exchangeCodeReq = new ExchangeCodeReq();
+		exchangeCodeReq.setNumber(1);
+		exchangeCodeReq.setGoodsId(goodsId);
+		exchangeCodeReq.setSkuId(skuId);
+		if (type != null) {
+			exchangeCodeReq.setType(type);
+		}
+		try {
+			List<ExcelExchangeCodeData> exchangeCodes = this.createExchangeCode(exchangeCodeReq);
+			return exchangeCodes.get(0).getCode();
+		} catch (Exception e) {
+			return null;
+		}
+	}
+
 	/**
 	 * 根据平台id获取填充的字符串
 	 */
@@ -179,7 +206,7 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 	/**
 	 * 获取车位
 	 */
-	private void getGroupTripsTicket(GoodsDonSku sku, Long userId) {
+	private void getGroupTripsTicket(GoodsDonSku sku, Long userId, OrderDon exCodeOrderDon) {
 		if (sku == null) {
 			throw BusinessRuntimeException.getInstance("规格不存在,请联系客服");
 		}
@@ -216,7 +243,7 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 			setRelation(relation.getId(), userId);
 		} catch (Exception e) {
 			//失败重新给他分配车位
-			getGroupTripsTicket(sku, userId);
+			getGroupTripsTicket(sku, userId, exCodeOrderDon);
 		}
 		relation.setUserId(userId);
 		relation.setStatus(GroupsRelation.Status.validity);
@@ -227,31 +254,38 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 		relation.setStartTime(relation.getStartTime() == null ? new Date() : null);
 		groupsRelationMapper.updateById(relation);
 		Long relationId = relation.getId();
-
-		/* 生成订单 */
-		String donNo = SEQUENCE.nextId().toString();
-		OrderDon orderDon = new OrderDon();
-		orderDon.setOrderNo(donNo);
-		orderDon.setOpenId(user.getOpenId());
-		orderDon.setMoney(BigDecimal.ZERO);
-		orderDon.setSkuId(sku.getId());
-		orderDon.setRelationId(relationId);
-		//默认数量为1
-		orderDon.setNum(1);
-		orderDon.setGoodsId(sku.getGoodsId());
-		orderDon.setStatus(goodsDon.getType() == 1 && goodsDon.getSecondType() == 2 ? OrderDon.Status.complete : OrderDon.Status.hasPayment);
-		//兑换码兑换
-		orderDon.setType(OrderDon.Type.EX_CODE);
-		orderDon.setUserId(user.getId());
-		orderDonMapper.insert(orderDon);
-
+		OrderDon orderDon;
+		if (exCodeOrderDon != null) {
+			orderDon = exCodeOrderDon;
+			orderDon.setRelationId(relationId);
+			orderDon.setUserId(userId);
+			orderDon.setStatus(goodsDon.getType() == 1 && goodsDon.getSecondType() == 2 ? OrderDon.Status.complete : OrderDon.Status.hasPayment);
+			orderDonMapper.updateById(orderDon);
+		} else {
+			/* 生成订单 */
+			String donNo = SEQUENCE.nextId().toString();
+			orderDon = new OrderDon();
+			orderDon.setOrderNo(donNo);
+			orderDon.setOpenId(user.getOpenId());
+			orderDon.setMoney(BigDecimal.ZERO);
+			orderDon.setSkuId(sku.getId());
+			orderDon.setRelationId(relationId);
+			//默认数量为1
+			orderDon.setNum(1);
+			orderDon.setGoodsId(sku.getGoodsId());
+			orderDon.setStatus(goodsDon.getType() == 1 && goodsDon.getSecondType() == 2 ? OrderDon.Status.complete : OrderDon.Status.hasPayment);
+			//兑换码兑换
+			orderDon.setType(OrderDon.Type.EX_CODE);
+			orderDon.setUserId(user.getId());
+			orderDonMapper.insert(orderDon);
+		}
 		if (StrUtil.isNotEmpty(user.getOpenId())) {
 			//发送模板消息
 			THREAD_POOL_TASK_EXECUTOR.execute(() -> {
 				try {
 					if (StrUtil.isNotEmpty(user.getOpenId())) {
 						log.info("用户{}兑换车位成功,发送新订单模板消息", user.getId());
-						orderDonService.newOderSendMsgByType(orderDon, goodsDon, sku, user,user.getOpenId());
+						templateCommonService.newOderSendMsgByType(orderDon, goodsDon, sku, user,user.getOpenId());
 					}
 				} catch (Exception e) {
 					log.info("用户{}兑换车位成功,发送消息失败:{}", user.getId(), e);
@@ -265,7 +299,7 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 				List<CustomerService> customerServices = customerServiceMapper.selectList(null);
 				for (CustomerService customerService : customerServices) {
 					log.info("向客服{}发送用户兑换码兑换车票消息通知..", customerService.getNickName());
-					orderDonService.newOderSendMsgByType(orderDon, goodsDon, sku, user, customerService.getOpenId());
+					templateCommonService.newOderSendMsgByType(orderDon, goodsDon, sku, user, customerService.getOpenId());
 				}
 			} catch (Exception e) {
 				log.error("向客服发送用户{}兑换码兑换车票成功,发送消息失败:{}", user.getId(), e);

+ 1 - 10
netflix-service/src/main/java/com/cyksj/service/market/impl/MarketFrontServiceImpl.java

@@ -26,8 +26,6 @@ import com.cyksj.mapper.market.task.TaskFollowPlatVerifyMapper;
 import com.cyksj.mapper.market.task.TaskUserCompleteRecordMapper;
 import com.cyksj.mapper.market.task.UserBindPhoneMapper;
 import com.cyksj.model.entity.*;
-import com.cyksj.model.excel.ExcelExchangeCodeData;
-import com.cyksj.model.request.ExchangeCodeReq;
 import com.cyksj.model.request.LuckyDrawReq;
 import com.cyksj.model.request.TaskFollowReq;
 import com.cyksj.model.views.LuckyDrawView;
@@ -197,14 +195,7 @@ public class MarketFrontServiceImpl implements MarketFrontService {
 			couponCommonService.sendCouponToUser(userId, luckyDraw.getCouponId(), null, null, null, CouponUser.Channel.lottery);
 			record.setStatus(LuckyDrawRecord.Status.success);
 		} else if (luckyDraw.getType() == LuckyDraw.Type.virtualGoods) {
-			ExchangeCodeReq exchangeCodeReq = new ExchangeCodeReq();
-			exchangeCodeReq.setGoodsId(luckyDraw.getGoodsId());
-			exchangeCodeReq.setSkuId(luckyDraw.getSkuId());
-			exchangeCodeReq.setNumber(1);
-			exchangeCodeReq.setType(1);
-			List<ExcelExchangeCodeData> exchangeCode = exchangeCodeService.createExchangeCode(exchangeCodeReq);
-			ExcelExchangeCodeData excelExchangeCodeData = exchangeCode.get(0);
-			record.setExCode(excelExchangeCodeData.getCode());
+			record.setExCode(exchangeCodeService.getExCode(luckyDraw.getGoodsId(), luckyDraw.getSkuId(), 1));
 			record.setStatus(LuckyDrawRecord.Status.pending);
 		} else if (luckyDraw.getType() == LuckyDraw.Type.realGoods) {
 			record.setStatus(LuckyDrawRecord.Status.pending);

+ 1 - 6
netflix-service/src/main/java/com/cyksj/service/order/OrderDonService.java

@@ -44,7 +44,7 @@ public interface OrderDonService extends IService<OrderDon> {
 
     OrderDon renewal(OrderPayRequest request) throws Exception;
 
-    OrderDonView getDetail(Long orderId, long userId);
+    OrderDonView getDetail(Long orderId, Long userId);
 
 	List<OrderDon> getAppleOneOrderDons(String appleOne, List<Long> skuIds,List<Long> goodsIds, List<String> noOrderStatus, Date yesZeroDate, Date thisZeroDate);
 
@@ -73,11 +73,6 @@ public interface OrderDonService extends IService<OrderDon> {
      */
     Result<String> zfbRefund(ZfbOrderRefundReq zfbOrderRefundReq) throws Exception;
 
-    /**
-     * 发送新订单模板消息
-     */
-	void newOderSendMsgByType(OrderDon order, GoodsDon goodsDon, GoodsDonSku sku, User user,String toPeople) throws Exception;
-
     List<RealGoodsInterestUser> selectNoPaymentRealGoods();
 
     Integer updateHasPaymentInterestRealGoods();

+ 146 - 125
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -52,14 +52,17 @@ import com.cyksj.model.views.CouponNewUserView;
 import com.cyksj.model.views.CouponUserView;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.coupon.CouponFontService;
+import com.cyksj.service.exchange.ExchangeCodeService;
 import com.cyksj.service.mange.stock.GoodsDonStockService;
 import com.cyksj.service.market.task.TaskService;
 import com.cyksj.service.order.OrderDonService;
+import com.cyksj.service.template.TemplateCommonService;
 import com.cyksj.service.wechat.WeChatService;
 import com.cyksj.task.JobManager;
 import com.cyksj.task.OrderCustomerHandleScheduler;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.param.Operator;
+import com.ejlchina.searcher.util.MapBuilder;
 import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -159,6 +162,10 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final CustomerServiceRenewOrderRecordMapper customerServiceRenewOrderRecordMapper;
 
+	private final ExchangeCodeService exchangeCodeService;
+
+	private final TemplateCommonService templateCommonService;
+
 	@Transactional(rollbackFor = Throwable.class)
 	@Override
 	public OrderDon submit(OrderPayRequest payRequest) throws Exception {
@@ -168,67 +175,77 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			//记录优惠券使用状态
 			couponUser = couponStatusRecord(payRequest.getCouponExCode(), payRequest.getCouponId(), payRequest.getUserId());
 		}
-		User user = userMapper.selectById(payRequest.getUserId());
 		GoodsDonSku sku = goodsDonSkuMapper.selectById(payRequest.getSkuId());
 		GoodsDon goodsDon = goodsDonMapper.selectById(sku.getGoodsId());
 		Boolean isNew = false;
 		if (goodsDon == null || !goodsDon.getStatus()) {
 			throw new BusinessRuntimeException("商品已下架");
 		}
-		String payOpenId = user.getOpenId();
-
+		Boolean isNoLogin = payRequest.getIsNoLogin();
+		User user;
+		String payOpenId = null;
 		Long relationId = 0L;
 
-		if (goodsDon.getType() == 1) {
-			GroupsRelation relation = null;
-			//锁定座位
-			if (payRequest.getRelationId() != null && payRequest.getRelationId() > 0) {
-				relation = groupsRelationMapper.selectById(payRequest.getRelationId());
-				if (relation == null) {
-					throw new BusinessRuntimeException(GROUP_INDEX_NOT_FIND.getCode(), GROUP_INDEX_NOT_FIND.getMsg());
-				}
-				if (relation.getUserId() != null && relation.getUserId() > 0L) {
-					throw new BusinessRuntimeException(GROUP_INDEX_ALREADY_BE_USER.getCode(), GROUP_INDEX_ALREADY_BE_USER.getMsg());
-				}
-
-			} else {
-				//TODO 如果没指定座位,等待逻辑确认
-				GroupsTrips groups = groupsMapper.selectOne(Wrappers.lambdaQuery(GroupsTrips.class).eq(GroupsTrips::getSkuId, payRequest.getSkuId()).gt(GroupsTrips::getAvailableNum, 0).last("limit 1").orderByAsc(GroupsTrips::getAvailableNum));
-				if (groups == null) {
-					relation = createNewGroupsTrips(sku, true);
-					isNew = true;
-				} else {
-					//寻找快满编车队进行占座
-					relation = groupsRelationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class)
-							.eq(GroupsRelation::getGroupsId, groups.getId())
-							.eq(GroupsRelation::getStatus, "none")
-							.eq(GroupsRelation::getUserId, 0)
-							.orderByAsc(GroupsRelation::getNum)
-							.last("limit 1")
-					);
+		if (isNoLogin != null && isNoLogin) {
+			user = new User();
+			user.setId(0l);
+		} else {
+			user = userMapper.selectById(payRequest.getUserId());
+			payOpenId = user.getOpenId();
+			if (goodsDon.getType() == 1) {
+				GroupsRelation relation = null;
+				//锁定座位
+				if (payRequest.getRelationId() != null && payRequest.getRelationId() > 0) {
+					relation = groupsRelationMapper.selectById(payRequest.getRelationId());
 					if (relation == null) {
 						throw new BusinessRuntimeException(GROUP_INDEX_NOT_FIND.getCode(), GROUP_INDEX_NOT_FIND.getMsg());
 					}
+					if (relation.getUserId() != null && relation.getUserId() > 0L) {
+						throw new BusinessRuntimeException(GROUP_INDEX_ALREADY_BE_USER.getCode(), GROUP_INDEX_ALREADY_BE_USER.getMsg());
+					}
+
+				} else {
+					//TODO 如果没指定座位,等待逻辑确认
+					GroupsTrips groups = groupsMapper.selectOne(Wrappers.lambdaQuery(GroupsTrips.class).eq(GroupsTrips::getSkuId, payRequest.getSkuId()).gt(GroupsTrips::getAvailableNum, 0).last("limit 1").orderByAsc(GroupsTrips::getAvailableNum));
+					if (groups == null) {
+						relation = createNewGroupsTrips(sku, true);
+						isNew = true;
+					} else {
+						//寻找快满编车队进行占座
+						relation = groupsRelationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class)
+								.eq(GroupsRelation::getGroupsId, groups.getId())
+								.eq(GroupsRelation::getStatus, "none")
+								.eq(GroupsRelation::getUserId, 0)
+								.orderByAsc(GroupsRelation::getNum)
+								.last("limit 1")
+						);
+						if (relation == null) {
+							throw new BusinessRuntimeException(GROUP_INDEX_NOT_FIND.getCode(), GROUP_INDEX_NOT_FIND.getMsg());
+						}
+					}
 				}
-			}
 
-            //锁定座位
-            setRelation(relation.getId(), payRequest.getUserId(), goodsDon.getId());
-            relation.setUserId(user.getId());
-            relation.setStatus(GroupsRelation.Status.locking);
-            groupsRelationMapper.updateById(relation);
-            relationId = relation.getId();
-        }else {
+				//锁定座位
+				setRelation(relation.getId(), user.getId(), goodsDon.getId());
+				relation.setUserId(user.getId());
+				relation.setStatus(GroupsRelation.Status.locking);
+				groupsRelationMapper.updateById(relation);
+				relationId = relation.getId();
+			}else {
 
+			}
 		}
 
 		/* 生成订单 */
 		String donNo = SEQUENCE.nextId().toString();
 		OrderDon orderDon = new OrderDon();
+		if (isNoLogin != null && isNoLogin) {
+			orderDon.setIsNoLogin(true);
+		}
 		orderDon.setOrderNo(donNo);
 		orderDon.setOpenId(payOpenId);
 		if (sku.getPrice() != null && payRequest.getDonMoney().compareTo(sku.getPrice()) < 0) {
-			throw BusinessRuntimeException.getInstance("车位所付金额错误");
+			throw BusinessRuntimeException.getInstance("付金额错误");
 		}
 		orderDon.setMoney(payRequest.getDonMoney());
 		orderDon.setRealMoney(payRequest.getDonMoney());
@@ -261,14 +278,16 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		orderDon.setStatus(OrderDon.Status.noPayment);
 		orderDon.setUserId(user.getId());
 		orderDon.setType(OrderDon.Type.getType(payRequest.getType()));
-		//虚拟商品订单,是否是分销订单
-		if (goodsDon.getType() == 1) {
-			UserDistributeShared userDistributeShared = userDistributeSharedMapper.selectOne(Wrappers.lambdaQuery(UserDistributeShared.class).eq(UserDistributeShared::getUserId, user.getId()).last("limit 1"));
-			if (userDistributeShared != null) {
-				orderDon.setIsDistribute(true);
-				UserDistribute userDistribute = userDistributeMapper.selectOne(Wrappers.lambdaQuery(UserDistribute.class).eq(UserDistribute::getUserId, userDistributeShared.getSharedId()));
-				if (userDistribute != null) {
-					orderDon.setIsFixedDistribute(true);
+		if (isNoLogin == null || !isNoLogin) {
+			//虚拟商品订单,是否是分销订单
+			if (goodsDon.getType() == 1) {
+				UserDistributeShared userDistributeShared = userDistributeSharedMapper.selectOne(Wrappers.lambdaQuery(UserDistributeShared.class).eq(UserDistributeShared::getUserId, user.getId()).last("limit 1"));
+				if (userDistributeShared != null) {
+					orderDon.setIsDistribute(true);
+					UserDistribute userDistribute = userDistributeMapper.selectOne(Wrappers.lambdaQuery(UserDistribute.class).eq(UserDistribute::getUserId, userDistributeShared.getSharedId()));
+					if (userDistribute != null) {
+						orderDon.setIsFixedDistribute(true);
+					}
 				}
 			}
 		}
@@ -320,6 +339,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		if (shopConfig != null) {
 			shopId = shopConfig.getAppId();
 		}
+		orderDon.setType(OrderDon.Type.ALI_PAY);
 		orderDon.setShopId(shopId);
 		this.updateById(orderDon);
 		H5JsPayParams params = weChatService.getJsPayParams(
@@ -396,9 +416,10 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		if (null == order) {
 			throw BusinessRuntimeException.getInstance("订单不存在.");
 		}
+		String appId = map.get("mch_id");
 
 		// 校验签名
-		boolean f = weChatService.checkSignWithMd5(map, shopConfigMapper.getByAppId(Optional.ofNullable(order.getShopId()).orElse(ShopConfig.WX_DEFAULT_APP_ID)).getSecret());
+		boolean f = weChatService.checkSignWithMd5(map, shopConfigMapper.getByAppId(appId).getSecret());
 		if (!f) {
 			log.error("回调数据:{}", map);
 			throw BusinessRuntimeException.getInstance("支付成功回调, 校验签名失败.");
@@ -419,53 +440,39 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		order.setStatus(goodsDon.getType() == 1 && goodsDon.getSecondType() == 2 ? OrderDon.Status.complete : OrderDon.Status.hasPayment);
 
 		order.setPayTime(DateUtil.parse(map.get("time_end"), "yyyyMMddHHmmss"));
+		order.setShopId(appId);
 
+		if (order.getIsNoLogin()) {
+			order.setExCode(exchangeCodeService.getExCode(order.getGoodsId(), order.getSkuId(), 1));
+		}
 		if (StringUtils.isBlank(order.getOpenId())) {
 			order.setOpenId(map.get("openid"));
 		}
-		updateCarParkAndSendMsg(goodsDon, sku, order);
 		order.setType(OrderDon.Type.WeChat);
-		if (order.getMoney().compareTo(BigDecimal.ZERO) > 0 && order.getIsDistribute()) {
-			TASK_POOL.execute(() -> distributeWaitingSendPointsRecord(order));
+		if (order.getIsNoLogin()) {
+			order.setStatus(OrderDon.Status.hasPayment);
+		}
+		if (!order.getIsNoLogin()) {
+			updateCarParkAndSendMsg(goodsDon, sku, order);
+			if (order.getMoney().compareTo(BigDecimal.ZERO) > 0 && order.getIsDistribute()) {
+				TASK_POOL.execute(() -> distributeWaitingSendPointsRecord(order));
+			}
+			if (goodsDon.getType() == 1) {
+				//无车队,新增车队
+				checkNoGroupsTripsAndSendMsg(sku, order);
+			}
+			//完成任务
+			TASK_POOL.execute(() -> {
+				TaskType taskType = taskTypeMapper.selectOne(Wrappers.lambdaQuery(TaskType.class)
+						.eq(TaskType::getName, TaskTypeEnum.yh_order.getDesc()).last("limit 1"));
+				taskService.completeTask(taskType, order.getUserId());
+			});
+			//客服续费订单
+			handleServiceRenewOrder(order);
 		}
 		this.updateById(order);
-		if (goodsDon.getType() == 1) {
-			//无车队,新增车队
-			checkNoGroupsTripsAndSendMsg(sku, order);
-		}
-		//客服续费订单
-		handleServiceRenewOrder(order);
-		//完成任务
-		TASK_POOL.execute(() -> {
-			TaskType taskType = taskTypeMapper.selectOne(Wrappers.lambdaQuery(TaskType.class)
-					.eq(TaskType::getName, TaskTypeEnum.yh_order.getDesc()).last("limit 1"));
-			taskService.completeTask(taskType, order.getUserId());
-		});
-	}
 
-    @Override
-    public void newOderSendMsgByType(OrderDon order, GoodsDon goodsDon, GoodsDonSku sku, User user, String toPeople) throws Exception {
-        TemplateEnum templateEnum = null;
-        if (EnvCommonService.active.equals(envCommonService.getEnv())) {
-            templateEnum = TemplateEnum.NEW_ORDER_ENV_TEMPLATE;
-        }else {
-            templateEnum = TemplateEnum.NEW_ORDER_PRD_TEMPLATE;
-        }
-        WxMpTemplateMessage templateMessage = new WxMpTemplateMessage()
-                .setToUser(toPeople)
-                .setTemplateId(templateEnum.getTemplateId())
-                //TODO
-                .setUrl(" ");
-        WxMpTemplateMessage.TemplateData data = templateMessage.getData();
-        data.setFirst(new WxMpTemplateData("新订单通知!"));
-        data.setKeyword1(new WxMpTemplateData(order.getOrderNo()));
-        data.setKeyword2(new WxMpTemplateData(String.format("%s,%s", goodsDon.getTitle(), sku.getSpecVal())));
-        data.setKeyword3(new WxMpTemplateData(user.getNickname()));
-        data.setKeyword4(new WxMpTemplateData(order.getMoney().divide(BigDecimal.valueOf(100)).toString()));
-        data.setKeyword5(new WxMpTemplateData(DateUtil.format(order.getCreatedTime(), "yyyy-MM-dd HH:mm:ss")));
-        data.setRemark(new WxMpTemplateData("点击查看详情"));
-        weChatService.sendTemplateMessage(weChatService.getAccessToken(), Jsons.toJson(templateMessage));
-    }
+	}
 
 	@Override
 	public List<RealGoodsInterestUser> selectNoPaymentRealGoods() {
@@ -530,7 +537,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 	private void emptySendMsgNotify(OrderDon orderDon, String toPeople) throws Exception {
 		TemplateEnum templateEnum = null;
 		if (EnvCommonService.active.equals(envCommonService.getEnv())) {
-			templateEnum = TemplateEnum.EMPTY_ENV_TEMPLATE;
+			return;
 		} else {
 			templateEnum = TemplateEnum.EMPTY_PRD_TEMPLATE;
 		}
@@ -647,13 +654,14 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 	}
 
 	@Override
-	public OrderDonView getDetail(Long orderId, long userId) {
-
-		OrderDonView detail = beanSearcher.searchFirst(OrderDonView.class, MapUtils.builder()
-				.field(OrderDonView::getUserId, userId)
+	public OrderDonView getDetail(Long orderId, Long userId) {
+		MapBuilder builder = MapUtils.builder()
 				.field(OrderDonView::getId, orderId)
-				.orderBy(OrderDonView::getId).desc()
-				.build());
+				.orderBy(OrderDonView::getId).desc();
+		if (userId != null) {
+			builder.field(OrderDonView::getUserId, userId);
+		}
+		OrderDonView detail = beanSearcher.searchFirst(OrderDonView.class, builder.build());
 
 		detail.setTransport(transportMapper.selectOne(Wrappers.lambdaQuery(OrderDonTransport.class).eq(OrderDonTransport::getOrderId, detail.getId()).last(" limit 1")));
 		detail.setWaybill(waybillMapper.selectOne(Wrappers.lambdaQuery(OrderDonWaybill.class).eq(OrderDonWaybill::getOrderId, detail.getId()).last(" limit 1")));
@@ -668,13 +676,15 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 	@Override
 	public AliPayParams aliPay(Long orderId, String productCode) throws Exception {
 		OrderDon orderDon = getById(orderId);
-		String appId = null;
+		String appId = ShopConfig.ZFB_DEFAULT_APP_ID;
+
 		if (orderDon.getPopularizeId() != null) {
 			ShopConfig shopConfig = shopConfigMapper.getByChannelPopularizeId(orderDon.getPopularizeId(),"zfb");
 			if (shopConfig != null) {
 				appId = shopConfig.getAppId();
 			}
 		}
+		orderDon.setType(OrderDon.Type.ALI_PAY);
 		orderDon.setShopId(appId);
 		this.updateById(orderDon);
 		return commonAliPay(orderId, productCode, appId);
@@ -694,7 +704,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		if (orderDon.getPopularizeId() == null) {
 			orderDon.setShopId(null);
 		}
-		boolean signVerified = AlipaySignature.rsaCheckV1(params,shopConfigMapper.getByAppId((Optional.ofNullable(orderDon.getShopId()).orElse(ShopConfig.ZFB_DEFAULT_APP_ID))).getPublicKey(), BaseZfbConfig.charset, BaseZfbConfig.signType);
+		String appId = params.get("app_id");
+		boolean signVerified = AlipaySignature.rsaCheckV1(params,shopConfigMapper.getByAppId(appId).getPublicKey(), BaseZfbConfig.charset, BaseZfbConfig.signType);
 		if (!signVerified) {
 			log.error("支付宝回调校验签名错误,自定义入参:{}", params.get("body"));
 			throw BusinessRuntimeException.getInstance("支付宝回调校验签名错误");
@@ -706,6 +717,9 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			log.info("支付宝已回调,重复修改状态 id:{}", orderDon.getId());
 			return;
 		}
+		if (orderDon.getIsNoLogin()) {
+			orderDon.setExCode(exchangeCodeService.getExCode(orderDon.getGoodsId(), orderDon.getSkuId(), 1));
+		}
 		GoodsDonSku sku = goodsDonSkuMapper.selectById(orderDon.getSkuId());
 		GoodsDon goodsDon = goodsDonMapper.selectById(sku.getGoodsId());
 		Date payTime = DateTime.now();
@@ -716,25 +730,31 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		orderDon.setTransactionId(transactionId);
 		orderDon.setStatus(goodsDon.getType() == 1 && goodsDon.getSecondType() == 2 ? OrderDon.Status.complete : OrderDon.Status.hasPayment);
 		orderDon.setPayTime(payTime);
-		//修改车位状态并发送模板消息
-		updateCarParkAndSendMsg(goodsDon, sku, orderDon);
+		orderDon.setShopId(appId);
 		orderDon.setType(OrderDon.Type.ALI_PAY);
-		if (orderDon.getMoney().compareTo(BigDecimal.ZERO) > 0 && orderDon.getIsDistribute()) {
-			TASK_POOL.execute(() -> distributeWaitingSendPointsRecord(orderDon));
+		if (orderDon.getIsNoLogin()) {
+			orderDon.setStatus(OrderDon.Status.hasPayment);
+		}
+		if (!orderDon.getIsNoLogin()) {
+			//修改车位状态并发送模板消息
+			updateCarParkAndSendMsg(goodsDon, sku, orderDon);
+			if (orderDon.getMoney().compareTo(BigDecimal.ZERO) > 0 && orderDon.getIsDistribute()) {
+				TASK_POOL.execute(() -> distributeWaitingSendPointsRecord(orderDon));
+			}
+			if (goodsDon.getType() == 1) {
+				//无车队,新增车队
+				checkNoGroupsTripsAndSendMsg(sku, orderDon);
+			}
+			//完成任务
+			TASK_POOL.execute(() -> {
+				TaskType taskType = taskTypeMapper.selectOne(Wrappers.lambdaQuery(TaskType.class)
+						.eq(TaskType::getName, TaskTypeEnum.yh_order.getDesc()).last("limit 1"));
+				taskService.completeTask(taskType, orderDon.getUserId());
+			});
+			//客服续费订单
+			handleServiceRenewOrder(orderDon);
 		}
 		this.updateById(orderDon);
-		if (goodsDon.getType() == 1) {
-			//无车队,新增车队
-			checkNoGroupsTripsAndSendMsg(sku, orderDon);
-		}
-		//客服续费订单
-		handleServiceRenewOrder(orderDon);
-		//完成任务
-		TASK_POOL.execute(() -> {
-			TaskType taskType = taskTypeMapper.selectOne(Wrappers.lambdaQuery(TaskType.class)
-					.eq(TaskType::getName, TaskTypeEnum.yh_order.getDesc()).last("limit 1"));
-			taskService.completeTask(taskType, orderDon.getUserId());
-		});
 	}
 
 	@Override
@@ -886,7 +906,6 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			Integer num = orderDon.getNum();
 			DateTime now = DateTime.now();
 			GroupsRelation relation = groupsRelationMapper.selectById(relationId);
-			Date expiryTime = relation.getExpiryTime();
 			Boolean isFlag = true;
 			if (orderDon.getOrderType() == 2) {
 				//是否有其他付款订单是否过期
@@ -905,6 +924,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 				}
 			}
 			if (relation != null) {
+				Date expiryTime = relation.getExpiryTime();
 				if (isFlag) {
 					relation.setUserId(0l);
 					relation.setStatus(GroupsRelation.Status.none);
@@ -933,7 +953,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 	 * 校验订单是否符合退款操作
 	 * @param orderDon
 	 */
-	private void checkOrderRefund(OrderDon orderDon,GoodsDon goodsDon, GoodsDonSku sku) {
+	private void checkOrderRefund(OrderDon orderDon, GoodsDon goodsDon, GoodsDonSku sku) {
 		if (orderDon == null) {
 			throw BusinessRuntimeException.getInstance("订单不存在");
 		}
@@ -1055,8 +1075,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 	}
 
 	public void setRelation(Long relationId, Long userId, Long goodsId) {
-        int noPayCount = count(Wrappers.lambdaQuery(OrderDon.class).eq(OrderDon::getUserId, userId).eq(OrderDon::getGoodsId, goodsId).eq(OrderDon::getStatus, OrderDon.Status.noPayment.toString()));
-
+		int noPayCount = count(Wrappers.lambdaQuery(OrderDon.class).eq(OrderDon::getUserId, userId).eq(OrderDon::getGoodsId, goodsId).eq(OrderDon::getStatus, OrderDon.Status.noPayment.toString()));
 		if (noPayCount > 0) {
 			throw new BusinessRuntimeException("您有未支付订单.");
 		}
@@ -1210,21 +1229,23 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 		//新订单产生 发送模板消息给用户、客服
 		User user = userMapper.selectById(order.getUserId());
-		THREAD_POOL_TASK_EXECUTOR.execute(() -> {
-			try {
-				//发送至用户消息
-				newOderSendMsgByType(order, goodsDon, sku, user, user.getOpenId());
-			} catch (Exception e) {
-				log.error("向用户发送新订单{}通知消息失败:{}", order.getOrderNo(), e);
-			}
-		});
+		if (user != null) {
+			THREAD_POOL_TASK_EXECUTOR.execute(() -> {
+				try {
+					//发送至用户消息
+					templateCommonService.newOderSendMsgByType(order, goodsDon, sku, user, user.getOpenId());
+				} catch (Exception e) {
+					log.error("向用户发送新订单{}通知消息失败:{}", order.getOrderNo(), e);
+				}
+			});
+		}
 		THREAD_POOL_TASK_EXECUTOR.execute(() -> {
 			try {
 				//发送至客服消息
 				List<CustomerService> customerServices = customerServiceMapper.selectList(null);
 				for (CustomerService customerService : customerServices) {
 					log.info("向客服{}发送新订单消息通知..", customerService.getNickName());
-					newOderSendMsgByType(order, goodsDon, sku, user, customerService.getOpenId());
+					templateCommonService.newOderSendMsgByType(order, goodsDon, sku, user, customerService.getOpenId());
 				}
 			} catch (Exception e) {
 				log.error("向客服发送新订单{}通知消息失败:{}", order.getOrderNo(), e);

+ 19 - 0
netflix-service/src/main/java/com/cyksj/service/template/TemplateCommonService.java

@@ -0,0 +1,19 @@
+package com.cyksj.service.template;
+
+import com.cyksj.model.entity.GoodsDon;
+import com.cyksj.model.entity.GoodsDonSku;
+import com.cyksj.model.entity.OrderDon;
+import com.cyksj.model.entity.User;
+
+/*
+ *项目名: netflix
+ *文件名: TemplateCommonService
+ *创建者: JavaZou
+ *创建时间:2023/1/11 9:59
+ */
+public interface TemplateCommonService {
+	/**
+	 * 发送新订单模板消息
+	 */
+	void newOderSendMsgByType(OrderDon order, GoodsDon goodsDon, GoodsDonSku sku, User user, String toPeople) throws Exception;
+}

+ 57 - 0
netflix-service/src/main/java/com/cyksj/service/template/impl/TemplateCommonServiceImpl.java

@@ -0,0 +1,57 @@
+package com.cyksj.service.template.impl;
+
+import cn.hutool.core.date.DateUtil;
+import com.cyksj.common.EnvCommonService;
+import com.cyksj.common.constant.TemplateEnum;
+import com.cyksj.common.util.Jsons;
+import com.cyksj.model.dto.WxMpTemplateData;
+import com.cyksj.model.dto.WxMpTemplateMessage;
+import com.cyksj.model.entity.GoodsDon;
+import com.cyksj.model.entity.GoodsDonSku;
+import com.cyksj.model.entity.OrderDon;
+import com.cyksj.model.entity.User;
+import com.cyksj.service.template.TemplateCommonService;
+import com.cyksj.service.wechat.WeChatService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+
+/*
+ *项目名: netflix
+ *文件名: TemplateCommonServiceImpl
+ *创建者: JavaZou
+ *创建时间:2023/1/11 9:59
+ */
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class TemplateCommonServiceImpl implements TemplateCommonService {
+	private final EnvCommonService envCommonService;
+
+	private final WeChatService weChatService;
+
+	public void newOderSendMsgByType(OrderDon order, GoodsDon goodsDon, GoodsDonSku sku, User user, String toPeople) throws Exception {
+		TemplateEnum templateEnum = null;
+		if (EnvCommonService.active.equals(envCommonService.getEnv())) {
+			return;
+		}else {
+			templateEnum = TemplateEnum.NEW_ORDER_PRD_TEMPLATE;
+		}
+		WxMpTemplateMessage templateMessage = new WxMpTemplateMessage()
+				.setToUser(toPeople)
+				.setTemplateId(templateEnum.getTemplateId())
+				//TODO
+				.setUrl(" ");
+		WxMpTemplateMessage.TemplateData data = templateMessage.getData();
+		data.setFirst(new WxMpTemplateData("新订单通知!"));
+		data.setKeyword1(new WxMpTemplateData(order.getOrderNo()));
+		data.setKeyword2(new WxMpTemplateData(String.format("%s,%s", goodsDon.getTitle(), sku.getSpecVal())));
+		data.setKeyword3(new WxMpTemplateData(user == null ? "推广未登录用户" : user.getNickname()));
+		data.setKeyword4(new WxMpTemplateData(order.getMoney().divide(BigDecimal.valueOf(100)).toString()));
+		data.setKeyword5(new WxMpTemplateData(DateUtil.format(order.getCreatedTime(), "yyyy-MM-dd HH:mm:ss")));
+		data.setRemark(new WxMpTemplateData("点击查看详情"));
+		weChatService.sendTemplateMessage(weChatService.getAccessToken(), Jsons.toJson(templateMessage));
+	}
+}

+ 73 - 3
netflix-web/src/main/java/com/cyksj/web/controller/goods/GoodsDonController.java

@@ -1,11 +1,20 @@
 package com.cyksj.web.controller.goods;
 
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUnit;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.RandomUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.OrderDonMapper;
 import com.cyksj.model.entity.GoodsDon;
 import com.cyksj.model.entity.GoodsDonSku;
 import com.cyksj.model.entity.GoodsDonSpec;
+import com.cyksj.model.entity.OrderDon;
+import com.cyksj.model.views.GoodsDonPopularizeView;
 import com.cyksj.model.views.GoodsDonViews;
+import com.cyksj.task.StatisticsDataScheduler;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
 import com.ejlchina.searcher.util.MapUtils;
@@ -17,6 +26,10 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * @author chan
@@ -32,19 +45,76 @@ public class GoodsDonController {
     
     private final BeanSearcher beanSearcher;
 
+    private final OrderDonMapper orderDonMapper;
+
     /**
      * 获取商品列表
      */
     @GetMapping("/get")
-    public Result<SearchResult<GoodsDon>> get(){
+    public Result<SearchResult<GoodsDon>> get() {
         SearchResult<GoodsDon> search = beanSearcher.search(GoodsDon.class, MapUtils.flatBuilder(request.getParameterMap())
-                .field(GoodsDon::getStatus,true)
-                .field(GoodsDon::getDeleted,true)
+                .field(GoodsDon::getStatus, true)
+                .field(GoodsDon::getDeleted, true)
                 .build()
         );
         return GatewayResponse.SUCCESS.newBuilder().toResult(search);
     }
 
+    /**
+     * 推广未登录,虚拟商品列表
+     */
+    @GetMapping("/get/popularize")
+    public Result<SearchResult<GoodsDonPopularizeView>> getPopularizeVipGoods() {
+        SearchResult<GoodsDonPopularizeView> search = beanSearcher.search(GoodsDonPopularizeView.class, MapUtils.flatBuilder(request.getParameterMap())
+                .field(GoodsDonPopularizeView::getStatus, true)
+                .field(GoodsDonPopularizeView::getDeleted, true)
+                .field(GoodsDonPopularizeView::getType, 1)
+                .build());
+        DateTime now = DateTime.now();
+        Integer randomNum = 2000;
+        List<GoodsDonPopularizeView> collect = search.getDataList().stream().filter(data -> data.getPrice().compareTo(BigDecimal.ZERO) > 0).collect(Collectors.toList());
+        collect.forEach(data -> {
+            data.setSpecs(beanSearcher.searchFirst(GoodsDonSpec.class, MapUtils.builder().field(GoodsDonSpec::getGoodsId, data.getId()).build()));
+            data.setSkuList(beanSearcher.searchAll(GoodsDonSku.class, MapUtils.builder().field(GoodsDonSku::getGoodsId, data.getId()).field(GoodsDonSku::getStatus, true).build()));
+            data.setSold(data.getSold() + randomNum);
+            OrderDon orderDon = orderDonMapper.selectOne(Wrappers.lambdaQuery(OrderDon.class)
+                    .eq(OrderDon::getGoodsId, data.getId())
+                    .notIn(OrderDon::getStatus, StatisticsDataScheduler.noOrderStatus).select(OrderDon::getCreatedTime, OrderDon::getPayTime, OrderDon::getId)
+                    .orderByDesc(OrderDon::getId)
+                    .last("limit 1"));
+            StringBuilder notifyMsg = new StringBuilder();
+            if (orderDon == null) {
+                notifyMsg.append("2分钟");
+            } else {
+                Date payTime = orderDon.getPayTime();
+                Date startTime = payTime != null ? payTime : orderDon.getCreatedTime();
+                long hour = DateUtil.between(startTime, now, DateUnit.HOUR);
+                if (hour == 0) {
+                    long minute = DateUtil.between(startTime, now, DateUnit.MINUTE);
+                    if (minute == 0) {
+                        notifyMsg.append("1分钟");
+                    } else {
+                        notifyMsg.append(minute);
+                        notifyMsg.append("分钟");
+                    }
+                } else {
+                    if (hour > 3) {
+                        int hours = RandomUtil.randomInt(3) + 1;
+                        notifyMsg.append(hours);
+                    } else {
+                        notifyMsg.append(hour);
+                    }
+                    notifyMsg.append("小时");
+                }
+            }
+            notifyMsg.append("前有人购买");
+            data.setNotifyMsg(notifyMsg.toString());
+        });
+        search = new SearchResult<>(collect);
+        search.setTotalCount(collect.size());
+        return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+    }
+
 
     /**
      * 获取商品详情

+ 0 - 14
netflix-web/src/main/java/com/cyksj/web/controller/manage/statistics/StatisticsDataController.java

@@ -20,9 +20,6 @@ import com.cyksj.mapper.manage.statistics.StatisticsUserDataMapper;
 import com.cyksj.mapper.stock.GoodsDonStockRecordMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.excel.ExcelAccountData;
-import com.cyksj.mapper.stock.GoodsDonStockRecordMapper;
-import com.cyksj.model.entity.*;
-import com.cyksj.model.excel.ExcelAccountData;
 import com.cyksj.model.request.BatchServiceReq;
 import com.cyksj.model.request.RenewTimeUpReq;
 import com.cyksj.model.views.*;
@@ -81,8 +78,6 @@ public class StatisticsDataController {
 
 	private final CustomerServiceRenewOrderRecordMapper customerServiceRenewOrderRecordMapper;
 
-	private final SignStatisticsDataMapper signStatisticsDataMapper;
-
 	/**
 	 * 查询统计数据
 	 */
@@ -356,13 +351,4 @@ public class StatisticsDataController {
 		});
 		return GatewayResponse.SUCCESS.newBuilder().toResult("分配客服成功");
 	}
-
-	/**
-	 * 签到以及积分数据统计
-	 */
-	@GetMapping("/get/sign")
-	public Result<SearchResult<SignStatisticsData>> getSign(HttpServletRequest request) {
-		SearchResult<SignStatisticsData> search = beanSearcher.search(SignStatisticsData.class, MapUtils.flatBuilder(request.getParameterMap()).build());
-		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
-	}
 }

+ 15 - 10
netflix-web/src/main/java/com/cyksj/web/controller/payment/OrderController.java

@@ -7,10 +7,10 @@ import com.cyksj.common.EnvCommonService;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.util.IoKit;
 import com.cyksj.common.util.Xmls;
-import com.cyksj.config.WeChatConfig;
 import com.cyksj.config.zfb.ZfbProductCode;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.OrderDonMapper;
 import com.cyksj.model.dto.AliPayParams;
 import com.cyksj.model.dto.H5JsPayParams;
 import com.cyksj.model.entity.OrderDon;
@@ -60,7 +60,7 @@ public class OrderController {
     private EnvCommonService envCommonService;
 
     @Autowired
-    private WeChatConfig weChatConfig;
+    private OrderDonMapper orderDonMapper;
 
     /**
      * 支付
@@ -70,7 +70,9 @@ public class OrderController {
     @PostMapping("/post/submit")
     public Result<OrderDon> submit(@Validated @RequestBody OrderPayRequest payRequest) throws Exception {
         final String methodName = "吊起微信支付";
-        payRequest.setUserId(StpUserUtil.getLoginIdAsLong());
+        if (payRequest.getIsNoLogin() == null || !payRequest.getIsNoLogin()) {
+            payRequest.setUserId(StpUserUtil.getLoginIdAsLong());
+        }
         log.info("{}[start] params:{}",methodName,payRequest);
 
         OrderDon orderDon = orderDonService.submit(payRequest);
@@ -287,10 +289,13 @@ public class OrderController {
      * 获取订单列表
      */
     @GetMapping("/get/{orderId}")
-    public Result<OrderDonView> list(@PathVariable Long orderId){
-        long userId = StpUserUtil.getLoginIdAsLong();
+    public Result<OrderDonView> list(@PathVariable Long orderId, Boolean isNoLogin) {
+        Long userId = null;
+        if (isNoLogin == null || !isNoLogin) {
+            userId = StpUserUtil.getLoginIdAsLong();
+        }
 
-        OrderDonView detail = orderDonService.getDetail(orderId,userId);
+        OrderDonView detail = orderDonService.getDetail(orderId, userId);
 
         return GatewayResponse.SUCCESS.newBuilder().toResult(detail);
     }
@@ -305,15 +310,15 @@ public class OrderController {
     }
 
     @GetMapping("/get/order/status/{orderId}")
-    public Result<OrderDon> getOrderStatusById(@PathVariable Long orderId) {
+    public Result<OrderDonView> getOrderStatusById(@PathVariable Long orderId) {
         if (orderId < 1) {
             throw BusinessRuntimeException.getInstance("订单不存在");
         }
-        OrderDon orderDon = orderDonService.getById(orderId);
-        if (orderDon == null) {
+        OrderDonView orderDonView = orderDonMapper.getOrderDetail(orderId);
+        if (orderDonView == null) {
             throw BusinessRuntimeException.getInstance("订单不存在");
         }
-        return GatewayResponse.SUCCESS.newBuilder().toResult(orderDon);
+        return GatewayResponse.SUCCESS.newBuilder().toResult(orderDonView);
     }
 
     /**