Browse Source

Merge remote-tracking branch 'origin/master'

zoujiajian 2 năm trước cách đây
mục cha
commit
a959fc0775
21 tập tin đã thay đổi với 315 bổ sung31 xóa
  1. 3 0
      netflix-common/src/main/java/com/cyksj/common/util/TicketCodeCommonUtil.java
  2. 1 1
      netflix-dao/src/main/java/com/cyksj/mapper/UserMapper.java
  3. 5 0
      netflix-dao/src/main/java/com/cyksj/model/entity/ExchangeCode.java
  4. 5 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserReceiveTrialTicketRecord.java
  5. 77 0
      netflix-dao/src/main/java/com/cyksj/model/views/ExternalExchangeCodeView.java
  6. 2 1
      netflix-dao/src/main/java/com/cyksj/model/views/UpgradePackageView.java
  7. 5 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserInfoView.java
  8. 1 0
      netflix-service/src/main/java/com/cyksj/redis/RedisService.java
  9. 19 1
      netflix-service/src/main/java/com/cyksj/service/chatgpt/impl/ChatGptAccountServiceImpl.java
  10. 1 1
      netflix-service/src/main/java/com/cyksj/service/distribute/equipment/impl/EquipmentDistributeFrontServiceImpl.java
  11. 1 1
      netflix-service/src/main/java/com/cyksj/service/exchange/ExchangeCodeService.java
  12. 3 2
      netflix-service/src/main/java/com/cyksj/service/exchange/impl/ExchangeCodeServiceImpl.java
  13. 2 0
      netflix-service/src/main/java/com/cyksj/service/mange/CmsOrderDonService.java
  14. 7 2
      netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java
  15. 16 1
      netflix-service/src/main/java/com/cyksj/service/midjourney/impl/MidJourneyAccountServiceImpl.java
  16. 1 1
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java
  17. 1 1
      netflix-service/src/main/java/com/cyksj/service/order/impl/UserRealOrderBenefitsImpl.java
  18. 10 4
      netflix-service/src/main/java/com/cyksj/service/ticket/impl/UserReceiveTrialTicketRecordServiceImpl.java
  19. 7 10
      netflix-web/src/main/java/com/cyksj/web/controller/cps/CpsBackLoginController.java
  20. 134 0
      netflix-web/src/main/java/com/cyksj/web/controller/external/ExternalController.java
  21. 14 5
      netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsOrderController.java

+ 3 - 0
netflix-common/src/main/java/com/cyksj/common/util/TicketCodeCommonUtil.java

@@ -32,6 +32,9 @@ public class TicketCodeCommonUtil {
 			if (goodsId == 33l) {
 				str = "X-Report-Abuse: abuse@adobe.com";
 			}
+			if (goodsId == 3l) {
+				str = "Noto Sans Display', Helvetica, Arial, sans-serif; font-weight: 600;text-align: center;";
+			}
 			index = body.indexOf(str);
 		}
 		String code = StrUtil.subWithLength(body, index, 512);

+ 1 - 1
netflix-dao/src/main/java/com/cyksj/mapper/UserMapper.java

@@ -31,7 +31,7 @@ public interface UserMapper extends BaseMapper<User> {
     @Update("update user set active_points = active_points - #{subPoints} where active_points > 0 and active_points >= #{subPoints} and id = #{userId}")
     Integer subActivePoints(@Param("userId") Long userId, @Param("subPoints") BigDecimal subPoints);
 
-    @Select("select id from user where nickname like concat(#{nickname},'%')")
+    @Select("select id from user where nickname like concat('%',#{nickname},'%')")
     List<Long> selectListByNickname(String nickname);
 
     @Update("update user set points = points - #{deductPoints} where id = #{id} and points = #{originalPoints}")

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

@@ -31,6 +31,11 @@ public class ExchangeCode extends BaseEntity{
 	 */
 	private Boolean useStatus;
 
+	/**
+	 * 订单状态
+	 */
+	private String orderStatus;
+
 	/**
 	 * 使用时间
 	 */

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

@@ -19,4 +19,9 @@ public class UserReceiveTrialTicketRecord extends BaseEntity{
 	private Long skuId;
 
 	private Long relationId;
+
+	/**
+	 * mj会话 user_id
+	 */
+	private Long mjUserId;
 }

+ 77 - 0
netflix-dao/src/main/java/com/cyksj/model/views/ExternalExchangeCodeView.java

@@ -0,0 +1,77 @@
+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;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: ExternalExchangeCodeView
+ * 创建者: JavaZou
+ * 创建时间:2024/6/11 15:02
+ */
+@Getter
+@Setter
+@SearchBean(tables = "exchange_code ec left join user u on u.id = ec.user_id" +
+		" left join goods_don gd on ec.goods_id = gd.id" +
+		" left join goods_don_sku gdk on gdk.id = ec.sku_id",
+		where = "ec.type = 0",
+		orderBy = "ec.id desc")
+public class ExternalExchangeCodeView {
+	@DbField("ec.id")
+	private Long id;
+
+	@DbField("ec.code")
+	private String code;
+
+	@DbField("ec.goods_id")
+	private Long goodsId;
+
+	@DbField("ec.sku_id")
+	private Long skuId;
+
+	/**
+	 * 平台名称
+	 */
+	@DbField("gd.title")
+	private String title;
+
+	/**
+	 * 规格名称,金额
+	 */
+	@DbField("gdk.spec_val")
+	private String specVal;
+
+	/**
+	 * 使用状态
+	 */
+	@DbField("ec.use_status")
+	private Boolean useStatus;
+
+	/**
+	 * 订单状态
+	 */
+	@DbField("ec.order_status")
+	private String orderStatus;
+
+	/**
+	 * 使用时间
+	 */
+	@DbField("ec.use_time")
+	private Date useTime;
+
+	/**
+	 * 使用人id
+	 */
+	@DbField("ec.user_id")
+	private Long userId;
+
+	/**
+	 * 生成日期
+	 */
+	@DbField("ec.created_time")
+	private Date createdTime;
+}

+ 2 - 1
netflix-dao/src/main/java/com/cyksj/model/views/UpgradePackageView.java

@@ -13,7 +13,8 @@ import java.math.BigDecimal;
  */
 @Data
 @SearchBean(tables = "upgrade_package up left join goods_don g on up.goods_id = g.id "
-        , where = "up.deleted = true :sku:")
+        , where = "up.deleted = true :sku:",
+        orderBy = "up.num asc")
 public class UpgradePackageView {
     @DbField("up.id")
     private Long id;

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/model/views/UserInfoView.java

@@ -18,4 +18,9 @@ public class UserInfoView {
 	private String img;
 
 	private String nickname;
+
+	/**
+	 * 是否是设备分销
+	 */
+	private Boolean isEp;
 }

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

@@ -838,6 +838,7 @@ public class RedisService {
         MIDJOURNEY_RELAX_LIMIT("midjourney:relax:limit:", "midjourney relax次数", 60 * 60 * 48L),
         MIDJOURNEY_EXPIRE_TIME("midjourney:expire:time:", "midjourney expire time", 60 * 60 * 48L),
         MIDJOURNEY_USER("midjourney:user:", "midjourney user", 60 * 60 * 2L),
+        MIDJOURNEY_ACCOUNT("midjourney:account:", "midjourney account", 60 * 60 * 48L),
         APPLY_MONEY_DAY_LIMIT_KEY("apply_money_day_limit_key:%s:%s:%s", "每日提现次数限制", 60 * 60 * 24L),
 
         ;

+ 19 - 1
netflix-service/src/main/java/com/cyksj/service/chatgpt/impl/ChatGptAccountServiceImpl.java

@@ -4,6 +4,7 @@ import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUnit;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.lang.UUID;
+import cn.hutool.core.util.RandomUtil;
 import cn.hutool.http.HttpRequest;
 import cn.hutool.http.HttpResponse;
 import cn.hutool.http.HttpUtil;
@@ -15,6 +16,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.task.GlobalThreadPoolTaskExecutor;
+import com.cyksj.common.util.Jsons;
 import com.cyksj.common.util.StringUtil;
 import com.cyksj.mapper.*;
 import com.cyksj.mapper.station.CollegeStudentStationUseTicketRecordMapper;
@@ -26,6 +28,7 @@ import com.cyksj.model.views.ChatGptUserView;
 import com.cyksj.model.views.ChatgptCarInfoView;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.chatgpt.ChatGptAccountService;
+import com.cyksj.service.sys.SysConfigService;
 import com.cyksj.service.user.UserBindRelationService;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
@@ -104,6 +107,8 @@ public class ChatGptAccountServiceImpl implements ChatGptAccountService {
 
     private final OrderDonMapper orderDonMapper;
 
+    private final SysConfigService sysConfigService;
+
     @Override
     public String addAccount(Account account) {
         if (isAccountExists(account)) {
@@ -250,7 +255,20 @@ public class ChatGptAccountServiceImpl implements ChatGptAccountService {
         GoodsDonSku goodsDonSku = skuMapper.selectById(groupsTrips.getSkuId());
         if (goodsDonSku != null && goodsDonSku.getIsMirror() && goodsDonSku.getIsCar()) {
             ChatgptUser chatgptUser = getChatgptCarUser(userId, relationId, groupsRelation, goodsDonSku);
+
             String DOMAIN = "https://chat.galaxydvd.com";
+            try {
+                SysConfig sysConfig = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class).eq(SysConfig::getSysKey, "mirror_gpt_domain"));
+                if (sysConfig != null) {
+                    String sysValue = sysConfig.getSysValue();
+                    if (JSONUtil.isJsonArray(sysValue)) {
+                        List<String> domainList = JSONUtil.parseArray(sysValue).toList(String.class);
+                        DOMAIN = domainList.get(RandomUtil.randomInt(domainList.size()));
+                    }
+                }
+            }catch (Exception e){
+                log.error("随机抽取域名错误. msg:{}", StringUtil.getErrorText(e));
+            }
             log.info("domain:{},用户:{},所在车次:{},座位id:{},在{}获取跳转GPT镜像的登录url", DOMAIN, userId, groupsTrips.getId(), relationId, DateTime.now());
             return DOMAIN + "/auth/logintoken?carid=" + carId + "&usertoken=" + chatgptUser.getUserToken();
         } else {
@@ -619,7 +637,7 @@ public class ChatGptAccountServiceImpl implements ChatGptAccountService {
         GroupsTrips groupsTrips = getGroupsTrips(groupsRelation);
         GoodsDonSku goodsDonSku = skuMapper.selectById(groupsTrips.getSkuId());
 
-        if (goodsDonSku != null && goodsDonSku.getIsMirror() && goodsDonSku.getIsCar()) {
+        if (goodsDonSku != null && goodsDonSku.getGoodsId() == 18 && goodsDonSku.getIsMirror() && goodsDonSku.getIsCar()) {
             ChatgptUser chatgptUser = getChatgptCarUser(userId, relationId, groupsRelation, goodsDonSku);
             return true;
         } else {

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

@@ -70,7 +70,7 @@ public class EquipmentDistributeFrontServiceImpl implements EquipmentDistributeF
 		}
 		if (groupsRelationView == null) {
 			//领取权益时,没有车票的用户自动上车,获得对应车票
-			GroupsRelation relation = exchangeCodeService.getGroupTripsTicket(null, goodsDonSku, userId, null, OrderDon.Type.EQUIPMENT);
+			GroupsRelation relation = exchangeCodeService.getGroupTripsTicket(null, goodsDonSku, userId, null, OrderDon.Type.EQUIPMENT, null);
 			relationId = relation.getId();
 			orderId = relation.getOrderId();
 		} else {

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

@@ -37,7 +37,7 @@ public interface ExchangeCodeService extends IService<ExchangeCode> {
 	/**
 	 * 获取车票
 	 */
-	GroupsRelation getGroupTripsTicket(Long yhsId, GoodsDonSku sku, Long userId, OrderDon exCodeOrderDon, OrderDon.Type orderDonTye);
+	GroupsRelation getGroupTripsTicket(Long yhsId, GoodsDonSku sku, Long userId, OrderDon exCodeOrderDon, OrderDon.Type orderDonTye, String exCode);
 
 	/**
 	 * 获取车票车位

+ 3 - 2
netflix-service/src/main/java/com/cyksj/service/exchange/impl/ExchangeCodeServiceImpl.java

@@ -179,7 +179,7 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 			throw BusinessRuntimeException.getInstance("您的订单已退款,无法使用该兑换码");
 		}
 		//生成车票订单
-		getGroupTripsTicket(yhsId, goodsDonSkuMapper.selectById(exchangeCode.getSkuId()), userId, orderDon, OrderDon.Type.EX_CODE);
+		getGroupTripsTicket(yhsId, goodsDonSkuMapper.selectById(exchangeCode.getSkuId()), userId, orderDon, OrderDon.Type.EX_CODE, exchangeCodeTicket.getCode());
 		log.info("用户:{}通过兑换码:{}兑换成功", userId, exchangeCodeTicket.getCode());
 		if (exchangeCode.getType() == 1) {
 			luckyDrawRecordMapper.updateExCodeStatus(userId, exchangeCode.getCode());
@@ -237,7 +237,7 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 	 * 获取车位
 	 */
 	@Override
-	public GroupsRelation getGroupTripsTicket(Long yhsId, GoodsDonSku sku, Long userId, OrderDon exCodeOrderDon, OrderDon.Type orderDonTye) {
+	public GroupsRelation getGroupTripsTicket(Long yhsId, GoodsDonSku sku, Long userId, OrderDon exCodeOrderDon, OrderDon.Type orderDonTye, String exCode) {
 		if (sku == null) {
 			throw BusinessRuntimeException.getInstance("规格不存在,请联系客服");
 		}
@@ -304,6 +304,7 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 			//默认数量为1
 			orderDon.setNum(1);
 			orderDon.setGoodsId(sku.getGoodsId());
+			orderDon.setExCode(exCode);
 			orderDon.setStatus(goodsDon.getType() == 1 && goodsDon.getSecondType() == 2 ? OrderDon.Status.complete : OrderDon.Status.hasPayment);
 			if (relation.getStartTime() == null || relation.getExpiryTime() == null) {
 				orderDon.setStatus(OrderDon.Status.hasPayment);

+ 2 - 0
netflix-service/src/main/java/com/cyksj/service/mange/CmsOrderDonService.java

@@ -57,4 +57,6 @@ public interface CmsOrderDonService extends IService<OrderDon> {
 	void refundPriceDiffer(OrderRefundReq orderRefundReq) throws Exception;
 
 	void clearBalanceToRefundMoney(OrderBalanceRefundReq refundReq) throws Exception;
+
+	void delMirrorUser(Long goodsId, Long relationId);
 }

+ 7 - 2
netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java

@@ -685,7 +685,9 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
         relationClearService.clearTicket(relation, source);
 
         //是否是GPT镜像规格
-        delMirrorUser(orderDon.getGoodsId(), orderDon.getRelationId());
+        if (orderDon.getOrderType() == 1) {
+            delMirrorUser(orderDon.getGoodsId(), orderDon.getRelationId());
+        }
 
         if (plusPurchaseSkuRelation != null && plus_relationList != null) {
             plus_relationList.remove(relationId);
@@ -1034,7 +1036,9 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
                 giftCardOrderUseRecordService.returnGiftCardCash(orderDon.getId());
             }
             //是否是GPT镜像规格
-            delMirrorUser(orderDon.getGoodsId(), orderDon.getRelationId());
+            if (orderDon.getOrderType() == 1) {
+                delMirrorUser(orderDon.getGoodsId(), orderDon.getRelationId());
+            }
             //是否是分销订单
             //处理下级渠道分销提成
             handleSubRewards(orderDon);
@@ -1315,6 +1319,7 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
     /**
      * 删除gptUser
      */
+    @Override
     public void delMirrorUser(Long goodsId, Long relationId) {
         //gpt镜像
         if (goodsId != null && goodsId == 18) {

+ 16 - 1
netflix-service/src/main/java/com/cyksj/service/midjourney/impl/MidJourneyAccountServiceImpl.java

@@ -63,6 +63,11 @@ public class MidJourneyAccountServiceImpl extends ServiceImpl<MidjourneyAccountM
         Long instanceId = getAccount(midjourneyAccount.getId());
         midjourneyAccount.setInstanceId(instanceId);
         baseMapper.updateById(midjourneyAccount);
+        String key = RedisService.key.MIDJOURNEY_ACCOUNT.getName();
+        Map<Object, Object> accountsUsage = redisService.hmget(key);
+        if (MapUtil.isNotEmpty(accountsUsage)) {
+            redisService.hset(key,midjourneyAccount.getInstanceId().toString(),accountsUsage.values().toArray()[0]);
+        }
     }
 
     @Override
@@ -75,6 +80,7 @@ public class MidJourneyAccountServiceImpl extends ServiceImpl<MidjourneyAccountM
         baseMapper.deleteById(id);
         //删除plus服务账号信息
         delAcount(midjourneyAccount.getInstanceId());
+        redisService.hdel(RedisService.key.MIDJOURNEY_ACCOUNT.getName(),midjourneyAccount.getInstanceId());
     }
 
     @Override
@@ -98,6 +104,15 @@ public class MidJourneyAccountServiceImpl extends ServiceImpl<MidjourneyAccountM
         midjourneyAccount.setStatus(!midjourneyAccount.getStatus());
         baseMapper.updateById(midjourneyAccount);
         updAccount(midjourneyAccount);
+        String key = RedisService.key.MIDJOURNEY_ACCOUNT.getName();
+        if (!midjourneyAccount.getStatus()) {
+            redisService.hdel(key,midjourneyAccount.getInstanceId());
+        }else {
+            Map<Object, Object> accountsUsage = redisService.hmget(key);
+            if (MapUtil.isNotEmpty(accountsUsage)) {
+                redisService.hset(key,midjourneyAccount.getInstanceId().toString(),accountsUsage.values().toArray()[0]);
+            }
+        }
     }
 
     @Override
@@ -175,7 +190,7 @@ public class MidJourneyAccountServiceImpl extends ServiceImpl<MidjourneyAccountM
         GroupsTrips groupsTrips = getGroupsTrips(groupsRelation);
         GoodsDonSku goodsDonSku = skuMapper.selectById(groupsTrips.getSkuId());
 
-        if (goodsDonSku != null && goodsDonSku.getIsMirror()) {
+        if (goodsDonSku != null && goodsDonSku.getGoodsId() == 26 && goodsDonSku.getIsMirror()) {
             return getMidjourneyUser(userId, relationId, groupsRelation, goodsDonSku);
         } else {
             throw BusinessRuntimeException.getInstance("服务器出了点问题");

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

@@ -3283,7 +3283,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 				BigDecimal payUpgradePackagePrice = singlePrice.multiply(BigDecimal.valueOf(remainDay));
 				//车票当日买 当天升级 用套餐包原价
-				if (totalDays == remainDay) {
+				if (DateUtil.isSameDay(now, groupsRelation.getStartTime())) {
 					payUpgradePackagePrice = differPrice;
 				}
 				if (payRequest.getDonMoney().compareTo(payUpgradePackagePrice) < 0) {

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

@@ -76,7 +76,7 @@ public class UserRealOrderBenefitsImpl implements UserRealOrderBenefitsService {
 			if (CollUtil.isEmpty(relationViewList)) {
 				log.info("用户userId:{}未有skuId:{}车票,获取对应车票", userId, sku.getId());
 				//领取权益时,没有车票的用户自动上车,获得对应车票
-				GroupsRelation relation = exchangeCodeService.getGroupTripsTicket(yhsId, sku, userId, null, OrderDon.Type.PAY_EQUIPMENT);
+				GroupsRelation relation = exchangeCodeService.getGroupTripsTicket(yhsId, sku, userId, null, OrderDon.Type.PAY_EQUIPMENT, null);
 //				//多给三天
 //				DateTime expiryTime = DateUtil.offsetDay(relation.getExpiryTime(), 3);
 //				groupsRelationMapper.update(null, Wrappers.lambdaUpdate(GroupsRelation.class)

+ 10 - 4
netflix-service/src/main/java/com/cyksj/service/ticket/impl/UserReceiveTrialTicketRecordServiceImpl.java

@@ -6,11 +6,9 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.util.StringUtil;
 import com.cyksj.mapper.*;
-import com.cyksj.model.entity.GoodsDonSku;
-import com.cyksj.model.entity.GroupsRelation;
-import com.cyksj.model.entity.GroupsTrips;
-import com.cyksj.model.entity.UserReceiveTrialTicketRecord;
+import com.cyksj.model.entity.*;
 import com.cyksj.service.groups.GroupsFuncService;
+import com.cyksj.service.midjourney.MidjourneyAccountService;
 import com.cyksj.service.ticket.UserReceiveTrialTicketRecordService;
 import com.cyksj.service.user.UserBindRelationService;
 import com.github.rholder.retry.*;
@@ -47,6 +45,8 @@ public class UserReceiveTrialTicketRecordServiceImpl implements UserReceiveTrial
 
 	private final OrderDonMapper orderDonMapper;
 
+	private final MidjourneyAccountService midjourneyAccountService;
+
 	@Override
 	public void sendTicketAndRecord(Long userId, Long trialSkuId) {
 		List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
@@ -78,6 +78,12 @@ public class UserReceiveTrialTicketRecordServiceImpl implements UserReceiveTrial
 
 			Long relationId = getTrialTicketByUserIdAndGoodsId(userId, trialSkuId);
 			userReceiveTrialTicketRecord.setRelationId(relationId);
+			try {
+				//mj user
+				MidjourneyUser midjourneyUser = midjourneyAccountService.getMidjourneyUserToken(userId, relationId);
+				userReceiveTrialTicketRecord.setMjUserId(midjourneyUser.getId());
+			} catch (Exception e) {
+			}
 			userReceiveTrialTicketRecordMapper.updateById(userReceiveTrialTicketRecord);
 
 		} catch (DuplicateKeyException e) {

+ 7 - 10
netflix-web/src/main/java/com/cyksj/web/controller/cps/CpsBackLoginController.java

@@ -17,15 +17,13 @@ import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.UserMapper;
 import com.cyksj.mapper.manage.cps.CpsUserAdRecordMapper;
 import com.cyksj.mapper.manage.distribute.UserDistributeMapper;
+import com.cyksj.mapper.manage.distribute.equipment.UserDistributeEquipmentMapper;
 import com.cyksj.mapper.sys.SysConfigMapper;
 import com.cyksj.model.dto.AuthRedirect;
 import com.cyksj.model.dto.AuthToken;
 import com.cyksj.model.dto.CpsAuthDto;
 import com.cyksj.model.dto.GzhOAuth2UserInfo;
-import com.cyksj.model.entity.CpsUserAdRecord;
-import com.cyksj.model.entity.SysConfig;
-import com.cyksj.model.entity.User;
-import com.cyksj.model.entity.UserDistribute;
+import com.cyksj.model.entity.*;
 import com.cyksj.model.request.LoginReq;
 import com.cyksj.model.views.UserInfoView;
 import com.cyksj.redis.RedisService;
@@ -65,6 +63,8 @@ public class CpsBackLoginController {
 
 	private final UserDistributeMapper userDistributeMapper;
 
+	private final UserDistributeEquipmentMapper userDistributeEquipmentMapper;
+
 	private final CpsUserAdRecordMapper cpsUserAdRecordMapper;
 
 	private final SysConfigMapper sysConfigMapper;
@@ -100,11 +100,6 @@ public class CpsBackLoginController {
 	 */
 	@GetMapping("/wx/authLogin")
 	public Result<CpsAuthDto> wxAuthorize(String redirectUrl) throws Exception {
-		Object authUrlObj = redisService.get(RedisService.key.WX_LOGIN_AUTH_URI.getNameFormat("cps", wxOpenPlatYHLXLoginConfig.getAppId()));
-		if (authUrlObj != null) {
-			CpsAuthDto cpsAuthDto = Jsons.parseObject(authUrlObj.toString(), CpsAuthDto.class);
-			return GatewayResponse.SUCCESS.newBuilder().toResult(cpsAuthDto);
-		}
 		CpsAuthDto cpsAuthDto = new CpsAuthDto();
 		Long mappingId = SEQUENCE.nextId();
 		String authState = mappingId.toString();
@@ -115,7 +110,6 @@ public class CpsBackLoginController {
 		String wxAuthUrl = authorizationService.createWxAuthLoginUrl(state, wxOpenPlatYHLXLoginConfig.getAppId(), wxOpenPlatYHLXLoginConfig.getCpsRedirectUri());
 		cpsAuthDto.setAuthUrl(wxAuthUrl);
 		cpsAuthDto.setAuthState(authState);
-		redisService.set(RedisService.key.WX_LOGIN_AUTH_URI.getNameFormat("cps", wxOpenPlatYHLXLoginConfig.getAppId()), Jsons.toJson(cpsAuthDto), RedisService.key.WX_LOGIN_AUTH_URI.getTimeout());
 		return GatewayResponse.SUCCESS.newBuilder().toResult(cpsAuthDto);
 	}
 
@@ -206,6 +200,9 @@ public class CpsBackLoginController {
 		UserInfoView userInfoView = new UserInfoView();
 		userInfoView.setImg(user.getHeadimgurl());
 		userInfoView.setNickname(user.getNickname());
+		Integer selectCount = userDistributeEquipmentMapper.selectCount(Wrappers.lambdaQuery(UserDistributeEquipment.class)
+				.eq(UserDistributeEquipment::getUserId, cpsUserId));
+		userInfoView.setIsEp(selectCount > 0 ? true : false);
 		return GatewayResponse.SUCCESS.newBuilder().toResult(userInfoView);
 	}
 }

+ 134 - 0
netflix-web/src/main/java/com/cyksj/web/controller/external/ExternalController.java

@@ -0,0 +1,134 @@
+package com.cyksj.web.controller.external;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.Assert;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.constant.Constant;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.GoodsDonMapper;
+import com.cyksj.mapper.GoodsDonSkuMapper;
+import com.cyksj.mapper.OrderDonMapper;
+import com.cyksj.mapper.manage.exchange.ExchangeCodeMapper;
+import com.cyksj.model.entity.ExchangeCode;
+import com.cyksj.model.entity.GoodsDon;
+import com.cyksj.model.entity.GoodsDonSku;
+import com.cyksj.model.entity.OrderDon;
+import com.cyksj.model.request.ExchangeCodeReq;
+import com.cyksj.model.views.ExternalExchangeCodeView;
+import com.cyksj.service.exchange.ExchangeCodeService;
+import com.cyksj.service.mange.CmsOrderDonService;
+import com.cyksj.service.order.OrderCommonService;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: ExternalController
+ * 创建者: JavaZou
+ * 创建时间:2024/6/11 15:01
+ */
+@RestController
+@RequestMapping("/external/app")
+@RequiredArgsConstructor
+public class ExternalController {
+	private final HttpServletRequest request;
+
+	private final BeanSearcher beanSearcher;
+
+	private final ExchangeCodeMapper exchangeCodeMapper;
+
+	private final OrderDonMapper orderDonMapper;
+
+	private final OrderCommonService orderCommonService;
+
+	private final GoodsDonSkuMapper skuMapper;
+
+	private final GoodsDonMapper goodsDonMapper;
+
+	private final ExchangeCodeService exchangeCodeService;
+
+	private final CmsOrderDonService cmsOrderDonService;
+
+	/**
+	 * 知乎 特殊镜像规格 兑换码列表
+	 */
+	@GetMapping("/get/mirror")
+	public Result<SearchResult<ExternalExchangeCodeView>> getMirror() {
+		//目前只展示规格id 444 GPT基础镜像2月
+		Long showSkuId = 444l;
+		SearchResult<ExternalExchangeCodeView> search = beanSearcher.search(ExternalExchangeCodeView.class, MapUtils.flatBuilder(request.getParameterMap())
+				.field(ExternalExchangeCodeView::getSkuId, showSkuId)
+				.build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+	/**
+	 * 退款 成功 重新生成兑换码
+	 */
+	@PutMapping("/refund/{id}")
+	@Transactional(rollbackFor = Throwable.class)
+	public Result<String> refund(@PathVariable Long id) {
+		ExchangeCode exchangeCode = exchangeCodeMapper.selectById(id);
+		Assert.notNull(exchangeCode, "系统异常");
+		if (!exchangeCode.getUseStatus()) {
+			throw BusinessRuntimeException.getInstance("兑换码未使用");
+		}
+		if (DateTime.now().after(DateUtil.offsetDay(exchangeCode.getUseTime(), 1))) {
+			throw BusinessRuntimeException.getInstance("用户使用超过24小时不可退款");
+		}
+		if (StrUtil.equals(exchangeCode.getOrderStatus(), "refund")) {
+			throw BusinessRuntimeException.getInstance("兑换码已退");
+		}
+		OrderDon orderDon = orderDonMapper.selectOne(Wrappers.lambdaQuery(OrderDon.class)
+				.eq(OrderDon::getExCode, exchangeCode.getCode())
+				.notIn(OrderDon::getStatus, Constant.noOrderAllStatus)
+				.last("limit 1"));
+		if (orderDon == null) {
+			orderDon = orderDonMapper.selectOne(Wrappers.lambdaQuery(OrderDon.class)
+					.eq(OrderDon::getUserId, exchangeCode.getUserId())
+					.eq(OrderDon::getType, OrderDon.Type.EX_CODE)
+					.eq(OrderDon::getSkuId, exchangeCode.getSkuId())
+					.notIn(OrderDon::getStatus, Constant.noOrderAllStatus)
+					.last("limit 1"));
+		}
+		if (orderDon != null) {
+			//将mirror车票清空
+			orderDon.setStatus(OrderDon.Status.refund);
+			orderDonMapper.updateById(orderDon);
+
+			exchangeCode.setOrderStatus("refund");
+			exchangeCodeMapper.updateById(exchangeCode);
+
+			//虚物订单退款,清出车队,车票变为已过期
+			try {
+				GoodsDon goodsDon = goodsDonMapper.selectById(orderDon.getGoodsId());
+				GoodsDonSku sku = skuMapper.selectById(orderDon.getSkuId());
+				orderCommonService.clearUnrealGoodsDetail(orderDon, goodsDon.getType(), sku);
+
+				//清除gtpUser
+				if (orderDon.getOrderType() == 1) {
+					cmsOrderDonService.delMirrorUser(goodsDon.getId(), orderDon.getRelationId());
+				}
+
+				//重新生成兑换码
+				ExchangeCodeReq exchangeCodeReq = new ExchangeCodeReq();
+				exchangeCodeReq.setNumber(1);
+				exchangeCodeReq.setGoodsId(orderDon.getGoodsId());
+				exchangeCodeReq.setSkuId(orderDon.getSkuId());
+				exchangeCodeService.createExchangeCode(exchangeCodeReq);
+			} catch (Exception e) {
+			}
+		}
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+}

+ 14 - 5
netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsOrderController.java

@@ -3,7 +3,6 @@ package com.cyksj.web.controller.manage;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
@@ -37,7 +36,6 @@ import com.cyksj.model.manage.views.UpgradeOrderDonBackView;
 import com.cyksj.model.request.*;
 import com.cyksj.model.views.*;
 import com.cyksj.service.mange.CmsOrderDonService;
-import com.cyksj.service.midjourney.MidjourneyAccountService;
 import com.cyksj.service.order.OrderDonCommentService;
 import com.cyksj.service.user.UserService;
 import com.cyksj.web.util.EasyExcelUtils;
@@ -882,9 +880,20 @@ public class CmsOrderController {
 	 * 套餐退款订单列表
 	 */
 	@GetMapping("/get/upgrade/refund/list")
-	public Result<SearchResult<RefundUpdradeOrderDonView>> getRefundUpgradeOrderDonView() {
-		SearchResult<RefundUpdradeOrderDonView> search = beanSearcher.search(RefundUpdradeOrderDonView.class, MapUtils.flatBuilder(request.getParameterMap())
-				.build());
+	public Result<SearchResult<RefundUpdradeOrderDonView>> getRefundUpgradeOrderDonView(String nickname) {
+		List<Long> userIds = null;
+		if (StrUtil.isNotBlank(nickname)) {
+			userIds = userMapper.selectListByNickname(nickname);
+			if (CollUtil.isEmpty(userIds)) {
+				userIds.add(0l);
+			}
+		}
+		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
+		if (CollUtil.isNotEmpty(userIds)) {
+			builder.field(RealGoodsInterestUserView::getUserId, userIds).op(Operator.InList);
+		}
+		SearchResult<RefundUpdradeOrderDonView> search = beanSearcher.search(RefundUpdradeOrderDonView.class,
+				builder.build());
 		search.getDataList().forEach(data -> {
 			Optional.ofNullable(userService.getById(data.getUserId()))
 					.ifPresent(user -> data.setNickname(user.getNickname()));