瀏覽代碼

Merge branch 'cps_login' into pre

# Conflicts:
#	netflix-dao/src/main/java/com/cyksj/model/views/RefundUpdradeOrderDonView.java
#	netflix-service/src/main/java/com/cyksj/service/midjourney/impl/MidjourneyServiceImpl.java
#	netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupRelationFrontServiceImpl.java
#	netflix-web/src/main/java/com/cyksj/web/controller/cps/CpsBackLoginController.java
#	netflix-web/src/main/java/com/cyksj/web/controller/mirror/MirrorController.java
#	netflix-web/src/main/resources/application-prd.yml
zoujiajian 2 年之前
父節點
當前提交
6177055280

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

@@ -39,6 +39,11 @@ public class ChatgptCarInfoView {
      */
     private Date expTime;
 
+    /**
+     * 车队可用时间
+     */
+    private Date teamExpTime;
+
     /**
      * 车次类型 team plus 3.5
      */

+ 1 - 5
netflix-dao/src/main/java/com/cyksj/model/views/RefundUpdradeOrderDonView.java

@@ -18,8 +18,7 @@ import java.util.Date;
 @Getter
 @Setter
 @SearchBean(tables = "refund_upgrade_order_don rd left join upgrade_order_don o on o.id = rd.order_id " +
-		"left join upgrade_package up on up.id = o.package_id left join goods_don g on g.id = up.goods_id " +
-		"left join goods_don_sku s on s.id = up.sku_id")
+		"left join upgrade_package up on up.id = o.package_id left join goods_don_sku s on s.id = up.sku_id")
 public class RefundUpdradeOrderDonView {
 	@DbField("rd.id")
 	private Long id;
@@ -39,9 +38,6 @@ public class RefundUpdradeOrderDonView {
 	@DbField("rd.user_id")
 	private Long userId;
 
-	@DbField("g.title")
-	private String goodsName;
-
 	@DbField("s.spec_val")
 	private String specVal;
 

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

@@ -839,6 +839,11 @@ public class RedisService {
 
         //车票到期前每日通知key
         TICKET_EXPIRY_NOTIFY_DAY("ticket_expiry_notify_day:%s:%s", "车票到期前每日通知key", 60 * 60 * 24L),
+        MIDJOURNEY_FAST_LIMIT("midjourney:fast:limit:", "midjourney fast次数", 60 * 60 * 48L),
+        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),
+
         ;
 
         private String name;

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/chatgpt/ChatGptAccountService.java

@@ -68,7 +68,7 @@ public interface ChatGptAccountService {
     /**
      * oai 触发车队限制
      */
-    void carLimited(String carId, String userToken, Long expTime);
+    void carLimited(String carId, String userToken, Long expTime, Boolean isTeam);
 
     /**
      * 获取GPT session

+ 32 - 9
netflix-service/src/main/java/com/cyksj/service/chatgpt/impl/ChatGptAccountServiceImpl.java

@@ -37,6 +37,7 @@ import org.springframework.stereotype.Service;
 
 import javax.annotation.PostConstruct;
 import javax.imageio.stream.FileImageOutputStream;
+import java.math.BigDecimal;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.time.LocalDateTime;
@@ -568,7 +569,10 @@ public class ChatGptAccountServiceImpl implements ChatGptAccountService {
     }
 
 
-    private Long carOaiLimit(String carId) {
+    private Long carOaiLimit(String carId, Boolean isTeam) {
+        if(isTeam && redisService.hasKey("chatgpt:team:clears_in:" + carId)){
+            return redisService.getExpire("chatgpt:team:clears_in:" + carId);
+        }
         if (redisService.hasKey("chatgpt:clears_in:" + carId)) {
             return redisService.getExpire("chatgpt:clears_in:" + carId);
         }
@@ -692,7 +696,7 @@ public class ChatGptAccountServiceImpl implements ChatGptAccountService {
         Double lowExperienceScore = (double) redisService.zCount(RedisService.key.CHATGPT_CAR_LOW_CHAT.getName() + carId, currentTimestamp - (3 * 60 * 60 * 1000), currentTimestamp);
         double newScore = highExperienceScore + lowExperienceScore;
         if(carId.contains("T")){
-            newScore = newScore * 0.3D;
+            newScore = BigDecimal.valueOf(newScore).divide(BigDecimal.valueOf(5), 2, BigDecimal.ROUND_HALF_UP).doubleValue();
         }
         redisService.zAdd(RedisService.key.CHATGPT_CAR_SCORES.getName(), newScore, carId);
     }
@@ -747,16 +751,30 @@ public class ChatGptAccountServiceImpl implements ChatGptAccountService {
 
         if(carName.contains("T")){
             view.setType("Team");
+            Long team = carOaiLimit(carId, true);
+            if (team != 0L) {
+                view.setTeamExpTime(new DateTime(System.currentTimeMillis() + team * 1000));
+            }
+            Long aLong = carOaiLimit(carId, false);
+            if (aLong != 0L) {
+                view.setExpTime(new DateTime(System.currentTimeMillis() + aLong * 1000));
+            }
+            if (view.getExpTime() != null && view.getTeamExpTime() != null) {
+                view.setStatus("全部停运");
+            }else if(view.getExpTime() != null || view.getTeamExpTime() != null) {
+                view.setStatus("部分停运");
+            }
         }else {
             view.setType(isPlus == 1 ? "Plus" : "3.5");
+            Long aLong = carOaiLimit(carId, false);
+            if (aLong != 0L) {
+                view.setStatus("停运");
+                view.setExpTime(new DateTime(System.currentTimeMillis() + aLong * 1000));
+            }
         }
         int use = getCarConversationCount(carId, 3L).intValue();
         view.setUse(use);
-        Long aLong = carOaiLimit(carId);
-        if (aLong != 0L) {
-            view.setStatus("停运");
-            view.setExpTime(new DateTime(System.currentTimeMillis() + aLong * 1000));
-        }
+
         view.setCarName(carName);
         return view;
     }
@@ -813,7 +831,7 @@ public class ChatGptAccountServiceImpl implements ChatGptAccountService {
     }
 
     @Override
-    public void carLimited(String carId, String userToken, Long expTime) {
+    public void carLimited(String carId, String userToken, Long expTime, Boolean isTeam) {
         if (carId == null) {
             if (StringUtils.isNotBlank(userToken)) {
                 ChatgptUser chatgptUser = chatgptUserMapper.selectOne(Wrappers.lambdaQuery(ChatgptUser.class).eq(ChatgptUser::getUserToken, userToken));
@@ -825,7 +843,12 @@ public class ChatGptAccountServiceImpl implements ChatGptAccountService {
                 }
             }
         }
-        redisService.set("chatgpt:clears_in:" + carId, expTime, expTime);
+        if(isTeam){
+            redisService.set("chatgpt:team:clears_in:" + carId, expTime, expTime);
+        }else {
+            redisService.set("chatgpt:clears_in:" + carId, expTime, expTime);
+        }
+
 
         try {
             //记录用户触发限制

+ 21 - 1
netflix-service/src/main/java/com/cyksj/service/corp/impl/CorpServiceImpl.java

@@ -16,6 +16,7 @@ import com.cyksj.common.util.corp.WxCryptUtil;
 import com.cyksj.config.corp.WeChatCorpFactory;
 import com.cyksj.config.corp.YHLXWxCorpConfig;
 import com.cyksj.dto.CorpOauth2UserInfo;
+import com.cyksj.mapper.OrderDonMapper;
 import com.cyksj.mapper.corp.*;
 import com.cyksj.model.dto.WxCorpEncryptDto;
 import com.cyksj.model.entity.*;
@@ -90,6 +91,9 @@ public class CorpServiceImpl implements CorpService {
 	@Autowired
 	private CorpUserTagMapper corpUserTagMapper;
 
+	@Autowired
+	private OrderDonMapper orderDonMapper;
+
 	@Autowired
 	private CorpUserFollowRelationMapper corpUserFollowRelationMapper;
 
@@ -425,7 +429,23 @@ public class CorpServiceImpl implements CorpService {
 			});
 		}
 		if (!isExistIntentionTag.get()) {
-			insertUserIntentionTag(corpUserPayIntention, tagId, tagName);
+			CorpUser corpUser = corpUserMapper.selectOne(Wrappers.lambdaQuery(CorpUser.class)
+					.eq(CorpUser::getUnionid, corpUserPayIntention.getUnionId())
+					.last("limit 1"));
+			Boolean isPayEp = false;
+			if (corpUser != null && corpUser.getUserId() != 0) {
+				//是否买过设备
+				Integer selectCount = orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class)
+						.eq(OrderDon::getGoodsId, 15)
+						.eq(OrderDon::getUserId, corpUser.getUserId())
+						.notIn(OrderDon::getStatus, Constant.noOrderAllStatus));
+				if (selectCount > 0) {
+					isPayEp = true;
+				}
+			}
+			if (!isPayEp) {
+				insertUserIntentionTag(corpUserPayIntention, tagId, tagName);
+			}
 		}
 	}
 

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

@@ -346,7 +346,7 @@ public class DistributeServiceImpl implements DistributeService {
 			throw BusinessRuntimeException.getInstance("该专属推广优惠码已被设置");
 		} else {
 			Coupon existsCoupon = couponMapper.selectOne(Wrappers.lambdaQuery(Coupon.class)
-					.eq(Coupon::getExCode, couponDistributePopularize.getExCode())
+					.eq(Coupon::getExCode, code)
 					.eq(Coupon::getDeleted, true)
 					.select(Coupon::getId)
 					.last("limit 1"));

+ 33 - 1
netflix-service/src/main/java/com/cyksj/service/midjourney/impl/MidjourneyServiceImpl.java

@@ -30,6 +30,7 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.stream.Collectors;
 
 /**
  * @author zwhui
@@ -95,7 +96,14 @@ public class MidjourneyServiceImpl implements MidjourneyService {
             param.put("dimensions", dimensions);
         }
         SubmitResult result = submit(user.getMode(),"blend", param);
-        return saveConversation(user.getId(), user.getMode(), Long.parseLong(result.getResult()),result.getProperties(),"BLEND", StringUtils.EMPTY);
+        Map<String, Object> properties = result.getProperties();
+        if (user.getMode() == 1) {
+            String finalPrompt = "%s --ar %s --style raw --s 250";
+            List<String> picList = uploadBase64Pic(base64Array);
+            String pics = picList.stream().map(pic -> "<" + pic + ">").collect(Collectors.joining(" "));
+            properties.put("finalPrompt", String.format(finalPrompt, pics,dimensions.getValue()));
+        }
+        return saveConversation(user.getId(), user.getMode(), Long.parseLong(result.getResult()),properties,"BLEND", StringUtils.EMPTY);
     }
 
     @Override
@@ -188,6 +196,9 @@ public class MidjourneyServiceImpl implements MidjourneyService {
             if (code == 3) {
                 throw BusinessRuntimeException.getInstance("账号不存在");
             }
+            if (code == 4) {
+                throw BusinessRuntimeException.getInstance("图片重复");
+            }
             if (code == 24) {
                 throw BusinessRuntimeException.getInstance("prompt包含敏感词");
             }
@@ -266,6 +277,27 @@ public class MidjourneyServiceImpl implements MidjourneyService {
         JSONObject result = JSONUtil.parseObj(HttpUtil.post("https://files.liuliangbang.vip/pic/ups", paramMap));
         return result.getJSONObject("value").getJSONArray("saved").getJSONObject(0).getJSONObject("info").getStr("cdnUrl");
     }
+
+    private static List<String> uploadBase64Pic(List<String> base64Array) throws IOException {
+        List<String> list = new ArrayList<>();
+        for (String base64 : base64Array) {
+            String fileExt = "jpeg";
+            if (base64.contains(";")){
+                fileExt = base64.split(";")[0].split("/")[1];
+                base64 = base64.split(",")[1];
+            }
+            byte[] body = Base64.getDecoder().decode(base64);
+            Path tempFile = Files.createTempFile(UUID.randomUUID().toString(), "." + fileExt);
+            try (FileImageOutputStream imageOutput = new FileImageOutputStream(tempFile.toFile())) {
+                imageOutput.write(body, 0, body.length);
+            }
+            Map<String, Object> paramMap = new HashMap<>();
+            paramMap.put("file", tempFile.toFile());
+            JSONObject result = JSONUtil.parseObj(HttpUtil.post("https://files.liuliangbang.vip/pic/ups", paramMap));
+            list.add(result.getJSONObject("value").getJSONArray("saved").getJSONObject(0).getJSONObject("info").getStr("cdnUrl"));
+        }
+        return list;
+    }
     public JSONArray listByIds(Integer mode,List<Long> ids) throws Exception {
         Map<String, Object> param = MapUtil.builder(new HashMap<String, Object>()).put("ids", ids).build();
         String body = HttpRequest.post((mode == 1 ? FAST_HOST : RELAX_HOST) + "/mj/task/list-by-condition").header("Authorization", FAST_TOKEN).body(Jsons.toJson(param)).execute().body();

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

@@ -302,6 +302,12 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final WxCorpOps wxCorpOps;
 
+	private final UpgradePackageMapper upgradePackageMapper;
+
+	private final UpgradeOrderDonMapper upgradeOrderDonMapper;
+
+	private final MidjourneyUserMapper midjourneyUserMapper;
+
 	private final List<String> noChekGoodsTemp = List.of("Apple One", "Youtube", "Spotify");
 
 	@Transactional(rollbackFor = Throwable.class)
@@ -3469,4 +3475,314 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			}
 		}
 	}
+
+
+	@Override
+	public UpgradeOrderDon submitUpgrade(OrderPayRequest payRequest) {
+		User user = null;
+		Long userId = payRequest.getUserId();
+		if (userId != null) {
+			int noPayCount = upgradeOrderDonMapper.selectCount(Wrappers.lambdaQuery(UpgradeOrderDon.class).eq(UpgradeOrderDon::getUserId, userId).eq(UpgradeOrderDon::getPackageId, payRequest.getPackageId())
+					.eq(UpgradeOrderDon::getStatus, UpgradeOrderDon.Status.noPayment.toString()));
+			if (noPayCount > 0) {
+				throw new BusinessRuntimeException("您有未支付订单.");
+			}
+		}
+		String orderPhone = payRequest.getPhone();
+		if (StrUtil.isNotBlank(orderPhone)) {
+			user = saveOrGetOrderPhoneUser(payRequest);
+			userId = user.getId();
+			payRequest.setUserId(userId);
+		}
+		if (userId == null) {
+			user = new User();
+			user.setId(0l);
+		} else {
+			user = userMapper.selectById(userId);
+			if (user == null) throw BusinessRuntimeException.getGatewayApiCode(GatewayApiCode.CMS_TOKEN_VALID);
+			if (user.getIsBlack()) throw BusinessRuntimeException.getInstance("系统检测操作异常,请稍后再试");
+		}
+		GroupsRelation groupsRelation = getGroupsRelation(payRequest.getUserId(), payRequest.getRelationId());
+		GroupsTrips groupsTrips = getGroupsTrips(groupsRelation);
+		GoodsDonSku goodsDonSku = goodsDonSkuMapper.selectById(groupsTrips.getSkuId());
+
+		if (goodsDonSku != null && goodsDonSku.getIsMirror()) {
+			UpgradePackage upgradePackage = upgradePackageMapper.selectById(payRequest.getPackageId());
+			if (upgradePackage == null) {
+				throw BusinessRuntimeException.getInstance("套餐包不存在");
+			}
+			if (upgradePackage.getPrice() == null || upgradePackage.getPrice().compareTo(BigDecimal.ZERO) <= 0) {
+				throw BusinessRuntimeException.getInstance("下单商品价格异常");
+			}
+			if (payRequest.getDonMoney().compareTo(upgradePackage.getPrice()) < 0) {
+				log.info("套餐包:{}支付金额:{}异常,调整用户userId:{}支付金额为:{}", upgradePackage.getName(), payRequest.getDonMoney(), user.getId(), upgradePackage.getPrice());
+				payRequest.setDonMoney(upgradePackage.getPrice());
+			}
+			MidjourneyUser midjourneyUser = midjourneyUserMapper.selectOne(Wrappers.lambdaQuery(MidjourneyUser.class).eq(MidjourneyUser::getRelationId, payRequest.getRelationId()));
+			if (midjourneyUser == null){
+				throw BusinessRuntimeException.getInstance("车票未激活Midjourney账号,请先激活");
+			}
+			String donNo = SEQUENCE.nextId().toString();
+			UpgradeOrderDon upgradeOrderDon = new UpgradeOrderDon();
+			upgradeOrderDon.setOrderNo(donNo);
+			upgradeOrderDon.setUserId(payRequest.getUserId());
+			upgradeOrderDon.setOriginalOrderId(payRequest.getOriginalOrderId());
+			upgradeOrderDon.setRelationId(payRequest.getRelationId());
+			upgradeOrderDon.setPackageId(payRequest.getPackageId());
+			upgradeOrderDon.setPrice(upgradePackage.getPrice());
+			upgradeOrderDon.setNum(upgradePackage.getNum());
+			upgradeOrderDon.setGoodsId(goodsDonSku.getGoodsId());
+			upgradeOrderDon.setMoney(payRequest.getDonMoney());
+			upgradeOrderDon.setStatus(UpgradeOrderDon.Status.noPayment);
+			upgradeOrderDon.setType(UpgradeOrderDon.Type.ALI_PAY);
+			upgradeOrderDonMapper.insert(upgradeOrderDon);
+
+			deductUpgradeBalancePayOrderMoney(upgradeOrderDon, payRequest.getBalance(),user );
+
+			if (upgradeOrderDon.getStatus() == UpgradeOrderDon.Status.noPayment) {
+				jobManager.addJob(EXPIRY_TIME, () -> {
+					closeUpgradeOrder(upgradeOrderDon.getId(), null);
+				});
+			}
+			return upgradeOrderDon;
+		}
+		return null;
+	}
+
+	public void deductUpgradeBalancePayOrderMoney(UpgradeOrderDon orderDon, BigDecimal balance, User user) {
+		//存在余额
+		if (balance != null && balance.compareTo(BigDecimal.ZERO) > 0) {
+			BigDecimal money = orderDon.getMoney();
+			//去掉余额 多出的部分
+			BigDecimal subBalance = balance;
+			orderDon.setMoney(money.subtract(subBalance));
+			if (balance.compareTo(money) >= 0) {
+				orderDon.setMoney(BigDecimal.ZERO);
+				orderDon.setBalance(money);
+				subBalance = money;
+				orderDon.setType(UpgradeOrderDon.Type.BALANCE);
+			}
+			BigDecimal userBalance = user.getBalance();
+			//扣除余额 是否成功
+			Integer success = userMapper.deductBalance(user.getId(), subBalance, userBalance);
+			if (success != 1) throw BusinessRuntimeException.getInstance("您的余额不足!");
+			orderDon.setBalance(subBalance);
+			upgradeOrderDonMapper.updateById(orderDon);
+		}
+	}
+
+	/**
+	 * 获取车位信息
+	 *
+	 * @param userId
+	 * @param relationId
+	 * @return
+	 */
+	private GroupsRelation getGroupsRelation(Long userId, Long relationId) {
+		List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
+		GroupsRelation groupsRelation = groupsRelationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class).in(GroupsRelation::getUserId, userIdList).eq(GroupsRelation::getId, relationId));
+		if (groupsRelation == null) {
+			throw BusinessRuntimeException.getInstance("车票不存在");
+		}
+		return groupsRelation;
+	}
+
+	/**
+	 * 获取车队信息
+	 *
+	 * @param groupsRelation
+	 * @return
+	 */
+	private GroupsTrips getGroupsTrips(GroupsRelation groupsRelation) {
+		GroupsTrips groupsTrips = groupsMapper.selectById(groupsRelation.getGroupsId());
+		if (groupsTrips == null) {
+			throw BusinessRuntimeException.getInstance("车队异常");
+		}
+		return groupsTrips;
+	}
+
+	@Override
+	public AliPayParams aliPayUpgrade(AlipayOrderDonReq re, String productCode, String qrPayMode) throws Exception {
+		return aliPayCommonService.unifiedPayUpgrade(re,productCode,qrPayMode);
+	}
+
+
+	@Override
+	@Transactional(rollbackFor = Throwable.class)
+	public void aliPayUpgradeNotify(Map<String, String> params) throws Exception {
+		//调用SDK验证签名
+		String body = Codec.DoBase64.custom().setData(params.get("body")).decodeAsText();
+		OrderAttach orderAttach = Jsons.parseObject(body, OrderAttach.class);
+		Long oderId = orderAttach.getO();
+		UpgradeOrderDon orderDon = upgradeOrderDonMapper.selectById(oderId);
+		if (null == orderDon) {
+			throw BusinessRuntimeException.getInstance("订单不存在.");
+		}
+		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("支付宝回调校验签名错误");
+		}
+		String transactionId = params.get("trade_no");
+		String payTimeStr = params.get("gmt_payment");
+		//买家支付宝账号
+		String buyerId = params.get("buyer_id");
+		log.info("支付宝回调信息:{}", Jsons.toJson(params));
+		if (!orderDon.getStatus().equals(UpgradeOrderDon.Status.noPayment) && !orderDon.getStatus().equals(UpgradeOrderDon.Status.close)) {
+			log.info("支付宝已回调,重复修改状态 id:{}", orderDon.getId());
+			return;
+		}
+		UpgradePackage upgradePackage = upgradePackageMapper.selectById(orderDon.getPackageId());
+		Date payTime = DateTime.now();
+		if (StringUtils.isNotBlank(payTimeStr)) {
+			payTime = DateUtil.parse(payTimeStr, "yyyy-MM-dd HH:mm:ss");
+		}
+		// 更改订单状态
+		orderDon.setTransactionId(transactionId);
+		orderDon.setPayTime(payTime);
+		orderDon.setShopId(appId);
+		orderDon.setType(UpgradeOrderDon.Type.ALI_PAY);
+		orderDon.setBuyerId(buyerId);
+		upgradeOrderDonMapper.updateById(orderDon);
+		//该支付账号id 是否被后台拉黑
+		Integer count1 = userPayOrderBlockMapper.selectCount(Wrappers.lambdaQuery(UserPayOrderBlock.class)
+				.eq(UserPayOrderBlock::getBuyerId, buyerId));
+		if (count1 > 0) {
+			log.info("该支付账号id:{} 已被后台拉黑", buyerId);
+			//notifyRefundOrder(orderDon, goodsDon, sku);
+			return;
+		}
+
+		//回调
+		unifiedHandlerUpgradeOrderNotify(orderDon,upgradePackage );
+	}
+
+
+	/**
+	 * 统一订单信息回调
+	 */
+	public void unifiedHandlerUpgradeOrderNotify(UpgradeOrderDon orderDon, UpgradePackage upgradePackage) {
+		orderDon.setStatus(UpgradeOrderDon.Status.complete);
+		int isSuccess = upgradeOrderDonMapper.update(null,Wrappers.lambdaUpdate(UpgradeOrderDon.class)
+				.set(UpgradeOrderDon::getStatus, orderDon.getStatus())
+				.in(UpgradeOrderDon::getStatus, List.of(UpgradeOrderDon.Status.noPayment, UpgradeOrderDon.Status.close))
+				.eq(UpgradeOrderDon::getId, orderDon.getId()));
+		if (isSuccess == 0) {
+			log.info("该订单{}状态已修改", orderDon.getOrderNo());
+			return;
+		}
+
+		//余额使用记录
+		if (orderDon.getBalance().compareTo(BigDecimal.ZERO) > 0) {
+			userBenefitsService.recordBalanceBySource(orderDon.getUserId(), orderDon.getBalance().negate(), UserBalanceSourceRecord.Source.payment, orderDon.getId(), upgradePackage.getName() + UserBalanceSourceRecord.Source.payment.getDesc());
+		}
+
+		if (upgradePackage.getGoodsId() == 26) {
+			MidjourneyUser midjourneyUser = midjourneyUserMapper.selectOne(Wrappers.lambdaQuery(MidjourneyUser.class).eq(MidjourneyUser::getRelationId, orderDon.getRelationId()));
+			if (midjourneyUser != null) {
+				int update = midjourneyUserMapper.update(null, Wrappers.lambdaUpdate(MidjourneyUser.class)
+						.set(MidjourneyUser::getMjFastNum, midjourneyUser.getMjFastNum() + upgradePackage.getNum()).eq(MidjourneyUser::getId, midjourneyUser.getId()));
+				if (update == 0) {
+					log.info("midjourneyUser 套餐包增值失败 id:{},orderId:{}", midjourneyUser.getId(), orderDon.getId());
+				}
+				Object fastNum = redisService.get(RedisService.key.MIDJOURNEY_FAST_LIMIT.getName() + midjourneyUser.getId());
+				if (fastNum == null) {
+					redisService.set(RedisService.key.MIDJOURNEY_FAST_LIMIT.getName() + midjourneyUser.getId(), midjourneyUser.getMjFastNum() + upgradePackage.getNum().longValue(), RedisService.key.MIDJOURNEY_FAST_LIMIT.getTimeout());
+				}else {
+					redisService.incr(RedisService.key.MIDJOURNEY_FAST_LIMIT.getName() + midjourneyUser.getId(), upgradePackage.getNum().longValue());
+				}
+			}
+		}
+	}
+
+
+	@Transactional(rollbackFor = Throwable.class)
+	@Override
+	public void closeUpgradeOrder(Long orderId, Long userId) {
+		String orderCloseKey = RedisService.key.CLOSE_UPGRADE_ORDER_TIME_KEY.getName() + orderId;
+		if (!redisService.setNx(orderCloseKey, orderId, RedisService.key.CLOSE_UPGRADE_ORDER_TIME_KEY.getTimeout())) {
+			throw BusinessRuntimeException.getInstance("订单正在关闭中..");
+		}
+		//关闭订单逻辑
+		UpgradeOrderDon orderDon = upgradeOrderDonMapper.selectById(orderId);
+		if (orderDon == null) {
+			return;
+		}
+		if (userId != null) {
+			List<Long> relationUserIdList = userBindRelationService.getRelationUserIdList(userId, null);
+			if (!relationUserIdList.contains(orderDon.getUserId())) {
+				return;
+			}
+		}
+		log.info("关闭订单 orderId:{}", orderId);
+		if (UpgradeOrderDon.Status.noPayment.equals(orderDon.getStatus())) {
+			//调用微信、支付宝第三方接口查询订单是否支付
+			UpgradeOrderDon.Status status = isHasPaid(orderDon);
+			if (status == UpgradeOrderDon.Status.noPayment) {
+				//查询微信支付是否已支付
+				orderDon.setStatus(UpgradeOrderDon.Status.close);
+				upgradeOrderDonMapper.updateById(orderDon);
+				//返还余额
+				if (orderDon.getBalance().compareTo(BigDecimal.ZERO) > 0) {
+					userBenefitsService.addUserBalance(orderDon.getUserId(), orderDon.getBalance(), null, null, null, null, false);
+				}
+			}
+		}
+	}
+
+
+	/**
+	 * 查询第三放接口订单是否已支付
+	 */
+	public UpgradeOrderDon.Status isHasPaid(UpgradeOrderDon orderDon) {
+		UpgradePackage upgradePackage = upgradePackageMapper.selectById(orderDon.getPackageId());
+		if (orderDon.getType() == UpgradeOrderDon.Type.WeChat) {
+			try {
+				Map<String, String> reMap = weChatService.getWxOrderDetail(orderDon.getShopId(), orderDon.getOrderNo());
+				if (reMap != null) {
+					String orderStatus = reMap.get("trade_state");
+					if ("SUCCESS".equals(orderStatus)) {
+						orderDon.setStatus(UpgradeOrderDon.Status.complete);
+						orderDon.setTransactionId(reMap.get("transaction_id"));
+						return updateUpgradeNoPayment(orderDon, upgradePackage);
+					}
+				}
+			} catch (Exception e) {
+
+			}
+		} else if (orderDon.getType() == UpgradeOrderDon.Type.ALI_PAY) {
+			try {
+				AlipayTradeQueryResponse zfbOrderDetail = getZfbOrderDetail(orderDon.getShopId(), orderDon.getOrderNo());
+				if (zfbOrderDetail != null) {
+					String tradeStatus = zfbOrderDetail.getTradeStatus();
+					if ("TRADE_SUCCESS".equals(tradeStatus)) {
+						orderDon.setStatus(UpgradeOrderDon.Status.complete);
+						orderDon.setTransactionId(zfbOrderDetail.getTradeNo());
+						return updateUpgradeNoPayment(orderDon, upgradePackage);
+					}
+				}
+			} catch (Exception e) {
+
+			}
+		}
+		return orderDon.getStatus();
+	}
+
+	private UpgradeOrderDon.Status updateUpgradeNoPayment(UpgradeOrderDon orderDon,UpgradePackage upgradePackage) {
+		unifiedHandlerUpgradeOrderNotify(orderDon, upgradePackage);
+		return orderDon.getStatus();
+	}
+
+
+	@Override
+	public UpgradeOrderDetailView getUpgradeOrderDetail(Long orderId, Long userId) {
+			MapBuilder builder = MapUtils.builder()
+					.field(OrderDonView::getId, orderId)
+					.orderBy(OrderDonView::getId).desc();
+			if (userId != null) {
+				builder.field(UpgradeOrderDetailView::getUserId, userId);
+			}
+        return beanSearcher.searchFirst(UpgradeOrderDetailView.class, builder.build());
+	}
 }

+ 5 - 4
netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupRelationFrontServiceImpl.java

@@ -109,7 +109,6 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 
 	//脆球邮箱后缀
 	private final static String CUI_QIU_EMAIL_SUFFIX = "@kindvd.com";
-	private final UpgradeOrderDonMapper upgradeOrderDonMapper;
 	private final UpgradePackageMapper upgradePackageMapper;
 
 	private final static String VERIFY_CODE_SECRET = "q1w2e3";
@@ -657,7 +656,7 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 				.field("condition", String.format("(gr.expiry_time is null or gr.expiry_time > '%s')", now))
 				.field(RenewalView::getStatus, List.of("validity", "overdue", "outside")).op(Operator.InList)
 				.orderBy(RenewalView::getExpiryTime).asc()
-				.onlySelect(RenewalView::getSkuNum, RenewalView::getExpiryTime, RenewalView::getRelationId, RenewalView::getAccount, RenewalView::getGoodsId, RenewalView::getTitle, RenewalView::getLogo, RenewalView::getImg, RenewalView::getGroupId, RenewalView::getSkuId, RenewalView::getSpecVal, RenewalView::getGoodsStatus, RenewalView::getSkuStatus)
+				.onlySelect(RenewalView::getMonths, RenewalView::getExpiryTime, RenewalView::getRelationId, RenewalView::getAccount, RenewalView::getGoodsId, RenewalView::getTitle, RenewalView::getLogo, RenewalView::getImg, RenewalView::getGroupId, RenewalView::getSkuId, RenewalView::getSpecVal, RenewalView::getGoodsStatus, RenewalView::getSkuStatus)
 				.build());
 		if (list.size() > 5) {
 			redisService.setNx(RedisService.key.TICKET_EXPIRY_NOTIFY_DAY.getNameFormat(thisDate, userId), userId, RedisService.key.TICKET_EXPIRY_NOTIFY_DAY.getTimeout());
@@ -670,11 +669,13 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 			if (ticket.getGoodsStatus() == null || ticket.getSkuStatus() == null || !ticket.getGoodsStatus() || !ticket.getSkuStatus()) {
 				return false;
 			}
-			Long skuNum = ticket.getSkuNum();
+			Integer skuMonths = ticket.getMonths();
 			Date expiryTime = ticket.getExpiryTime();
 			//年付 提前一个月
-			if (skuNum >= 12) {
+			if (skuMonths >= 12) {
 				day.set(30);
+			} else {
+				day.set(7);
 			}
 			if (DateUtil.beginOfDay(expiryTime).compareTo(DateUtil.offsetDay(thisZero, day.get())) <= 0) {
 				ticket.setExpiryTimeStr(DateUtil.format(ticket.getExpiryTime(), "yyyy-MM-dd"));

+ 3 - 25
netflix-web/src/main/java/com/cyksj/web/controller/cps/CpsBackLoginController.java

@@ -49,7 +49,6 @@ import java.util.Optional;
 @RestController
 @RequestMapping("/cps/manage")
 @RequiredArgsConstructor
-@Slf4j
 public class CpsBackLoginController {
 	private final CpsManageService cpsManageService;
 
@@ -102,22 +101,12 @@ 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();
-		redisService.set(authState, authState, 60 * 60 * 24L);
-		AuthRedirect redirect = new AuthRedirect().setMappingId(mappingId);
+		AuthRedirect redirect = new AuthRedirect();
 		redirect.setUrl(redirectUrl);
 		String state = Codec.DoBase64.custom().setData(Jsons.toJson(redirect)).encodeAsText();
 		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);
 	}
 
@@ -145,19 +134,8 @@ public class CpsBackLoginController {
 		if (userDistribute == null) throw BusinessRuntimeException.getInstance("只支持渠道分销用户登录");
 		StpCpsManageUser.login(user.getId());
 		String cpsToken = StpCpsManageUser.getTokenValue();
-		String url = re.getUrl();
-		if (StrUtil.isNotBlank(url)) {
-			String redirectUrl = url.contains("?") ? url + "&t=" + cpsToken : url + "?t=" + cpsToken;
-			log.info("cps后台微信授权,跳转地址:{}", redirectUrl);
-			response.sendRedirect(redirectUrl);
-			return;
-		}
-		JSONObject res = new JSONObject();
-		res.putOpt("satoken-cpsUser", cpsToken);
-		res.putOpt("img", user.getHeadimgurl());
-		res.putOpt("nickname", user.getNickname());
-		redisService.set(RedisService.key.CPS_AUTH_SUCCESS_KEY.getNameFormat(re.getMappingId()), res.toString(), RedisService.key.CPS_BACK_LOGIN_KEY.getTimeout());
-		response.sendRedirect(wxOpenPlatYHLXLoginConfig.getCpsLoginUrl());
+		String url = Optional.ofNullable(re.getUrl()).orElse(wxOpenPlatYHLXLoginConfig.getLoginUrl());
+		response.sendRedirect(url.contains("?") ? url + "&t=" + cpsToken : url + "?t=" + cpsToken);
 	}
 
 	/**

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

@@ -551,10 +551,10 @@ public class GoodsDonController {
 //		List<Long> filter_goodsIds = getFilterGoodsIds();
 		List<Long> filter_goodsIds = null;
 		AtomicBoolean isRemoveRg = new AtomicBoolean(false);
-		if (isHzIp()) {
-			key += ":hz-ip";
-			isRemoveRg.set(true);
-		}
+//		if (isHzIp()) {
+//			key += ":hz-ip";
+//			isRemoveRg.set(true);
+//		}
 		Long fUid = StpUserUtil.getUserIdAfterLogin();
 		Object o = redisService.get(key);
 		if (o == null) {
@@ -1107,10 +1107,10 @@ public class GoodsDonController {
 		String key = RedisService.key.YH_HOME_PAGHE_CACHE.getName() + "pc:homeManage";
 		//移除奈飞客厅 临时
 		Long filterConfigId = null;
-		if (isHzIp()) {
-			key += ":hz_ip";
-			filterConfigId = 55l;
-		}
+//		if (isHzIp()) {
+//			key += ":hz_ip";
+//			filterConfigId = 55l;
+//		}
 		Object o = redisService.get(key);
 		if (o == null) {
 			MapBuilder builder = MapUtils.builder()

+ 3 - 3
netflix-web/src/main/java/com/cyksj/web/controller/mirror/MirrorController.java

@@ -239,7 +239,7 @@ public class MirrorController {
      * oai触发车队限制
      */
     @GetMapping("/gpt/car/limited")
-    public Result<String> carLimited(String carId, Long expTime) {
+    public Result<String> carLimited(String carId, Long expTime, Boolean isTeam) {
         String authorization = request.getHeader("Authorization");
         String userToken = "";
         if(StringUtils.isNotBlank(authorization)){
@@ -253,7 +253,7 @@ public class MirrorController {
 
         String finalUserToken = userToken;
         TASK_EXECUTOR.execute(()->{
-            chatGptAccountService.carLimited(carId, finalUserToken, expTime);
+            chatGptAccountService.carLimited(carId, finalUserToken, expTime,isTeam);
         });
         return GatewayResponse.SUCCESS.newBuilder().toResult();
     }
@@ -319,7 +319,7 @@ public class MirrorController {
     public Result<String> midjourneyMirror(@PathVariable Long relationId) {
         Long userId = StpUserUtil.getLoginIdAsLong();
         MidjourneyUser midjourneyUser = midjourneyAccountService.getMidjourneyUserToken(userId, relationId);
-        return GatewayResponse.SUCCESS.newBuilder().toResult(midjourneyHost + (envCommonService.isPreEnv() ? "/8082":"/8081") +"/api/applets/mirror/midjourneyMirrorWithToken/" + midjourneyUser.getUserToken());
+        return GatewayResponse.SUCCESS.newBuilder().toResult(midjourneyHost + (EnvCommonService.active.equals(envCommonService.getEnv()) ? "/8081":"/8082") +"/api/applets/mirror/midjourneyMirrorWithToken/" + midjourneyUser.getUserToken());
     }
 
     @GetMapping("/midjourneyMirrorWithToken/{userToken}")

+ 4 - 3
netflix-web/src/main/java/com/cyksj/web/controller/sys/SysConfigController.java

@@ -20,7 +20,10 @@ import com.cyksj.mapper.manage.help.HelpQuestionClassificationMapper;
 import com.cyksj.mapper.manage.help.HelpQuestionMapper;
 import com.cyksj.model.dto.EquipmentConfigDto;
 import com.cyksj.model.dto.SysServiceChangeDto;
-import com.cyksj.model.entity.*;
+import com.cyksj.model.entity.HelpQuestion;
+import com.cyksj.model.entity.HelpQuestionClassification;
+import com.cyksj.model.entity.SysConfig;
+import com.cyksj.model.entity.SysConfigChangeRecord;
 import com.cyksj.model.views.HelpQuestionClassificationView;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.sys.SysConfigChangeRecordService;
@@ -34,7 +37,6 @@ import com.ejlchina.searcher.param.Operator;
 import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
@@ -88,7 +90,6 @@ public class SysConfigController {
 
 	@PutMapping("/update")
 	@Log(module = "系统设置/编辑配置", businessType = BusinessType.PUT, isSaveRequestData = true)
-	@Transactional(rollbackFor = Throwable.class)
 	public Result<SysConfig> update(@RequestBody SysConfig sysConfig) throws Exception {
 		long adminId = StpUtil.getLoginIdAsLong();
 		Long id = sysConfig.getId();

文件差異過大導致無法顯示
+ 0 - 0
netflix-web/src/main/resources/application-prd.yml


+ 1 - 1
netflix-web/src/main/resources/application-pre.yml

@@ -139,7 +139,7 @@ wx-login:
   redirectUri: https://nf.video/8082/api/auth/wx/authLogin/baseRedirect
   loginUrl: https://nf.video
   cpsRedirectUri: https://nf.video/8082/api/cps/manage/wx/authLogin/baseRedirect
-  cpsLoginUrl: https://cps.nf.video/yinhe/cps/loginNexte
+  cpsLoginUrl: https://cps.nf.video/yinhe/cps/homePage
   yhShopRedirectUri: https://nf.video/8082/api/yhShop/manage/wx/authLogin/baseRedirect
   yhShopLoginUrl: https://shop.liuliangbang.vip/mall/admin/loginNexte
   baRedirectUrl: https://nf.video/8082/api/applets/market/task/bind/wx/baseRedirect

部分文件因文件數量過多而無法顯示