Selaa lähdekoodia

银河海外代码合并

zoujiajian 3 vuotta sitten
vanhempi
sitoutus
f41d06b870
58 muutettua tiedostoa jossa 1628 lisäystä ja 482 poistoa
  1. 3 3
      netflix-common/src/main/java/com/cyksj/common/constant/Constant.java
  2. 15 0
      netflix-common/src/main/java/com/cyksj/common/constant/EmailConstant.java
  3. 8 8
      netflix-common/src/main/java/com/cyksj/common/util/J11HttpC.java
  4. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/UserPageLanguageMapper.java
  5. 2 1
      netflix-dao/src/main/java/com/cyksj/model/entity/OrderDon.java
  6. 47 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserPageLanguage.java
  7. 24 0
      netflix-dao/src/main/java/com/cyksj/model/request/EmailFeedBackReq.java
  8. 4 0
      netflix-dao/src/main/java/com/cyksj/model/request/LoginReq.java
  9. 31 0
      netflix-service/src/main/java/com/cyksj/common/i18n/I18nMessageUtil.java
  10. 61 0
      netflix-service/src/main/java/com/cyksj/common/i18n/I18nValueEnumUtil.java
  11. 6 4
      netflix-service/src/main/java/com/cyksj/redis/RedisService.java
  12. 30 25
      netflix-service/src/main/java/com/cyksj/service/coupon/impl/CouponFontServiceImpl.java
  13. 5 4
      netflix-service/src/main/java/com/cyksj/service/cps/impl/CpsManageServiceImpl.java
  14. 36 35
      netflix-service/src/main/java/com/cyksj/service/exchange/impl/ExchangeCodeServiceImpl.java
  15. 4 0
      netflix-service/src/main/java/com/cyksj/service/mail/MailService.java
  16. 60 0
      netflix-service/src/main/java/com/cyksj/service/mail/impl/MailServiceImpl.java
  17. 5 4
      netflix-service/src/main/java/com/cyksj/service/mange/coupon/impl/CouponCommonServiceImpl.java
  18. 2 2
      netflix-service/src/main/java/com/cyksj/service/mange/group/CmsGroupServiceImpl.java
  19. 23 22
      netflix-service/src/main/java/com/cyksj/service/market/impl/MarketFrontServiceImpl.java
  20. 31 30
      netflix-service/src/main/java/com/cyksj/service/market/task/impl/BindTaskServiceImpl.java
  21. 28 26
      netflix-service/src/main/java/com/cyksj/service/market/task/impl/TaskServiceImpl.java
  22. 60 98
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java
  23. 5 1
      netflix-service/src/main/java/com/cyksj/service/order/impl/UserRealOrderBenefitsImpl.java
  24. 2 2
      netflix-service/src/main/java/com/cyksj/service/paypal/PayPalService.java
  25. 4 3
      netflix-service/src/main/java/com/cyksj/service/phone/impl/PhoneCodeServiceImpl.java
  26. 6 1
      netflix-service/src/main/java/com/cyksj/service/stripe/StripeService.java
  27. 1 1
      netflix-service/src/main/java/com/cyksj/service/template/impl/TemplateCommonServiceImpl.java
  28. 19 12
      netflix-service/src/main/java/com/cyksj/service/user/impl/UserServiceImpl.java
  29. 7 5
      netflix-service/src/main/java/com/cyksj/service/user/impl/WorkOrderFrontServiceImpl.java
  30. 24 0
      netflix-web/src/main/java/com/cyksj/config/i18n/LocaleResolverConfig.java
  31. 54 0
      netflix-web/src/main/java/com/cyksj/config/i18n/MyLocaleResolver.java
  32. 4 0
      netflix-web/src/main/java/com/cyksj/web/GlobalExceptionHandler.java
  33. 2 1
      netflix-web/src/main/java/com/cyksj/web/controller/channel/ChannelController.java
  34. 22 21
      netflix-web/src/main/java/com/cyksj/web/controller/coupon/CouponFrontController.java
  35. 3 2
      netflix-web/src/main/java/com/cyksj/web/controller/distribute/EquipmentDistributeController.java
  36. 68 83
      netflix-web/src/main/java/com/cyksj/web/controller/goods/GoodsDonController.java
  37. 22 19
      netflix-web/src/main/java/com/cyksj/web/controller/group/GroupRelationController.java
  38. 6 5
      netflix-web/src/main/java/com/cyksj/web/controller/manage/AdminController.java
  39. 6 5
      netflix-web/src/main/java/com/cyksj/web/controller/manage/cms/CmsAdminUserController.java
  40. 6 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/statistics/StatisticsDataController.java
  41. 2 1
      netflix-web/src/main/java/com/cyksj/web/controller/market/LuckyDrawFrontController.java
  42. 2 1
      netflix-web/src/main/java/com/cyksj/web/controller/market/SignFrontController.java
  43. 7 6
      netflix-web/src/main/java/com/cyksj/web/controller/market/TaskFrontController.java
  44. 53 10
      netflix-web/src/main/java/com/cyksj/web/controller/user/AuthorizationController.java
  45. 11 10
      netflix-web/src/main/java/com/cyksj/web/controller/user/DistributePopularizeController.java
  46. 3 1
      netflix-web/src/main/java/com/cyksj/web/controller/user/PhoneAreaCodeController.java
  47. 1 1
      netflix-web/src/main/java/com/cyksj/web/controller/user/UserComplaintController.java
  48. 59 7
      netflix-web/src/main/java/com/cyksj/web/controller/user/UserController.java
  49. 0 0
      netflix-web/src/main/resources/application-dev.yml
  50. 0 0
      netflix-web/src/main/resources/application-prd.yml
  51. 8 1
      netflix-web/src/main/resources/application-pre.yml
  52. 115 0
      netflix-web/src/main/resources/i18n/yhlx.properties
  53. 115 0
      netflix-web/src/main/resources/i18n/yhlx_en_US.properties
  54. 115 0
      netflix-web/src/main/resources/i18n/yhlx_ja_JP.properties
  55. 115 0
      netflix-web/src/main/resources/i18n/yhlx_ko_KR.properties
  56. 115 0
      netflix-web/src/main/resources/i18n/yhlx_zh_CN.properties
  57. 115 0
      netflix-web/src/main/resources/i18n/yhlx_zh_HK.properties
  58. 33 21
      pom.xml

+ 3 - 3
netflix-common/src/main/java/com/cyksj/common/constant/Constant.java

@@ -14,7 +14,7 @@ public interface Constant {
 	 */
 	Long DAY_MILLS = 86400000l;
 
-	String DEFAULT_NAME = "银河用户";
+	String DEFAULT_NAME = "galaxy";
 
 	List<String> noOrderStatus = List.of("close", "noPayment");
 
@@ -102,9 +102,9 @@ public interface Constant {
 	 */
 	String QR_CODE_WX_APP_ID = "qr_code_wx_app_id";
 
-	String CHANGE_GROUPS_TRIPS_ACCOUNT = "您好,您购买的%s,账号已替换,请登陆网站https://nf.video/查看最新账号密码【银河录像局】";
+	String CHANGE_GROUPS_TRIPS_ACCOUNT = "您好,您购买的%s,账号已替换,请登陆网站%s查看最新账号密码【银河录像局】";
 
-	String ACCOUNT_EXPIRY_MSG_TEMPLATE = "您好,您购买的%s,还有%s到期,请登陆网站https://nf.video/及时续费。【银河录像局】";
+	String ACCOUNT_EXPIRY_MSG_TEMPLATE = "您好,您购买的%s,还有%s到期,请登陆网站%s及时续费。【银河录像局】";
 
 	String AMERICA_APPID_SECRET = "1990-01-01 朋友 aaa111 工作 aab112 父母 aac113";
 

+ 15 - 0
netflix-common/src/main/java/com/cyksj/common/constant/EmailConstant.java

@@ -0,0 +1,15 @@
+package com.cyksj.common.constant;
+
+/*
+ *项目名: netflix
+ *文件名: EmailConstant
+ *创建者: JavaZou
+ *创建时间:2023/8/14 16:07
+ */
+public interface EmailConstant {
+	String email_feed_back_template = "用户名:%s, <br/>" +
+			"联系邮箱:%s, <br/>" +
+			"反馈问题:%s, <br/>";
+
+	String EMAIL_FEED_BACK_IMG_TEMPLATE = "<img src='%s' width = 200/>";
+}

+ 8 - 8
netflix-common/src/main/java/com/cyksj/common/util/J11HttpC.java

@@ -60,20 +60,20 @@ public class J11HttpC {
     /**
      * 微信退款 专用 ssl http client
      */
-    private static final HttpClient wx_refund;
-    static {
-        wx_refund = HttpClient.newBuilder()
-                .connectTimeout(CONNECT_TIMEOUT)
-                .sslContext(NSslKit.KeyCert.wechat_refund.getSslContext())
-                .build();
-    }
+//    private static final HttpClient wx_refund;
+//    static {
+//        wx_refund = HttpClient.newBuilder()
+//                .connectTimeout(CONNECT_TIMEOUT)
+//                .sslContext(NSslKit.KeyCert.wechat_refund.getSslContext())
+//                .build();
+//    }
 
     /**
      * http clients
      */
     public enum Client {
         BASE(defaultClient),
-        WX_REFUND(wx_refund),
+        //WX_REFUND(wx_refund),
         ;
 
         private HttpClient symbol;

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

@@ -0,0 +1,13 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.UserPageLanguage;
+
+/*
+ *项目名: netflix
+ *文件名: UserPageLanguageMapper
+ *创建者: JavaZou
+ *创建时间:2022/12/7 17:48
+ */
+public interface UserPageLanguageMapper extends BaseMapper<UserPageLanguage> {
+}

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

@@ -54,11 +54,12 @@ public class OrderDon extends BaseEntity implements Serializable {
     /**
      * 海外支付金额
      */
-    private BigDecimal abroadMoney;
+    //private BigDecimal abroadMoney;
 
     /**
      * 手续费
      */
+    @TableField(value = "transaction_fee")
     private BigDecimal abroadTransactionFee;
 
     /**

+ 47 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/UserPageLanguage.java

@@ -0,0 +1,47 @@
+package com.cyksj.model.entity;
+
+import cn.hutool.core.util.StrUtil;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.stream.Stream;
+
+/*
+ *项目名: netflix
+ *文件名: UserPageLanguage
+ *创建者: JavaZou
+ *创建时间:2022/12/7 17:41
+ */
+@Getter
+@Setter
+public class UserPageLanguage extends BaseEntity {
+
+	private Long userId;
+
+
+	private Language language;
+
+	@Getter
+	public enum Language {
+		zh_CN("中文"),
+		zh_HK("中文香港繁体"),
+		ja_JP("日语"),
+		ko_KR("韩语"),
+		en_US("英文");
+
+		String desc;
+
+		Language(String desc) {
+			this.desc = desc;
+		}
+
+		public static Boolean checkLanguage(String language) {
+			if (StrUtil.isEmpty(language)) {
+				return false;
+			}
+			return Stream.of(Language.values())
+					.filter(value -> value.name().equals(language))
+					.findFirst().isPresent();
+		}
+	}
+}

+ 24 - 0
netflix-dao/src/main/java/com/cyksj/model/request/EmailFeedBackReq.java

@@ -0,0 +1,24 @@
+package com.cyksj.model.request;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: EmailFeedBackReq
+ *创建者: JavaZou
+ *创建时间:2023/8/14 16:03
+ */
+@Getter
+@Setter
+public class EmailFeedBackReq {
+	private String email;
+
+	private String nickname;
+
+	private String content;
+
+	private Boolean isLogin;
+
+	private String imgs;
+}

+ 4 - 0
netflix-dao/src/main/java/com/cyksj/model/request/LoginReq.java

@@ -2,6 +2,7 @@ package com.cyksj.model.request;
 
 import lombok.Getter;
 import lombok.Setter;
+import lombok.ToString;
 
 /*
  *项目名: netflix
@@ -11,6 +12,7 @@ import lombok.Setter;
  */
 @Getter
 @Setter
+@ToString
 public class LoginReq {
 	private String phone;
 
@@ -59,4 +61,6 @@ public class LoginReq {
 	private String callback;
 
 	private String callbackType;
+
+	private String subject;
 }

+ 31 - 0
netflix-service/src/main/java/com/cyksj/common/i18n/I18nMessageUtil.java

@@ -0,0 +1,31 @@
+package com.cyksj.common.i18n;
+
+import org.springframework.context.MessageSource;
+import org.springframework.context.NoSuchMessageException;
+import org.springframework.context.i18n.LocaleContextHolder;
+import org.springframework.stereotype.Component;
+
+/*
+ *项目名: netflix
+ *文件名: I18NMessageUtil
+ *创建者: JavaZou
+ *创建时间:2022/12/7 16:38
+ */
+@Component
+public class I18nMessageUtil {
+	private static MessageSource messageSource;
+
+	public static String DEFAULT_KEY = "default_msg";
+
+	public I18nMessageUtil(MessageSource messageSource) {
+		this.messageSource = messageSource;
+	}
+
+	public static String getI18nMsg(String key) {
+		try {
+			return messageSource.getMessage(key, null, LocaleContextHolder.getLocale());
+		} catch (NoSuchMessageException e) {
+			return messageSource.getMessage(DEFAULT_KEY, null, LocaleContextHolder.getLocale());
+		}
+	}
+}

+ 61 - 0
netflix-service/src/main/java/com/cyksj/common/i18n/I18nValueEnumUtil.java

@@ -0,0 +1,61 @@
+package com.cyksj.common.i18n;
+
+import com.cyksj.model.entity.UserPageLanguage;
+import lombok.Getter;
+
+import java.util.Locale;
+
+/*
+ *项目名: netflix
+ *文件名: I18nValueEnumUtil
+ *创建者: JavaZou
+ *创建时间:2022/12/12 13:57
+ */
+@Getter
+@Deprecated
+public enum I18nValueEnumUtil {
+
+
+	PARKING_SPACE_NOT_EXIST("该车位不存在", "The parking space does not exist"),
+
+	PARKING_SPACE_IS_OCCUPIED("该车位已有人", "The parking space is occupied"),
+
+	//兑换码
+	EX_CODE_ERROR("该兑换码错误", "The redemption code is wrong"),
+
+	EX_CODE_SUCCESS("兑换成功", "Successful exchange"),
+
+	//优惠券
+	COUPON_EXPIRED_ERROR("该优惠券已过期", "The coupon has expired"),
+
+	COUPON_INVALID_ERROR("该优惠券已失效", "The coupon has invalid"),
+
+	COUPON_NOTEFFECTIVE_ERROR("该优惠券未生效", "The coupon not valid"),
+
+	COUPON_UNAVAILABLE_RENEW("该优惠券续费时不可使用", "The coupon unavailable for renewal"),
+
+	RECEIVE_SUCCESS("领取成功", "Receive success"),
+
+	SYS_ERROR("系统错误", "Please refresh and try again"),
+
+	PARAMS_ERROR("参数错误", "Parameter error"),
+	;
+
+	private String zh_CN_value;
+
+	private String en_US_value;
+
+	I18nValueEnumUtil(String zh_CN_value, String en_US_value) {
+		this.zh_CN_value = zh_CN_value;
+		this.en_US_value = en_US_value;
+	}
+
+	public static String getI18nValue(I18nValueEnumUtil i18nValueEnum) {
+		Locale locale = Locale.getDefault();
+		UserPageLanguage.Language language = UserPageLanguage.Language.valueOf(locale.getLanguage());
+		if (language == UserPageLanguage.Language.en_US) {
+			return i18nValueEnum.getEn_US_value();
+		}
+		return i18nValueEnum.getZh_CN_value();
+	}
+}

+ 6 - 4
netflix-service/src/main/java/com/cyksj/redis/RedisService.java

@@ -3,14 +3,12 @@ package com.cyksj.redis;
 import com.cyksj.common.util.StringUtil;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
+import org.springframework.context.i18n.LocaleContextHolder;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import java.util.concurrent.TimeUnit;
 
 
@@ -641,6 +639,10 @@ public class RedisService {
 
         private long timeout;
 
+        public String getNameLanguagePrefix() {
+            Locale locale = LocaleContextHolder.getLocale();
+            return this.getName() + locale + ":";
+        }
 
         public String getNameFormat(Object ... str) {
             return String.format(this.getName(), str);

+ 30 - 25
netflix-service/src/main/java/com/cyksj/service/coupon/impl/CouponFontServiceImpl.java

@@ -7,6 +7,7 @@ import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 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.enums.GatewayApiCode;
@@ -67,10 +68,10 @@ public class CouponFontServiceImpl implements CouponFontService {
 		collectCommonCheck(couponCollectReq.getCouponId(), userId);
 		CouponActive couponActive = couponActiveMapper.selectById(couponCollectReq.getCouponActiveId());
 		if (couponActive == null) {
-			throw BusinessRuntimeException.getInstance("该发放优惠券不存在");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_not_exists"));
 		}
 		if (couponActive.getRemainNum() <= 0) {
-			throw BusinessRuntimeException.getInstance("该优惠券已领取完");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_receive_num"));
 		}
 
 		receiveCouponUser(couponCollectReq.getCouponId(), userId, CouponUser.Channel.center);
@@ -79,7 +80,7 @@ public class CouponFontServiceImpl implements CouponFontService {
 			Integer remainNum = couponActive.getRemainNum();
 			Integer update = couponActiveMapper.subRemainNum(couponActive.getId(), remainNum);
 			if (update != 1) {
-				throw BusinessRuntimeException.getInstance("系统繁忙,请稍后再试..");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
 			}
 		}
 	}
@@ -128,6 +129,9 @@ public class CouponFontServiceImpl implements CouponFontService {
 		Long goodsId = null;
 		//实物还是虚物
 		GoodsDonSkuView goodsDonSkuView = beanSearcher.searchFirst(GoodsDonSkuView.class, MapUtils.builder().field(GoodsDonSkuView::getSkuId, skuId).op(Operator.Equal).build());
+		if (goodsDonSkuView == null) {
+			return new Page<>();
+		}
 		BigDecimal skuMoney = goodsDonSkuView.getMoney();
 		if (goodsDonSkuView.getType() == 2) {
 			goodsId = goodsDonSkuView.getGoodsId();
@@ -145,23 +149,24 @@ public class CouponFontServiceImpl implements CouponFontService {
 				}
 
 				if (!data.getIsAvailable()) {
-					data.setReason(String.format("仅限%s", data.getGoodsSkuStr()));
-					if (data.getUseScope() == Coupon.UseScope.renew) {
-						data.setReason(String.format("%s续费时可使用", data.getReason()));
-					} else if (data.getUseScope() == Coupon.UseScope.orders) {
-						data.setReason(String.format("%s下单时可使用", data.getReason()));
-					}
+//					data.setReason(String.format("仅限%s", data.getGoodsSkuStr()));
+//					if (data.getUseScope() == Coupon.UseScope.renew) {
+//						data.setReason(String.format("%s续费时可使用", data.getReason()));
+//					} else if (data.getUseScope() == Coupon.UseScope.orders) {
+//						data.setReason(String.format("%s下单时可使用", data.getReason()));
+//					}
+					data.setReason(I18nMessageUtil.getI18nMsg("coupon_sku_not_available_error"));
 				}
 
 				if (goodsDonSkuView.getType() == 2 && data.getType() == Coupon.Type.reduce) {
 					if (data.getIsAvailable() && skuMoney.compareTo(data.getReduceCondition()) < 0) {
 						data.setIsAvailable(false);
-						data.setReason(String.format("满%s可用", data.getReduceCondition().divide(BigDecimal.valueOf(100))));
+						data.setReason(I18nMessageUtil.getI18nMsg("coupon_reduce_money_not_available_error"));
 					}
 				}
 
 				if (isRenew != null && isRenew && data.getUseScope() == Coupon.UseScope.orders) {
-					data.setReason("仅下单可使用");
+					data.setReason(I18nMessageUtil.getI18nMsg("coupon_only_order_error"));
 				}
 				//为了重新校验
 				data.setCouponUserStatus(CouponUser.Status.unused);
@@ -184,17 +189,17 @@ public class CouponFontServiceImpl implements CouponFontService {
 			if (data.getExpiryStatus() != null && !data.getExpiryStatus()) {
 				data.setCouponUserStatus(CouponUser.Status.invalid);
 				data.setIsAvailable(false);
-				data.setReason("该优惠券已失效");
+				data.setReason(I18nMessageUtil.getI18nMsg("coupon_invalid"));
 				isFlag = true;
 			} else if (now.isAfter(data.getValidEndTime())) {
 				data.setCouponUserStatus(CouponUser.Status.expired);
 				data.setIsAvailable(false);
-				data.setReason("该优惠券已过期");
+				data.setReason(I18nMessageUtil.getI18nMsg("coupon_expired"));
 				isFlag = true;
 			} else if (now.isBefore(data.getValidStartTime())) {
 				data.setCouponUserStatus(CouponUser.Status.notEffective);
 				data.setIsAvailable(false);
-				data.setReason("该优惠券未生效");
+				data.setReason(I18nMessageUtil.getI18nMsg("coupon_not_effective"));
 				isFlag = true;
 			}
 		}
@@ -219,22 +224,22 @@ public class CouponFontServiceImpl implements CouponFontService {
 	public void collectCommonCheck(Long couponId, Long userId) {
 		Coupon coupon = couponMapper.selectById(couponId);
 		if (coupon == null || !coupon.getDeleted()) {
-			throw BusinessRuntimeException.getInstance("该优惠券不存在");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_not_exist"));
 		}
 		//是否可领取
 		if (coupon.getScope() == Coupon.Scope.newUser) {
 			//注册后从没产生过虚拟订单的用户,产生过退款后也不是新用户
 			CouponNewUserView couponNewUserView = beanSearcher.searchFirst(CouponNewUserView.class, MapUtils.builder().field(CouponNewUserView::getUserId, userId).op(Operator.Equal).build());
 			if (couponNewUserView != null) {
-				throw BusinessRuntimeException.getInstance("该优惠券只能新用户才能领取");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_new_user_receive"));
 			}
 		}
 		CouponUser couponUser = couponUserMapper.selectOne(Wrappers.lambdaQuery(CouponUser.class).eq(CouponUser::getUserId, userId).eq(CouponUser::getCouponId, couponId));
 		if (couponUser != null) {
 			if (couponUser.getChannel() == CouponUser.Channel.exCode) {
-				throw BusinessRuntimeException.getInstance("您已兑换过该优惠券..");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_has_received"));
 			}
-			throw BusinessRuntimeException.getInstance("您已领取该优惠券..");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_has_received"));
 		}
 	}
 
@@ -287,10 +292,10 @@ public class CouponFontServiceImpl implements CouponFontService {
 		try {
 			couponIdList = Jsons.parseList(couponIds, Long.class);
 			if (!couponIdList.contains(couponId)) {
-				throw BusinessRuntimeException.getInstance("链接未关联该优惠券");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
 			}
 		} catch (Exception e) {
-			throw BusinessRuntimeException.getInstance("链接未关联该优惠券");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
 		}
 		//优惠券领取状态校验
 		collectCommonCheck(couponId, userId);
@@ -306,7 +311,7 @@ public class CouponFontServiceImpl implements CouponFontService {
 		try {
 			couponIdList = Jsons.parseList(couponIds, Long.class);
 		} catch (Exception e) {
-			throw BusinessRuntimeException.getInstance("链接未关联优惠券");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
 		}
 		//一键领取优惠券
 		couponIdList.forEach(couponId -> {
@@ -324,15 +329,15 @@ public class CouponFontServiceImpl implements CouponFontService {
 			throw BusinessRuntimeException.getGatewayApiCode(GatewayApiCode.CMS_USER_NO_FIND);
 		}
 		if (!user.getPopularizeId().equals(popularizeId)) {
-			throw BusinessRuntimeException.getInstance("渠道推广新用户才能领取该优惠券");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_new_user_receive"));
 		}
 		//渠道链接是否存在
 		ChannelPopularize channelPopularize = channelPopularizeMapper.selectById(popularizeId);
-		Assert.notNull(channelPopularize, "链接不存在");
+		Assert.notNull(channelPopularize, I18nMessageUtil.getI18nMsg("popularize_link_nt"));
 		//是否关联该优惠券
 		String couponIds = channelPopularize.getCouponIds();
 		if (StrUtil.isEmpty(couponIds)) {
-			throw BusinessRuntimeException.getInstance("链接未关联优惠券");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
 		}
 		return channelPopularize;
 	}
@@ -353,7 +358,7 @@ public class CouponFontServiceImpl implements CouponFontService {
 			couponUserMapper.insert(couponUser);
 		} catch (DuplicateKeyException e) {
 			log.info("用户:{}重复领取优惠券{}插入数据错误", userId, couponId);
-			throw BusinessRuntimeException.getInstance("已领取成功");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_receive_success"));
 		}
 	}
 

+ 5 - 4
netflix-service/src/main/java/com/cyksj/service/cps/impl/CpsManageServiceImpl.java

@@ -5,6 +5,7 @@ import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.lang.Validator;
 import cn.hutool.core.util.StrUtil;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.i18n.I18nMessageUtil;
 import com.cyksj.common.util.SmsUtil;
 import com.cyksj.common.util.StringUtil;
 import com.cyksj.mapper.manage.distribute.DistributeWaitingSendPointsMapper;
@@ -64,12 +65,12 @@ public class CpsManageServiceImpl implements CpsManageService {
 		String code = StringUtil.getRandomCodeStr(6);
 		if (type == 1) {
 			if (StrUtil.isEmpty(login) || (86 == cid && !Validator.isMobile(phone))) {
-				throw BusinessRuntimeException.getInstance("请输入正确的手机号");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("phone_format_error"));
 			}
 			SmsUtil.sendTencent(cid, login, code);
 		} else if (type == 2) {
 			if (!Validator.isEmail(login)) {
-				throw BusinessRuntimeException.getInstance("请输入正确的邮箱");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("email_format_error"));
 			}
 			mailService.sendLoginCodeEmailToPeople(code, login);
 		}
@@ -94,12 +95,12 @@ public class CpsManageServiceImpl implements CpsManageService {
 		String CACHE_LOGIN_KEY = RedisService.key.CPS_BACK_LOGIN_KEY.getName();
 		if (type == 1) {
 			if (StrUtil.isEmpty(phone)) {
-				throw BusinessRuntimeException.getInstance("请输入正确的手机号");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("phone_format_error"));
 			}
 			CACHE_LOGIN_KEY += phone;
 		} else if (type == 2) {
 			if (!Validator.isEmail(email)) {
-				throw BusinessRuntimeException.getInstance("请输入正确的邮箱");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("email_format_error"));
 			}
 			CACHE_LOGIN_KEY += email;
 		}

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

@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.cyksj.common.annotation.NoSubmit;
 import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.i18n.I18nMessageUtil;
 import com.cyksj.common.snowflake.Sequence;
 import com.cyksj.common.task.GlobalThreadPoolTaskExecutor;
 import com.cyksj.common.util.StringUtil;
@@ -130,14 +131,14 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 	@NoSubmit
 	public Result<String> getTicketByExchangeCode(ExchangeCodeTicket exchangeCodeTicket, Long userId) {
 		if (StrUtil.isEmpty(exchangeCodeTicket.getCode())) {
-			throw BusinessRuntimeException.getInstance("兑换码有误,请使用正确的兑换码");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("ex_code_error"));
 		}
 		ExchangeCode exchangeCode = this.getOne(Wrappers.lambdaQuery(ExchangeCode.class).eq(ExchangeCode::getCode, exchangeCodeTicket.getCode()).last("limit 1"));
 		if (exchangeCode == null) {
-			throw BusinessRuntimeException.getInstance("兑换码有误,请使用正确的兑换码");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("ex_code_error"));
 		}
 		if (exchangeCode.getUseStatus()) {
-			throw BusinessRuntimeException.getInstance("该兑换码已使用");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("ex_code_used"));
 		}
 		//兑换成功
 		exchangeCode.setUseStatus(true);
@@ -145,7 +146,7 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 		exchangeCode.setUseTime(DateTime.now());
 		int update = exchangeCodeMapper.update(exchangeCode, Wrappers.lambdaQuery(ExchangeCode.class).eq(ExchangeCode::getId, exchangeCode.getId()).eq(ExchangeCode::getUseStatus, false));
 		if (update != 1) {
-			throw BusinessRuntimeException.getInstance("该兑换码已使用");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("ex_code_used"));
 		}
 		//是否是推广用户未登录订单关联的兑换码
 		OrderDon orderDon = orderDonMapper.selectOne(Wrappers.lambdaQuery(OrderDon.class)
@@ -162,7 +163,7 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 		if (exchangeCode.getType() == 1) {
 			luckyDrawRecordMapper.updateExCodeStatus(userId, exchangeCode.getCode());
 		}
-		return GatewayResponse.SUCCESS.newBuilder().toResult("兑换成功");
+		return GatewayResponse.SUCCESS.newBuilder().toResult(I18nMessageUtil.getI18nMsg("ex_code_success"));
 	}
 
 	@Override
@@ -217,15 +218,15 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 	@Override
 	public GroupsRelation getGroupTripsTicket(GoodsDonSku sku, Long userId, OrderDon exCodeOrderDon, OrderDon.Type orderDonTye) {
 		if (sku == null) {
-			throw BusinessRuntimeException.getInstance("规格不存在,请联系客服");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sku_nt"));
 		}
 		GoodsDon goodsDon = goodsDonMapper.selectById(sku.getGoodsId());
 		if (goodsDon == null) {
-			throw BusinessRuntimeException.getInstance("平台不存在,请联系客服");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("goods_nt"));
 		}
 		User user = userMapper.selectById(userId);
 		if (user == null) {
-			throw BusinessRuntimeException.getInstance("用户不存在");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("auth_error"));
 		}
 		GroupsRelation relation = getRelationNoOrder(sku, userId);
 
@@ -255,32 +256,32 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 			orderDon.setUserId(user.getId());
 			orderDonMapper.insert(orderDon);
 		}
-		if (StrUtil.isNotEmpty(user.getOpenId())) {
-			//发送模板消息
-			THREAD_POOL_TASK_EXECUTOR.execute(() -> {
-				try {
-					if (StrUtil.isNotEmpty(user.getOpenId())) {
-						log.info("用户{}兑换车位成功,发送新订单模板消息", user.getId());
-						templateCommonService.newOderSendMsgByType(orderDon, goodsDon, user, user.getOpenId(), false);
-					}
-				} catch (Exception e) {
-					log.info("用户{}兑换车位成功,发送消息失败:{}", user.getId(), e);
-				}
-			});
-		}
-
-		THREAD_POOL_TASK_EXECUTOR.execute(() -> {
-			try {
-				//发送至客服消息
-				List<CustomerService> customerServices = customerServiceMapper.selectList(null);
-				for (CustomerService customerService : customerServices) {
-					log.info("向客服{}发送用户兑换码兑换车票消息通知..", customerService.getNickName());
-					templateCommonService.newOderSendMsgByType(orderDon, goodsDon, user, customerService.getOpenId(), true);
-				}
-			} catch (Exception e) {
-				log.error("向客服发送用户{}兑换码兑换车票成功,发送消息失败:{}", user.getId(), e);
-			}
-		});
+//		if (StrUtil.isNotEmpty(user.getOpenId())) {
+//			//发送模板消息
+//			THREAD_POOL_TASK_EXECUTOR.execute(() -> {
+//				try {
+//					if (StrUtil.isNotEmpty(user.getOpenId())) {
+//						log.info("用户{}兑换车位成功,发送新订单模板消息", user.getId());
+//						templateCommonService.newOderSendMsgByType(orderDon, goodsDon, user, user.getOpenId(), false);
+//					}
+//				} catch (Exception e) {
+//					log.info("用户{}兑换车位成功,发送消息失败:{}", user.getId(), e);
+//				}
+//			});
+//		}
+//
+//		THREAD_POOL_TASK_EXECUTOR.execute(() -> {
+//			try {
+//				//发送至客服消息
+//				List<CustomerService> customerServices = customerServiceMapper.selectList(null);
+//				for (CustomerService customerService : customerServices) {
+//					log.info("向客服{}发送用户兑换码兑换车票消息通知..", customerService.getNickName());
+//					templateCommonService.newOderSendMsgByType(orderDon, goodsDon, user, customerService.getOpenId(), true);
+//				}
+//			} catch (Exception e) {
+//				log.error("向客服发送用户{}兑换码兑换车票成功,发送消息失败:{}", user.getId(), e);
+//			}
+//		});
 		relation.setOrderId(orderDon.getId());
 		return relation;
 	}
@@ -371,7 +372,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("get_ticket_error"));
 			}
 			//失败重新给他分配车位
 			getFinalRelation(sku, userId, relation, ++retryNum, errorsRelationIds);

+ 4 - 0
netflix-service/src/main/java/com/cyksj/service/mail/MailService.java

@@ -1,5 +1,7 @@
 package com.cyksj.service.mail;
 
+import com.cyksj.model.request.EmailFeedBackReq;
+
 /*
  *项目名: netflix
  *文件名: MailService
@@ -16,4 +18,6 @@ public interface MailService {
 	Boolean sendLoginCodeEmailToPeople(String code, String toAddress);
 
 	void sendEmailMsgToPeople(String people, String subject, String msg);
+
+	void sendEmailFeedBack(EmailFeedBackReq emailFeedBackReq) throws Exception;
 }

+ 60 - 0
netflix-service/src/main/java/com/cyksj/service/mail/impl/MailServiceImpl.java

@@ -1,6 +1,13 @@
 package com.cyksj.service.mail.impl;
 
+import cn.hutool.core.lang.Validator;
+import cn.hutool.core.util.StrUtil;
+import com.cyksj.common.constant.EmailConstant;
+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.model.request.EmailFeedBackReq;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.mail.MailService;
 import lombok.RequiredArgsConstructor;
@@ -11,6 +18,14 @@ import org.springframework.mail.SimpleMailMessage;
 import org.springframework.mail.javamail.JavaMailSender;
 import org.springframework.stereotype.Service;
 
+import javax.mail.Session;
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeBodyPart;
+import javax.mail.internet.MimeMessage;
+import javax.mail.internet.MimeMultipart;
+import java.util.List;
+import java.util.Properties;
+
 /*
  *项目名: netflix
  *文件名: MailServiceImpl
@@ -24,6 +39,10 @@ public class MailServiceImpl implements MailService {
 	@Value("${spring.mail.username}")
 	private String from;
 
+	//反馈问题发送客服邮箱
+	@Value("${feedback.mail}")
+	private String feedBackEmail;
+
 	private final JavaMailSender mailSender;
 
 	private final RedisService redisService;
@@ -60,6 +79,47 @@ public class MailServiceImpl implements MailService {
 		}
 	}
 
+	@Override
+	public void sendEmailFeedBack(EmailFeedBackReq emailFeedBackReq) throws Exception {
+		String email = emailFeedBackReq.getEmail();
+		if (!Validator.isEmail(email)) {
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("email_format_error"));
+		}
+		String subject = "海外用户问题反馈";
+		String nickname = emailFeedBackReq.getNickname();
+		String content = emailFeedBackReq.getContent();
+		StringBuilder sb = new StringBuilder();
+		String imgs = emailFeedBackReq.getImgs();
+		sb.append(String.format(EmailConstant.email_feed_back_template, nickname, email, content));
+		if (StrUtil.isNotBlank(imgs)) {
+			List<String> imgList = Jsons.parseList(imgs, String.class);
+			sb.append("反馈截图:");
+			if (imgList.size() == 1) {
+				String s = String.format(EmailConstant.EMAIL_FEED_BACK_IMG_TEMPLATE, imgList.get(0));
+				sb.append(s);
+			} else {
+				imgList.forEach(image -> {
+					String s = String.format(EmailConstant.EMAIL_FEED_BACK_IMG_TEMPLATE, image);
+					sb.append(s);
+					sb.append("<br/>");
+				});
+			}
+		}
+		content = sb.toString();
+		MimeMultipart mm = new MimeMultipart();
+		MimeBodyPart text = new MimeBodyPart();
+		// 文本+图片
+		text.setContent(content, "text/html;charset=UTF-8");
+		mm.addBodyPart(text);
+		MimeMessage msg = new MimeMessage(Session.getInstance(new Properties()));
+		//发件人
+		msg.setFrom(new InternetAddress(from));
+		//客服邮箱
+		msg.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(feedBackEmail));
+		msg.setSubject(subject, "UTF-8");
+		msg.setContent(mm);
+		mailSender.send(msg);
+	}
 
 	public boolean sendMail(String toAddress, String subject, String text) {
 		SimpleMailMessage msg = new SimpleMailMessage();

+ 5 - 4
netflix-service/src/main/java/com/cyksj/service/mange/coupon/impl/CouponCommonServiceImpl.java

@@ -3,6 +3,7 @@ package com.cyksj.service.mange.coupon.impl;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.i18n.I18nMessageUtil;
 import com.cyksj.common.util.Jsons;
 import com.cyksj.mapper.GoodsDonMapper;
 import com.cyksj.mapper.GoodsDonSkuMapper;
@@ -66,7 +67,7 @@ public class CouponCommonServiceImpl implements CouponCommonService {
 		}
 		Coupon entity = couponMapper.selectById(coupon.getId());
 		if (entity == null || !entity.getDeleted()) {
-			throw BusinessRuntimeException.getInstance("该优惠券不存在");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_not_exist"));
 		}
 		checkCouponParamsAndSaveOrUpdate(coupon);
 	}
@@ -75,7 +76,7 @@ public class CouponCommonServiceImpl implements CouponCommonService {
 	public void sendCoupon(CouponActiveReq couponActiveReq) {
 		Coupon coupon = couponMapper.selectById(couponActiveReq.getCouponId());
 		if (coupon == null || !coupon.getDeleted()) {
-			throw BusinessRuntimeException.getInstance("该优惠券不存在");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_not_exist"));
 		}
 		if (!coupon.getSendStatus()) {
 			coupon.setSendStatus(!coupon.getSendStatus());
@@ -93,7 +94,7 @@ public class CouponCommonServiceImpl implements CouponCommonService {
 	public void setHotCoupon(Long couponId) {
 		Coupon coupon = couponMapper.selectById(couponId);
 		if (coupon == null || !coupon.getDeleted()) {
-			throw BusinessRuntimeException.getInstance("该优惠券不存在");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_not_exist"));
 		}
 		if (coupon.getHotStatus()) {
 			throw BusinessRuntimeException.getInstance("已推荐该优惠券");
@@ -111,7 +112,7 @@ public class CouponCommonServiceImpl implements CouponCommonService {
 	public void setPopularizeRelation(CouponDistributeReq couponDistributeReq) {
 		Coupon coupon = couponMapper.selectById(couponDistributeReq.getCouponId());
 		if (coupon == null || !coupon.getDeleted()) {
-			throw BusinessRuntimeException.getInstance("该优惠券不存在");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_not_exist"));
 		}
 		CouponDistributePopularize exists = couponDistributePopularizeMapper.selectOne(Wrappers.lambdaQuery(CouponDistributePopularize.class).eq(CouponDistributePopularize::getCouponId, coupon.getId()).eq(CouponDistributePopularize::getDistributeId, couponDistributeReq.getDistributeId()).eq(CouponDistributePopularize::getDeleted, true).last("limit 1"));
 		if (exists != null) {

+ 2 - 2
netflix-service/src/main/java/com/cyksj/service/mange/group/CmsGroupServiceImpl.java

@@ -163,7 +163,7 @@ public class CmsGroupServiceImpl extends ServiceImpl<GroupsMapper,GroupsTrips> i
         if (trips != null && StrUtil.isNotBlank(trips.getTitle())) {
             title = trips.getTitle();
         }
-        String msg = String.format(Constant.CHANGE_GROUPS_TRIPS_ACCOUNT, title);
+        String msg = String.format(Constant.CHANGE_GROUPS_TRIPS_ACCOUNT, title, envCommonService.getDomain());
         //配置midJourney安全码
         String verifyCodes = groupsTrips.getVerifyCodes();
         List<String> verifyCodeList = null;
@@ -331,7 +331,7 @@ public class CmsGroupServiceImpl extends ServiceImpl<GroupsMapper,GroupsTrips> i
                 return;
             }
             if (relation.getUserId() != 0 && isPrd) {
-                String msg = String.format(Constant.CHANGE_GROUPS_TRIPS_ACCOUNT, title);
+                String msg = String.format(Constant.CHANGE_GROUPS_TRIPS_ACCOUNT, title, envCommonService.getDomain());
                 try {
                     smsService.sendSmsToRelationUser(relation.getUserId(), msg);
                 } catch (Exception e) {

+ 23 - 22
netflix-service/src/main/java/com/cyksj/service/market/impl/MarketFrontServiceImpl.java

@@ -10,6 +10,7 @@ import com.cyksj.common.constant.Constant;
 import com.cyksj.common.constant.PointsRecordConst;
 import com.cyksj.common.constant.TaskTypeEnum;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.i18n.I18nMessageUtil;
 import com.cyksj.common.snowflake.Sequence;
 import com.cyksj.common.util.Jsons;
 import com.cyksj.mapper.*;
@@ -172,11 +173,11 @@ public class MarketFrontServiceImpl implements MarketFrontService {
 				.orderBy(LuckyDrawView::getProbability).asc()
 				.build());
 		if (drawViews.isEmpty()) {
-			throw BusinessRuntimeException.getInstance("暂未配置奖品");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("task_lucky_draw_prize_not_configured"));
 		}
 		Integer index = randomProbabilityIndex(drawViews);
 		if (index == -1) {
-			throw BusinessRuntimeException.getInstance("系统异常,请刷新页面重新操作");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
 		}
 		LuckyDrawView luckyDraw = drawViews.get(index);
 		if (luckyDraw.getType() != LuckyDraw.Type.points && luckyDraw.getType() != LuckyDraw.Type.duration) {
@@ -241,10 +242,10 @@ public class MarketFrontServiceImpl implements MarketFrontService {
 				.eq(LuckyDrawRecord::getId, luckyDrawReq.getRecordId())
 				.eq(LuckyDrawRecord::getUserId, userId).last("limit 1"));
 		if (record == null) {
-			throw BusinessRuntimeException.getInstance("该中奖奖品不存在");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("task_luck_draw_prize_not_exist"));
 		}
 		if (record.getStatus() == LuckyDrawRecord.Status.success) {
-			throw BusinessRuntimeException.getInstance("您已领取该中奖奖品");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("task_luck_draw_prize_has_received"));
 		}
 		Long orderId = null;
 		if (record.getType() == LuckyDraw.Type.realGoods) {
@@ -257,7 +258,7 @@ public class MarketFrontServiceImpl implements MarketFrontService {
 		}
 		Integer update = luckyDrawRecordMapper.updateStatus(record.getId(), orderId, LuckyDrawRecord.Status.success);
 		if (update != 1) {
-			throw BusinessRuntimeException.getInstance("系统异常,请刷新页面重新操作");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
 		}
 	}
 
@@ -271,19 +272,19 @@ public class MarketFrontServiceImpl implements MarketFrontService {
 	public void receivedTaskPoints(Long userId, Long taskId) {
 		String key = RedisService.key.TASK_RECEIVED_KEY.getNameFormat(userId, taskId);
 		if (!redisService.setNx(key, taskId, RedisService.key.TASK_RECEIVED_KEY.getTimeout())) {
-			throw BusinessRuntimeException.getInstance("请勿重复点击按钮,正在领取中...");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("click_button_repeatedly"));
 		}
 		TaskFrontView data = beanSearcher.searchFirst(TaskFrontView.class, MapUtils.builder()
 				.field(TaskFrontView::getId, taskId).build());
 		if (data == null) {
-			throw BusinessRuntimeException.getInstance("该任务不存在");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("task_not_exist"));
 		}
 		this.checkTaskStatus(data, userId);
 		if (data.getStatus() == TaskUserCompleteRecord.Status.waiting) {
-			throw BusinessRuntimeException.getInstance("您未完成该任务");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("task_not_finish"));
 		}
 		if (data.getStatus() == TaskUserCompleteRecord.Status.received) {
-			throw BusinessRuntimeException.getInstance("您已领取该任务奖励");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("task_prize_has_received"));
 		}
 		if (data.getCouponId() != null && data.getCouponId() != 0) {
 			couponCommonService.sendCouponToUser(userId, data.getCouponId(), null, null, null, CouponUser.Channel.task);
@@ -332,10 +333,10 @@ public class MarketFrontServiceImpl implements MarketFrontService {
 		}
 		TaskFollowPlatVerify dbTaskFollowPlatVerify = taskFollowPlatVerifyMapper.selectById(taskFollowReq.getId());
 		if (dbTaskFollowPlatVerify == null) {
-			throw BusinessRuntimeException.getInstance("该提交记录不存在");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("task_follow_record__not_exist_error"));
 		}
 		if (dbTaskFollowPlatVerify.getStatus() == TaskFollowPlatVerify.Status.success) {
-			throw BusinessRuntimeException.getInstance("您提交的记录已审核成功");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("task_follow_record_verify_success"));
 		}
 		dbTaskFollowPlatVerify.setPlatNickname(taskFollowReq.getPlatNickname());
 		dbTaskFollowPlatVerify.setStatus(TaskFollowPlatVerify.Status.verifying);
@@ -451,7 +452,7 @@ public class MarketFrontServiceImpl implements MarketFrontService {
 			if (couponUser != null) {
 				Integer index = randomProbabilityIndex(list);
 				if (index == -1) {
-					throw BusinessRuntimeException.getInstance("系统异常,请刷新页面重新操作");
+					throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
 				}
 				LuckyDrawView next = list.get(index);
 				num++;
@@ -474,7 +475,7 @@ public class MarketFrontServiceImpl implements MarketFrontService {
 				}
 				Integer index = randomProbabilityIndex(list);
 				if (index == -1) {
-					throw BusinessRuntimeException.getInstance("系统异常,请刷新页面重新操作");
+					throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
 				}
 				LuckyDrawView next = list.get(index);
 				num++;
@@ -580,12 +581,12 @@ public class MarketFrontServiceImpl implements MarketFrontService {
 		User user = userMapper.selectById(userId);
 		BigDecimal subPoints = BigDecimal.valueOf(Long.parseLong(lottery_points_limit.getSysValue()));
 		if (user.getActivePoints().compareTo(subPoints) < 0) {
-			throw BusinessRuntimeException.getInstance("积分不足");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("task_luck_draw_lottery_points_error"));
 		}
 		//扣减积分
 		Integer sub = userMapper.subActivePoints(userId, subPoints);
 		if (sub != 1) {
-			throw BusinessRuntimeException.getInstance("积分不足");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("task_luck_draw_lottery_points_error"));
 		}
 		pointsRecord(userId, -subPoints.intValue(), PointsRecordConst.POINTS_LOTTERY, true);
 	}
@@ -593,7 +594,7 @@ public class MarketFrontServiceImpl implements MarketFrontService {
 	public List<Long> luckyDrawSpecificCheck(Long userId) throws Exception {
 		SysConfig lottery_specific_goods = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class).eq(SysConfig::getSysKey, Constant.LOTTERY_SPECIFIC_GOODS).last("limit 1"));
 		if (lottery_specific_goods == null) {
-			throw BusinessRuntimeException.getInstance("暂未配置特定奖池平台,请联系客服");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("task_lucky_draw_specific_not_configured"));
 		}
 		String sysValue = lottery_specific_goods.getSysValue();
 		if (StrUtil.isEmpty(sysValue)) {
@@ -602,11 +603,11 @@ public class MarketFrontServiceImpl implements MarketFrontService {
 		List<Long> goodsIdList = Jsons.parseList(sysValue, Long.class);
 		Integer num = getSpecificChanceNum(userId);
 		if (num <= 0) {
-			throw BusinessRuntimeException.getInstance("您的抽奖次数为0");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("task_lucky_draw_lottery_num_error"));
 		}
 		Integer update = luckyDrawSpecificChanceMapper.subChanceNum(userId, num);
 		if (update != 1) {
-			throw BusinessRuntimeException.getInstance("操作频繁,请稍后再试");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
 		}
 		return goodsIdList;
 	}
@@ -651,7 +652,7 @@ public class MarketFrontServiceImpl implements MarketFrontService {
 
 	public Long receiveRealGoodsReward(Long userId, LuckyDrawRecord record, Long addressId) {
 		if (addressId == null) {
-			throw new BusinessRuntimeException("请添加收货地址.");
+			throw new BusinessRuntimeException(I18nMessageUtil.getI18nMsg("address_choose_error"));
 		}
 		User user = userMapper.selectById(userId);
 		/* 生成订单 */
@@ -673,7 +674,7 @@ public class MarketFrontServiceImpl implements MarketFrontService {
 
 		Address address = addressMapper.selectById(addressId);
 		if (address == null) {
-			throw new BusinessRuntimeException("请添加收货地址.");
+			throw new BusinessRuntimeException(I18nMessageUtil.getI18nMsg("address_choose_error"));
 		}
 		OrderDonTransport transport = new OrderDonTransport();
 		transport.setOrderId(orderDon.getId());
@@ -696,10 +697,10 @@ public class MarketFrontServiceImpl implements MarketFrontService {
 				.eq(GroupsRelation::getStatus, GroupsRelation.Status.validity)
 				.last("limit 1"));
 		if (relation == null) {
-			throw BusinessRuntimeException.getInstance("该车票不存在");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
 		}
 		if (relation.getExpiryTime() == null) {
-			throw BusinessRuntimeException.getInstance("该车位未发车,请在发车后延长车票时长");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("account_not_set"));
 		}
 		Date expiryTime = relation.getExpiryTime();
 		relation.setExpiryTime(DateUtil.offsetDay(expiryTime, days));

+ 31 - 30
netflix-service/src/main/java/com/cyksj/service/market/task/impl/BindTaskServiceImpl.java

@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.EnvCommonService;
 import com.cyksj.common.constant.TaskTypeEnum;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.i18n.I18nMessageUtil;
 import com.cyksj.common.snowflake.Sequence;
 import com.cyksj.common.util.Codec;
 import com.cyksj.common.util.Jsons;
@@ -69,10 +70,10 @@ public class BindTaskServiceImpl implements BindTaskService {
 	public UserBindDetail bindPhone(User user, String phone, String code) {
 		Long userId = user.getId();
 		if (!Validator.isMobile(phone)) {
-			throw BusinessRuntimeException.getInstance("请输入正确的手机号");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("phone_format_error"));
 		}
 		if (StrUtil.isNotBlank(user.getLoginPhone())) {
-			throw BusinessRuntimeException.getInstance("您通过手机号登录,无法绑定其他手机号");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("bind_account_other_phone_error"));
 		}
 		LambdaQueryWrapper<UserBindDetail> wrapper = Wrappers.lambdaQuery(UserBindDetail.class)
 				.eq(StrUtil.isNotBlank(user.getEmail()), UserBindDetail::getEmail, user.getEmail())
@@ -81,7 +82,7 @@ public class BindTaskServiceImpl implements BindTaskService {
 
 		UserBindDetail bindPhone = userBindDetailMapper.selectOne(wrapper);
 		if (bindPhone != null && StrUtil.isNotBlank(bindPhone.getPhone())) {
-			throw BusinessRuntimeException.getInstance("您已绑定手机号");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("bind_account_phone_exits"));
 		}
 
 		UserBindDetail other = userBindDetailMapper.selectOne(Wrappers.lambdaQuery(UserBindDetail.class)
@@ -90,7 +91,7 @@ public class BindTaskServiceImpl implements BindTaskService {
 				.isNotNull(StrUtil.isNotEmpty(user.getOpenId()), UserBindDetail::getUserId)
 				.last("limit 1"));
 		if (other != null) {
-			throw BusinessRuntimeException.getInstance("该手机号已被绑定");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("bind_account_phone_other_bind_error"));
 		}
 		if (bindPhone == null) {
 			bindPhone = Optional.ofNullable(userBindDetailMapper.selectOne(Wrappers.lambdaQuery(UserBindDetail.class)
@@ -139,7 +140,7 @@ public class BindTaskServiceImpl implements BindTaskService {
 		Long userId = user.getId();
 		LambdaQueryWrapper<UserBindDetail> wrapper = Wrappers.lambdaQuery(UserBindDetail.class).last("limit 1");
 		if (StrUtil.isNotBlank(user.getLoginPhone())) {
-			throw BusinessRuntimeException.getInstance("无法更换自身登录手机号");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("bind_account_phone_change_self_error"));
 		}
 		if (StrUtil.isNotBlank(user.getOpenId())) {
 			wrapper.eq(UserBindDetail::getUserId, userId);
@@ -149,20 +150,20 @@ public class BindTaskServiceImpl implements BindTaskService {
 		}
 		UserBindDetail bindPhone = userBindDetailMapper.selectOne(wrapper);
 		if (bindPhone == null || StrUtil.isEmpty(bindPhone.getPhone())) {
-			throw BusinessRuntimeException.getInstance("您未绑定手机号");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("bind_account_phone_not_exist"));
 		}
 		if (bindPhone.getPhone().equals(phone)) {
-			throw BusinessRuntimeException.getInstance("换绑手机号重复");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("bind_account_phone_repeat"));
 		}
 		UserBindDetail other = userBindDetailMapper.selectOne(Wrappers.lambdaQuery(UserBindDetail.class)
 				.eq(UserBindDetail::getPhone, phone).select(UserBindDetail::getId).last("limit 1"));
 		if (other != null) {
-			throw BusinessRuntimeException.getInstance("该手机号已被绑定");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("bind_account_phone_other_bind_error"));
 		}
 		User phoneUser = userMapper.selectOne(Wrappers.lambdaQuery(User.class)
 				.eq(User::getLoginPhone, phone).last("limit 1"));
 		if (phoneUser == null) {
-			throw BusinessRuntimeException.getInstance("换绑手机号重复未注册");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("bind_account_phone_not_register"));
 		}
 		checkPhoneCode(phone, code);
 		bindPhone.setPhoneUserId(phoneUser.getId());
@@ -179,7 +180,7 @@ public class BindTaskServiceImpl implements BindTaskService {
 		Long userId = user.getId();
 		LambdaQueryWrapper<UserBindDetail> wrapper = Wrappers.lambdaQuery(UserBindDetail.class).last("limit 1");
 		if (StrUtil.isNotBlank(user.getEmail())) {
-			throw BusinessRuntimeException.getInstance("无法更换自身登录邮箱");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("bind_account_email_change_self_error"));
 		}
 		if (StrUtil.isNotBlank(user.getOpenId())) {
 			wrapper.eq(UserBindDetail::getUserId, userId);
@@ -189,21 +190,21 @@ public class BindTaskServiceImpl implements BindTaskService {
 		}
 		UserBindDetail bindDetail = userBindDetailMapper.selectOne(wrapper);
 		if (bindDetail == null || StrUtil.isEmpty(bindDetail.getEmail())) {
-			throw BusinessRuntimeException.getInstance("您未绑定邮箱");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("bind_account_email_not_exist"));
 		}
 		if (bindDetail.getEmail().equals(email)) {
-			throw BusinessRuntimeException.getInstance("换绑邮箱重复");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("bind_account_email_repeat"));
 		}
 		UserBindDetail other = userBindDetailMapper.selectOne(Wrappers.lambdaQuery(UserBindDetail.class)
 				.eq(UserBindDetail::getEmail, email).select(UserBindDetail::getId).last("limit 1"));
 		if (other != null) {
-			throw BusinessRuntimeException.getInstance("该邮箱已被绑定");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("bind_account_email_other_bind_error"));
 		}
 		checkEmailCode(email, inputCode);
 		User emailUser = userMapper.selectOne(Wrappers.lambdaQuery(User.class)
 				.eq(User::getEmail, email).last("limit 1"));
 		if (emailUser == null) {
-			throw BusinessRuntimeException.getInstance("绑定的邮箱未注册");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("bind_account_email_not_register"));
 		}
 		bindDetail.setEmailUserId(emailUser.getId());
 		bindDetail.setEmail(email);
@@ -218,10 +219,10 @@ public class BindTaskServiceImpl implements BindTaskService {
 	public UserBindDetail bindEmail(User user, String account, String inputCode) {
 		Long userId = user.getId();
 		if (!Validator.isEmail(account)) {
-			throw BusinessRuntimeException.getInstance("请输入正确的邮箱");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("email_format_error"));
 		}
 		if (StrUtil.isNotBlank(user.getEmail())) {
-			throw BusinessRuntimeException.getInstance("您通过邮箱登录,无法绑定其他邮箱");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("bind_account_other_email_error"));
 		}
 		LambdaQueryWrapper<UserBindDetail> wrapper = Wrappers.lambdaQuery(UserBindDetail.class)
 				.eq(StrUtil.isNotBlank(user.getLoginPhone()), UserBindDetail::getPhone, user.getLoginPhone())
@@ -229,7 +230,7 @@ public class BindTaskServiceImpl implements BindTaskService {
 				.last("limit 1");
 		UserBindDetail bindPhone = userBindDetailMapper.selectOne(wrapper);
 		if (bindPhone != null && StrUtil.isNotBlank(bindPhone.getEmail())) {
-			throw BusinessRuntimeException.getInstance("您已绑定邮箱");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("bind_account_email_exist"));
 		}
 
 		UserBindDetail other = userBindDetailMapper.selectOne(Wrappers.lambdaQuery(UserBindDetail.class)
@@ -239,7 +240,7 @@ public class BindTaskServiceImpl implements BindTaskService {
 				.select(UserBindDetail::getId)
 				.last("limit 1"));
 		if (other != null) {
-			throw BusinessRuntimeException.getInstance("该邮箱已被绑定");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("bind_account_email_other_bind_error"));
 		}
 		if (bindPhone == null) {
 			bindPhone = Optional.ofNullable(userBindDetailMapper.selectOne(Wrappers.lambdaQuery(UserBindDetail.class)
@@ -284,22 +285,22 @@ public class BindTaskServiceImpl implements BindTaskService {
 		Long userId = request.getUserId();
 		User user = userMapper.selectById(userId);
 		Integer type = request.getType();
-		if (type == null) throw BusinessRuntimeException.getInstance("绑定类型为空");
+		if (type == null) throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
 
 		if (user == null) throw BusinessRuntimeException.getGatewayApiCode(GatewayApiCode.CMS_TOKEN_VALID);
 		String account = request.getAccount();
 		String code = request.getCode();
 		if (type != 3 && (StrUtil.isEmpty(account) || StrUtil.isEmpty(code))) {
-			throw BusinessRuntimeException.getInstance("请输入正确的绑定信息");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("params_error"));
 		}
 		if (type == 1) {
 			if (StrUtil.isNotBlank(user.getLoginPhone())) {
-				throw BusinessRuntimeException.getInstance("您通过手机号登录,无法绑定其他手机号");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("bind_account_other_phone_error"));
 			}
 			User phoneUser = userMapper.selectOne(Wrappers.lambdaQuery(User.class)
 					.eq(User::getLoginPhone, account).last("limit 1"));
 			if (phoneUser == null) {
-				throw BusinessRuntimeException.getInstance("绑定的手机号未注册");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("bind_account_phone_not_register"));
 			}
 			user.setPhoneUserId(phoneUser.getId());
 			bindPhone(user, account, code);
@@ -307,12 +308,12 @@ public class BindTaskServiceImpl implements BindTaskService {
 		}
 		if (type == 2) {
 			if (StrUtil.isNotBlank(user.getEmail())) {
-				throw BusinessRuntimeException.getInstance("您通过邮箱登录,无法绑定其他邮箱");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("bind_account_other_phone_error"));
 			}
 			User emailUser = userMapper.selectOne(Wrappers.lambdaQuery(User.class)
 					.eq(User::getEmail, account).last("limit 1"));
 			if (emailUser == null) {
-				throw BusinessRuntimeException.getInstance("绑定的邮箱未注册");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("bind_account_phone_not_register"));
 			}
 			user.setEmailUserId(emailUser.getId());
 			bindEmail(user, account, code);
@@ -320,7 +321,7 @@ public class BindTaskServiceImpl implements BindTaskService {
 		}
 		if (type == 3) {
 			if (StrUtil.isNotBlank(user.getOpenId())) {
-				throw BusinessRuntimeException.getInstance("您通过微信登录,无法绑定其他微信");
+				throw BusinessRuntimeException.getInstance("");
 			}
 			//网页授权二维码
 			Long mappingId = SEQUENCE.nextId();
@@ -367,16 +368,16 @@ public class BindTaskServiceImpl implements BindTaskService {
 		DateTime now = DateTime.now();
 		PhoneCode phoneCode = phoneCodeMapper.selectOne(Wrappers.lambdaQuery(PhoneCode.class).eq(PhoneCode::getPhone, phone).last("limit 1"));
 		if (phoneCode == null || StrUtil.isEmpty(phoneCode.getCode())) {
-			throw BusinessRuntimeException.getInstance("请重新获取手机验证码");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("phone_code_valid_error"));
 		}
 		//3分钟失效
 		Date updateTime = phoneCode.getUpdateTime();
 		DateTime afterFiveMinutes = DateUtil.offsetMinute(updateTime, 3);
 		if (now.isAfter(afterFiveMinutes)) {
-			throw BusinessRuntimeException.getInstance("手机验证码已失效,请重新获取");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("phone_code_valid_error"));
 		}
 		if (!StrUtil.equals(inputCode, phoneCode.getCode())) {
-			throw BusinessRuntimeException.getInstance("手机验证码错误,请重新输入");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("verify_code_error"));
 		}
 	}
 
@@ -384,10 +385,10 @@ public class BindTaskServiceImpl implements BindTaskService {
 	public void checkEmailCode(String email, String inputCode) {
 		String code = redisService.getStr(RedisService.key.EMAIL_CODE_KEY.getNameFormat(email));
 		if (StrUtil.isEmpty(code)) {
-			throw BusinessRuntimeException.getInstance("邮箱验证码已失效,请重新获取");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("email_code_valid_error"));
 		}
 		if (!StrUtil.equals(inputCode, code)) {
-			throw BusinessRuntimeException.getInstance("邮箱验证码错误,请重新输入");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("verify_code_error"));
 		}
 	}
 }

+ 28 - 26
netflix-service/src/main/java/com/cyksj/service/market/task/impl/TaskServiceImpl.java

@@ -80,33 +80,35 @@ public class TaskServiceImpl implements TaskService {
 
 	@Override
 	public void completeTask(TaskType type, Long userId) {
-		DateTime now = DateTime.now();
-		DateTime beginOfDay = DateUtil.beginOfDay(now);
-		DateTime endOfDay = DateUtil.endOfDay(now);
-		DateTime beginOfWeek = DateUtil.beginOfWeek(now);
-		DateTime endOfWeek = DateUtil.endOfWeek(now);
-		LambdaQueryWrapper<TaskUserCompleteRecord> wrapper = Wrappers.lambdaQuery(TaskUserCompleteRecord.class)
-				.eq(TaskUserCompleteRecord::getUserId, userId)
-				.last("limit 1");
-		List<Task> tasks = taskMapper.selectList(Wrappers.lambdaQuery(Task.class)
-				.eq(Task::getTypeId, type.getId())
-				.eq(Task::getStatus, true)
-				.eq(Task::getDeleted, true));
-		tasks.forEach(task -> {
-			if ("time".equals(task.getTaskLimit())) {
-				TaskUserCompleteRecord record = taskUserCompleteRecordMapper.selectOne(Wrappers.lambdaQuery(TaskUserCompleteRecord.class)
-						.eq(TaskUserCompleteRecord::getTaskId, task.getId())
-						.eq(TaskUserCompleteRecord::getUserId, userId).last("limit 1"));
-				if (record == null) {
-					saveCompleteTask(task.getId(), userId, task.getPoints());
-				}
-			} else if ("day".equals(task.getTaskLimit())) {
-				handleSpecialTask(type, task, userId, wrapper, beginOfDay, endOfDay);
+		if (type != null) {
+			DateTime now = DateTime.now();
+			DateTime beginOfDay = DateUtil.beginOfDay(now);
+			DateTime endOfDay = DateUtil.endOfDay(now);
+			DateTime beginOfWeek = DateUtil.beginOfWeek(now);
+			DateTime endOfWeek = DateUtil.endOfWeek(now);
+			LambdaQueryWrapper<TaskUserCompleteRecord> wrapper = Wrappers.lambdaQuery(TaskUserCompleteRecord.class)
+					.eq(TaskUserCompleteRecord::getUserId, userId)
+					.last("limit 1");
+			List<Task> tasks = taskMapper.selectList(Wrappers.lambdaQuery(Task.class)
+					.eq(Task::getTypeId, type.getId())
+					.eq(Task::getStatus, true)
+					.eq(Task::getDeleted, true));
+			tasks.forEach(task -> {
+				if ("time".equals(task.getTaskLimit())) {
+					TaskUserCompleteRecord record = taskUserCompleteRecordMapper.selectOne(Wrappers.lambdaQuery(TaskUserCompleteRecord.class)
+							.eq(TaskUserCompleteRecord::getTaskId, task.getId())
+							.eq(TaskUserCompleteRecord::getUserId, userId).last("limit 1"));
+					if (record == null) {
+						saveCompleteTask(task.getId(), userId, task.getPoints());
+					}
+				} else if ("day".equals(task.getTaskLimit())) {
+					handleSpecialTask(type, task, userId, wrapper, beginOfDay, endOfDay);
 
-			} else if ("week".equals(task.getTaskLimit())) {
-				handleSpecialTask(type, task, userId, wrapper, beginOfWeek, endOfWeek);
-			}
-		});
+				} else if ("week".equals(task.getTaskLimit())) {
+					handleSpecialTask(type, task, userId, wrapper, beginOfWeek, endOfWeek);
+				}
+			});
+		}
 	}
 
 	@Override

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

@@ -16,7 +16,6 @@ import com.alipay.api.request.*;
 import com.alipay.api.response.AlipayFundTransCommonQueryResponse;
 import com.alipay.api.response.AlipayTradeFastpayRefundQueryResponse;
 import com.alipay.api.response.AlipayTradeQueryResponse;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.cyksj.common.EnvCommonService;
@@ -24,6 +23,7 @@ import com.cyksj.common.constant.Constant;
 import com.cyksj.common.constant.TaskTypeEnum;
 import com.cyksj.common.constant.TransferConstant;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.i18n.I18nMessageUtil;
 import com.cyksj.common.snowflake.Sequence;
 import com.cyksj.common.task.GlobalThreadPoolTaskExecutor;
 import com.cyksj.common.util.Codec;
@@ -220,7 +220,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		GoodsDonSku sku = goodsDonSkuMapper.selectById(payRequest.getSkuId());
 		GoodsDon goodsDon = goodsDonMapper.selectById(sku.getGoodsId());
 		if (goodsDon == null || !goodsDon.getStatus()) {
-			throw new BusinessRuntimeException("商品已下架");
+			throw new BusinessRuntimeException(I18nMessageUtil.getI18nMsg("goods_status_down"));
 		}
 		Boolean isNoLogin = payRequest.getIsNoLogin();
 		User user;
@@ -233,7 +233,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		} else {
 			user = userMapper.selectById(payRequest.getUserId());
 			if (user == null) throw BusinessRuntimeException.getGatewayApiCode(GatewayApiCode.CMS_TOKEN_VALID);
-			if (user.getIsBlack()) throw BusinessRuntimeException.getInstance("系统检测操作异常,请稍后再试");
+			if (user.getIsBlack()) throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("user_black_error"));
 			//ChatGPT Plus账号限购校验
 			checkChatGPTPlusPurchaseLimit(user.getId(), goodsDon.getId(), goodsDon.getTitle(), sku.getId(), sku.getSpecVal());
 			payOpenId = user.getOpenId();
@@ -255,7 +255,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		orderDon.setOrderNo(donNo);
 		orderDon.setOpenId(payOpenId);
 		if (sku.getPrice() == null || sku.getPrice().compareTo(BigDecimal.ZERO) <= 0) {
-			throw BusinessRuntimeException.getInstance("下单商品价格异常");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sku_price_error"));
 		}
 		if (payRequest.getDonMoney().compareTo(sku.getPrice()) < 0) {
 			log.info("规格:{}支付金额:{}异常,调整用户userId:{}支付金额为:{}", sku.getSpecVal(), payRequest.getDonMoney(), user.getId(), sku.getPrice());
@@ -268,14 +268,14 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		List<Long> dpSkuIds = payRequest.getDpSkuIds();
 		if (CollUtil.isNotEmpty(dpSkuIds)) {
 			if (dpSkuIds.size() > 1) {
-				throw BusinessRuntimeException.getInstance("暂只支持优惠加购一件商品");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("dp_one_goods_pay_error"));
 			}
 			//是否满足关联
 			List<GoodsDiscountPlusPurchaseRelation> ds_relations = discountPlusPurchaseRelationMapper.selectList(Wrappers.lambdaQuery(GoodsDiscountPlusPurchaseRelation.class)
 					.eq(GoodsDiscountPlusPurchaseRelation::getSkuId, sku.getId())
 					.in(GoodsDiscountPlusPurchaseRelation::getDisSid, dpSkuIds));
 			if (ds_relations.size() != dpSkuIds.size()) {
-				throw BusinessRuntimeException.getInstance("系统异常,请刷新页面重新下单");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
 			}
 			BigDecimal goods_discount_plus_pay = BigDecimal.ZERO;
 			List<Long> dsSkuIds = new ArrayList<>();
@@ -329,7 +329,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		if (relationId != 0) {
 			Long gtSkuId = groupsRelationMapper.getGroupTripsSkuIdByRelationId(relationId);
 			if (!gtSkuId.equals(orderDon.getSkuId())) {
-				throw BusinessRuntimeException.getInstance("车位与车队规格不一致");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
 			}
 		}
 		orderDon.setPayDesc(goodsDon.getPayDesc());
@@ -339,7 +339,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		if (orderDon.getIsDp()) {
 			List<GoodsDonSkuView> dp_skuViewList = beanSearcher.searchAll(GoodsDonSkuView.class, MapUtils.builder().field(GoodsDonSkuView::getSkuId, dpSkuIds).op(Operator.InList).build());
 			if (dp_skuViewList.size() != dpSkuIds.size()) {
-				throw BusinessRuntimeException.getInstance("系统异常,请刷新页面重新下单");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
 			}
 			dp_skuViewList.forEach(dp_SkuView -> {
 				payTitle.append(" + ");
@@ -629,9 +629,9 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 							updateById(orderDon);
 						});
 						if (groupsRelation.getUserId() != 0) {
-							User user = userMapper.selectById(orderDon.getUserId());
-							if (user != null) {
-								checkIsSameUser(groupsRelation.getUserId(), orderDon.getUserId(), user.getOpenId(), user.getLoginPhone());
+							List<Long> relationUserIdList = userBindRelationService.getRelationUserIdList(orderDon.getUserId(), null);
+							if (!relationUserIdList.contains(userId)) {
+								throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
 							}
 						}
 						//throw new BusinessRuntimeException("订单用户与车位用户不匹配!");
@@ -676,7 +676,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		Long userId = payRequest.getUserId();
 		User user = userMapper.selectById(userId);
 		if (user == null) throw BusinessRuntimeException.getGatewayApiCode(GatewayApiCode.CMS_TOKEN_VALID);
-		if (user.getIsBlack()) throw BusinessRuntimeException.getInstance("系统检测操作异常,请稍后再试");
+		if (user.getIsBlack()) throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("user_black_error"));
 		Long renewSkuId = payRequest.getSkuId();
 		CouponUser couponUser = null;
 		if (StrUtil.isNotBlank(payRequest.getCouponExCode()) || payRequest.getCouponId() != null) {
@@ -686,14 +686,14 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		}
 		Long relationId = payRequest.getRelationId();
 		if (relationId == null || relationId <= 0 || renewSkuId == null || payRequest.getNum() == null) {
-			throw new BusinessRuntimeException("缺少必填参数");
+			throw new BusinessRuntimeException(I18nMessageUtil.getI18nMsg("params_error"));
 		}
 		//是否有其他规格的续费订单 若有请先关闭
 		Integer count = orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class)
 				.eq(OrderDon::getRelationId, payRequest.getRelationId())
 				.eq(OrderDon::getStatus, OrderDon.Status.noPayment).eq(OrderDon::getOrderType, 2));
 		if (count > 0) {
-			throw BusinessRuntimeException.getInstance("您有该车票未支付的续费订单..");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("order_renew_ticket_noPayment_error"));
 		}
 
 		GoodsDonSku sku = goodsDonSkuMapper.selectById(renewSkuId);
@@ -705,36 +705,39 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 		//todo 多账号同一用户绑定 续费
 		if (!relation.getUserId().equals(user.getId())) {
-			checkIsSameUser(relation.getUserId(), userId, user.getOpenId(), user.getLoginPhone());
+			List<Long> relationUserIdList = userBindRelationService.getRelationUserIdList(relation.getUserId(), null);
+			if (!relationUserIdList.contains(userId)) {
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
+			}
 		}
 		GroupsTrips groupsTrips = groupsMapper.selectById(relation.getGroupsId());
 		if (groupsTrips == null) {
-			throw BusinessRuntimeException.getInstance("该车队不存在,请联系客服");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
 		}
 		GoodsDon goodsDon = goodsDonMapper.selectById(sku.getGoodsId());
 
 		if (goodsDon == null || !goodsDon.getStatus()) {
-			throw new BusinessRuntimeException("商品已下架");
+			throw new BusinessRuntimeException(I18nMessageUtil.getI18nMsg("goods_status_down"));
 		}
 
 		if (goodsDon.getType() == 2) {
-			throw new BusinessRuntimeException("实物不支持续费");
+			throw new BusinessRuntimeException(I18nMessageUtil.getI18nMsg("ticket_unsupported_renew_error"));
 		}
 
 		if (goodsDon.getSpecialType() != null && goodsDon.getSpecialType() == GoodsDon.SpecialType.recharge) {
-			throw new BusinessRuntimeException("代充账号不允许续费");
+			throw new BusinessRuntimeException(I18nMessageUtil.getI18nMsg("ticket_unsupported_renew_error"));
 		}
 		//用户车票规格
 		Long tripsSkuId = groupsTrips.getSkuId();
 		GoodsDonSkuView goodsDonSkuView = beanSearcher.searchFirst(GoodsDonSkuView.class, MapUtils.builder().field(GoodsDonSkuView::getGoodsId, goodsDon.getId())
 				.field(GoodsDonSkuView::getSkuId, tripsSkuId).build());
 		if (goodsDonSkuView == null) {
-			throw BusinessRuntimeException.getInstance("该续费规格不属于该车队");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
 		}
 
 		if (GroupsTrips.Status.waiting.equals(groupsTrips.getStatus())) {
 			if (!noChekGoodsTemp.contains(goodsDon.getTitle())) {
-				throw new BusinessRuntimeException("亲,该车次还未发车,需等待客服发车才能续费哦.");
+				throw new BusinessRuntimeException(I18nMessageUtil.getI18nMsg("account_not_set_unsupport_renew_error"));
 			}
 		}
 		//netflix 续费逻辑 月付可续费所有规格 其他规格只能续费对应规格
@@ -743,13 +746,13 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		if (goodsDon.getType() == 1 && goodsDon.getId() == 1) {
 			if (tripsSkuId != 4 && tripsSkuId != renewSkuId) {
 				if (tripsSkuId == 5) {
-					throw BusinessRuntimeException.getInstance("季付车票只能续费季付");
+					throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("ticket_netflix_season_renew_error"));
 				} else if (tripsSkuId == 6) {
-					throw BusinessRuntimeException.getInstance("年付车票只能续费年付");
+					throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("ticket_netflix_year_renew_error"));
 				} else {
 					//天数可续费其他规格
 					if (goodsDonSkuView.getDays() == null || goodsDonSkuView.getDays() <= 0) {
-						throw BusinessRuntimeException.getInstance("请选择对应规格的车票续费");
+						throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("ticket_same_renew_error"));
 					}
 				}
 			} else if (tripsSkuId == 4 && tripsSkuId != renewSkuId) {
@@ -938,19 +941,19 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		if (isLoginPopularize == null || !isLoginPopularize) {
 			int noPayCount = count(Wrappers.lambdaQuery(OrderDon.class).eq(OrderDon::getUserId, userId).eq(OrderDon::getGoodsId, goodsId).eq(OrderDon::getStatus, OrderDon.Status.noPayment.toString()));
 			if (noPayCount > 0) {
-				throw new BusinessRuntimeException("您有未支付订单.");
+				throw new BusinessRuntimeException(I18nMessageUtil.getI18nMsg("order_noPayment_error"));
 			}
 		}
 		if (!redisService.setNx(RedisKey.GROUPS_RELATION_NUM_KEY + relationId, userId, 60 * 5L)) {
 			log.info("=====>用户:{}未抢到座位:{}", userId, relationId);
-			throw new BusinessRuntimeException("客官手慢啦,该座位已经有人啦!");
+			throw new BusinessRuntimeException(I18nMessageUtil.getI18nMsg("sys_busy_error"));
 		}
 		int count = groupsMapper.decrAvailableNum(groupsId);
 		if (count == 0) {
 			log.error("车位异常 groupId:{}", groupsId);
 			groupsMapper.updateAvailableNum(groupsId);
 			redisService.del(RedisKey.GROUPS_RELATION_NUM_KEY + relationId);
-			throw new BusinessRuntimeException("车位异常");
+			throw new BusinessRuntimeException(I18nMessageUtil.getI18nMsg("sys_busy_error"));
 		}
 	}
 
@@ -961,7 +964,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		}
 		Address address = addressMapper.selectById(addressId);
 		if (address == null) {
-			throw new BusinessRuntimeException("请添加收货地址.");
+			throw new BusinessRuntimeException(I18nMessageUtil.getI18nMsg("address_choose_error"));
 		}
 		OrderDonTransport transport = new OrderDonTransport();
 		transport.setOrderId(orderId);
@@ -1091,9 +1094,9 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 	@Override
 	public void zeroOrderConfirm(Long orderId) {
 		OrderDon orderDon = this.getById(orderId);
-		if (orderDon == null) throw BusinessRuntimeException.getInstance("订单不存在");
+		if (orderDon == null) throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("order_nt"));
 		if (orderDon.getMoney().compareTo(BigDecimal.ZERO) > 0) {
-			throw BusinessRuntimeException.getInstance("订单异常");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("order_error"));
 		}
 		GoodsDon goodsDon = goodsDonMapper.selectById(orderDon.getGoodsId());
 		GoodsDonSku sku = goodsDonSkuMapper.selectById(orderDon.getSkuId());
@@ -1396,22 +1399,22 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		GoodsDonSku goodsDonSku = goodsDonSkuMapper.selectById(skuId);
 		GoodsDon goodsDon = goodsDonMapper.selectById(goodsDonSku.getGoodsId());
 		if (StrUtil.isNotBlank(couponExCode) && couponId != null) {
-			throw BusinessRuntimeException.getInstance("优惠券与优惠码不可同时使用..");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_coupon_code_error"));
 		}
 		if (StrUtil.isNotBlank(couponExCode)) {
 			CouponPopularizeDto exists = couponMapper.checkExCode(couponExCode);
 			if (exists == null) {
-				throw BusinessRuntimeException.getInstance("该优惠码不存在");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_code_not_exist"));
 			}
 			//推广码
 			if (exists.getIsGeneral() != null) {
 				if (exists.getIsGeneral() && userId.equals(exists.getUserId())) {
-					throw BusinessRuntimeException.getInstance("不可以使用自己的优惠码");
+					throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_code_own_use_error"));
 				}
 				if (!exists.getIsGeneral()) {
 					UserDistribute userDistribute = userDistributeMapper.selectById(exists.getDistributeId());
 					if (userDistribute != null && userDistribute.getUserId().equals(userId)) {
-						throw BusinessRuntimeException.getInstance("不可以使用自己的优惠码");
+						throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_code_own_use_error"));
 					}
 				}
 				//是否有上下级关系
@@ -1422,35 +1425,35 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 						//是否是 当天注册新用户 且下过单
 						User user = userMapper.selectById(userId);
 						if (user.getCreatedTime().before(DateUtil.beginOfDay(DateTime.now()))) {
-							throw BusinessRuntimeException.getInstance("该优惠码只适用于新用户");
+							throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_code_new_user_error"));
 						}
 						CouponNewUserView couponNewUserView = beanSearcher.searchFirst(CouponNewUserView.class, MapUtils.builder().field(CouponNewUserView::getUserId, userId).op(Operator.Equal).build());
-						if (couponNewUserView != null) throw BusinessRuntimeException.getInstance("该优惠码只适用于新用户");
+						if (couponNewUserView != null) throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_code_new_user_error"));
 					}
 					if (userDistributeShared != null && !userDistributeShared.getSharedId().equals(exists.getUserId())) {
-						throw BusinessRuntimeException.getInstance("您已有推广,无法使用其他人推广码");
+						throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_code_popularize_repeat_use_error"));
 					}
 				}
 			}
 			checkCouponGoods(goodsDon, skuId, exists.getCouponId(), true);
 			//检验是优惠券使用范围
 			if (isRenew && exists.getUseScope() == Coupon.UseScope.orders) {
-				throw BusinessRuntimeException.getInstance("该优惠码续费时不可使用");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_code_only_order_error"));
 			}
 			if (!isRenew && exists.getUseScope() == Coupon.UseScope.renew) {
-				throw BusinessRuntimeException.getInstance("该优惠码下单时不可使用");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_code_only_renew_order_error"));
 			}
 			if (exists.getScope() == Coupon.Scope.newUser) {
 				CouponNewUserView couponNewUserView = beanSearcher.searchFirst(CouponNewUserView.class, MapUtils.builder().field(CouponNewUserView::getUserId, userId).op(Operator.Equal).build());
 				if (couponNewUserView != null) {
-					throw BusinessRuntimeException.getInstance("该新用户优惠码有且仅可使用一次");
+					throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_code_new_user_error"));
 				}
 			}
 			if (exists.getIsValidTime() && exists.getValidEndTime().before(DateTime.now())) {
-				throw BusinessRuntimeException.getInstance("该优惠码已失效");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_code_expired_error"));
 			}
 			if (exists.getIsValidTime() && exists.getValidStartTime().after(DateTime.now())) {
-				throw BusinessRuntimeException.getInstance("该优惠码待生效");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_code_not_effective_error"));
 			}
 			return exists;
 		} else if (couponId != null) {
@@ -1459,10 +1462,10 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 					.field(CouponUserView::getUserId, userId).op(Operator.Equal)
 					.build());
 			if (couponUserView == null) {
-				throw BusinessRuntimeException.getInstance("该优惠券不存在");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_not_exist"));
 			}
 			if (couponUserView.getCouponUserStatus() == CouponUser.Status.used) {
-				throw BusinessRuntimeException.getInstance("该优惠券已使用");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_used_error"));
 			}
 			couponFontService.setCouponUserStatus(couponUserView, DateTime.now());
 			if (couponUserView.getCouponUserStatus() != CouponUser.Status.unused) {
@@ -1471,16 +1474,10 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			checkCouponGoods(goodsDon, skuId, couponUserView.getCouponId(), false);
 			//检验是优惠券使用范围
 			if (isRenew && couponUserView.getUseScope() == Coupon.UseScope.orders) {
-				throw BusinessRuntimeException.getInstance("该优惠券续费时不可使用");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_only_order_error"));
 			}
 			if (!isRenew && couponUserView.getUseScope() == Coupon.UseScope.renew) {
-				throw BusinessRuntimeException.getInstance("该优惠券下单时不可使用");
-			}
-			if (couponUserView.getScope() == Coupon.Scope.newUser) {
-				CouponNewUserView couponNewUserView = beanSearcher.searchFirst(CouponNewUserView.class, MapUtils.builder().field(CouponNewUserView::getUserId, userId).op(Operator.Equal).build());
-				if (couponNewUserView != null) {
-					throw BusinessRuntimeException.getInstance("该新用户优惠券有且仅可使用一次");
-				}
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_only_renew_error"));
 			}
 		}
 		return null;
@@ -1491,7 +1488,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		CouponUser couponUser = null;
 		if (StrUtil.isNotBlank(couponExCode)) {
 			if (exists == null) {
-				throw BusinessRuntimeException.getInstance("该优惠码不存在");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_code_not_exist"));
 			}
 			couponUser = new CouponUser();
 			couponUser.setCouponId(exists.getCouponId());
@@ -1503,7 +1500,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			if ((exists.getPopularizeId() != null && exists.getIsGeneral()) || exists.getPopularizeId() == null) {
 				CouponUser received = couponUserMapper.selectOne(Wrappers.lambdaQuery(CouponUser.class).eq(CouponUser::getUserId, userId).eq(CouponUser::getCouponId, couponUser.getCouponId()).last("limit 1"));
 				if (received != null && received.getStatus() != CouponUser.Status.unused) {
-					throw BusinessRuntimeException.getInstance("您已使用该优惠码所对应的优惠券");
+					throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_code_used_error"));
 				}
 				couponUser.setUserId(userId);
 				couponUser.setStatus(CouponUser.Status.used);
@@ -1513,13 +1510,13 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 					couponUserMapper.insert(couponUser);
 				} catch (DuplicateKeyException e) {
 					log.info("用户已领取该{}优惠券", couponUser.getCouponId());
-					throw BusinessRuntimeException.getInstance("您已领取该优惠码对应的优惠券,请使用优惠券");
+					throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_code_used_error"));
 				}
 			}
 		} else {
 			couponUser = couponUserMapper.selectOne(Wrappers.lambdaQuery(CouponUser.class).eq(CouponUser::getUserId, userId).eq(CouponUser::getCouponId, couponId).last("limit 1"));
 			if (couponUser == null) {
-				throw BusinessRuntimeException.getInstance("该优惠券不存在");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_not_exist"));
 			}
 			couponUser.setStatus(CouponUser.Status.used);
 			couponUserMapper.updateById(couponUser);
@@ -1534,7 +1531,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 					.eq(CouponSku::getCouponId, couponId)
 					.select(CouponSku::getId).last("limit 1"));
 			if (couponSku == null) {
-				throw BusinessRuntimeException.getInstance(String.format("该%s不适用于该规格", isCouponCode ? "优惠码" : "优惠券"));
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_sku_not_available_error"));
 			}
 		} else {
 			//实物、潮玩 优惠码优惠券 针对平台
@@ -1544,7 +1541,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 					.eq(CouponSku::getCouponId, couponId)
 					.select(CouponSku::getId).last("limit 1"));
 			if (couponSku == null) {
-				throw BusinessRuntimeException.getInstance(String.format("该%s不可用于该商品", isCouponCode ? "优惠码" : "优惠券"));
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_sku_not_available_error"));
 			}
 		}
 	}
@@ -1797,41 +1794,6 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		return noPayment;
 	}
 
-	public void checkIsSameUser(Long relationUserId, Long userId, String openId, String loginPhone) {
-		//手机用户与微信用户
-		LambdaQueryWrapper<UserBindDetail> wrapper = Wrappers.lambdaQuery(UserBindDetail.class);
-		Boolean isPcUser = false;
-		if (StrUtil.isNotBlank(openId)) {
-			wrapper.eq(UserBindDetail::getUserId, userId);
-		} else {
-			isPcUser = true;
-			wrapper.eq(UserBindDetail::getPhone, loginPhone);
-		}
-		UserBindDetail userBindDetail = userBindDetailMapper.selectOne(wrapper.last("limit 1"));
-		if (userBindDetail == null) {
-			throw new BusinessRuntimeException("");
-		}
-		if (userBindDetail != null) {
-			if (isPcUser) {
-				if (!relationUserId.equals(userBindDetail.getUserId())) {
-					throw new BusinessRuntimeException("");
-				}
-			} else {
-				if (StrUtil.isEmpty(userBindDetail.getPhone())) {
-					throw new BusinessRuntimeException("");
-				}
-				User otherUser = userMapper.selectOne(Wrappers.lambdaQuery(User.class)
-						.eq(User::getLoginPhone, userBindDetail.getPhone()).last("limit 1"));
-				if (otherUser == null) {
-					throw new BusinessRuntimeException("");
-				}
-				if (!relationUserId.equals(otherUser.getId())) {
-					throw new BusinessRuntimeException("");
-				}
-			}
-		}
-	}
-
 	/**
 	 * 购买Midjourney课程 赠送车票
 	 */
@@ -1976,7 +1938,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			} else if (coupon.getType() == Coupon.Type.reduce) {
 				if (goodsType == 2) {
 					if (skuMoney.compareTo(coupon.getReduceCondition()) < 0) {
-						throw BusinessRuntimeException.getInstance(String.format("满%s可用", coupon.getReduceCondition().divide(BigDecimal.valueOf(100))));
+						throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_reduce_money_not_available_error"));
 					}
 				}
 				BigDecimal subtractMoney = orderDon.getMoney().subtract(coupon.getReduceMoney());
@@ -2001,9 +1963,9 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			BigDecimal userBalance = user.getBalance();
 			//扣除余额 是否成功
 			Integer success = userMapper.deductBalance(user.getId(), subBalance, userBalance);
-			if (success != 1) throw BusinessRuntimeException.getInstance("您的余额不足!");
-			orderDon.setBalance(balance);
-			userBenefitsService.recordBalanceBySource(user.getId(), BigDecimal.valueOf(-balance.longValue()), UserBalanceSourceRecord.Source.payment);
+			if (success != 1) throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("user_balance_not_enough"));
+			orderDon.setBalance(subBalance);
+			userBenefitsService.recordBalanceBySource(user.getId(), BigDecimal.valueOf(-subBalance.longValue()), UserBalanceSourceRecord.Source.payment);
 		}
 	}
 
@@ -2022,7 +1984,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 
 	@Override
-	public void orderNotify(OrderDon orderDon){
+	public void orderNotify(OrderDon orderDon){ 
 		Long goodsId = orderDon.getGoodsId();
 		if (orderDon.getIsNoLogin()) {
 			orderDon.setExCode(exchangeCodeService.getExCode(goodsId, orderDon.getSkuId(), 1));

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

@@ -26,7 +26,10 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
 
 /*
  *项目名: netflix
@@ -123,6 +126,7 @@ public class UserRealOrderBenefitsImpl implements UserRealOrderBenefitsService {
 
 	@Override
 	@Transactional(rollbackFor = Throwable.class)
+	@Deprecated
 	public GroupsRelationView receiveRealGoodsBenefits(Long userId, Long benefitsId, Long goodsId, Long skuId, Long relationId) {
 		//可获取的权益是否存在
 		UserPayEquipmentAvailableBenefits availableBenefits = availableBenefitsMapper.selectById(benefitsId);

+ 2 - 2
netflix-service/src/main/java/com/cyksj/service/paypal/PayPalService.java

@@ -112,7 +112,7 @@ public class PayPalService{
         redisService.set(RedisService.key.ABROAD_SUCCESS_URL.getName() + orderId,successUrl,RedisService.key.ABROAD_SUCCESS_URL.getTimeout());
         OrderDon orderDon = orderDonService.getById(orderId);
         BigDecimal money = orderDon.getMoney().divide(new BigDecimal(7),2,RoundingMode.HALF_DOWN);
-        orderDon.setAbroadMoney(money);
+        //orderDon.setAbroadMoney(money);
         orderDon.setType(OrderDon.Type.PAYPAL);
         orderDonService.updateById(orderDon);
         if (OrderDon.Status.hasPayment.equals(orderDon.getStatus())) {
@@ -127,7 +127,7 @@ public class PayPalService{
         RedirectUrls redirectUrls = new RedirectUrls();
 
         redirectUrls.setCancelUrl(paypalPayConfig.getCancelUrl());
-        String returnUrl = "https://" + paypalPayConfig.getHost() + "/8081/api/applets/order/paypal/notify";
+        String returnUrl = "https://" + paypalPayConfig.getHost() + "/8083/api2/applets/order/paypal/notify";
         //成功回调地址(自己写的/pay/success)
         redirectUrls.setReturnUrl(returnUrl);
 

+ 4 - 3
netflix-service/src/main/java/com/cyksj/service/phone/impl/PhoneCodeServiceImpl.java

@@ -5,6 +5,7 @@ import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.i18n.I18nMessageUtil;
 import com.cyksj.mapper.PhoneCodeMapper;
 import com.cyksj.model.entity.PhoneCode;
 import com.cyksj.service.phone.PhoneCodeService;
@@ -34,16 +35,16 @@ public class PhoneCodeServiceImpl implements PhoneCodeService {
 		DateTime now = DateTime.now();
 		PhoneCode phoneCode = phoneCodeMapper.selectOne(Wrappers.lambdaQuery(PhoneCode.class).eq(PhoneCode::getPhone, phone).last("limit 1"));
 		if (phoneCode == null || StrUtil.isEmpty(phoneCode.getCode())) {
-			throw BusinessRuntimeException.getInstance("请重新获取手机验证码");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("phone_code_valid_error"));
 		}
 		//3分钟失效
 		Date updateTime = phoneCode.getUpdateTime();
 		DateTime afterFiveMinutes = DateUtil.offsetMinute(updateTime, 3);
 		if (now.isAfter(afterFiveMinutes)) {
-			throw BusinessRuntimeException.getInstance("手机验证码已失效,请重新获取");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("phone_code_valid_error"));
 		}
 		if (!StrUtil.equals(code, phoneCode.getCode())) {
-			throw BusinessRuntimeException.getInstance("手机验证码错误,请重新输入");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("verify_code_error"));
 		}
 	}
 }

+ 6 - 1
netflix-service/src/main/java/com/cyksj/service/stripe/StripeService.java

@@ -114,9 +114,14 @@ public class StripeService {
 
    }
 
+    public static void main(String[] args) throws StripeException {
+        Stripe.apiKey = "sk_test_51NATIGJKtCIbVVyCmw3ISCI9mn59oIJ2l767Qn3M3fOi259Y1iWS7eSllMBBmdmfc745hVKmpKYxGofQyMLc8a1U00KgFDGqXL";
+        BalanceTransaction balanceTransaction = BalanceTransaction.retrieve(Charge.retrieve("ch_3Ng0C9JKtCIbVVyC0DzkXNsv").getBalanceTransaction());
+        System.out.println(balanceTransaction);
+    }
 
     public Boolean refund(OrderRefundReq refundReq, OrderDon orderDon) throws StripeException {
-        BigDecimal net = refundReq.getRefundMoney().divide(new BigDecimal(7),2, RoundingMode.HALF_DOWN).subtract(orderDon.getAbroadTransactionFee());
+        BigDecimal net = refundReq.getRefundMoney().subtract(orderDon.getAbroadTransactionFee());
         log.info("stripe return order:{},money:{}",orderDon.getId(),net);
         StripePayConfig stripePayConfig = stripePayConfigMapper.selectById(1);
         Stripe.apiKey = stripePayConfig.getApiKey();

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/template/impl/TemplateCommonServiceImpl.java

@@ -231,7 +231,7 @@ public class TemplateCommonServiceImpl implements TemplateCommonService {
 					return;
 				}
 				if (relation.getUserId() != 0 && isPrdEnv) {
-					String msg = String.format(Constant.CHANGE_GROUPS_TRIPS_ACCOUNT, title);
+					String msg = String.format(Constant.CHANGE_GROUPS_TRIPS_ACCOUNT, title, envCommonService.getDomain());
 					smsService.sendSmsToRelationUser(relation.getUserId(), msg);
 				}
 			}

+ 19 - 12
netflix-service/src/main/java/com/cyksj/service/user/impl/UserServiceImpl.java

@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 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.Codec;
 import com.cyksj.common.util.Jsons;
@@ -81,7 +82,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 	public User saveAuth(GzhOAuth2UserInfo info, Long sharedId, Integer dsType, Long pid, User.RegisterEnv registerEnv, String dsCode, String callback, String callbackType) throws Exception {
 		final String unionid = info.getUnionid();
 		if (StrUtil.isEmpty(unionid)) {
-			throw BusinessRuntimeException.getInstance("授权操作异常,请刷新页面");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("auth_error"));
 		}
 
 		User user = getSyncUser(info.getOpenid(), info.getUnionid(), null);
@@ -171,7 +172,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
     @Override
     public UserWhoami whoami(long userId) {
 	    User user = this.getById(userId);
-	    Assert.notNull(user, "业务处理失败,请联系客服");
+	    Assert.notNull(user, I18nMessageUtil.getI18nMsg("login_code_expired"));
 	    UserWhoami userWhoami = new UserWhoami();
 	    if (StrUtil.isEmpty(user.getShowId())) {
 		    user.setShowId(getUserShowId(userId));
@@ -330,43 +331,46 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 	@Override
 	public User webLogin(LoginReq loginReq) throws Exception {
 		LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery(User.class).last("limit 1");
-		if (loginReq.getType() == null || loginReq.getType() < 1 && loginReq.getType() > 2) {
-			throw BusinessRuntimeException.getInstance("系统异常,请刷新页面重新操作");
+		if (loginReq.getType() == null || loginReq.getType() < 1 && loginReq.getType() > 3) {
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
 		}
 		if (loginReq.getType() == 1) {
 			if (StrUtil.hasEmpty(loginReq.getPhone(), loginReq.getCode())) {
-				throw BusinessRuntimeException.getInstance("请输入对应信息");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("params_error"));
 			}
 			DateTime now = DateTime.now();
 			PhoneCode phoneCode = phoneCodeMapper.selectOne(Wrappers.lambdaQuery(PhoneCode.class).eq(PhoneCode::getPhone, loginReq.getPhone()).last("limit 1"));
 			if (phoneCode == null || StrUtil.isEmpty(phoneCode.getCode())) {
-				throw BusinessRuntimeException.getInstance("请重新获取手机验证码");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("phone_code_valid_error"));
 			}
 			//3分钟失效
 			Date updateTime = phoneCode.getUpdateTime();
 			DateTime afterFiveMinutes = DateUtil.offsetMinute(updateTime, 3);
 			if (now.isAfter(afterFiveMinutes)) {
-				throw BusinessRuntimeException.getInstance("手机验证码已失效,请重新获取");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("phone_code_valid_error"));
 			}
 			if (!StrUtil.equals(loginReq.getCode(), phoneCode.getCode())) {
-				throw BusinessRuntimeException.getInstance("手机验证码错误,请重新输入");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("verify_code_error"));
 			}
 			wrapper.eq(User::getLoginPhone, loginReq.getPhone());
 		}
 		if (loginReq.getType() == 2) {
 			if (StrUtil.isEmpty(loginReq.getEmail())) {
-				throw BusinessRuntimeException.getInstance("邮箱不能为空");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("params_error"));
 			}
 			String code = redisService.getStr(RedisService.key.EMAIL_CODE_KEY.getNameFormat(loginReq.getEmail()));
 			if (StrUtil.isEmpty(code)) {
-				throw BusinessRuntimeException.getInstance("邮箱验证码已失效,请重新获取");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("email_code_valid_error"));
 			}
 			if (!StrUtil.equals(loginReq.getCode(), code)) {
-				throw BusinessRuntimeException.getInstance("邮箱验证码错误,请重新输入");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("verify_code_error"));
 			}
 			wrapper.eq(User::getEmail, loginReq.getEmail());
 			redisService.del(RedisService.key.EMAIL_CODE_KEY.getNameFormat(loginReq.getEmail()));
 		}
+		if (loginReq.getType() == 3) {
+			wrapper.eq(User::getEmail, loginReq.getEmail());
+		}
 		//保存用户信息
 		User user = this.getOne(wrapper);
 		String dsCode = loginReq.getDsCode();
@@ -411,6 +415,9 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 			user.setHeadimgurl(Constant.DEFAULT_HEAD_IMG);
 			String registerEnv = loginReq.getRegisterEnv();
 			user.setRegisterEnv(StrUtil.isEmpty(registerEnv) ? User.RegisterEnv.pc.name() : registerEnv);
+			if (loginReq.getType() == 3) {
+				user.setEmail(loginReq.getEmail());
+			}
 			this.save(user);
 			//新用户分销
 			if (sharedId != null) {
@@ -471,7 +478,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 		//保存用户信息
 		User user = saveAuth(userinfo, re.getSharedId(), re.getDsType(), re.getPid(), User.RegisterEnv.pc, re.getDsCode(), re.getCk(), re.getCt());
 		if (user == null) {
-			throw BusinessRuntimeException.getInstance("系统错误,请重新授权");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
 		}
 		String loginPhone = re.getLp();
 		String loginEmail = re.getLe();

+ 7 - 5
netflix-service/src/main/java/com/cyksj/service/user/impl/WorkOrderFrontServiceImpl.java

@@ -5,6 +5,7 @@ import cn.hutool.core.util.RandomUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.i18n.I18nMessageUtil;
 import com.cyksj.enums.GatewayApiCode;
 import com.cyksj.mapper.AccountMapper;
 import com.cyksj.mapper.manage.sys.WorkOrderChatHistoryMapper;
@@ -62,7 +63,7 @@ public class WorkOrderFrontServiceImpl implements WorkOrderFrontService {
 				.eq(WorkOrder::getUserId, userId)
 				.last("limit 1"));
 		if (exists != null) {
-			throw BusinessRuntimeException.getInstance("您已提交过该车票工单");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("work_order_already_submitted_error"));
 		}
 		User user = userService.getById(userId);
 		if (user == null) throw BusinessRuntimeException.getGatewayApiCode(GatewayApiCode.CMS_TOKEN_VALID);
@@ -70,20 +71,20 @@ public class WorkOrderFrontServiceImpl implements WorkOrderFrontService {
 		String imgs = workOrderReq.getImgs();
 		String topic = workOrderReq.getTopic();
 		if (StrUtil.isNotBlank(topic) && topic.length() > 32) {
-			throw BusinessRuntimeException.getInstance("标题最多输入30字数以内");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("topic_more_error"));
 		}
 		if (StrUtil.isNotBlank(content) && content.length() > 200) {
-			throw BusinessRuntimeException.getInstance("问题描述最多输入200字数以内");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("question_content_more_error"));
 		}
 		if (StrUtil.isNotBlank(imgs) && imgs.length() > 2000) {
-			throw BusinessRuntimeException.getInstance("图片过多");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("picture_more_error"));
 		}
 		List<Long> userIds = userBindRelationService.getRelationUserIdList(userId, user);
 		GroupRelationDetailView detailView = beanSearcher.searchFirst(GroupRelationDetailView.class, MapUtils.builder()
 				.field(GroupRelationDetailView::getUserId, userIds).op(Operator.InList)
 				.field(GroupRelationDetailView::getRelationId, relationId)
 				.build());
-		if (detailView == null) throw BusinessRuntimeException.getInstance("车票不存在");
+		if (detailView == null) throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
 
 		WorkOrder workOrder = new WorkOrder();
 		BeanUtil.copyProperties(workOrderReq, workOrder);
@@ -112,6 +113,7 @@ public class WorkOrderFrontServiceImpl implements WorkOrderFrontService {
 	}
 
 	@Override
+	@Deprecated
 	public void replyCustomer(WorkOrderChatHistory history) {
 		Long userId = history.getUserId();
 		User user = userService.getById(userId);

+ 24 - 0
netflix-web/src/main/java/com/cyksj/config/i18n/LocaleResolverConfig.java

@@ -0,0 +1,24 @@
+package com.cyksj.config.i18n;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.LocaleResolver;
+
+/*
+ *项目名: netflix
+ *文件名: LocaleResolver
+ *创建者: JavaZou
+ *创建时间:2022/12/7 16:16
+ */
+@Configuration
+public class LocaleResolverConfig {
+
+	/**
+	 * 注入自定义 国际化解析器
+	 */
+	@Bean
+	public LocaleResolver localeResolver() {
+		MyLocaleResolver localeResolver = new MyLocaleResolver();
+		return localeResolver;
+	}
+}

+ 54 - 0
netflix-web/src/main/java/com/cyksj/config/i18n/MyLocaleResolver.java

@@ -0,0 +1,54 @@
+package com.cyksj.config.i18n;
+
+import cn.hutool.core.util.StrUtil;
+import com.cyksj.model.entity.UserPageLanguage;
+import org.springframework.web.servlet.LocaleResolver;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Locale;
+
+/*
+ *项目名: netflix
+ *文件名: MyLocaleResolver
+ *创建者: JavaZou
+ *创建时间:2022/12/7 17:00
+ * 自定义国际化解析语言
+ */
+public class MyLocaleResolver implements LocaleResolver {
+	@Override
+	public Locale resolveLocale(HttpServletRequest request) {
+		Locale locale = new Locale("zh", "HK");
+		{
+			//通过header解析lang优先
+			String language = request.getHeader("lang");
+			if (UserPageLanguage.Language.checkLanguage(language)) {
+				String[] localeArgs = language.split(StrUtil.UNDERLINE);
+				locale = new Locale(localeArgs[0], localeArgs[1]);
+				return locale;
+			}
+		}
+		//得到cookie,解析locale
+		Cookie[] cookies = request.getCookies();
+		if (cookies != null) {
+			for (Cookie cookie : cookies) {
+				if (cookie.getName().equals("lang")) {
+					String language = cookie.getValue();
+					if (UserPageLanguage.Language.checkLanguage(language)) {
+						String[] localeArgs = language.split(StrUtil.UNDERLINE);
+						locale = new Locale(localeArgs[0], localeArgs[1]);
+						break;
+					}
+					continue;
+				}
+			}
+		}
+		return locale;
+	}
+
+	@Override
+	public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {
+
+	}
+}

+ 4 - 0
netflix-web/src/main/java/com/cyksj/web/GlobalExceptionHandler.java

@@ -5,6 +5,7 @@ import cn.dev33.satoken.exception.NotPermissionException;
 import cn.dev33.satoken.exception.NotRoleException;
 import cn.hutool.core.lang.Validator;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.i18n.I18nMessageUtil;
 import com.cyksj.common.util.StringUtil;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayApiCode;
@@ -86,6 +87,9 @@ public class GlobalExceptionHandler {
         }
         log.error("全局错误处理: \n Cause: {} \n Value: {}", message, value);
         if (apiCode != null) {
+            if (apiCode == GatewayApiCode.CMS_TOKEN_VALID || apiCode == GatewayApiCode.CMS_TOKEN_OUT_LINE || apiCode == GatewayApiCode.CMS_USER_NO_LOGIN) {
+                return GatewayResponse.FAIL.newBuilder().buildGatewayCode(apiCode).setMsg(I18nMessageUtil.getI18nMsg("login_code_expired")).toResult();
+            }
             return GatewayResponse.FAIL.newBuilder().buildGatewayCode(apiCode).toResult();
         }
         return GatewayResponse.FAIL.newBuilder().setMsg(message).toResult(value);

+ 2 - 1
netflix-web/src/main/java/com/cyksj/web/controller/channel/ChannelController.java

@@ -2,6 +2,7 @@ package com.cyksj.web.controller.channel;
 
 import cn.hutool.core.util.StrUtil;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.i18n.I18nMessageUtil;
 import com.cyksj.common.util.Jsons;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
@@ -46,7 +47,7 @@ public class ChannelController {
     public Result<ChannelPopularize> getById(@PathVariable Long id, Boolean isLogin) {
         ChannelPopularize channelPopularize = popularizeMapper.selectById(id);
         if (channelPopularize == null) {
-            throw BusinessRuntimeException.getInstance("该链接不存在!");
+            throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("popularize_link_nt"));
         }
         if (StrUtil.isNotBlank(channelPopularize.getCouponIds())) {
             try {

+ 22 - 21
netflix-web/src/main/java/com/cyksj/web/controller/coupon/CouponFrontController.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.cyksj.common.annotation.NoSubmit;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.i18n.I18nMessageUtil;
 import com.cyksj.common.util.Jsons;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
@@ -115,7 +116,7 @@ public class CouponFrontController {
 		//实物还是虚物
 		GoodsDonSkuView goodsDonSkuView = beanSearcher.searchFirst(GoodsDonSkuView.class, MapUtils.builder().field(GoodsDonSkuView::getSkuId, skuId).op(Operator.Equal).build());
 		if (goodsDonSkuView == null) {
-			throw BusinessRuntimeException.getInstance("规格不存在");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sku_nt"));
 		}
 		BigDecimal skuMoney = goodsDonSkuView.getMoney();
 		if (goodsDonSkuView.getType() == 2) {
@@ -179,7 +180,7 @@ public class CouponFrontController {
 	public Result<String> collectWholeRecommendCoupon() {
 		Long userId = StpUserUtil.getLoginIdAsLong();
 		couponFontService.collectWholeRecommendCoupon(userId);
-		return GatewayResponse.SUCCESS.newBuilder().toResult("领取成功");
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
 	}
 
 	/**
@@ -203,7 +204,7 @@ public class CouponFrontController {
 	public Result<String> collectCoupon(@RequestBody CouponCollectReq couponCollectReq) {
 		Long userId = StpUserUtil.getLoginIdAsLong();
 		couponFontService.collectCoupon(couponCollectReq, userId);
-		return GatewayResponse.SUCCESS.newBuilder().toResult("领取优惠券成功");
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
 	}
 
 	/**
@@ -213,7 +214,7 @@ public class CouponFrontController {
 	public Result<String> collectRecommendCoupon(@RequestBody CouponCollectReq couponCollectReq) {
 		Long userId = StpUserUtil.getLoginIdAsLong();
 		couponFontService.collectRecommendCoupon(couponCollectReq, userId);
-		return GatewayResponse.SUCCESS.newBuilder().toResult("领取优惠券成功");
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
 	}
 
 	/**
@@ -240,24 +241,24 @@ public class CouponFrontController {
 		Long userId = StpUserUtil.getLoginIdAsLong();
 		GoodsDonSkuView goodsDonSkuView = beanSearcher.searchFirst(GoodsDonSkuView.class, MapUtils.builder().field(GoodsDonSkuView::getSkuId, skuId).op(Operator.Equal).build());
 		if (goodsDonSkuView == null) {
-			throw BusinessRuntimeException.getInstance("该规格不存在");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sku_nt"));
 		}
 		BigDecimal skuMoney = goodsDonSkuView.getMoney();
 		if (goodsDonSkuView.getType() == 2) {
-			throw BusinessRuntimeException.getInstance("实物不支持使用优惠码");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_sku_not_available_error"));
 		}
 		CouponPopularizeDto dto = couponMapper.checkExCode(exCode);
 		if (dto == null) {
-			throw BusinessRuntimeException.getInstance("该优惠码不存在");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_code_not_exist"));
 		}
 		if (dto.getIsGeneral() != null) {
 			if (dto.getIsGeneral() && userId.equals(dto.getUserId())) {
-				throw BusinessRuntimeException.getInstance("不可以使用自己的优惠码");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_code_own_use_error"));
 			}
 			if (!dto.getIsGeneral()) {
 				UserDistribute userDistribute = userDistributeMapper.selectById(dto.getDistributeId());
 				if (userDistribute != null && userDistribute.getUserId().equals(userId)) {
-					throw BusinessRuntimeException.getInstance("不可以使用自己的优惠码");
+					throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_code_own_use_error"));
 				}
 			}
 			//是否有上下级关系
@@ -268,50 +269,50 @@ public class CouponFrontController {
 					//是否是 当天注册新用户 且下过单
 					User user = userMapper.selectById(userId);
 					if (user.getCreatedTime().before(DateUtil.beginOfDay(DateTime.now()))) {
-						throw BusinessRuntimeException.getInstance("该优惠码只适用于新用户");
+						throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_code_new_user_error"));
 					}
 					CouponNewUserView couponNewUserView = beanSearcher.searchFirst(CouponNewUserView.class, MapUtils.builder().field(CouponNewUserView::getUserId, userId).op(Operator.Equal).build());
-					if (couponNewUserView != null) throw BusinessRuntimeException.getInstance("该优惠码只适用于新用户");
+					if (couponNewUserView != null) throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_code_new_user_error"));
 				}
 				if (userDistributeShared != null && !userDistributeShared.getSharedId().equals(dto.getUserId())) {
-					throw BusinessRuntimeException.getInstance("您已有推广,无法使用其他人推广码");
+					throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_code_popularize_repeat_use_error"));
 				}
 			}
 		}
 		if (dto.getScope() == Coupon.Scope.newUser) {
 			CouponNewUserView couponNewUserView = beanSearcher.searchFirst(CouponNewUserView.class, MapUtils.builder().field(CouponNewUserView::getUserId, userId).op(Operator.Equal).build());
 			if (couponNewUserView != null) {
-				throw BusinessRuntimeException.getInstance("该优惠码只适用于新用户");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_code_new_user_error"));
 			}
 		}
 		if (isRenew != null && isRenew) {
 			Coupon.UseScope useScope = dto.getUseScope();
 			if (useScope == Coupon.UseScope.orders) {
-				throw BusinessRuntimeException.getInstance("该优惠码续费时不可使用");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_code_only_order_error"));
 			}
 		}
 		if (isRenew == null || !isRenew) {
 			Coupon.UseScope useScope = dto.getUseScope();
 			if (useScope == Coupon.UseScope.renew) {
-				throw BusinessRuntimeException.getInstance("该优惠码下单时不可使用");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_code_only_renew_order_error"));
 			}
 		}
 		if (dto.getIsValidTime() && dto.getValidStartTime().after(DateTime.now())) {
-			throw BusinessRuntimeException.getInstance("该优惠码待生效");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_code_not_effective_error"));
 		}
 		if (dto.getIsValidTime() && dto.getValidEndTime().before(DateTime.now())) {
-			throw BusinessRuntimeException.getInstance("该优惠码已失效");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_code_expired_error"));
 		}
 		CouponSku couponSku = couponSkuMapper.selectOne(Wrappers.lambdaQuery(CouponSku.class)
 				.eq(CouponSku::getSkuId, skuId)
 				.eq(CouponSku::getCouponId, dto.getCouponId())
 				.select(CouponSku::getId).last("limit 1"));
 		if (couponSku == null) {
-			throw BusinessRuntimeException.getInstance("该优惠码不适用于该规格");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_sku_not_available_error"));
 		}
 		if (goodsDonSkuView.getType() == 2) {
 			if (dto.getType() == Coupon.Type.reduce && skuMoney.compareTo(dto.getReduceCondition()) < 0) {
-				throw BusinessRuntimeException.getInstance(String.format("满%s可用", dto.getReduceCondition().divide(BigDecimal.valueOf(100))));
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("coupon_reduce_money_not_available_error"));
 			}
 		}
 		return GatewayResponse.SUCCESS.newBuilder().toResult(dto);
@@ -340,7 +341,7 @@ public class CouponFrontController {
 		long userId = StpUserUtil.getLoginIdAsLong();
 		req.setUserId(userId);
 		couponFontService.receiveChannelPopularizeCoupon(req);
-		return GatewayResponse.SUCCESS.newBuilder().toResult("领取成功");
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
 	}
 
 	/**
@@ -350,7 +351,7 @@ public class CouponFrontController {
 	public Result<String> collectAllChannelCoupons(@PathVariable Long popularizeId) {
 		long userId = StpUserUtil.getLoginIdAsLong();
 		couponFontService.collectAllChannelCoupons(userId, popularizeId);
-		return GatewayResponse.SUCCESS.newBuilder().toResult("领取成功");
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
 	}
 
 	/**

+ 3 - 2
netflix-web/src/main/java/com/cyksj/web/controller/distribute/EquipmentDistributeController.java

@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.EnvCommonService;
 import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.i18n.I18nMessageUtil;
 import com.cyksj.common.util.Jsons;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
@@ -160,7 +161,7 @@ public class EquipmentDistributeController {
 		}
 		EquipmentConfigDto equipmentConfigDto = Jsons.parseObject(sysValue, EquipmentConfigDto.class);
 		if (CollUtil.isEmpty(equipmentConfigDto.getSkuList())) {
-			throw BusinessRuntimeException.getInstance("暂无该车票权益");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
 		}
 		Optional<GoodsDonSku> first = equipmentConfigDto.getSkuList().stream().filter(goodsDonSku -> {
 			if (goodsDonSku.getId().equals(skuId)) {
@@ -169,7 +170,7 @@ public class EquipmentDistributeController {
 			return false;
 		}).findFirst();
 		if (first.isEmpty()) {
-			throw BusinessRuntimeException.getInstance("暂无该车票权益");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
 		}
 		GroupsRelationView groupsRelationView = equipmentDistributeFrontService.useBenefits(userId, goodsId, skuId, relationId);
 		return GatewayResponse.SUCCESS.newBuilder().toResult(groupsRelationView);

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

@@ -9,14 +9,15 @@ import cn.hutool.core.util.StrUtil;
 import cn.hutool.extra.servlet.ServletUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.constant.Constant;
+import com.cyksj.common.i18n.I18nMessageUtil;
 import com.cyksj.common.util.Jsons;
 import com.cyksj.common.util.StringUtil;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.GoodsDonSkuMapper;
 import com.cyksj.mapper.OrderDonMapper;
-import com.cyksj.mapper.SysConfigMapper;
 import com.cyksj.mapper.RegisterOrderDonMapper;
+import com.cyksj.mapper.SysConfigMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.views.*;
 import com.cyksj.redis.RedisService;
@@ -118,35 +119,7 @@ public class GoodsDonController {
                     .notIn(OrderDon::getStatus, Constant.noOrderStatus).select(OrderDon::getCreatedTime, OrderDon::getPayTime, OrderDon::getId)
                     .orderByDesc(OrderDon::getId)
                     .last("limit 1"));
-            StringBuilder notifyMsg = new StringBuilder();
-            if (orderDon == null) {
-                notifyMsg.append("点击购买立即上车");
-                data.setNotifyMsg(notifyMsg.toString());
-                return;
-            } else {
-                Date payTime = orderDon.getPayTime();
-                Date startTime = payTime != null ? payTime : orderDon.getCreatedTime();
-                long hour = DateUtil.between(startTime, now, DateUnit.HOUR);
-                if (hour == 0) {
-                    long minute = DateUtil.between(startTime, now, DateUnit.MINUTE);
-                    if (minute == 0) {
-                        notifyMsg.append("1分钟");
-                    } else {
-                        notifyMsg.append(minute);
-                        notifyMsg.append("分钟");
-                    }
-                } else {
-                    if (hour > 3) {
-                        int hours = RandomUtil.randomInt(3) + 1;
-                        notifyMsg.append(hours);
-                    } else {
-                        notifyMsg.append(hour);
-                    }
-                    notifyMsg.append("小时");
-                }
-            }
-            notifyMsg.append("前有人购买");
-            data.setNotifyMsg(notifyMsg.toString());
+            data.setNotifyMsg(getPayMsgTime(data.getId(), now, 1));
         });
         return GatewayResponse.SUCCESS.newBuilder().toResult(search);
     }
@@ -156,15 +129,15 @@ public class GoodsDonController {
      */
     @GetMapping("/get/list")
     public Result<List<GoodsFrontListView>> getGoodsList() {
-        List<Long> filter_goodsIds = getFilterGoodsIds();
-        String pcCacheKey = RedisService.key.YH_HOME_PAGHE_CACHE.getName() + "PC";
+        List<Long> filter_goodsIds = getFilterGoodsIds(false);
+        String pcCacheKey = RedisService.key.YH_HOME_PAGHE_CACHE.getNameLanguagePrefix() + "PC";
         if (CollUtil.isNotEmpty(filter_goodsIds)) {
             pcCacheKey += ":hz-ip";
         }
         Object value = redisService.get(pcCacheKey);
         if (value != null) {
             try {
-                List<GoodsFrontListView> list = Jsons.parseObject(value, List.class);
+                List<GoodsFrontListView> list = Jsons.parseList(value, GoodsFrontListView.class);
                 if (CollUtil.isNotEmpty(list)) {
                     return GatewayResponse.SUCCESS.newBuilder().toResult(list);
                 }
@@ -206,15 +179,15 @@ public class GoodsDonController {
      */
     @GetMapping("/get/homePage")
     public Result<List<GoodsHomePageView>> getGoodsHomePage() {
-        List<Long> filter_goodsIds = getFilterGoodsIds();
-        String h5CacheKey = RedisService.key.YH_HOME_PAGHE_CACHE.getName() + "H5";
+        List<Long> filter_goodsIds = getFilterGoodsIds(false);
+        String h5CacheKey = RedisService.key.YH_HOME_PAGHE_CACHE.getNameLanguagePrefix() + "H5";
         if (CollUtil.isNotEmpty(filter_goodsIds)) {
             h5CacheKey += ":hz-ip";
         }
         Object value = redisService.get(h5CacheKey);
         if (value != null) {
             try {
-                List<GoodsHomePageView> list = Jsons.parseObject(value, List.class);
+                List<GoodsHomePageView> list = Jsons.parseList(value, GoodsHomePageView.class);
                 if (CollUtil.isNotEmpty(list)) {
                     return GatewayResponse.SUCCESS.newBuilder().toResult(list);
                 }
@@ -242,7 +215,7 @@ public class GoodsDonController {
      */
     @GetMapping("/get/register")
     public Result<List<RegisterGoodsDonView>> getRegisterGoodsDon() {
-        String registerCacheKey = RedisService.key.REGISTER_HOME_PAGE_CACHE.getName();
+        String registerCacheKey = RedisService.key.REGISTER_HOME_PAGE_CACHE.getNameLanguagePrefix();
         Object value = redisService.get(registerCacheKey);
         if (value != null) {
             try {
@@ -296,7 +269,7 @@ public class GoodsDonController {
      */
     @GetMapping("/get/recommend/{id}")
     public Result<List<GoodsRecommendViews>> getRecommendGoodsByGid(@PathVariable Long id) throws Exception {
-        String key = RedisService.key.YH_HOME_PAGHE_CACHE.getName() + "recommend:" + id;
+        String key = RedisService.key.YH_HOME_PAGHE_CACHE.getNameLanguagePrefix() + "recommend:" + id;
         Object value = redisService.get(key);
         if (value != null) {
             List<GoodsRecommendViews> goodsRecommendViews = Jsons.parseList(value.toString(), GoodsRecommendViews.class);
@@ -349,7 +322,10 @@ public class GoodsDonController {
         return GatewayResponse.SUCCESS.newBuilder().toResult(search);
     }
 
-    public List<Long> getFilterGoodsIds() {
+    public List<Long> getFilterGoodsIds(Boolean isOpen) {
+        if (!isOpen) {
+            return null;
+        }
         //过滤杭州Ai ChatGPT平台
         //获取当前ip地址
         SysConfig sysConfig = sysConfigMapper.selectOne(Wrappers.lambdaQuery(SysConfig.class)
@@ -373,49 +349,58 @@ public class GoodsDonController {
      * @return
      */
     public String getPayMsgTime(Long goodsId, DateTime now, Integer type) {
-	    Date startTime = null;
-	    StringBuilder notifyMsg = new StringBuilder();
-	    if (type == 1) {
-		    OrderDon orderDon = orderDonMapper.selectOne(Wrappers.lambdaQuery(OrderDon.class)
-				    .eq(OrderDon::getGoodsId, goodsId)
-				    .notIn(OrderDon::getStatus, Constant.noOrderStatus).select(OrderDon::getCreatedTime, OrderDon::getPayTime, OrderDon::getId)
-				    .orderByDesc(OrderDon::getId)
-				    .last("limit 1"));
-		    if (orderDon == null) {
-			    notifyMsg.append("点击购买立即上车");
-			    return notifyMsg.toString();
-		    }
-		    startTime = orderDon.getPayTime() != null ? orderDon.getPayTime() : orderDon.getCreatedTime();
-	    } else if (type == 2) {
-		    RegisterOrderDon orderDon = registerOrderDonMapper.selectOne(Wrappers.lambdaQuery(RegisterOrderDon.class)
-				    .eq(RegisterOrderDon::getGoodsId, goodsId)
-				    .notIn(RegisterOrderDon::getStatus, Constant.noOrderStatus).select(RegisterOrderDon::getCreatedTime, RegisterOrderDon::getPayTime, RegisterOrderDon::getId)
-				    .orderByDesc(RegisterOrderDon::getId)
-				    .last("limit 1"));
-		    if (orderDon == null) {
-			    return null;
-		    }
-		    startTime = orderDon.getPayTime() != null ? orderDon.getPayTime() : orderDon.getCreatedTime();
-	    }
-	    long hour = DateUtil.between(startTime, now, DateUnit.HOUR);
-	    if (hour == 0) {
-		    long minute = DateUtil.between(startTime, now, DateUnit.MINUTE);
-		    if (minute == 0) {
-			    notifyMsg.append("1分钟");
-		    } else {
-			    notifyMsg.append(minute);
-			    notifyMsg.append("分钟");
-		    }
-	    } else {
-		    if (hour > 3) {
-			    int hours = RandomUtil.randomInt(3) + 1;
-			    notifyMsg.append(hours);
-		    } else {
-			    notifyMsg.append(hour);
-		    }
-		    notifyMsg.append("小时");
-	    }
-	    notifyMsg.append("前有人购买");
-	    return notifyMsg.toString();
+        Date startTime = null;
+        StringBuilder notifyMsg = new StringBuilder();
+        if (type == 1) {
+            OrderDon orderDon = orderDonMapper.selectOne(Wrappers.lambdaQuery(OrderDon.class)
+                    .eq(OrderDon::getGoodsId, goodsId)
+                    .notIn(OrderDon::getStatus, Constant.noOrderStatus).select(OrderDon::getCreatedTime, OrderDon::getPayTime, OrderDon::getId)
+                    .orderByDesc(OrderDon::getId)
+                    .last("limit 1"));
+            if (orderDon == null) {
+                notifyMsg.append(I18nMessageUtil.getI18nMsg("order_buy_now_notify"));
+                return notifyMsg.toString();
+            }
+            startTime = orderDon.getPayTime() != null ? orderDon.getPayTime() : orderDon.getCreatedTime();
+        } else if (type == 2) {
+            RegisterOrderDon orderDon = registerOrderDonMapper.selectOne(Wrappers.lambdaQuery(RegisterOrderDon.class)
+                    .eq(RegisterOrderDon::getGoodsId, goodsId)
+                    .notIn(RegisterOrderDon::getStatus, Constant.noOrderStatus).select(RegisterOrderDon::getCreatedTime, RegisterOrderDon::getPayTime, RegisterOrderDon::getId)
+                    .orderByDesc(RegisterOrderDon::getId)
+                    .last("limit 1"));
+            if (orderDon == null) {
+                return null;
+            }
+            startTime = orderDon.getPayTime() != null ? orderDon.getPayTime() : orderDon.getCreatedTime();
+        }
+        long hour = DateUtil.between(startTime, now, DateUnit.HOUR);
+        if (hour == 0) {
+            long minute = DateUtil.between(startTime, now, DateUnit.MINUTE);
+            if (minute == 0) {
+                notifyMsg.append("1");
+                notifyMsg.append(I18nMessageUtil.getI18nMsg("minute"));
+            } else {
+                notifyMsg.append(minute);
+                if (minute > 1) {
+                    notifyMsg.append(I18nMessageUtil.getI18nMsg("minutes"));
+                } else {
+                    notifyMsg.append(I18nMessageUtil.getI18nMsg("minute"));
+                }
+            }
+        } else {
+            if (hour > 3) {
+                int hours = RandomUtil.randomInt(3) + 1;
+                notifyMsg.append(hours);
+            } else {
+                notifyMsg.append(hour);
+            }
+            if (hour > 1) {
+                notifyMsg.append(I18nMessageUtil.getI18nMsg("hours"));
+            } else {
+                notifyMsg.append(I18nMessageUtil.getI18nMsg("hour"));
+            }
+        }
+        notifyMsg.append(I18nMessageUtil.getI18nMsg("order_pre_buy_it"));
+        return notifyMsg.toString();
     }
 }

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

@@ -13,6 +13,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.cyksj.common.annotation.NoSubmit;
 import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.i18n.I18nMessageUtil;
 import com.cyksj.common.snowflake.Sequence;
 import com.cyksj.common.task.GlobalThreadPoolTaskExecutor;
 import com.cyksj.common.util.GoogleGenerator;
@@ -128,7 +129,7 @@ public class GroupRelationController {
                 .in(GroupsRelation::getUserId, userIds)
                 .last(" limit 1"));
         if (re == null) {
-            throw new BusinessRuntimeException("该车票不存在,请联系客服.");
+            throw new BusinessRuntimeException(I18nMessageUtil.getI18nMsg("sys_error"));
         }
         LambdaUpdateWrapper<GroupsRelation> updateWrapper = Wrappers.lambdaUpdate(GroupsRelation.class)
                 .set(GroupsRelation::getAccount, relation.getAccount())
@@ -136,10 +137,10 @@ public class GroupRelationController {
                 .eq(GroupsRelation::getId, relation.getId());
         if (re.getRechargeStatus() != null) {
             if (re.getRechargeStatus() == GroupsRelation.RechargeStatus.complete) {
-                throw BusinessRuntimeException.getInstance("代充账号已充值");
+                throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
             }
             if (StrUtil.isEmpty(relation.getAccount()) || StrUtil.isEmpty(relation.getPassword())) {
-                throw BusinessRuntimeException.getInstance("请输入正确的账号密码信息");
+                throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("params_error"));
             }
             if (re.getRechargeStatus() == GroupsRelation.RechargeStatus.error) {
                 updateWrapper.set(GroupsRelation::getRechargeStatus, GroupsRelation.RechargeStatus.waiting);
@@ -186,10 +187,10 @@ public class GroupRelationController {
                 .field(GroupsRelationView::getId, relationId).build());
         if (groupsRelationView == null) {
             log.info("userId:{}查看relationId:{}车票不存在", userId, relationId);
-            throw BusinessRuntimeException.getInstance("该车票已不存在");
+            throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
         }
-        if (groupsRelationView.getAccountId() == null) throw BusinessRuntimeException.getInstance("该车队未配置账号");
-        if (groupRelationFrontService == null) throw BusinessRuntimeException.getInstance("车票已不存在");
+        if (groupsRelationView.getAccountId() == null) throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("account_not_set"));
+        if (groupRelationFrontService == null) throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
         ChatGptPwdViewRecord viewRecord = new ChatGptPwdViewRecord();
         viewRecord.setUserId(userId);
         viewRecord.setRelationId(relationId);
@@ -231,12 +232,12 @@ public class GroupRelationController {
         long userId = StpUserUtil.getLoginIdAsLong();
         List<Long> userIds = userBindRelationService.getRelationUserIdList(userId, null);
         //每个人 每月只能获取3次
-        if (relationId == null) throw BusinessRuntimeException.getInstance("车票不存在");
+        if (relationId == null) throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
         GroupsRelationView groupsRelationView = beanSearcher.searchFirst(GroupsRelationView.class, MapUtils.builder()
                 .field(GroupsRelationView::getId, relationId)
                 .field(GroupsRelationView::getUserId, userIds).op(Operator.InList).build());
-        if (groupsRelationView == null) throw BusinessRuntimeException.getInstance("车票不存在");
-        if (StrUtil.isEmpty(groupsRelationView.getApiSecret())) throw BusinessRuntimeException.getInstance("未开启验证");
+        if (groupsRelationView == null) throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
+        if (StrUtil.isEmpty(groupsRelationView.getApiSecret())) throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("account_auth_not_enable"));
         DateTime now = DateTime.now();
         Integer count = doubleVerifyRecordMapper.selectCount(Wrappers.lambdaQuery(DoubleVerifyClickRecord.class)
                 .in(DoubleVerifyClickRecord::getUserId, userIds)
@@ -248,7 +249,7 @@ public class GroupRelationController {
         //默认1次
         int num = 1;
         if (userFuncProperty != null) num = userFuncProperty.getVerifyCheckNum();
-        if (count >= num) throw BusinessRuntimeException.getInstance("获取双重验证码次数上限");
+        if (count >= num) throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("account_auth_code_times_limit"));
         int second = now.second();
         if (second < 30 && 30 - second < 3) {
             ThreadUtil.sleep(30 - second + 1, TimeUnit.SECONDS);
@@ -289,7 +290,7 @@ public class GroupRelationController {
             redisService.set(String.format("%s-%s", userId, sb.toString()), 0, 60 * 10l);
             redisService.set(String.format("%s/%s", userId, sb.toString()), Jsons.toJson(doubleVerifyDto), 60 * 10l);
         } catch (Exception e) {
-            throw BusinessRuntimeException.getInstance("获取双重验证码错误,请联系客服");
+            throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("account_auth_code_error"));
         }
         return GatewayResponse.SUCCESS.newBuilder().toResult(re.toString());
     }
@@ -306,7 +307,7 @@ public class GroupRelationController {
         String objKey = String.format("%s/%s", userId, code);
         Object objValue =  redisService.get(objKey);
         if (objValue == null || num == null) {
-            throw BusinessRuntimeException.getInstance("请重新获取双重验证码");
+            throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("account_auth_code_reacuire_error"));
         }
         Integer refreshNum = Integer.parseInt(num.toString());
         String apiSecret = null;
@@ -321,10 +322,10 @@ public class GroupRelationController {
         if (refreshNum >= 3) {
             redisService.del(numKey);
             redisService.del(objKey);
-            throw BusinessRuntimeException.getInstance("刷新次数已达到3次,请重新获取验证码");
+            throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("account_auth_code_reacuire_error"));
         }
         if (apiSecret == null) {
-            throw BusinessRuntimeException.getInstance("请重新获取双重验证码");
+            throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("account_auth_code_reacuire_error"));
         }
         StringBuilder sb = new StringBuilder();
         try {
@@ -336,7 +337,7 @@ public class GroupRelationController {
             redisService.incr(numKey, 1l);
 
         } catch (Exception e) {
-            throw BusinessRuntimeException.getInstance("刷新双重验证码错误,请联系客服");
+            throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("account_auth_code_error"));
         }
         if (clickId != 0) {
             int nowSecond = DateTime.now().second();
@@ -425,7 +426,7 @@ public class GroupRelationController {
     @GetMapping("/get/questionnaire")
     public Result<List<QuestionnaireView>> getQuestionnaireView(Long promotionId) {
         QuestionnairePromotion promotion = questionnairePromotionMapper.selectById(promotionId);
-        if (promotion == null || !promotion.getDeleted()) throw BusinessRuntimeException.getInstance("问卷不存在");
+        if (promotion == null || !promotion.getDeleted()) throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
         Long templateId = promotion.getTemplateId();
         List<QuestionnaireView> questionnaireViews = beanSearcher.searchAll(QuestionnaireView.class, MapUtils.builder()
                 .field(QuestionnaireView::getPromotionId, promotionId)
@@ -444,13 +445,15 @@ public class GroupRelationController {
     public Result<String> recordQuestionnaire(@PathVariable Long promotionId, @RequestBody List<FormFieldsData> answers) {
         Long groupsId = SEQUENCE.nextId();
         List<QuestionnairePromotionFieldsListView> promotionFieldsListViews = beanSearcher.searchAll(QuestionnairePromotionFieldsListView.class, MapUtils.builder().field(QuestionnairePromotionFieldsListView::getPromotionId, promotionId).build());
-        if (CollUtil.isEmpty(promotionFieldsListViews)) throw BusinessRuntimeException.getInstance("问卷已结束");
-        if (promotionFieldsListViews.size() != answers.size()) throw BusinessRuntimeException.getInstance("请完成所有问题");
+        if (CollUtil.isEmpty(promotionFieldsListViews))
+            throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("questionnaire_has_expired_error"));
+        if (promotionFieldsListViews.size() != answers.size())
+            throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("questionnaire_answer_all_questions_error"));
         answers.forEach(answer -> {
             Long fieldsId = answer.getFieldsId();
             String content = answer.getContent();
             if (fieldsId == null || StrUtil.isBlank(content)) {
-                throw BusinessRuntimeException.getInstance("必填项为空");
+                throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("questionnaire_answer_all_questions_error"));
             }
             answer.setPromotionId(promotionId);
             answer.setGroupsId(groupsId);

+ 6 - 5
netflix-web/src/main/java/com/cyksj/web/controller/manage/AdminController.java

@@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.i18n.I18nMessageUtil;
 import com.cyksj.common.util.Codec;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
@@ -106,7 +107,7 @@ public class AdminController {
         }
         boolean mobile = Validator.isMobile(admin.getPhone());
         if (!mobile) {
-            throw BusinessRuntimeException.getInstance("请输入正确的手机号");
+            throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("phone_format_error"));
         }
 
         try {
@@ -159,7 +160,7 @@ public class AdminController {
         if (StrUtil.isNotEmpty(admin.getPhone())) {
             boolean mobile = Validator.isMobile(admin.getPhone());
             if (!mobile) {
-                throw BusinessRuntimeException.getInstance("请输入正确的手机号");
+                throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("phone_format_error"));
             }
             if (!admin.getPhone().equals(user.getPhone())) {
                 flag = true;
@@ -197,16 +198,16 @@ public class AdminController {
         DateTime now = DateTime.now();
         PhoneCode phoneCode = phoneCodeMapper.selectOne(Wrappers.lambdaQuery(PhoneCode.class).eq(PhoneCode::getPhone, phone).last("limit 1"));
         if (phoneCode == null || StrUtil.isEmpty(phoneCode.getCode())) {
-            throw BusinessRuntimeException.getInstance("请重新获取手机验证码");
+            throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("phone_code_valid_error"));
         }
         //3分钟失效
         Date updateTime = phoneCode.getUpdateTime();
         DateTime afterFiveMinutes = DateUtil.offsetMinute(updateTime, 3);
         if (now.isAfter(afterFiveMinutes)) {
-            throw BusinessRuntimeException.getInstance("手机验证码已失效,请重新获取");
+            throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("phone_code_valid_error"));
         }
         if (!StrUtil.equals(code, phoneCode.getCode())) {
-            throw BusinessRuntimeException.getInstance("手机验证码错误,请重新输入");
+            throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("verify_code_error"));
         }
         // 生成token
 

+ 6 - 5
netflix-web/src/main/java/com/cyksj/web/controller/manage/cms/CmsAdminUserController.java

@@ -12,6 +12,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.annotation.Log;
 import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.i18n.I18nMessageUtil;
 import com.cyksj.common.util.Codec;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.BusinessType;
@@ -114,7 +115,7 @@ public class CmsAdminUserController {
 		}
 		boolean mobile = Validator.isMobile(cmsUser.getPhone());
 		if (!mobile) {
-			throw BusinessRuntimeException.getInstance("请输入正确的手机号");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("phone_format_error"));
 		}
 
 		try {
@@ -185,7 +186,7 @@ public class CmsAdminUserController {
 		if (StrUtil.isNotEmpty(cmsUserReq.getPhone())) {
 			boolean mobile = Validator.isMobile(cmsUserReq.getPhone());
 			if (!mobile) {
-				throw BusinessRuntimeException.getInstance("请输入正确的手机号");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("phone_format_error"));
 			}
 			if (!cmsUserReq.getPhone().equals(user.getPhone())) {
 				flag = true;
@@ -266,16 +267,16 @@ public class CmsAdminUserController {
 		DateTime now = DateTime.now();
 		PhoneCode phoneCode = phoneCodeMapper.selectOne(Wrappers.lambdaQuery(PhoneCode.class).eq(PhoneCode::getPhone, phone).last("limit 1"));
 		if (phoneCode == null || StrUtil.isEmpty(phoneCode.getCode())) {
-			throw BusinessRuntimeException.getInstance("请重新获取手机验证码");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("phone_code_valid_error"));
 		}
 		//3分钟失效
 		Date updateTime = phoneCode.getUpdateTime();
 		DateTime afterFiveMinutes = DateUtil.offsetMinute(updateTime, 3);
 		if (now.isAfter(afterFiveMinutes)) {
-			throw BusinessRuntimeException.getInstance("手机验证码已失效,请重新获取");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("phone_code_valid_error"));
 		}
 		if (!StrUtil.equals(code, phoneCode.getCode())) {
-			throw BusinessRuntimeException.getInstance("手机验证码错误,请重新输入");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("verify_code_error"));
 		}
 		// 生成token
 

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

@@ -102,6 +102,9 @@ public class StatisticsDataController {
 	@GetMapping("/export")
 	@SaCheckPermission("statics:export")
 	public void exportStatisticsData(Integer type, Long startTime, Long endTime, HttpServletResponse response) {
+		if (startTime == null || endTime == null) {
+			throw BusinessRuntimeException.getInstance("请选择导出的时间");
+		}
 		List<ExcelSheetAndData> excelSheetDataList = statisticsDataService.exportStatisticsDataByType(type, startTime, endTime);
 		excelSheetDataList = excelSheetDataList.stream().sorted(Comparator.comparing(ExcelSheetAndData::getSort)).collect(Collectors.toList());
 		EasyExcelUtils.createExcelStreamMutilByEasyExcel(response, excelSheetDataList, "订单统计数据", ExcelTypeEnum.XLSX, null);
@@ -112,6 +115,9 @@ public class StatisticsDataController {
 	 */
 	@GetMapping("/export/monthly/data")
 	public void exportMonthlyData(Long startTime, Long endTime, HttpServletResponse response) {
+		if (startTime == null || endTime == null) {
+			throw BusinessRuntimeException.getInstance("请选择导出的时间");
+		}
 		List<ExcelSheetAndData> excelSheetDataList = statisticsDataService.exportMonthlyData(startTime, endTime);
 		excelSheetDataList = excelSheetDataList.stream().sorted(Comparator.comparing(ExcelSheetAndData::getSort)).collect(Collectors.toList());
 		EasyExcelUtils.createExcelStreamMutilByEasyExcel(response, excelSheetDataList, String.format("%s月业务数据", DateUtil.month(DateTime.of(startTime)) + 1), ExcelTypeEnum.XLSX, null);

+ 2 - 1
netflix-web/src/main/java/com/cyksj/web/controller/market/LuckyDrawFrontController.java

@@ -2,6 +2,7 @@ package com.cyksj.web.controller.market;
 
 import com.cyksj.common.annotation.NoSubmit;
 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.dto.Result;
@@ -56,7 +57,7 @@ public class LuckyDrawFrontController {
 		List<LuckyDrawView> drawViews = beanSearcher.searchAll(LuckyDrawView.class, MapUtils.flatBuilder(request.getParameterMap())
 				.field(LuckyDrawView::getStatus, true).op(Operator.Equal).build());
 		if (drawViews.isEmpty()) {
-			throw BusinessRuntimeException.getInstance("暂未配置奖品");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("task_lucky_draw_prize_not_configured"));
 		}
 		List<LuckyDrawView> re = new ArrayList<>();
 		for (LuckyDrawView drawView : drawViews) {

+ 2 - 1
netflix-web/src/main/java/com/cyksj/web/controller/market/SignFrontController.java

@@ -3,6 +3,7 @@ package com.cyksj.web.controller.market;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.cyksj.common.i18n.I18nMessageUtil;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.market.sign.SignConfigMapper;
@@ -55,7 +56,7 @@ public class SignFrontController {
     public Result<Integer> sign() {
         Long userId = StpUserUtil.getLoginIdAsLong();
         SignUser signUser = marketFrontService.signByUserId(userId);
-        return GatewayResponse.SUCCESS.newBuilder().setMsg("签到成功").toResult(signUser.getDayPeriod());
+        return GatewayResponse.SUCCESS.newBuilder().setMsg(I18nMessageUtil.getI18nMsg("sign_success")).toResult(signUser.getDayPeriod());
     }
 
     /**

+ 7 - 6
netflix-web/src/main/java/com/cyksj/web/controller/market/TaskFrontController.java

@@ -1,6 +1,7 @@
 package com.cyksj.web.controller.market;
 
 import com.cyksj.common.annotation.NoSubmit;
+import com.cyksj.common.i18n.I18nMessageUtil;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.UserMapper;
@@ -68,7 +69,7 @@ public class TaskFrontController {
 	public Result<String> getTaskPoints(@PathVariable Long taskId) {
 		Long userId = StpUserUtil.getLoginIdAsLong();
 		marketFrontService.receivedTaskPoints(userId, taskId);
-		return GatewayResponse.SUCCESS.newBuilder().toResult("领取成功");
+		return GatewayResponse.SUCCESS.newBuilder().toResult(I18nMessageUtil.getI18nMsg("receive_success"));
 	}
 
 	/**
@@ -81,7 +82,7 @@ public class TaskFrontController {
 		Long userId = StpUserUtil.getLoginIdAsLong();
 		User user = userMapper.selectById(userId);
 		bindTaskService.bindPhone(user, phoneReq.getPhone(), phoneReq.getCode());
-		return GatewayResponse.SUCCESS.newBuilder().toResult("绑定手机号成功");
+		return GatewayResponse.SUCCESS.newBuilder().toResult(I18nMessageUtil.getI18nMsg("bind_success"));
 	}
 
 	/**
@@ -93,7 +94,7 @@ public class TaskFrontController {
 		Long userId = StpUserUtil.getLoginIdAsLong();
 		User user = userMapper.selectById(userId);
 		bindTaskService.bindEmail(user, phoneReq.getEmail(), phoneReq.getCode());
-		return GatewayResponse.SUCCESS.newBuilder().toResult("绑定邮箱成功");
+		return GatewayResponse.SUCCESS.newBuilder().toResult(I18nMessageUtil.getI18nMsg("bind_success"));
 	}
 
 	/**
@@ -105,7 +106,7 @@ public class TaskFrontController {
 		Long userId = StpUserUtil.getLoginIdAsLong();
 		User user = userMapper.selectById(userId);
 		bindTaskService.updateBindPhone(user, phoneReq.getPhone(), phoneReq.getCode());
-		return GatewayResponse.SUCCESS.newBuilder().toResult("更换手机号成功");
+		return GatewayResponse.SUCCESS.newBuilder().toResult(I18nMessageUtil.getI18nMsg("change_success"));
 	}
 
 	/**
@@ -149,7 +150,7 @@ public class TaskFrontController {
 		Long userId = StpUserUtil.getLoginIdAsLong();
 		taskFollowReq.setUserId(userId);
 		marketFrontService.toCompleteFollowTask(taskFollowReq);
-		return GatewayResponse.SUCCESS.newBuilder().toResult("提交成功");
+		return GatewayResponse.SUCCESS.newBuilder().toResult(I18nMessageUtil.getI18nMsg("submit_success"));
 	}
 
 	/**
@@ -171,6 +172,6 @@ public class TaskFrontController {
 		Long userId = StpUserUtil.getLoginIdAsLong();
 		taskFollowReq.setUserId(userId);
 		marketFrontService.updateFailFollowTask(taskFollowReq);
-		return GatewayResponse.SUCCESS.newBuilder().toResult("提交成功");
+		return GatewayResponse.SUCCESS.newBuilder().toResult(I18nMessageUtil.getI18nMsg("submit_success"));
 	}
 }

+ 53 - 10
netflix-web/src/main/java/com/cyksj/web/controller/user/AuthorizationController.java

@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.EnvCommonService;
 import com.cyksj.common.annotation.NoSubmit;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.i18n.I18nMessageUtil;
 import com.cyksj.common.snowflake.Sequence;
 import com.cyksj.common.util.*;
 import com.cyksj.config.WeChatConfig;
@@ -21,6 +22,7 @@ import com.cyksj.model.dto.GzhOAuth2UserInfo;
 import com.cyksj.model.dto.JsSdkTicket;
 import com.cyksj.model.entity.PhoneCode;
 import com.cyksj.model.entity.User;
+import com.cyksj.model.request.EmailFeedBackReq;
 import com.cyksj.model.request.LoginReq;
 import com.cyksj.model.response.UserAuthLoginResp;
 import com.cyksj.model.response.WxGzhQrCodeTicketRep;
@@ -32,9 +34,14 @@ import com.cyksj.service.user.BadIntentionOpService;
 import com.cyksj.service.user.UserService;
 import com.cyksj.service.wechat.WeChatService;
 import com.cyksj.web.util.StpUserUtil;
+import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
+import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;
+import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
+import com.google.api.client.json.gson.GsonFactory;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.dao.DuplicateKeyException;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
@@ -42,6 +49,7 @@ import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.util.Collections;
 import java.util.Optional;
 
 /**
@@ -82,6 +90,9 @@ public class AuthorizationController {
 
     private final TemplateCommonService templateCommonService;
 
+    @Value("${google.clientId}")
+    private String clientId;
+
     @GetMapping(value = "/weChat")
     public void base(String url, String dsCode, Long sharedId, Integer dsType, Long popularizeId, String authType, String callbackType, String callback, HttpServletResponse response) throws Exception {
 
@@ -310,15 +321,15 @@ public class AuthorizationController {
     public Result<String> getPhoneCode(String phone, Integer digit, @RequestParam(defaultValue = "0") Boolean isFree, Integer cid) throws Exception {
         if (cid == null) cid = 86;
         if (StrUtil.isBlank(phone) || (86 == cid && !Validator.isMobile(phone))) {
-            throw BusinessRuntimeException.getInstance("请输入正确的手机号");
+            throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("phone_format_error"));
         }
         //是否是虚拟手机号开头
         if (BlackOpsUtil.phoneIsStart(phone)) {
-            throw BusinessRuntimeException.getInstance("请输入正确的手机号");
+            throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("phone_format_error"));
         }
         Object exists = redisService.get(RedisService.key.PHONE_CODE_KEY.getName() + phone);
         if (exists != null) {
-            throw BusinessRuntimeException.getInstance("短信验证码未失效");
+            throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("verify_code_validity"));
         }
         //是否是恶意用户
         badIntentionOpService.checkHandleBadUserOp(phone);
@@ -331,7 +342,7 @@ public class AuthorizationController {
             isFlag = SmsUtil.sendLuoKey2Msg(phone, String.format("尊敬的用户,您的验证码为%s,此验证码仅用于银河录像。【银河录像局】", code));
         }
         if (!isFlag) {
-            return GatewayResponse.SUCCESS.newBuilder().toResult("发送短信验证码失败");
+            return GatewayResponse.SUCCESS.newBuilder().toResult(I18nMessageUtil.getI18nMsg("verify_code_send_error"));
         }
         redisService.setNx(RedisService.key.PHONE_CODE_KEY.getName() + phone, phone, RedisService.key.PHONE_CODE_KEY.getTimeout());
         try {
@@ -349,8 +360,7 @@ public class AuthorizationController {
             }
         } catch (DuplicateKeyException e) {
         }
-        return GatewayResponse.SUCCESS.newBuilder().toResult(
-                "发送成功");
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
     }
 
     /**
@@ -360,7 +370,7 @@ public class AuthorizationController {
     @NoSubmit
     public Result<String> getEmailCode(String email, Integer digit) {
         if (email == null || !Validator.isEmail(email)) {
-            throw BusinessRuntimeException.getInstance("请输入正确邮箱");
+            throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("email_format_error"));
         }
         if (envCommonService.isPrdEnv()) {
             //首次注册只能gmail邮箱
@@ -373,9 +383,26 @@ public class AuthorizationController {
         }
         String code = mailService.sendLoginCodeEmailToPeople(digit, email);
         if (code == null) {
-            throw BusinessRuntimeException.getInstance("获取邮箱验证码错误");
+            throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("verify_code_send_error"));
+        }
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+    /**
+     * 发送海外用户 反馈信息给客服
+     */
+    @PostMapping("/sendEmail/feedback")
+    public Result<String> sendEmailFeedBack(@RequestBody EmailFeedBackReq emailFeedBackReq) throws Exception {
+        if (emailFeedBackReq.getIsLogin() != null && emailFeedBackReq.getIsLogin()) {
+            long userId = StpUserUtil.getLoginIdAsLong();
+            User byId = userService.getById(userId);
+            emailFeedBackReq.setNickname(byId.getNickname());
+        }
+        if (StrUtil.isEmpty(emailFeedBackReq.getNickname()) || StrUtil.isEmpty(emailFeedBackReq.getContent())) {
+            throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("required_info_error"));
         }
-        return GatewayResponse.SUCCESS.newBuilder().toResult("发送成功");
+        mailService.sendEmailFeedBack(emailFeedBackReq);
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
     }
 
     /**
@@ -394,6 +421,22 @@ public class AuthorizationController {
         return GatewayResponse.SUCCESS.newBuilder().toResult(loginPhoneRep);
     }
 
+    @PostMapping("/google/login")
+    public Result<UserAuthLoginResp> getCode(LoginReq loginReq,String credential) throws Exception{
+        log.info("google loginReq:{},credential:{}",loginReq,credential);
+        GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(GoogleNetHttpTransport.newTrustedTransport(), GsonFactory.getDefaultInstance()).setAcceptableTimeSkewSeconds(30000L).setAudience(Collections.singletonList(clientId)).build();
+        GoogleIdToken idToken = verifier.verify(credential);
+        GoogleIdToken.Payload payload = idToken.getPayload();
+        loginReq.setType(3);
+        loginReq.setEmail(payload.getEmail());
+        loginReq.setSubject(payload.getSubject());
+        User user = userService.webLogin(loginReq);
+        //写回登陆信息
+        StpUserUtil.login(user.getId());
+        UserAuthLoginResp loginPhoneRep = new UserAuthLoginResp(StpUserUtil.getTokenValue(), user.getShowId(), user.getNickname(), user.getHeadimgurl());
+        return GatewayResponse.SUCCESS.newBuilder().toResult(loginPhoneRep);
+    }
+
     public void baseRedirect(AuthToken token, String state, User.RegisterEnv registerEnv, HttpServletResponse response) throws Exception {
         // 根据openid 与 access_token 获取用户信息
         GzhOAuth2UserInfo userinfo = weChatService.getUserInfo(token.getAccessToken(), token.getOpenid());
@@ -404,7 +447,7 @@ public class AuthorizationController {
         //保存用户信息
         User user = userService.saveAuth(userinfo, re.getSharedId(), re.getDsType(), re.getPid(), registerEnv, re.getDsCode(), re.getCk(), re.getCt());
         if (user == null) {
-            throw BusinessRuntimeException.getInstance("系统错误,请重新授权");
+            throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
         }
 
         //写回登陆信息

+ 11 - 10
netflix-web/src/main/java/com/cyksj/web/controller/user/DistributePopularizeController.java

@@ -12,6 +12,7 @@ import com.cyksj.common.EnvCommonService;
 import com.cyksj.common.annotation.NoSubmit;
 import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.i18n.I18nMessageUtil;
 import com.cyksj.common.util.SmsUtil;
 import com.cyksj.common.util.ValidatorUtil;
 import com.cyksj.dto.Result;
@@ -241,28 +242,28 @@ public class DistributePopularizeController {
 		Long userId = StpUserUtil.getLoginIdAsLong();
 		User user = userMapper.selectById(userId);
 		if (user == null) {
-			throw BusinessRuntimeException.getInstance("请先授权登录");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("login_code_expired"));
 		}
 		Boolean isTakeAll = applyMoneyReq.getIsTakeAll();
 		DistributeMoneyApply.Type type = applyMoneyReq.getType();
 		if (type == null) type = DistributeMoneyApply.Type.zfb;
 		if (type == DistributeMoneyApply.Type.zfb) {
 			if (ObjectUtil.hasEmpty(applyMoneyReq.getAccount(), applyMoneyReq.getRealName())) {
-				throw BusinessRuntimeException.getInstance("必填项不能为空");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("params_error"));
 			}
 			if (applyMoneyReq.getAccount().length() > 255 || applyMoneyReq.getRealName().length() > 32) {
-				throw BusinessRuntimeException.getInstance("请输入正确的账户信息");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("distribute_apply_money_account_error"));
 			}
 		}
 		if (type == DistributeMoneyApply.Type.usdt) {
 			if (StrUtil.isEmpty(applyMoneyReq.getWalletAddr())) {
-				throw BusinessRuntimeException.getInstance("USDT提现钱包地址不能为空");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("distribute_apply_money_usdt_address_error"));
 			}
 			if (applyMoneyReq.getWalletAddr().length() > 1000) {
-				throw BusinessRuntimeException.getInstance("请输入正确的钱包地址");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("distribute_apply_money_usdt_address_error"));
 			}
 			if (StrUtil.isNotBlank(applyMoneyReq.getRemark()) && applyMoneyReq.getRemark().length() > 512) {
-				throw BusinessRuntimeException.getInstance("备注过多");
+				throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("distribute_apply_money_remark_length_error"));
 			}
 			isTakeAll = true;
 
@@ -278,7 +279,7 @@ public class DistributePopularizeController {
 		BigDecimal ratePoints = BigDecimal.valueOf(distributePointsExchangeMoney.getPoints());
 		BigDecimal minMoney = distributePointsExchangeMoney.getMoney();
 		if (userPoints.compareTo(minPoints) < 0) {
-			throw BusinessRuntimeException.getInstance("您当前积分未达到积分门槛,无法提现");
+			throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("distribute_apply_money_thresholds_error"));
 		}
 //		//今日是否已提现
 //		DistributeMoneyApply apply = distributeMoneyApplyMapper.selectOne(Wrappers.lambdaQuery(DistributeMoneyApply.class).eq(DistributeMoneyApply::getUserId, userId).between(DistributeMoneyApply::getCreatedTime, DateUtil.beginOfDay(DateTime.now()), DateUtil.endOfDay(DateTime.now())).last("limit 1"));
@@ -332,15 +333,15 @@ public class DistributePopularizeController {
 				distributeMoneyApplyMapper.insert(distributeMoneyApply);
 				//大额提现 超过400
 				if (distributeMoneyApply.getVerifyStatus() == DistributeMoneyApply.Status.verifying && distributeMoneyApply.getMoney().compareTo(fourHundred) > 0) {
-					SmsUtil.sendLuoKey2Msg(Constant.ZK_MOBILE, "推广有大额提现申请【银河录像局】");
+					SmsUtil.sendLuoKey2Msg(Constant.ZK_MOBILE, "海外推广有大额提现申请【银河录像局】");
 				}
 			} catch (Exception e) {
 				userBenefitsService.addDistributePoints(userId, distributeMoneyApply.getPoints());
-				return GatewayResponse.FAIL.newBuilder().setMsg("网络错误,请重试").toResult();
+				return GatewayResponse.FAIL.newBuilder().setMsg(I18nMessageUtil.getI18nMsg("sys_error")).toResult();
 			}
 			return GatewayResponse.SUCCESS.newBuilder().toResult(distributeMoneyApply);
 		}
-		throw BusinessRuntimeException.getInstance("系统异常,请重新提交提现申请");
+		throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
 	}
 
 	/**

+ 3 - 1
netflix-web/src/main/java/com/cyksj/web/controller/user/PhoneAreaCodeController.java

@@ -36,7 +36,7 @@ public class PhoneAreaCodeController {
 	 * 获取国家或地区手机号代码
 	 */
 	@GetMapping("/get/areaCode")
-	public Result<List<PhoneAreaCodeView>> getPhoneAreaCode(String name) throws Exception {
+	public Result<List<PhoneAreaCodeView>> getPhoneAreaCode(String name, String nameUs) throws Exception {
 		String key = RedisService.key.PHONE_AREA_CODE.getName();
 		Object value = redisService.get(key);
 		List<PhoneAreaCodeView> phoneAreaCodeViews = null;
@@ -49,6 +49,8 @@ public class PhoneAreaCodeController {
 		}
 		if (StrUtil.isNotBlank(name)) {
 			phoneAreaCodeViews = phoneAreaCodeViews.stream().filter(view -> view.getNameCn().contains(name)).collect(Collectors.toList());
+		} else if (StrUtil.isNotBlank(nameUs)) {
+			phoneAreaCodeViews = phoneAreaCodeViews.stream().filter(view -> view.getNameUs().contains(nameUs)).collect(Collectors.toList());
 		}
 		return GatewayResponse.SUCCESS.newBuilder().toResult(phoneAreaCodeViews);
 	}

+ 1 - 1
netflix-web/src/main/java/com/cyksj/web/controller/user/UserComplaintController.java

@@ -41,7 +41,7 @@ public class UserComplaintController {
 		long userId = StpUserUtil.getLoginIdAsLong();
 		userComplaint.setUserId(userId);
 		userComplaintService.insertUserComplaint(userComplaint);
-		return GatewayResponse.SUCCESS.newBuilder().toResult("投诉成功");
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
 	}
 
 	/**

+ 59 - 7
netflix-web/src/main/java/com/cyksj/web/controller/user/UserController.java

@@ -1,14 +1,17 @@
 package com.cyksj.web.controller.user;
 
 import cn.hutool.core.date.DateTime;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.annotation.NoSubmit;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.i18n.I18nMessageUtil;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayApiCode;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.OrderDonMapper;
+import com.cyksj.mapper.UserPageLanguageMapper;
 import com.cyksj.mapper.manage.coupon.CouponUserMapper;
 import com.cyksj.model.dto.UserWhoami;
 import com.cyksj.model.entity.*;
@@ -31,6 +34,7 @@ import com.ejlchina.searcher.SearchResult;
 import com.ejlchina.searcher.param.Operator;
 import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
+import org.springframework.dao.DuplicateKeyException;
 import org.springframework.util.Assert;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -38,6 +42,7 @@ import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.HttpServletRequest;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 
 /**
  * @author chan
@@ -68,6 +73,8 @@ public class UserController {
 
     private final UserBindRelationService userBindRelationService;
 
+    private final UserPageLanguageMapper userPageLanguageMapper;
+
     @GetMapping(value = "/wx/whoami")
     public Result<UserWhoami> whoami() {
         long userId = StpUserUtil.getLoginIdAsLong();
@@ -140,10 +147,13 @@ public class UserController {
         Long userId = StpUserUtil.getLoginIdAsLong();
         reqList.forEach(req -> {
             Long benefitsId = req.getBenefitsId(), goodsId = req.getGoodsId(), skuId = req.getSkuId(), relationId = req.getRelationId();
-            Assert.notNull(benefitsId, "可获取的权益不存在");
-            Assert.notNull(goodsId, "请选择对应平台");
-            Assert.notNull(skuId, "请选择对应权益规格");
-            Assert.notNull(relationId, "请选择对应车票");
+//            Assert.notNull(benefitsId, "可获取的权益不存在");
+//            Assert.notNull(goodsId, "请选择对应平台");
+//            Assert.notNull(skuId, "请选择对应权益规格");
+//            Assert.notNull(relationId, "请选择对应车票");
+            if (ObjectUtil.hasEmpty(benefitsId, goodsId, skuId, relationId)) {
+                throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("params_error"));
+            }
             GroupsRelationView groupsRelationView = userRealOrderBenefitsService.receiveRealGoodsBenefits(userId, benefitsId, goodsId, skuId, relationId);
             re.add(groupsRelationView);
         });
@@ -203,7 +213,7 @@ public class UserController {
                 .onlySelect(WorkOrder::getId, WorkOrder::getUserId, WorkOrder::getStatus)
                 .build());
         if (workOrder == null) {
-            throw BusinessRuntimeException.getInstance("该工单不存在");
+            throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
         }
         return GatewayResponse.SUCCESS.newBuilder().toResult(workOrder);
     }
@@ -330,12 +340,54 @@ public class UserController {
         Long switchUserId = request.getUserId();
         List<Long> relationUserIdList = userBindRelationService.getRelationUserIdList(userId, null);
         if (!relationUserIdList.contains(switchUserId)) {
-            throw BusinessRuntimeException.getInstance("切换账号异常,请刷新页面重试");
+            throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("sys_error"));
         }
         User switch_user = userService.getById(switchUserId);
-        Assert.notNull(switch_user, "切换的账号不存在");
+        Assert.notNull(switch_user, I18nMessageUtil.getI18nMsg("sys_error"));
         StpUserUtil.login(switch_user.getId());
         UserAuthLoginResp loginPhoneRep = new UserAuthLoginResp(StpUserUtil.getTokenValue(), switch_user.getShowId(), switch_user.getNickname(), switch_user.getHeadimgurl());
         return GatewayResponse.SUCCESS.newBuilder().toResult(loginPhoneRep);
     }
+
+    /**
+     * 查询页面语言
+     */
+    @GetMapping("/get/self/language")
+    public Result<UserPageLanguage> getSelfLanguage() {
+        long userId = StpUserUtil.getLoginIdAsLong();
+        UserPageLanguage userPageLanguage = userPageLanguageMapper.selectOne(Wrappers.lambdaQuery(UserPageLanguage.class).eq(UserPageLanguage::getUserId, userId).last("limit 1"));
+        return GatewayResponse.SUCCESS.newBuilder().toResult(userPageLanguage);
+    }
+
+
+    /**
+     * 更换页面语言
+     */
+    @PutMapping("/put/language")
+    public Result<String> updatePageLanguage(String language) {
+        long userId = StpUserUtil.getLoginIdAsLong();
+        User user = userService.getById(userId);
+        if (user == null) {
+            throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("auth_error"));
+        }
+        if (!UserPageLanguage.Language.checkLanguage(language)) {
+            throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("language_error"));
+        }
+        UserPageLanguage.Language lang = UserPageLanguage.Language.valueOf(language);
+        UserPageLanguage userPageLanguage = userPageLanguageMapper.selectOne(Wrappers.lambdaQuery(UserPageLanguage.class).eq(UserPageLanguage::getUserId, userId).last("limit 1"));
+        Optional.ofNullable(userPageLanguage).ifPresentOrElse(exits -> {
+            exits.setLanguage(lang);
+            userPageLanguageMapper.updateById(exits);
+        }, () -> {
+            try {
+                UserPageLanguage entity = new UserPageLanguage();
+                entity.setUserId(userId);
+                entity.setLanguage(lang);
+                userPageLanguageMapper.insert(entity);
+            } catch (DuplicateKeyException e) {
+
+            }
+        });
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
 }

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
netflix-web/src/main/resources/application-dev.yml


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
netflix-web/src/main/resources/application-prd.yml


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

@@ -9,6 +9,9 @@ spring:
   servlet:
     multipart:
       max-file-size: 50MB
+  #国际化
+  messages:
+    basename: i18n.yhlx
   mail:
     host: smtp.163.com
     username: yinheluxiangju@163.com
@@ -165,4 +168,8 @@ advertisementwxapp:
   secret: 44c1e7431099fc0bd21dc320822b0108
   shopId: 1644299849
   shopKey: 5y5ZScTJGm0q0umHQOD4r3EfjRvCioUx
-  notify: https://xue.niupian.com.cn/8081/api/
+  notify: https://xue.niupian.com.cn/8081/api/
+
+google:
+  clientId: 371004574299-hhj668e7g9mbvh3o4dentfniinmu6kfk.apps.googleusercontent.com
+  clientSecret: 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

+ 115 - 0
netflix-web/src/main/resources/i18n/yhlx.properties

@@ -0,0 +1,115 @@
+default_msg=系统异常
+popularize_link_nt=该链接不存在!
+ex_code_error=兑换码错误
+ex_code_success=兑换成功
+ex_code_used=该兑换码已使用
+login=登录
+params_error=请输入正确的信息
+parking_space_is_occupied=该车位已有人
+parking_space_not_exist=该车位不存在
+sys_error=系统错误,请刷新重试
+sku_nt=该规格不存在
+coupon_invalid=该优惠券已失效
+coupon_expired=该优惠券已过期
+coupon_not_effective=该优惠券未生效
+coupon_not_exist=该优惠券不存在
+coupon_new_user_receive=新用户可领取该优惠券
+coupon_receive_num=该优惠券已领取完
+coupon_has_received=您已领取该优惠券
+coupon_receive_success=领取成功
+coupon_code_not_exist=该优惠码不存在
+coupon_code_own_use_error=不可以使用自己的优惠码
+coupon_code_new_user_error=该优惠码只适用于新用户
+coupon_code_only_order_error=该优惠码仅下单时可用
+coupon_code_only_renew_order_error=该优惠码仅续费时可用
+coupon_code_not_effective_error=该优惠码未生效
+coupon_code_expired_error=该优惠码已失效
+coupon_code_popularize_repeat_use_error=您已使用其他人推广码
+coupon_sku_not_available_error=不能用于该规格
+coupon_reduce_money_not_available_error=未满足满减金额
+coupon_only_order_error=仅下单时可用
+coupon_only_renew_error=仅续费时可用
+receive_success=领取成功
+order_buy_now_notify=点击购买立即上车
+minute=分钟
+hour=小时
+minutes=分钟
+hours=小时
+order_pre_buy_it=前有人购买
+account_auth_not_enable=未开启双重验证
+account_auth_code_times_limit=获取次数上限
+account_not_set=未配置账号
+account_auth_code_error=获取双重验证码错误,请联系客服
+account_auth_code_reacuire_error=请重新获取双重验证码
+questionnaire_has_expired_error=问卷已结束
+questionnaire_answer_all_questions_error=请回答所有问题
+task_lucky_draw_prize_not_configured=暂时未配置奖品
+task_luck_draw_prize_not_exist=该中奖奖品不存在
+task_luck_draw_prize_has_received=您已领取该中奖奖品
+click_button_repeatedly=请勿重复点击按钮
+task_not_exist=该任务不存在
+task_not_finish=该任务未完成
+task_prize_has_received=您已领取该任务奖励
+task_follow_record__not_exist_error=该提交记录不存在
+task_follow_record_verify_success=您提交的记录已审核成功
+task_luck_draw_lottery_points_error=积分不足
+task_lucky_draw_specific_not_configured=暂未配置特定奖品
+task_lucky_draw_lottery_num_error=抽奖次数为0
+address_choose_error=请添加收货地址.
+sign_success=签到成功
+bind_success=绑定成功
+change_success=更换成功
+submit_success=提交成功
+phone_format_error=请输入正确的手机号
+bind_account_other_phone_error=您通过手机号登录,无法绑定其他手机号
+bind_account_phone_exits=您已绑定手机号
+bind_account_phone_other_bind_error=该手机号已被绑定
+bind_account_phone_change_self_error=无法修改自己登录手机号
+bind_account_phone_not_exist=您未绑定手机号
+bind_account_phone_repeat=手机号重复
+bind_account_phone_not_register=手机号未注册
+email_format_error=请输入正确的邮箱
+bind_account_other_email_error=您通过邮箱登录,无法绑定其他邮箱
+bind_account_email_exist=您已绑定邮箱
+bind_account_email_other_bind_error=该邮箱已被绑定
+email_code_valid_error=请重新获取邮箱验证码
+verify_code_error=验证码错误
+phone_code_valid_error=请重新获取手机验证码
+bind_account_email_change_self_error=无法修改自己登录邮箱
+bind_account_email_not_exist=您未绑定邮箱
+bind_account_email_repeat=邮箱重复
+bind_account_email_not_register=邮箱未注册
+verify_code_send_error=发送验证码错误
+verify_code_validity=获取的验证码未失效
+login_code_expired=登录信息失效,请重新登录
+auth_error=授权异常,请重新授权
+distribute_apply_money_account_error=请输入正确的账户信息
+distribute_apply_money_usdt_address_error=请输入正确的钱包地址
+distribute_apply_money_remark_length_error=备注内容过多
+distribute_apply_money_thresholds_error=未到提现金额门槛,无法提现
+language_error=语言错误
+goods_nt=该平台不存在
+get_ticket_error=获取车票异常,请联系客服
+goods_status_down=该商品已下架
+user_black_error=用户行为异常,已被拉黑
+sku_price_error=商品价格异常
+dp_one_goods_pay_error=暂只支持优惠加购一件商品
+user_balance_not_enough=余额不足!
+order_noPayment_error=您有未支付订单.
+sys_busy_error=系统繁忙,请稍后重试
+order_nt=订单不存在
+order_error=订单异常
+coupon_used_error=优惠券已使用
+coupon_code_used_error=优惠码已使用
+coupon_coupon_code_error=优惠券与优惠码不可同时使用
+ticket_unsupported_renew_error=不支持续费
+account_not_set_unsupport_renew_error=亲,该车次还未发车,需等待客服发车才能续费哦.
+ticket_netflix_season_renew_error=奈飞季付车票只能续费季付
+ticket_netflix_year_renew_error=奈飞年付车票只能续费年付
+ticket_same_renew_error=请选择对应规格的车票续费
+order_renew_ticket_noPayment_error=您有该车票未支付的续费订单..
+work_order_already_submitted_error=您已提交过该车票工单
+picture_more_error=图片过多
+question_content_more_error=问题描述过多
+topic_more_error=标题过长
+required_info_error=请输入必填信息

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

@@ -0,0 +1,115 @@
+coupon_code_own_use_error=Cannot use your own coupon code
+receive_success=Successfully collected
+default_msg=System abnormality
+popularize_link_nt=The link does not exist!
+ex_code_error=redemption code is wrong
+ex_code_success=Successful exchange
+ex_code_used=this redemption code has already been used
+login=login
+params_error=Please enter the correct information
+parking_space_is_occupied=The parking space is occupied
+parking_space_not_exist=Parking space does not exist
+sys_error=System error, please refresh and try again
+sku_nt=The specification does not exist
+coupon_invalid=The coupon has expired
+coupon_expired=This coupon has expired
+coupon_not_effective=This coupon is not valid
+coupon_not_exist=The coupon does not exist
+coupon_new_user_receive=New users can receive this coupon
+coupon_receive_num=The number of coupons that can be claimed is zero
+coupon_has_received=You have received this coupon
+coupon_receive_success=Successful
+coupon_code_not_exist=The coupon code does not exist
+coupon_code_new_user_error=The discount code is only applicable to new users
+coupon_code_only_order_error=This coupon code is only available for placing an order
+coupon_code_only_renew_order_error=This coupon code is only available for renewal orders
+coupon_code_not_effective_error=This coupon code is not valid
+coupon_code_expired_error=The coupon code has expired
+coupon_code_popularize_repeat_use_error=You have already used someone else's coupon code
+coupon_sku_not_available_error=Not available for this specification
+coupon_reduce_money_not_available_error=Unmet amount
+coupon_only_order_error=Only available for orders
+coupon_only_renew_error=Only available for renew orders
+order_buy_now_notify=Click to buy
+minute=\u0020minute
+hour=\u0020hour
+minutes=\u0020minutes
+hours=\u0020hours
+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
+account_not_set=Account not configured
+account_auth_code_error=Obtaining double verification code error, please contact customer service
+account_auth_code_reacuire_error=Please get the double verification code again
+questionnaire_has_expired_error=Questionnaire has ended
+questionnaire_answer_all_questions_error=Please answer all questions
+task_lucky_draw_prize_not_configured=Prizes not configured yet
+task_luck_draw_prize_not_exist=The winning prize does not exist
+task_luck_draw_prize_has_received=You have claimed the winning prize
+click_button_repeatedly=Do not click the button repeatedly
+task_not_exist=The task does not exist
+task_not_finish=The task was not completed
+task_prize_has_received=You have already received the reward for this task
+task_follow_record__not_exist_error=The task record does not exist
+task_follow_record_verify_success=The record you submitted has been successfully reviewed
+task_luck_draw_lottery_points_error=Not enough points
+task_lucky_draw_specific_not_configured=Specific Prizes not configured yet
+task_lucky_draw_lottery_num_error=The number of draws is zero
+address_choose_error=Please add a shipping address.
+sign_success=Sign in Successfully
+bind_success=Bind successfully
+change_success=Replacement Successful
+submit_success=Submitted successfully
+phone_format_error=Please enter the correct cell phone number
+bind_account_other_phone_error=Unable to bind other cell phone numbers
+bind_account_phone_exits=You have bound your cell phone number
+bind_account_phone_other_bind_error=This cell phone number has been bound
+bind_account_phone_change_self_error=Unable to change your login phone number
+bind_account_phone_not_exist=You are not bound to a cell phone number
+bind_account_phone_repeat=Duplicate cell phone numbers
+bind_account_phone_not_register=Cell phone number not registered
+email_format_error=Please enter the correct e-mail address
+bind_account_other_email_error=Unable to bind other mailbox
+bind_account_email_exist=You have bound the mailbox
+bind_account_email_other_bind_error=This mailbox is already bound to someone else
+email_code_valid_error=Please get the mailbox verification code again
+verify_code_error=CAPTCHA error
+phone_code_valid_error=Please get the cell phone verification code again
+bind_account_email_change_self_error=Unable to change your login mailbox
+bind_account_email_not_exist=You are not bound to an e-mail address
+bind_account_email_repeat=Duplicate mailbox numbers
+bind_account_email_not_register=Email not registered
+verify_code_send_error=Error sending verification code
+verify_code_validity=The captcha obtained is not invalidated
+login_code_expired=Login information is invalid, please login again.
+auth_error=Authorization exception, please reauthorize
+distribute_apply_money_account_error=Please enter the correct account information
+distribute_apply_money_usdt_address_error=Please enter the correct wallet address
+distribute_apply_money_remark_length_error=Remarks are too long
+distribute_apply_money_thresholds_error=Failure to meet cash withdrawal criteria
+language_error=Language error
+goods_nt=The platform does not exist
+get_ticket_error=Obtaining tickets is abnormal, please contact customer service
+goods_status_down=This product has been removed from the shelves
+user_black_error=User's behavior is abnormal, has been black
+sku_price_error=Commodity price anomalies
+dp_one_goods_pay_error=Only one additional item can be purchased at this time
+user_balance_not_enough=Not enough free money for user platforms
+order_noPayment_error=You have unpaid orders.
+sys_busy_error=The system is busy, please try again later.
+order_nt=Order does not exist
+order_error=Order Exception
+coupon_used_error=Coupon used
+coupon_code_used_error=Coupon Code Used
+coupon_coupon_code_error=Coupons and coupon codes cannot be used together
+ticket_unsupported_renew_error=Renewal is not supported
+account_not_set_unsupport_renew_error=No account configured, cannot be renewed
+ticket_netflix_season_renew_error=Select same specification for renewal
+ticket_netflix_year_renew_error=Select same specification for renewal
+ticket_same_renew_error=Select same specification for renewal
+order_renew_ticket_noPayment_error=You have an unpaid renewal order for this ticket...
+work_order_already_submitted_error=You have already submitted this ticket work order
+picture_more_error=Too many pictures
+question_content_more_error=Excessive problem description content
+topic_more_error=The title is too long.
+required_info_error=Please enter the required information

+ 115 - 0
netflix-web/src/main/resources/i18n/yhlx_ja_JP.properties

@@ -0,0 +1,115 @@
+default_msg=システム異常
+popularize_link_nt=リンクが存在しない!
+params_error=正しい情報を入力してください
+sys_error=システムエラーが発生しました。
+sku_nt=仕様が存在しない
+coupon_invalid=このクーポンの有効期限は切れています
+coupon_expired=このクーポンの有効期限は切れています
+coupon_not_effective=このクーポンは無効です。
+coupon_not_exist=このクーポンは存在しません
+coupon_new_user_receive=新規ユーザーにはこのクーポンをプレゼント
+coupon_receive_num=このクーポンは請求済みです
+coupon_has_received=すでにバウチャーを受け取っている
+coupon_receive_success=コレクションに成功
+coupon_code_not_exist=このプロモーションコードは存在しません
+coupon_code_own_use_error=自分のプロモコードは使えない
+coupon_code_new_user_error=このプロモーションコードは新規ユーザーのみに適用されます。
+coupon_code_only_order_error=このクーポンコードはご注文時にのみご利用いただけます。
+coupon_code_only_renew_order_error=このプロモコードは更新時にのみご利用いただけます。
+coupon_code_not_effective_error=このプロモーションコードは無効です。
+coupon_code_expired_error=このプロモーションコードの有効期限は切れています。
+coupon_code_popularize_repeat_use_error=他人のプロモーションコードを使用した
+coupon_sku_not_available_error=この仕様には使用できません
+coupon_reduce_money_not_available_error=割引額全額を履行しない
+coupon_only_order_error=注文時のみ利用可能
+coupon_only_renew_error=更新のみ可能
+receive_success=コレクションに成功
+order_buy_now_notify=クリックして購入し、今すぐ乗り込もう!
+minute=分だ
+hour=時間
+minutes=分だ。
+hours=時間
+order_pre_buy_it=先に購入
+account_auth_not_enable=二重認証が有効になっていない
+account_auth_code_times_limit=最大獲得数を達成
+account_not_set=アカウントが設定されていない
+account_auth_code_error=二重認証コードエラーが発生しました。
+account_auth_code_reacuire_error=二重認証コードをもう一度取得してください
+questionnaire_has_expired_error=アンケート終了
+questionnaire_answer_all_questions_error=すべての質問にお答えください。
+task_lucky_draw_prize_not_configured=現時点では賞品は割り当てられていない
+task_luck_draw_prize_not_exist=この優勝賞品は存在しない
+task_luck_draw_prize_has_received=あなたはすでに優勝賞金を受け取っている
+click_button_repeatedly=ボタンを繰り返しクリックしないでください。
+task_not_exist=タスクが存在しない
+task_not_finish=ミッションは完了しなかった
+task_prize_has_received=このクエストの報酬はすでに受け取っている
+task_follow_record__not_exist_error=この提出記録は存在しない
+task_follow_record_verify_success=送信された記録は正常に審査されました。
+task_luck_draw_lottery_points_error=点数が足りない
+task_lucky_draw_specific_not_configured=現時点では特定の賞品は割り当てられていない
+task_lucky_draw_lottery_num_error=抽選回数は0回
+address_choose_error=配送先住所を追加してください。
+sign_success=サインイン成功
+bind_success=バインディング成功
+change_success=交換成功
+submit_success=成功裏に終了
+phone_format_error=正しい携帯電話番号を入力してください。
+bind_account_other_phone_error=正しい携帯電話番号を入力してください。
+bind_account_phone_exits=携帯電話番号のバインド
+bind_account_phone_other_bind_error=この携帯電話番号はすでにタイアップされている
+bind_account_phone_change_self_error=ログイン携帯電話番号が変更できない
+bind_account_phone_not_exist=携帯電話番号に縛られない
+bind_account_phone_repeat=携帯電話番号の重複
+bind_account_phone_not_register=携帯電話番号未登録
+email_format_error=正しいメールアドレスを入力してください。
+bind_account_other_email_error=他のメールボックスをバインドできない
+bind_account_email_exist=あなたはEメールをバインドした。
+bind_account_email_other_bind_error=このメールボックスは他のユーザーによってバインドされています。
+email_code_valid_error=Eメール認証コードをもう一度取得してください。
+verify_code_error=CAPTCHAエラー
+phone_code_valid_error=携帯電話の認証コードをもう一度取得してください。
+bind_account_email_change_self_error=ログインメールが変更できない
+bind_account_email_not_exist=メールアドレスに縛られない
+bind_account_email_repeat=メールボックスの複製
+bind_account_email_not_register=登録されていない電子メール
+verify_code_send_error=認証コード送信エラー
+verify_code_validity=取得したキャプチャは無効ではない
+login_code_expired=ログイン情報が無効です。もう一度ログインしてください。
+auth_error=認証例外、再認証してください
+distribute_apply_money_account_error=正しいアカウント情報を入力してください。
+distribute_apply_money_usdt_address_error=正しいウォレットアドレスを入力してください。
+distribute_apply_money_remark_length_error=発言が過剰
+distribute_apply_money_thresholds_error=現金引き出し基準を満たさない
+language_error=言語エラー
+goods_nt=プラットフォームは存在しない
+get_ticket_error=チケットの例外については、カスタマーサービスまでお問い合わせください。
+goods_status_down=この製品は棚から取り除かれた
+user_black_error=ユーザーの異常行動、脅迫された
+sku_price_error=商品価格アノマリー
+dp_one_goods_pay_error=特典は1つの商品にのみ追加できます。
+user_balance_not_enough=ユーザー・プラットフォームに十分な資金がない!
+order_noPayment_error=未払いの注文がある。
+sys_busy_error=システムがビジー状態なので、後で再試行してください
+order_nt=ユーザーオーダーが存在しない
+order_error=ユーザー・オーダー・エラー
+coupon_used_error=使用クーポン
+coupon_code_used_error=割引コードが使用されました
+coupon_coupon_code_error=クーポンとプロモコードの併用はできません。
+ex_code_error=引き換えコードエラー
+ex_code_success=償還に成功
+ex_code_used=この引き換えコードはすでに使用されています
+login=サインイン
+parking_space_is_occupied=この駐車スペースはすでに埋まっている
+parking_space_not_exist=駐車場は存在しない
+ticket_unsupported_renew_error=更新はサポートされていません
+account_not_set_unsupport_renew_error=アカウントが設定されておらず、更新できない
+ticket_netflix_season_renew_error=更新時に同一仕様を選択
+ticket_netflix_year_renew_error=更新時に同一仕様を選択
+ticket_same_renew_error=更新時に同一仕様を選択
+order_renew_ticket_noPayment_error=このチケットの未払い更新オーダーがあります...
+work_order_already_submitted_error=このチケットの作業指示はすでに提出されています
+picture_more_error=写真が多すぎる
+question_content_more_error=問題の説明が多すぎる
+topic_more_error=長すぎるタイトル
+required_info_error=必要な情報を入力してください

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

@@ -0,0 +1,115 @@
+default_msg=시스템 이상
+popularize_link_nt=링크가 존재하지 않습니다!
+params_error=정확한 정보를 입력해 주세요
+sys_error=시스템 오류가 발생했습니다. 새로고침 후 다시 시도하세요.
+sku_nt=사양이 존재하지 않습니다.
+coupon_invalid=이 쿠폰은 만료되었습니다.
+coupon_expired=이 쿠폰은 만료되었습니다.
+coupon_not_effective=이 쿠폰은 유효하지 않습니다.
+coupon_not_exist=이 쿠폰은 존재하지 않습니다.
+coupon_new_user_receive=신규 사용자는 이 쿠폰을 받을 수 있습니다.
+coupon_receive_num=이 쿠폰이 청구되었습니다.
+coupon_has_received=이미 바우처를 받으셨습니다.
+coupon_receive_success=성공적인 수집
+coupon_code_not_exist=이 프로모션 코드가 존재하지 않습니다.
+coupon_code_own_use_error=자체 프로모션 코드 사용 불가
+coupon_code_new_user_error=이 프로모션 코드는 신규 사용자에게만 적용됩니다.
+coupon_code_only_order_error=이 쿠폰 코드는 주문 시에만 사용할 수 있습니다.
+coupon_code_only_renew_order_error=이 프로모션 코드는 갱신 시에만 사용할 수 있습니다.
+coupon_code_not_effective_error=이 프로모션 코드는 유효하지 않습니다.
+coupon_code_expired_error=이 프로모션 코드가 만료되었습니다.
+coupon_code_popularize_repeat_use_error=다른 사람의 프로모션 코드를 사용했습니다.
+coupon_sku_not_available_error=이 사양에는 사용할 수 없습니다.
+coupon_reduce_money_not_available_error=전체 할인 금액 미충족
+coupon_only_order_error=주문 시에만 사용 가능
+coupon_only_renew_error=갱신 시에만 사용 가능
+receive_success=성공적인 수집
+order_buy_now_notify=지금 구매하고 가입하려면 클릭하세요!
+minute=분
+hour=시간
+minutes=분
+hours=시간
+order_pre_buy_it=전구매
+account_auth_not_enable=이중 인증이 사용되지 않음
+account_auth_code_times_limit=최대 획득 횟수 도달
+account_not_set=구성된 계정 없음
+account_auth_code_error=이중 인증 코드 오류가 발생하면 고객 서비스에 문의하세요.
+account_auth_code_reacuire_error=이중 인증 코드를 다시 받으세요.
+questionnaire_has_expired_error=설문 마감
+questionnaire_answer_all_questions_error=모든 질문에 답변해 주세요.
+task_lucky_draw_prize_not_configured=이 당첨 상품은 존재하지 않습니다.
+task_luck_draw_prize_not_exist=이 당첨 상품은 존재하지 않습니다.
+task_luck_draw_prize_has_received=이미 당첨 상품을 수령했습니다.
+click_button_repeatedly=버튼을 반복해서 클릭하지 마세요.
+task_not_exist=작업이 존재하지 않습니다.
+task_not_finish=임무가 완료되지 않았습니다.
+task_prize_has_received=이 퀘스트에 대한 보상을 이미 받았습니다.
+task_follow_record__not_exist_error=이 제출 기록이 존재하지 않습니다.
+task_follow_record_verify_success=제출한 기록이 성공적으로 검토되었습니다.
+task_luck_draw_lottery_points_error=포인트가 충분하지 않음
+task_lucky_draw_specific_not_configured=현재 특정 상품이 할당되지 않았습니다.
+task_lucky_draw_lottery_num_error=무승부 횟수는 0입니다.
+address_choose_error=배송 주소를 추가하세요.
+sign_success=로그인 성공
+bind_success=바인딩 성공
+change_success=교체 성공
+submit_success=제출 성공
+phone_format_error=올바른 휴대폰 번호를 입력하세요.
+bind_account_other_phone_error=다른 휴대폰 번호를 바인딩할 수 없음
+bind_account_phone_exits=휴대폰 번호를 바인딩했습니다.
+bind_account_phone_other_bind_error=이 휴대폰 번호는 이미 묶여 있습니다.
+bind_account_phone_change_self_error=로그인 휴대폰 번호를 변경할 수 없습니다.
+bind_account_phone_not_exist=보세 휴대 전화 번호가 없습니다.
+bind_account_phone_repeat=중복 휴대폰 번호
+bind_account_phone_not_register=휴대폰 번호 미등록
+email_format_error=올바른 이메일 주소를 입력하세요.
+bind_account_other_email_error=다른 사서함을 바인딩할 수 없음
+bind_account_email_exist=이메일을 바인딩했습니다.
+bind_account_email_other_bind_error=이 사서함은 다른 사람이 바인딩했습니다.
+email_code_valid_error=이메일 인증 코드를 다시 받으세요.
+verify_code_error=캡차 오류
+phone_code_valid_error=휴대폰 인증 코드를 다시 받으세요.
+bind_account_email_change_self_error=로그인 이메일을 변경할 수 없습니다.
+bind_account_email_not_exist=이메일 주소에 구속되지 않습니다.
+bind_account_email_repeat=사서함 복제
+bind_account_email_not_register=이메일 미등록
+verify_code_send_error=인증 코드 전송 오류
+verify_code_validity=획득한 보안 문자는 무효화되지 않습니다.
+login_code_expired=로그인 정보가 유효하지 않습니다. 다시 로그인해 주세요.
+auth_error=승인 예외, 다시 승인해 주세요.
+distribute_apply_money_account_error=정확한 계정 정보를 입력하세요.
+distribute_apply_money_usdt_address_error=올바른 지갑 주소를 입력하세요.
+distribute_apply_money_remark_length_error=댓글이 과도합니다.
+distribute_apply_money_thresholds_error=현금 인출 기준을 충족하지 못함
+language_error=언어 오류
+goods_nt=플랫폼이 존재하지 않습니다.
+get_ticket_error=티켓 예외 사항은 고객 서비스에 문의하시기 바랍니다.
+goods_status_down=이 제품은 품절되었습니다.
+user_black_error=비정상적인 사용자 행동, 협박당함
+sku_price_error=상품 가격 이상 징후
+dp_one_goods_pay_error=오퍼는 하나의 품목에만 추가할 수 있습니다.
+user_balance_not_enough=사용자 플랫폼에 대한 자금 부족
+order_noPayment_error=미결제 주문이 있습니다.
+sys_busy_error=시스템이 사용 중입니다. 나중에 다시 시도하세요.
+order_nt=사용자 주문이 없습니다.
+order_error=사용자 주문 오류
+coupon_used_error=사용한 쿠폰
+coupon_code_used_error=할인 코드가 사용되었습니다.
+coupon_coupon_code_error=쿠폰과 프로모션 코드는 서로 함께 사용할 수 없습니다.
+ex_code_error=교환 코드 오류
+ex_code_success=상환 성공
+ex_code_used=이 교환 코드는 이미 사용되었습니다.
+login=로그인
+parking_space_is_occupied=이 주차 공간은 이미 사용 중입니다.
+parking_space_not_exist=이 주차장은 존재하지 않습니다.
+ticket_unsupported_renew_error=갱신은 지원되지 않습니다.
+account_not_set_unsupport_renew_error=계정이 구성되어 있지 않아 갱신할 수 없습니다.
+ticket_netflix_season_renew_error=갱신 시 동일한 사양 선택
+ticket_netflix_year_renew_error=갱신 시 동일한 사양 선택
+ticket_same_renew_error=갱신 시 동일한 사양 선택
+order_renew_ticket_noPayment_error=이 항공권에 대한 미결제 갱신 주문이 있습니다...
+work_order_already_submitted_error=이미 이 티켓 작업 주문을 제출하셨습니다.
+picture_more_error=너무 많은 사진
+question_content_more_error=문제에 대한 설명이 너무 많음
+topic_more_error=제목이 너무 긴 경우
+required_info_error=필수 정보를 입력하세요.

+ 115 - 0
netflix-web/src/main/resources/i18n/yhlx_zh_CN.properties

@@ -0,0 +1,115 @@
+coupon_code_own_use_error=不可以使用自己的优惠码
+receive_success=领取成功
+default_msg=系统异常
+popularize_link_nt=该链接不存在!
+ex_code_error=兑换码错误
+ex_code_success=兑换成功
+ex_code_used=该兑换码已使用
+login=登录
+params_error=请输入正确的信息
+parking_space_is_occupied=该车位已有人
+parking_space_not_exist=该车位不存在
+sys_error=系统错误,请刷新重试
+sku_nt=该规格不存在
+coupon_invalid=该优惠券已失效
+coupon_expired=该优惠券已过期
+coupon_not_effective=该优惠券未生效
+coupon_not_exist=该优惠券不存在
+coupon_new_user_receive=新用户可领取该优惠券
+coupon_receive_num=该优惠券已领取完
+coupon_has_received=您已领取该优惠券
+coupon_receive_success=领取成功
+coupon_code_not_exist=该优惠码不存在
+coupon_code_new_user_error=该优惠码只适用于新用户
+coupon_code_only_order_error=该优惠码仅下单时可用
+coupon_code_only_renew_order_error=该优惠码仅续费时可用
+coupon_code_not_effective_error=该优惠码未生效
+coupon_code_expired_error=该优惠码已失效
+coupon_code_popularize_repeat_use_error=您已使用其他人推广码
+coupon_sku_not_available_error=不能用于该规格
+coupon_reduce_money_not_available_error=未满足满减金额
+coupon_only_order_error=仅下单时可用
+coupon_only_renew_error=仅续费时可用
+order_buy_now_notify=点击购买立即上车
+minute=分钟
+hour=小时
+minutes=分钟
+hours=小时
+order_pre_buy_it=前有人购买
+account_auth_not_enable=未开启双重验证
+account_auth_code_times_limit=获取次数上限
+account_not_set=未配置账号
+account_auth_code_error=获取双重验证码错误,请联系客服
+account_auth_code_reacuire_error=请重新获取双重验证码
+questionnaire_has_expired_error=问卷已结束
+questionnaire_answer_all_questions_error=请回答所有问题
+task_lucky_draw_prize_not_configured=暂时未配置奖品
+task_luck_draw_prize_not_exist=该中奖奖品不存在
+task_luck_draw_prize_has_received=您已领取该中奖奖品
+click_button_repeatedly=请勿重复点击按钮
+task_not_exist=该任务不存在
+task_not_finish=该任务未完成
+task_prize_has_received=您已领取该任务奖励
+task_follow_record__not_exist_error=该提交记录不存在
+task_follow_record_verify_success=您提交的记录已审核成功
+task_luck_draw_lottery_points_error=积分不足
+task_lucky_draw_specific_not_configured=暂未配置特定奖品
+task_lucky_draw_lottery_num_error=抽奖次数为0
+address_choose_error=请添加收货地址.
+sign_success=签到成功
+bind_success=绑定成功
+change_success=更换成功
+submit_success=提交成功
+phone_format_error=请输入正确的手机号
+bind_account_other_phone_error=您通过手机号登录,无法绑定其他手机号
+bind_account_phone_exits=您已绑定手机号
+bind_account_phone_other_bind_error=该手机号已被绑定
+bind_account_phone_change_self_error=无法修改自己登录手机号
+bind_account_phone_not_exist=您未绑定手机号
+bind_account_phone_repeat=手机号重复
+bind_account_phone_not_register=手机号未注册
+email_format_error=请输入正确的邮箱
+bind_account_other_email_error=您通过邮箱登录,无法绑定其他邮箱
+bind_account_email_exist=您已绑定邮箱
+bind_account_email_other_bind_error=该邮箱已被绑定
+email_code_valid_error=请重新获取邮箱验证码
+verify_code_error=验证码错误
+phone_code_valid_error=请重新获取手机验证码
+bind_account_email_change_self_error=无法修改自己登录邮箱
+bind_account_email_not_exist=您未绑定邮箱
+bind_account_email_repeat=邮箱重复
+bind_account_email_not_register=邮箱未注册
+verify_code_send_error=发送验证码错误
+verify_code_validity=获取的验证码未失效
+login_code_expired=登录信息失效,请重新登录
+auth_error=授权异常,请重新授权
+distribute_apply_money_account_error=请输入正确的账户信息
+distribute_apply_money_usdt_address_error=请输入正确的钱包地址
+distribute_apply_money_remark_length_error=备注内容过多
+distribute_apply_money_thresholds_error=未到提现金额门槛,无法提现
+language_error=语言错误
+goods_nt=该平台不存在
+get_ticket_error=获取车票异常,请联系客服
+goods_status_down=该商品已下架
+user_black_error=用户行为异常,已被拉黑
+sku_price_error=商品价格异常
+dp_one_goods_pay_error=暂只支持优惠加购一件商品
+user_balance_not_enough=余额不足!
+order_noPayment_error=您有未支付订单.
+sys_busy_error=系统繁忙,请稍后重试
+order_nt=订单不存在
+order_error=订单异常
+coupon_used_error=优惠券已使用
+coupon_code_used_error=优惠码已使用
+coupon_coupon_code_error=优惠券与优惠码不可同时使用
+ticket_unsupported_renew_error=不支持续费
+account_not_set_unsupport_renew_error=亲,该车次还未发车,需等待客服发车才能续费哦.
+ticket_netflix_season_renew_error=奈飞季付车票只能续费季付
+ticket_netflix_year_renew_error=奈飞年付车票只能续费年付
+ticket_same_renew_error=请选择对应规格的车票续费
+order_renew_ticket_noPayment_error=您有该车票未支付的续费订单..
+work_order_already_submitted_error=您已提交过该车票工单
+picture_more_error=图片过多
+question_content_more_error=问题描述过多
+topic_more_error=标题过长
+required_info_error=请输入必填信息

+ 115 - 0
netflix-web/src/main/resources/i18n/yhlx_zh_HK.properties

@@ -0,0 +1,115 @@
+coupon_code_own_use_error=不可以使用自己的優惠碼
+receive_success=領取成功
+default_msg=系統异常
+popularize_link_nt=該鏈接不存在!
+sys_error=系統錯誤,請刷新重試
+sku_nt=該規格不存在
+coupon_invalid=該優惠券已失效
+coupon_expired=This coupon has expired
+coupon_not_effective=該優惠券未生效
+coupon_not_exist=該優惠券不存在
+coupon_new_user_receive=新用戶可領取該優惠券
+coupon_receive_num=該優惠券已領取完
+coupon_has_received=您已領取該優惠券
+coupon_receive_success=領取成功
+coupon_code_not_exist=該優惠碼不存在
+coupon_code_new_user_error=該優惠碼只適用于新用戶
+coupon_code_only_order_error=該優惠碼僅下單時可用
+coupon_code_only_renew_order_error=該優惠碼僅續費時可用
+coupon_code_not_effective_error=該優惠碼未生效
+coupon_code_expired_error=該優惠碼已失效
+coupon_code_popularize_repeat_use_error=您已使用其他人推廣碼
+coupon_sku_not_available_error=不能用于該規格
+coupon_reduce_money_not_available_error=未滿足滿減金額
+coupon_only_order_error=僅下單時可用
+coupon_only_renew_error=僅續費時可用
+order_buy_now_notify=點擊購買立即上車
+minute=分鍾
+hour=小時
+minutes=分鍾
+hours=小時
+order_pre_buy_it=前有人購買
+params_error=請輸入正確的信息
+account_auth_not_enable=未開啓雙重驗證
+account_auth_code_times_limit=獲取次數上限
+account_not_set=未配置賬號
+account_auth_code_error=獲取雙重驗證碼錯誤,請聯系客服
+account_auth_code_reacuire_error=請重新獲取雙重驗證碼
+questionnaire_has_expired_error=問卷已結束
+questionnaire_answer_all_questions_error=請回答所有問題
+task_lucky_draw_prize_not_configured=暫時未配置獎品
+task_luck_draw_prize_not_exist=該中獎獎品不存在
+task_luck_draw_prize_has_received=您已領取該中獎獎品
+click_button_repeatedly=請勿重複點擊按鈕
+task_not_exist=該任務不存在
+task_not_finish=該任務未完成
+task_prize_has_received=您已領取該任務獎勵
+task_follow_record__not_exist_error=該提交記錄不存在
+task_follow_record_verify_success=您提交的記錄已審核成功
+task_luck_draw_lottery_points_error=積分不足
+task_lucky_draw_specific_not_configured=暫未配置特定獎品
+task_lucky_draw_lottery_num_error=抽獎次數爲0
+address_choose_error=請添加收貨地址.
+sign_success=簽到成功
+bind_success=綁定成功
+change_success=更換成功
+submit_success=提交成功
+phone_format_error=請輸入正確的手機號
+bind_account_other_phone_error=您通過手機號登錄,無法綁定其他手機號
+bind_account_phone_exits=您已綁定手機號
+bind_account_phone_other_bind_error=該手機號已被綁定
+bind_account_phone_change_self_error=無法修改自己登錄手機號
+bind_account_phone_not_exist=您未綁定手機號
+bind_account_phone_repeat=手機號重複
+bind_account_phone_not_register=手機號未注冊
+email_format_error=請輸入正確的郵箱
+bind_account_other_email_error=您通過郵箱登錄,無法綁定其他郵箱
+bind_account_email_exist=您已綁定郵箱
+bind_account_email_other_bind_error=該郵箱已被綁定
+email_code_valid_error=請重新獲取郵箱驗證碼
+verify_code_error=驗證碼錯誤
+phone_code_valid_error=請重新獲取手機驗證碼
+bind_account_email_change_self_error=無法修改自己登錄郵箱
+bind_account_email_not_exist=您未綁定郵箱
+bind_account_email_repeat=郵箱重複
+bind_account_email_not_register=郵箱未注冊
+verify_code_send_error=發送驗證碼錯誤
+verify_code_validity=獲取的驗證碼未失效
+login_code_expired=登錄信息失效,請重新登錄
+auth_error=授權異常,請重新授權
+distribute_apply_money_account_error=請輸入正確的賬戶信息
+distribute_apply_money_usdt_address_error=請輸入正確的錢包地址
+distribute_apply_money_remark_length_error=備注內容過多
+distribute_apply_money_thresholds_error=未到提現金額門檻,無法提現
+language_error=語言錯誤
+goods_nt=該平台不存在
+get_ticket_error=获取车票异常,请联系客服
+goods_status_down=該商品已下架
+user_black_error=用戶行爲異常,已被拉黑
+sku_price_error=商品價格異常
+dp_one_goods_pay_error=暫只支持優惠加購壹件商品
+user_balance_not_enough=余額不足!
+order_noPayment_error=您有未支付訂單.
+sys_busy_error=系統繁忙,請稍後重試
+order_nt=訂單不存在
+order_error=訂單異常
+coupon_used_error=優惠券已使用
+coupon_code_used_error=優惠碼已使用
+coupon_coupon_code_error=優惠券與優惠碼不可同時使用
+ex_code_error=兌換碼錯誤
+ex_code_success=兌換成功
+ex_code_used=該兌換碼已使用
+login=登錄
+parking_space_is_occupied=該車位已有人
+parking_space_not_exist=該車位不存在
+ticket_unsupported_renew_error=不支持續費
+account_not_set_unsupport_renew_error=親,該車次還未發車,需等待客服發車才能續費哦.
+ticket_netflix_season_renew_error=奈飛季付車票只能續費季付
+ticket_netflix_year_renew_error=奈飛年付車票只能續費年付
+ticket_same_renew_error=請選擇對應規格的車票續費
+order_renew_ticket_noPayment_error=您有該車票未支付的續費訂單..
+work_order_already_submitted_error=您已提交過該車票工單
+picture_more_error=圖片過多
+question_content_more_error=問題描述過多
+topic_more_error=標題過長
+required_info_error=請輸入必填信息

+ 33 - 21
pom.xml

@@ -97,6 +97,18 @@
             <version>22.1.0</version>
         </dependency>
 
+        <dependency>
+            <groupId>com.google.api-client</groupId>
+            <artifactId>google-api-client</artifactId>
+            <version>2.2.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.google.auth</groupId>
+            <artifactId>google-auth-library-oauth2-http</artifactId>
+            <version>1.19.0</version>
+        </dependency>
+
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-actuator</artifactId>
@@ -113,16 +125,16 @@
             <groupId>com.alibaba</groupId>
             <artifactId>easyexcel</artifactId>
             <version>2.0.5</version>
-<!--            <exclusions>-->
-<!--                <exclusion>-->
-<!--                    <groupId>okhttp</groupId>-->
-<!--                    <artifactId>com.squareup.okhttp3</artifactId>-->
-<!--                </exclusion>-->
-<!--                <exclusion>-->
-<!--                    <groupId>com.alibaba</groupId>-->
-<!--                    <artifactId>fastjson</artifactId>-->
-<!--                </exclusion>-->
-<!--            </exclusions>-->
+            <!--            <exclusions>-->
+            <!--                <exclusion>-->
+            <!--                    <groupId>okhttp</groupId>-->
+            <!--                    <artifactId>com.squareup.okhttp3</artifactId>-->
+            <!--                </exclusion>-->
+            <!--                <exclusion>-->
+            <!--                    <groupId>com.alibaba</groupId>-->
+            <!--                    <artifactId>fastjson</artifactId>-->
+            <!--                </exclusion>-->
+            <!--            </exclusions>-->
         </dependency>
 
         <!-- 提供redis连接池 -->
@@ -142,16 +154,16 @@
             <version>3.8.0</version>
         </dependency>
 
-<!--        <dependency>-->
-<!--            <groupId>org.apache.httpcomponents</groupId>-->
-<!--            <artifactId>fluent-hc</artifactId>-->
-<!--            <version>4.5.6</version>-->
-<!--        </dependency>-->
-<!--        <dependency>-->
-<!--            <groupId>com.squareup.okhttp3</groupId>-->
-<!--            <artifactId>okhttp</artifactId>-->
-<!--            <version>4.5.0</version>-->
-<!--        </dependency>-->
+        <!--        <dependency>-->
+        <!--            <groupId>org.apache.httpcomponents</groupId>-->
+        <!--            <artifactId>fluent-hc</artifactId>-->
+        <!--            <version>4.5.6</version>-->
+        <!--        </dependency>-->
+        <!--        <dependency>-->
+        <!--            <groupId>com.squareup.okhttp3</groupId>-->
+        <!--            <artifactId>okhttp</artifactId>-->
+        <!--            <version>4.5.0</version>-->
+        <!--        </dependency>-->
 
     </dependencies>
 
@@ -184,7 +196,7 @@
         </resources>
 
 
-        <finalName>netflix</finalName>
+        <finalName>netflix-abroad</finalName>
     </build>
 
     <!-- profiles配置 -->

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä