Browse Source

Merge branch 'abroad_073' into abroad_pre

zoujiajian 2 năm trước cách đây
mục cha
commit
05b19b52cf
23 tập tin đã thay đổi với 442 bổ sung85 xóa
  1. 3 0
      netflix-dao/src/main/java/com/cyksj/mapper/GroupsRelationMapper.java
  2. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/UserLoginRecordMapper.java
  3. 16 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserLoginRecord.java
  4. 4 1
      netflix-dao/src/main/java/com/cyksj/model/manage/views/GroupsRelationView.java
  5. 50 0
      netflix-dao/src/main/java/com/cyksj/model/request/TicketLoginReq.java
  6. 47 2
      netflix-dao/src/main/java/com/cyksj/model/views/RenewalView.java
  7. 13 0
      netflix-dao/src/main/resources/mapper/GroupRelationMapper.xml
  8. 1 0
      netflix-service/src/main/java/com/cyksj/redis/RedisService.java
  9. 3 3
      netflix-service/src/main/java/com/cyksj/service/exchange/impl/ExchangeCodeServiceImpl.java
  10. 1 1
      netflix-service/src/main/java/com/cyksj/service/mail/CuiQiuMailService.java
  11. 15 11
      netflix-service/src/main/java/com/cyksj/service/mail/impl/CuiQiuMailServiceImpl.java
  12. 2 2
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java
  13. 8 2
      netflix-service/src/main/java/com/cyksj/service/relation/GroupRelationFrontService.java
  14. 153 40
      netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupRelationFrontServiceImpl.java
  15. 12 0
      netflix-service/src/main/java/com/cyksj/service/user/UserLoginRecordService.java
  16. 1 1
      netflix-service/src/main/java/com/cyksj/service/user/impl/UserBindRelationServiceImpl.java
  17. 38 0
      netflix-service/src/main/java/com/cyksj/service/user/impl/UserLoginRecordServiceImpl.java
  18. 24 19
      netflix-web/src/main/java/com/cyksj/web/controller/group/GroupRelationController.java
  19. 7 0
      netflix-web/src/main/resources/i18n/yhlx_en_US.properties
  20. 8 1
      netflix-web/src/main/resources/i18n/yhlx_ja_JP.properties
  21. 7 0
      netflix-web/src/main/resources/i18n/yhlx_ko_KR.properties
  22. 8 1
      netflix-web/src/main/resources/i18n/yhlx_zh_CN.properties
  23. 8 1
      netflix-web/src/main/resources/i18n/yhlx_zh_HK.properties

+ 3 - 0
netflix-dao/src/main/java/com/cyksj/mapper/GroupsRelationMapper.java

@@ -7,6 +7,7 @@ import com.cyksj.model.entity.GroupsRelation;
 import com.cyksj.model.manage.views.GroupsRelationBackView;
 import com.cyksj.model.manage.views.GroupsRelationView;
 import com.cyksj.model.views.GroupsRelationUserView;
+import com.cyksj.model.views.RenewalView;
 import com.cyksj.model.views.UserRecommendGoodsFrontView;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Update;
@@ -56,4 +57,6 @@ public interface GroupsRelationMapper extends BaseMapper<GroupsRelation> {
 	Long getOutSideGroupsTripsRelationByGoodsId(@Param("skuId") Long skuId, @Param("beginOfDay") DateTime beginOfDay, @Param("extraNum") Integer extraNum, @Param("userId") Long userId, @Param("skuNum") Integer skuNum, @Param("maxNum") Integer maxNum);
 
 	GroupsRelationBackView getGroupRelationAccountView(Long relationId);
+
+	List<RenewalView> getUserHasPayGoods(@Param("list") List<Long> userIds, @Param("now") DateTime now);
 }

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

@@ -0,0 +1,13 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.UserLoginRecord;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: UserLoginRecordMapper
+ * 创建者: JavaZou
+ * 创建时间:2023/12/13 18:01
+ */
+public interface UserLoginRecordMapper extends BaseMapper<UserLoginRecord> {
+}

+ 16 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/UserLoginRecord.java

@@ -0,0 +1,16 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: UserLoginRecord
+ * 创建者: JavaZou
+ * 创建时间:2023/12/13 18:01
+ */
+@Getter
+@Setter
+public class UserLoginRecord extends BaseEntity{
+	private Long userId;
+}

+ 4 - 1
netflix-dao/src/main/java/com/cyksj/model/manage/views/GroupsRelationView.java

@@ -50,6 +50,9 @@ public class GroupsRelationView {
     @DbField("if(a.api_secret='',false,true)")
     private Boolean isVerify;
 
+    @DbField("gr.verify_code")
+    private String verifyCode;
+
     @DbField("g.id")
     private Long goodsId;
 
@@ -130,4 +133,4 @@ public class GroupsRelationView {
     @DbIgnore
     private String errorMsg;
 
-}
+}

+ 50 - 0
netflix-dao/src/main/java/com/cyksj/model/request/TicketLoginReq.java

@@ -0,0 +1,50 @@
+package com.cyksj.model.request;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: TicketLoginReq
+ * 创建者: JavaZou
+ * 创建时间:2024/7/9 12:13
+ */
+@Getter
+@Setter
+public class TicketLoginReq {
+	@NotEmpty
+	private String account;
+
+	@NotEmpty
+	private String password;
+
+	@NotNull
+	private Integer num;
+
+	private Long goodsId;
+
+	private String lang = "zh_CN";
+
+	private Long relationId;
+
+	/**
+	 * 获取奈飞验证类型
+	 * 1.验证码 2.验证链接
+	 */
+	private Integer type;
+
+	/**
+	 * 是否是奈飞同步操作
+	 */
+	private Boolean sync;
+
+	private Long userId;
+
+	/**
+	 * 1.同步装置 ,2.验证链接
+	 */
+	private Integer linkType;
+}

+ 47 - 2
netflix-dao/src/main/java/com/cyksj/model/views/RenewalView.java

@@ -20,7 +20,8 @@ import java.util.List;
 @SearchBean(tables = "groups_relation gr left join groups_trips gt on gt.id = gr.groups_id " +
         "left join account a on a.id = gt.account_id " +
         "left join goods_don_sku sku on gt.sku_id = sku.id " +
-        "left join goods_don g on g.id = sku.goods_id " )
+        "left join goods_don g on g.id = sku.goods_id ",
+        where = ":condition:")
 @Getter
 @Setter
 public class RenewalView {
@@ -31,6 +32,12 @@ public class RenewalView {
     @DbField("sku.id")
     private Long skuId;
 
+    @DbField("g.status")
+    private Boolean goodsStatus;
+
+    @DbField("sku.status")
+    private Boolean skuStatus;
+
     @DbField("sku.months")
     private Integer months;
 
@@ -41,6 +48,12 @@ public class RenewalView {
     @DbField("sku.num")
     private Long skuNum;
 
+    /**
+     * 是否是多人规格
+     */
+    @DbIgnore
+    private Boolean isMulti;
+
     @DbField("sku.price")
     private BigDecimal price;
 
@@ -93,7 +106,6 @@ public class RenewalView {
     private Long userId;
 
     @DbField("gr.expiry_time")
-    @JsonIgnore
     private Date expiryTime;
 
     @DbIgnore
@@ -111,6 +123,9 @@ public class RenewalView {
     @DbField("a.api_key")
     private String apiKey;
 
+    @DbField("a.gpt_email_pwd")
+    private String gptEmailPwd;
+
     @DbField("a.email")
     private String email;
 
@@ -126,6 +141,10 @@ public class RenewalView {
     @DbField("a.secret")
     private String secret;
 
+    @DbField("a.api_secret")
+    @JsonIgnore
+    private String apiSecret;
+
     @DbField("gr.account")
     private String grAccount;
 
@@ -135,6 +154,29 @@ public class RenewalView {
     @DbField("gr.recharge_status")
     private GroupsRelation.RechargeStatus rechargeStatus;
 
+    @DbIgnore
+    private String orderNo;
+    @DbIgnore
+    private Long orderId;
+
+    @DbIgnore
+    private String transactionId;
+
+    /**
+     * 店铺id
+     */
+    @DbField("gr.yhs_id")
+    private Long yhsId;
+
+    /**
+     * 车票获取类型 默认1购买,2.体验
+     */
+    @DbField("gr.aq_type")
+    private Integer aqType;
+
+    @DbIgnore
+    private Date payTime;
+
     @DbIgnore
     private GoodsDonViews goodsDonViews;
 
@@ -143,4 +185,7 @@ public class RenewalView {
 
     @DbIgnore
     private List<GroupsRelationUserView> relationViews;
+
+    @DbIgnore
+    private Integer codeNum;
 }

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

@@ -252,4 +252,17 @@
                  inner join groups_trips gt on gt.id = s.groups_id
                  left join account a on a.id = gt.account_id
     </select>
+
+    <select id="getUserHasPayGoods" resultType="com.cyksj.model.views.RenewalView">
+        select g.id as goods_id,g.title,g.logo from (select distinct groups_id from groups_relation where status in
+        ('validity', 'outside') and (expiry_time is null
+        or
+        expiry_time > #{now}) and user_id != 0 and user_id in <foreach
+            collection="list" item="item" open="(" separator="," close=")">
+        #{item}
+    </foreach> ) gr inner join groups_trips gt on gt.id = gr.groups_id
+        inner join goods_don_sku sku on sku.id = gt.sku_id inner join goods_don g on g.id = sku.goods_id
+        group by g.id,g.title,g.logo
+        order by goods_id
+    </select>
 </mapper>

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

@@ -635,6 +635,7 @@ public class RedisService {
         NETFLIX_SET_LIMIT_TIME("netflix_set_limit_time", "奈飞设置限制", 30l),
         CLOSE_ORDER_TIME_KEY("close_order_time_key:", "关闭订单key", 3 * 60),
         GROUPS_TRIPS_OUTSIDE_RELATION("groups_trips_outside_relation:key:%s:%s", "额外车位", 30l),
+        DOUBLE_VERIFY_CODE_VIEW_MINUTES_KEY("double_verify_code_view_minutes_key","双重验证码查看同时间段人数限制",60),
         ;
 
         private String name;

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

@@ -296,7 +296,7 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 			errorsRelationIds.add(relation.getId());
 			if (retryNum == 15) {
 				log.error("用户:{}获取车票:{}异常", userId, relation.getId());
-				throw BusinessRuntimeException.getInstance("获取车票异常,请联系客服");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("obtain_code_error"));
 			}
 			//失败重新给他分配车位
 			return getFinalRelation(sku, userId, ++retryNum, errorsRelationIds);
@@ -314,7 +314,7 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 			GroupsRelation dbRelation = groupsRelationMapper.selectById(relationId);
 			if (dbRelation.getUserId() != 0) {
 				log.info("=====>用户:{}未抢到座位:{}", userId, relationId);
-				throw new BusinessRuntimeException("系统繁忙,请重试...");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_busy_error"));
 			}
 		}
 		if (status == GroupsRelation.Status.outside) {
@@ -325,7 +325,7 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 			log.error("车位异常 groupId:{}", groupsId);
 			groupsMapper.updateAvailableNum(groupsId);
 			redisService.del(RedisKey.GROUPS_RELATION_NUM_KEY + relationId);
-			throw new BusinessRuntimeException("车位异常");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_busy_error"));
 		}
 	}
 

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/mail/CuiQiuMailService.java

@@ -11,5 +11,5 @@ public interface CuiQiuMailService {
 	/**
 	 * 获取最新邮箱 返回验证码
 	 */
-	String getVerifyCode(String email, Long goodsId, Integer type, Boolean sync) throws Exception;
+	String getVerifyCode(String email, Long goodsId, Integer type, Boolean sync, Integer linkType) throws Exception;
 }

+ 15 - 11
netflix-service/src/main/java/com/cyksj/service/mail/impl/CuiQiuMailServiceImpl.java

@@ -8,6 +8,7 @@ import cn.hutool.http.HttpRequest;
 import cn.hutool.http.HttpResponse;
 import cn.hutool.http.HttpUtil;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.i18n.I18nMessageUtil;
 import com.cyksj.common.util.Jsons;
 import com.cyksj.common.util.StringUtil;
 import com.cyksj.common.util.TicketCodeCommonUtil;
@@ -53,7 +54,7 @@ public class CuiQiuMailServiceImpl implements CuiQiuMailService {
 	private final static String NETFLIX = "Netflix";
 
 	@Override
-	public String getVerifyCode(String email, Long goodsId, Integer type, Boolean sync) throws Exception {
+	public String getVerifyCode(String email, Long goodsId, Integer type, Boolean sync, Integer linkType) throws Exception {
 		//获取近二十封邮件
 		String url = "https://domain-open-api.cuiqiu.com/v1/message/list";
 
@@ -101,7 +102,7 @@ public class CuiQiuMailServiceImpl implements CuiQiuMailService {
 			for (CuiQiuEmailDto cuiQiuEmailDto : list) {
 				Long messageId = cuiQiuEmailDto.getId();
 				try {
-					String code = getVerifyCodeByEmail(messageId, goodsId, type, sync);
+					String code = getVerifyCodeByEmail(messageId, goodsId, type, sync, linkType);
 					if (StrUtil.isNotBlank(code)) {
 						return code;
 					}
@@ -112,7 +113,7 @@ public class CuiQiuMailServiceImpl implements CuiQiuMailService {
 		return null;
 	}
 
-	public String getVerifyCodeByEmail(Long messageId, Long goodsId, Integer type, Boolean sync) throws Exception {
+	public String getVerifyCodeByEmail(Long messageId, Long goodsId, Integer type, Boolean sync, Integer linkType) throws Exception {
 		String url = "https://domain-open-api.cuiqiu.com/v1/message/detail";
 		Map<String, Object> params = new HashMap<>();
 		params.put("token", CUI_QIU_TOKEN);
@@ -133,20 +134,23 @@ public class CuiQiuMailServiceImpl implements CuiQiuMailService {
 					code = StrUtil.subAfter(body, pre, false);
 				}
 				if (StrUtil.isEmpty(code)) {
-					throw BusinessRuntimeException.getInstance("查询失败,请检查是否发送了登陆码..");
+					throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("ticket_login_code"));
 				}
 			} else {
-				String urlPref = "https://www.netflix.com/account/update-primary-location";
-				String nfVerifyUrl = TicketCodeCommonUtil.extractUrl(body, urlPref);
-				if (StrUtil.isEmpty(nfVerifyUrl)) {
+				String urlPref;
+				String nfVerifyUrl;
+				if (linkType == 1) {
+					urlPref = "https://www.netflix.com/account/update-primary-location";
+					nfVerifyUrl = TicketCodeCommonUtil.extractUrl(body, urlPref);
+				} else {
 					urlPref = "https://www.netflix.com/account/travel/verify";
 					nfVerifyUrl = TicketCodeCommonUtil.extractUrl(body, urlPref);
-					if (StrUtil.isEmpty(nfVerifyUrl)) {
-						throw BusinessRuntimeException.getInstance("获取认证链接失败,请重新获取");
-					}
+				}
+				if (StrUtil.isEmpty(nfVerifyUrl)) {
+					throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("ticket_verify_link_error"));
 				}
 				//非点击装置同步更新按钮 直接返回链接
-				if (!sync) return nfVerifyUrl;
+				if (linkType == 2) return nfVerifyUrl;
 				//失败返回验证链接
 				if (!groupsRelationNetflix.confirmUpdate(nfVerifyUrl)) {
 					return nfVerifyUrl;

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

@@ -594,7 +594,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			GroupsRelation dbRelation = groupsRelationMapper.selectById(relationId);
 			if (dbRelation.getUserId() != 0) {
 				log.info("=====>用户:{}未抢到座位:{}", userId, relationId);
-				throw new BusinessRuntimeException("系统繁忙,请重试...");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_busy_error"));
 			}
 		}
 		if (status == GroupsRelation.Status.outside) {
@@ -605,7 +605,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			log.error("车位异常 groupId:{}", groupsId);
 			groupsMapper.updateAvailableNum(groupsId);
 			redisService.del(RedisKey.GROUPS_RELATION_NUM_KEY + relationId);
-			throw new BusinessRuntimeException("车位异常");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_busy_error"));
 		}
 	}
 

+ 8 - 2
netflix-service/src/main/java/com/cyksj/service/relation/GroupRelationFrontService.java

@@ -3,8 +3,10 @@ package com.cyksj.service.relation;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.cyksj.model.entity.GoodsDonSku;
 import com.cyksj.model.entity.GroupsRelation;
+import com.cyksj.model.request.TicketLoginReq;
 import com.cyksj.model.views.RenewalView;
 import com.cyksj.model.views.UserRecommendGoodsFrontView;
+import com.ejlchina.searcher.SearchResult;
 
 import java.util.List;
 
@@ -15,7 +17,7 @@ import java.util.List;
  *创建时间:2022/12/29 15:42
  */
 public interface GroupRelationFrontService {
-	List<RenewalView> getMyTicket(long userId, Boolean isLoginPopularize);
+	SearchResult<RenewalView> getMyTicket(long userId, Boolean isLoginPopularize, String account);
 
 	Boolean isJoinCorpWx(Long userId, Boolean isJoin, Boolean noCoupon);
 
@@ -26,10 +28,14 @@ public interface GroupRelationFrontService {
 	/**
 	 * 获取车票账号登录 验证码
 	 */
-	String getAiVerifyCode(Long userId, Long relationId, Integer type, Boolean sync) throws Exception;
+	String getAiVerifyCode(TicketLoginReq loginReq) throws Exception;
 
 	/**
 	 * 获取车票座位
 	 */
 	GroupsRelation getRelation(Long payRelationId, Long userId, GoodsDonSku sku, String ip);
+
+	Integer getUserCodeNumBySkuId(Long userId, Long skuId, Boolean isHasVerifyCode);
+
+	List<RenewalView> getHasPayGoods(long userId);
 }

+ 153 - 40
netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupRelationFrontServiceImpl.java

@@ -12,16 +12,16 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.i18n.I18nMessageUtil;
 import com.cyksj.common.task.GlobalThreadPoolTaskExecutor;
+import com.cyksj.common.util.Jsons;
 import com.cyksj.common.util.StringUtil;
 import com.cyksj.common.util.TicketCodeCommonUtil;
 import com.cyksj.enums.GatewayApiCode;
-import com.cyksj.mapper.GroupsMapper;
-import com.cyksj.mapper.GroupsRelationLoginCodeRecordMapper;
-import com.cyksj.mapper.GroupsRelationMapper;
-import com.cyksj.mapper.UserMapper;
+import com.cyksj.mapper.*;
 import com.cyksj.mapper.sys.SysEmailMapper;
 import com.cyksj.model.entity.*;
+import com.cyksj.model.request.TicketLoginReq;
 import com.cyksj.model.views.*;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.chatgpt.ChatGptAuthService;
@@ -31,18 +31,18 @@ import com.cyksj.service.mange.coupon.CouponCommonService;
 import com.cyksj.service.relation.GroupRelationFrontService;
 import com.cyksj.service.relation.GroupsRelationNetflixService;
 import com.cyksj.service.user.UserBindRelationService;
+import com.cyksj.service.user.UserLoginRecordService;
 import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.SearchResult;
 import com.ejlchina.searcher.param.Operator;
+import com.ejlchina.searcher.util.MapBuilder;
 import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
+import javax.servlet.http.HttpServletRequest;
+import java.util.*;
 
 import static com.cyksj.enums.GatewayApiCode.GROUP_INDEX_ALREADY_BE_USER;
 import static com.cyksj.enums.GatewayApiCode.GROUP_INDEX_NOT_FIND;
@@ -83,34 +83,59 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 
 	private final GroupsFuncService groupsFuncService;
 
+	private final HttpServletRequest request;
+
+	private final UserFuncPropertyMapper userFuncPropertyMapper;
+
+	private final GoodsDonSkuMapper goodsDonSkuMapper;
+
+	private final OrderDonMapper orderDonMapper;
+
+	private final OrderDiscountPlusPurchaseSkuRelationMapper orderDiscountPlusPurchaseSkuRelationMapper;
+
+	private final UserLoginRecordService userLoginRecordService;
+
 	private static final GlobalThreadPoolTaskExecutor TASK_EXECUTOR = GlobalThreadPoolTaskExecutor.getInstance();
 
 	//脆球邮箱后缀
 	private final static String CUI_QIU_EMAIL_SUFFIX = "@kindvd.com";
 
 	@Override
-	public List<RenewalView> getMyTicket(long userId, Boolean isLoginPopularize) {
+	public SearchResult<RenewalView> getMyTicket(long userId, Boolean isLoginPopularize, String account) {
 		User u = userMapper.selectById(userId);
 		if (u == null) throw BusinessRuntimeException.getGatewayApiCode(GatewayApiCode.CMS_TOKEN_VALID);
 		if (u.getIsBlack()) {
-			return new ArrayList<>();
+			return new SearchResult<>();
 		}
 		List<Long> userIds = userBindRelationService.getRelationUserIdList(userId, u);
-		List<RenewalView> list = beanSearcher.searchAll(RenewalView.class, MapUtils.builder()
+		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
+		//Long yhsId = yhShopFrontService.getYhsIdByCustomId(customId);
+		DateTime now = DateTime.now();
+		if (StrUtil.isNotBlank(account)) {
+			builder.field(RenewalView::getAccount, account).op(Operator.Contain);
+		}
+		SearchResult<RenewalView> list = beanSearcher.search(RenewalView.class, builder
 				.field(RenewalView::getUserId, 0).op(Operator.GreaterThan)
 				.field(RenewalView::getUserId, userIds).op(Operator.InList)
+				//.field(RenewalView::getYhsId, yhsId)
+				.put("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()
 				.build());
 		//过滤邀请制、已失效的车位
-		DateTime now = DateTime.now();
-		List<RenewalView> collect = list.stream().filter(ticket -> {
-			if (ticket.getExpiryTime() != null && ticket.getExpiryTime().before(now)) {
-				return false;
+		Integer size = list.getTotalCount().intValue();
+
+		list.getDataList().forEach(ticket -> {
+			if (ticket.getSkuId() == null || ticket.getGoodsId() == null) {
+				return;
 			}
 			if (ticket.getGoodsId() == 18 && ticket.getSkuNum() > 1) {
 				ticket.setPassword(null);
 			}
+			ticket.setIsMulti(false);
+			if (ticket.getSkuNum() > 1) {
+				ticket.setIsMulti(true);
+			}
 			//chatGPT直连
 			if (ticket.getGoodsId().equals(42l)) {
 				if (StrUtil.isNotBlank(ticket.getAccount())) {
@@ -143,18 +168,69 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 			if (ticket.getExpiryTime() != null && ticket.getGoodsType() == 1 && ticket.getSecondType() == 2) {
 				String remainDays = DateUtil.formatBetween(now, ticket.getExpiryTime(), BetweenFormater.Level.DAY);
 				if ("0天".equals(remainDays)) {
-					remainDays = "小于1天";
+					remainDays = I18nMessageUtil.getI18nMsg("less_than_one_day");
+				} else {
+					//当天也算
+					int days = Integer.parseInt(remainDays.substring(0, remainDays.indexOf("天")));
+					remainDays = days + 1 + I18nMessageUtil.getI18nMsg("days");
 				}
 				ticket.setRemainDays(remainDays);
 			}
+			OrderDon orderDon = orderDonMapper.selectOne(Wrappers.lambdaQuery(OrderDon.class)
+					.eq(OrderDon::getRelationId, ticket.getRelationId())
+					.eq(OrderDon::getUserId, ticket.getUserId())
+					.notIn(OrderDon::getStatus, Constant.noOrderAllStatus)
+					.orderByDesc(OrderDon::getId)
+					.last("limit 1"));
+			if (orderDon != null) {
+				ticket.setOrderNo(orderDon.getOrderNo());
+				ticket.setOrderId(orderDon.getId());
+				ticket.setTransactionId(orderDon.getTransactionId());
+			}
+
+			if (size > 1 && ticket.getGoodsId() != 18) {
+				Date payTime = null;
+				if (orderDon != null) {
+					payTime = Optional.ofNullable(orderDon.getPayTime()).orElse(orderDon.getCreatedTime());
+				}
+				//加购订单
+				if (orderDon == null) {
+					List<OrderDiscountPlusPurchaseSkuRelation> plusPurchaseSkuRelations = orderDiscountPlusPurchaseSkuRelationMapper.selectPlusRelationByIdAndUserId(ticket.getRelationId(), ticket.getUserId());
+					for (OrderDiscountPlusPurchaseSkuRelation data : plusPurchaseSkuRelations) {
+						String relationIds = data.getRelationIds();
+						if (StrUtil.isEmpty(relationIds)) {
+							return;
+						}
+						try {
+							List<Long> relationList = Jsons.parseList(relationIds, Long.class);
+							if (relationList.contains(ticket.getRelationId())) {
+								OrderDon plusOrder = orderDonMapper.selectById(data.getOrderId());
+								if (plusOrder != null) {
+									payTime = Optional.ofNullable(plusOrder.getPayTime()).orElse(plusOrder.getCreatedTime());
+								}
+								break;
+							}
+						} catch (Exception e) {
+						}
+
+					}
+				}
+				ticket.setPayTime(payTime);
+			}
 			List<GroupsRelationUserView> relationUserViews = groupsRelationMapper.getUserRelationUserViews(ticket.getGroupId(), ticket.getRelationId(), ticket.getUserId(), List.of(GroupsRelation.Status.validity, GroupsRelation.Status.outside));
 			ticket.setRelationViews(relationUserViews);
 			if (ticket.getExpiryTime() != null) {
 				ticket.setExpiryTimeStr(DateUtil.format(ticket.getExpiryTime(), "yyyy-MM-dd"));
 			}
-			return true;
-		}).collect(Collectors.toList());
-		return collect;
+			//查看双重验证码
+			if (StrUtil.isNotEmpty(ticket.getApiSecret())) {
+				Boolean isHasVerifyCode = StrUtil.isNotBlank(ticket.getVerifyCode()) ? true : false;
+				Integer codeNum = getUserCodeNumBySkuId(ticket.getUserId(), ticket.getSkuId(), isHasVerifyCode);
+				ticket.setCodeNum(codeNum);
+			}
+		});
+		userLoginRecordService.saveUserLoginDayRecord(userId);
+		return list;
 	}
 
 	@Override
@@ -231,23 +307,27 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 	}
 
 	@Override
-	public String getAiVerifyCode(Long userId, Long relationId, Integer type, Boolean sync) throws Exception {
+	public String getAiVerifyCode(TicketLoginReq loginReq) throws Exception {
+		Long userId = loginReq.getUserId();
+		Long relationId = loginReq.getRelationId();
+		Integer type = loginReq.getType();
+		Boolean sync = loginReq.getSync();
 		List<Long> relationUserIdList = userBindRelationService.getRelationUserIdList(userId, null);
 		RenewalView renewalView = beanSearcher.searchFirst(RenewalView.class, MapUtils.builder().field(RenewalView::getUserId, relationUserIdList).op(Operator.InList)
 				.field(RenewalView::getRelationId, relationId).build());
 		if (renewalView == null) {
-			throw BusinessRuntimeException.getInstance("您的车票不存在...");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
 		}
 		if (StrUtil.isEmpty(renewalView.getAccount())) {
-			throw BusinessRuntimeException.getInstance("车票未配置账号");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("account_not_set"));
 		}
 		String account = renewalView.getAccount();
 		String password = renewalView.getPassword();
 		if (StrUtil.hasEmpty(account, password)) {
-			throw BusinessRuntimeException.getInstance("您的车票账号密码异常,请联系客服...");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
 		}
 		if (renewalView.getAccount().contains(CUI_QIU_EMAIL_SUFFIX)) {
-			return cuiQiuMailService.getVerifyCode(renewalView.getAccount(), renewalView.getGoodsId(), type, sync);
+			return cuiQiuMailService.getVerifyCode(renewalView.getAccount(), renewalView.getGoodsId(), type, sync, loginReq.getLinkType());
 		}
 		//获取邮箱密码
 		SysEmail sysEmail = sysEmailMapper.selectOne(Wrappers.lambdaQuery(SysEmail.class)
@@ -255,7 +335,7 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 				.last("limit 1"));
 		if (sysEmail == null) {
 			log.info("获取账号:{}验证码异常,未配置对应系统邮箱", account);
-			throw BusinessRuntimeException.getInstance("获取账号验证码异常,请联系客服...");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("obtain_code_error"));
 		}
 		String url = "http://yinhelx.com/api/controller.php";
 		Map<String, Object> params = new HashMap<>();
@@ -273,9 +353,9 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 		post.form(params);
 		cn.hutool.http.HttpResponse execute = post.execute();
 		if (execute.getStatus() != HttpStatus.HTTP_OK) {
-			throw BusinessRuntimeException.getInstance("获取验证码异常,请联系客服...");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("obtain_code_error"));
 		}
-		String code = getDifferentGoodsCode(renewalView.getGoodsId(), execute.body(), type, sync);
+		String code = getDifferentGoodsCode(renewalView.getGoodsId(), execute.body(), type, sync, loginReq.getLinkType());
 		GroupsRelationLoginCodeRecord record = new GroupsRelationLoginCodeRecord();
 		record.setUserId(userId);
 		record.setRelationId(relationId);
@@ -330,7 +410,7 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 							relation.setNum(nextNum);
 							groupsRelationMapper.insert(relation);
 						} else {
-							throw BusinessRuntimeException.getInstance("系统繁忙,请重试...");
+							throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_busy_error"));
 						}
 					}
 					groups = groupsMapper.selectById(groupsId);
@@ -358,7 +438,7 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 						if (relation == null) {
 							Long groupsId = groups.getId();
 							TASK_EXECUTOR.execute(() -> groupsMapper.updateAvailableNum(groupsId));
-							throw BusinessRuntimeException.getInstance("系统繁忙,请重试...");
+							throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_busy_error"));
 						}
 					}
 				}
@@ -374,7 +454,7 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 	}
 
 
-	public String getDifferentGoodsCode(Long goodsId, String body, Integer type, Boolean sync) {
+	public String getDifferentGoodsCode(Long goodsId, String body, Integer type, Boolean sync, Integer linkType) {
 		String code = null;
 		//奈飞
 		if (goodsId == 1) {
@@ -386,21 +466,25 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 					}
 				}
 				if (StrUtil.isEmpty(code)) {
-					throw BusinessRuntimeException.getInstance("查询失败,请检查是否发送了登陆码..");
+					throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("ticket_login_code"));
 				}
 			} else {
-				String urlPref = "https://www.netflix.com/account/update-primary-location";
-				code = StrUtil.subBetween(body, "[" + urlPref, "]");
-				if (StrUtil.isEmpty(code)) {
+				String urlPref;
+				//更新装置
+				if (linkType == 1) {
+					urlPref = "https://www.netflix.com/account/update-primary-location";
+					code = StrUtil.subBetween(body, "[" + urlPref, "]");
+				} else {
+					//验证链接
 					urlPref = "https://www.netflix.com/account/travel/verify";
 					code = StrUtil.subBetween(body, "[" + urlPref, "]");
-					if (StrUtil.isEmpty(code)) {
-						throw BusinessRuntimeException.getInstance("获取认证链接失败,请重新获取");
-					}
+				}
+				if (StrUtil.isEmpty(code)) {
+					throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("ticket_verify_link_error"));
 				}
 				String url = urlPref + code;
 				//非点击装置同步更新按钮 直接返回链接
-				if (!sync) return url;
+				if (linkType == 2) return url;
 				//失败返回验证链接
 				if (!groupsRelationNetflixService.confirmUpdate(url)) {
 					return url;
@@ -419,8 +503,37 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 		code = StringUtil.getVerifyCodePattern(code, length);
 		if (!Validator.isNumber(code)) {
 			log.error("获取账号验证码失败:{}", StrUtil.subSufByLength(code, 512));
-			throw BusinessRuntimeException.getInstance("获取验证码失败,请重新获取..");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("ticket_verify_link_error"));
 		}
 		return code.trim();
 	}
+
+	@Override
+	public Integer getUserCodeNumBySkuId(Long userId, Long skuId, Boolean isHasVerifyCode) {
+		//查看双重验证码
+		UserFuncProperty userFuncProperty = userFuncPropertyMapper.selectOne(Wrappers.lambdaQuery(UserFuncProperty.class).eq(UserFuncProperty::getUserId, userId).last("limit 1"));
+		//默认2次
+		int num = 2;
+		//有安全码查看次数 置为0
+		if (isHasVerifyCode) {
+			num = 0;
+			return num;
+		}
+		//查看双重验证码次数
+		GoodsDonSku sku = goodsDonSkuMapper.selectById(skuId);
+		if (sku.getCodeNum() > 0) {
+			num = sku.getCodeNum();
+		}
+		if (userFuncProperty != null) num = userFuncProperty.getVerifyCheckNum();
+		return num;
+	}
+
+	@Override
+	public List<RenewalView> getHasPayGoods(long userId) {
+		User user = userMapper.selectById(userId);
+		List<Long> userIds = userBindRelationService.getRelationUserIdList(userId, user);
+		DateTime now = DateTime.now();
+		List<RenewalView> list = groupsRelationMapper.getUserHasPayGoods(userIds, now);
+		return list;
+	}
 }

+ 12 - 0
netflix-service/src/main/java/com/cyksj/service/user/UserLoginRecordService.java

@@ -0,0 +1,12 @@
+package com.cyksj.service.user;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: UserLoginRecordService
+ * 创建者: JavaZou
+ * 创建时间:2023/12/13 18:15
+ */
+public interface UserLoginRecordService {
+
+	void saveUserLoginDayRecord(Long userId);
+}

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/user/impl/UserBindRelationServiceImpl.java

@@ -38,7 +38,7 @@ public class UserBindRelationServiceImpl implements UserBindRelationService {
 
 		UserBindDetail userBindDetail;
 		//微信用户
-		if (StrUtil.isNotEmpty(user.getOpenId())) {
+		if (StrUtil.isNotBlank(user.getUnionid()) || StrUtil.isNotEmpty(user.getOpenId())) {
 			userIds.add(userId);
 			userBindDetail = userBindDetailMapper.selectOne(Wrappers.lambdaQuery(UserBindDetail.class)
 					.eq(UserBindDetail::getUserId, userId).last("limit 1"));

+ 38 - 0
netflix-service/src/main/java/com/cyksj/service/user/impl/UserLoginRecordServiceImpl.java

@@ -0,0 +1,38 @@
+package com.cyksj.service.user.impl;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.mapper.UserLoginRecordMapper;
+import com.cyksj.model.entity.UserLoginRecord;
+import com.cyksj.service.user.UserLoginRecordService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: UserLoginRecordServiceImpl
+ * 创建者: JavaZou
+ * 创建时间:2023/12/13 18:15
+ */
+@Service
+@RequiredArgsConstructor
+public class UserLoginRecordServiceImpl implements UserLoginRecordService {
+	private final UserLoginRecordMapper userLoginRecordMapper;
+
+	/**
+	 * 用户每日活跃记录
+	 */
+	public void saveUserLoginDayRecord(Long userId) {
+		//今日是否记录活跃登录
+		Integer count = userLoginRecordMapper.selectCount(Wrappers.lambdaQuery(UserLoginRecord.class)
+				.eq(UserLoginRecord::getUserId, userId)
+				.ge(UserLoginRecord::getCreatedTime, DateUtil.beginOfDay(DateTime.now())));
+
+		if (count == 0) {
+			UserLoginRecord userLoginRecord = new UserLoginRecord();
+			userLoginRecord.setUserId(userId);
+			userLoginRecordMapper.insert(userLoginRecord);
+		}
+	}
+}

+ 24 - 19
netflix-web/src/main/java/com/cyksj/web/controller/group/GroupRelationController.java

@@ -22,7 +22,7 @@ import com.cyksj.mapper.*;
 import com.cyksj.model.dto.DoubleVerifyDto;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.manage.views.GroupsRelationView;
-import com.cyksj.model.request.OrderPayRequest;
+import com.cyksj.model.request.TicketLoginReq;
 import com.cyksj.model.views.*;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.chatgpt.ChatGptAuthService;
@@ -34,6 +34,7 @@ import com.cyksj.service.user.UserBindRelationService;
 import com.cyksj.service.user.UserService;
 import com.cyksj.web.util.StpUserUtil;
 import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.SearchResult;
 import com.ejlchina.searcher.param.Operator;
 import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
@@ -93,19 +94,17 @@ public class GroupRelationController {
     private final static Sequence SEQUENCE = new Sequence(0);
 
     @RequestMapping("/get/renewal")
-    public Result<List<RenewalView>> get(Boolean isLoginPopularize) {
+    public Result<SearchResult<RenewalView>> get(Boolean isLoginPopularize, String account) {
         long userId = StpUserUtil.getLoginIdAsLong();
-        List<RenewalView> list = groupRelationFrontService.getMyTicket(userId, isLoginPopularize);
+        SearchResult<RenewalView> list = groupRelationFrontService.getMyTicket(userId, isLoginPopularize, account);
         return GatewayResponse.SUCCESS.newBuilder().toResult(list);
     }
 
-    @PostMapping("/post/renewal")
-    public Result<OrderDon> renewal(@RequestBody OrderPayRequest request) throws Exception {
+    @GetMapping("/get/pay/goods")
+    public Result<List<RenewalView>> getHasPayGoods() {
         long userId = StpUserUtil.getLoginIdAsLong();
-        request.setUserId(userId);
-
-        OrderDon orderDon = orderDonService.renewal(request);
-        return GatewayResponse.SUCCESS.newBuilder().toResult(orderDon);
+        List<RenewalView> hasPayGoods = groupRelationFrontService.getHasPayGoods(userId);
+        return GatewayResponse.SUCCESS.newBuilder().toResult(hasPayGoods);
     }
 
     @PutMapping("/update/set/account")
@@ -221,7 +220,6 @@ public class GroupRelationController {
     public Result<String> getAuthCode(Long relationId) {
         long userId = StpUserUtil.getLoginIdAsLong();
         List<Long> userIds = userBindRelationService.getRelationUserIdList(userId, null);
-        //每个人 每月只能获取3次
         if (relationId == null) throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
         GroupsRelationView groupsRelationView = beanSearcher.searchFirst(GroupsRelationView.class, MapUtils.builder()
                 .field(GroupsRelationView::getId, relationId)
@@ -234,12 +232,18 @@ public class GroupRelationController {
                 .eq(DoubleVerifyClickRecord::getRelationId, relationId)
                 .eq(DoubleVerifyClickRecord::getAccountId, groupsRelationView.getAccountId())
                 .between(DoubleVerifyClickRecord::getCreatedTime, DateUtil.beginOfMonth(now), DateUtil.endOfMonth(now)));
-        UserFuncProperty userFuncProperty = userFuncPropertyMapper.selectOne(Wrappers.lambdaQuery(UserFuncProperty.class)
-                .eq(UserFuncProperty::getUserId, userId).last("limit 1"));
-        //默认1次
-        int num = 1;
-        if (userFuncProperty != null) num = userFuncProperty.getVerifyCheckNum();
-        if (count >= num) throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("account_auth_code_times_limit"));
+        //获取双重验证码
+        Boolean isHasVerifyCode = StrUtil.isNotBlank(groupsRelationView.getVerifyCode()) ? true : false;
+        //出去亚马逊 获取限制
+        if (groupsRelationView.getGoodsId() != 6) {
+            Integer num = groupRelationFrontService.getUserCodeNumBySkuId(userId, groupsRelationView.getSkuId(), isHasVerifyCode);
+            if (count >= num) throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("account_auth_code_times_limit"));
+        }
+        //一分钟内 只能一人获取
+        boolean b = redisService.setNx(RedisService.key.DOUBLE_VERIFY_CODE_VIEW_MINUTES_KEY.getName() + groupsRelationView.getTripsAccount(), relationId, RedisService.key.DOUBLE_VERIFY_CODE_VIEW_MINUTES_KEY.getTimeout());
+        if (!b) {
+            throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("double_verify_code_time_limit"));
+        }
         int second = now.second();
         if (second < 30 && 30 - second < 3) {
             ThreadUtil.sleep(30 - second + 1, TimeUnit.SECONDS);
@@ -418,9 +422,10 @@ public class GroupRelationController {
     /**
      * 读取车票账号登录验证码
      */
-    @GetMapping("/get/verifyCode/{relationId}")
-    public Result<String> getAiVerifyCode(@PathVariable Long relationId, Integer type, @RequestParam(defaultValue = "0") Boolean sync) throws Exception {
+    @PostMapping("/get/verifyCode")
+    public Result<String> getAiVerifyCode(@RequestBody TicketLoginReq loginReq) throws Exception {
         long userId = StpUserUtil.getLoginIdAsLong();
-        return GatewayResponse.SUCCESS.newBuilder().toResult(groupRelationFrontService.getAiVerifyCode(userId, relationId, type, sync));
+        loginReq.setUserId(userId);
+        return GatewayResponse.SUCCESS.newBuilder().toResult(groupRelationFrontService.getAiVerifyCode(loginReq));
     }
 }

+ 7 - 0
netflix-web/src/main/resources/i18n/yhlx_en_US.properties

@@ -35,6 +35,9 @@ minute=\u0020minute
 hour=\u0020hour
 minutes=\u0020minutes
 hours=\u0020hours
+day=\u0020day
+days=\u0020days
+less_than_one_day=Less than a day
 order_pre_buy_it=\u0020ago,someone bought
 account_auth_not_enable=Dual authentication is not enabled
 account_auth_code_times_limit=The times of get auth code has been limited
@@ -119,3 +122,7 @@ coupon_sku_not_available_renew_error=Cannot be used for renewal of this specific
 coupon_sku_not_available_order_error=Cannot be used to place an order for this specification
 coupon_money_error=The payment amount cannot be less than the discounted amount
 name_too_long=Name is too long
+ticket_login_code=Please check whether the login code was sent
+ticket_verify_link_error=No corresponding verification link obtained
+double_verify_code_time_limit=Someone has obtained the account verification code within one minute. Please obtain it later
+obtain_code_error=Exception in obtaining verification code, please contact customer service

+ 8 - 1
netflix-web/src/main/resources/i18n/yhlx_ja_JP.properties

@@ -29,6 +29,9 @@ minute=分だ
 hour=時間
 minutes=分だ。
 hours=時間
+day=日
+days=日
+less_than_one_day=1日もたたないうちに
 order_pre_buy_it=先に購入
 account_auth_not_enable=二重認証が有効になっていない
 account_auth_code_times_limit=最大獲得数を達成
@@ -118,4 +121,8 @@ bind_account_detail_not_exist=アカウント情報が関連付けられてい
 coupon_sku_not_available_renew_error=本仕様の更新には使用できません
 coupon_sku_not_available_order_error=この仕様の注文には使用できません
 coupon_money_error=支払額が割引額を下回ることはない
-name_too_long=名前が長すぎます
+name_too_long=名前が長すぎます
+ticket_login_code=ログインコードが送信されているか確認してください
+ticket_verify_link_error=対応する検証リンクが取得されていません
+double_verify_code_time_limit=1分以内にアカウント認証コードを取得した人がいるので、後で取得してください
+obtain_code_error=認証コード異常を取得するには、カスタマーサービスに連絡してください

+ 7 - 0
netflix-web/src/main/resources/i18n/yhlx_ko_KR.properties

@@ -29,6 +29,9 @@ minute=분
 hour=시간
 minutes=분
 hours=시간
+day=일
+days=일
+less_than_one_day=하루도 안 되다
 order_pre_buy_it=전구매
 account_auth_not_enable=이중 인증이 사용되지 않음
 account_auth_code_times_limit=최대 획득 횟수 도달
@@ -119,3 +122,7 @@ coupon_sku_not_available_renew_error=이 사양의 갱신에는 사용할 수 
 coupon_sku_not_available_order_error=이 사양을 주문하는 데 사용할 수 없습니다
 coupon_money_error=결제 금액은 할인된 금액보다 작을 수 없습니다
 name_too_long=이름이 너무 깁니다
+ticket_login_code=로그인 번호를 보냈는지 확인하세요
+ticket_verify_link_error=유효성 검사 링크가 없습니다.
+double_verify_code_time_limit=1분 내에 이미 이 계정 인증번호를 획득한 사람이 있습니다. 잠시 후에 획득하세요
+obtain_code_error=인증번호 이상 획득, 고객센터에 연락하세요

+ 8 - 1
netflix-web/src/main/resources/i18n/yhlx_zh_CN.properties

@@ -35,6 +35,9 @@ minute=分钟
 hour=小时
 minutes=分钟
 hours=小时
+day=天
+days=天
+less_than_one_day=不到一天
 order_pre_buy_it=前有人购买
 account_auth_not_enable=未开启双重验证
 account_auth_code_times_limit=获取次数上限
@@ -118,4 +121,8 @@ bind_account_detail_not_exist=您未有绑定账号信息
 coupon_sku_not_available_renew_error=不能用于该规格续费
 coupon_sku_not_available_order_error=不能用于该规格下单
 coupon_money_error=支付金额不能小于优惠金额
-name_too_long=名称过长
+name_too_long=名称过长
+ticket_login_code=查询失败,请检查是否发送了登陆码
+ticket_verify_link_error=未获取到对应验证链接
+double_verify_code_time_limit=一分钟内已有人获取该账号验证码,请稍后获取
+obtain_code_error=获取验证码异常,请联系客服

+ 8 - 1
netflix-web/src/main/resources/i18n/yhlx_zh_HK.properties

@@ -28,6 +28,9 @@ minute=分鍾
 hour=小時
 minutes=分鍾
 hours=小時
+day=天
+days=天
+less_than_one_day=不到壹天
 order_pre_buy_it=前有人購買
 params_error=請輸入正確的信息
 account_auth_not_enable=未開啓雙重驗證
@@ -118,4 +121,8 @@ bind_account_detail_not_exist=您未有綁定賬號信息
 coupon_sku_not_available_renew_error=不能用于該規格續費
 coupon_sku_not_available_order_error=不能用于該規格下單
 coupon_money_error=支付金額不能小于優惠金額
-name_too_long=名稱過長
+name_too_long=名稱過長
+ticket_login_code=查詢失敗,請檢查是否發送了登陸碼
+ticket_verify_link_error=未獲取到對應驗證鏈接
+double_verify_code_time_limit=壹分鐘內已有人獲取該賬號驗證碼,請稍後獲取
+obtain_code_error=獲取驗證碼異常,請聯系客服