Explorar el Código

Merge branch 'dev/2024/1101/update-app-Y' of feifan/mall-backend-app into master

更新商户的添加,和添加商户上架员,去掉廖总的环节
Yangzw hace 1 mes
padre
commit
050f3e46d1
Se han modificado 53 ficheros con 3412 adiciones y 40 borrados
  1. 39 0
      feifan-framework/feifan-common/src/main/java/cn/newfeifan/mall/framework/common/exception/util/I18nUtil.java
  2. 40 0
      feifan-framework/feifan-common/src/main/java/cn/newfeifan/mall/framework/common/exception/util/ResultVo.java
  3. 15 2
      feifan-framework/feifan-common/src/main/java/cn/newfeifan/mall/framework/common/exception/util/ServiceExceptionUtil.java
  4. 491 0
      feifan-framework/feifan-common/src/main/resources/i18n/messages.properties
  5. 491 0
      feifan-framework/feifan-common/src/main/resources/i18n/messages_en.properties
  6. 491 0
      feifan-framework/feifan-common/src/main/resources/i18n/messages_fr_FR.properties
  7. 491 0
      feifan-framework/feifan-common/src/main/resources/i18n/messages_ko_KR.properties
  8. 1 1
      feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/enums/ErrorCodeConstants.java
  9. 4 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/orderpercentage/OrderPercentageDO.java
  10. 11 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/consumptiontransferlog/ConsumptionTransferLogServiceImpl.java
  11. 14 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/usertopupconsumptionpointsorder/UserTopUpConsumptionPointsOrderServiceImpl.java
  12. 1 0
      feifan-module-mall/feifan-module-sale-api/src/main/java/cn/newfeifan/mall/module/sale/enums/ErrorCodeConstants.java
  13. 41 6
      feifan-module-mall/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/module/sale/service/merchantapply/MerchantApplyServiceImpl.java
  14. 30 1
      feifan-module-mall/feifan-module-trade-api/src/main/java/cn/newfeifan/mall/module/trade/api/wechat/WcChatMessageUtilsApi.java
  15. 2 0
      feifan-module-mall/feifan-module-trade-api/src/main/java/cn/newfeifan/mall/module/trade/enums/ErrorCodeConstants.java
  16. 94 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/jpushmessagelog/JPushMessageLogController.java
  17. 43 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/jpushmessagelog/vo/JPushMessageLogPageReqVO.java
  18. 49 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/jpushmessagelog/vo/JPushMessageLogRespVO.java
  19. 40 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/jpushmessagelog/vo/JPushMessageLogSaveReqVO.java
  20. 57 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/dataobject/jpushmessagelog/JPushMessageLogDO.java
  21. 32 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/mysql/jpushmessagelog/JPushMessageLogMapper.java
  22. 48 2
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/aftersale/AfterSaleServiceImpl.java
  23. 53 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/jpushmessagelog/JPushMessageLogService.java
  24. 70 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/jpushmessagelog/JPushMessageLogServiceImpl.java
  25. 47 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderUpdateServiceImpl.java
  26. 222 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/utils/push/JPushUtils.java
  27. 34 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/utils/push/pojo/Callback.java
  28. 33 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/utils/push/pojo/Message.java
  29. 64 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/utils/push/pojo/NotificationData.java
  30. 90 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/utils/push/pojo/Options.java
  31. 56 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/utils/push/pojo/RequestBody.java
  32. 20 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/utils/wechat/WcChatMessageUtilsApiImpl.java
  33. 12 0
      feifan-module-mall/feifan-module-trade-biz/src/main/resources/mapper/jpushmessagelog/JPushMessageLogMapper.xml
  34. 8 0
      feifan-module-member/feifan-module-member-api/src/main/java/cn/newfeifan/mall/module/member/api/user/MemberUserApi.java
  35. 5 0
      feifan-module-member/feifan-module-member-api/src/main/java/cn/newfeifan/mall/module/member/api/user/dto/MemberUserRespDTO.java
  36. 21 0
      feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/api/user/MemberUserApiImpl.java
  37. 2 0
      feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/controller/admin/user/vo/MemberUserBaseVO.java
  38. 7 0
      feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/controller/app/user/vo/AppMemberUserInfoRespVO.java
  39. 2 0
      feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/controller/app/user/vo/AppMemberUserUpdateReqVO.java
  40. 8 0
      feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/dal/dataobject/user/MemberUserDO.java
  41. 15 0
      feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/service/user/MemberUserService.java
  42. 49 12
      feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/service/user/MemberUserServiceImpl.java
  43. 9 0
      feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/controller/app/order/AppPayOrderController.java
  44. 1 1
      feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/service/channel/PayChannelService.java
  45. 2 6
      feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/service/channel/PayChannelServiceImpl.java
  46. 9 0
      feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/service/order/PayOrderService.java
  47. 12 2
      feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/service/order/PayOrderServiceImpl.java
  48. 11 0
      feifan-module-system/feifan-module-system-api/src/main/java/cn/newfeifan/mall/module/system/api/sms/dto/code/SmsCodeSendReqDTO.java
  49. 1 1
      feifan-module-system/feifan-module-system-api/src/main/java/cn/newfeifan/mall/module/system/enums/ErrorCodeConstants.java
  50. 3 0
      feifan-module-system/feifan-module-system-api/src/main/java/cn/newfeifan/mall/module/system/enums/sms/SmsSceneEnum.java
  51. 13 4
      feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/service/sms/SmsCodeServiceImpl.java
  52. 4 1
      feifan-server/src/main/resources/application-local.yaml
  53. 4 1
      feifan-server/src/main/resources/application-prod.yaml

+ 39 - 0
feifan-framework/feifan-common/src/main/java/cn/newfeifan/mall/framework/common/exception/util/I18nUtil.java

@@ -0,0 +1,39 @@
+package cn.newfeifan.mall.framework.common.exception.util;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.i18n.LocaleContextHolder;
+import org.springframework.context.support.ResourceBundleMessageSource;
+import org.springframework.stereotype.Component;
+
+import java.util.Locale;
+
+@Slf4j
+@Component
+public class I18nUtil {
+
+    public static String getMessage(String code) {
+        return getMessage(code, null);
+    }
+
+    public static String getMessage(String code, Object[] args) {
+        return getMessage(code, args, "");
+    }
+
+    public static String getMessage(String code, Object[] args, String defaultMessage) {
+
+        Locale locale = LocaleContextHolder.getLocale();
+        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
+        messageSource.setBasename("i18n/messages");
+        messageSource.setDefaultEncoding("UTF-8"); // 设置默认编码为 UTF-8
+        String content;
+        try{
+            content = messageSource.getMessage(code, args, locale);
+        }catch (Exception e){
+            log.info("获取提示消息失败: ->",e);
+            content = defaultMessage;
+        }
+        return content;
+
+    }
+
+}

+ 40 - 0
feifan-framework/feifan-common/src/main/java/cn/newfeifan/mall/framework/common/exception/util/ResultVo.java

@@ -0,0 +1,40 @@
+package cn.newfeifan.mall.framework.common.exception.util;
+
+import lombok.Getter;
+
+@Getter
+public class ResultVo<T> {
+
+    private  String  code;
+
+    private String msg;
+
+    private T data;
+
+    private String  createTime ;
+
+    private  ResultVo(String code){
+        this.code = code;
+        setCode(code);
+    }
+
+    public void setCode(String code) {
+        String message = null;
+        try {
+            message =I18nUtil.getMessage(code);
+        }catch (Exception e){
+            message = code;
+        }
+        this.code = code;
+        this.msg = message;
+    }
+
+    public static<T> ResultVo<T> OK(){
+        return new ResultVo<T>("SUCCESS");
+    }
+
+    public static<T> ResultVo<T> faild(String code){
+        return new ResultVo<T>(code);
+    }
+
+}

+ 15 - 2
feifan-framework/feifan-common/src/main/java/cn/newfeifan/mall/framework/common/exception/util/ServiceExceptionUtil.java

@@ -46,12 +46,25 @@ public class ServiceExceptionUtil {
     // ========== 和 ServiceException 的集成 ==========
 
     public static ServiceException exception(ErrorCode errorCode) {
-        String messagePattern = MESSAGES.getOrDefault(errorCode.getCode(), errorCode.getMsg());
+        String message = getMessage(errorCode);
+        String messagePattern = MESSAGES.getOrDefault(errorCode.getCode(), message);
         return exception0(errorCode.getCode(), messagePattern);
     }
 
+    private static String getMessage(ErrorCode errorCode) {
+        ResultVo<Object> faild = ResultVo.faild(errorCode.getCode().toString());
+        String message;
+        if(faild.getMsg() == null){
+            message = errorCode.getMsg();
+        }else{
+            message = faild.getMsg();
+        }
+        return message;
+    }
+
     public static ServiceException exception(ErrorCode errorCode, Object... params) {
-        String messagePattern = MESSAGES.getOrDefault(errorCode.getCode(), errorCode.getMsg());
+        String message = getMessage(errorCode);
+        String messagePattern = MESSAGES.getOrDefault(errorCode.getCode(), message);
         return exception0(errorCode.getCode(), messagePattern, params);
     }
 

+ 491 - 0
feifan-framework/feifan-common/src/main/resources/i18n/messages.properties

@@ -0,0 +1,491 @@
+1002030000=分销路径不存在
+1002030001=身价不存在
+1002030002=分销来源不存在
+1002030003=积分表不存在
+1002030004=计算不存在
+1002030005=订单计算不存在
+1002030006=兄弟分区不存在
+1002030007=儿子分区不存在
+1002030008=分销用户不存在
+1002030009=分销用户不存在
+1002030010=当前推销人已经存在上级
+1002030011=碰撞分区不存在
+1002030012=平台利润不存在
+1002030013=平台利润日志表不存在
+1002030014=百分比总和超过100
+1002030015=该直推人已经有推荐人, 故不能增加
+1003031001=分享链接不存在
+1003031002=通过分享链接,新注册用户不存在
+1004031001=用户曾经收藏过什么商品的不存在
+1005031001=会员身价变化类别不存在
+1005031002=用户签到日志记录不存在
+1005031003=缓存中没有找到存储的签到获取的身价值
+1005031004=提现申请记录不存在
+1005031005=平台每日提现记录不存在
+1005031006=提现渠道记录不存在
+1002030035=充值消费分记录不存在
+1002030036=消费分变动记录不存在
+1002030037=消费分转让记录不存在
+1002030038=用户充值消费分订单不存在
+1001000001=参数配置不存在
+1001000002=参数配置 key 重复
+1001000003=不能删除类型为系统内置的参数配置
+1001000004=获取参数配置失败,原因:不允许获取不可见配置
+1001001000=定时任务不存在
+1001001001=定时任务的处理器已经存在
+1001001002=只允许修改为开启或者关闭状态
+1001001003=定时任务已经处于该状态,无需修改
+1001001004=只有开启状态的任务,才可以修改
+1001001005=CRON 表达式不正确
+1001002000=API 错误日志不存在
+1001002001=API 错误日志已处理
+1001003000=文件路径已存在
+1001003001=文件不存在
+1001003002=文件为空
+1003001000=表定义已经存在
+1003001001=导入的表不存在
+1003001002=导入的字段不存在
+1003001004=表定义不存在
+1003001005=字段义不存在
+1003001006=同步的字段不存在
+1003001007=同步失败,不存在改变
+1003001008=数据库的表注释未填写
+1003001009=数据库的表字段({})注释未填写
+1003001010=主表(id={})定义不存在,请检查
+1003001011=子表的字段(id={})不存在,请检查
+1003001012=主表生成代码失败,原因:它没有子表
+1003001013=主表生成代码失败,原因:它的子表({})没有字段
+1001006000=文件配置不存在
+1001006001=该文件配置不允许删除,原因:它是主配置,删除会导致无法上传文件
+1001007000=数据源配置不存在
+1001007001=数据源配置不正确,无法进行连接
+1001107000=学生不存在
+1001201000=示例联系人不存在
+1001201001=示例分类不存在
+1001201002=存在存在子示例分类,无法删除
+1001201003=父级示例分类不存在
+1001201004=不能设置自己为父示例分类
+1001201005=已经存在该名字的示例分类
+1001201006=不能设置自己的子示例分类为父示例分类
+1001201007=学生不存在
+1001201008=学生班级不存在
+1001201009=学生班级已存在
+1001201010=url中的域名非指定域名
+1008001000=商品分类不存在
+1008001001=父分类不存在
+1008001002=父分类不能是二级分类
+1008001003=存在子分类,无法删除
+1008001004=商品分类({})已禁用,无法使用
+1008001005=类别下存在商品,无法删除
+1008002000=品牌不存在
+1008002001=品牌已禁用
+1008002002=品牌名称已存在
+1008003000=属性项不存在
+1008003001=属性项的名称已存在
+1008003002=属性项下存在属性值,无法删除
+1008004000=属性值不存在
+1008004001=属性值的名称已存在
+1008005000=商品 SPU 不存在
+1008005001=商品分类不正确,原因:必须使用第二级的商品分类及以下
+1008005002=商品 SPU 保存失败,原因:优惠卷不存在
+1008005003=商品 SPU【{}】不处于上架状态
+1008005004=商品 SPU 不处于回收站状态
+1008006000=商品 SKU 不存在
+1008006001=商品 SKU 的属性组合存在重复
+1008006002=一个 SPU 下的每个 SKU,其属性项必须一致
+1008006003=一个 SPU 下的每个 SKU,必须不重复
+1008006004=商品 SKU 库存不足
+1008007000=商品评价不存在
+1008007001=订单的商品评价已存在
+1008008000=该商品已经被收藏
+1008008001=商品收藏不存在
+1013001000=限时折扣活动不存在
+1013001001=存在商品参加了其它限时折扣活动
+1013001002=限时折扣活动已关闭,不能修改
+1013001003=限时折扣活动未关闭,不能删除
+1013001004=限时折扣活动已关闭,不能重复关闭
+1013002000=Banner 不存在
+1013003000=优惠劵没有可使用的商品!
+1013003001=所结算的商品中未满足使用的金额
+1013004000=优惠劵模板不存在
+1013004001=发放数量不能小于已领取数量({})
+1013004002=当前剩余数量不够领取
+1013004003=用户已领取过此优惠券
+1013004004=优惠券已过期
+1013004005=领取方式不正确
+1013005000=优惠券不存在
+1013005001=回收优惠劵失败,优惠劵已被使用
+1013005002=优惠劵不处于待使用状态
+1013005003=优惠券不在使用时间范围内
+1013005004=优惠劵不是已使用状态
+1013006000=满减送活动不存在
+1013006001=存在商品参加了其它满减送活动
+1013006002=满减送活动已关闭,不能修改
+1013006003=满减送活动未关闭,不能删除
+1013006004=满减送活动已关闭,不能重复关闭
+1013006005=满减送活动已结束,不能关闭
+1013008000=秒杀活动不存在
+1013008002=存在商品参加了其它秒杀活动,秒杀时段冲突
+1013008003=秒杀活动已关闭,不能修改
+1013008004=秒杀活动未关闭或未结束,不能删除
+1013008005=秒杀活动已关闭,不能重复关闭
+1013008006=秒杀失败,原因:秒杀库存不足
+1013008007=秒杀失败,原因:不在活动时间范围内
+1013008008=秒杀失败,原因:秒杀活动已关闭
+1013008009=秒杀失败,原因:单次限购超出
+1013008010=秒杀失败,原因:商品不存在
+1013009000=秒杀时段不存在
+1013009001=秒杀时段冲突
+1013009004=秒杀时段已关闭
+1013010000=拼团活动不存在
+1013010001=存在商品参加了其它拼团活动
+1013010002=拼团活动已关闭不能修改
+1013010003=拼团活动未关闭或未结束,不能删除
+1013010004=拼团失败,原因:拼团活动已关闭
+1013010005=拼团失败,原因:拼团活动商品不存在
+1013010006=拼团失败,原因:拼团活动商品库存不足
+1013011000=拼团不存在
+1013011001=拼团失败,已参与过该拼团
+1013011002=拼团失败,父拼团不存在
+1013011003=拼团失败,拼团人数已满
+1013011004=拼团失败,原因:存在该活动正在进行的拼团记录
+1013011005=拼团失败,活动未开始
+1013011006=拼团失败,活动已经结束
+1013011007=拼团失败,原因:单次限购超出
+1013011008=拼团失败,原因:超出总购买次数
+1013011009=拼团失败,原因:存在未支付订单,请先支付
+1013012000=砍价活动不存在
+1013012001=存在商品参加了其它砍价活动
+1013012002=砍价活动已关闭,不能修改
+1013012003=砍价活动未关闭或未结束,不能删除
+1013012004=砍价活动库存不足
+1013012005=砍价活动已关闭
+1013012006=砍价活动已经结束
+1013013000=砍价记录不存在
+1013013001=参与失败,您已经参与当前砍价活动
+1013013002=参与失败,您已达到当前砍价活动的参与上限
+1013013004=下单失败,砍价未成功
+1013013005=下单失败,该砍价已经下单
+1013014000=助力失败,砍价记录不处于进行中
+1013014001=助力失败,不能助力自己
+1013014002=助力失败,您已达到当前砍价活动的助力上限
+1013014003=助力失败,请重试
+1013014004=助力失败,您已经助力过了
+1013015000=文章分类不存在
+1013015001=文章分类删除失败,存在关联文章
+1013016000=文章不存在
+1013017000=装修模板不存在
+1013017001=装修模板名称({})已经被使用
+1013017002=不能删除正在使用的装修模板
+1013018000=装修页面不存在
+1013018001=装修页面名称({})已经被使用
+1101001001=店铺不存在
+1002029003=商户申请不存在
+1002029004=商户申请记录不存在
+1002029005=用户还不是代理商
+1011000010=交易订单项不存在
+1011000011=交易订单不存在
+1011000012=交易订单项更新售后状态失败,请重试
+1011000013=交易订单更新支付状态失败,订单不是【未支付】状态
+1011000014=交易订单更新支付状态失败,支付单编号不匹配
+1011000015=交易订单更新支付状态失败,支付单状态不是【支付成功】状态
+1011000016=交易订单更新支付状态失败,支付单金额不匹配
+1011000017=交易订单发货失败,订单不是【待发货】状态
+1011000018=交易订单收货失败,订单不是【待收货】状态
+1011000019=创建交易订单项的评价失败,订单不是【已完成】状态
+1011000020=创建交易订单项的评价失败,订单已评价
+1011000021=交易订单发货失败,订单已退款或部分退款
+1011000022=交易订单发货失败,拼团未成功
+1011000023=交易订单发货失败,砍价未成功
+1011000024=交易订单发货失败,发货类型不是快递
+1011000025=交易订单取消失败,订单不是【待支付】状态
+1011000026=支付订单调价失败,原因:支付订单已付款,不能调价
+1011000027=支付订单调价失败,原因:已经修改过价格
+1011000028=支付订单调价失败,原因:调整后支付价格不能小于 0.01 元
+1011000029=交易订单删除失败,订单不是【已取消】状态
+1011000030=交易订单自提失败,收货方式不是【用户自提】
+1011000031=交易订单修改收货地址失败,原因:订单不是【待发货】状态
+1011000032=交易订单创建失败,原因:存在未付款订单
+1011000100=售后单不存在
+1011000101=申请退款金额错误
+1011000102=订单已关闭,无法申请售后
+1011000103=订单未支付,无法申请售后
+1011000104=订单未发货,无法申请【退货退款】售后
+1011000105=订单项已申请售后,无法重复申请
+1011000106=审批失败,售后状态不处于审批中
+1011000107=操作售后单失败,请刷新后重试
+1011000108=退货失败,售后单状态不处于【待买家退货】
+1011000109=确认收货失败,售后单状态不处于【待确认收货】
+1011000110=退款失败,售后单状态不是【待退款】
+1011000111=取消售后单失败,售后单状态不是【待审核】或【卖家同意】或【商家待收货】
+1011002000=购物车项不存在
+1011003000=支付价格计算异常,原因:价格小于等于 0
+1011003002=计算快递运费异常,找不到对应的运费模板
+1011003004=参与秒杀、拼团、砍价的营销商品,无法使用优惠劵
+1011003005=参与秒杀的商品,超过了秒杀总限购数量
+1011004000=快递公司不存在
+1011004001=已经存在该编码的快递公司
+1011004002=需要接入快递服务商,比如【快递100】
+1011004003=快递公司未启用
+1011004101=快递查询接口异常
+1011004102=快递查询返回失败,原因:{}
+1011005000=已经存在该运费模板名
+1011005001=运费模板不存在
+1011006000=自提门店不存在
+1011007000=分销用户不存在
+1011007001=用户冻结佣金({})数量不足
+1011007002=不能绑定自己
+1011007003=绑定用户没有推广资格
+1011007004=仅可在后台绑定推广员
+1011007005=只有在注册时可以绑定
+1011007006=已绑定了推广人
+1011007007=下级不能绑定自己的上级
+1011007008=目前只支持 level 小于等于 2
+1011008000=佣金提现记录不存在
+1011008001=佣金提现记录状态不是审核中
+1011008002=提现金额不能低于 {} 元
+1011008003=您当前最多可提现 {} 元
+1011008004=微信模板消息日志不存在
+1011008005=钱包积分不够支付
+1011008006=钱包消费分不够支付
+1011008011=极光推送消息日志不存在
+1004001000=用户不存在
+1004001001=手机号未注册用户
+1004001002=修改手机失败,该手机号({})已经被使用
+1004001003=用户积分余额不足
+1004001004=输入的手机号不正常
+1004003000=登录失败,用户名或密码不正确
+1004003001=登录失败,账号被禁用
+1004003005=登录失败,解析不到三方登录信息
+1004003006=登录失败,查询不到此用户
+1004003007=手机号已经被使用
+1004004000=用户收件地址不存在
+1004006000=用户标签不存在
+1004006001=用户标签已经存在
+1004006002=用户标签下存在用户,无法删除
+1004008000=用户积分记录业务类型不支持
+1004009000=签到天数规则不存在
+1004009001=签到天数规则已存在
+1004010000=今日已签到,请勿重复签到
+1004011000=用户等级不存在
+1004011001=用户等级名称[{}]已被使用
+1004011002=用户等级值[{}]已被[{}]使用
+1004011003=升级经验必须大于上一个等级[{}]设置的升级经验[{}]
+1004011004=升级经验必须小于下一个等级[{}]设置的升级经验[{}]
+1004011005=用户等级下存在用户,无法删除
+1004011201=用户经验业务类型不支持
+1004012000=用户分组不存在
+1004012001=用户分组下存在用户,无法删除
+1004012003=此用户名已经存在,请换一个!
+1004012004=此手机号已经达到绑定的上限了
+1004012102=此微信号已经到达绑定的上限了
+1004012005=只能通过分享注册
+1004012006=本次注册账号失败,请退出当前页面重新扫描分享二维码注册
+1004012007=跳转失败,会员用户没有绑定系统用户
+1006000000=公众号账号不存在
+1006000001=生成公众号二维码失败,原因:{}
+1006000002=清空公众号的 API 配额失败,原因:{}
+1006001000=获取粉丝增减数据失败,原因:{}
+1006001001=获得粉丝累计数据失败,原因:{}
+1006001002=获得消息发送概况数据失败,原因:{}
+1006001003=获得接口分析数据失败,原因:{}
+1006002000=标签不存在
+1006002001=创建标签失败,原因:{}
+1006002002=更新标签失败,原因:{}
+1006002003=删除标签失败,原因:{}
+1006002004=获得标签失败,原因:{}
+1006003000=粉丝不存在
+1006003001=更新粉丝标签失败,原因:{}
+1006004000=素材不存在
+1006004001=上传素材失败,原因:{}
+1006004002=上传图片失败,原因:{}
+1006004003=删除素材失败,原因:{}
+1006005000=发送消息失败,原因:{}
+1006006000=获得已成功发布列表失败,原因:{}
+1006006001=提交发布失败,原因:{}
+1006006002=删除发布失败,原因:{}
+1006007000=获得草稿列表失败,原因:{}
+1006007001=创建草稿失败,原因:{}
+1006007002=更新草稿失败,原因:{}
+1006007003=删除草稿失败,原因:{}
+1006008000=创建菜单失败,原因:{}
+1006008001=删除菜单失败,原因:{}
+1006009000=自动回复不存在
+1006009001=操作失败,原因:已存在关注时的回复
+1006009002=操作失败,原因:已存在该消息类型的回复
+1006009003=操作失败,原因:已关在该关键字的回复
+1007000000=App 不存在
+1007000002=App 已经被禁用
+1007000003=支付应用存在支付订单,无法删除
+1007000004=支付应用存在退款订单,无法删除
+1007001000=支付渠道的配置不存在
+1007001001=支付渠道已经禁用
+1007001004=已存在相同的渠道
+1007002000=支付订单不存在
+1007002001=支付订单不处于待支付
+1007002002=订单已支付,请刷新页面
+1007002003=支付订单已经过期
+1007002004=发起支付报错,错误码:{},错误提示:{}
+1007002005=支付订单退款失败,原因:状态不是已支付或已退款
+1007003000=支付交易拓展单不存在
+1007003001=支付交易拓展单不处于待支付
+1007003002=订单已支付,请等待支付结果
+1007006000=退款金额超过订单可退款金额
+1007006002=已经有退款在处理中
+1007006003=已经存在退款单
+1007006004=支付退款单不存在
+1007006005=支付退款单不处于待退款
+1007007000=用户钱包不存在
+1007007001=钱包余额不足
+1007007002=未找到对应的钱包交易
+1007007003=已经存在钱包退款
+1007007004=钱包冻结余额不足
+1007008000=钱包充值记录不存在
+1007008001=钱包充值更新支付状态失败,钱包充值记录不是【未支付】状态
+1007008002=钱包充值更新支付状态失败,支付单编号不匹配
+1007008003=钱包充值更新支付状态失败,支付单状态不是【支付成功】状态
+1007008004=钱包充值更新支付状态失败,支付单金额不匹配
+1007008005=钱包发起退款失败,钱包充值订单未支付
+1007008006=钱包发起退款失败,钱包充值订单已退款
+1007008007=钱包发起退款失败,钱包余额不足
+1007008008=钱包退款更新失败,钱包退款单编号不匹配
+1007008009=钱包退款更新失败,退款订单不存在
+1007008010=钱包退款更新失败,退款单金额不匹配
+1007008011=钱包充值套餐不存在
+1007008012=钱包充值套餐已禁用
+1007008013=钱包充值套餐名称已存在
+1007009000=发起转账报错,错误码:{},错误提示:{}
+1007009001=转账单不存在
+1007009002=两次相同转账请求的类型不匹配
+1007009003=两次相同转账请求的金额不匹配
+1007009004=该笔业务的转账已经发起,请查询转账订单相关状态
+1007009005=转账单不处于待转账
+1007009006=转账单不处于待转账或转账中
+1007900000=示例订单不存在
+1007900001=示例订单更新支付状态失败,订单不是【未支付】状态
+1007900002=示例订单更新支付状态失败,支付单编号不匹配
+1007900003=示例订单更新支付状态失败,支付单状态不是【支付成功】状态
+1007900004=示例订单更新支付状态失败,支付单金额不匹配
+1007900005=发起退款失败,示例订单未支付
+1007900006=发起退款失败,示例订单已退款
+1007900007=发起退款失败,退款订单不存在
+1007900008=发起退款失败,退款订单未退款成功
+1007900009=发起退款失败,退款单编号不匹配
+1007900010=发起退款失败,退款单金额不匹配
+1007901001=示例转账单不存在
+1007901002=转账失败,转账单编号不匹配
+1007901003=转账失败,转账单金额不匹配
+1007901004=转账失败,转账单金额不匹配
+1007901005=提交订单失败
+1002000000=登录失败,账号密码不正确
+1002000001=登录失败,账号被禁用
+1002000002=注册请输入用户名 + 手机号校验
+1002000004=code校验失败
+1002000005=验证码不正确,原因:{}
+1002000006=Token 已经过期
+1002000007=手机号不存在
+1002001000=已经存在该名字的菜单
+1002001001=父菜单不存在
+1002001002=不能设置自己为父菜单
+1002001003=菜单不存在
+1002001004=存在子菜单,无法删除
+1002001005=父菜单的类型必须是目录或者菜单
+1002002000=角色不存在
+1002002001=已经存在名为【{}】的角色
+1002002002=已经存在编码为【{}】的角色
+1002002003=不能操作类型为系统内置的角色
+1002002004=名字为【{}】的角色已被禁用
+1002002005=编码【{}】不能使用
+1002003000=用户账号已经存在
+1002003001=手机号已经存在
+1002003002=邮箱已经存在
+1002003003=用户不存在
+1002003004=导入用户数据不能为空!
+1002003005=用户密码校验失败
+1002003006=名字为【{}】的用户已被禁用
+1002003008=创建用户失败,原因:超过租户最大租户配额({})!
+1002004000=已经存在该名字的部门
+1002004001=父级部门不存在
+1002004002=当前部门不存在
+1002004003=存在子部门,无法删除
+1002004004=不能设置自己为父部门
+1002004005=部门中存在员工,无法删除
+1002004006=部门({})不处于开启状态,不允许选择
+1002004007=不能设置自己的子部门为父部门
+1002005000=当前岗位不存在
+1002005001=岗位({}) 不处于开启状态,不允许选择
+1002005002=已经存在该名字的岗位
+1002005003=已经存在该标识的岗位
+1002006001=当前字典类型不存在
+1002006002=字典类型不处于开启状态,不允许选择
+1002006003=已经存在该名字的字典类型
+1002006004=已经存在该类型的字典类型
+1002006005=无法删除,该字典类型还有字典数据
+1002007001=当前字典数据不存在
+1002007002=字典数据({})不处于开启状态,不允许选择
+1002007003=已经存在该值的字典数据
+1002008001=当前通知公告不存在
+1002011000=短信渠道不存在
+1002011001=短信渠道不处于开启状态,不允许选择
+1002011002=无法删除,该短信渠道还有短信模板
+1002012000=短信模板不存在
+1002012001=已经存在编码为【{}】的短信模板
+1002012002=短信 API 模板调用失败,原因是:{}
+1002012003=短信 API 模版无法使用,原因:审批中
+1002012004=短信 API 模版无法使用,原因:审批不通过,{}
+1002012005=短信 API 模版无法使用,原因:模版不存在
+1002013000=手机号不存在
+1002013001=模板参数({})缺失
+1002013002=短信模板不存在
+1002014000=验证码不存在
+1002014001=验证码已过期
+1002014002=验证码已使用
+1002014003=验证码不正确
+1002014004=超过每日短信发送数量
+1002014005=短信发送过于频繁
+1002014006=手机号已被使用
+1002014007=验证码未被使用
+1002015000=租户不存在
+1002015001=名字为【{}】的租户已被禁用
+1002015002=名字为【{}】的租户已过期
+1002015003=系统租户不能进行修改、删除等操作!
+1002015004=名字为【{}】的租户已存在
+1002015005=域名为【{}】的租户已存在
+1002016000=租户套餐不存在
+1002016001=租户正在使用该套餐,请给租户重新设置套餐后再尝试删除
+1002016002=名字为【{}】的租户套餐已被禁用
+1002017000=错误码不存在
+1002017001=已经存在编码为【{}】的错误码
+1002018000=社交授权失败,原因是:{}
+1002018001=社交授权失败,找不到对应的用户
+1002018200=获得手机号失败
+1002018201=社交客户端不存在
+1002018202=社交客户端已存在配置
+1002019000=系统敏感词在所有标签中都不存在
+1002019001=系统敏感词已在标签中存在
+1002020000=OAuth2 客户端不存在
+1002020001=OAuth2 客户端编号已存在
+1002020002=OAuth2 客户端已禁用
+1002020003=不支持该授权类型
+1002020004=授权范围过大
+1002020005=无效 redirect_uri: {}
+1002020006=无效 client_secret: {}
+1002021000=client_id 不匹配
+1002021001=redirect_uri 不匹配
+1002021002=state 不匹配
+1002021003=code 不存在
+1002022000=code 不存在
+1002022001=code 已过期
+1002023000=邮箱账号不存在
+1002023001=无法删除,该邮箱账号还有邮件模板
+1002024000=邮件模版不存在
+1002024001=邮件模版 code({}) 已存在
+1002025000=模板参数({})缺失
+1002025001=邮箱不存在
+1002026000=站内信模版不存在
+1002026001=已经存在编码为【{}】的站内信模板
+1002028000=模板参数({})缺失
+1002028001=微信消息模板不存在
+1002028002=微信消息模板缓存异常
+1002028003=系统配置不存在
+1002028004=系统配置不存在

+ 491 - 0
feifan-framework/feifan-common/src/main/resources/i18n/messages_en.properties

@@ -0,0 +1,491 @@
+002030000=Distribution path does not exist
+1002030001=Worth does not exist
+1002030002=Distribution source does not exist
+1002030003=Points table does not exist
+1002030004=Calculation does not exist
+1002030005=Order calculation does not exist
+1002030006=Brother partition does not exist
+1002030007=Son partition does not exist
+1002030008=Distribution user does not exist
+1002030009=Distribution user does not exist
+1002030010=Current promoter already has an upper-level
+1002030011=Collision partition does not exist
+1002030012=Platform profit does not exist
+1002030013=Platform profit log table does not exist
+1002030014=Total percentage exceeds 100
+1002030015=The direct referral already has a recommender, hence cannot be added
+1003031001=Sharing link does not exist
+1003031002=Newly registered user through sharing link does not exist
+1004031001=No record of user ever favoriting any product
+1005031001=Member worth change category does not exist
+1005031002=User check-in log does not exist
+1005031003=Could not find the stored worth value from check-in in cache
+1005031004=Withdrawal request record does not exist
+1005031005=Platform daily withdrawal record does not exist
+1005031006=Withdrawal channel record does not exist
+1002030035=Recharge consumption points record does not exist
+1002030036=Consumption points change record does not exist
+1002030037=Consumption points transfer record does not exist
+1002030038=User recharge consumption points order does not exist
+1001000001=Parameter configuration does not exist
+1001000002=Parameter configuration key is duplicated
+1001000003=Cannot delete system-built-in parameter configuration
+1001000004=Failed to get parameter configuration: access to invisible configuration is not allowed
+1001001000=Scheduled task does not exist
+1001001001=Scheduled task processor already exists
+1001001002=Only allowed to modify to enable or disable status
+1001001003=Scheduled task is already in this status, no need to modify
+1001001004=Only tasks in enabled status can be modified
+1001001005=Invalid CRON expression
+1001002000=API error log does not exist
+1001002001=API error log has been processed
+1001003000=File path already exists
+1001003001=File does not exist
+1001003002=File is empty
+1003001000=Table definition already exists
+1003001001=Imported table does not exist
+1003001002=Imported field does not exist
+1003001004=Table definition does not exist
+1003001005=Field definition does not exist
+1003001006=Synchronized field does not exist
+1003001007=Synchronization failed: no changes detected
+1003001008=Table comment in database not filled
+1003001009=Field comment in database for field ({}) not filled
+1003001010=Master table (i=}) definition does not exist, please check
+1003001011=Subtable field (i=}) does not exist, please check
+1003001012=Master table code generation failed: it has no subtable
+1003001013=Master table code generation failed: its subtable ({}) has no fields
+1001006000=File configuration does not exist
+1001006001=File configuration cannot be deleted as it is the main configuration, deleting it would make file uploads impossible
+1001007000=Data source configuration does not exist
+1001007001=Data source configuration is incorrect, cannot connect
+1001107000=Student does not exist
+1001201000=Example contact does not exist
+1001201001=Example category does not exist
+1001201002=Sub-example categories exist, cannot delete
+1001201003=Parent example category does not exist
+1001201004=Cannot set itself as parent example category
+1001201005=Example category with this name already exists
+1001201006=Cannot set its sub-example category as its parent
+1001201007=Student does not exist
+1001201008=Student class does not exist
+1001201009=Student class already exists
+1001201010=Domain in URL is not a designated domain
+1008001000=Product category does not exist
+1008001001=Parent category does not exist
+1008001002=Parent category cannot be a secondary category
+1008001003=Subcategories exist, cannot delete
+1008001004=Product category ({}) is disabled, cannot use
+1008001005=Products exist under this category, cannot delete
+1008002000=Brand does not exist
+1008002001=Brand is disabled
+1008002002=Brand name already exists
+1008003000=Attribute item does not exist
+1008003001=Attribute item name already exists
+1008003002=Attribute values exist under the attribute item, cannot delete
+1008004000=Attribute value does not exist
+1008004001=Attribute value name already exists
+1008005000=Product SPU does not exist
+1008005001=Product category incorrect: must use level 2 or lower
+1008005002=Failed to save Product SPU: Coupon does not exist
+1008005003=Product SPU [{}] is not in the listed status
+1008005004=Product SPU is not in the recycle bin status
+1008006000=Product SKU does not exist
+1008006001=Duplicate attribute combination for product SKU
+1008006002=Each SKU under an SPU must have the same attribute items
+1008006003=Each SKU under an SPU must be unique
+1008006004=Insufficient inventory for product SKU
+1008007000=Product review does not exist
+1008007001=Review for the order's product already exists
+1008008000=The product has already been favorited
+1008008001=Product favorite does not exist
+1013001000=Limited-time discount event does not exist
+1013001001=Products exist in other limited-time discount events
+1013001002=Limited-time discount event is closed and cannot be modified
+1013001003=Limited-time discount event is not closed and cannot be deleted
+1013001004=Limited-time discount event is closed and cannot be closed again
+1013002000=Banner does not exist
+1013003000=No available products for the coupon
+1013003001=The products settled did not meet the minimum required amount
+1013004000=Coupon template does not exist
+1013004001=Distribution quantity cannot be less than the number already claimed ({})
+1013004002=Insufficient remaining quantity available for claiming
+1013004003=The user has already claimed this coupon
+1013004004=Coupon has expired
+1013004005=Incorrect claim method
+1013005000=Coupon does not exist
+1013005001=Failed to reclaim coupon, coupon has already been used
+1013005002=Coupon is not in a pending-use status
+1013005003=Coupon is not within the valid usage period
+1013005004=Coupon is not in used status
+1013006000=Full discount promotion does not exist
+1013006001=Products exist in other full discount promotions
+1013006002=Full discount promotion is closed and cannot be modified
+1013006003=Full discount promotion is not closed and cannot be deleted
+1013006004=Full discount promotion is closed and cannot be closed again
+1013006005=Full discount promotion has ended and cannot be closed
+1013008000=Flash sale event does not exist
+1013008002=Products exist in other flash sale events, time conflict
+1013008003=Flash sale event is closed and cannot be modified
+1013008004=Flash sale event is not closed or not ended and cannot be deleted
+1013008005=Flash sale event is closed and cannot be closed again
+1013008006=Flash sale failed: Insufficient flash sale inventory
+1013008007=Flash sale failed: Not within the activity time range
+1013008008=Flash sale failed: Flash sale event is closed
+1013008009=Flash sale failed: Single purchase limit exceeded
+1013008010=Flash sale failed: Product does not exist
+1013009000=Flash sale time slot does not exist
+1013009001=Flash sale time slot conflict
+1013009004=Flash sale time slot is closed
+1013010000=Group buying event does not exist
+1013010001=Products exist in other group buying events
+1013010002=Group buying event is closed and cannot be modified
+1013010003=Group buying event is not closed or not ended and cannot be deleted
+1013010004=Group buying failed: Group buying event is closed
+1013010005=Group buying failed: Group buying product does not exist
+1013010006=Group buying failed: Insufficient inventory for group buying product
+1013011000=Group does not exist
+1013011001=Group buying failed: Already participated in the group
+1013011002=Group buying failed: Parent group does not exist
+1013011003=Group buying failed: Group is full
+1013011004=Group buying failed: There is an ongoing group buying record for this event
+1013011005=Group buying failed: Event has not started
+1013011006=Group buying failed: Event has ended
+1013011007=Group buying failed: Single purchase limit exceeded
+1013011008=Group buying failed: Total purchase limit exceeded
+1013011009=Group buying failed: Unpaid order exists, please pay first
+1013012000=Bargain event does not exist
+1013012001=Products exist in other bargain events
+1013012002=Bargain event is closed and cannot be modified
+1013012003=Bargain event is not closed or not ended and cannot be deleted
+1013012004=Insufficient inventory for bargain event
+1013012005=Bargain event is closed
+1013012006=Bargain event has ended
+1013013000=Bargain record does not exist
+1013013001=Participation failed: You have already participated in the bargain event
+1013013002=Participation failed: You have reached the participation limit for the bargain event
+1013013004=Order failed: Bargain not successful
+1013013005=Order failed: Bargain order already placed
+1013014000=Assistance failed: Bargain record is not in progress
+1013014001=Assistance failed: Cannot assist yourself
+1013014002=Assistance failed: You have reached the assistance limit for the bargain event
+1013014003=Assistance failed: Please try again
+1013014004=Assistance failed: You have already assisted
+1013015000=Article category does not exist
+1013015001=Article category deletion failed: Associated articles exist
+1013016000=Article does not exist
+1013017000=Decoration template does not exist
+1013017001=Decoration template name ({}) is already in use
+1013017002=Cannot delete the template being used
+1013018000=Decoration page does not exist
+1013018001=Decoration page name ({}) is already in use
+1101001001=Store does not exist
+1002029003=Merchant application does not exist
+1002029004=Merchant application record does not exist
+1002029005=Users are not agents yet
+1011000010=Transaction order item does not exist
+1011000011=Transaction order does not exist
+1011000012=Failed to update after-sales status of transaction order item, please try again
+1011000013=Failed to update payment status of transaction order: Order is not in "unpaid" status
+1011000014=Failed to update payment status of transaction order: Payment order number mismatch
+1011000015=Failed to update payment status of transaction order: Payment order is not in "payment successful" status
+1011000016=Failed to update payment status of transaction order: Payment order amount mismatch
+1011000017=Failed to ship transaction order: Order is not in "pending shipment" status
+1011000018=Failed to receive transaction order: Order is not in "pending receipt" status
+1011000019=Failed to create review for transaction order item: Order is not "completed"
+1011000020=Failed to create review for transaction order item: Order already reviewed
+1011000021=Failed to ship transaction order: Order is refunded or partially refunded
+1011000022=Failed to ship transaction order: Group buying not successful
+1011000023=Failed to ship transaction order: Bargain not successful
+1011000024=Failed to ship transaction order: Shipping type is not courier
+1011000025=Failed to cancel transaction order: Order is not in "pending payment" status
+1011000026=Failed to adjust payment order price: Payment order has already been paid, cannot adjust price
+1011000027=Failed to adjust payment order price: Price has already been adjusted
+1011000028=Failed to adjust payment order price: Adjusted payment price cannot be less than 0.01 yuan
+1011000029=Failed to delete transaction order: Order is not in "canceled" status
+1011000030=Failed to pick up transaction order: Pickup method is not "user pickup"
+1011000031=Failed to modify transaction order address: Order is not in "pending shipment" status
+1011000032=Failed to create transaction order: Unpaid orders exist
+1011000100=After-sales order does not exist
+1011000101=Incorrect refund amount applied
+1011000102=Order is closed, cannot apply for after-sales
+1011000103=Order is not paid, cannot apply for after-sales
+1011000104=Order not shipped, cannot apply for "return and refund" after-sales
+1011000105=After-sales has been applied for this order item, cannot apply again
+1011000106=Approval failed: After-sales status is not pending approval
+1011000107=Failed to operate after-sales order, please refresh and try again
+1011000108=Return failed: After-sales order status is not "pending buyer return"
+1011000109=Failed to confirm receipt: After-sales order status is not "pending confirmation of receipt"
+1011000110=Refund failed: After-sales order status is not "pending refund"
+1011000111=Failed to cancel after-sales order: After-sales order status is not "pending review" or "seller agreed" or "merchant pending receipt"
+1011002000=Shopping cart item does not exist
+1011003000=Payment price calculation error: Price is less than or equal to 0
+1011003002=Courier fee calculation error: No corresponding courier fee template found
+1011003004=Promotional products for flash sale, group buying, or bargain cannot use coupons
+1011003005=Flash sale product exceeds the total purchase limit
+1011004000=Courier company does not exist
+1011004001=Courier company with this code already exists
+1011004002=Need to connect to courier service provider, such as "Express 100"
+1011004003=Courier company is not enabled
+1011004101=Courier query interface exception
+1011004102=Courier query returned failure: Reason: {}
+1011005000=Courier fee template name already exists
+1011005001=Courier fee template does not exist
+1011006000=Self-pickup store does not exist
+1011007000=Distribution user does not exist
+1011007001=User's frozen commission ({}) is insufficient
+1011007002=Cannot bind to oneself
+1011007003=Bound user does not have promotion eligibility
+1011007004=Can only bind a promoter in the backend
+1011007005=Can only bind during registration
+1011007006=Already bound to a promoter
+1011007007=Subordinate cannot bind to their own superior
+1011007008=Only supports level less than or equal to 2
+1011008000=Commission withdrawal record does not exist
+1011008001=Commission withdrawal record is not in a pending review status
+1011008002=Withdrawal amount cannot be less than {} yuan
+1011008003=You can withdraw up to {} yuan
+1011008004=WeChat template message log does not exist
+1011008005=Insufficient wallet points for payment
+1011008006=Insufficient wallet consumption points for payment
+1011008011=JPush message log does not exist
+1004001000=User does not exist
+1004001001=Phone number not registered
+1004001002=Failed to modify phone number: Phone number ({}) already in use
+1004001003=Insufficient user points balance
+1004001004=Invalid phone number
+1004003000=Login failed: Incorrect username or password
+1004003001=Login failed: Account is disabled
+1004003005=Login failed: Unable to parse third-party login information
+1004003006=Login failed: Unable to find this user
+1004003007=Phone number already in use
+1004004000=User delivery address does not exist
+1004006000=User tag does not exist
+1004006001=User tag already exists
+1004006002=Users exist under the user tag, cannot delete
+1004008000=Unsupported user points record business type
+1004009000=Check-in day rule does not exist
+1004009001=Check-in day rule already exists
+1004010000=Already checked in today, please do not check in again
+1004011000=User level does not exist
+1004011001=User level name [{}] already in use
+1004011002=User level value [{}] is already used by [{}]
+1004011003=Upgrade experience must be greater than the upgrade experience set by the previous level [{}]
+1004011004=Upgrade experience must be less than the upgrade experience set by the next level [{}]
+1004011005=Users exist under the user level, cannot delete
+1004011201=Unsupported user experience business type
+1004012000=User group does not exist
+1004012001=Users exist under the user group, cannot delete
+1004012003=This username already exists, please choose another!
+1004012004=This phone number has reached the binding limit
+1004012102=This WeChat account has reached the binding limit
+1004012005=Registration can only be completed through sharing
+1004012006=Registration failed: Please exit the current page and rescan the shared QR code to register
+1004012007=Navigation failed: Member user has not bound a system user
+1006000000=WeChat official account does not exist
+1006000001=Failed to generate official account QR code: Reason: {}
+1006000002=Failed to clear the official account API quota: Reason: {}
+1006001000=Failed to obtain fan increase and decrease data: Reason: {}
+1006001001=Failed to obtain cumulative fan data: Reason: {}
+1006001002=Failed to obtain message send summary data: Reason: {}
+1006001003=Failed to obtain interface analysis data: Reason: {}
+1006002000=Tag does not exist
+1006002001=Failed to create tag: Reason: {}
+1006002002=Failed to update tag: Reason: {}
+1006002003=Failed to delete tag: Reason: {}
+1006002004=Failed to obtain tag: Reason: {}
+1006003000=Fan does not exist
+1006003001=Failed to update fan tags: Reason: {}
+1006004000=Material does not exist
+1006004001=Failed to upload material: Reason: {}
+1006004002=Failed to upload image: Reason: {}
+1006004003=Failed to delete material: Reason: {}
+1006005000=Failed to send message: Reason: {}
+1006006000=Failed to obtain the successfully published list: Reason: {}
+1006006001=Failed to submit for publication: Reason: {}
+1006006002=Failed to delete publication: Reason: {}
+1006007000=Failed to obtain draft list: Reason: {}
+1006007001=Failed to create draft: Reason: {}
+1006007002=Failed to update draft: Reason: {}
+1006007003=Failed to delete draft: Reason: {}
+1006008000=Failed to create menu: Reason: {}
+1006008001=Failed to delete menu: Reason: {}
+1006009000=Auto-reply does not exist
+1006009001=Operation failed: Follow reply already exists
+1006009002=Operation failed: Reply for this message type already exists
+1006009003=Operation failed: Reply for this keyword already exists
+1007000000=App does not exist
+1007000002=App has been disabled
+1007000003=Payment app cannot be deleted due to existing payment orders
+1007000004=Payment app cannot be deleted due to existing refund orders
+1007001000=Payment channel configuration does not exist
+1007001001=Payment channel is disabled
+1007001004=Identical channel already exists
+1007002000=Payment order does not exist
+1007002001=Payment order is not in "pending payment"
+1007002002=Order has already been paid, please refresh the page
+1007002003=Payment order has expired
+1007002004=Failed to initiate payment: Error code: {}, Error message: {}
+1007002005=Failed to refund payment order: Status is neither "paid" nor "refunded"
+1007003000=Payment transaction extension does not exist
+1007003001=Payment transaction extension is not in "pending payment"
+1007003002=Order has already been paid, please wait for the payment result
+1007006000=Refund amount exceeds the refundable amount of the order
+1007006002=A refund is already in process
+1007006003=A refund order already exists
+1007006004=Payment refund order does not exist
+1007006005=Payment refund order is not in "pending refund"
+1007007000=User wallet does not exist
+1007007001=Insufficient wallet balance
+1007007002=Corresponding wallet transaction not found
+1007007003=Wallet refund already exists
+1007007004=Insufficient frozen wallet balance
+1007008000=Wallet recharge record does not exist
+1007008001=Failed to update payment status for wallet recharge: Wallet recharge record is not in "unpaid" status
+1007008002=Failed to update payment status for wallet recharge: Payment order number mismatch
+1007008003=Failed to update payment status for wallet recharge: Payment order is not in "payment successful" status
+1007008004=Failed to update payment status for wallet recharge: Payment order amount mismatch
+1007008005=Failed to initiate wallet refund: Wallet recharge order not paid
+1007008006=Failed to initiate wallet refund: Wallet recharge order already refunded
+1007008007=Failed to initiate wallet refund: Insufficient wallet balance
+1007008008=Failed to update wallet refund: Wallet refund order number mismatch
+1007008009=Failed to update wallet refund: Refund order does not exist
+1007008010=Failed to update wallet refund: Refund order amount mismatch
+1007008011=Wallet recharge package does not exist
+1007008012=Wallet recharge package is disabled
+1007008013=Wallet recharge package name already exists
+1007009000=Failed to initiate transfer: Error code: {}, Error message: {}
+1007009001=Transfer order does not exist
+1007009002=Type mismatch for two identical transfer requests
+1007009003=Amount mismatch for two identical transfer requests
+1007009004=A transfer for this transaction has already been initiated; please check the related transfer order status
+1007009005=Transfer order is not in "pending transfer" status
+1007009006=Transfer order is not in "pending transfer" or "in transfer" status
+1007900000=Example order does not exist
+1007900001=Failed to update payment status for example order: Order is not in "unpaid" status
+1007900002=Failed to update payment status for example order: Payment order number mismatch
+1007900003=Failed to update payment status for example order: Payment order is not in "payment successful" status
+1007900004=Failed to update payment status for example order: Payment order amount mismatch
+1007900005=Failed to initiate refund: Example order not paid
+1007900006=Failed to initiate refund: Example order already refunded
+1007900007=Failed to initiate refund: Refund order does not exist
+1007900008=Failed to initiate refund: Refund order not refunded successfully
+1007900009=Failed to initiate refund: Refund order number mismatch
+1007900010=Failed to initiate refund: Refund order amount mismatch
+1007901001=Example transfer order does not exist
+1007901002=Transfer failed: Transfer order number mismatch
+1007901003=Transfer failed: Transfer order amount mismatch
+1007901004=Transfer failed: Transfer order amount mismatch
+1007901005=Failed to submit order
+1002000000=Login failed: Incorrect username or password
+1002000001=Login failed: Account is disabled
+1002000002=Please enter username + phone number for verification to register
+1002000004=Code verification failed
+1002000005=Incorrect verification code: Reason: {}
+1002000006=Token has expired
+1002000007=Phone number does not exist
+1002001000=Menu with this name already exists
+1002001001=Parent menu does not exist
+1002001002=Cannot set itself as parent menu
+1002001003=Menu does not exist
+1002001004=Submenus exist, cannot delete
+1002001005=Parent menu type must be a directory or menu
+1002002000=Role does not exist
+1002002001=Role named [{}] already exists
+1002002002=Role code [{}] already exists
+1002002003=Cannot operate on system-built-in roles
+1002002004=Role named [{}] is disabled
+1002002005=Code [{}] cannot be used
+1002003000=User account already exists
+1002003001=Phone number already exists
+1002003002=Email already exists
+1002003003=User does not exist
+1002003004=Imported user data cannot be empty
+1002003005=User password verification failed
+1002003006=User named [{}] is disabled
+1002003008=Failed to create user: Exceeded tenant's maximum quota of tenants ({})
+1002004000=Department with this name already exists
+1002004001=Parent department does not exist
+1002004002=Current department does not exist
+1002004003=Sub-departments exist, cannot delete
+1002004004=Cannot set itself as parent department
+1002004005=Employees exist in the department, cannot delete
+1002004006=Department ({}) is not in enabled status, not allowed to select
+1002004007=Cannot set its sub-department as its parent department
+1002005000=Current job position does not exist
+1002005001=Job position ({}) is not in enabled status, not allowed to select
+1002005002=Job position with this name already exists
+1002005003=Job position with this identifier already exists
+1002006001=Current dictionary type does not exist
+1002006002=Dictionary type is not in enabled status, not allowed to select
+1002006003=Dictionary type with this name already exists
+1002006004=Dictionary type with this code already exists
+1002006005=Cannot delete: The dictionary type still has dictionary data
+1002007001=Current dictionary data does not exist
+1002007002=Dictionary data ({}) is not in enabled status, not allowed to select
+1002007003=Dictionary data with this value already exists
+1002008001=Current notice announcement does not exist
+1002011000=SMS channel does not exist
+1002011001=SMS channel is not in enabled status, not allowed to select
+1002011002=Cannot delete: The SMS channel still has SMS templates
+1002012000=SMS template does not exist
+1002012001=SMS template code [{}] already exists
+1002012002=Failed to call SMS API template: Reason: {}
+1002012003=SMS API template cannot be used: Under review
+1002012004=SMS API template cannot be used: Review failed, {}
+1002012005=SMS API template cannot be used: Template does not exist
+1002013000=Phone number does not exist
+1002013001=Missing template parameter ({})
+1002013002=SMS template does not exist
+1002014000=Verification code does not exist
+1002014001=Verification code has expired
+1002014002=Verification code has been used
+1002014003=Incorrect verification code
+1002014004=Exceeded daily SMS sending limit
+1002014005=SMS sent too frequently
+1002014006=Phone number already in use
+1002014007=Verification code has not been used
+1002015000=Tenant does not exist
+1002015001=Tenant named [{}] is disabled
+1002015002=Tenant named [{}] has expired
+1002015003=System tenant cannot be modified or deleted
+1002015004=Tenant named [{}] already exists
+1002015005=Tenant with domain [{}] already exists
+1002016000=Tenant package does not exist
+1002016001=Tenant is using this package, please reset the tenant package before attempting to delete
+1002016002=Tenant package named [{}] is disabled
+1002017000=Error code does not exist
+1002017001=Error code [{}] already exists
+1002018000=Social authorization failed: Reason: {}
+1002018001=Social authorization failed: Corresponding user not found
+1002018200=Failed to obtain phone number
+1002018201=Social client does not exist
+1002018202=Configuration already exists for social client
+1002019000=System sensitive word does not exist in all tags
+1002019001=System sensitive word already exists in tag
+1002020000=OAuth2 client does not exist
+1002020001=OAuth2 client ID already exists
+1002020002=OAuth2 client is disabled
+1002020003=Unsupported grant type
+1002020004=Authorization scope too large
+1002020005=Invalid redirect_uri: {}
+1002020006=Invalid client_secret: {}
+1002021000=client_id does not match
+1002021001=redirect_uri does not match
+1002021002=state does not match
+1002021003=code does not exist
+1002022000=code does not exist
+1002022001=code has expired
+1002023000=Email account does not exist
+1002023001=Cannot delete: The email account still has email templates
+1002024000=Email template does not exist
+1002024001=Email template code ({}) already exists
+1002025000=Missing template parameter ({})
+1002025001=Email does not exist
+1002026000=In-app message template does not exist
+1002026001=In-app message template code [{}] already exists
+1002028000=Missing template parameter ({})
+1002028001=WeChat message template does not exist
+1002028002=WeChat message template cache error
+1002028003=System configuration does not exist
+1002028004=System configuration does not exist

+ 491 - 0
feifan-framework/feifan-common/src/main/resources/i18n/messages_fr_FR.properties

@@ -0,0 +1,491 @@
+1002030000=Aucun chemin de distribution n'existe
+1002030001=Aucune valeur n'existe
+1002030002=Aucune source de distribution n'existe
+1002030003=Aucun tableau de points n'existe
+1002030004=Aucun calcul n'existe
+1002030005=Aucun calcul de commande n'existe
+1002030006=Aucune partition frère n'existe
+1002030007=Aucune partition enfant n'existe
+1002030008=Aucun utilisateur de distribution n'existe
+1002030009=Aucun utilisateur de distribution n'existe
+1002030010=L'actuel promoteur a déjà un niveau supérieur
+1002030011=Aucune partition en conflit n'existe
+1002030012=Aucun profit de plateforme n'existe
+1002030013=Aucun tableau de logs de profit de plateforme n'existe
+1002030014=Le pourcentage total dépasse 100
+1002030015=La recommandation directe ne peut pas être ajoutée car elle a déjà un recommandeur
+1003031001=Aucun lien partagé n'existe
+1003031002=Aucun nouvel utilisateur inscrit via le lien partagé n'existe
+1004031001=Aucun enregistrement de favoris pour le produit par l'utilisateur
+1005031001=Aucune catégorie de modification de valeur membre n'existe
+1005031002=Aucun journal de check-in utilisateur n'existe
+1005031003=Impossible de trouver la valeur de check-in enregistrée dans le cache
+1005031004=Aucun enregistrement de demande de retrait n'existe
+1005031005=Aucun enregistrement de retrait quotidien de la plateforme n'existe
+1005031006=Aucun enregistrement de canal de retrait n'existe
+1002030035=Aucun enregistrement de points de consommation de recharge n'existe
+1002030036=Aucun enregistrement de modification de points de consommation n'existe
+1002030037=Aucun enregistrement de transfert de points de consommation n'existe
+1002030038=Aucune commande de recharge de points de consommation de l'utilisateur n'existe
+1001000001=Aucune configuration de paramètre n'existe
+1001000002=La clé de configuration de paramètre est en double
+1001000003=Impossible de supprimer la configuration de paramètre intégrée au système
+1001000004=Impossible de récupérer la configuration de paramètre : accès à une configuration invisible
+1001001000=Aucune tâche planifiée n'existe
+1001001001=Le processeur de tâche planifiée existe déjà
+1001001002=Il n'est possible de modifier que l'état en "utilisable" ou "non utilisable"
+1001001003=La tâche planifiée est déjà dans cet état, aucune modification nécessaire
+1001001004=Seules les tâches dans l'état "utilisable" peuvent être modifiées
+1001001005=Expression CRON incorrecte
+1001002000=Aucun journal d'erreur API n'existe
+1001002001=Le journal d'erreur API a déjà été traité
+1001003000=Le chemin du fichier existe déjà
+1001003001=Le fichier n'existe pas
+1001003002=Le fichier est vide
+1003001000=La définition de la table existe déjà
+1003001001=La table importée n'existe pas
+1003001002=Le champ importé n'existe pas
+1003001004=La définition de la table n'existe pas
+1003001005=La définition du champ n'existe pas
+1003001006=Le champ synchronisé n'existe pas
+1003001007=Échec de la synchronisation : aucun changement détecté
+1003001008=Le commentaire de la table n'a pas été saisi dans la base de données
+1003001009=Le commentaire du champ {} de la base de données n'a pas été saisi
+1003001010=La définition de la table maîtresse (id={}) n'existe pas. Veuillez vérifier
+1003001011=Le champ de la table enfant (id={}) n’existe pas. Veuillez vérifier
+1003001012=Échec de la génération du code de la table maîtresse : aucune table secondaire
+1003001013=Échec de la génération du code de la table maîtresse : aucun champ dans la table secondaire({})
+1001006000=La configuration du fichier n'existe pas
+1001006001=Impossible de supprimer la configuration du fichier. C'est une configuration principale et la suppression rendra impossible le téléchargement de fichiers
+1001007000=La configuration de la source de données n'existe pas
+1001007001=La configuration de la source de données est incorrecte. Impossible de se connecter
+1001107000=L'étudiant n'existe pas
+1001201000=Aucun contact d'exemple n'existe
+1001201001=Aucune catégorie d'exemple n'existe
+1001201002=Impossible de supprimer la catégorie d'exemple car des sous-catégories existent
+1001201003=La catégorie parente d'exemple n'existe pas
+1001201004=Impossible de définir la catégorie d'exemple comme catégorie parente d'elle-même
+1001201005=Une catégorie d'exemple avec le même nom existe déjà
+1001201006=Impossible de définir une sous-catégorie d'exemple comme catégorie parente
+1001201007=L'étudiant n'existe pas
+1001201008=La classe d'étudiant n'existe pas
+1001201009=La classe d'étudiant existe déjà
+1001201010=Le domaine de l'URL n'est pas le domaine spécifié
+1008001000=La catégorie de produit n'existe pas
+1008001001=La catégorie parente n'existe pas
+1008001002=La catégorie parente ne peut pas être une catégorie importante
+1008001003=Impossible de supprimer la catégorie car des sous-catégories existent
+1008001004=La catégorie de produit ({}) n'est pas disponible. Son utilisation a été arrêtée
+1008001005=Impossible de supprimer la catégorie car des produits y sont associés
+1008002000=La marque n'existe pas
+1008002001=L'utilisation de la marque a été arrêtée
+1008002002=Le nom de la marque existe déjà
+1008003000=L'élément d'attribut n'existe pas
+1008003001=Le nom de l'élément d'attribut existe déjà
+1008003002=Impossible de supprimer l'élément d'attribut car il contient des valeurs d'attribut
+1008004000=La valeur d'attribut n'existe pas
+1008004001=Le nom de la valeur d'attribut existe déjà
+1008005000=Le SPU du produit n'existe pas
+1008005001=La catégorie de produit est incorrecte : il faut utiliser un niveau inférieur ou égal à 2
+1008005002=Impossible de sauvegarder le SPU du produit : le coupon n'existe pas
+1008005003=Le SPU du produit [{}] n'est pas en état de liste
+1008005004=Le SPU du produit n'est pas en état de corbeille
+1008006000=Le SKU du produit n'existe pas
+1008006001=Le SKU du produit contient des combinaisons d'attributs en double
+1008006002=Chaque SKU appartenant au SPU doit avoir les mêmes éléments d'attribut
+1008006003=Chaque SKU appartenant au SPU doit être unique
+1008006004=Le stock du SKU du produit est insuffisant
+1008007000=Aucune critique de produit n'existe
+1008007001=Une critique pour le produit de la commande existe déjà
+1008008000=Ce produit a déjà été ajouté aux favoris
+1008008001=Aucun favori de produit n'existe
+1013001000=Aucun événement de réduction limitée dans le temps n'existe
+1013001001=Le produit existe dans un autre événement de réduction limitée dans le temps
+1013001002=L'événement de réduction limitée dans le temps est terminé et ne peut pas être modifié
+1013001003=L'événement de réduction limitée dans le temps n'est pas terminé et ne peut pas être supprimé
+1013001004=L'événement de réduction limitée dans le temps est terminé et ne peut pas être terminé à nouveau
+1013002000=Aucune bannière n'existe
+1013003000=Aucun produit n'est disponible pour utiliser ce coupon
+1013003001=Le montant payé pour le produit n'atteint pas le montant minimum requis
+1013004000=Aucun modèle de coupon n'existe
+1013004001=La quantité allouée doit être inférieure à la quantité déjà facturée ({})
+1013004002=La quantité restante est insuffisante pour facturer
+1013004003=Vous avez déjà facturé ce coupon
+1013004004=Le coupon est expiré.
+1013004005=Méthode de facturation incorrecte
+1013005000=Aucun coupon n'existe
+1013005001=Impossible de récupérer le coupon. Il a déjà été utilisé
+1013005002=Le coupon n'est pas en attente d'utilisation
+1013005003=Le coupon n'est pas dans la période de validité
+1013005004=Le coupon n'est pas en état d'utilisation
+1013006000=Aucune promotion de remise totale n'existe
+1013006001=Le produit existe dans une autre promotion de remise totale
+1013006002=La promotion de remise totale est terminée et ne peut pas être modifiée
+1013006003=La promotion de remise totale n'est pas terminée et ne peut pas être supprimée
+1013006004=La promotion de remise totale est terminée et ne peut pas être terminée à nouveau
+1013006005=La promotion de remise totale est terminée et ne peut pas être arrêtée
+1013008000=Aucun événement de vente flash n'existe
+1013008002=Le produit existe dans un autre événement de vente flash avec un chevauchement de temps
+1013008003=L'événement de vente flash est terminé et ne peut pas être modifié
+1013008004=L'événement de vente flash n'est pas terminé et ne peut pas être supprimé
+1013008005=L'événement de vente flash est terminé et ne peut pas être terminé à nouveau
+1013008006=Échec de la vente flash : le stock de la vente flash est insuffisant
+1013008007=Échec de la vente flash : hors de la plage horaire de l'événement
+1013008008=Échec de la vente flash : l'événement de vente flash est terminé
+1013008009=Échec de la vente flash : limite d'achat unique dépassée
+1013008010=Échec de la vente flash : le produit n'existe pas
+1013009000=Aucun créneau horaire de vente flash n'existe
+1013009001=Conflit de créneau horaire de vente flash
+1013009004=Le créneau horaire de vente flash est terminé.
+1013010000=Aucun événement d'achat groupé n'existe
+1013010001=Le produit existe dans un autre événement d'achat groupé
+1013010002=L'événement d'achat groupé est terminé et ne peut pas être modifié
+1013010003=L'événement d'achat groupé n'est pas terminé et ne peut pas être supprimé
+1013010004=Échec de l'achat groupé : l'événement d'achat groupé est terminé
+1013010005=Échec de l'achat groupé : le produit d'achat groupé n'existe pas
+1013010006=Échec de l'achat groupé : le stock du produit d'achat groupé est insuffisant
+1013011000=Aucun groupe n'existe
+1013011001=Échec de l'achat groupé : vous avez déjà participé à ce groupe
+1013011002=Échec de l'achat groupé : le groupe parent n'existe pas
+1013011003=Échec de l'achat groupé : le groupe est complet
+1013011004=Échec de l'achat groupé : vous avez déjà une participation en cours pour cet événement
+1013011005=Échec de l'achat groupé : l'événement n'a pas commencé
+1013011006=Échec de l'achat groupé : l'événement est terminé
+1013011007=Échec de l'achat groupé : limite d'achat unique dépassée
+1013011008=Échec de l'achat groupé : limite totale d'achat dépassée
+1013011009=Échec de l'achat groupé : des commandes non payées existent. Veuillez les payer d'abord
+1013012000=Aucun événement de panier n'existe
+1013012001=Le produit existe dans un autre événement de panier
+1013012002=L'événement de panier est terminé et ne peut pas être modifié
+1013012003=L'événement de panier n'est pas terminé et ne peut pas être supprimé
+1013012004=Le stock de l'événement de panier est insuffisant
+1013012005=L'événement de panier est terminé.
+1013012006=L'événement de panier est terminé.
+1013013000=Aucun enregistrement de panier n'existe
+1013013001=Échec de la participation : vous avez déjà participé à cet événement de panier
+1013013002=Échec de la participation : vous avez atteint la limite de participation à l'événement de panier
+1013013004=Échec de la commande : échec de l'ajout au panier
+1013013005=Échec de la commande : la commande de panier est déjà enregistrée
+1013014000=Échec de l'aide : l'enregistrement de panier n'est pas en cours
+1013014001=Échec de l'aide : vous ne pouvez pas vous aider vous-même
+1013014002=Échec de l'aide : vous avez atteint la limite d'aide à l'événement de panier
+1013014003=Échec de l'aide : veuillez réessayer
+1013014004=Échec de l'aide : vous avez déjà aidé
+1013015000=Aucune catégorie d'article n'existe
+1013015001=Échec de la suppression de la catégorie d'article : des articles liés existent
+1013016000=L’article n’existe pas
+1013017000=Aucun modèle de décoration n'existe
+1013017001=Le nom du modèle de décoration ({}) est déjà utilisé
+1013017002=Impossible de supprimer un modèle en cours d'utilisation
+1013018000=Aucune page de décoration n'existe
+1013018001=Le nom de la page de décoration ({}) est déjà utilisé
+1101001001=Aucune boutique n'existe
+1002029003=Aucune demande de fournisseur n'existe
+1002029004=Aucun enregistrement de demande de fournisseur n'existe
+1002029005=L’utilisateur n’est pas encore un agent
+1011000010=Aucun élément de commande de transaction n'existe
+1011000011=Aucune commande de transaction n'existe
+1011000012=Échec de la mise à jour de l'état postérieur de la commande de transaction. Veuillez réessayer
+1011000013=Impossible de mettre à jour la commande de transaction en état de paiement. La commande n'est pas en état de "non payée"
+1011000014=Impossible de mettre à jour la commande de transaction en état de paiement. Numéro de commande de paiement incohérent
+1011000015=Impossible de mettre à jour la commande de transaction en état de paiement. La commande de paiement n'est pas en état de "paiement réussi"
+1011000016=Impossible de mettre à jour la commande de transaction en état de paiement. Montant de la commande de paiement incohérent
+1011000017=Impossible d'expédier la commande de transaction. La commande n'est pas en état de "en attente d'expédition"
+1011000018=Impossible de recevoir la commande de transaction. La commande n'est pas en état de "en attente de réception"
+1011000019=Impossible d'écrire une critique pour l'élément de la commande de transaction. La commande n'est pas en état de "terminée"
+1011000020=Impossible d'écrire une critique pour l'élément de la commande de transaction. La commande a déjà été critiquée
+1011000021=Impossible d'expédier la commande de transaction. La commande a été remboursée ou partiellement remboursée
+1011000022=Impossible d'expédier la commande de transaction. L'achat groupé n'a pas réussi
+1011000023=Impossible d'expédier la commande de transaction. L'ajout au panier n'a pas réussi
+1011000024=Impossible d'expédier la commande de transaction. Le type d'expédition n'est pas COURIER
+1011000025=Impossible d'annuler la commande de transaction. La commande n'est pas en état de "en attente de paiement"
+1011000026=Impossible d'ajuster le prix de la commande de paiement. La commande de paiement a déjà été payée. Impossible d'ajuster le prix
+1011000027=Impossible d'ajuster le prix de la commande de paiement. Le prix a déjà été ajusté
+1011000028=Le prix de paiement ajusté ne peut pas être inférieur à 0,01 yuan
+1011000029=Impossible de supprimer la commande de transaction. La commande n'est pas en état de "annulée"
+1011000030=Impossible de récupérer la commande de transaction : le type d'expédition n'est pas "user pickup"
+1011000031=Impossible de modifier l'adresse de la commande de transaction. La commande n'est pas en état de "en attente d'expédition"
+1011000032=Impossible de créer la commande de transaction. Des commandes non payées existent
+1011000100=Aucune facture après-vente n'existe
+1011000101=Le montant de remboursement appliqué est incorrect.
+1011000102=La commande est terminée, impossible de faire une demande d'après-vente
+1011000103=La commande n'a pas été expédiée, impossible de faire une demande d'après-vente
+1011000104=La commande n'a pas été expédiée, impossible de faire une demande d'après-vente
+1011000105=Impossible de faire une demande d'après-vente supplémentaire, une demande a déjà été faite
+1011000106=Échec de l'approbation, l'état après-vente n'est pas en état d'approbation
+1011000107=Échec de l'opération de la commande après-vente. Veuillez actualiser et réessayer
+1011000108=Échec de la confirmation de réception du produit, l'état de la facture après-vente n'est pas en état de "confirmation en cours"
+1011000109=Échec de la confirmation de réception du produit, l'état de la facture après-vente n'est pas en état de "confirmation en cours"
+1011000110=Échec du remboursement, l'état de la facture après-vente n'est pas en état de "en attente de remboursement"
+1011000111=Échec de l’annulation du bon de vente, le statut du bon de vente n’est pas [en attente d’examen] ou [vendeur accepté] ou [commerçant à recevoir]
+1011002000=L’article du panier n’existe pas
+1011003000=Anomalie dans le calcul du prix payé, cause: prix inférieur ou égal à 0
+1011003002=Calcul des exceptions de fret express, impossible de trouver le modèle de fret correspondant
+1011003004=Participation à des produits de marketing de secondes kills, de groups, de marchandage, ne peut pas utiliser le coupon
+1011003005=Le produit de vente flash a dépassé la limite totale d'achat
+1011004000=Aucune compagnie de transport n'existe
+1011004001=La compagnie de transport avec ce code existe déjà
+1011004002=La compagnie de transport est connectée et utilise des services tels que "Express 100"
+1011004003=La compagnie de transport n'est pas disponible
+1011004101=Exception de l'interface de recherche de transport
+1011004102=La recherche de transport a échoué : raison : {}
+1011005000=Le nom du modèle de frais de transport existe déjà
+1011005001=Aucun modèle de frais de transport n'existe
+1011006000=Aucun magasin de ramassage personnel n'existe
+1011007000=Aucun utilisateur d'allocation n'existe
+1011007001=L'utilisateur n'a pas assez de commission gelée ({})
+1011007002=Impossible de se lier à soi-même
+1011007003=L'utilisateur lié n'est pas éligible pour la promotion
+1011007004=Les promoteurs ne peuvent être liés que depuis l'administration backend
+1011007005=La liaison ne peut se faire que pendant l'inscription
+1011007006=L'utilisateur est déjà lié à un promoteur
+1011007007=Un utilisateur subordonné ne peut pas se lier à son supérieur
+1011007008=Seuls les niveaux inférieurs ou égaux à 2 sont supportés
+1011008000=Aucun enregistrement de retrait de commission n'existe
+1011008001=L'enregistrement de retrait de commission n'est pas en état de revue
+1011008002=Le montant de retrait ne peut pas être inférieur à {} yuans
+1011008003=Le montant maximum de retrait est de {} yuans
+1011008004=Aucun journal de message de modèle WeChat n'existe
+1011008005=L'utilisateur n'a pas assez de points de portefeuille pour le paiement
+1011008006=L'utilisateur n'a pas assez de points de consommation de portefeuille pour le paiement
+1011008011=Aucun journal de message JPush n'existe
+1004001000=Aucun utilisateur n'existe
+1004001001=Le numéro de téléphone n'est pas enregistré
+1004001002=Impossible de modifier le numéro de téléphone. Le numéro de téléphone ({}) est déjà utilisé
+1004001003=L'utilisateur n'a pas assez de points de solde
+1004001004=Numéro de téléphone invalide
+1004003000=Échec de la connexion : nom d'utilisateur ou mot de passe incorrect
+1004003001=Échec de la connexion : le compte est désactivé
+1004003005=Échec de la connexion : impossible d'analyser les informations de connexion tierce
+1004003006=Échec de la connexion : utilisateur introuvable
+1004003007=Le numéro de téléphone est déjà utilisé
+1004004000=Aucune adresse de livraison utilisateur n'existe
+1004006000=Aucune balise utilisateur n'existe
+1004006001=La balise utilisateur existe déjà
+1004006002=Impossible de supprimer la balise utilisateur car des utilisateurs y sont associés
+1004008000=Type d'affaire de journal de points utilisateur non supporté
+1004009000=Aucune règle de date de check-in n'existe
+1004009001=La règle de date de check-in existe déjà
+1004010000=Vous avez déjà effectué le check-in aujourd'hui. Ne le faites pas à nouveau
+1004011000=Aucun niveau utilisateur n'existe
+1004011001=Le nom du niveau utilisateur [{}] est déjà utilisé
+1004011002=La valeur du niveau utilisateur [{}] est déjà utilisée par [{}]
+1004011003=L'expérience de mise à niveau doit être supérieure à celle définie pour le niveau précédent [{}]
+1004011004=L'expérience de mise à niveau doit être inférieure à celle définie pour le niveau suivant [{}]
+1004011005=Impossible de supprimer le niveau utilisateur car des utilisateurs y sont associés
+1004011201=Type d'affaire d'expérience utilisateur non supporté
+1004012000=Aucun groupe utilisateur n'existe
+1004012001=Impossible de supprimer le groupe utilisateur car des utilisateurs y sont associés
+1004012003=Ce nom d'utilisateur existe déjà. Veuillez en choisir un autre
+1004012004=Ce numéro de téléphone a atteint la limite de liaisons autorisées
+1004012102=Ce compte WeChat a atteint la limite de liaisons autorisées
+1004012005=L'inscription doit être complétée via le partage
+1004012006=L'inscription a échoué. Veuillez fermer la page actuelle et scanner à nouveau le QR code partagé pour vous inscrire
+1004012007=Échec de la navigation. L'utilisateur membre n'est pas lié à un utilisateur système
+1006000000=Aucun compte officiel WeChat n'existe
+1006000001=Impossible de générer le QR code du compte officiel. Raison : {}
+1006000002=Impossible de réinitialiser la quota API du compte officiel. Raison : {}
+1006000003=Impossible de récupérer les données d'augmentation et de diminution des fans. Raison : {}
+1006000004=Impossible de récupérer les données cumulées des fans. Raison : {}
+1006000005=Impossible de récupérer les données de résumé des messages envoyés. Raison : {}
+1006000006=Impossible de récupérer les données d'analyse de l'interface. Raison : {}
+1006001000=Aucune balise n'existe
+1006001001=Impossible de créer la balise. Raison : {}
+1006001002=Impossible de mettre à jour la balise. Raison : {}
+1006001003=Impossible de supprimer la balise. Raison : {}
+1006001004=Impossible de récupérer la balise. Raison : {}
+1006002000=Aucun fan n'existe
+1006002001=Impossible de mettre à jour la balise du fan. Raison : {}
+1006003000=Aucun matériel n'existe
+1006003001=Impossible de télécharger le matériel. Raison : {}
+1006003002=Impossible de télécharger l'image. Raison : {}
+1006003003=Impossible de supprimer le matériel. Raison : {}
+1006004000=Impossible d'envoyer le message. Raison : {}
+1006005000=Impossible de récupérer la liste des publications réussies. Raison : {}
+1006005001=Impossible de soumettre une demande de publication. Raison : {}
+1006005002=Impossible de supprimer la publication. Raison : {}
+1006006000=Impossible de récupérer la liste des brouillons. Raison : {}
+1006006001=Impossible de créer le brouillon. Raison : {}
+1006006002=Impossible de mettre à jour le brouillon. Raison : {}
+1006006003=Impossible de supprimer le brouillon. Raison : {}
+1006007000=Impossible de créer le menu. Raison : {}
+1006007001=Impossible de supprimer le menu. Raison : {}
+1006008000=Aucune réponse automatique n'existe
+1006008001=Échec de l'opération. Une réponse de suivi existe déjà
+1006008002=Échec de l'opération. Une réponse pour ce type de message existe déjà
+1006008003=Échec de l'opération. Une réponse pour ce mot-clé existe déjà
+1007000000=Aucune application n'existe
+1007000002=L'application est désactivée
+1007000003=Impossible de supprimer l'application de paiement car des commandes de paiement existent
+1007000004=Impossible de supprimer l'application de paiement car des commandes de remboursement existent
+1007001000=Aucune configuration de canal de paiement n'existe
+1007001001=Le canal de paiement est désactivé
+1007001004=Le même canal existe déjà
+1007002000=Aucune commande de paiement n'existe
+1007002001=La commande de paiement n'est pas dans l'état "en attente de paiement"
+1007002002=La commande a déjà été payée. Veuillez actualiser la page
+1007002003=La commande de paiement a expiré.
+1007002004=Impossible de démarrer le paiement. Code d'erreur : {}, Message d'erreur : {}
+1007002005=Impossible de rembourser la commande de paiement. L'état n'est ni "payé" ni "remboursé"
+1007003000=Aucune extension de transaction de paiement n'existe
+1007003001=L'extension de transaction de paiement n'est pas dans l'état "en attente de paiement"
+1007003002=La commande a déjà été payée. Veuillez attendre le résultat du paiement
+1007006000=Le montant de remboursement dépasse le montant de remboursement possible de la commande
+1007006002=Le remboursement est déjà en cours
+1007006003=La commande de remboursement existe déjà
+1007006004=Aucune commande de remboursement de paiement n'existe
+1007006005=La commande de remboursement de paiement n'est pas dans l'état "en attente de remboursement"
+1007007000=Aucun portefeuille n'existe
+1007007001=Le solde du portefeuille est insuffisant.
+1007007002=Aucune transaction de portefeuille associée n'a été trouvée
+1007007003=Le remboursement du portefeuille existe déjà
+1007007004=Le solde du portefeuille gelé est insuffisant.
+1007008000=Aucun enregistrement de recharge de portefeuille n'existe
+1007008001=Impossible de mettre à jour l'état de paiement de la recharge du portefeuille. L'enregistrement de recharge du portefeuille n'est pas dans l'état "non payé"
+1007008002=Impossible de mettre à jour l'état de paiement de la recharge du portefeuille. Le numéro de commande de paiement ne correspond pas
+1007008003=Impossible de mettre à jour l'état de paiement de la recharge du portefeuille. La commande de paiement n'est pas dans l'état "payée avec succès"
+1007008004=Impossible de mettre à jour l'état de paiement de la recharge du portefeuille. Le montant de la commande de paiement ne correspond pas
+1007008005=Impossible de démarrer le remboursement du portefeuille. La commande de recharge du portefeuille n'a pas été payée
+1007008006=Impossible de démarrer le remboursement du portefeuille. La commande de recharge du portefeuille a déjà été remboursée
+1007008007=Impossible de démarrer le remboursement du portefeuille. Le solde du portefeuille est insuffisant.
+1007008008=Impossible de mettre à jour le remboursement du portefeuille. Le numéro de commande de remboursement
+1007008009=Impossible de mettre à jour le remboursement du portefeuille. La commande de remboursement n'existe pas
+1007008010=Impossible de mettre à jour le remboursement du portefeuille. Le montant de la commande de remboursement ne correspond pas
+1007008011=Aucun package de recharge de portefeuille n'existe
+1007008012=Le package de recharge de portefeuille est désactivé
+1007008013=Le nom du package de recharge de portefeuille existe déjà
+1007009000=Impossible de démarrer le transfert. Code d'erreur : {}, Message d'erreur : {}
+1007009001=La commande de transfert n'existe pas
+1007009002=Les types de requêtes de transfert identiques ne correspondent pas
+1007009003=Les montants des requêtes de transfert identiques ne correspondent pas
+1007009004=Le transfert pour cette transaction a déjà été démarré. Veuillez vérifier l'état de la commande de transfert associée
+1007009005=La commande de transfert n'est pas dans l'état "en attente de transfert"
+1007009006=La commande de transfert n'est pas dans l'état "en attente de transfert" ou "en cours de transfert"
+1007900000=Aucune commande d'exemple n'existe
+1007900001=Impossible de mettre à jour l'état de paiement de la commande d'exemple. La commande n'est pas dans l'état "non payée"
+1007900002=Impossible de mettre à jour l'état de paiement de la commande d'exemple. Le numéro de commande de paiement ne correspond pas
+1007900003=Impossible de mettre à jour l'état de paiement de la commande d'exemple. La commande de paiement n'est pas dans l'état "payée avec succès"
+1007900004=Impossible de mettre à jour l'état de paiement de la commande d'exemple. Le montant de la commande de paiement ne correspond pas
+1007900005=Impossible de démarrer le remboursement. La commande d'exemple n'a pas été payée
+1007900006=Impossible de démarrer le remboursement. La commande d'exemple a déjà été remboursée
+1007900007=Impossible de démarrer le remboursement. La commande de remboursement n'existe pas
+1007900008=Impossible de démarrer le remboursement. La commande de remboursement n'a pas été retournée avec succès
+1007900009=Impossible de démarrer le remboursement. Le numéro de commande de remboursement ne correspond pas
+1007900010=Impossible de démarrer le remboursement. Le montant de la commande de remboursement ne correspond pas
+1007901001=Aucune commande de transfert d'exemple n'existe
+1007901002=Échec du transfert. Le numéro de commande de transfert ne correspond pas
+1007901003=Échec du transfert. Le montant de la commande de transfert ne correspond pas
+1007901004=Échec du transfert. Le montant de la commande de transfert ne correspond pas
+1007901005=Impossible de soumettre la commande
+1002000000=Échec de la connexion : nom d'utilisateur ou mot de passe incorrect
+1002000001=Échec de la connexion : le compte est désactivé
+1002000002=Veuillez entrer un nom d'utilisateur + numéro de téléphone pour l'authentification afin de vous inscrire
+1002000004=Échec de l'authentification du code
+1002000005=Code d'authentification incorrect : raison : {}
+1002000006=Le jeton a expiré.
+1002000007=Le numéro de téléphone n'existe pas
+1002000100=Un menu avec le même nom existe déjà
+1002000101=Le menu parent n'existe pas
+1002000102=Vous ne pouvez pas définir un menu comme son propre menu parent
+1002000103=Le menu n'existe pas
+1002000104=Le menu ne peut pas être supprimé car il contient des sous-menus
+1002000105=Le type de menu parent doit être un répertoire ou un menu
+1002000200=Le rôle n'existe pas
+1002000201=Un rôle avec le nom [{}] existe déjà
+1002000202=Le code de rôle [{}] existe déjà
+1002000203=Vous ne pouvez pas opérer sur un rôle intégré au système
+1002000204=Le rôle avec le nom [{}] est désactivé
+1002000205=Le code [{}] n'est pas disponible
+1002000300=Le compte utilisateur existe déjà
+1002000301=Le numéro de téléphone existe déjà
+1002000302=L'email existe déjà
+1002000303=L'utilisateur n'existe pas
+1002000304=Les données d'utilisateur importées sont vides
+1002000305=Échec de la validation du mot de passe utilisateur
+1002000306=L'utilisateur avec le nom [{}] est désactivé
+1002000308=Impossible de créer l'utilisateur. Le quota maximum de locataires du locataire a été dépassé ({})
+1002000400=Un département avec le même nom existe déjà
+1002000401=Le département parent n'existe pas
+1002000402=Le département actuel n'existe pas
+1002000403=Le département ne peut pas être supprimé car il contient des sous-départements
+1002000404=Vous ne pouvez pas définir un département comme son propre département parent
+1002000405=Le département ne peut pas être supprimé car il contient des employés
+1002000406=Le département ({}) n'est pas disponible et ne peut donc pas être sélectionné
+1002004007=Vous ne pouvez pas définir un sous-département comme son propre département parent
+1002005000=Le poste actuel n'existe pas
+1002005001=Le poste ({}) n'est pas disponible et ne peut donc pas être sélectionné
+1002005002=Un poste avec le même nom existe déjà
+1002005003=Un poste avec le même identifiant existe déjà
+1002006001=Le type de dictionnaire actuel n'existe pas
+1002006002=Le type de dictionnaire n'est pas disponible et ne peut donc pas être sélectionné
+1002006003=Un type de dictionnaire avec le même nom existe déjà
+1002006004=Un type de dictionnaire avec le même code existe déjà
+1002006005=Le type de dictionnaire ne peut pas être supprimé car des données de dictionnaire existent toujours
+1002007001=Les données de dictionnaire actuelles n'existent pas
+1002007002=Les données de dictionnaire ({}) ne sont pas disponibles et ne peuvent donc pas être sélectionnées
+1002007003=Des données de dictionnaire avec la même valeur existent déjà
+1002008001=Aucune notification actuelle n'existe
+1002011000=Aucun canal SMS n'existe
+1002011001=Le canal SMS n'est pas disponible et ne peut donc pas être sélectionné
+1002011002=Le canal SMS ne peut pas être supprimé car des modèles SMS existent toujours
+1002012000=Aucun modèle SMS n'existe
+1002012001=Le code de modèle SMS [{}] existe déjà
+1002012002=Impossible d'appeler le modèle SMS API. Raison : {}
+1002012003=Le modèle SMS API n'est pas disponible. En revue.
+1002012004=Le modèle SMS API n'est pas disponible. Échec de la revue, {}
+1002012005=Le modèle SMS API n'est pas disponible. Le modèle n'existe pas
+1002013000=Le numéro de téléphone n'existe pas
+1002013001=Le paramètre de modèle ({}) est manquant
+1002013002=Aucun modèle SMS n'existe
+1002014000=Aucun code d'authentification n'existe
+1002014001=Le code d'authentification a expiré.
+1002014002=Le code d'authentification a déjà été utilisé
+1002014003=Le code d'authentification est incorrect.
+1002014004=La limite quotidienne d'envoi de SMS a été dépassée
+1002014005=Les SMS sont envoyés trop fréquemment
+1002014006=Le numéro de téléphone est déjà utilisé
+1002014007=Le code d'authentification n'a pas encore été utilisé
+1002015000=Le locataire n'existe pas
+1002015001=Le locataire avec le nom [{}] est désactivé
+1002015002=Le locataire avec le nom [{}] a expiré
+1002015003=Le locataire système ne peut pas être modifié ou supprimé
+1002015004=Le locataire avec le nom [{}] existe déjà
+1002015005=Le locataire avec le domaine [{}] existe déjà
+1002016000=Le package de locataire n'existe pas
+1002016001=Le locataire utilise ce package. Veuillez réinitialiser le package de locataire avant de le supprimer
+1002016002=Le package de locataire avec le nom [{}] est désactivé
+1002017000=Aucun code d'erreur n'existe
+1002017001=Le code d'erreur [{}] existe déjà
+1002018000=Échec de l'authentification sociale. Raison : {}
+1002018001=Échec de l'authentification sociale. Impossible de trouver l'utilisateur correspondant
+1002018200=Impossible de récupérer le numéro de téléphone
+1002018201=Aucun client social n'existe
+1002018202=Une configuration pour le client social existe déjà
+1002019000=Le mot sensible système n'existe pas pour toutes les balises
+1002019001=Le mot sensible système existe déjà pour la balise
+1002020000=Aucun client OAuth2 n'existe
+1002020001=L'ID du client OAuth2 existe déjà
+1002020002=Le client OAuth2 est désactivé
+1002020003=Format de groupe non pris en charge
+1002020004=La portée des autorisations est trop large
+1002020005=redirect_uri incorrect : {}
+1002020006=client_secret incorrect : {}
+1002021000=client_id ne correspond pas
+1002021001=redirect_uri ne correspond pas
+1002021002=state ne correspond pas
+1002021003=Aucun code n'existe
+1002022000=Aucun code n'existe
+1002022001=Le code a expiré.
+1002023000=Aucun compte email n'existe
+1002023001=Le compte email contient toujours des modèles email. Il ne peut pas être supprimé
+1002024000=Aucun modèle email n'existe
+1002024001=Le code de modèle email ({}) existe déjà
+1002025000=Le paramètre de modèle ({}) est manquant
+1002025001=Aucun email n'existe
+1002026000=Aucun modèle de message interne d'application n'existe
+1002026001=Le code de modèle de message interne d'application [{}] existe déjà
+1002028000=Le paramètre de modèle ({}) est manquant
+1002028001=Aucun modèle de message WeChat n'existe
+1002028002=Erreur de cache du modèle de message WeChat
+1002028003=Aucune configuration système n'existe
+1002028004=Aucune configuration système n'existe

+ 491 - 0
feifan-framework/feifan-common/src/main/resources/i18n/messages_ko_KR.properties

@@ -0,0 +1,491 @@
+1002030000=배분 경로가 존재하지 않습니다
+1002030001=가치가 존재하지 않습니다
+1002030002=배분 출처가 존재하지 않습니다
+1002030003=포인트 테이블이 존재하지 않습니다
+1002030004=계산이 존재하지 않습니다
+1002030005=주문 계산이 존재하지 않습니다
+1002030006=형제 파티션이 존재하지 않습니다
+1002030007=자녀 파티션이 존재하지 않습니다
+1002030008=배분 사용자가 존재하지 않습니다
+1002030009=배분 사용자가 존재하지 않습니다
+1002030010=현재 프로모터가 이미 상위 계층이 있습니다
+1002030011=충돌 파티션이 존재하지 않습니다
+1002030012=플랫폼 이윤이 존재하지 않습니다
+1002030013=플랫폼 이윤 로그 테이블이 존재하지 않습니다
+1002030014=총パーセント가 100을 초과합니다
+1002030015=직접 추천은 이미 추천자가 있으므로 추가할 수 없습니다
+1003031001=공유 링크가 존재하지 않습니다
+1003031002=공유 링크를 통해 새로 등록된 사용자가 존재하지 않습니다
+1004031001=사용자가 제품을 즐겨찾기한 기록이 없습니다
+1005031001=회원 가치 변경 카테고리가 존재하지 않습니다
+1005031002=사용자 체크인 로그가 존재하지 않습니다
+1005031003=체크인에서 저장된 가치 값을 캐시에서 찾을 수 없습니다
+1005031004=출금 요청 기록이 존재하지 않습니다
+1005031005=플랫폼 일일 출금 기록이 존재하지 않습니다
+1005031006=출금 채널 기록이 존재하지 않습니다
+1002030035=충전 소비 포인트 기록이 존재하지 않습니다
+1002030036=소비 포인트 변경 기록이 존재하지 않습니다
+1002030037=소비 포인트 전송 기록이 존재하지 않습니다
+1002030038=사용자 충전 소비 포인트 주문이 존재하지 않습니다
+1001000001=파라미터 구성이 존재하지 않습니다
+1001000002=파라미터 구성 키가 중복됩니다
+1001000003=시스템 내장 파라미터 구성을 삭제할 수 없습니다
+1001000004=파라미터 구성을 가져오지 못했습니다: 보이지 않는 구성에 접근할 수 없습니다
+1001001000=예약 작업이 존재하지 않습니다
+1001001001=예약 작업 프로세서가 이미 존재합니다
+1001001002=상태를 사용可能 또는 사용 불가로만 변경할 수 있습니다
+1001001003=예약 작업이 이미 해당 상태입니다. 수정할 필요가 없습니다
+1001001004=사용 가능한 상태의 작업만 수정할 수 있습니다
+1001001005=잘못된 CRON 표현식입니다
+1001002000=API 오류 로그가 존재하지 않습니다
+1001002001=API 오류 로그가 이미 처리되었습니다
+1001003000=파일 경로가 이미 존재합니다
+1001003001=파일이 존재하지 않습니다
+1001003002=파일이 비어 있습니다
+1003001000=테이블 정의가 이미 존재합니다
+1003001001=가져온 테이블이 존재하지 않습니다
+1003001002=가져온 필드가 존재하지 않습니다
+1003001004=테이블 정의가 존재하지 않습니다
+1003001005=필드 정의가 존재하지 않습니다
+1003001006=동기화된 필드가 존재하지 않습니다
+1003001007=동기화 실패: 변경 사항이 감지되지 않았습니다
+1003001008=데이터베이스에 테이블 코멘트가 입력되지 않았습니다
+1003001009=데이터베이스 필드에 대한 필드 {} 코멘트가 입력되지 않았습니다
+1003001010=마스터 테이블 (i=}) 정의가 존재하지 않습니다. 확인해주세요
+1003001011=서브 테이블 필드 (i=})가 존재하지 않습니다. 확인해주세요
+1003001012=마스터 테이블 코드 생성에 실패했습니다: 서브 테이블이 없습니다
+1003001013=마스터 테이블 코드 생성에 실패했습니다: 서브 테이블 ({})에 필드가 없습니다
+1001006000=파일 구성이 존재하지 않습니다
+1001006001=파일 구성을 삭제할 수 없습니다. 메인 구성이며 삭제하면 파일 업로드가 불가능합니다
+1001007000=데이터 소스 구성이 존재하지 않습니다
+1001007001=데이터 소스 구성이 잘못되어 있습니다. 연결할 수 없습니다
+1001107000=학생이 존재하지 않습니다
+1001201000=예시 연락처가 존재하지 않습니다
+1001201001=예시 카테고리가 존재하지 않습니다
+1001201002=하위 예시 카테고리가 존재하므로 삭제할 수 없습니다
+1001201003=상위 예시 카테고리가 존재하지 않습니다
+1001201004=자신을 상위 예시 카테고리로 설정할 수 없습니다
+1001201005=이름이 같은 예시 카테고리가 이미 있습니다
+1001201006=하위 예시 카테고리를 상위 예시 카테고리로 설정할 수 없습니다
+1001201007=학생이 존재하지 않습니다
+1001201008=학생 클래스가 존재하지 않습니다
+1001201009=학생 클래스가 이미 존재합니다
+1001201010=URL의 도메인이 지정된 도메인이 아닙니다
+1008001000=제품 카테고리가 존재하지 않습니다
+1008001001=상위 카테고리가 존재하지 않습니다
+1008001002=상위 카테고리는 중요 카테고리가 될 수 없습니다
+1008001003=하위 카테고리가 존재하므로 삭제할 수 없습니다
+1008001004=제품 카테고리 ({})이 사용 불가능합니다. 사용이 중지되었습니다
+1008001005=이 카테고리에 제품이 존재하므로 삭제할 수 없습니다
+1008002000=브랜드가 존재하지 않습니다
+1008002001=브랜드가 사용 중지되었습니다
+1008002002=브랜드 이름이 이미 존재합니다
+1008003000=속성 항목이 존재하지 않습니다
+1008003001=속성 항목 이름이 이미 존재합니다
+1008003002=속성 항목에 속성 값이 존재하므로 삭제할 수 없습니다
+1008004000=속성 값이 존재하지 않습니다
+1008004001=속성 값 이름이 이미 존재합니다
+1008005000=제품 SPU가 존재하지 않습니다
+1008005001=제품 카테고리가 잘못되었습니다: 2단계 이하를 사용해야 합니다
+1008005002=제품 SPU를 저장하지 못했습니다: 쿠폰이 존재하지 않습니다
+1008005003=제품 SPU [{}]이 목록 상태가 아닙니다
+1008005004=제품 SPU가 휴지통 상태가 아닙니다
+1008006000=제품 SKU가 존재하지 않습니다
+1008006001=제품 SKU에 중복된 속성 조합이 있습니다
+1008006002=SPU에 속한 각 SKU는 동일한 속성 항목을 가져야 합니다
+1008006003=SPU에 속한 각 SKU는 고유해야 합니다
+1008006004=제품 SKU의 재고가 부족합니다
+1008007000=제품 리뷰가 존재하지 않습니다
+1008007001=주문의 제품에 대한 리뷰가 이미 존재합니다
+1008008000=이 제품은 이미 즐겨찾기에 추가되었습니다
+1008008001=제품 즐겨찾기가 존재하지 않습니다
+1013001000=한정 시간 할인 이벤트가 존재하지 않습니다
+1013001001=다른 한정 시간 할인 이벤트에 제품이 존재합니다
+1013001002=한정 시간 할인 이벤트는 종료되어 수정할 수 없습니다
+1013001003=한정 시간 할인 이벤트는 종료되지 않았으며 삭제할 수 없습니다
+1013001004=한정 시간 할인 이벤트는 종료되어 다시 종료할 수 없습니다
+1013002000=배너가 존재하지 않습니다
+1013003000=쿠폰에 사용할 수 있는 제품이 없습니다
+1013003001=결제된 제품이 최소 요구 금액을 충족하지 못했습니다
+1013004000=쿠폰 템플릿이 존재하지 않습니다
+1013004001=배분 수량이 이미 청구된 수량보다 적어야 합니다 ({})
+1013004002=남은 수량이 부족하여 청구할 수 없습니다
+1013004003=이미 이 쿠폰을 청구했습니다
+1013004004=쿠폰이 만료되었습니다
+1013004005=잘못된 청구 방법입니다
+1013005000=쿠폰이 존재하지 않습니다
+1013005001=쿠폰을 되찾을 수 없습니다. 이미 사용되었습니다
+1013005002=쿠폰이 대기 중인 사용 상태가 아닙니다
+1013005003=쿠폰이 유효한 사용 기간 내에 없습니다
+1013005004=쿠폰이 사용된 상태가 아닙니다
+1013006000=전액 할인 프로모션이 존재하지 않습니다
+1013006001=다른 전액 할인 프로모션에 제품이 존재합니다
+1013006002=전액 할인 프로모션은 종료되어 수정할 수 없습니다
+1013006003=전액 할인 프로모션은 종료되지 않았거나 종료되지 않았으며 삭제할 수 없습니다
+1013006004=전액 할인 프로모션은 종료되어 다시 종료할 수 없습니다
+1013006005=전액 할인 프로모션이 종료되어 종료할 수 없습니다
+1013008000=플래시 세일 이벤트가 존재하지 않습니다
+1013008002=다른 플래시 세일 이벤트에 제품이 존재하며 시간 충돌이 있습니다
+1013008003=플래시 세일 이벤트는 종료되어 수정할 수 없습니다
+1013008004=플래시 세일 이벤트는 종료되지 않았거나 종료되지 않았으며 삭제할 수 없습니다
+1013008005=플래시 세일 이벤트는 종료되어 다시 종료할 수 없습니다
+1013008006=플래시 세일 실패: 플래시 세일 인VENTORY가 부족합니다
+1013008007=플래시 세일 실패: 활동 시간 범위 내에 없습니다
+1013008008=플래시 세일 실패: 플래시 세일 이벤트가 종료되었습니다
+1013008009=플래시 세일 실패: 단일 구매 제한 초과
+1013008010=플래시 세일 실패: 제품이 존재하지 않습니다
+1013009000=플래시 세일 시간 슬롯이 존재하지 않습니다
+1013009001=플래시 세일 시간 슬롯 충돌
+1013009004=플래시 세일 시간 슬롯이 종료되었습니다
+1013010000=그룹 구매 이벤트가 존재하지 않습니다
+1013010001=다른 그룹 구매 이벤트에 제품이 존재합니다
+1013010002=그룹 구매 이벤트는 종료되어 수정할 수 없습니다
+1013010003=그룹 구매 이벤트는 종료되지 않았거나 종료되지 않았으며 삭제할 수 없습니다
+1013010004=그룹 구매 실패: 그룹 구매 이벤트가 종료되었습니다
+1013010005=그룹 구매 실패: 그룹 구매 제품이 존재하지 않습니다
+1013010006=그룹 구매 실패: 그룹 구매 제품의 재고가 부족합니다
+1013011000=그룹이 존재하지 않습니다
+1013011001=그룹 구매 실패: 이미 그룹에 참여했습니다
+1013011002=그룹 구매 실패: 상위 그룹이 존재하지 않습니다
+1013011003=그룹 구매 실패: 그룹이 가득 찼습니다
+1013011004=그룹 구매 실패: 해당 이벤트에 대한 진행 중인 그룹 구매 기록이 있습니다
+1013011005=그룹 구매 실패: 이벤트가 시작되지 않았습니다
+1013011006=그룹 구매 실패: 이벤트가 종료되었습니다
+1013011007=그룹 구매 실패: 단일 구매 제한 초과
+1013011008=그룹 구매 실패: 총 구매 제한 초과
+1013011009=그룹 구매 실패: 미결제 주문이 존재합니다. 먼저 결제해주세요
+1013012000=담기 이벤트가 존재하지 않습니다
+1013012001=다른 담기 이벤트에 제품이 존재합니다
+1013012002=담기 이벤트는 종료되어 수정할 수 없습니다
+1013012003=담기 이벤트는 종료되지 않았거나 종료되지 않았으며 삭제할 수 없습니다
+1013012004=담기 이벤트의 재고가 부족합니다
+1013012005=담기 이벤트는 종료되었습니다
+1013012006=담기 이벤트는 종료되었습니다
+1013013000=담기 기록이 존재하지 않습니다
+1013013001=참여 실패: 이미 담기 이벤트에 참여했습니다
+1013013002=참여 실패: 담기 이벤트에 참여할 수 있는 한도에 도달했습니다
+1013013004=주문 실패: 담기에 성공하지 못했습니다
+1013013005=주문 실패: 담기 주문이 이미 등록되었습니다
+1013014000=도움 실패: 담기 기록이 진행 중이 아닙니다
+1013014001=도움 실패: 자신을 도울 수 없습니다
+1013014002=도움 실패: 담기 이벤트에 도움을 줄 수 있는 한도에 도달했습니다
+1013014003=도움 실패: 다시 시도해주세요
+1013014004=도움 실패: 이미 도움을 주었습니다
+1013015000=기사 카테고리가 존재하지 않습니다
+1013015001=기사 카테고리 삭제에 실패했습니다: 관련 기사가 존재합니다
+1013016000=기사가 존재하지 않습니다
+1013017000=디코레이션 템플릿이 존재하지 않습니다
+1013017001=디코레이션 템플릿 이름 ({})이 이미 사용되고 있습니다
+1013017002=사용 중인 템플릿을 삭제할 수 없습니다
+1013018000=디코레이션 페이지가 존재하지 않습니다
+1013018001=디코레이션 페이지 이름 ({})이 이미 사용되고 있습니다
+1101001001=상점이 존재하지 않습니다
+1002029003=업체 신청이 존재하지 않습니다
+1002029004=업체 신청 기록이 존재하지 않습니다
+1002029005=사용자는 대리상이 아니다
+1011000010=거래 주문 항목이 존재하지 않습니다
+1011000011=거래 주문이 존재하지 않습니다
+1011000012=거래 주문서의 사후 상태 업데이트에 실패했습니다. 다시 시도하십시오
+1011000013=결제 상태의 거래 주문을 업데이트하지 못했습니다. 주문이 "미결제" 상태가 아닙니다
+1011000014=결제 상태의 거래 주문을 업데이트하지 못했습니다. 결제 주문 번호 불일치
+1011000015=결제 상태의 거래 주문을 업데이트하지 못했습니다. 결제 주문이 "결제 성공" 상태가 아닙니다
+1011000016=결제 상태의 거래 주문을 업데이트하지 못했습니다. 결제 주문 금액 불일치
+1011000017=거래 주문을 배송하지 못했습니다. 주문이 "배송 대기" 상태가 아닙니다
+1011000018=거래 주문을 받지 못했습니다. 주문이 "수신 대기" 상태가 아닙니다
+1011000019=거래 주문 항목에 대한 리뷰를 작성하지 못했습니다. 주문이 "완료" 상태가 아닙니다
+1011000020=거래 주문 항목에 대한 리뷰를 작성하지 못했습니다. 주문이 이미 리뷰되었습니다
+1011000021=거래 주문을 배송하지 못했습니다. 주문이 환불되었거나 부분 환불되었습니다
+1011000022=거래 주문을 배송하지 못했습니다. 그룹 구매에 성공하지 못했습니다
+1011000023=거래 주문을 배송하지 못했습니다. 담기에 성공하지 못했습니다
+1011000024=거래 주문을 배송하지 못했습니다. 배송 유형이 COURIER가 아닙니다
+1011000025=거래 주문을 취소하지 못했습니다. 주문이 "결제 대기" 상태가 아닙니다
+1011000026=결제 주문 가격을 조정하지 못했습니다. 결제 주문이 이미 결제되었습니다. 가격을 조정할 수 없습니다
+1011000027=결제 주문 가격을 조정하지 못했습니다. 가격이 이미 조정되었습니다
+1011000028=조정된 결제 가격은 0.01 위안보다 낮을 수 없습니다
+1011000029=거래 주문을 삭제하지 못했습니다. 주문이 "취소된" 상태가 아닙니다
+1011000030=거래 주문을 집고 가기 위해.failed to pick up transaction order: 주문이 "user pickup" 배송 유형이 아닙니다
+1011000031=거래 주문 주소를 수정하지 못했습니다. 주문이 "배송 대기" 상태가 아닙니다
+1011000032=거래 주문을 생성하지 못했습니다. 미결제 주문이 존재합니다
+1011000100=판매후 계산서가 존재하지 않습니다
+1011000101=적용된 환불 금액이 잘못되었습니다
+1011000102=주문서가 종료되어 애프터서비스 신청을 할 수 없습니다
+1011000103=주문서가 발송되지 않아 as 신청이 불가능합니다
+1011000104=주문서가 발송되지 않아 as 신청이 불가능합니다
+1011000105=주문서는 이미 as 신청을 했기 때문에 중복 신청할 수 없습니다
+1011000106=승인 실패, 판매 후 상태가 승인 상태에 있지 않습니다
+1011000107=판매 후 주문서 작업에 실패했습니다. 새로 고친 후 다시 시도하십시오
+1011000108=상품수취확인실패, 판매후 명세서 상태가 「 접수확인중 」이 아닙니다.
+1011000109=상품수취확인실패, 판매후 명세서 상태가 「 접수확인중 」이 아닙니다.
+1011000110=환불 실패, 판매 후 명세서 상태는 환불 대기 상태가 아닙니다.
+1011000111=판매후 명세서 취소가 실패, 판매후 명세서 상태는 【 확인 】 또는 [판매자 동의 】 또는 [판매자 접수중]이 아닙니다.
+1011002000=쇼핑 카트 항목이 존재하지 않습니다
+1011003000=결제 가격 계산 오류: 가격이 0이거나 이하입니다
+1011003002=택배 비용 계산 오류: 해당하는 택배 비용 템플릿이 없습니다
+1011003004=플래시 세일, 그룹 구매, 담기 등의 프로모션 제품은 쿠폰을 사용할 수 없습니다
+1011003005=플래시 세일 제품이 총 구매 제한을 초과했습니다
+1011004000=택배 회사가 존재하지 않습니다
+1011004001=이 코드의 택배 회사가 이미 존재합니다
+1011004002=택배 서비스 제공자와 연결되어 "Express 100"과 같은 서비스를 사용해야 합니다
+1011004003=택배 회사가 사용 가능하지 않습니다
+1011004101=택배 조회 인터페이스 예외
+1011004102=택배 조회가 실패했습니다: 이유: {}
+1011005000=택배 비용 템플릿 이름이 이미 존재합니다
+1011005001=택배 비용 템플릿이 존재하지 않습니다
+1011006000=자가 수령 상점이 존재하지 않습니다
+1011007000=배분 사용자가 존재하지 않습니다
+1011007001=사용자의 냉동 커미션 ({})이 부족합니다
+1011007002=자신과 바인딩할 수 없습니다
+1011007003=바인딩된 사용자가 프로모션 자격이 없습니다
+1011007004=백엔드에서만 프로모터를 바인딩할 수 있습니다
+1011007005=등록 중에만 바인딩할 수 있습니다
+1011007006=이미 프로모터에 바인딩되었습니다
+1011007007=하위 사용자는 자신의 상급자에게 바인딩할 수 없습니다
+1011007008=2단계 이하의 등급만 지원됩니다
+1011008000=커미션 출금 기록이 존재하지 않습니다
+1011008001=커미션 출금 기록이 검토 중인 상태가 아닙니다
+1011008002=출금 금액은 {} 위안보다 낮을 수 없습니다
+1011008003=최대 {} 위안까지 출금할 수 있습니다
+1011008004=위챗 템플릿 메시지 로그가 존재하지 않습니다
+1011008005=결제에 충분한 지갑 포인트가 없습니다
+1011008006=결제에 충분한 지갑 소비 포인트가 없습니다
+1011008011=JPush 메시지 로그가 존재하지 않습니다
+1004001000=사용자가 존재하지 않습니다
+1004001001=휴대폰 번호가 등록되지 않았습니다
+1004001002=휴대폰 번호를 수정하지 못했습니다. 휴대폰 번호 ({})이 이미 사용되고 있습니다
+1004001003=사용자 포인트 잔액이 부족합니다
+1004001004=잘못된 휴대폰 번호입니다
+1004003000=로그인에 실패했습니다: 잘못된 사용자 이름 또는 암호입니다
+1004003001=로그인에 실패했습니다: 계정이 사용 불가능합니다
+1004003005=로그인에 실패했습니다: 제3자 로그인 정보를 분석할 수 없습니다
+1004003006=로그인에 실패했습니다: 해당 사용자를 찾을 수 없습니다
+1004003007=휴대폰 번호가 이미 사용되고 있습니다
+1004004000=사용자 배송 주소가 존재하지 않습니다
+1004006000=사용자 태그가 존재하지 않습니다
+1004006001=사용자 태그가 이미 존재합니다
+1004006002=사용자 태그 하에 사용자가 존재하므로 삭제할 수 없습니다
+1004008000=지원되지 않는 사용자 포인트 기록 비즈니스 유형입니다
+1004009000=체크인 일자 규칙이 존재하지 않습니다
+1004009001=체크인 일자 규칙이 이미 존재합니다
+1004010000=이미 오늘 체크인했습니다. 다시 체크인하지 마세요
+1004011000=사용자 등급이 존재하지 않습니다
+1004011001=사용자 등급 이름 [{}]이 이미 사용되고 있습니다
+1004011002=사용자 등급 값 [{}]이 [{}]에 의해 이미 사용되고 있습니다
+1004011003=업그레이드 경험치가 이전 등급에서 설정한 업그레이드 경험치보다 커야 합니다 [{}]]
+1004011004=업그레이드 경험치가 다음 등급에서 설정한 업그레이드 경험치보다 작아야 합니다 [{}]]
+1004011005=해당 사용자 등급 하에 사용자가 존재하므로 삭제할 수 없습니다
+1004011201=지원되지 않는 사용자 경험 비즈니스 유형입니다
+1004012000=사용자 그룹이 존재하지 않습니다
+1004012001=해당 사용자 그룹 하에 사용자가 존재하므로 삭제할 수 없습니다
+1004012003=이 사용자 이름이 이미 존재합니다. 다른 것을 선택해주세요!
+1004012004=이 휴대폰 번호는 이미 바인딩 한도에 도달했습니다
+1004012102=이 WeChat 계정은 이미 바인딩 한도에 도달했습니다
+1004012005=등록은 공유를 통해 완료해야 합니다
+1004012006=등록에 실패했습니다. 현재 페이지를 종료하고 다시 공유 QR 코드를 스캔하여 등록해주세요
+1004012007=탐색에 실패했습니다. 멤버 사용자가 시스템 사용자에 바인딩되지 않았습니다
+1006000000=WeChat 공식 계정이 존재하지 않습니다
+1006000001=공식 계정 QR 코드를 생성하지 못했습니다. 이유: {}
+1006000002=공식 계정 API 할당량을 지우지 못했습니다. 이유: {}
+1006001000=팬 증가 및 감소 데이터를 가져오지 못했습니다. 이유: {}
+1006001001=누적 팬 데이터를 가져오지 못했습니다. 이유: {}
+1006001002=메시지 전송 요약 데이터를 가져오지 못했습니다. 이유: {}
+1006001003=인터페이스 분석 데이터를 가져오지 못했습니다. 이유: {}
+1006002000=태그가 존재하지 않습니다
+1006002001=태그를 생성하지 못했습니다. 이유: {}
+1006002002=태그를 업데이트하지 못했습니다. 이유: {}
+1006002003=태그를 삭제하지 못했습니다. 이유: {}
+1006002004=태그를 가져오지 못했습니다. 이유: {}
+1006003000=팬이 존재하지 않습니다
+1006003001=팬 태그를 업데이트하지 못했습니다. 이유: {}
+1006004000=재료가 존재하지 않습니다
+1006004001=재료를 업로드하지 못했습니다. 이유: {}
+1006004002=이미지를 업로드하지 못했습니다. 이유: {}
+1006004003=재료를 삭제하지 못했습니다. 이유: {}
+1006005000=메시지를 전송하지 못했습니다. 이유: {}
+1006006000=성공적으로 발행된 목록을 가져오지 못했습니다. 이유: {}
+1006006001=발행 신청을 할 수 없습니다. 이유: {}
+1006006002=발행을 삭제하지 못했습니다. 이유: {}
+1006007000=ドラフト 목록을 가져오지 못했습니다. 이유: {}
+1006007001=ドラフト를 생성하지 못했습니다. 이유: {}
+1006007002=ドラフト를 업데이트하지 못했습니다. 이유: {}
+1006007003=ドラフト를 삭제하지 못했습니다. 이유: {}
+1006008000=메뉴를 생성하지 못했습니다. 이유: {}
+1006008001=메뉴를 삭제하지 못했습니다. 이유: {}
+1006009000=자동 응답이 존재하지 않습니다
+1006009001=작업에 실패했습니다. 팔로우 응답이 이미 존재합니다
+1006009002=작업에 실패했습니다. 이 메시지 유형에 대한 응답이 이미 존재합니다
+1006009003=작업에 실패했습니다. 이 키워드에 대한 응답이 이미 존재합니다
+1007000000=앱이 존재하지 않습니다
+1007000002=앱이 사용 중지되었습니다
+1007000003=결제 주문이 존재하므로 결제 앱을 삭제할 수 없습니다
+1007000004=환불 주문이 존재하므로 결제 앱을 삭제할 수 없습니다
+1007001000=결제 채널 구성이 존재하지 않습니다
+1007001001=결제 채널이 사용 중지되었습니다
+1007001004=같은 채널이 이미 존재합니다
+1007002000=결제 주문이 존재하지 않습니다
+1007002001=결제 주문이 "결제 대기 중"이 아닙니다
+1007002002=주문이 이미 결제되었습니다. 페이지를 새로 고침해주세요
+1007002003=결제 주문이 만료되었습니다
+1007002004=결제를 시작하지 못했습니다. 에러 코드: {}, 에러 메시지: {}
+1007002005=결제 주문을 환불하지 못했습니다. 상태가 "결제됨"도 아니고 "환불됨"도 아닙니다
+1007003000=결제 거래 확장 기능이 존재하지 않습니다
+1007003001=결제 거래 확장 기능이 "결제 대기 중"이 아닙니다
+1007003002=주문이 이미 결제되었습니다. 결제 결과를 기다려주세요
+1007006000=환불 금액이 주문의 환불 가능 금액을 초과합니다
+1007006002=환불이 이미 진행 중입니다
+1007006003=환불 주문이 이미 존재합니다
+1007006004=결제 환불 주문이 존재하지 않습니다
+1007006005=결제 환불 주문이 "환불 대기 중"이 아닙니다
+1007007000=지갑이 존재하지 않습니다
+1007007001=지갑 잔액이 부족합니다
+1007007002=관련 지갑 거래를 찾을 수 없습니다
+1007007003=지갑 환불이 이미 존재합니다
+1007007004=냉동 지갑 잔액이 부족합니다
+1007008000=지갑 충전 기록이 존재하지 않습니다
+1007008001=지갑 충전 결제 상태를 업데이트하지 못했습니다. 지갑 충전 기록이 "미결제" 상태가 아닙니다
+1007008002=지갑 충전 결제 상태를 업데이트하지 못했습니다. 결제 주문 번호 불일치
+1007008003=지갑 충전 결제 상태를 업데이트하지 못했습니다. 결제 주문이 "결제 성공" 상태가 아닙니다
+1007008004=지갑 충전 결제 상태를 업데이트하지 못했습니다. 결제 주문 금액 불일치
+1007008005=지갑 환불을 시작하지 못했습니다. 지갑 충전 주문이 결제되지 않았습니다
+1007008006=지갑 환불을 시작하지 못했습니다. 지갑 충전 주문이 이미 환불되었습니다
+1007008007=지갑 환불을 시작하지 못했습니다. 지갑 잔액이 부족합니다
+1007008008=지갑 환불을 업데이트하지 못했습니다. 지갑 환불 주문 번호 불일치
+1007008009=지갑 환불을 업데이트하지 못했습니다. 환불 주문이 존재하지 않습니다
+1007008010=지갑 환불을 업데이트하지 못했습니다. 환불 주문 금액 불일치
+1007008011=지갑 충전 패키지가 존재하지 않습니다
+1007008012=지갑 충전 패키지가 사용 중지되었습니다
+1007008013=지갑 충전 패키지 이름이 이미 존재합니다
+1007009000=전송을 시작하지 못했습니다. 에러 코드: {}, 에러 메시지: {}
+1007009001=전송 주문이 존재하지 않습니다
+1007009002=두 개의 동일한 전송 요청 유형 불일치
+1007009003=두 개의 동일한 전송 요청 금액 불일치
+1007009004=이 거래에 대한 전송을 이미 시작했습니다. 관련 전송 주문 상태를 확인해주세요
+1007009005=전송 주문이 "전송 대기 중"이 아닙니다
+1007009006=전송 주문이 "전송 대기 중" 또는 "전송 중" 상태가 아닙니다
+1007900000=예시 주문이 존재하지 않습니다
+1007900001=예시 주문의 결제 상태를 업데이트하지 못했습니다. 주문이 "미결제" 상태가 아닙니다
+1007900002=예시 주문의 결제 상태를 업데이트하지 못했습니다. 결제 주문 번호 불일치
+1007900003=예시 주문의 결제 상태를 업데이트하지 못했습니다. 결제 주문이 "결제 성공" 상태가 아닙니다
+1007900004=예시 주문의 결제 상태를 업데이트하지 못했습니다. 결제 주문 금액 불일치
+1007900005=환불을 시작하지 못했습니다. 예시 주문이 결제되지 않았습니다
+1007900006=환불을 시작하지 못했습니다. 예시 주문이 이미 환불되었습니다
+1007900007=환불을 시작하지 못했습니다. 환불 주문이 존재하지 않습니다
+1007900008=환불을 시작하지 못했습니다. 환불 주문이 성공적으로 반환되지 않았습니다
+1007900009=환불을 시작하지 못했습니다. 환불 주문 번호 불일치
+1007900010=환불을 시작하지 못했습니다. 환불 주문 금액 불일치
+1007901001=예시 전송 주문이 존재하지 않습니다
+1007901002=전송에 실패했습니다. 전송 주문 번호 불일치
+1007901003=전송에 실패했습니다. 전송 주문 금액 불일치
+1007901004=전송에 실패했습니다. 전송 주문 금액 불일치
+1007901005=주문을 제출하지 못했습니다
+1002000000=로그인에 실패했습니다: 잘못된 사용자 이름 또는 암호입니다
+1002000001=로그인에 실패했습니다: 계정이 사용 불가능합니다
+1002000002=등록하려면 사용자 이름 + 휴대폰 번호를 입력하여 인증해주세요
+1002000004=코드 인증에 실패했습니다
+1002000005=잘못된 인증 코드: 이유: {}
+1002000006=토큰이 만료되었습니다
+1002000007=휴대폰 번호가 존재하지 않습니다
+1002001000=이름이 같은 메뉴가 이미 존재합니다
+1002001001=상위 메뉴가 존재하지 않습니다
+1002001002=자신을 상위 메뉴로 설정할 수 없습니다
+1002001003=메뉴가 존재하지 않습니다
+1002001004=하위 메뉴가 존재하므로 삭제할 수 없습니다
+1002001005=상위 메뉴 유형은 디렉토리나 메뉴여야 합니다
+1002002000=역할이 존재하지 않습니다
+1002002001=이름이 [{}]인 역할이 이미 존재합니다
+1002002002=역할 코드 [{}]이 이미 존재합니다
+1002002003=시스템 내장 역할을 운영할 수 없습니다
+1002002004=이름이 [{}]인 역할은 사용 불가능합니다
+1002002005=코드 [{}]는 사용할 수 없습니다
+1002003000=사용자 계정이 이미 존재합니다
+1002003001=휴대폰 번호가 이미 존재합니다
+1002003002=이메일이 이미 존재합니다
+1002003003=사용자가 존재하지 않습니다
+1002003004=가져온 사용자 데이터가 비어 있습니다
+1002003005=사용자 암호 검증에 실패했습니다
+1002003006=이름이 [{}]인 사용자는 사용 불가능합니다
+1002003008=사용자를 생성하지 못했습니다. 테넌트의 최대 테넌트 할당량을 초과했습니다 ({})
+1002004000=이름이 같은 부서가 이미 존재합니다
+1002004001=상위 부서가 존재하지 않습니다
+1002004002=현재 부서가 존재하지 않습니다
+1002004003=하위 부서가 존재하므로 삭제할 수 없습니다
+1002004004=자신을 상위 부서로 설정할 수 없습니다
+1002004005=부서에 직원이 존재하므로 삭제할 수 없습니다
+1002004006=부서 ({})이 사용 가능한 상태가 아니므로 선택할 수 없습니다
+1002004007=하위 부서를 자신의 상위 부서로 설정할 수 없습니다
+1002005000=현재 직급이 존재하지 않습니다
+1002005001=직급 ({})이 사용 가능한 상태가 아니므로 선택할 수 없습니다
+1002005002=이름이 같은 직급이 이미 존재합니다
+1002005003=이 식별자와 같은 직급이 이미 존재합니다
+1002006001=현재 사전 유형이 존재하지 않습니다
+1002006002=사전 유형이 사용 가능한 상태가 아니므로 선택할 수 없습니다
+1002006003=이름이 같은 사전 유형이 이미 존재합니다
+1002006004=코드가 같은 사전 유형이 이미 존재합니다
+1002006005=사전 유형을 삭제할 수 없습니다. 사전 데이터가 여전히 존재합니다
+1002007001=현재 사전 데이터가 존재하지 않습니다
+1002007002=사전 데이터 ({})이 사용 가능한 상태가 아니므로 선택할 수 없습니다
+1002007003=이 값과 같은 사전 데이터가 이미 존재합니다
+1002008001=현재 공지가 존재하지 않습니다
+1002011000=SMS 채널이 존재하지 않습니다
+1002011001=SMS 채널이 사용 가능한 상태가 아니므로 선택할 수 없습니다
+1002011002=SMS 채널을 삭제할 수 없습니다. SMS 템플릿이 여전히 존재합니다
+1002012000=SMS 템플릿이 존재하지 않습니다
+1002012001=SMS 템플릿 코드 [{}]이 이미 존재합니다
+1002012002=SMS API 템플릿을 호출하지 못했습니다. 이유: {}
+1002012003=SMS API 템플릿을 사용할 수 없습니다. 검토 중입니다
+1002012004=SMS API 템플릿을 사용할 수 없습니다. 검토에 실패했습니다, {}
+1002012005=SMS API 템플릿을 사용할 수 없습니다. 템플릿이 존재하지 않습니다
+1002013000=휴대폰 번호가 존재하지 않습니다
+1002013001=템플릿 파라미터 ({})이 누락되었습니다
+1002013002=SMS 템플릿이 존재하지 않습니다
+1002014000=인증 코드가 존재하지 않습니다
+1002014001=인증 코드가 만료되었습니다
+1002014002=인증 코드가 이미 사용되었습니다
+1002014003=잘못된 인증 코드입니다
+1002014004=일일 SMS 발송 한도를 초과했습니다
+1002014005=SMS가 너무 빈번하게 발송되었습니다
+1002014006=휴대폰 번호가 이미 사용되고 있습니다
+1002014007=인증 코드가 아직 사용되지 않았습니다
+1002015000=테넌트가 존재하지 않습니다
+1002015001=이름이 [{}]인 테넌트는 사용 불가능합니다
+1002015002=이름이 [{}]인 테넌트는 만료되었습니다
+1002015003=시스템 테넌트는 수정하거나 삭제할 수 없습니다
+1002015004=이름이 [{}]인 테넌트가 이미 존재합니다
+1002015005=도메인이 [{}]인 테넌트가 이미 존재합니다
+1002016000=테넌트 패키지가 존재하지 않습니다
+1002016001=테넌트가 이 패키지를 사용 중입니다. 테넌트 패키지를 재설정해주세요 삭제하기 전에
+1002016002=이름이 [{}]인 테넌트 패키지는 사용 중지되었습니다
+1002017000=에러 코드가 존재하지 않습니다
+1002017001=에러 코드 [{}]이 이미 존재합니다
+1002018000=소셜 인증에 실패했습니다. 이유: {}
+1002018001=소셜 인증에 실패했습니다. 해당 사용자를 찾을 수 없습니다
+1002018200=휴대폰 번호를 가져오지 못했습니다
+1002018201=소셜 클라이언트가 존재하지 않습니다
+1002018202=소셜 클라이언트에 대한 구성이 이미 존재합니다
+1002019000=시스템 민감한 단어가 모든 태그에 존재하지 않습니다
+1002019001=태그에 시스템 민감한 단어가 이미 존재합니다
+1002020000=OAuth2 클라이언트가 존재하지 않습니다
+1002020001=OAuth2 클라이언트 ID가 이미 존재합니다
+1002020002=OAuth2 클라이언트가 사용 중지되었습니다
+1002020003=지원되지 않는 그룹 형식
+1002020004=권한 범위가 너무 큽니다
+1002020005=잘못된 redirect_uri: {}
+1002020006=잘못된 client_secret: {}
+1002021000=client_id가 일치하지 않습니다
+1002021001=redirect_uri가 일치하지 않습니다
+1002021002=state가 일치하지 않습니다
+1002021003=코드가 존재하지 않습니다
+1002022000=코드가 존재하지 않습니다
+1002022001=코드가 만료되었습니다
+1002023000=이메일 계정이 존재하지 않습니다
+1002023001=이메일 계정에 여전히 이메일 템플릿이 있습니다. 삭제할 수 없습니다
+1002024000=이메일 템플릿이 존재하지 않습니다
+1002024001=이메일 템플릿 코드 ({})이 이미 존재합니다
+1002025000=템플릿 파라미터 ({})이 누락되었습니다
+1002025001=이메일이 존재하지 않습니다
+1002026000=앱 내 메시지 템플릿이 존재하지 않습니다
+1002026001=앱 내 메시지 템플릿 코드 [{}]이 이미 존재합니다
+1002028000=템플릿 파라미터 ({})이 누락되었습니다
+1002028001=WeChat 메시지 템플릿이 존재하지 않습니다
+1002028002=WeChat 메시지 템플릿 캐시 오류
+1002028003=시스템 구성이 존재하지 않습니다
+1002028004=시스템 구성이 존재하지 않습니다

+ 1 - 1
feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/enums/ErrorCodeConstants.java

@@ -34,7 +34,7 @@ public interface ErrorCodeConstants {
     ErrorCode REDIS_ORDER_PERCENTAGE_NOT_EXISTS = new ErrorCode(1_005_031_003, "缓存中没有找到存储的签到获取的身价值");
     ErrorCode APPLICATION_FOR_WITHDRAWAL_NOT_EXISTS = new ErrorCode(1_005_031_004, "提现申请记录不存在");
     ErrorCode PT_DAILY_WITHDRAWAL_NOT_EXISTS = new ErrorCode(1_005_031_005, "平台每日提现记录不存在");
-    ErrorCode APPLICATION_FOR_WITHDRAWAL_CHANNEL_NOT_EXISTS = new ErrorCode(1_005_031_005, "提现渠道记录不存在");
+    ErrorCode APPLICATION_FOR_WITHDRAWAL_CHANNEL_NOT_EXISTS = new ErrorCode(1_005_031_006, "提现渠道记录不存在");
     ErrorCode CONSUMPTION_TOP_UP_LOG_NOT_EXISTS = new ErrorCode(1_002_030_035, "充值消费分记录不存在");
     ErrorCode CONSUMPTION_CHANGE_LOG_NOT_EXISTS = new ErrorCode(1_002_030_036, "消费分变动记录不存在");
     ErrorCode CONSUMPTION_TRANSFER_LOG_NOT_EXISTS = new ErrorCode(1_002_030_037, "消费分转让记录不存在");

+ 4 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/orderpercentage/OrderPercentageDO.java

@@ -118,4 +118,8 @@ public class OrderPercentageDO extends BaseDO {
      * 触发倍率的最低金额
      */
     private String triggerMagnificationPoints;
+    /**
+     * 成为代理商所需金额
+     */
+    private String agentQuota;
 }

+ 11 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/consumptiontransferlog/ConsumptionTransferLogServiceImpl.java

@@ -12,6 +12,8 @@ import cn.newfeifan.mall.module.distri.service.consumptionchangelog.ConsumptionC
 import cn.newfeifan.mall.module.distri.service.integral.IntegralService;
 import cn.newfeifan.mall.module.member.dal.dataobject.user.MemberUserDO;
 import cn.newfeifan.mall.module.member.service.user.MemberUserService;
+import cn.newfeifan.mall.module.system.api.sms.dto.code.SmsCodeSendReqDTO;
+import cn.newfeifan.mall.module.system.enums.sms.SmsSceneEnum;
 import cn.newfeifan.mall.module.system.service.sms.SmsCodeService;
 import org.springframework.stereotype.Service;
 
@@ -112,6 +114,15 @@ public class ConsumptionTransferLogServiceImpl implements ConsumptionTransferLog
         consumptionTransferLog.setAfterTransferConsumptionPoints(transferIntegral.getConsumptionPoints());
         consumptionTransferLog.setAfterRecipientConsumptionPoints(recipientIntegral.getConsumptionPoints());
         consumptionTransferLogMapper.insert(consumptionTransferLog);
+
+        // 发送短信到接收者
+        MemberUserDO receiverUser = memberUserService.getUser(createReqVO.getRecipientUserId());
+        smsCodeService.sendSmsCode(new SmsCodeSendReqDTO()
+                .setMobile(receiverUser.getMobile())
+                .setScene(SmsSceneEnum.CONSUMPTION_POINTS_TRANSFER_INFORM.getScene())
+                .setCreateIp(getClientIP())
+                .setName(user.getUsername())
+                .setMoney(createReqVO.getConsumptionPoints() / DistriConstants.INTEGRAL_PAGE2DB));
         // 返回
         return consumptionTransferLog.getId();
     }

+ 14 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/usertopupconsumptionpointsorder/UserTopUpConsumptionPointsOrderServiceImpl.java

@@ -13,6 +13,10 @@ import cn.newfeifan.mall.module.distri.enums.ConsumptionEnum;
 import cn.newfeifan.mall.module.distri.service.consumptionchangelog.ConsumptionChangeLogService;
 import cn.newfeifan.mall.module.distri.service.integral.IntegralService;
 import cn.newfeifan.mall.module.distri.service.orderpercentage.OrderPercentageService;
+import cn.newfeifan.mall.module.member.controller.admin.user.vo.MemberUserUpdateReqVO;
+import cn.newfeifan.mall.module.member.dal.dataobject.user.MemberUserDO;
+import cn.newfeifan.mall.module.member.dal.mysql.user.MemberUserMapper;
+import cn.newfeifan.mall.module.member.service.user.MemberUserService;
 import cn.newfeifan.mall.module.pay.dal.dataobject.app.PayAppDO;
 import cn.newfeifan.mall.module.pay.dal.dataobject.order.PayOrderDO;
 import cn.newfeifan.mall.module.pay.dal.mysql.order.PayOrderMapper;
@@ -65,6 +69,8 @@ public class UserTopUpConsumptionPointsOrderServiceImpl implements UserTopUpCons
     private PayAppService appService;
     @Resource
     private PayOrderMapper payOrderMapper;
+    @Resource
+    private MemberUserService memberUserService;
 
     @Override
     public UserTopUpConsumptionPointsOrderInfoRespVO createUserTopUpConsumptionPointsOrder(UserTopUpConsumptionPointsOrderSaveReqVO createReqVO) {
@@ -204,6 +210,14 @@ public class UserTopUpConsumptionPointsOrderServiceImpl implements UserTopUpCons
                 .practicalConsumptionPoints(topUpOrder.getTopUpConsumptionPoints())
                 .generateUserId(topUpOrder.getUserId())
                 .build());
+
+        //计算充值消费分超过设定金额将用户标志为代理商
+        MemberUserDO user = memberUserService.getUser(topUpOrder.getUserId());
+        OrderPercentageDO orderPercentageDO = orderPercentageService.queryStatus();
+        if(topUpOrder.getTopUpConsumptionPoints() >= Long.parseLong(orderPercentageDO.getAgentQuota()) && !user.getAgent()){
+            user.setAgent(true);
+            memberUserService.updateUser(BeanUtils.toBean(user, MemberUserUpdateReqVO.class));
+        }
     }
 
 }

+ 1 - 0
feifan-module-mall/feifan-module-sale-api/src/main/java/cn/newfeifan/mall/module/sale/enums/ErrorCodeConstants.java

@@ -17,4 +17,5 @@ public interface ErrorCodeConstants {
 
     ErrorCode MERCHANT_APPLY_NOT_EXISTS = new ErrorCode(1_002_029_003, "商户申请不存在");
     ErrorCode MERCHANT_APPLY_LOG_NOT_EXISTS = new ErrorCode(1_002_029_004, "商户申请记录不存在");
+    ErrorCode USER_IS_NOT_AGENT = new ErrorCode(1_002_029_005, "用户还不是代理商");
 }

+ 41 - 6
feifan-module-mall/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/module/sale/service/merchantapply/MerchantApplyServiceImpl.java

@@ -62,9 +62,15 @@ public class MerchantApplyServiceImpl implements MerchantApplyService {
 
         // 校验商户账号是否已经存在
         MemberUserRespDTO user = memberUserApi.getUser(getLoginUserId());
+
+        // 当用户不是代理商的时候不允许提交申请
+        if(!user.getAgent()){
+            throw exception(USER_IS_NOT_AGENT);
+        }
+
         List<MemberUserRespDTO> users = memberUserApi.getUsersByMobile(user.getMobile());
         List<MerchantApplyDO> merchantApplyDOS = merchantApplyMapper.selectList(MerchantApplyDO::getApplyMemberUserId, users.stream().map(MemberUserRespDTO::getId).collect(Collectors.toList()));
-        if(merchantApplyDOS != null && merchantApplyDOS.size() >= 1){
+        if (merchantApplyDOS != null && merchantApplyDOS.size() >= 1) {
             ErrorCode ERROR = new ErrorCode(1_002_029_003, "当前手机号已存在商户账号");
             throw exception(ERROR);
         }
@@ -79,7 +85,7 @@ public class MerchantApplyServiceImpl implements MerchantApplyService {
         // 插入
         MerchantApplyDO merchantApply = BeanUtils.toBean(createReqVO, MerchantApplyDO.class);
         merchantApply.setApplyMemberUserId(getLoginUserId());
-        merchantApply.setCheckPersonStatus(MerchantApplyCheckPersonStatusEnum.ONE.getStatus());
+        merchantApply.setCheckPersonStatus(MerchantApplyCheckPersonStatusEnum.TWO.getStatus());
 
         // 默认log
         if (createReqVO.getLogoUrl() == null || createReqVO.getLogoUrl().isEmpty()) {
@@ -89,7 +95,10 @@ public class MerchantApplyServiceImpl implements MerchantApplyService {
         merchantApplyMapper.insert(merchantApply);
 
         // 发送微信信息到系统用户
-        sentWxChantMessageToThSystemUser(merchantApply,MerchantApplyCheckPersonStatusEnum.ONE.getUserid());
+        sentWxChantMessageToThSystemUser(merchantApply, MerchantApplyCheckPersonStatusEnum.TWO.getUserid());
+
+        // 推送极光消息
+        jPush(merchantApply, MerchantApplyCheckPersonStatusEnum.TWO.getUserid());
 
         // 返回
         return merchantApply.getId();
@@ -97,9 +106,10 @@ public class MerchantApplyServiceImpl implements MerchantApplyService {
 
     /**
      * 发送微信信息到系统用户
+     *
      * @param merchantApply 入驻申请
      */
-    private void sentWxChantMessageToThSystemUser(MerchantApplyDO merchantApply, Long sentSystemUserId){
+    private void sentWxChantMessageToThSystemUser(MerchantApplyDO merchantApply, Long sentSystemUserId) {
         List<String> params = new ArrayList<>();
 
         params.add(merchantApply.getName());
@@ -112,7 +122,29 @@ public class MerchantApplyServiceImpl implements MerchantApplyService {
                 params, sentSystemUserId, merchantApply.getId());
     }
 
-    private String getAreaById(Integer id){
+    private void jPush(MerchantApplyDO merchantApply, Long sentSystemUserId) {
+        String title = WcChatMessageTemplateIdEnum.MERCHANT_APPLY_CHECK.getName();
+
+        String alert = "商户名称: " + merchantApply.getName();
+        alert += "\n负责人: " + merchantApply.getContact();
+        alert += "\n负责人手机号: " + merchantApply.getContactNumber();
+
+        alert += "\n办公地址: " + (merchantApply.getAddress() == null || merchantApply.getAddress().isEmpty() ? "-" : merchantApply.getAddress());
+        alert += "\n所在地: " + getAreaById(merchantApply.getAreaId().intValue());
+
+        // 如果没有权限就不用发送了
+        Boolean havePermission = wcChatMessageUtilsApi.isHavePermission(sentSystemUserId, title);
+        if(!havePermission){
+            return;
+        }
+        List<String> userRsgIds = memberUserApi.getUserRsgIds(sentSystemUserId, null);
+        if (userRsgIds != null && !userRsgIds.isEmpty()) {
+            String url = wcChatMessageUtilsApi.getUrl(title, merchantApply.getId(), sentSystemUserId);
+            wcChatMessageUtilsApi.jPush(userRsgIds, alert, title, url, merchantApply.getApplyMemberUserId(), sentSystemUserId, merchantApply.getId());
+        }
+    }
+
+    private String getAreaById(Integer id) {
         Area area = AreaUtils.getArea(Area.ID_CHINA);
         Assert.notNull(area, "获取不到中国");
         List<AreaNodeRespVO> bean = BeanUtils.toBean(area.getChildren(), AreaNodeRespVO.class);
@@ -174,7 +206,10 @@ public class MerchantApplyServiceImpl implements MerchantApplyService {
         merchantApplyMapper.updateById(updateObj);
 
         // 发送微信信息到系统用户
-        sentWxChantMessageToThSystemUser(updateObj,MerchantApplyCheckPersonStatusEnum.ONE.getUserid());
+        sentWxChantMessageToThSystemUser(updateObj, MerchantApplyCheckPersonStatusEnum.ONE.getUserid());
+
+        // 推送极光消息
+        jPush(updateObj, MerchantApplyCheckPersonStatusEnum.ONE.getUserid());
     }
 
     @Override

+ 30 - 1
feifan-module-mall/feifan-module-trade-api/src/main/java/cn/newfeifan/mall/module/trade/api/wechat/WcChatMessageUtilsApi.java

@@ -15,5 +15,34 @@ public interface WcChatMessageUtilsApi {
      * @param systemUserId 系统用户id
      * @param objectId     对象id
      */
-    public void sendWcChatMessage(String templateId, List<String> params, Long systemUserId, Long objectId) ;
+    void sendWcChatMessage(String templateId, List<String> params, Long systemUserId, Long objectId) ;
+
+    /**
+     * 极光推送
+     * @param rsgIds 注册id
+     * @param alert 推送内容
+     * @param title 标题
+     * @param url 地址
+     * @param memberUserId 用户id
+     * @param systemUserId 系统用户id
+     * @param objectId 对象id
+     */
+    void jPush(List<String> rsgIds, String alert, String title, String url, Long memberUserId, Long systemUserId, Long objectId);
+
+    /**
+     * 获取url
+     * @param title 标题
+     * @param objectId 对象id
+     * @param systemUserId 系统用户id
+     * @return 地址
+     */
+    String getUrl(String title, Long objectId, Long systemUserId);
+
+    /**
+     * 判断是否有权限
+     * @param userId 系统用户id
+     * @param messageName 消息名称
+     * @return 是否有权限
+     */
+    Boolean isHavePermission(Long userId, String messageName);
 }

+ 2 - 0
feifan-module-mall/feifan-module-trade-api/src/main/java/cn/newfeifan/mall/module/trade/enums/ErrorCodeConstants.java

@@ -96,5 +96,7 @@ public interface ErrorCodeConstants {
     ErrorCode MESSAGE_LOG_NOT_EXISTS = new ErrorCode(1_011_008_004, "微信模板消息日志不存在");
     ErrorCode ORDER_PAY_ERROR = new ErrorCode(1_011_008_005, "钱包积分不够支付");
     ErrorCode ORDER_PAY_CONSUMPTION_POINTS_ERROR = new ErrorCode(1_011_008_006, "钱包消费分不够支付");
+    ErrorCode J_PUSH_MESSAGE_LOG_NOT_EXISTS = new ErrorCode(1_011_008_011, "极光推送消息日志不存在");
+
 
 }

+ 94 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/jpushmessagelog/JPushMessageLogController.java

@@ -0,0 +1,94 @@
+package cn.newfeifan.mall.module.trade.controller.admin.jpushmessagelog;
+
+import org.springframework.web.bind.annotation.*;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import javax.validation.*;
+import javax.servlet.http.*;
+import java.util.*;
+import java.io.IOException;
+
+import cn.newfeifan.mall.framework.common.pojo.PageParam;
+import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.framework.common.pojo.CommonResult;
+import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
+import static cn.newfeifan.mall.framework.common.pojo.CommonResult.success;
+
+import cn.newfeifan.mall.framework.excel.core.util.ExcelUtils;
+
+import cn.newfeifan.mall.framework.operatelog.core.annotations.OperateLog;
+import static cn.newfeifan.mall.framework.operatelog.core.enums.OperateTypeEnum.*;
+
+import cn.newfeifan.mall.module.trade.controller.admin.jpushmessagelog.vo.*;
+import cn.newfeifan.mall.module.trade.dal.dataobject.jpushmessagelog.JPushMessageLogDO;
+import cn.newfeifan.mall.module.trade.service.jpushmessagelog.JPushMessageLogService;
+
+@Tag(name = "管理后台 - 极光推送记录")
+@RestController
+@RequestMapping("/trade/J-push-message-log")
+@Validated
+public class JPushMessageLogController {
+
+    @Resource
+    private JPushMessageLogService jPushMessageLogService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建极光推送记录")
+    @PreAuthorize("@ss.hasPermission('trade:J-push-message-log:create')")
+    public CommonResult<Long> createJPushMessageLog(@Valid @RequestBody JPushMessageLogSaveReqVO createReqVO) {
+        return success(jPushMessageLogService.createJPushMessageLog(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新极光推送记录")
+    @PreAuthorize("@ss.hasPermission('trade:J-push-message-log:update')")
+    public CommonResult<Boolean> updateJPushMessageLog(@Valid @RequestBody JPushMessageLogSaveReqVO updateReqVO) {
+        jPushMessageLogService.updateJPushMessageLog(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除极光推送记录")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('trade:J-push-message-log:delete')")
+    public CommonResult<Boolean> deleteJPushMessageLog(@RequestParam("id") Long id) {
+        jPushMessageLogService.deleteJPushMessageLog(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得极光推送记录")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('trade:J-push-message-log:query')")
+    public CommonResult<JPushMessageLogRespVO> getJPushMessageLog(@RequestParam("id") Long id) {
+        JPushMessageLogDO jPushMessageLog = jPushMessageLogService.getJPushMessageLog(id);
+        return success(BeanUtils.toBean(jPushMessageLog, JPushMessageLogRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得极光推送记录分页")
+    @PreAuthorize("@ss.hasPermission('trade:J-push-message-log:query')")
+    public CommonResult<PageResult<JPushMessageLogRespVO>> getJPushMessageLogPage(@Valid JPushMessageLogPageReqVO pageReqVO) {
+        PageResult<JPushMessageLogDO> pageResult = jPushMessageLogService.getJPushMessageLogPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, JPushMessageLogRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出极光推送记录 Excel")
+    @PreAuthorize("@ss.hasPermission('trade:J-push-message-log:export')")
+    @OperateLog(type = EXPORT)
+    public void exportJPushMessageLogExcel(@Valid JPushMessageLogPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<JPushMessageLogDO> list = jPushMessageLogService.getJPushMessageLogPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "极光推送记录.xls", "数据", JPushMessageLogRespVO.class,
+                        BeanUtils.toBean(list, JPushMessageLogRespVO.class));
+    }
+
+}

+ 43 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/jpushmessagelog/vo/JPushMessageLogPageReqVO.java

@@ -0,0 +1,43 @@
+package cn.newfeifan.mall.module.trade.controller.admin.jpushmessagelog.vo;
+
+import lombok.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.newfeifan.mall.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.newfeifan.mall.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 极光推送记录分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class JPushMessageLogPageReqVO extends PageParam {
+
+    @Schema(description = "接收消息用户的openid", example = "25139")
+    private String regId;
+
+    @Schema(description = "会员用户ID", example = "13890")
+    private Long memberUserId;
+
+    @Schema(description = "系统用户ID", example = "12879")
+    private Long systemUserId;
+
+    @Schema(description = "微信消息模板参数")
+    private String jpushParams;
+
+    @Schema(description = "对应的业务对象ID,如订单ID、售后订单ID", example = "26581")
+    private Long objectId;
+
+    @Schema(description = "发送时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] sendTime;
+
+    @Schema(description = "极光返回的消息响应结果")
+    private String responseResult;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 49 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/jpushmessagelog/vo/JPushMessageLogRespVO.java

@@ -0,0 +1,49 @@
+package cn.newfeifan.mall.module.trade.controller.admin.jpushmessagelog.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 极光推送记录 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class JPushMessageLogRespVO {
+
+    @Schema(description = "消息记录ID,自增主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "22852")
+    @ExcelProperty("消息记录ID,自增主键")
+    private Long id;
+
+    @Schema(description = "接收消息用户的openid", requiredMode = Schema.RequiredMode.REQUIRED, example = "25139")
+    @ExcelProperty("接收消息用户的openid")
+    private String regId;
+
+    @Schema(description = "会员用户ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "13890")
+    @ExcelProperty("会员用户ID")
+    private Long memberUserId;
+
+    @Schema(description = "系统用户ID", example = "12879")
+    @ExcelProperty("系统用户ID")
+    private Long systemUserId;
+
+    @Schema(description = "微信消息模板参数")
+    @ExcelProperty("微信消息模板参数")
+    private String jpushParams;
+
+    @Schema(description = "对应的业务对象ID,如订单ID、售后订单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "26581")
+    @ExcelProperty("对应的业务对象ID,如订单ID、售后订单ID")
+    private Long objectId;
+
+    @Schema(description = "发送时间")
+    @ExcelProperty("发送时间")
+    private LocalDateTime sendTime;
+
+    @Schema(description = "极光返回的消息响应结果")
+    @ExcelProperty("极光返回的消息响应结果")
+    private String responseResult;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 40 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/jpushmessagelog/vo/JPushMessageLogSaveReqVO.java

@@ -0,0 +1,40 @@
+package cn.newfeifan.mall.module.trade.controller.admin.jpushmessagelog.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import javax.validation.constraints.*;
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 极光推送记录新增/修改 Request VO")
+@Data
+@Builder
+public class JPushMessageLogSaveReqVO {
+
+    @Schema(description = "消息记录ID,自增主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "22852")
+    private Long id;
+
+    @Schema(description = "接收消息用户的openid", requiredMode = Schema.RequiredMode.REQUIRED, example = "25139")
+    @NotEmpty(message = "接收消息用户的openid不能为空")
+    private String regId;
+
+    @Schema(description = "会员用户ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "13890")
+    @NotNull(message = "会员用户ID不能为空")
+    private Long memberUserId;
+
+    @Schema(description = "系统用户ID", example = "12879")
+    private Long systemUserId;
+
+    @Schema(description = "微信消息模板参数")
+    private String jpushParams;
+
+    @Schema(description = "对应的业务对象ID,如订单ID、售后订单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "26581")
+    @NotNull(message = "对应的业务对象ID,如订单ID、售后订单ID不能为空")
+    private Long objectId;
+
+    @Schema(description = "发送时间")
+    private LocalDateTime sendTime;
+
+    @Schema(description = "极光返回的消息响应结果")
+    private String responseResult;
+
+}

+ 57 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/dataobject/jpushmessagelog/JPushMessageLogDO.java

@@ -0,0 +1,57 @@
+package cn.newfeifan.mall.module.trade.dal.dataobject.jpushmessagelog;
+
+import lombok.*;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.newfeifan.mall.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 极光推送记录 DO
+ *
+ * @author 非繁人
+ */
+@TableName("jpush_message_log")
+@KeySequence("jpush_message_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class JPushMessageLogDO extends BaseDO {
+
+    /**
+     * 消息记录ID,自增主键
+     */
+    @TableId
+    private Long id;
+    /**
+     * 接收消息用户的openid
+     */
+    private String regId;
+    /**
+     * 会员用户ID
+     */
+    private Long memberUserId;
+    /**
+     * 系统用户ID
+     */
+    private Long systemUserId;
+    /**
+     * 微信消息模板参数
+     */
+    private String jpushParams;
+    /**
+     * 对应的业务对象ID,如订单ID、售后订单ID
+     */
+    private Long objectId;
+    /**
+     * 发送时间
+     */
+    private LocalDateTime sendTime;
+    /**
+     * 极光返回的消息响应结果
+     */
+    private String responseResult;
+
+}

+ 32 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/mysql/jpushmessagelog/JPushMessageLogMapper.java

@@ -0,0 +1,32 @@
+package cn.newfeifan.mall.module.trade.dal.mysql.jpushmessagelog;
+
+
+import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.newfeifan.mall.framework.mybatis.core.mapper.BaseMapperX;
+import cn.newfeifan.mall.module.trade.dal.dataobject.jpushmessagelog.JPushMessageLogDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.newfeifan.mall.module.trade.controller.admin.jpushmessagelog.vo.*;
+
+/**
+ * 极光推送记录 Mapper
+ *
+ * @author 非繁人
+ */
+@Mapper
+public interface JPushMessageLogMapper extends BaseMapperX<JPushMessageLogDO> {
+
+    default PageResult<JPushMessageLogDO> selectPage(JPushMessageLogPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<JPushMessageLogDO>()
+                .eqIfPresent(JPushMessageLogDO::getRegId, reqVO.getRegId())
+                .eqIfPresent(JPushMessageLogDO::getMemberUserId, reqVO.getMemberUserId())
+                .eqIfPresent(JPushMessageLogDO::getSystemUserId, reqVO.getSystemUserId())
+                .eqIfPresent(JPushMessageLogDO::getJpushParams, reqVO.getJpushParams())
+                .eqIfPresent(JPushMessageLogDO::getObjectId, reqVO.getObjectId())
+                .betweenIfPresent(JPushMessageLogDO::getSendTime, reqVO.getSendTime())
+                .eqIfPresent(JPushMessageLogDO::getResponseResult, reqVO.getResponseResult())
+                .betweenIfPresent(JPushMessageLogDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(JPushMessageLogDO::getId));
+    }
+
+}

+ 48 - 2
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/aftersale/AfterSaleServiceImpl.java

@@ -32,6 +32,8 @@ import cn.newfeifan.mall.module.trade.framework.order.config.TradeOrderPropertie
 import cn.newfeifan.mall.module.trade.service.delivery.DeliveryExpressService;
 import cn.newfeifan.mall.module.trade.service.order.TradeOrderQueryService;
 import cn.newfeifan.mall.module.trade.service.order.TradeOrderUpdateService;
+import cn.newfeifan.mall.module.trade.utils.push.JPushUtils;
+import cn.newfeifan.mall.module.trade.utils.push.pojo.RequestBody;
 import cn.newfeifan.mall.module.trade.utils.wechat.WcChatMessageUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -49,6 +51,7 @@ import java.util.List;
 
 import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.newfeifan.mall.module.trade.enums.ErrorCodeConstants.*;
+
 import cn.newfeifan.mall.module.trade.enums.aftersale.AfterSaleMessageEnum;
 
 /**
@@ -83,6 +86,8 @@ public class AfterSaleServiceImpl implements AfterSaleService {
     @Resource
     private MemberUserService memberUserService;
     @Resource
+    private JPushUtils jPushUtils;
+    @Resource
     private AdminUserService adminUserService;
 
 
@@ -190,7 +195,10 @@ public class AfterSaleServiceImpl implements AfterSaleService {
 
         // 发送售后消息
         //发送微信模板消息给店铺及管理员
-        sentWcChatMessage(afterSale,AfterSaleMessageEnum.APPLY_FOR_AFTER_SALE.getName());
+        sentWcChatMessage(afterSale, AfterSaleMessageEnum.APPLY_FOR_AFTER_SALE.getName());
+
+        // 发送极光推送消息
+        sentJPush(afterSale, AfterSaleMessageEnum.APPLY_FOR_AFTER_SALE.getName());
 
         return afterSale;
     }
@@ -290,7 +298,10 @@ public class AfterSaleServiceImpl implements AfterSaleService {
 
         // 发送售后消息
         // 发送微信模板消息给店铺及管理员
-        sentWcChatMessage(afterSale,AfterSaleMessageEnum.WAIT_FOR_RECEIVING.getName());
+        sentWcChatMessage(afterSale, AfterSaleMessageEnum.WAIT_FOR_RECEIVING.getName());
+
+        // 发送极光推送消息
+        sentJPush(afterSale, AfterSaleMessageEnum.WAIT_FOR_RECEIVING.getName());
     }
 
     /**
@@ -320,6 +331,41 @@ public class AfterSaleServiceImpl implements AfterSaleService {
         }
     }
 
+    /**
+     * 发送极光推送消息
+     *
+     * @param afterSale   售后订单
+     * @param afterStatus 售后状态
+     */
+    private void sentJPush(AfterSaleDO afterSale, String afterStatus) {
+        String title = WcChatMessageTemplateIdEnum.AFTER_SALE_NO_CHECK2.getName();
+
+        String alert = "售后订单号: " + afterSale.getNo();
+        alert += "\n用户昵称: " + memberUserService.getUser(afterSale.getUserId()).getNickname();
+        DecimalFormat df = new DecimalFormat("0.00");
+        String formattedPrice = df.format((double) afterSale.getRefundPrice() / 100);
+        alert += "\n金额: ¥ " + formattedPrice;
+
+        alert += "\n售后状态: " + afterStatus;
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        alert += "\n时间: " + LocalDateTime.now().format(formatter);
+
+        List<Long> adminUsers = adminUserService.getUserIdsByShop(afterSale.getShopId());
+        for (Long adminUser : adminUsers) {
+            // 如果没有权限就不用发送了
+            Boolean havePermission = jPushUtils.isHavePermission(adminUser, title);
+            if(!havePermission){
+                continue;
+            }
+            List<String> userRsgIds = memberUserService.getUserRsgIds(adminUser, null);
+            if (userRsgIds != null && !userRsgIds.isEmpty()) {
+                String url = jPushUtils.getUrl(title, afterSale.getId(), adminUser);
+                RequestBody requestBody = jPushUtils.getRequestBody(userRsgIds, alert, title, url);
+                jPushUtils.jPush(requestBody, afterSale.getUserId(), adminUser, afterSale.getId());
+            }
+        }
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     @AfterSaleLog(operateType = AfterSaleOperateTypeEnum.ADMIN_AGREE_RECEIVE)

+ 53 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/jpushmessagelog/JPushMessageLogService.java

@@ -0,0 +1,53 @@
+package cn.newfeifan.mall.module.trade.service.jpushmessagelog;
+
+import javax.validation.*;
+import cn.newfeifan.mall.module.trade.controller.admin.jpushmessagelog.vo.*;
+import cn.newfeifan.mall.module.trade.dal.dataobject.jpushmessagelog.JPushMessageLogDO;
+import cn.newfeifan.mall.framework.common.pojo.PageResult;
+
+/**
+ * 极光推送记录 Service 接口
+ *
+ * @author 非繁人
+ */
+public interface JPushMessageLogService {
+
+    /**
+     * 创建极光推送记录
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createJPushMessageLog(@Valid JPushMessageLogSaveReqVO createReqVO);
+
+    /**
+     * 更新极光推送记录
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateJPushMessageLog(@Valid JPushMessageLogSaveReqVO updateReqVO);
+
+    /**
+     * 删除极光推送记录
+     *
+     * @param id 编号
+     */
+    void deleteJPushMessageLog(Long id);
+
+    /**
+     * 获得极光推送记录
+     *
+     * @param id 编号
+     * @return 极光推送记录
+     */
+    JPushMessageLogDO getJPushMessageLog(Long id);
+
+    /**
+     * 获得极光推送记录分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 极光推送记录分页
+     */
+    PageResult<JPushMessageLogDO> getJPushMessageLogPage(JPushMessageLogPageReqVO pageReqVO);
+
+}

+ 70 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/jpushmessagelog/JPushMessageLogServiceImpl.java

@@ -0,0 +1,70 @@
+package cn.newfeifan.mall.module.trade.service.jpushmessagelog;
+
+import org.springframework.stereotype.Service;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import cn.newfeifan.mall.module.trade.controller.admin.jpushmessagelog.vo.*;
+import cn.newfeifan.mall.module.trade.dal.dataobject.jpushmessagelog.JPushMessageLogDO;
+import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
+
+import cn.newfeifan.mall.module.trade.dal.mysql.jpushmessagelog.JPushMessageLogMapper;
+
+import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.newfeifan.mall.module.trade.enums.ErrorCodeConstants.*;
+
+/**
+ * 极光推送记录 Service 实现类
+ *
+ * @author 非繁人
+ */
+@Service
+@Validated
+public class JPushMessageLogServiceImpl implements JPushMessageLogService {
+
+    @Resource
+    private JPushMessageLogMapper jPushMessageLogMapper;
+
+    @Override
+    public Long createJPushMessageLog(JPushMessageLogSaveReqVO createReqVO) {
+        // 插入
+        JPushMessageLogDO jPushMessageLog = BeanUtils.toBean(createReqVO, JPushMessageLogDO.class);
+        jPushMessageLogMapper.insert(jPushMessageLog);
+        // 返回
+        return jPushMessageLog.getId();
+    }
+
+    @Override
+    public void updateJPushMessageLog(JPushMessageLogSaveReqVO updateReqVO) {
+        // 校验存在
+        validateJPushMessageLogExists(updateReqVO.getId());
+        // 更新
+        JPushMessageLogDO updateObj = BeanUtils.toBean(updateReqVO, JPushMessageLogDO.class);
+        jPushMessageLogMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteJPushMessageLog(Long id) {
+        // 校验存在
+        validateJPushMessageLogExists(id);
+        // 删除
+        jPushMessageLogMapper.deleteById(id);
+    }
+
+    private void validateJPushMessageLogExists(Long id) {
+        if (jPushMessageLogMapper.selectById(id) == null) {
+            throw exception(J_PUSH_MESSAGE_LOG_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public JPushMessageLogDO getJPushMessageLog(Long id) {
+        return jPushMessageLogMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<JPushMessageLogDO> getJPushMessageLogPage(JPushMessageLogPageReqVO pageReqVO) {
+        return jPushMessageLogMapper.selectPage(pageReqVO);
+    }
+
+}

+ 47 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderUpdateServiceImpl.java

@@ -86,6 +86,8 @@ import cn.newfeifan.mall.module.trade.service.price.TradePriceService;
 import cn.newfeifan.mall.module.trade.service.price.bo.TradePriceCalculateReqBO;
 import cn.newfeifan.mall.module.trade.service.price.bo.TradePriceCalculateRespBO;
 import cn.newfeifan.mall.module.trade.service.price.calculator.TradePriceCalculatorHelper;
+import cn.newfeifan.mall.module.trade.utils.push.JPushUtils;
+import cn.newfeifan.mall.module.trade.utils.push.pojo.RequestBody;
 import cn.newfeifan.mall.module.trade.utils.wechat.WcChatMessageUtils;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import lombok.extern.slf4j.Slf4j;
@@ -196,6 +198,8 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 
     @Resource
     private AdminUserService adminUserService;
+    @Resource
+    private JPushUtils jPushUtils;
 
     @Resource
     private PtProfitService ptProfitService;
@@ -1361,6 +1365,9 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 
             // 发送给微信消息给系统用户待发货消息
             sentWcChatMessage(order);
+
+            // 发送极光推送
+            sentJPush(order);
         }
 
 
@@ -1738,6 +1745,46 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
         }
     }
 
+    /**
+     * 发送极光推送消息
+     *
+     * @param order   订单
+     */
+    private void sentJPush(TradeOrderDO order) {
+        String title = WcChatMessageTemplateIdEnum.ORDER_NO_DELIVERY2.getName();
+
+        DecimalFormat df = new DecimalFormat("0.00");
+        String formattedPrice = df.format((double) order.getRefundPrice() / 100);
+        String alert = "本单金额: ¥" + formattedPrice;
+        alert += "\n单据编号\n: " + order.getNo();
+        alert += "\n客户名称: " + memberUserService.getUser(order.getUserId()).getNickname();
+
+        List<TradeOrderItemDO> tradeOrderItemDOS = tradeOrderItemMapper.selectListByOrderId(order.getId());
+        List<String> productNames = tradeOrderItemDOS.stream().map(TradeOrderItemDO::getSpuName).collect(Collectors.toList());
+        String name = productNames.toString();
+
+        // 去除首尾的括号,并去除空格
+        name = name.substring(1, name.length() - 1).trim();
+        alert += "\n商品名称: " + name;
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        alert += "\n单据日期: " + LocalDateTime.now().format(formatter);
+
+        List<Long> adminUsers = adminUserService.getUserIdsByShop(order.getShopId());
+        for (Long adminUser : adminUsers) {
+            // 如果没有权限就不用发送了
+            Boolean havePermission = jPushUtils.isHavePermission(adminUser, title);
+            if(!havePermission){
+                continue;
+            }
+            List<String> userRsgIds = memberUserService.getUserRsgIds(adminUser, null);
+            if (userRsgIds != null && !userRsgIds.isEmpty()) {
+                String url = jPushUtils.getUrl(title, order.getId(), adminUser);
+                RequestBody requestBody = jPushUtils.getRequestBody(userRsgIds, alert, title, url);
+                jPushUtils.jPush(requestBody, order.getUserId(), adminUser, order.getId());
+            }
+        }
+    }
+
     /**
      * 校验交易订单满足被支付的条件
      * <p>

+ 222 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/utils/push/JPushUtils.java

@@ -0,0 +1,222 @@
+package cn.newfeifan.mall.module.trade.utils.push;
+
+import cn.hutool.core.codec.Base64;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import cn.newfeifan.mall.module.system.controller.admin.auth.vo.AuthLoginRespVO;
+import cn.newfeifan.mall.module.system.dal.dataobject.config.SystemConfigDO;
+import cn.newfeifan.mall.module.system.dal.dataobject.user.AdminUserDO;
+import cn.newfeifan.mall.module.system.enums.logger.LoginLogTypeEnum;
+import cn.newfeifan.mall.module.system.service.auth.AdminAuthService;
+import cn.newfeifan.mall.module.system.service.config.SystemConfigService;
+import cn.newfeifan.mall.module.system.service.permission.PermissionService;
+import cn.newfeifan.mall.module.system.service.user.AdminUserService;
+import cn.newfeifan.mall.module.trade.controller.admin.jpushmessagelog.vo.JPushMessageLogSaveReqVO;
+import cn.newfeifan.mall.module.trade.enums.wxmessage.WcChatMessageTemplateIdEnum;
+import cn.newfeifan.mall.module.trade.service.jpushmessagelog.JPushMessageLogService;
+import cn.newfeifan.mall.module.trade.utils.push.pojo.NotificationData;
+import cn.newfeifan.mall.module.trade.utils.push.pojo.Options;
+import cn.newfeifan.mall.module.trade.utils.push.pojo.RequestBody;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.List;
+
+import static cn.newfeifan.mall.module.trade.enums.MessageTemplateConstants.*;
+
+@Component
+@Slf4j
+public class JPushUtils {
+    @Value("${jpush.app-key}")
+    private String appKey;
+    @Value("${jpush.secret}")
+    private String secret;
+
+    @Resource
+    private JPushMessageLogService jPushService;
+    @Resource
+    private SystemConfigService configService;
+    @Resource
+    private PermissionService permissionService;
+    @Resource
+    private AdminAuthService authService;
+    @Resource
+    private AdminUserService adminUserService;
+
+    /**
+     * 获取请求体
+     *
+     * @param rsgIds 极光注册id
+     * @param alert  推送内容
+     * @param title  推送标题
+     * @return 请求体
+     */
+    public RequestBody getRequestBody(List<String> rsgIds, String alert, String title, String url) {
+        RequestBody requestBody = RequestBody.builder().build();
+        requestBody.setPlatform("all");
+        requestBody.setAudience(new RequestBody.Audience().setRegistration_id(rsgIds));
+
+        NotificationData notificationData = new NotificationData();
+        notificationData.setAlert("Hello, content!");
+        NotificationData.Notification notification = new NotificationData.Notification();
+        notification.setAlert(alert);
+        notification.setTitle(title);
+        notification.setBuilder_id(1);
+        notification.setIntent(new NotificationData.Intent().setUrl("letcgo://gizmos?"+url));
+
+        notificationData.setAndroid(notification);
+        requestBody.setNotification(notificationData);
+
+        Options options = Options.builder()
+                .time_to_live(86400)
+                .classification(1)
+                .third_party_channel(Options.ThirdPartyChannel
+                        .builder()
+                        .huawei(Options.Channel
+                                .builder()
+                                .importance("NORMAL")
+                                .category("WORK")
+                                .build())
+                        .xiaomi(Options.Channel
+                                .builder()
+                                .channel_id("NORMAL")
+                                .build())
+                        .honor(Options.Channel
+                                .builder()
+                                .importance("NORMAL")
+                                .build())
+                        .oppo(Options.Channel
+                                .builder()
+                                .channel_id("message")
+                                .build())
+                        .vivo(Options.Channel
+                                .builder()
+                                .distribution("secondary_push")
+                                .category("IM")
+                                .build())
+                        .build())
+                .build();
+        requestBody.setOptions(options);
+
+        return requestBody;
+    }
+
+    /**
+     * 获取url
+     * @param title 标题
+     * @param systemUserId 系统用户id
+     * @param objectId 对象id
+     * @return url
+     */
+    public String getUrl(String title, Long objectId, Long systemUserId){
+        SystemConfigDO redisConfig = configService.getRedisConfig();
+        if (title.equals(WcChatMessageTemplateIdEnum.ORDER_DELIVERY2.getName())) {
+            //订单已发货
+            return redisConfig.getMallDomain() + "/#/pages/order/detail?id=" + objectId;
+        } else if (title.equals(WcChatMessageTemplateIdEnum.AFTER_SALE_CHECK2.getName())) {
+            //售后订单审核完成
+            return redisConfig.getMallDomain() + "/#/pages/order/aftersale/detail?id=" + objectId;
+        } else if (title.equals(WcChatMessageTemplateIdEnum.AFTER_SALE_NO_CHECK2.getName())) {
+            //售后订单待审核
+            AdminUserDO systemUser = adminUserService.getUser(systemUserId);
+            AuthLoginRespVO token = authService.createTokenAfterLoginSuccess(systemUser.getId(), systemUser.getUsername(), LoginLogTypeEnum.LOGIN_USERNAME);
+//            return redisConfig.getMerchantDomain() + "/after-sale";
+            return redisConfig.getMerchantDomain() + "/login" + "?accessToken=" + token.getAccessToken() + "&refreshToken=" + token.getRefreshToken();
+        } else if (title.equals(WcChatMessageTemplateIdEnum.ORDER_NO_DELIVERY2.getName())) {
+            //订单待发货
+            AdminUserDO systemUser = adminUserService.getUser(systemUserId);
+            AuthLoginRespVO token = authService.createTokenAfterLoginSuccess(systemUser.getId(), systemUser.getUsername(), LoginLogTypeEnum.LOGIN_USERNAME);
+//            return redisConfig.getMerchantDomain() + "/order";
+            return redisConfig.getMerchantDomain() + "/login" + "?accessToken=" + token.getAccessToken() + "&refreshToken=" + token.getRefreshToken();
+        } else if(title.equals(WcChatMessageTemplateIdEnum.MERCHANT_APPLY_CHECK.getName())){
+            // 商户入驻申请审批通知
+            AdminUserDO systemUser = adminUserService.getUser(systemUserId);
+            AuthLoginRespVO token = authService.createTokenAfterLoginSuccess(systemUser.getId(), systemUser.getUsername(), LoginLogTypeEnum.LOGIN_USERNAME);
+            return redisConfig.getPlatformDomain() + "/login" + "?accessToken=" + token.getAccessToken() + "&refreshToken=" + token.getRefreshToken();
+        } else if(title.equals(WcChatMessageTemplateIdEnum.MERCHANT_APPLY_CHECK_RESULT.getName())){
+            // 商户入驻审核结果通知
+            return redisConfig.getMallDomain() + "/#/pages/public/merchant";
+        }
+        return null;
+    }
+
+    /**
+     * 推送消息
+     */
+    public void jPush(RequestBody requestBody, Long memberUserId, Long systemUserId, Long objectId) {
+        String url = "https://api.jpush.cn/v3/push";
+
+        String authString = appKey + ":" + secret;
+        String encodedAuthString = Base64.encode(authString);
+
+
+        try {
+            RequestConfig clientConfig = RequestConfig.custom().setConnectionRequestTimeout(30000).setSocketTimeout(30000).setConnectTimeout(30000).build();
+            CloseableHttpClient client = HttpClients.custom().setDefaultRequestConfig(clientConfig).build();
+
+            HttpPost httpPost = new HttpPost(url);
+            httpPost.setHeader("Authorization", "Basic " + encodedAuthString);
+            httpPost.setHeader("Content-Type", "application/json");
+            JSONObject message = JSONUtil.parseObj(JSONUtil.toJsonStr(requestBody));
+            httpPost.setEntity(new StringEntity(message.toString(), ContentType.APPLICATION_JSON));
+
+            CloseableHttpResponse execute = client.execute(httpPost);
+
+            int statusCode = execute.getStatusLine().getStatusCode();
+            log.info("请求状态:{}", statusCode);
+
+            HttpEntity entity = execute.getEntity();
+            String str = EntityUtils.toString(entity);
+            log.info("请求结果:{}", str);
+
+            // 记录推送日志
+            JPushMessageLogSaveReqVO jPushMessageLogSaveReqVO = JPushMessageLogSaveReqVO.builder()
+                    .regId(JSONUtil.toJsonStr(requestBody.getAudience().getRegistration_id()))
+                    .memberUserId(memberUserId)
+                    .systemUserId(systemUserId)
+                    .objectId(objectId)
+                    .jpushParams(message.toString())
+                    .sendTime(LocalDateTime.now())
+                    .responseResult(str)
+                    .build();
+            jPushService.createJPushMessageLog(jPushMessageLogSaveReqVO);
+        } catch (Exception e) {
+            log.info("用户rsgId:{}", JSONUtil.toJsonStr(requestBody.getAudience().getRegistration_id()));
+            log.info("推送异常:{}", e.getMessage());
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 判断系统用户是否有接收消息的权限
+     *
+     * @param userId     用户id
+     * @param messageName 推送的消息
+     * @return 是否有权限
+     */
+    public Boolean isHavePermission(Long userId, String messageName) {
+        if (messageName.equals(WcChatMessageTemplateIdEnum.AFTER_SALE_NO_CHECK2.getName())) {
+            // 售后待审核
+            return permissionService.isHavePermission(userId, AFTER_SALE_NO_CHECK_List);
+        } else if (messageName.equals(WcChatMessageTemplateIdEnum.ORDER_NO_DELIVERY2.getName())) {
+            // 订单待发货
+            return permissionService.isHavePermission(userId, ORDER_NO_DELIVERY_List);
+        } else if (messageName.equals(WcChatMessageTemplateIdEnum.MERCHANT_APPLY_CHECK.getName())) {
+            // 商户入驻审核
+            return permissionService.isHavePermission(userId, MERCHANT_APPLY_CHECK_LIST);
+        }
+        return false;
+    }
+}

+ 34 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/utils/push/pojo/Callback.java

@@ -0,0 +1,34 @@
+package cn.newfeifan.mall.module.trade.utils.push.pojo;
+
+import lombok.Data;
+
+import java.util.Map;
+
+/**
+ * 回调参数
+ */
+
+@Data
+public class Callback {
+    /**
+     * 数据临时回调地址
+     * 指定后以此处指定为准,仅针对这一次推送请求生效。
+     * 不指定,则以极光后台配置为准。
+     */
+    private String url;
+    /**
+     * 需要回调给用户的自定义参数
+     */
+    private Map<String, String> params;
+    /**
+     * 回调数据类型。
+     * 1: 送达回执
+     * 2: 点击回执
+     * 3: 送达和点击回执
+     * 8: 推送成功回执
+     * 9: 成功和送达回执
+     * 10: 成功和点击回执
+     * 11: 成功和送达以及点击回执
+     */
+    private int type;
+}

+ 33 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/utils/push/pojo/Message.java

@@ -0,0 +1,33 @@
+package cn.newfeifan.mall.module.trade.utils.push.pojo;
+
+import lombok.Data;
+
+import java.util.Map;
+
+/**
+ * 自定义消息
+ */
+
+@Data
+public class Message {
+    /**
+     * 消息内容本身
+     * 必填
+     */
+    private String msg_content;
+    /**
+     * 消息标题
+     * 可选
+     */
+    private String title;
+    /**
+     * 消息内容类型,开发者可根据自身业务定义具体类型。
+     * 可选
+     */
+    private String content_type;
+    /**
+     * JSON 格式的可选参数
+     * 可选
+     */
+    private Map<String, String> extras;
+}

+ 64 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/utils/push/pojo/NotificationData.java

@@ -0,0 +1,64 @@
+package cn.newfeifan.mall.module.trade.utils.push.pojo;
+
+import lombok.Data;
+
+/**
+ * 通知类
+ */
+
+@Data
+//@Builder
+public class NotificationData {
+    /**
+     * 通知的内容在各个平台上,都可能只有这一个最基本的属性 "alert"。
+     * 这个位置的 "alert" 属性(直接在 notification 对象下),是一个快捷定义,各平台的 alert 信息如果都一样,则以此定义为准。如果各平台有定义,则覆盖这里的定义。
+     */
+    private String alert;
+    /**
+     * android 平台
+     */
+    private Notification android;
+    /**
+     * ios 平台
+     */
+    private Notification ios;
+    /**
+     * hmos 平台
+     */
+    private Notification hmos;
+
+
+    @Data
+    public static class Intent {
+        private String url;
+    }
+
+    @Data
+    public static class Extras {
+        private int newsid;
+    }
+
+    @Data
+    public static class Notification {
+        /**
+         * 通知内容
+         */
+        private String alert;
+        /**
+         * 通知标题
+         */
+        private String title;
+        /**
+         * 通知样式ID
+         */
+        private int builder_id;
+        /**
+         * 指定跳转页面
+         */
+        private Intent intent;
+        /**
+         * 扩展字段(基本不用)
+         */
+        private Extras extras;
+    }
+}

+ 90 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/utils/push/pojo/Options.java

@@ -0,0 +1,90 @@
+package cn.newfeifan.mall.module.trade.utils.push.pojo;
+
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * 可选参数类
+ */
+
+@Data
+@Builder
+public class Options {
+    /**
+     * 离线消息保留时长 (秒)
+     * 推送当前用户不在线时,为该用户保留多长时间的离线消息,以便其上线时再次推送。
+     * 默认 86400 (1 天),普通用户最长 3 天, VIP 用户最长 10 天。设置为 0 表示不保留离线消息,只有推送当前在线的用户可以收到。
+     * 该字段对 iOS 的 Notification 消息无效。
+     */
+    private int time_to_live;
+
+    /**
+     * APNs 是否生产环境
+     * 该字段仅对 iOS 的 Notification 有效,如果不指定则为推送生产环境。注意:JPush 服务端 SDK 默认设置为推送 “开发环境”。
+     * true:表示推送生产环境。
+     * false:表示推送开发环境。
+     */
+    private boolean apns_production;
+
+    /**
+     * 消息类型分类
+     * 	极光不对指定的消息类型进行判断或校准,会以开发者自行指定的消息类型适配 Android 厂商通道。不填默认为 0。
+     * 0:代表运营消息。
+     * 1:代表系统消息。
+     * 此字段优先级最高,会覆盖 options.third_party_channel.vivo.classification 设置的值。
+     */
+    private int classification;
+
+    /**
+     * 推送请求下发通道
+     * 仅针对配置了厂商用户使用有效
+     */
+    private ThirdPartyChannel third_party_channel;
+
+    /**
+     * 厂商通道类
+     * key 只支持 xiaomi、huawei、honor、meizu、oppo、vivo、fcm 类型用户。 key 可以为上述 7 个类型中的其中一个或者多个同时存在,未传递的 key 其对应的厂商下发走默认下发逻辑。
+     */
+    @Data
+    @Builder
+    public static class ThirdPartyChannel {
+        private Channel huawei;
+        private Channel xiaomi;
+        private Channel honor;
+        private Channel oppo;
+        private Channel vivo;
+    }
+
+    @Data
+    @Builder
+    public static class Channel{
+        /**
+         * 华为、荣耀通知栏消息智能分类
+         * LOW:一般消息。
+         * NORMAL:重要消息。
+         * HIGH:非常重要消息(仅华为支持)。
+         */
+        private String importance;
+        /**
+         * 华为、vivo 厂商消息场景标识
+         * 华为的参数值参考文档: <a href="https://developer.huawei.com/consumer/cn/doc/HMSCore-Guides/message-classification-0000001149358835#section1085395991513">...</a>
+         */
+        private String category;
+
+        /**
+         * 小米推送平台登记的 channel id
+         * OPPO 官网登记的通道 ID
+         */
+        private String channel_id;
+
+        /**
+         * 通知栏消息下发逻辑
+         * first_ospush(VIP):成功注册厂商通道的设备走厂商通道,仅注册极光通道的设备走极光通道。
+         * ospush(VIP):表示推送强制走厂商通道下发。 需要特别注意,只要指定此值的厂商对应配额不够时,推送请求会失败,返回 1012 错误码。
+         * 举例:假设指定一个小米用户的 RegistrationID 推送,请求时针对小米、OPPO 等厂商通道都指定了“ospush”,且 OPPO 厂商通道都配额已经用完,则推送同样会返回 1012 错误,提示厂商配额不足。
+         * jpush:表示推送强制走极光通道下发。
+         * secondary_push:表示推送优先走极光,极光不在线再走厂商,厂商作为辅助(建议此种方式)。
+         */
+        private String distribution;
+    }
+}

+ 56 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/utils/push/pojo/RequestBody.java

@@ -0,0 +1,56 @@
+package cn.newfeifan.mall.module.trade.utils.push.pojo;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 推送通知类
+ */
+
+@Data
+@Builder
+public class RequestBody {
+    /**
+     * 推送平台
+     * "all"就是所有
+     * {"platform" : ["android", "ios","quickapp","hmos"] },这是指定
+     */
+    private String platform;
+    /**
+     * 推送目标
+     * "all" 全部,"tag" 标签,"registration_id" 注册id,"alias" 别名
+     */
+    private Audience audience;
+    /**
+     * 通知
+     */
+    private NotificationData notification;
+    /**
+     * 通知的内容在各个平台上,都可能只有这一个最基本的属性 "alert"。
+     * 这个位置的 "alert" 属性(直接在 notification 对象下),是一个快捷定义,各平台的 alert 信息如果都一样,则以此定义为准。如果各平台有定义,则覆盖这里的定义。
+     */
+    private String alert;
+    /**
+     * 自定义消息
+     */
+    private Message message;
+    /**
+     * 可选参数
+     */
+    private Options options;
+    /**
+     * 回调参数
+     */
+    private Callback callback;
+
+    @Data
+    public static class Audience {
+        /**
+         * 用户注册的极光id
+         * 还有其他很多类型的选择,tag,alias,live_activity_id等等,不过我们项目就只用到这个
+         */
+        private List<String> registration_id;
+    }
+}

+ 20 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/utils/wechat/WcChatMessageUtilsApiImpl.java

@@ -1,6 +1,8 @@
 package cn.newfeifan.mall.module.trade.utils.wechat;
 
 import cn.newfeifan.mall.module.trade.api.wechat.WcChatMessageUtilsApi;
+import cn.newfeifan.mall.module.trade.utils.push.JPushUtils;
+import cn.newfeifan.mall.module.trade.utils.push.pojo.RequestBody;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
@@ -13,9 +15,27 @@ public class WcChatMessageUtilsApiImpl implements WcChatMessageUtilsApi {
 
     @Resource
     private WcChatMessageUtils wcChatMessageUtils;
+    @Resource
+    private JPushUtils jPushUtils;
 
     @Override
     public void sendWcChatMessage(String templateId, List<String> params, Long systemUserId, Long objectId) {
         wcChatMessageUtils.sendWcChatMessage(templateId, params, systemUserId, objectId);
     }
+
+    @Override
+    public void jPush(List<String> rsgIds, String alert, String title, String url, Long memberUserId, Long systemUserId, Long objectId){
+        RequestBody requestBody = jPushUtils.getRequestBody(rsgIds, alert, title, url);
+        jPushUtils.jPush(requestBody, memberUserId, systemUserId, objectId);
+    }
+
+    @Override
+    public String getUrl(String title, Long objectId, Long systemUserId) {
+        return jPushUtils.getUrl(title, objectId, systemUserId);
+    }
+
+    @Override
+    public Boolean isHavePermission(Long userId, String messageName) {
+        return jPushUtils.isHavePermission(userId, messageName);
+    }
 }

+ 12 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/resources/mapper/jpushmessagelog/JPushMessageLogMapper.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.newfeifan.mall.module.trade.dal.mysql.jpushmessagelog.JPushMessageLogMapper">
+
+    <!--
+        一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
+        无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
+        代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
+        文档可见:https://www.zhongxing.cn/MyBatis/x-plugins/
+     -->
+
+</mapper>

+ 8 - 0
feifan-module-member/feifan-module-member-api/src/main/java/cn/newfeifan/mall/module/member/api/user/MemberUserApi.java

@@ -65,4 +65,12 @@ public interface MemberUserApi {
      * @return 用户信息的列表
      */
     List<MemberUserRespDTO> getUsersByMobile(String mobile);
+
+    /**
+     * 通过系统用户或者会员用户来获取对应的rsgId
+     * @param systemUserIds 系统用户
+     * @param userId 会员用固话
+     * @return rsgId列表
+     */
+    List<String> getUserRsgIds(Long systemUserIds, Long userId);
 }

+ 5 - 0
feifan-module-member/feifan-module-member-api/src/main/java/cn/newfeifan/mall/module/member/api/user/dto/MemberUserRespDTO.java

@@ -52,4 +52,9 @@ public class MemberUserRespDTO {
      */
     private Integer point;
 
+    /**
+     * 是否代理商
+     */
+    private Boolean agent;
+
 }

+ 21 - 0
feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/api/user/MemberUserApiImpl.java

@@ -3,13 +3,16 @@ package cn.newfeifan.mall.module.member.api.user;
 import cn.newfeifan.mall.module.member.api.user.dto.MemberUserRespDTO;
 import cn.newfeifan.mall.module.member.convert.user.MemberUserConvert;
 import cn.newfeifan.mall.module.member.dal.dataobject.user.MemberUserDO;
+import cn.newfeifan.mall.module.member.dal.mysql.user.MemberUserMapper;
 import cn.newfeifan.mall.module.member.service.user.MemberUserService;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
 import java.util.Collection;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 会员用户的 API 实现类
@@ -22,6 +25,8 @@ public class MemberUserApiImpl implements MemberUserApi {
 
     @Resource
     private MemberUserService userService;
+    @Resource
+    private MemberUserMapper memberUserMapper;
 
     @Override
     public MemberUserRespDTO getUser(Long id) {
@@ -49,4 +54,20 @@ public class MemberUserApiImpl implements MemberUserApi {
         return MemberUserConvert.INSTANCE.convertList2(userService. selectListByMobile(mobile));
     }
 
+    @Override
+    public List<String> getUserRsgIds(Long systemUserId, Long userId) {
+        List<MemberUserDO> memberUserDOS;
+        if (systemUserId != null) {
+            memberUserDOS = memberUserMapper.selectList(new LambdaQueryWrapper<MemberUserDO>()
+                    .eq(MemberUserDO::getSystemUsersId, systemUserId)
+                    .isNotNull(MemberUserDO::getAndroidRegisterId));
+        } else {
+            memberUserDOS = memberUserMapper.selectList(new LambdaQueryWrapper<MemberUserDO>()
+                    .eq(MemberUserDO::getId, userId)
+                    .isNotNull(MemberUserDO::getAndroidRegisterId));
+
+        }
+        return memberUserDOS.stream().map(MemberUserDO::getAndroidRegisterId).collect(Collectors.toList());
+    }
+
 }

+ 2 - 0
feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/controller/admin/user/vo/MemberUserBaseVO.java

@@ -62,4 +62,6 @@ public class MemberUserBaseVO {
     @Schema(description = "用户分组编号", example = "1")
     private Long groupId;
 
+    @Schema(description = "是否代理商")
+    private Boolean agent;
 }

+ 7 - 0
feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/controller/app/user/vo/AppMemberUserInfoRespVO.java

@@ -74,4 +74,11 @@ public class AppMemberUserInfoRespVO {
     @Schema(description = "是否关注公众号")
     private Boolean subscribe;
 
+    @Schema(description = "语言")
+    private String language;
+
+    @Schema(description = "是否是代理商 0:否 1:是")
+    private Boolean agent;
+
+
 }

+ 2 - 0
feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/controller/app/user/vo/AppMemberUserUpdateReqVO.java

@@ -36,4 +36,6 @@ public class AppMemberUserUpdateReqVO {
     @Schema(description = "银行账号", example = "31488")
     private String bankAccount;
 
+    @Schema(description = "语言")
+    private String language;
 }

+ 8 - 0
feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/dal/dataobject/user/MemberUserDO.java

@@ -175,4 +175,12 @@ public class MemberUserDO extends TenantBaseDO {
      * 安卓app注册id
      */
     private String androidRegisterId;
+    /**
+     * 语言
+     */
+    private String language;
+    /**
+     * 是否是代理商 0:否 1:是
+     */
+    private Boolean agent;
 }

+ 15 - 0
feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/service/user/MemberUserService.java

@@ -265,4 +265,19 @@ public interface MemberUserService {
      * @return 是否关注
      */
     Boolean getUserIsSubscribe(Long userId);
+
+    /**
+     * 通过系统用户或者会员用户来获取对应的rsgId
+     * @param systemUserIds 系统用户
+     * @param userId 会员用固话
+     * @return rsgId列表
+     */
+    List<String> getUserRsgIds(Long systemUserIds, Long userId);
+
+    /**
+     * 根据用户ID获取用户名
+     * @param userId 用户ID
+     * @return 用户名
+     */
+    String getUsernameByUserId(Long userId);
 }

+ 49 - 12
feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/service/user/MemberUserServiceImpl.java

@@ -31,6 +31,8 @@ import cn.newfeifan.mall.module.system.dal.mysql.social.SocialUserBindMapper;
 import cn.newfeifan.mall.module.system.dal.mysql.social.SocialUserMapper;
 import cn.newfeifan.mall.module.system.enums.sms.SmsSceneEnum;
 import cn.newfeifan.mall.module.system.service.user.AdminUserService;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.google.common.annotations.VisibleForTesting;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;
@@ -46,6 +48,7 @@ import javax.validation.Valid;
 import java.time.LocalDateTime;
 import java.util.Collection;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.newfeifan.mall.framework.common.util.servlet.ServletUtils.getClientIP;
@@ -317,7 +320,7 @@ public class MemberUserServiceImpl implements MemberUserService {
         // 校验存在
         validateUserExists(updateReqVO.getId());
         // 校验手机唯一
-        validateMobileUnique(updateReqVO.getId(), updateReqVO.getMobile());
+//        validateMobileUnique(updateReqVO.getId(), updateReqVO.getMobile());
 
         // 更新
         MemberUserDO updateObj = MemberUserConvert.INSTANCE.convert(updateReqVO);
@@ -464,11 +467,9 @@ public class MemberUserServiceImpl implements MemberUserService {
         if (registerId != null && !registerId.equals(memberUserDO.getAndroidRegisterId())) {
             // 防止一台设备登录多个账号会导致异常发送的可能,所以如果有同样的registerId就先删除后加入
             List<MemberUserDO> users = memberUserMapper.selectList(MemberUserDO::getAndroidRegisterId, registerId);
-            if(users != null){
-                for (MemberUserDO user : users) {
-                    user.setAndroidRegisterId(null);
-                    memberUserMapper.updateById(user);
-                }
+            for (MemberUserDO user : users) {
+                user.setAndroidRegisterId("");
+                memberUserMapper.update(new LambdaUpdateWrapper<MemberUserDO>().setSql(" android_register_id = null ").eq(MemberUserDO::getId, user.getId()));
             }
 
             memberUserDO.setAndroidRegisterId(registerId);
@@ -480,29 +481,62 @@ public class MemberUserServiceImpl implements MemberUserService {
     public Boolean getUserIsSubscribe(Long userId) {
         SocialUserBindDO socialUserBindDO = socialUserBindMapper.selectOne(SocialUserBindDO::getUserId, getLoginUserId());
         // 如果没有存储用户的openid就直接返回false
-        if(socialUserBindDO == null){
+        if (socialUserBindDO == null) {
             return false;
         }
         SocialUserDO socialUserDO = socialUserMapper.selectOne(SocialUserDO::getId, socialUserBindDO.getSocialUserId());
         // 如果没有存储用户的openid就直接返回false
-        if(socialUserDO == null){
+        if (socialUserDO == null) {
             return false;
         }
 
-        return isSubscribe(socialUserDO.getOpenid());
+        return isSubscribe(socialUserDO.getOpenid(), 1);
     }
 
-    private Boolean isSubscribe(String openid) {
+    @Override
+    public List<String> getUserRsgIds(Long systemUserId, Long userId) {
+        List<MemberUserDO> memberUserDOS;
+        if (systemUserId != null) {
+            memberUserDOS = memberUserMapper.selectList(new LambdaQueryWrapper<MemberUserDO>()
+                    .eq(MemberUserDO::getSystemUsersId, systemUserId)
+                    .isNotNull(MemberUserDO::getAndroidRegisterId));
+        } else {
+            memberUserDOS = memberUserMapper.selectList(new LambdaQueryWrapper<MemberUserDO>()
+                    .eq(MemberUserDO::getId, userId)
+                    .isNotNull(MemberUserDO::getAndroidRegisterId));
+
+        }
+        return memberUserDOS.stream().map(MemberUserDO::getAndroidRegisterId).collect(Collectors.toList());
+    }
+
+    @Override
+    public String getUsernameByUserId(Long userId) {
+        if (userId != null) {
+            return memberUserMapper.selectOne(MemberUserDO::getId, userId).getUsername();
+        }
+        return null;
+    }
+
+    private Boolean isSubscribe(String openid, int maxRetries) {
         String requestUrl = StrUtil.format("https://api.weixin.qq.com/cgi-bin/user/info?access_token={}&openid={}&lang=zh_CN", getAccessToken(), openid);
         String returnMsg = HttpUtil.get(requestUrl);
         cn.hutool.json.JSONObject responseJsonObject = JSONUtil.parseObj(returnMsg);
         if (ObjectUtil.isNull(responseJsonObject)) try {
             throw new Exception("响应异常:获取信息为空!");
-        }catch (Exception e) {
+        } catch (Exception e) {
             throw new RuntimeException(e);
         }
-        Integer subscribe = (Integer) responseJsonObject.get("subscribe");
         log.info("用户信息:{}", responseJsonObject);
+        Integer subscribe = (Integer) responseJsonObject.get("subscribe");
+        if(subscribe == null){
+            Object errCode = responseJsonObject.get("errcode");
+//            如果微信的accessToken失效,则重新获取,最多重试3次
+            if(errCode.toString().equals("40001") && maxRetries <= 3){
+                stringRedisTemplate.delete(WX_TICK_KEY_APPID);
+                isSubscribe(openid, maxRetries + 1);
+            }
+            return false;
+        }
         // 微信返回的数据中1为关注,0为未关注
         return subscribe == 1;
     }
@@ -540,6 +574,7 @@ public class MemberUserServiceImpl implements MemberUserService {
 
     /**
      * 校验手机号码
+     *
      * @param phoneNumber 手机号
      * @return 是否合法
      */
@@ -549,6 +584,7 @@ public class MemberUserServiceImpl implements MemberUserService {
 
     /**
      * 校验邮箱
+     *
      * @param email 邮箱
      * @return 是否合法
      */
@@ -559,6 +595,7 @@ public class MemberUserServiceImpl implements MemberUserService {
 
     /**
      * 校验银行账号
+     *
      * @param accountNumber 银行账号
      * @return 是否合法
      */

+ 9 - 0
feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/controller/app/order/AppPayOrderController.java

@@ -68,4 +68,13 @@ public class AppPayOrderController {
         return success(PayOrderConvert.INSTANCE.convert3(respVO));
     }
 
+    @PostMapping("/submit-h5")
+    @Operation(summary = "提交h5支付订单")
+    public CommonResult<String> submitPayOrderH5(@RequestBody AppPayOrderSubmitReqVO reqVO) {
+        String h5Url = payOrderService.submitH5Order(reqVO, getClientIP());
+
+        // 返回的是h5的url
+        return success(h5Url);
+    }
+
 }

+ 1 - 1
feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/service/channel/PayChannelService.java

@@ -106,5 +106,5 @@ public interface PayChannelService {
      * @param channelId 通道ID
      * @return 是否符合
      */
-    boolean getChannelById(Long channelId);
+    String getChannelById(Long channelId);
 }

+ 2 - 6
feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/service/channel/PayChannelServiceImpl.java

@@ -207,13 +207,9 @@ public class PayChannelServiceImpl implements PayChannelService {
     }
 
     @Override
-    public boolean getChannelById(Long channelId) {
+    public String getChannelById(Long channelId) {
         PayChannelDO payChannelDO = payChannelMapper.selectById(channelId);
-
-        if(payChannelDO == null) return false;
-
-        String code = FuYouPayOrderTypeEnum.getCode(payChannelDO.getCode());
-        return code != null;
+        return payChannelDO == null ? null : payChannelDO.getCode();
     }
 
 }

+ 9 - 0
feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/service/order/PayOrderService.java

@@ -4,6 +4,7 @@ import cn.newfeifan.mall.framework.common.pojo.PageResult;
 import cn.newfeifan.mall.framework.pay.core.client.dto.order.PayOrderRespDTO;
 import cn.newfeifan.mall.module.pay.api.order.dto.PayOrderCreateReqDTO;
 import cn.newfeifan.mall.module.pay.controller.admin.order.vo.*;
+import cn.newfeifan.mall.module.pay.controller.app.order.vo.AppPayOrderSubmitReqVO;
 import cn.newfeifan.mall.module.pay.dal.dataobject.channel.PayChannelDO;
 import cn.newfeifan.mall.module.pay.dal.dataobject.order.PayOrderDO;
 import cn.newfeifan.mall.module.pay.dal.dataobject.order.PayOrderExtensionDO;
@@ -173,4 +174,12 @@ public interface PayOrderService {
 
     void updatePayOrder(PayOrderDO order);
 
+    /**
+     * 提交 h5 支付订单
+     *
+     * @param reqVO    请求参数
+     * @param clientIP 用户ip
+     * @return 支付跳转链接
+     */
+    String submitH5Order(AppPayOrderSubmitReqVO reqVO, String clientIP);
 }

+ 12 - 2
feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/service/order/PayOrderServiceImpl.java

@@ -14,6 +14,7 @@ import cn.newfeifan.mall.framework.pay.core.enums.order.PayOrderStatusRespEnum;
 import cn.newfeifan.mall.framework.tenant.core.util.TenantUtils;
 import cn.newfeifan.mall.module.pay.api.order.dto.PayOrderCreateReqDTO;
 import cn.newfeifan.mall.module.pay.controller.admin.order.vo.*;
+import cn.newfeifan.mall.module.pay.controller.app.order.vo.AppPayOrderSubmitReqVO;
 import cn.newfeifan.mall.module.pay.convert.order.PayOrderConvert;
 import cn.newfeifan.mall.module.pay.dal.dataobject.app.PayAppDO;
 import cn.newfeifan.mall.module.pay.dal.dataobject.channel.PayChannelDO;
@@ -562,7 +563,8 @@ public class PayOrderServiceImpl implements PayOrderService {
         try {
 
             // 如果是对接富友的支付单,则查询富友的订单状态
-            if (channelService.getChannelById(orderExtension.getChannelId())) {
+            String code = channelService.getChannelById(orderExtension.getChannelId());
+            if (FuYouPayOrderTypeEnum.getCode(code) != null) {
                 PayOrderDO order = orderMapper.selectById(orderExtension.getOrderId());
 
                 // 查询状态,修改支付订单状态
@@ -580,6 +582,8 @@ public class PayOrderServiceImpl implements PayOrderService {
                     }
                 }
                 return true;
+            } else if(1==1){    //如果是h5支付,则调用微信接口查询支付状态
+
             }
 
             // 1.1 查询支付订单信息
@@ -624,6 +628,12 @@ public class PayOrderServiceImpl implements PayOrderService {
         orderMapper.updateById(order);
     }
 
+    @Override
+    public String submitH5Order(AppPayOrderSubmitReqVO reqVO, String clientIP) {
+
+        return null;
+    }
+
     /**
      * 同步单个支付单
      *
@@ -639,7 +649,7 @@ public class PayOrderServiceImpl implements PayOrderService {
                     continue;
                 }
 
-                if (channelService.getChannelById(orderExtension.getChannelId())) {
+                if (FuYouPayOrderTypeEnum.getCode(channelService.getChannelById(orderExtension.getChannelId())) == null) {
                     return false;
                 }
 

+ 11 - 0
feifan-module-system/feifan-module-system-api/src/main/java/cn/newfeifan/mall/module/system/api/sms/dto/code/SmsCodeSendReqDTO.java

@@ -3,6 +3,7 @@ package cn.newfeifan.mall.module.system.api.sms.dto.code;
 import cn.newfeifan.mall.framework.common.validation.InEnum;
 import cn.newfeifan.mall.framework.common.validation.Mobile;
 import cn.newfeifan.mall.module.system.enums.sms.SmsSceneEnum;
+import lombok.Builder;
 import lombok.Data;
 
 import javax.validation.constraints.NotEmpty;
@@ -34,4 +35,14 @@ public class SmsCodeSendReqDTO {
     @NotEmpty(message = "发送 IP 不能为空")
     private String createIp;
 
+    /**
+     * 名称
+     */
+    private String name;
+
+    /**
+     * 金额
+     */
+    private Long money;
+
 }

+ 1 - 1
feifan-module-system/feifan-module-system-api/src/main/java/cn/newfeifan/mall/module/system/enums/ErrorCodeConstants.java

@@ -173,7 +173,7 @@ public interface ErrorCodeConstants {
     ErrorCode NOTIFY_SEND_TEMPLATE_PARAM_MISS = new ErrorCode(1_002_028_000, "模板参数({})缺失");
 
     ErrorCode WECHAT_MSG_TEMPLATE_NOT_EXISTS = new ErrorCode(1_002_028_001, "微信消息模板不存在");
-    ErrorCode WECHAT_MSG_TEMPLATE_REDIS_NOT_EXISTS = new ErrorCode(1_002_028_002, "我想消息模板缓存异常");
+    ErrorCode WECHAT_MSG_TEMPLATE_REDIS_NOT_EXISTS = new ErrorCode(1_002_028_002, "微信消息模板缓存异常");
     ErrorCode CONFIG_NOT_EXISTS = new ErrorCode(1_002_028_003, "系统配置不存在");
     ErrorCode CONFIG_REDIS_NOT_EXISTS = new ErrorCode(1_002_028_004, "系统配置不存在");
 }

+ 3 - 0
feifan-module-system/feifan-module-system-api/src/main/java/cn/newfeifan/mall/module/system/enums/sms/SmsSceneEnum.java

@@ -28,6 +28,9 @@ public enum SmsSceneEnum implements IntArrayValuable {
     TOP_UP_CONSUMPTION(10, "top-up-consumption", "系统用户 - 充值消费分"),
     CONSUMPTION_TRANSFER(11, "consumption-transfer", "会员用户 - 消费分转让"),
     ZERO_PURCHASE(12, "zero-purchase", "会员用户 - 零元购"),
+    CONSUMPTION_POINTS_ERROR_WARNING(13, "consumption-points-error-warning", "系统用户 - 消费分异动提醒"),
+    CONSUMPTION_POINTS_TOP_UP(14,"consumption_points_top_up","会员用户 - 平台充值消费分通知"),
+    CONSUMPTION_POINTS_TRANSFER_INFORM(15,"consumption_points_transfer_inform","会员用户 - 消费分转让通知"),
 
     ADMIN_MEMBER_LOGIN(21, "admin-sms-login", "后台用户 - 手机号登录");
 

+ 13 - 4
feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/service/sms/SmsCodeServiceImpl.java

@@ -15,6 +15,7 @@ import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
+import java.util.HashMap;
 
 import static cn.hutool.core.util.RandomUtil.randomInt;
 import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -43,11 +44,19 @@ public class SmsCodeServiceImpl implements SmsCodeService {
     public void sendSmsCode(SmsCodeSendReqDTO reqDTO) {
         SmsSceneEnum sceneEnum = SmsSceneEnum.getCodeByScene(reqDTO.getScene());
         Assert.notNull(sceneEnum, "验证码场景({}) 查找不到配置", reqDTO.getScene());
-        // 创建验证码
-        String code = createSmsCode(reqDTO.getMobile(), reqDTO.getScene(), reqDTO.getCreateIp());
+
+        HashMap<String, Object> map;
+        if (reqDTO.getScene().equals(SmsSceneEnum.CONSUMPTION_POINTS_TRANSFER_INFORM.getScene())) {
+            map = MapUtil.of("name", reqDTO.getName());
+            map.put("money", reqDTO.getMoney());
+        } else {
+            // 创建验证码
+            String code = createSmsCode(reqDTO.getMobile(), reqDTO.getScene(), reqDTO.getCreateIp());
+            map = MapUtil.of("code", code);
+        }
         // 发送验证码
         smsSendService.sendSingleSms(reqDTO.getMobile(), null, null,
-                sceneEnum.getTemplateCode(), MapUtil.of("code", code));
+                sceneEnum.getTemplateCode(), map);
     }
 
     private String createSmsCode(String mobile, Integer scene, String ip) {
@@ -68,7 +77,7 @@ public class SmsCodeServiceImpl implements SmsCodeService {
 
         // 创建验证码记录
         String code = "";
-        while (code.length() < 4){
+        while (code.length() < 4) {
             code = String.valueOf(randomInt(smsCodeProperties.getBeginCode(), smsCodeProperties.getEndCode() + 1));
         }
         SmsCodeDO newSmsCode = SmsCodeDO.builder().mobile(mobile).code(code).scene(scene)

+ 4 - 1
feifan-server/src/main/resources/application-local.yaml

@@ -266,4 +266,7 @@ justauth:
 #    file:
 #       disabled: true
 
-
+#极光推送配置
+jpush:
+  app-key: ae2e75f19ee1b240e744191b
+  secret: ae5e69155a3cb68ffd94158e

+ 4 - 1
feifan-server/src/main/resources/application-prod.yaml

@@ -268,4 +268,7 @@ justauth:
 #    file:
 #       disabled: true
 
-
+#极光推送配置
+jpush:
+  app-key: ae2e75f19ee1b240e744191b
+  secret: ae5e69155a3cb68ffd94158e