Ver Fonte

代充优化

zoujiajian há 1 ano atrás
pai
commit
8acbbc0c22

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

@@ -92,6 +92,11 @@ public class GroupsRelation extends BaseEntity {
      */
     private String contact;
 
+    /**
+     * 备用验证码
+     */
+    private String bpVerifyCode;
+
     /**
      * 续费意愿处理状态
      */

+ 42 - 0
netflix-dao/src/main/java/com/cyksj/model/request/InviteBindAccountReq.java

@@ -0,0 +1,42 @@
+package com.cyksj.model.request;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 项目名: yhlxj321312312312312312
+ * 文件名: InviteBindAccountReq
+ * 创建者: JavaZou
+ * 创建时间:2025/8/13 10:22
+ */
+@Getter
+@Setter
+public class InviteBindAccountReq {
+	/**
+	 * 车票id
+	 */
+	@NotNull
+	private Long id;
+
+	/**
+	 * 账号
+	 */
+	private String account;
+
+	/**
+	 * 密码
+	 */
+	private String password;
+
+	/**
+	 * 联系方式
+	 */
+	private String contact;
+
+	/**
+	 * 备用验证码
+	 */
+	private String bpVerifyCode;
+}

+ 43 - 0
netflix-dao/src/main/java/com/cyksj/model/views/GptUserRechargeNumRecordView.java

@@ -0,0 +1,43 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * 项目名: yhlxj321312312312312312
+ * 文件名: GptUserRechargeNumRecordView
+ * 创建者: JavaZou
+ * 创建时间:2025/8/13 17:30
+ */
+@Getter
+@Setter
+@SearchBean(tables = "gpt_user_recharge_num_record gu")
+public class GptUserRechargeNumRecordView {
+
+	@DbField("gu.user_id")
+	@JsonIgnore
+	private Long userId;
+
+	@DbField("gu.relation_id")
+	private Long relationId;
+
+	@DbField("IF(gu.operator IS NULL,NULL,'银河客服')")
+	private String operator;
+
+	/**
+	 * 次数 正为增加 负为扣除
+	 */
+	@DbField("gu.num")
+	private Integer num;
+
+	@DbField("gu.remark")
+	private String remark;
+
+	@DbField("gu.created_time")
+	private Date createdTime;
+}

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

@@ -22,7 +22,8 @@ import java.util.Date;
 @SearchBean(tables = "groups_relation gr left join groups_trips gt on gt.id = gr.groups_id" +
 		" left join goods_don_sku gdk on gdk.id = gt.sku_id " +
 		" left join goods_don g on g.id = gdk.goods_id" +
-		" left join user u on u.id = gr.user_id")
+		" left join user u on u.id = gr.user_id",
+		where = ":errorInfo:")
 public class GroupsRelationRechargeView {
 
 	@DbField("gr.id")
@@ -79,6 +80,12 @@ public class GroupsRelationRechargeView {
 	@DbField("gr.gpt_task_id")
 	private String gptTaskId;
 
+	/**
+	 * 代充token
+	 */
+	@DbField("gr.gpt_token")
+	private String gptToken;
+
 	/**
 	 * 家庭组邀请链接
 	 */
@@ -91,6 +98,12 @@ public class GroupsRelationRechargeView {
 	@DbField("gr.contact")
 	private String contact;
 
+	/**
+	 * 备用验证码
+	 */
+	@DbField("gr.bp_verify_code")
+	private String bpVerifyCode;
+
 	@DbField("g.id")
 	private Long goodsId;
 

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

@@ -208,6 +208,12 @@ public class RenewalView {
     @DbField("gr.contact")
     private String contact;
 
+    /**
+     * 备用验证码
+     */
+    @DbField("gr.bp_verify_code")
+    private String bpVerifyCode;
+
     @DbIgnore
     private String orderNo;
     @DbIgnore

+ 1 - 0
netflix-dao/src/main/resources/mapper/GroupRelationMapper.xml

@@ -28,6 +28,7 @@
         card_key = null,
         gpt_task_id = null,
         recharge_error_info = null,
+        bp_verify_code = null,
         gpt_token = null
         where id = #{entity.id}
         <if test="expireTime != null">

+ 5 - 0
netflix-service/src/main/java/com/cyksj/server/recharge/impl/GptProxyRechargeServiceImpl.java

@@ -194,6 +194,7 @@ public class GptProxyRechargeServiceImpl implements GptProxyRechargeService {
 		if (relation == null) {
 			throw BusinessRuntimeException.getInstance("车票不存在");
 		}
+		String userAccount = relation.getAccount();
 		GroupsTrips groupsTrips = groupsMapper.selectById(relation.getGroupsId());
 		GoodsDonSku sku = skuMapper.selectById(groupsTrips.getSkuId());
 //		//GPT 代充
@@ -240,6 +241,10 @@ public class GptProxyRechargeServiceImpl implements GptProxyRechargeService {
 				throw BusinessRuntimeException.getInstance("您输入的凭证有误,请重新输入");
 			}
 			String rechargeAccount = tokenParseResult.getMessage();
+			//月付校验前后账号是否一致
+			if (sku.getMonths() == 1 && !StrUtil.equals(rechargeAccount, userAccount)) {
+				throw BusinessRuntimeException.getInstance("请填入绑定账号的token");
+			}
 			//记录代充账号 token
 			relation.setAccount(rechargeAccount);
 			//获取GPT代充key

+ 2 - 1
netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupRelationFrontServiceImpl.java

@@ -229,7 +229,8 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 		if (StrUtil.isNotBlank(account)) {
 			builder.field(RenewalView::getAccount, account).op(Operator.Contain);
 		}
-		String conditionSql = String.format("(gr.expiry_time is null or gr.expiry_time > '%s'", now);
+		//代充剩余次数大于0/未发车/过期时间
+		String conditionSql = String.format("(gr.recharge_remain_num > 0 or gr.expiry_time is null or gr.expiry_time > '%s'", now);
 		//镜像车票 过期7天后清除
 		//个人店铺和AI店铺 暂不支持过期续费
 		if (cmt == null && StrUtil.isEmpty(customId)) {

+ 45 - 12
netflix-web/src/main/java/com/cyksj/web/controller/group/GroupRelationController.java

@@ -180,30 +180,39 @@ public class GroupRelationController {
         return GatewayResponse.SUCCESS.newBuilder().toResult(orderDon);
     }
 
+    /**
+     * 邀请制绑定账号
+     */
     @PutMapping("/update/set/account")
-    public Result<String> setAccount(@RequestBody GroupsRelation relation) {
+    public Result<String> setAccount(@RequestBody @Validated InviteBindAccountReq req) {
         long userId = StpUserUtil.getLoginIdAsLong();
+        Long relationId = req.getId();
         List<Long> userIds = userBindRelationService.getRelationUserIdList(userId, null);
-        GroupsRelation re = relationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class)
-                .eq(GroupsRelation::getId, relation.getId())
+        GroupsRelation relation = relationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class)
+                .eq(GroupsRelation::getId, relationId)
                 .in(GroupsRelation::getUserId, userIds)
                 .last(" limit 1"));
-        if (re == null) {
+        if (relation == null) {
             throw new BusinessRuntimeException("该车票不存在,请联系客服.");
         }
+        String account = req.getAccount();
+        String password = req.getPassword();
+        String contact = req.getContact();
+        String bpVerifyCode = req.getBpVerifyCode();
         LambdaUpdateWrapper<GroupsRelation> updateWrapper = Wrappers.lambdaUpdate(GroupsRelation.class)
-                .set(GroupsRelation::getAccount, relation.getAccount())
-                .set(GroupsRelation::getPassword, relation.getPassword())
-                .set(GroupsRelation::getContact, relation.getContact())
-                .eq(GroupsRelation::getId, relation.getId());
-        if (re.getRechargeStatus() != null) {
-            if (re.getRechargeStatus() == GroupsRelation.RechargeStatus.complete) {
+                .set(GroupsRelation::getAccount, account)
+                .set(GroupsRelation::getPassword, password)
+                .set(GroupsRelation::getContact, contact)
+                .set(GroupsRelation::getBpVerifyCode, bpVerifyCode)
+                .eq(GroupsRelation::getId, relationId);
+        if (relation.getRechargeStatus() != null) {
+            if (relation.getRechargeStatus() == GroupsRelation.RechargeStatus.complete) {
                 throw BusinessRuntimeException.getInstance("代充账号已充值");
             }
-            if (StrUtil.isEmpty(relation.getAccount())) {
+            if (StrUtil.isEmpty(account)) {
                 throw BusinessRuntimeException.getInstance("请输入正确的账号信息");
             }
-            if (re.getRechargeStatus() == GroupsRelation.RechargeStatus.error) {
+            if (relation.getRechargeStatus() == GroupsRelation.RechargeStatus.error) {
                 updateWrapper.set(GroupsRelation::getRechargeStatus, GroupsRelation.RechargeStatus.waiting);
             }
             relationMapper.update(relation, updateWrapper);
@@ -1420,4 +1429,28 @@ public class GroupRelationController {
         TicketRenewUpgradeView renewView = groupRelationFrontService.getRenewUpgradeInfo(userId, relationId);
         return GatewayResponse.SUCCESS.newBuilder().toResult(renewView);
     }
+
+    /**
+     * 代充记录
+     */
+    @GetMapping("/get/recharge/record")
+    public Result<List<GptUserRechargeNumRecordView>> getRechargeRecord(Long relationId) {
+        long userId = StpUserUtil.getLoginIdAsLong();
+        List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
+        GroupsRelation relation = relationMapper.selectById(relationId);
+        if (relation == null || !userIdList.contains(relation.getUserId())) {
+            return GatewayResponse.SUCCESS.newBuilder().toResult();
+        }
+        Date filterDate = relation.getSubmitTime();
+        if (filterDate == null) {
+            filterDate = relation.getStartTime();
+        }
+        List<GptUserRechargeNumRecordView> search = beanSearcher.searchAll(GptUserRechargeNumRecordView.class, MapUtils.flatBuilder(request.getParameterMap())
+                .field(GptUserRechargeNumRecordView::getUserId, userIdList).op(Operator.InList)
+                .field(GptUserRechargeNumRecordView::getRelationId, relationId)
+                .field(GptUserRechargeNumRecordView::getCreatedTime, filterDate).op(Operator.GreaterEqual)
+                .orderBy(GptUserRechargeNumRecordView::getCreatedTime).desc()
+                .build());
+        return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+    }
 }

+ 26 - 4
netflix-web/src/main/java/com/cyksj/web/controller/manage/group/CmsGroupRelationController.java

@@ -110,7 +110,7 @@ public class CmsGroupRelationController {
      * 代充平台 用户账号车票列表
      */
     @GetMapping("/get/recharge")
-    public Result<SearchResult<GroupsRelationRechargeView>> getRechargeList(String rechargeStatus, String orderNo) {
+    public Result<SearchResult<GroupsRelationRechargeView>> getRechargeList(String rechargeStatus, String orderNo, Boolean isVipError) {
         MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
         if (StrUtil.isEmpty(rechargeStatus)) {
             builder.field(GroupsRelationRechargeView::getRechargeStatus).op(Operator.NotNull);
@@ -126,10 +126,18 @@ public class CmsGroupRelationController {
             }
             builder.field(GroupsRelationRechargeView::getRelationId, relationId);
         }
+        if (isVipError != null) {
+            builder.field(GroupsRelationRechargeView::getRechargeStatus, GroupsRelation.RechargeStatus.recharge_error.name());
+            if (isVipError) {
+                builder.field(GroupsRelationRechargeView::getRechargeErrorInfo, "会员").op(Operator.Contain);
+            } else {
+                builder.put("errorInfo", "(gr.recharge_error_info is null or gr.recharge_error_info not like '%会员%')");
+            }
+        }
         SearchResult<GroupsRelationRechargeView> search = beanSearcher.search(GroupsRelationRechargeView.class, builder
                 .field(GroupsRelationRechargeView::getStatus, List.of(GroupsRelation.Status.validity.name(), GroupsRelation.Status.outside.name())).op(Operator.InList)
                 .build());
-        search.getDataList().forEach(data->{
+        search.getDataList().forEach(data -> {
             OrderDon orderDon = orderDonMapper.selectOne(Wrappers.lambdaQuery(OrderDon.class)
                     .eq(OrderDon::getUserId, data.getUserId())
                     .eq(OrderDon::getRelationId, data.getRelationId())
@@ -174,16 +182,30 @@ public class CmsGroupRelationController {
         if (StrUtil.isNotEmpty(password)) {
             relation.setPassword(password);
         }
+        String contact = rechargeView.getContact();
+        if (StrUtil.isNotBlank(contact)) {
+            relation.setContact(contact);
+        }
         OrderDon orderDon = null;
         if (rechargeStatus == GroupsRelation.RechargeStatus.complete) {
             relation.setSendTime(DateTime.now());
             orderDon = orderDonMapper.selectOne(Wrappers.lambdaQuery(OrderDon.class)
                     .eq(OrderDon::getUserId, relation.getUserId())
                     .eq(OrderDon::getRelationId, relationId)
-                    .notIn(OrderDon::getStatus, Constant.noOrderStatus)
+                    .notIn(OrderDon::getStatus, Constant.noOrderAllStatus)
                     .orderByDesc(OrderDon::getId)
                     .last("limit 1"));
-            if (orderDon == null) throw BusinessRuntimeException.getInstance("该代充订单不存在");
+            if (orderDon == null){
+                orderDon = orderDonMapper.selectOne(Wrappers.lambdaQuery(OrderDon.class)
+                        .eq(OrderDon::getUserId, relation.getUserId())
+                        .eq(OrderDon::getRelationId, relationId)
+                        .notIn(OrderDon::getStatus, Constant.noOrderStatus)
+                        .orderByDesc(OrderDon::getId)
+                        .last("limit 1"));
+                if (orderDon == null) {
+                    throw BusinessRuntimeException.getInstance("该代充订单不存在");
+                }
+            }
             if (orderDon.getStatus() == OrderDon.Status.refund) {
                 throw BusinessRuntimeException.getInstance("该代充订单已退款");
             }