Переглянути джерело

账号列表增加空车位筛选; 奈飞申请冻结车票赠送GPT基础月付;冻结车票退款 清除送的车票

zoujiajian 11 місяців тому
батько
коміт
2095721ef4

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/AccountNetflixFrozenTicketReceivedRecordMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.AccountNetflixFrozenTicketReceivedRecord;
+
+/**
+ * 项目名: yhlxj11111111
+ * 文件名: AccountNetflixFrozenTicketReceivedRecordMapper
+ * 创建者: JavaZou
+ * 创建时间:2025/9/12 15:37
+ */
+public interface AccountNetflixFrozenTicketReceivedRecordMapper extends BaseMapper<AccountNetflixFrozenTicketReceivedRecord> {
+}

+ 24 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/AccountNetflixFrozenTicketReceivedRecord.java

@@ -0,0 +1,24 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj11111111
+ * 文件名: AccountNetflixFrozenTicketReceivedRecord
+ * 创建者: JavaZou
+ * 创建时间:2025/9/12 15:36
+ */
+@Getter
+@Setter
+public class AccountNetflixFrozenTicketReceivedRecord extends BaseEntity{
+
+	private Long userId;
+
+	private Long relationId;
+
+	/**
+	 * 赠送车票id
+	 */
+	private Long sendRelationId;
+}

+ 2 - 1
netflix-dao/src/main/java/com/cyksj/model/entity/CorpKfAccountSessionChat.java

@@ -18,7 +18,8 @@ import java.util.Date;
 @Setter
 @SearchBean(tables = "corp_kf_account_session_chat cc" +
 		" LEFT JOIN corp_follow cf on cf.userid = cc.servicer_userid" +
-		" LEFT JOIN corp_kf_user cu on cu.external_userid = cc.external_userid")
+		" LEFT JOIN corp_kf_user cu on cu.external_userid = cc.external_userid",
+		orderBy = "cc.send_time")
 public class CorpKfAccountSessionChat extends BaseEntity{
 	@DbField("cc.open_kf_id")
 	private String openKfId;

+ 14 - 0
netflix-dao/src/main/java/com/cyksj/model/excel/ExcelManageAccountData.java

@@ -97,6 +97,20 @@ public class ExcelManageAccountData {
 	@ExcelIgnore
 	private GroupsTrips.Status gtStatus;
 
+	/**
+	 * 车位数量
+	 */
+	@DbField("gt.num")
+	@ExcelIgnore
+	private Integer num;
+
+	/**
+	 * 可用车位数
+	 */
+	@DbField("gt.available_num")
+	@ExcelIgnore
+	private Integer availableNum;
+
 	@ExcelProperty("激活更新状态")
 	@DbIgnore
 	private String activeCodeStatus;

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

@@ -112,6 +112,18 @@ public class AccountView {
     @DbField("gt.status")
     private GroupsTrips.Status gtStatus;
 
+    /**
+     * 车位数量
+     */
+    @DbField("gt.num")
+    private Integer num;
+
+    /**
+     * 可用车位数
+     */
+    @DbField("gt.available_num")
+    private Integer availableNum;
+
     /**
      * 账号备注
      */

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

@@ -233,6 +233,8 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
 
     private final NanoUserQuotaMapper nanoUserQuotaMapper;
 
+    private final AccountNetflixFrozenTicketReceivedRecordMapper receivedRecordMapper;
+
     private static final GlobalThreadPoolTaskExecutor TASK_POOL = GlobalThreadPoolTaskExecutor.getInstance();
 
     @Override
@@ -1116,6 +1118,19 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
         goodsDonStockService.upStockRelate(null, orderDon.getId(), "refund");
         try {
             if (!orderDon.getIsDp()) {
+                GroupsRelation relation = relationMapper.selectById(orderDon.getRelationId());
+                //冻结车票 清除
+                if (relation != null && relation.getIsFrozen()) {
+                    Optional.ofNullable(receivedRecordMapper.selectOne(Wrappers.lambdaQuery(AccountNetflixFrozenTicketReceivedRecord.class).eq(AccountNetflixFrozenTicketReceivedRecord::getRelationId, relation.getId()).last("limit 1")))
+                            .ifPresent(rr -> {
+                                Long sendRelationId = rr.getSendRelationId();
+                                List<Long> userIdList = userBindRelationService.getRelationUserIdList(orderDon.getUserId(), null);
+                                GroupsRelation sendRelation = groupsRelationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class).eq(GroupsRelation::getId, sendRelationId).in(GroupsRelation::getUserId, userIdList).last("limit 1"));
+                                if (sendRelation != null) {
+                                    relationClearService.clearTicket(sendRelation, UserTicketClearedRecord.Source.manual);
+                                }
+                            });
+                }
                 //虚物订单退款,清出车队,车票变为已过期
                 orderCommonService.clearUnrealGoodsDetail(orderDon, goodsDon.getType(), sku);
             }

+ 14 - 1
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderCommonServiceImpl.java

@@ -62,6 +62,7 @@ public class OrderCommonServiceImpl implements OrderCommonService {
 					.in(GroupsRelation::getUserId, userIdList)
 					.eq(GroupsRelation::getId, relationId)
 					.in(GroupsRelation::getStatus, List.of(GroupsRelation.Status.validity, GroupsRelation.Status.outside)));
+			Date oriExpiryTime = relation.getExpiryTime();
 			//车票变更之后
 			if (relation == null || orderDon.getIsChangeTicket()) {
 				UserRenewChangeTicketRecord record = userRenewChangeTicketRecordMapper.selectOne(Wrappers.lambdaQuery(UserRenewChangeTicketRecord.class)
@@ -141,7 +142,19 @@ public class OrderCommonServiceImpl implements OrderCommonService {
 							clearService.clearTicket(relation, UserTicketClearedRecord.Source.refund);
 						} else {
 							if (sku.getGoodsId() == Constant.CLAUDE_CODE_GOODS_ID) {
-								//是否还存在其他 TODO
+
+							}
+						}
+					}
+				}
+				if (relation != null && relation.getIsFrozen()) {
+					Date thisExpiryTime = relation.getExpiryTime();
+					if (thisExpiryTime != null) {
+						Long day = DateUtil.betweenDay(thisExpiryTime, oriExpiryTime, false);
+						if (day > 0) {
+							relation.setReservedDays(relation.getReservedDays() - day.intValue());
+							if (relation.getReservedDays() > 0) {
+								groupsRelationMapper.updateById(relation);
 							}
 						}
 					}

+ 32 - 0
netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupRelationFrontServiceImpl.java

@@ -213,6 +213,8 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 
 	private final NanoUserQuotaMapper nanoUserQuotaMapper;
 
+	private final AccountNetflixFrozenTicketReceivedRecordMapper accountNetflixFrozenTicketReceivedRecordMapper;
+
 	@Override
 	public SearchResult<RenewalView> getMyTicket(long userId, Boolean isLoginPopularize, String customId, String account, String orderNo, Integer cmt) {
 		User u = userMapper.selectById(userId);
@@ -445,6 +447,13 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 					}
 				}
 				markVipDeductTicket(userIds, ticket, vipGoodsIds, vipUserCount > 0);
+
+				if (ticket.getIsVipDeduct() != null && ticket.getIsVipDeduct()) {
+					//订单不存在
+					if (orderDon == null) {
+						ticket.setIsVipDeduct(Boolean.FALSE);
+					}
+				}
 			});
 		}
 		userLoginRecordService.saveUserLoginDayRecord(userId);
@@ -1315,6 +1324,20 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 		if (state == 2) {
 			return status;
 		}
+		//未异常
+		if (state != 3) {
+			//车队是否已下架
+			GroupsRelation relation = groupsRelationMapper.selectById(relationId);
+			GroupsTrips groupsTrips = groupsMapper.selectById(relation.getGroupsId());
+			if (groupsTrips != null && groupsTrips.getStatus() == GroupsTrips.Status.down) {
+				state = 3;
+				//下架 异常
+				if (netflixUseAccountStatusRecord != null) {
+					netflixUseAccountStatusRecord.setState(state);
+					netflixUserAccountStatusRecordMapper.updateById(netflixUseAccountStatusRecord);
+				}
+			}
+		}
 		//账号检测状态
 		status.setNfStatus(state);
 		NetflixUserAccountSubmitRecoverRecord recoverRecord = netflixUserAccountSubmitRecoverRecordMapper.selectOne(Wrappers.lambdaQuery(NetflixUserAccountSubmitRecoverRecord.class)
@@ -2058,6 +2081,15 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 				.set(GroupsRelation::getReservedDays, betweenDay)
 				.eq(GroupsRelation::getId, netflixRelationView.getId())
 				.eq(GroupsRelation::getUserId, netflixRelationView.getUserId()));
+		//送一个月GPT基础月付
+		Long sendRelationId = getTicket(userId, Constant.GPT_MIRROR_COMMON_SKU_ID, Boolean.FALSE);
+		if (sendRelationId != null) {
+			AccountNetflixFrozenTicketReceivedRecord receivedRecord = new AccountNetflixFrozenTicketReceivedRecord();
+			receivedRecord.setUserId(userId);
+			receivedRecord.setRelationId(relationId);
+			receivedRecord.setSendRelationId(sendRelationId);
+			accountNetflixFrozenTicketReceivedRecordMapper.insert(receivedRecord);
+		}
 	}
 
 	private DistributePosterGoodsDetailView setGoodsPoster(RenewalView ticket, User user, List<Long> userIds) {

+ 5 - 0
netflix-service/src/main/java/com/cyksj/service/vip/impl/VipFrontServiceImpl.java

@@ -192,6 +192,11 @@ public class VipFrontServiceImpl implements VipFrontService {
 					}
 				}
 			}
+			//订单是否存在
+			Integer selectCount = orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class).eq(OrderDon::getRelationId, relation.getId()).in(OrderDon::getUserId, userIdList).notIn(OrderDon::getStatus, Constant.noOrderAllStatus));
+			if (selectCount == 0) {
+				continue;
+			}
 			Long skuId = relation.getSkuId();
 			deductGoodsIds.add(goodsId);
 			Long relationId = relation.getId();

+ 9 - 2
netflix-web/src/main/java/com/cyksj/web/controller/manage/account/CmsAccountController.java

@@ -126,7 +126,7 @@ public class CmsAccountController {
 
 	@GetMapping("/get")
 	@SaCheckPermission("account:view")
-	public Result<SearchResult<AccountView>> get(String title, Long userId, String showId, String nickName, String submitAccount, String expiryStartTime, String expiryEndTime, Boolean expiredAll, Boolean existsExpired, Boolean existsExpiredToday, Integer noChangeMonths, Boolean isMjMirror, String orderNo) {
+	public Result<SearchResult<AccountView>> get(String title, Long userId, String showId, String nickName, String submitAccount, String expiryStartTime, String expiryEndTime, Boolean expiredAll, Boolean existsExpired, Boolean existsExpiredToday, Integer noChangeMonths, Boolean isMjMirror, String orderNo, Boolean isEmpty) {
 		MapBuilder mapBuilder = MapUtils.flatBuilder(request.getParameterMap());
 		if (StrUtil.isNotEmpty(expiryStartTime) || StrUtil.isNotEmpty(expiryEndTime)) {
 			mapBuilder.field(AccountView::getExpiryTime, expiryStartTime, expiryEndTime)
@@ -143,6 +143,9 @@ public class CmsAccountController {
 		if (StrUtil.isNotEmpty(showId)) {
 			userId = userMapper.getUserIdByShowId(showId);
 		}
+		if (isEmpty != null && isEmpty) {
+			mapBuilder.field(AccountView::getNum, AccountView::getAvailableNum).sql("$1 = $2");
+		}
 		//用户订单号查找对应账号
 		if (StrUtil.isNotBlank(orderNo)) {
 			Long groupId = 0l;
@@ -252,7 +255,7 @@ public class CmsAccountController {
     @GetMapping("/export/account")
     @SaCheckPermission("account:export")
     @Log(module = "平台管理/导出账号", businessType = BusinessType.EXPORT, isSaveRequestData = true)
-	public void exportAccount(String title, Long userId, String showId, String nickName, String submitAccount, String expiryStartTime, String expiryEndTime, Boolean expiredAll, Boolean existsExpired, Boolean existsExpiredToday, Integer noChangeMonths, HttpServletResponse response) {
+    public void exportAccount(String title, Long userId, String showId, String nickName, String submitAccount, String expiryStartTime, String expiryEndTime, Boolean expiredAll, Boolean existsExpired, Boolean existsExpiredToday, Integer noChangeMonths, Boolean isEmpty, HttpServletResponse response) {
         MapBuilder mapBuilder = MapUtils.flatBuilder(request.getParameterMap());
         if (StrUtil.isNotEmpty(expiryStartTime) || StrUtil.isNotEmpty(expiryEndTime)) {
             mapBuilder.field(ExcelManageAccountData::getExpiryTime, expiryStartTime, expiryEndTime)
@@ -271,6 +274,10 @@ public class CmsAccountController {
 			}
 		}
 
+	    if (isEmpty != null && isEmpty) {
+		    mapBuilder.field(ExcelManageAccountData::getNum, ExcelManageAccountData::getAvailableNum).sql("$1 = $2");
+	    }
+
         if (userId != null || StringUtils.isNotBlank(nickName) || StringUtils.isNotBlank(submitAccount)) {
             List<Long> accountIds = homeGroupMapper.getAccountIdsByUserIdOrNickNameOrSubmitAccount(userId, nickName, submitAccount);
             if (accountIds.isEmpty()) {

+ 1 - 1
netflix-web/src/main/java/com/cyksj/web/controller/manage/corp/CorpMsgAuditController.java

@@ -119,7 +119,7 @@ public class CorpMsgAuditController {
      */
     @GetMapping("/getMsgByFollowIdAndUserId")
     public Result<SearchResult<QyMsgContent>> getMsgByFollowIdAndUserId(){
-        Map<String, Object> build = MapUtils.flatBuilder(request.getParameterMap()).build();
+        Map<String, Object> build = MapUtils.flatBuilder(request.getParameterMap()).orderBy(QyMsgContent::getMsgtime).build();
         log.info("获取聊天记录 param:{}", JSONUtil.toJsonStr(build));
         if (!build.containsKey("followId") || !build.containsKey("externalUserid")){
             throw BusinessRuntimeException.getInstance("缺少必填参数.");

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

@@ -217,6 +217,9 @@ public class StatisticsDataController {
 		incrExpiryTimeRecord.setIncrExpiryDays(renewTimeUpReq.getDays());
 		incrExpiryTimeRecord.setRemark(renewTimeUpReq.getRemark());
 		relation.setExpiryTime(DateUtil.offsetDay(relation.getExpiryTime(), renewTimeUpReq.getDays()));
+		if (relation.getReservedDays() != null && relation.getReservedDays() > 0) {
+			relation.setReservedDays(relation.getReservedDays() + incrExpiryTimeRecord.getIncrExpiryDays());
+		}
 		groupsRelationMapper.updateById(relation);
 
 		//扣除镜像过期时间