Prechádzať zdrojové kódy

Merge branch 'account_opt'

zoujiajian 3 rokov pred
rodič
commit
5f1509eb6d
18 zmenil súbory, kde vykonal 274 pridanie a 70 odobranie
  1. 5 0
      netflix-dao/src/main/java/com/cyksj/model/entity/EquipmentUserDistributeInviteRecord.java
  2. 3 0
      netflix-dao/src/main/java/com/cyksj/model/manage/views/AccountView.java
  3. 14 1
      netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderDonView.java
  4. 57 0
      netflix-dao/src/main/java/com/cyksj/model/request/AccountGroupsReq.java
  5. 40 0
      netflix-dao/src/main/java/com/cyksj/model/views/EquipmentDistributeNewUserView.java
  6. 7 0
      netflix-dao/src/main/java/com/cyksj/model/views/WxAppTemplateView.java
  7. 4 3
      netflix-dao/src/main/resources/mapper/CouponUserMapper.xml
  8. 3 1
      netflix-service/src/main/java/com/cyksj/service/distribute/equipment/impl/EquipmentDistributeServiceImpl.java
  9. 6 1
      netflix-service/src/main/java/com/cyksj/service/distribute/impl/DistributeServiceImpl.java
  10. 31 31
      netflix-service/src/main/java/com/cyksj/service/gzh/factory/EventMsgService.java
  11. 3 1
      netflix-service/src/main/java/com/cyksj/service/mange/impl/SpotifySendMsgServiceImpl.java
  12. 3 2
      netflix-service/src/main/java/com/cyksj/service/register/impl/SpotifyServiceImpl.java
  13. 33 18
      netflix-service/src/main/java/com/cyksj/service/template/impl/TemplateCommonServiceImpl.java
  14. 4 2
      netflix-service/src/main/java/com/cyksj/task/Scheduler.java
  15. 11 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/distribute/DistributeController.java
  16. 30 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/group/CmsGroupController.java
  17. 19 9
      netflix-web/src/main/java/com/cyksj/web/controller/payment/OrderController.java
  18. 1 1
      netflix-web/src/main/java/com/cyksj/web/controller/user/DistributePopularizeController.java

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

@@ -21,4 +21,9 @@ public class EquipmentUserDistributeInviteRecord extends BaseEntity{
 	 * 被邀请人id
 	 */
 	private Long userId;
+
+	/**
+	 * 新用户数
+	 */
+	private Boolean isNewUser;
 }

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

@@ -79,6 +79,9 @@ public class AccountView {
     @DbField("a.remark")
     private String remark;
 
+    @DbField("gdk.id")
+    private Long skuId;
+
     /**
      * 规格
      */

+ 14 - 1
netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderDonView.java

@@ -3,14 +3,17 @@ package com.cyksj.model.manage.views;
 import com.cyksj.model.entity.OrderDon;
 import com.cyksj.model.entity.OrderDonTransport;
 import com.cyksj.model.entity.OrderDonWaybill;
+import com.cyksj.model.views.GoodsDonSkuView;
 import com.ejlchina.searcher.bean.DbField;
 import com.ejlchina.searcher.bean.DbIgnore;
 import com.ejlchina.searcher.bean.SearchBean;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import lombok.Getter;
 import lombok.Setter;
 
 import java.math.BigDecimal;
 import java.util.Date;
+import java.util.List;
 
 /**
  * @author chan
@@ -70,6 +73,13 @@ public class OrderDonView {
     @DbField("g.title")
     private String title;
 
+    @DbField("sku.is_benefits")
+    private Boolean isBenefits;
+
+    @DbField("sku.benefits_list")
+    @JsonIgnore
+    private String benefitsList;
+
     @DbField("sku.spec_val")
     private String specVal;
 
@@ -195,4 +205,7 @@ public class OrderDonView {
      */
     @DbIgnore
     private Boolean isHasBenefits;
-}
+
+    @DbIgnore
+    private List<GoodsDonSkuView> benefitsViews;
+}

+ 57 - 0
netflix-dao/src/main/java/com/cyksj/model/request/AccountGroupsReq.java

@@ -0,0 +1,57 @@
+package com.cyksj.model.request;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/*
+ *项目名: netflix
+ *文件名: AccountGroupsReq
+ *创建者: JavaZou
+ *创建时间:2023/3/17 15:14
+ */
+@Getter
+@Setter
+public class AccountGroupsReq {
+	@NotNull
+	private Long groupsId;
+
+	private String title;
+
+	@NotEmpty
+	private String account;
+
+	@NotEmpty
+	private String password;
+
+	@NotNull
+	private Long goodsId;
+
+	private String bankCard;
+
+	private Long skuId;
+
+	@NotNull
+	private Date startTime;
+
+	@NotNull
+	private Date expiryTime;
+
+	private BigDecimal amount;
+
+	/**
+	 * 国区id
+	 */
+	private String cnAccount;
+
+	/**
+	 * 美区id
+	 */
+	private String usAccount;
+
+	private String remark;
+}

+ 40 - 0
netflix-dao/src/main/java/com/cyksj/model/views/EquipmentDistributeNewUserView.java

@@ -0,0 +1,40 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/*
+ *项目名: netflix
+ *文件名: EquipmentDistributeNewUserView
+ *创建者: JavaZou
+ *创建时间:2023/3/16 17:01
+ */
+@Getter
+@Setter
+@SearchBean(tables = "equipment_user_distribute_invite_record ur left join user u on u.id = ur.user_id")
+public class EquipmentDistributeNewUserView {
+	@DbField("ur.id")
+	private Long inviteRecordId;
+
+	@DbField("ur.user_id")
+	private Long userId;
+
+	@DbField("ur.share_id")
+	private Long shareId;
+
+	@DbField("ur.is_new_user")
+	private Boolean isNewUser;
+
+	@DbField("u.created_time")
+	private Date userRegisterDate;
+
+	@DbField("u.nickname")
+	private String nickname;
+
+	@DbField("u.headimgurl")
+	private String headImgUrl;
+}

+ 7 - 0
netflix-dao/src/main/java/com/cyksj/model/views/WxAppTemplateView.java

@@ -1,6 +1,7 @@
 package com.cyksj.model.views;
 
 import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
 import com.ejlchina.searcher.bean.SearchBean;
 import lombok.Getter;
 import lombok.Setter;
@@ -35,4 +36,10 @@ public class WxAppTemplateView {
 	 */
 	@DbField("wa.app_id")
 	private String appId;
+
+	/**
+	 * 发放模板消息的用户openid
+	 */
+	@DbIgnore
+	private String openId;
 }

+ 4 - 3
netflix-dao/src/main/resources/mapper/CouponUserMapper.xml

@@ -24,6 +24,7 @@
         if(ca.id is not null and ca.expiry_status = 0,false,true) flag,
         (case
         when cu.valid_start_time > now() then 1
+        when cu.valid_end_time &lt; now() then 2
         when cu.status = 'unused' then 0
         end)                 as orderby
         from `coupon_user` cu
@@ -47,7 +48,7 @@
         </if>
         <if test="couponId != null">
             order by case when cp.id = #{couponId} then 2 else isAvailable end desc,orderby
-        </if>)s where flag = 1 and couponUserStatus != 'used'
+        </if>)s where flag = 1 and couponUserStatus != 'used' and orderby != 2
     </select>
 
     <select id="countAvailableCouponList" resultType="com.cyksj.model.views.CouponUserView">
@@ -125,7 +126,7 @@
     </select>
 
     <select id="couponPersonalList" resultType="com.cyksj.model.views.CouponUserView">
-        select cu.id,
+        select s.* from (select cu.id,
                cu.channel,
                cu.user_id,
                c.id                     as couponId,
@@ -160,6 +161,6 @@
                  left join `coupon_active` ca on ca.id = cu.coupon_active_id
         where cu.user_id = #{userId}
           and cu.channel != 'exCode'
-        order by `orderby`
+        order by `orderby`)s where s.couponUserStatus != 'expired' and s.couponUserStatus != 'invalid'
     </select>
 </mapper>

+ 3 - 1
netflix-service/src/main/java/com/cyksj/service/distribute/equipment/impl/EquipmentDistributeServiceImpl.java

@@ -88,11 +88,13 @@ public class EquipmentDistributeServiceImpl implements EquipmentDistributeServic
 			//存在分销
 			record.setUserId(userId);
 			try {
-				inviteRecordMapper.insert(record);
 				//发放新用户福利优惠券
 				if (isNewUser) {
 					sendInvitedUserEquipmentCoupon(userId);
+					record.setIsNewUser(true);
 				}
+				inviteRecordMapper.insert(record);
+
 			} catch (DuplicateKeyException e) {
 				log.info("实物分销被邀请人id:{}重复插入", userId);
 			} catch (Exception e) {

+ 6 - 1
netflix-service/src/main/java/com/cyksj/service/distribute/impl/DistributeServiceImpl.java

@@ -66,6 +66,7 @@ public class DistributeServiceImpl implements DistributeService {
 	}
 
 	@Override
+	@Transactional(rollbackFor = Throwable.class)
 	public void editDistribute(UserDistributeReq userDistributeReq) {
 		if (userDistributeReq.getId() == null || userDistributeReq.getId() < 1) {
 			throw BusinessRuntimeException.getInstance("id错误");
@@ -83,7 +84,11 @@ public class DistributeServiceImpl implements DistributeService {
 				throw new BusinessRuntimeException("平台错误");
 			}
 			rate.setDistributeId(userDistribute.getId());
-			userPlatDistributeRateMapper.updateById(rate);
+			if (rate.getId() == null) {
+				userPlatDistributeRateMapper.insert(rate);
+			}else {
+				userPlatDistributeRateMapper.updateById(rate);
+			}
 		}
 	}
 

+ 31 - 31
netflix-service/src/main/java/com/cyksj/service/gzh/factory/EventMsgService.java

@@ -107,8 +107,13 @@ public class EventMsgService implements GzhMsgService {
 		WxSyncLog wxSyncLog = wxSyncLogMapper.selectOne(Wrappers.lambdaQuery(WxSyncLog.class)
 				.eq(WxSyncLog::getToAppid, weChatConfig.getAppid())
 				.eq(WxSyncLog::getNewOpenid, openId).last("limit 1"));
-		GzhUnionidUserinfo info = weChatService.getUserInfo2(weChatService.getAccessToken(), openId);
 
+		WxApp wxApp = wxAppMapper.selectOne(Wrappers.lambdaQuery(WxApp.class)
+				.eq(WxApp::getGzhOriginalId, msgEvent.getToUserName()).last("limit 1"));
+		if (wxApp == null) {
+			return false;
+		}
+		GzhUnionidUserinfo info = weChatService.getUserInfo2(weChatService.getAccessToken(wxApp.getAppId()), openId);
 		User user = userService.getSyncUser(info.getOpenid(), info.getUnionid(), wxSyncLog);
 
 		String state = redisService.getStr(RedisService.key.WX_GZH_QRCODE_SHARED_LOGIN.getNameFormat(sceneKey));
@@ -157,14 +162,14 @@ public class EventMsgService implements GzhMsgService {
 				}
 			}
 
-			saveGzhUserRelation(msgEvent, user.getId(), openId, info.getUnionid(), sceneKey);
+			saveGzhUserRelation(msgEvent, user.getId(), openId, info.getUnionid(), sceneKey, wxApp.getId());
 		} else {
 			//之前关注过
 			if (user.getUnionid() == null || !user.getUnionid().equals(info.getUnionid())) {
 				user.setUnionid(info.getUnionid());
 				userMapper.updateById(user);
 			}
-			saveGzhUserRelation(msgEvent, user.getId(), openId, info.getUnionid(), sceneKey);
+			saveGzhUserRelation(msgEvent, user.getId(), openId, info.getUnionid(), sceneKey, wxApp.getId());
 		}
 		//场景值扫描公众号二维码 登录
 		if (StrUtil.isNotEmpty(sceneKey)) {
@@ -181,36 +186,31 @@ public class EventMsgService implements GzhMsgService {
 		return true;
 	}
 
-	private void saveGzhUserRelation(MsgEvent msgEvent, Long userId, String openId, String unionid, String sceneKey) {
-		WxApp wxApp = wxAppMapper.selectOne(Wrappers.lambdaQuery(WxApp.class)
-				.eq(WxApp::getGzhOriginalId, msgEvent.getToUserName()).last("limit 1"));
-		if (wxApp != null) {
-			Long wxAppId = wxApp.getId();
-			UserGzhRelation userGzhRelation = userGzhRelationMapper.selectOne(Wrappers.lambdaQuery(UserGzhRelation.class)
-					.eq(UserGzhRelation::getWxAppId, wxAppId)
-					.eq(UserGzhRelation::getOpenId, msgEvent.getFromUserName()).last("limit 1"));
-			userGzhRelation = Optional.ofNullable(userGzhRelation).orElseGet(() -> new UserGzhRelation());
-
-			userGzhRelation.setUserId(userId);
-			userGzhRelation.setWxAppId(wxAppId);
-			userGzhRelation.setIsSubscribe(true);
-			userGzhRelation.setEvent(msgEvent.getEvent());
-			userGzhRelation.setOpenId(openId);
-			userGzhRelation.setUnionid(unionid);
-			if (StrUtil.isNotEmpty(msgEvent.getEventKey())) {
-				userGzhRelation.setIsQrScene(true);
+	private void saveGzhUserRelation(MsgEvent msgEvent, Long userId, String openId, String unionid, String sceneKey, Long wxAppId) {
+		UserGzhRelation userGzhRelation = userGzhRelationMapper.selectOne(Wrappers.lambdaQuery(UserGzhRelation.class)
+				.eq(UserGzhRelation::getWxAppId, wxAppId)
+				.eq(UserGzhRelation::getOpenId, msgEvent.getFromUserName()).last("limit 1"));
+		userGzhRelation = Optional.ofNullable(userGzhRelation).orElseGet(() -> new UserGzhRelation());
+
+		userGzhRelation.setUserId(userId);
+		userGzhRelation.setWxAppId(wxAppId);
+		userGzhRelation.setIsSubscribe(true);
+		userGzhRelation.setEvent(msgEvent.getEvent());
+		userGzhRelation.setOpenId(openId);
+		userGzhRelation.setUnionid(unionid);
+		if (StrUtil.isNotEmpty(msgEvent.getEventKey())) {
+			userGzhRelation.setIsQrScene(true);
+		}
+		try {
+			if (userGzhRelation.getId() == null) {
+				//记录首次关注公众号的场景值
+				userGzhRelation.setSceneKey(sceneKey);
+				userGzhRelationMapper.insert(userGzhRelation);
+				return;
 			}
-			try {
-				if (userGzhRelation.getId() == null) {
-					//记录首次关注公众号的场景值
-					userGzhRelation.setSceneKey(sceneKey);
-					userGzhRelationMapper.insert(userGzhRelation);
-					return;
-				}
-				userGzhRelationMapper.updateById(userGzhRelation);
-			} catch (DuplicateKeyException e) {
+			userGzhRelationMapper.updateById(userGzhRelation);
+		} catch (DuplicateKeyException e) {
 
-			}
 		}
 	}
 }

+ 3 - 1
netflix-service/src/main/java/com/cyksj/service/mange/impl/SpotifySendMsgServiceImpl.java

@@ -19,6 +19,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.PostConstruct;
+import java.util.Optional;
 
 /*
  *项目名: netflix
@@ -58,10 +59,11 @@ public class SpotifySendMsgServiceImpl implements SpotifySendMsgService {
 				User user = userMapper.selectById(unLimitRecord.getUserId());
 				if (user != null) {
 					Long userId = user.getId();
+					String openId = user.getOpenId();
 					WxAppTemplateView wxAppTemplateView = templateCommonService.getWxAppByUserId(userId, TemplateEnum.SPOTIFY_ACCOUNT_UN_LIMIT_SUCCESS_TEMPLATE.getDesc());
 					if (wxAppTemplateView != null) {
 						WxMpTemplateMessage templateMessage = new WxMpTemplateMessage()
-								.setToUser(user.getOpenId())
+								.setToUser(Optional.ofNullable(wxAppTemplateView.getOpenId()).orElse(openId))
 								.setTemplateId(wxAppTemplateView.getTemplateId())
 								.setUrl(spotifyUnLimitSuccessUrl);
 						WxMpTemplateMessage.TemplateData data = templateMessage.getData();

+ 3 - 2
netflix-service/src/main/java/com/cyksj/service/register/impl/SpotifyServiceImpl.java

@@ -317,17 +317,18 @@ public class SpotifyServiceImpl implements SpotifyService {
     private void spotifyTemplateMsg(RegisterOrderDon registerOrderDon, String url, Boolean isSuccess) throws Exception {
         if (!EnvCommonService.active.equals(envCommonService.getEnv())) {
             Long userId = registerOrderDon.getUserId();
+            String openId = registerOrderDon.getOpenId();
             WxAppTemplateView wxAppTemplateView = templateCommonService.getWxAppByUserId(userId, TemplateEnum.SPOTIFY_TEMPLATE.getDesc());
             if (wxAppTemplateView != null) {
                 WxMpTemplateMessage templateMessage = new WxMpTemplateMessage()
-                        .setToUser(registerOrderDon.getOpenId())
+                        .setToUser(Optional.ofNullable(wxAppTemplateView.getOpenId()).orElse(openId))
                         .setTemplateId(wxAppTemplateView.getTemplateId())
                         .setUrl(url);
                 WxMpTemplateMessage.TemplateData data = templateMessage.getData();
                 data.setFirst(new WxMpTemplateData(isSuccess ? "Spotify账号已注册成功" : "Spotify账号注册失败,请修改后重新提交"));
                 data.setKeyword1(new WxMpTemplateData(registerOrderDon.getPhone()));
                 data.setKeyword2(new WxMpTemplateData(DateUtil.format(registerOrderDon.getCreatedTime(), "yyyy-MM-dd HH:mm:ss")));
-                weChatService.sendTemplateMessage(weChatService.getAccessToken(), Jsons.toJson(templateMessage));
+                weChatService.sendTemplateMessage(weChatService.getAccessToken(wxAppTemplateView.getAppId()), Jsons.toJson(templateMessage));
             }
         }
     }

+ 33 - 18
netflix-service/src/main/java/com/cyksj/service/template/impl/TemplateCommonServiceImpl.java

@@ -31,6 +31,7 @@ import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.util.List;
+import java.util.Optional;
 
 /*
  *项目名: netflix
@@ -63,10 +64,11 @@ public class TemplateCommonServiceImpl implements TemplateCommonService {
 	public void newOderSendMsgByType(OrderDon order, GoodsDon goodsDon, GoodsDonSku sku, User user, String toPeople) throws Exception {
 		if (!EnvCommonService.active.equals(envCommonService.getEnv())) {
 			Long userId = order.getUserId();
+			String openId = toPeople;
 			WxAppTemplateView wxAppTemplateView = this.getWxAppByUserId(userId, TemplateEnum.NEW_ORDER_TEMPLATE.getDesc());
 			if (wxAppTemplateView != null) {
 				WxMpTemplateMessage templateMessage = new WxMpTemplateMessage()
-						.setToUser(toPeople)
+						.setToUser(Optional.ofNullable(wxAppTemplateView.getOpenId()).orElse(openId))
 						.setTemplateId(wxAppTemplateView.getTemplateId())
 						//TODO
 						.setUrl(" ");
@@ -85,8 +87,11 @@ public class TemplateCommonServiceImpl implements TemplateCommonService {
 
 	@Override
 	public WxAppTemplateView getWxAppByUserId(Long userId, String templateMark) {
-		UserGzhRelation userGzhRelation = userGzhRelationMapper.selectOne(Wrappers.lambdaQuery(UserGzhRelation.class)
-				.eq(UserGzhRelation::getUserId, userId).last("limit 1"));
+		UserGzhRelation userGzhRelation = null;
+		if (!TemplateEnum.WX_GZH_QR_CODE_LOGIN.getDesc().equals(templateMark)) {
+			userGzhRelation = userGzhRelationMapper.selectOne(Wrappers.lambdaQuery(UserGzhRelation.class)
+					.eq(UserGzhRelation::getUserId, userId).orderByAsc(UserGzhRelation::getWxAppId).last("limit 1"));
+		}
 		MapBuilder builder = MapUtils.builder()
 				.field(WxAppTemplateView::getRemark, templateMark);
 		if (userGzhRelation == null) {
@@ -101,25 +106,33 @@ public class TemplateCommonServiceImpl implements TemplateCommonService {
 			type = EnvCommonService.active_prd;
 		}
 		builder.field(WxAppTemplateView::getType, type);
-		return beanSearcher.searchFirst(WxAppTemplateView.class, builder.build());
+		WxAppTemplateView wxAppTemplateView = beanSearcher.searchFirst(WxAppTemplateView.class, builder.build());
+		if (userGzhRelation != null) {
+			final String openId = userGzhRelation.getOpenId();
+			Optional.ofNullable(wxAppTemplateView).ifPresent((templateView) -> templateView.setOpenId(openId));
+		}
+		return wxAppTemplateView;
 	}
 
 	@Override
 	public void sendWxGzhQrCodeSuccessMsg(User user) throws Exception {
 		if (!EnvCommonService.active.equals(envCommonService.getEnv())) {
 			Long userId = user.getId();
+			String openId = user.getOpenId();
 			WxAppTemplateView wxAppTemplateView = this.getWxAppByUserId(userId, TemplateEnum.WX_GZH_QR_CODE_LOGIN.getDesc());
-			String url = String.format("%sauth/weChat?url=%s", envCommonService.getHost(), envCommonService.getDomain() + "yinhe/web/");
-			WxMpTemplateMessage templateMessage = new WxMpTemplateMessage()
-					.setToUser(user.getOpenId())
-					.setTemplateId(wxAppTemplateView.getTemplateId())
-					.setUrl(url);
-			WxMpTemplateMessage.TemplateData data = templateMessage.getData();
-			data.setFirst(new WxMpTemplateData("您已登录成功"));
-			data.setKeyword1(new WxMpTemplateData("银河录像局"));
-			data.setKeyword2(new WxMpTemplateData(DateUtil.format(DateTime.now(), "yyyy-MM-dd HH:mm:ss")));
-			data.setRemark(new WxMpTemplateData("欢迎使用银河录像局"));
-			weChatService.sendTemplateMessage(weChatService.getAccessToken(), Jsons.toJson(templateMessage));
+			if (wxAppTemplateView != null) {
+				String url = String.format("%sauth/weChat?url=%s", envCommonService.getHost(), envCommonService.getDomain() + "yinhe/web/");
+				WxMpTemplateMessage templateMessage = new WxMpTemplateMessage()
+						.setToUser(Optional.ofNullable(wxAppTemplateView.getOpenId()).orElse(openId))
+						.setTemplateId(wxAppTemplateView.getTemplateId())
+						.setUrl(url);
+				WxMpTemplateMessage.TemplateData data = templateMessage.getData();
+				data.setFirst(new WxMpTemplateData("您已登录成功"));
+				data.setKeyword1(new WxMpTemplateData("银河录像局"));
+				data.setKeyword2(new WxMpTemplateData(DateUtil.format(DateTime.now(), "yyyy-MM-dd HH:mm:ss")));
+				data.setRemark(new WxMpTemplateData("欢迎使用银河录像局"));
+				weChatService.sendTemplateMessage(weChatService.getAccessToken(), Jsons.toJson(templateMessage));
+			}
 		}
 	}
 
@@ -139,7 +152,7 @@ public class TemplateCommonServiceImpl implements TemplateCommonService {
 				}
 				String url = String.format("%s%s", envCommonService.getDomain(), "order");
 				WxMpTemplateMessage templateMessage = new WxMpTemplateMessage()
-						.setToUser(openId)
+						.setToUser(Optional.ofNullable(wxAppTemplateView.getOpenId()).orElse(openId))
 						.setTemplateId(wxAppTemplateView.getTemplateId())
 						.setUrl(url);
 				String msg = isReceiveAll ? "家庭套餐特权已生效,可在我的车票中查看" : "存在待领取权益,点击查看详情";
@@ -162,11 +175,12 @@ public class TemplateCommonServiceImpl implements TemplateCommonService {
 	public void emptySendMsgNotify(OrderDon orderDon, String toPeople) throws Exception {
 		if (!EnvCommonService.active.equals(envCommonService.getEnv())) {
 			Long userId = orderDon.getUserId();
+			String openId = toPeople;
 			WxAppTemplateView wxAppTemplateView = this.getWxAppByUserId(userId, TemplateEnum.EMPTY_TEMPLATE.getDesc());
 			if (wxAppTemplateView != null) {
 				User u = userMapper.selectById(orderDon.getUserId());
 				WxMpTemplateMessage templateMessage = new WxMpTemplateMessage()
-						.setToUser(toPeople)
+						.setToUser(Optional.ofNullable(wxAppTemplateView.getOpenId()).orElse(openId))
 						.setTemplateId(wxAppTemplateView.getTemplateId())
 						//TODO
 						.setUrl(" ");
@@ -200,8 +214,9 @@ public class TemplateCommonServiceImpl implements TemplateCommonService {
 				if (wxAppTemplateView != null) {
 					User user = userMapper.selectById(relation.getUserId());
 					if (user != null) {
+						String openId = user.getOpenId();
 						WxMpTemplateMessage templateMessage = new WxMpTemplateMessage()
-								.setToUser(user.getOpenId())
+								.setToUser(Optional.ofNullable(wxAppTemplateView.getOpenId()).orElse(openId))
 								.setTemplateId(wxAppTemplateView.getTemplateId())
 								.setUrl(url);
 						WxMpTemplateMessage.TemplateData data = templateMessage.getData();

+ 4 - 2
netflix-service/src/main/java/com/cyksj/task/Scheduler.java

@@ -98,8 +98,9 @@ public class Scheduler {
             Long userId = user.getId();
             WxAppTemplateView wxAppTemplateView = templateCommonService.getWxAppByUserId(userId, TemplateEnum.EXPIRY_TEMPLATE.getDesc());
             if (wxAppTemplateView != null) {
+                String openId = user.getOpenId();
                 WxMpTemplateMessage templateMessage = new WxMpTemplateMessage()
-                        .setToUser(user.getOpenId())
+                        .setToUser(Optional.ofNullable(wxAppTemplateView.getOpenId()).orElse(openId))
                         .setTemplateId(wxAppTemplateView.getTemplateId())
                         .setUrl(" ");
 
@@ -128,8 +129,9 @@ public class Scheduler {
                 List<CustomerService> customerServices = customerServiceMapper.selectList(null);
                 if(!accounts.isEmpty()){
                     for (CustomerService customerService : customerServices) {
+                        openId = customerService.getOpenId();
                         WxMpTemplateMessage manageMessage = new WxMpTemplateMessage()
-                                .setToUser(customerService.getOpenId())
+                                .setToUser(Optional.ofNullable(wxAppTemplateView.getOpenId()).orElse(openId))
                                 .setTemplateId(wxAppTemplateView.getTemplateId())
                                 .setUrl(" ");
                         WxMpTemplateMessage.TemplateData data2 = manageMessage.getData();

+ 11 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/distribute/DistributeController.java

@@ -313,4 +313,15 @@ public class DistributeController {
 		statisticsDataService.distribute(backgroundDataView, startDate, endDate);
 		return GatewayResponse.SUCCESS.newBuilder().toResult(backgroundDataView);
 	}
+
+	/**
+	 * 实物设备分销邀请新用户人数
+	 */
+	@GetMapping("/get/equipment/distribute/newUser")
+	public Result<Integer> getEquipmentDistributeNewUser() {
+		Number number = beanSearcher.searchCount(EquipmentDistributeNewUserView.class, MapUtils.builder()
+				.field(EquipmentDistributeNewUserView::getIsNewUser, true)
+				.build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(number.intValue());
+	}
 }

+ 30 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/group/CmsGroupController.java

@@ -1,6 +1,7 @@
 package com.cyksj.web.controller.manage.group;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.bean.BeanUtil;
 import com.cyksj.common.annotation.Log;
 import com.cyksj.common.annotation.NoSubmit;
 import com.cyksj.common.exception.BusinessRuntimeException;
@@ -10,6 +11,8 @@ import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.GroupsRelationMapper;
 import com.cyksj.model.entity.Account;
 import com.cyksj.model.entity.GroupsTrips;
+import com.cyksj.model.request.AccountGroupsReq;
+import com.cyksj.model.views.GoodsDonSkuView;
 import com.cyksj.model.views.GroupsTripsWaitingView;
 import com.cyksj.service.mange.CmsAccountService;
 import com.cyksj.service.mange.CmsGroupService;
@@ -21,6 +24,7 @@ import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
@@ -104,6 +108,9 @@ public class CmsGroupController {
         return GatewayResponse.SUCCESS.newBuilder().toResult();
     }
 
+    /**
+     * 配置已有账号
+     */
     @PutMapping("/update/set/account")
     @Log(module = "发布车票/配置账号", businessType = BusinessType.PUT, isSaveRequestData = true)
     public Result<String> setAccount(@RequestBody GroupsTrips groupsTrips){
@@ -116,4 +123,27 @@ public class CmsGroupController {
         return GatewayResponse.SUCCESS.newBuilder().toResult();
     }
 
+    /**
+     * 配置新账号并绑定车队
+     */
+    @PostMapping("/post/account/bind")
+    public Result<String> createNewAccountBind(@RequestBody @Validated AccountGroupsReq req) {
+        Account account = new Account();
+        BeanUtil.copyProperties(req, account);
+        GroupsTrips groupsTrips = groupService.getById(req.getGroupsId());
+        if (groupsTrips.getAccountId() != null) {
+            throw BusinessRuntimeException.getInstance("该车队已配置账号");
+        }
+        Long skuId = groupsTrips.getSkuId();
+        GoodsDonSkuView goodsDonSkuView = beanSearcher.searchFirst(GoodsDonSkuView.class, MapUtils.builder()
+                .field(GoodsDonSkuView::getGoodsId, req.getGoodsId())
+                .field(GoodsDonSkuView::getSkuId, skuId).build());
+        if (goodsDonSkuView == null) {
+            throw BusinessRuntimeException.getInstance("该车队规格不属于该账号平台");
+        }
+        accountService.save(account);
+        groupsTrips.setAccountId(account.getId());
+        groupService.setAccount(groupsTrips);
+        return GatewayResponse.SUCCESS.newBuilder().toResult("车队配置新账号成功");
+    }
 }

+ 19 - 9
netflix-web/src/main/java/com/cyksj/web/controller/payment/OrderController.java

@@ -3,12 +3,13 @@ package com.cyksj.web.controller.payment;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.extra.qrcode.QrCodeUtil;
 import cn.hutool.extra.qrcode.QrConfig;
+import com.alipay.api.response.AlipayFundTransCommonQueryResponse;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.annotation.Log;
-import com.alipay.api.response.AlipayFundTransCommonQueryResponse;
 import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.util.IoKit;
+import com.cyksj.common.util.Jsons;
 import com.cyksj.common.util.Xmls;
 import com.cyksj.config.zfb.BaseZfbConfig;
 import com.cyksj.config.zfb.ZfbProductCode;
@@ -17,22 +18,19 @@ import com.cyksj.enums.BusinessType;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.OrderDonMapper;
 import com.cyksj.mapper.OrderDonWaybillMapper;
-import com.cyksj.mapper.channel.UserPayEquipmentAvailableBenefitsMapper;
 import com.cyksj.mapper.UserMapper;
+import com.cyksj.mapper.channel.UserPayEquipmentAvailableBenefitsMapper;
 import com.cyksj.mapper.market.task.UserBindPhoneMapper;
 import com.cyksj.model.dto.AliPayParams;
 import com.cyksj.model.dto.H5JsPayParams;
-import com.cyksj.model.entity.OrderDon;
-import com.cyksj.model.entity.OrderDonWaybill;
-import com.cyksj.model.entity.UserPayEquipmentAvailableBenefits;
-import com.cyksj.model.entity.User;
-import com.cyksj.model.entity.UserBindPhone;
+import com.cyksj.model.entity.*;
 import com.cyksj.model.manage.views.OrderDonView;
 import com.cyksj.model.request.AlipayOrderDonReq;
 import com.cyksj.model.request.OrderPayRequest;
 import com.cyksj.model.request.WxOrderRefundReq;
 import com.cyksj.model.request.ZfbOrderRefundReq;
 import com.cyksj.model.response.AliPayTradeStatus;
+import com.cyksj.model.views.GoodsDonSkuView;
 import com.cyksj.model.views.OrderCommentView;
 import com.cyksj.service.order.OrderDonService;
 import com.cyksj.web.util.StpUserUtil;
@@ -54,6 +52,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * @author chan
@@ -357,6 +356,17 @@ public class OrderController {
                     .eq(UserPayEquipmentAvailableBenefits::getRealOrderId, data.getId())
                     .eq(UserPayEquipmentAvailableBenefits::getDeleted, true));
             data.setIsHasBenefits(count > 0 ? true : false);
+            if (data.getIsBenefits()) {
+                String benefitsList = data.getBenefitsList();
+                if (StrUtil.isNotBlank(benefitsList)) {
+                    try {
+                        List<Long> skuIds = Jsons.parseList(benefitsList, GoodsDonSku.class).stream().map(GoodsDonSku::getId).collect(Collectors.toList());
+                        data.setBenefitsViews(beanSearcher.searchAll(GoodsDonSkuView.class, MapUtils.builder().field(GoodsDonSkuView::getSkuId, skuIds).op(Operator.InList).build()));
+                    } catch (Exception e) {
+
+                    }
+                }
+            }
             data.setWaybill(waybillMapper.selectOne(Wrappers.lambdaQuery(OrderDonWaybill.class).eq(OrderDonWaybill::getOrderId, data.getId()).last("limit 1")));
         });
         return GatewayResponse.SUCCESS.newBuilder().toResult(search);
@@ -364,10 +374,10 @@ public class OrderController {
 
 
     /**
-     * 获取订单列表
+     * 获取订单详情
      */
     @GetMapping("/get/{orderId}")
-    public Result<OrderDonView> list(@PathVariable Long orderId, Boolean isNoLogin) {
+    public Result<OrderDonView> detail(@PathVariable Long orderId, Boolean isNoLogin) {
         Long userId = null;
         if (isNoLogin == null || !isNoLogin) {
             userId = StpUserUtil.getLoginIdAsLong();

+ 1 - 1
netflix-web/src/main/java/com/cyksj/web/controller/user/DistributePopularizeController.java

@@ -142,7 +142,7 @@ public class DistributePopularizeController {
 			//最高平台比例
 			distributePopularizeView.setHighestRate(userDistributeView.getRate());
 		}else {
-			GoodsDon goodsDon = goodsDonMapper.selectOne(Wrappers.lambdaQuery(GoodsDon.class).orderByDesc(GoodsDon::getRate).select(GoodsDon::getRate).last("limit 1"));
+			GoodsDon goodsDon = goodsDonMapper.selectOne(Wrappers.lambdaQuery(GoodsDon.class).eq(GoodsDon::getDeleted, true).orderByDesc(GoodsDon::getRate).select(GoodsDon::getRate).last("limit 1"));
 			distributePopularizeView.setHighestRate(goodsDon.getRate());
 		}
 		List<DistributeWaitingSendPoints> distributeWaitingSendPoints = distributeWaitingSendPointsMapper.selectList(Wrappers.lambdaQuery(DistributeWaitingSendPoints.class).eq(DistributeWaitingSendPoints::getSendStatus, DistributeWaitingSendPoints.Status.waiting).eq(DistributeWaitingSendPoints::getSharedId, userId).select(DistributeWaitingSendPoints::getPoints));