Przeglądaj źródła

c2c修改,防重复提交

30262728@qq.com 1 tydzień temu
rodzic
commit
c008770032
43 zmienionych plików z 2159 dodań i 355 usunięć
  1. 1 10
      pom.xml
  2. 7 5
      qnfhq-api/pom.xml
  3. 27 0
      qnfhq-api/src/main/java/com/qnfhq/annotation/RepeatSubmit.java
  4. 72 0
      qnfhq-api/src/main/java/com/qnfhq/config/ResourcesConfig.java
  5. 28 23
      qnfhq-api/src/main/java/com/qnfhq/config/SaTokenConfigure.java
  6. 11 11
      qnfhq-api/src/main/java/com/qnfhq/config/SwaggerConfig.java
  7. 1 1
      qnfhq-api/src/main/java/com/qnfhq/constant/CacheConstants.java
  8. 60 0
      qnfhq-api/src/main/java/com/qnfhq/interceptor/RepeatSubmitInterceptor.java
  9. 78 0
      qnfhq-api/src/main/java/com/qnfhq/interceptor/impl/RepeatedlyRequestWrapper.java
  10. 95 0
      qnfhq-api/src/main/java/com/qnfhq/interceptor/impl/SameUrlDataInterceptor.java
  11. 28 38
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/controller/C2cAdController.java
  12. 6 7
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/controller/C2cMerchantController.java
  13. 73 172
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/controller/C2cOrderController.java
  14. 2 0
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dao/C2cOrderDao.java
  15. 2 2
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/C2cAdListDTO.java
  16. 2 2
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/C2cOrderComplainDetailDTO.java
  17. 1 1
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/C2cOrderListDTO.java
  18. 1 1
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/entity/C2cMerchantEntity.java
  19. 1 0
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/enums/MerchantStatusEnum.java
  20. 24 2
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/C2cOrderService.java
  21. 28 14
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/impl/C2cAdServiceImpl.java
  22. 1 0
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/impl/C2cMerchantServiceImpl.java
  23. 60 7
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/impl/C2cOrderServiceImpl.java
  24. 25 46
      qnfhq-api/src/main/java/com/qnfhq/modules/user/controller/ApiAppUserController.java
  25. 12 0
      qnfhq-api/src/main/java/com/qnfhq/modules/user/service/AppUserService.java
  26. 6 2
      qnfhq-api/src/main/java/com/qnfhq/modules/user/service/impl/AppUserServiceImpl.java
  27. 16 0
      qnfhq-api/src/main/java/com/qnfhq/utils/RandomNumberGenerator.java
  28. 56 0
      qnfhq-api/src/main/java/com/qnfhq/utils/http/HttpHelper.java
  29. 20 1
      qnfhq-api/src/main/resources/application.yml
  30. 134 0
      qnfhq-api/src/main/resources/i18n/messages.properties
  31. 134 0
      qnfhq-api/src/main/resources/i18n/messages_de.properties
  32. 133 0
      qnfhq-api/src/main/resources/i18n/messages_en.properties
  33. 134 0
      qnfhq-api/src/main/resources/i18n/messages_es.properties
  34. 134 0
      qnfhq-api/src/main/resources/i18n/messages_fr.properties
  35. 134 0
      qnfhq-api/src/main/resources/i18n/messages_ja.properties
  36. 134 0
      qnfhq-api/src/main/resources/i18n/messages_ko.properties
  37. 134 0
      qnfhq-api/src/main/resources/i18n/messages_th.properties
  38. 134 0
      qnfhq-api/src/main/resources/i18n/messages_tw.properties
  39. 133 0
      qnfhq-api/src/main/resources/i18n/messages_vi.properties
  40. 9 5
      qnfhq-api/src/main/resources/i18n/messages_zh.properties
  41. 47 1
      qnfhq-api/src/main/resources/mapper/c2c/C2cOrderDao.xml
  42. 4 4
      qnfhq-api/src/main/resources/mapper/user/AppAssetDao.xml
  43. 17 0
      qnfhq-common/src/main/java/com/qnfhq/common/utils/IpUtils.java

+ 1 - 10
pom.xml

@@ -30,13 +30,9 @@
         <java.version>21</java.version>
         <druid.version>1.2.23</druid.version>
         <mybatisplus.version>3.5.8</mybatisplus.version>
-        <sqlserver.version>4.0</sqlserver.version>
-        <oracle.version>11.2.0.3</oracle.version>
-        <dameng.version>8.1.2.141</dameng.version>
         <hutool.version>5.8.29</hutool.version>
         <jsoup.version>1.15.3</jsoup.version>
-        <knife4j.version>4.5.0</knife4j.version>
-        <springdoc.version>2.8.4</springdoc.version>
+        <springdoc.version>2.8.8</springdoc.version>
         <sa-token.version>1.34.0</sa-token.version>
     </properties>
 
@@ -101,11 +97,6 @@
             <artifactId>jsoup</artifactId>
             <version>${jsoup.version}</version>
         </dependency>
-        <dependency>
-            <groupId>com.github.xiaoymin</groupId>
-            <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
-            <version>${knife4j.version}</version>
-        </dependency>
         <dependency>
             <groupId>org.springdoc</groupId>
             <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>

+ 7 - 5
qnfhq-api/pom.xml

@@ -28,11 +28,6 @@
 			<version>5.5.0</version>
 		</dependency>
 
-<!--        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-security</artifactId>
-        </dependency>-->
-
         <!-- 解析客户端操作系统、浏览器等 -->
         <dependency>
             <groupId>eu.bitwalker</groupId>
@@ -70,6 +65,13 @@
             <artifactId>redisson-spring-boot-starter</artifactId>
             <version>${redisson.version}</version>
         </dependency>
+
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>2.0.60</version>
+        </dependency>
 	</dependencies>
 
 	<build>

+ 27 - 0
qnfhq-api/src/main/java/com/qnfhq/annotation/RepeatSubmit.java

@@ -0,0 +1,27 @@
+package com.qnfhq.annotation;
+
+
+import java.lang.annotation.*;
+
+/**
+ * 自定义注解防止表单重复提交
+ *
+ * @author Me Table
+ *
+ */
+@Inherited
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface RepeatSubmit
+{
+    /**
+     * 间隔时间(ms),小于此时间视为重复提交
+     */
+    public int interval() default 5000;
+
+    /**
+     * 提示消息
+     */
+    public String message() default "不允许重复提交,请稍候再试";
+}

+ 72 - 0
qnfhq-api/src/main/java/com/qnfhq/config/ResourcesConfig.java

@@ -0,0 +1,72 @@
+package com.qnfhq.config;
+
+import com.qnfhq.interceptor.RepeatSubmitInterceptor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.CacheControl;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+import org.springframework.web.filter.CorsFilter;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 通用配置
+ *
+ * @author table
+ */
+@Configuration
+public class ResourcesConfig implements WebMvcConfigurer
+{
+    @Autowired
+    private RepeatSubmitInterceptor repeatSubmitInterceptor;
+
+//    @Override
+//    public void addResourceHandlers(ResourceHandlerRegistry registry)
+//    {
+//        /** 本地文件上传路径 */
+//        registry.addResourceHandler(Constants.RESOURCE_PREFIX + "/**")
+//                .addResourceLocations("file:" + TableConfig.getProfile() + "/");
+//
+//        /** swagger配置 */
+//        registry.addResourceHandler("/swagger-ui/**")
+//                .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/")
+//                .setCacheControl(CacheControl.maxAge(5, TimeUnit.HOURS).cachePublic());;
+//    }
+
+    /**
+     * 自定义拦截规则
+     */
+    @Override
+    public void addInterceptors(InterceptorRegistry registry)
+    {
+        registry.addInterceptor(repeatSubmitInterceptor).addPathPatterns("/**");
+    }
+
+    /**
+     * 跨域配置
+     */
+//    @Bean
+//    public CorsFilter corsFilter()
+//    {
+//        CorsConfiguration config = new CorsConfiguration();
+//        config.setAllowCredentials(true);
+//        // 设置访问源地址
+//        config.addAllowedOriginPattern("*");
+//        // 设置访问源请求头
+//        config.addAllowedHeader("*");
+//        // 设置访问源请求方法
+//        config.addAllowedMethod("*");
+//        // 有效期 1800秒
+//        config.setMaxAge(1800L);
+//        // 添加映射路径,拦截一切请求
+//        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+//        source.registerCorsConfiguration("/**", config);
+//        // 返回新的CorsFilter
+//        return new CorsFilter(source);
+//    }
+}

+ 28 - 23
qnfhq-api/src/main/java/com/qnfhq/config/SaTokenConfigure.java

@@ -8,12 +8,14 @@ import cn.dev33.satoken.util.SaResult;
 import com.qnfhq.common.exception.ErrorCode;
 import com.qnfhq.common.redis.RedisUtils;
 import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
 /**
  * [Sa-Token 权限认证] 配置类
  */
+@Slf4j
 @Configuration
 public class SaTokenConfigure {
     @Resource
@@ -24,43 +26,45 @@ public class SaTokenConfigure {
      */
     @Bean
     public SaServletFilter getSaServletFilter() {
+        log.info("---------- Sa-Token 配置 in getSaServletFilter----------");
         return new SaServletFilter()
 
                 // 指定 拦截路由 与 放行路由
-                .addInclude("/api/**")
+                .addInclude("/**")
                 .addExclude(
-                        "/api/login/**",
-                        "/api/app/**",
-                        "/api/home/**",
-                        "/api/notice/**",
-                        "/api/option/rules/**",
                         "/api/user/register",
-                        "/api/user/easyGenerateCode",
-                        "/api/app/**",
+                        "/api/user/login",
+                        "/api/user/captcha",
+                        "/api/user/checkCaptcha",
                         "/api/user/sendEmailCode",
                         "/api/user/sendMobileCode",
-                        "/api/user/getCountryCode",
-                        "/api/user/backPwd",
-                        "/api/user/bindPhoneEmail",
-                        "/api/coin/list",
-                        "/api/user/bindPhoneEmail",
-                        "/api/timezone/getTimeZone",
-                        "/ws/**",
-                        "/api/recall/withdraw/unc",
-                        "/api/recall/pay/unc",
-                        "/api/advert/list",
-                        "/api/helpcenter/**",
-                        "/api/helpCenterInfo/**",
-                        "/api/blockcc/ageeTrade",
-                        "/api/ekyc/**", // 实名认证 - 认证返回函数
-                        "/api/external/**"
+                        "/api/user/resetPwdPhone",
+                        "/api/user/resetPwdEmail",
+                        "/api/user/checkPhoneCode",
+                        "/api/user/checkEmailCode"
+
+//                        "/api/coin/list",
+//                        "/api/user/bindPhoneEmail",
+//                        "/api/timezone/getTimeZone",
+//                        "/ws/**",
+//                        "/api/recall/withdraw/unc",
+//                        "/api/recall/pay/unc",
+//                        "/api/advert/list",
+//                        "/api/helpcenter/**",
+//                        "/api/helpCenterInfo/**",
+//                        "/api/blockcc/ageeTrade",
+//                        "/api/ekyc/**", // 实名认证 - 认证返回函数
+//                        "/api/external/**"
 
                 )
                 // 认证函数: 每次请求执行
                 .setAuth(obj -> {
+                    log.info("---------- 进入Sa-Token认证函数 ----------");
                     if (StpUtil.isLogin() == false) {
+                        log.info("---------- 进入Sa-Token认证函数 未登陆----------");
                         SaRouter.back(new SaResult(ErrorCode.UNAUTHORIZED, "error", (Object) null));
                     } else {
+                        log.info("---------- 进入Sa-Token认证函数 已登陆----------");
                         long userId = StpUtil.getLoginIdAsLong();
                         redisUtils.get("active:UserId:" + userId,2*60*60);
                     }
@@ -69,6 +73,7 @@ public class SaTokenConfigure {
 
                 // 异常处理函数:每次认证函数发生异常时执行此函数
                 .setError(e -> {
+                    log.info("---------- 进入Sa-Token异常处理 ----------"+e.getMessage());
                     // System.out.println("---------- 进入Sa-Token异常处理 -----------");
                     return SaResult.error(e.getMessage());
                 })

+ 11 - 11
qnfhq-api/src/main/java/com/qnfhq/config/SwaggerConfig.java

@@ -6,7 +6,6 @@ import io.swagger.v3.oas.models.info.Info;
 import io.swagger.v3.oas.models.security.SecurityRequirement;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
-
 import java.util.ArrayList;
 import java.util.List;
 
@@ -16,8 +15,9 @@ public class SwaggerConfig {
     @Bean
     public OpenAPI createRestApi() {
         return new OpenAPI()
-                .info(apiInfo())
-                .security(security());
+
+                .info(apiInfo());
+//                .security(security());
     }
 
     private Info apiInfo() {
@@ -27,13 +27,13 @@ public class SwaggerConfig {
                 .version("v1.0.0");
     }
 
-    private List<SecurityRequirement> security() {
-        SecurityRequirement key = new SecurityRequirement();
-        key.addList(Constant.TOKEN_HEADER, Constant.TOKEN_HEADER);
-
-        List<SecurityRequirement> list = new ArrayList<>();
-        list.add(key);
-        return list;
-    }
+//    private List<SecurityRequirement> security() {
+//        SecurityRequirement key = new SecurityRequirement();
+//        key.addList(Constant.TOKEN_HEADER, Constant.TOKEN_HEADER);
+//
+//        List<SecurityRequirement> list = new ArrayList<>();
+//        list.add(key);
+//        return list;
+//    }
 
 }

+ 1 - 1
qnfhq-api/src/main/java/com/qnfhq/constant/CacheConstants.java

@@ -32,7 +32,7 @@ public class CacheConstants
     /**
      * 防重提交 redis key
      */
-//    public static final String REPEAT_SUBMIT_KEY = "repeat_submit:";
+    public static final String REPEAT_SUBMIT_KEY = "repeat_submit:";
 
     /**
      * 限流 redis key

+ 60 - 0
qnfhq-api/src/main/java/com/qnfhq/interceptor/RepeatSubmitInterceptor.java

@@ -0,0 +1,60 @@
+package com.qnfhq.interceptor;
+
+
+import com.alibaba.fastjson2.JSON;
+import com.qnfhq.annotation.RepeatSubmit;
+import com.qnfhq.common.utils.Result;
+import org.springframework.stereotype.Component;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.HandlerInterceptor;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import java.lang.reflect.Method;
+
+/**
+ * 防止重复提交拦截器
+ *
+ * @author Table Me
+ */
+@Component
+public abstract class RepeatSubmitInterceptor implements HandlerInterceptor
+{
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
+    {
+        if (handler instanceof HandlerMethod)
+        {
+            HandlerMethod handlerMethod = (HandlerMethod) handler;
+            Method method = handlerMethod.getMethod();
+            RepeatSubmit annotation = method.getAnnotation(RepeatSubmit.class);
+            if (annotation != null)
+            {
+                if (this.isRepeatSubmit(request, annotation))
+                {
+                    Result result = new Result();
+                    result.error(annotation.message());
+                    response.setStatus(200);
+                    response.setContentType("application/json");
+                    response.setCharacterEncoding("utf-8");
+                    response.getWriter().print(JSON.toJSONString(result));
+                    return false;
+                }
+            }
+            return true;
+        }
+        else
+        {
+            return true;
+        }
+    }
+
+    /**
+     * 验证是否重复提交由子类实现具体的防重复提交的规则
+     *
+     * @param request 请求信息
+     * @param annotation 防重复注解参数
+     * @return 结果
+     * @throws Exception
+     */
+    public abstract boolean isRepeatSubmit(HttpServletRequest request, RepeatSubmit annotation);
+}

+ 78 - 0
qnfhq-api/src/main/java/com/qnfhq/interceptor/impl/RepeatedlyRequestWrapper.java

@@ -0,0 +1,78 @@
+package com.qnfhq.interceptor.impl;
+
+
+import com.qnfhq.utils.http.HttpHelper;
+import jakarta.servlet.ReadListener;
+import jakarta.servlet.ServletInputStream;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequestWrapper;
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+/**
+ * 构建可重复读取inputStream的request
+ * 
+ * @author Table
+ */
+public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper
+{
+    public static final String UTF8 = "UTF-8";
+
+    private final byte[] body;
+
+    public RepeatedlyRequestWrapper(HttpServletRequest request, ServletResponse response) throws IOException
+    {
+        super(request);
+        request.setCharacterEncoding(UTF8);
+        response.setCharacterEncoding(UTF8);
+
+        body = HttpHelper.getBodyString(request).getBytes(UTF8);
+    }
+
+    @Override
+    public BufferedReader getReader() throws IOException
+    {
+        return new BufferedReader(new InputStreamReader(getInputStream()));
+    }
+
+    @Override
+    public ServletInputStream getInputStream() throws IOException
+    {
+        final ByteArrayInputStream bais = new ByteArrayInputStream(body);
+        return new ServletInputStream()
+        {
+            @Override
+            public int read() throws IOException
+            {
+                return bais.read();
+            }
+
+            @Override
+            public int available() throws IOException
+            {
+                return body.length;
+            }
+
+            @Override
+            public boolean isFinished()
+            {
+                return false;
+            }
+
+            @Override
+            public boolean isReady()
+            {
+                return false;
+            }
+
+            @Override
+            public void setReadListener(ReadListener readListener)
+            {
+
+            }
+        };
+    }
+}

+ 95 - 0
qnfhq-api/src/main/java/com/qnfhq/interceptor/impl/SameUrlDataInterceptor.java

@@ -0,0 +1,95 @@
+package com.qnfhq.interceptor.impl;
+
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson2.JSON;
+import com.qnfhq.annotation.RepeatSubmit;
+import com.qnfhq.common.redis.RedisUtils;
+import com.qnfhq.common.utils.IpUtils;
+import com.qnfhq.constant.CacheConstants;
+import com.qnfhq.interceptor.RepeatSubmitInterceptor;
+import com.qnfhq.utils.http.HttpHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.util.DigestUtils;
+
+import jakarta.servlet.http.HttpServletRequest;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 判断请求url和数据是否和上一次相同,
+ * 如果和上次相同,则是重复提交表单。 有效时间为10秒内。
+ *
+ * @author Table
+ */
+@Component
+public class SameUrlDataInterceptor extends RepeatSubmitInterceptor {
+
+    // 令牌自定义标识
+    @Value("${token.header}")
+    private String header;
+
+    @Autowired
+    private RedisUtils redisUtils;
+
+    private static final Logger log = LoggerFactory.getLogger(SameUrlDataInterceptor.class);
+
+    @Override
+    public boolean isRepeatSubmit(HttpServletRequest request, RepeatSubmit annotation) {
+        try {
+        String nowParams = "";
+        if (request instanceof RepeatedlyRequestWrapper) {
+            RepeatedlyRequestWrapper repeatedlyRequest = (RepeatedlyRequestWrapper) request;
+            nowParams = HttpHelper.getBodyString(repeatedlyRequest);
+        }
+
+        // body参数为空,获取Parameter的数据
+        if (StrUtil.isEmpty(nowParams)) {
+            nowParams = JSON.toJSONString(request.getParameterMap());
+        }
+
+        // 请求地址(作为存放cache的key值)
+        String url = request.getRequestURI();
+
+        // 唯一值(没有消息头则使用请求地址)
+        String submitKey = StrUtil.trimToEmpty(request.getHeader(header));
+
+        // 如果 submitKey 为空,使用 IP + User-Agent 生成唯一标识
+        if (StrUtil.isEmpty(submitKey)) {
+            String ip = IpUtils.getIpAddr();
+            String ua = request.getHeader("User-Agent");
+            submitKey = DigestUtils.md5DigestAsHex((ip + ua).getBytes());
+        }
+
+        // 构造唯一 Key(使用 MD5 避免特殊字符问题)
+        String uniqueKey = url + submitKey + nowParams;
+
+        long userId = StpUtil.getLoginIdAsLong();
+        String tokenValue = StpUtil.getTokenValue();
+        // 唯一标识(指定key + url + 消息头)
+        String cacheRepeatKey = CacheConstants.REPEAT_SUBMIT_KEY + userId + ":" + tokenValue + DigestUtils.md5DigestAsHex(uniqueKey.getBytes());
+
+        // 获取上次提交时间
+        Long lastTime = (Long)redisUtils.get(cacheRepeatKey);
+        long interval = Math.max(annotation.interval(), 1000L);
+
+        if (lastTime != null) {
+            long diff = System.currentTimeMillis() - lastTime;
+            if (diff < interval) {
+                return true; // 重复提交
+            }
+        }
+
+        // 设置缓存,有效期为 interval 毫秒
+        redisUtils.set(cacheRepeatKey, System.currentTimeMillis(), interval/1000);
+        return false;
+        } catch (Exception e) {
+            log.error("防重复提交判断异常", e);
+            return false; // 异常不拦截请求
+        }
+    }
+
+}

+ 28 - 38
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/controller/C2cAdController.java

@@ -4,6 +4,7 @@ package com.qnfhq.modules.c2c.controller;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.json.JSONUtil;
+import com.qnfhq.annotation.RepeatSubmit;
 import com.qnfhq.common.ApiBaseController;
 import com.qnfhq.common.constant.Constant;
 import com.qnfhq.common.page.PageData;
@@ -15,11 +16,13 @@ import com.qnfhq.constant.CacheConstants;
 import com.qnfhq.modules.c2c.dto.*;
 import com.qnfhq.modules.c2c.dto.setting.AdSetting;
 import com.qnfhq.modules.c2c.entity.*;
+import com.qnfhq.modules.c2c.enums.AdStatusEnum;
 import com.qnfhq.modules.c2c.enums.DirectionEnum;
 import com.qnfhq.modules.c2c.service.*;
 import com.qnfhq.modules.user.entity.SettingEntity;
 import com.qnfhq.modules.user.enums.SettingEnum;
 import com.qnfhq.modules.user.service.SettingService;
+import io.swagger.v3.oas.annotations.Operation;
 import jakarta.annotation.Resource;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.CollectionUtils;
@@ -62,7 +65,8 @@ public class C2cAdController extends ApiBaseController {
     private C2cPayWayService c2cPayWayService;
 
     @PostMapping("/create")
-//    @RepeatSubmit(interval = 3000, message = "请求过于频繁")
+    @RepeatSubmit(interval = 3000, message = "请求过于频繁")
+    @Operation(summary = "创建广告")
     public Result create(@RequestBody C2cAdCreateDTO request) {
         ValidatorUtils.validateEntity(request);
 
@@ -132,13 +136,10 @@ public class C2cAdController extends ApiBaseController {
         }
     }
 
-    /**
-     * 商家取消广告
-     * @param c2cAd
-     * @return
-     */
+
     @PostMapping("/cancel")
-//    @RepeatSubmit(interval = 3000, message = "请求过于频繁")
+    @RepeatSubmit(interval = 3000, message = "请求过于频繁")
+    @Operation(summary = "取消广告")
     public Result cancel(@RequestBody C2cAdCancelDTO c2cAd) {
         ValidatorUtils.validateEntity(c2cAd);
 
@@ -168,11 +169,8 @@ public class C2cAdController extends ApiBaseController {
     }
 
 
-    /**
-     * 商家主页广告列表
-     * @param c2cAdVo
-     * @return
-     */
+
+    @Operation(summary = "商家主页广告列表")
     @PostMapping("/list")
     public Result list(@RequestBody C2cAdListDTO c2cAdVo) {
         ValidatorUtils.validateEntity(c2cAdVo);
@@ -181,23 +179,21 @@ public class C2cAdController extends ApiBaseController {
             return error(MessageUtils.message("c2c.ad.merchant.id.blank"));//商家编号不能空
         }
         //分页
-        Integer pageNum = Convert.toInt(c2cAdVo.getPageNum(),1);
-        Integer pageSize = Convert.toInt(c2cAdVo.getPageSize(),10);
+        String pageNum = Convert.toStr(c2cAdVo.getPageNum(),"1");
+        String pageSize = Convert.toStr(c2cAdVo.getPageSize(),"10");
         Map<String,Object> params = new HashMap<>();
         params.put(Constant.PAGE,pageNum);
         params.put(Constant.LIMIT,pageSize);
         params.put("merchantId",c2cAdVo.getMerchantId());
         params.put("direction",c2cAdVo.getDirection());
-        params.put("status",c2cAdVo.getStatus());
+        params.put("status", AdStatusEnum.PASS.getCode());
         PageData<C2cAdEntity> page = c2cAdService.page(params);
         return new Result<PageData<C2cAdEntity>>().ok(page);
     }
 
 
 
-    /**
-     * 查询我的收款信息列表
-     */
+    @Operation(summary = "查询我的收款信息列表")
     @PostMapping("/myReceipt")
     public Result myReceipt(@RequestBody C2cMyReceiptDTO dto)
     {
@@ -206,11 +202,10 @@ public class C2cAdController extends ApiBaseController {
         return success(list);
     }
 
-    /**
-     * 新增用户收款信息
-     */
+
+    @Operation(summary = "新增收款信息")
     @PostMapping("/addReceipt")
-//    @RepeatSubmit(interval = 3000, message = "请求过于频繁")
+    @RepeatSubmit(interval = 3000, message = "请求过于频繁")
     public Result addReceipt(@RequestBody C2cUserReceiptDTO dto)
     {
         ValidatorUtils.validateEntity(dto);
@@ -230,6 +225,10 @@ public class C2cAdController extends ApiBaseController {
                 return error(MessageUtils.message("c2c.userReceipt.add.repeat"));//添加成功,请勿重复提交
             }
         } else {
+            C2cUserReceiptEntity oldReceipt =c2cUserReceiptService.selectById(dto.getId());
+            if(Objects.isNull(oldReceipt)) {
+                return error(MessageUtils.message("c2c.userReceipt.id.invalid"));//编号无效
+            }
             inReceipt.setId(dto.getId());
             return toAjax(c2cUserReceiptService.updateById(inReceipt));
         }
@@ -237,11 +236,8 @@ public class C2cAdController extends ApiBaseController {
     }
 
 
-    /**
-     * 快捷交易,查询广告
-     * @param tranDTO
-     * @return
-     */
+
+    @Operation(summary = "快捷交易查询广告")
     @PostMapping("/queryTranAd")
     public Result queryTranAd(@RequestBody C2cAdTranDTO tranDTO)
     {
@@ -250,20 +246,15 @@ public class C2cAdController extends ApiBaseController {
     }
 
 
-    /**
-     * 用户浏览广告
-     * @param tranDTO
-     * @return
-     */
+    @Operation(summary = "浏览广告")
     @PostMapping("/viewList")
     public Result viewList(@RequestBody C2cAdViewDTO viewDTO) {
         ValidatorUtils.validateEntity(viewDTO);
         return c2cAdService.selectC2cAdViewList(viewDTO);
     }
 
-    /**
-     * 获取法币列表
-     */
+
+    @Operation(summary = "查询所有法币列表")
     @PostMapping("/getLegalCoinList")
     public Result getLegalCoinList() {
         Object cacheObject = redisUtils.get(CacheConstants.C2C_LEGAL_COIN_LIST);
@@ -275,9 +266,8 @@ public class C2cAdController extends ApiBaseController {
         return new Result().ok(coinList);
     }
 
-    /**
-     * 查询支付方式列表
-     */
+
+    @Operation(summary = "查询所有支付方式列表")
     @PostMapping("/getPaywayList")
     public Result getPaywayList(@RequestBody C2cPayWayDTO dto) {
         ValidatorUtils.validateEntity(dto);

+ 6 - 7
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/controller/C2cMerchantController.java

@@ -3,6 +3,7 @@ package com.qnfhq.modules.c2c.controller;
 
 import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.map.MapUtil;
+import com.qnfhq.annotation.RepeatSubmit;
 import com.qnfhq.common.utils.MessageUtils;
 import com.qnfhq.common.utils.Result;
 import com.qnfhq.common.validator.ValidatorUtils;
@@ -60,14 +61,14 @@ public class C2cMerchantController {
 
     @Operation(summary = "c2c商户申请")
     @PostMapping("/apply")
+    @RepeatSubmit(interval = 3000, message = "请求过于频繁")
     public Result apply(@RequestBody C2cMerchantApplyDTO appUserMerchant) {
         c2cMerchantService.apply(appUserMerchant,StpUtil.getLoginIdAsLong());
         return new Result();
     }
 
-    /**
-     * 查看商家主页与详情
-     */
+
+    @Operation(summary = "商家详情")
     @GetMapping(value = "/info/{id}")
     public Result getInfo(@PathVariable("id") Long id)
     {
@@ -75,10 +76,8 @@ public class C2cMerchantController {
         return new Result().ok(merchant);
     }
 
-    /**
-     * 查询自己是否商户
-     * @return
-     */
+
+    @Operation(summary = "查询当前用户是否商家")
     @GetMapping(value = "/myinfo")
     public Result myinfo()
     {

+ 73 - 172
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/controller/C2cOrderController.java

@@ -5,6 +5,8 @@ import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.qnfhq.annotation.RepeatSubmit;
 import com.qnfhq.common.ApiBaseController;
 import com.qnfhq.common.constant.Constant;
 import com.qnfhq.common.exception.ErrorCode;
@@ -23,11 +25,14 @@ import com.qnfhq.modules.c2c.enums.DirectionEnum;
 import com.qnfhq.modules.c2c.service.*;
 import com.qnfhq.modules.user.entity.AppAssetEntity;
 import com.qnfhq.modules.user.entity.AppUserDetailEntity;
+import com.qnfhq.modules.user.entity.AppUserEntity;
 import com.qnfhq.modules.user.enums.AssetEnum;
 import com.qnfhq.modules.user.enums.AuditStatusEnum;
 import com.qnfhq.modules.user.service.AppAssetService;
 import com.qnfhq.modules.user.service.AppUserDetailService;
+import com.qnfhq.modules.user.service.AppUserService;
 import com.qnfhq.utils.DistributedRedisLock;
+import io.swagger.v3.oas.annotations.Operation;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -45,9 +50,12 @@ import io.swagger.v3.oas.annotations.tags.Tag;
  */
 @Slf4j
 @RestController
-@RequestMapping("user/c2corder")
+@RequestMapping("/c2corder")
 @Tag(name="c2c订单")
 public class C2cOrderController extends ApiBaseController {
+    private final static String LOCK_C2C_ORDER = "lock_c2c_order";
+    private final static String LOCK_C2C_AD = "lock_c2c_ad:";
+
     @Resource
     private C2cOrderService c2cOrderService;
 
@@ -63,14 +71,13 @@ public class C2cOrderController extends ApiBaseController {
     @Resource
     private C2cPaymentVoucherService c2cPaymentVoucherService;
 
-    private final static String LOCK_C2C_ORDER = "lock_c2c_order";
-    private final static String LOCK_C2C_AD = "lock_c2c_ad:";
     @Resource
     private RedisUtils redisUtils;
 
     @Resource
     private DistributedRedisLock distributedRedisLock;
-    @Autowired
+
+    @Resource
     private C2cUserReceiptService c2cUserReceiptService;
 
     @Resource
@@ -78,8 +85,8 @@ public class C2cOrderController extends ApiBaseController {
 
     @Resource
     private C2cOrderComplainVoucherService orderComplainVoucherService;
-
-
+    @Autowired
+    private AppUserService appUserService;
 
     private String getC2cAdLockKey(String adId) {
         return new StringBuilder(LOCK_C2C_AD).append(adId).toString();
@@ -89,17 +96,9 @@ public class C2cOrderController extends ApiBaseController {
         return new StringBuilder(LOCK_C2C_ORDER).append(oId).toString();
     }
 
-    /**
-     * 下单,
-     * 1 判断用户是有进行中的订单, 缓存时间24小时, 完成订单才能继续下单
-     * 2 校验入参
-     * 3 校验广告可用
-     * 4 实名认证
-     * @param c2cOrder
-     * @return
-     */
+    @Operation(summary = "c2c下单")
     @PostMapping("/create")
-//    @RepeatSubmit(interval = 3000, message = "请求过于频繁")
+    @RepeatSubmit(interval = 3000, message = "请求过于频繁")
     public Result create(@RequestBody C2cOrderCreateDTO c2cOrder) {
         Result result = new Result();
         ValidatorUtils.validateEntity(c2cOrder);
@@ -129,7 +128,7 @@ public class C2cOrderController extends ApiBaseController {
         //实名认证
         long loginUserId = StpUtil.getLoginIdAsLong();
         AppUserDetailEntity appUserDetail = appUserDetailService.selectAppUserDetailByUserId(loginUserId);
-        if(appUserDetail==null || appUserDetail.getAuditStatus().intValue() == AuditStatusEnum.EXAMINATION_PASSED.getCode().intValue()) {
+        if(appUserDetail==null || appUserDetail.getAuditStatus().intValue() != AuditStatusEnum.EXAMINATION_PASSED.getCode().intValue()) {
             return result.error(ErrorCode.SHIMING_VERIFY,MessageUtils.message("user.authentication.not.certified"));//请先进行实名认证
         }
 
@@ -140,6 +139,11 @@ public class C2cOrderController extends ApiBaseController {
             tAppAsset.setSymbol(c2cOrder.getSymbol());
             tAppAsset.setType(AssetEnum.PLATFORM_ASSETS.getCode());
             List<AppAssetEntity> assetList = appAssetService.selectList(tAppAsset);
+            if(assetList==null || assetList.size()==0) {
+                AppUserEntity user = appUserService.getUserByUserId(loginUserId);
+                appUserService.initAppUserAsset(user);
+                return error(MessageUtils.message("c2c.order.availableAmount.buzu"));//您的可用资产不足
+            }
             AppAssetEntity sellerAsset = assetList.get(0);
             if(sellerAsset.getAvailable().compareTo(c2cOrder.getTranAmount())==-1) {
                 return error(MessageUtils.message("c2c.order.availableAmount.insufficient"));//您的可用资产必须大于卖出数量
@@ -223,9 +227,7 @@ public class C2cOrderController extends ApiBaseController {
         return error(MessageUtils.message("operation.fail.please.refresh"));//操作失败,请刷新后重试
     }
 
-    /**
-     * 买家查询我的订单信息 (进行中的)
-     */
+    @Operation(summary = "查询进行中的订单")
     @PostMapping("/myOrder")
     public Result myOrder()
     {
@@ -251,14 +253,9 @@ public class C2cOrderController extends ApiBaseController {
 
     }
 
-    /**
-     * 用户取消订单:
-     * 已结束订单,申诉订单不能取消
-     * 用户买入: 用户未付款,已付款都可以取消
-     * 用户卖出: 商家已付款,用户不能取消
-     */
+    @Operation(summary = "用户取消订单")
     @PostMapping("/cancelOrder")
-//    @RepeatSubmit(interval = 3000, message = "请求过于频繁")
+    @RepeatSubmit(interval = 3000, message = "请求过于频繁")
     public Result cancelOrder(@RequestBody C2cOrderIdDTO dto)
     {
         ValidatorUtils.validateEntity(dto);
@@ -301,23 +298,10 @@ public class C2cOrderController extends ApiBaseController {
         return error(MessageUtils.message("operation.fail.please.refresh"));//操作失败,请刷新后重试
     }
 
-    /**
-     * 统计某个用户当天订单取消次数
-     */
-//    private void setUserCancelCount() {
-//        String keyCache = StringUtils.format("c2c-o-cancel-count:{}:{}", StpUtil.getLoginIdAsString(),DateUtils.getDate());
-//        if(StringUtils.isNotNull(redisCache.getCacheObject(keyCache))) {
-//            redisCache.increment(keyCache,1L);
-//        } else {
-//            redisCache.setCacheObject(keyCache, 1, 24, TimeUnit.HOURS);
-//        }
-//    }
-
-    /**
-     * 点击我已完成付款通知卖家 sendMessage
-     */
+
+    @Operation(summary = "我已完成付款按钮")
     @PostMapping("/confirmPay")
-//    @RepeatSubmit(interval = 3000, message = "请求过于频繁")
+    @RepeatSubmit(interval = 3000, message = "请求过于频繁")
     public Result confirmPay(@RequestBody C2cOrderIdDTO dto)
     {
         ValidatorUtils.validateEntity(dto);
@@ -362,11 +346,10 @@ public class C2cOrderController extends ApiBaseController {
         return error(MessageUtils.message("operation.fail.please.refresh"));//操作失败,请刷新后重试
     }
 
-    /**
-     * 卖家确认收款并放币 sendMessage
-     */
+
+    @Operation(summary = "卖家确认收款按钮")
     @PostMapping("/verifyReceipt")
-//    @RepeatSubmit(interval = 3000, message = "请求过于频繁")
+    @RepeatSubmit(interval = 3000, message = "请求过于频繁")
     public Result verifyReceipt(@RequestBody C2cOrderIdDTO dto)
     {
         ValidatorUtils.validateEntity(dto);
@@ -393,11 +376,8 @@ public class C2cOrderController extends ApiBaseController {
         return error(MessageUtils.message("operation.fail.please.refresh"));//操作失败,请刷新后重试
     }
 
-    /**
-     * 查付款凭证
-     * @param c2cPaymentVoucher
-     * @return
-     */
+
+    @Operation(summary = "查订单付款凭证")
     @PostMapping("/queryPayment")
     public Result queryPayment(@RequestBody C2cPaymentVoucherQryDTO c2cPaymentVoucher)
     {
@@ -417,13 +397,10 @@ public class C2cOrderController extends ApiBaseController {
         }
     }
 
-    /**
-     * 上传付款凭证
-     * @param c2cPaymentVoucher
-     * @return
-     */
+
+    @Operation(summary = "上传付款凭证")
     @PostMapping("/uploadPayment")
-//    @RepeatSubmit(interval = 3000, message = "请求过于频繁")
+    @RepeatSubmit(interval = 3000, message = "请求过于频繁")
     public Result uploadPayment(@RequestBody C2cPaymentVoucherDTO c2cPaymentVoucher) {
         ValidatorUtils.validateEntity(c2cPaymentVoucher);
 
@@ -431,6 +408,9 @@ public class C2cOrderController extends ApiBaseController {
         String img = c2cPaymentVoucher.getImg();
 
         C2cOrderEntity order = c2cOrderService.selectOrder(orderId);
+        if(order == null) {
+            return error(MessageUtils.message("c2c.order.not.exist"));//订单编号无效
+        }
         if(order!=null && order.getFlow().intValue()==C2cOrderFlowEnum.END.getCode()) {
             return error(MessageUtils.message("c2c.order.is.end"));//订单已结束
         }
@@ -483,13 +463,10 @@ public class C2cOrderController extends ApiBaseController {
         }
     }
 
-    /**
-     * 删除付款凭证
-     * @param c2cPaymentVoucher
-     * @return
-     */
+
+    @Operation(summary = "删除付款凭证")
     @PostMapping("/deletePayment")
-//    @RepeatSubmit(interval = 3000, message = "请求过于频繁")
+    @RepeatSubmit(interval = 3000, message = "请求过于频繁")
     public Result deletePayment(@RequestBody C2cPaymentVoucherIdDTO c2cPaymentVoucher) {
         ValidatorUtils.validateEntity(c2cPaymentVoucher);
 
@@ -515,21 +492,14 @@ public class C2cOrderController extends ApiBaseController {
         }
     }
 
-
-
-
-    /**
-     * 用户或商家查询订单历史
-     * flow= 0 进行中 1 已结束
-     * status= 0 未付款 1 已付款(确认付款后)2 申诉 |  3 已完成 4 已取消
-     */
+    @Operation(summary = "用户或商家查询订单历史")
     @PostMapping("/mylist")
     public Result mylist(@RequestBody C2cOrderListDTO orderVo)
     {
         ValidatorUtils.validateEntity(orderVo);
         //分页
-        Integer pageNum = Convert.toInt(orderVo.getPageNum(),1);
-        Integer pageSize = Convert.toInt(orderVo.getPageSize(),10);
+        String pageNum = Convert.toStr(orderVo.getPageNum(),"1");
+        String pageSize = Convert.toStr(orderVo.getPageSize(),"10");
 
         Map<String,Object> params = new HashMap<>();
         params.put(Constant.PAGE,pageNum);
@@ -551,9 +521,7 @@ public class C2cOrderController extends ApiBaseController {
 
     }
 
-    /**
-     * 获取c2c订单详细信息
-     */
+    @Operation(summary = "c2c订单详细信息")
     @GetMapping(value = "/{id}")
     public Result getInfo(@PathVariable("id") Long id)
     {
@@ -591,10 +559,8 @@ public class C2cOrderController extends ApiBaseController {
 
     }
 
-    /**
-     * 商户统计:待处理的消息数=待支付 + 待放币
-     * @return
-     */
+
+    @Operation(summary = "商户统计待处理数")
     @PostMapping("/undoCounts")
     public Result undoCounts() {
         //待支付的订单数量
@@ -602,87 +568,40 @@ public class C2cOrderController extends ApiBaseController {
 
         //待放币的订单数量
         String releaseCountsKey = CacheConstants.getC2cMertUnReleaseKey(StpUtil.getLoginIdAsString());
+log.info("商户待处理Key:"+unpayCountsKey+":"+releaseCountsKey);
 
         Integer unpayCounts = 0;
         Integer releaseCounts = 0;
         if(!redisUtils.hasKey(unpayCountsKey)) {
-            unpayCounts = setMtUnPayCount(unpayCountsKey);
+            unpayCounts = c2cOrderService.setMtUnPayCount(unpayCountsKey);
         } else {
             unpayCounts = Convert.toInt(redisUtils.get(unpayCountsKey),0);
         }
         if(!redisUtils.hasKey(releaseCountsKey)) {
-            releaseCounts = setMtUnReleaseCount(releaseCountsKey);
+            releaseCounts = c2cOrderService.setMtUnReleaseCount(releaseCountsKey);
         } else {
             releaseCounts = Convert.toInt(redisUtils.get(releaseCountsKey),0);
         }
+log.info("商户待处理数Count:"+unpayCounts+":"+releaseCounts);
+
         if(unpayCounts<0 || releaseCounts<0) {
-            unpayCounts = setMtUnPayCount(unpayCountsKey);
-            releaseCounts = setMtUnReleaseCount(releaseCountsKey);
+            unpayCounts = c2cOrderService.setMtUnPayCount(unpayCountsKey);
+            releaseCounts = c2cOrderService.setMtUnReleaseCount(releaseCountsKey);
         }
         Map<String,Integer> data = MapUtil.of("unpayCounts",unpayCounts);
         data.put("releaseCounts",releaseCounts);
         return success(data);
     }
 
-    /**
-     * 设置商家待支付订单数
-     * @param unpayCountsKey
-     * @return
-     */
-    private Integer setMtUnPayCount(String unpayCountsKey) {
-        List<Map> mtUpPayList = c2cOrderService.selectMtUnPayCount(StpUtil.getLoginIdAsLong());
-        Map<String, Object> upPayMap = mtUpPayList.get(0);
-        Integer unpayCounts = Convert.toInt(upPayMap.get("NUM"), 0);
-        Random random = new Random();
-        int randomSecond = random.nextInt(12*3600)+  12*3600; // 生成12到24之间的随机数
-        redisUtils.set(unpayCountsKey, unpayCounts, randomSecond);
-        return unpayCounts;
-    }
-
-    /**
-     * 设置商家待放币数
-     * @param releaseCountsKey
-     * @return
-     */
-    private Integer setMtUnReleaseCount(String releaseCountsKey) {
-        List<Map> mtReleaseList = c2cOrderService.selectMtUnReleaseCount(StpUtil.getLoginIdAsLong());
-        Map<String,Object> releaseMap = mtReleaseList.get(0);
-        Integer releaseCounts = Convert.toInt(releaseMap.get("NUM"),0);
-        Random random = new Random();
-        int randomSecond = random.nextInt(12*3600)+12*3600; // 生成12到24之间的随机数
-        redisUtils.set(releaseCountsKey,releaseCounts,randomSecond);
-        return releaseCounts;
-    }
-
-    /**
-     * 用户统计:待处理的消息数=待支付 + 待放币
-     * @return
-     */
-//    @PostMapping("/userUndoCounts")
-//    public AjaxResult userUndoCounts() {
-//        //待支付的订单数量
-//        String unpayCountsKey = StringUtils.format(CacheConstants.C2C_UNPAY_COUNTS, StpUtil.getLoginIdAsString());
-//        Integer unpayCounts = Convert.toInt(redisCache.getCacheObject(unpayCountsKey),0);
-//        //待放币的订单数量
-//        String releaseCountsKey = StringUtils.format(CacheConstants.C2C_RELEASE_COUNTS, StpUtil.getLoginIdAsString());
-//        Integer releaseCounts = Convert.toInt(redisCache.getCacheObject(releaseCountsKey),0);
-//        Map<String,Integer> data = MapUtil.of("unpayCounts",unpayCounts);
-//        data.put("releaseCounts",releaseCounts);
-//        return success(data);
-//    }
-
-    /**
-     * 用户/商家发起申诉
-     * @param c2cOrderComplain
-     * @return
-     */
+    @Operation(summary = "用户/商家发起申诉")
     @PostMapping("/complain")
-//    @RepeatSubmit(interval = 3000, message = "请求过于频繁")
+    @RepeatSubmit(interval = 3000, message = "请求过于频繁")
     public Result complain(@RequestBody C2cOrderComplainDTO c2cOrderComplain)
     {
         ValidatorUtils.validateEntity(c2cOrderComplain);
 
         C2cOrderEntity order = c2cOrderService.selectOrder(c2cOrderComplain.getOrderId());
+        log.info("订单信息:"+ JSON.toJSONString(order));
         if(order == null) {
             return error(MessageUtils.message("c2c.order.not.exist"));//订单编号无效
         }
@@ -713,13 +632,10 @@ public class C2cOrderController extends ApiBaseController {
 
     }
 
-    /**
-     * 用户或商家提交申诉凭证
-     * @param
-     * @return
-     */
+
+    @Operation(summary = "用户或商家提交申诉凭证")
     @PostMapping("/complainVoucher")
-//    @RepeatSubmit(interval = 3000, message = "请求过于频繁")
+    @RepeatSubmit(interval = 3000, message = "请求过于频繁")
     public Result complainVoucher(@RequestBody C2cOrderComplainVoucherDTO dto)
     {
         ValidatorUtils.validateEntity(dto);
@@ -795,9 +711,7 @@ public class C2cOrderController extends ApiBaseController {
 
     }
 
-    /**
-     * 用户或商家查询申诉历史
-     */
+    @Operation(summary = "用户或商家查询申诉历史")
     @PostMapping("/complainHis")
     public Result complainHis(@RequestBody C2cOrderComplainOidDTO orderComplain)
     {
@@ -805,49 +719,36 @@ public class C2cOrderController extends ApiBaseController {
 
         List<C2cOrderComplainEntity> complainList = new ArrayList<>();
         C2cOrderEntity order = c2cOrderService.selectOrder(orderComplain.getOrderId());
+        if(order == null) {
+            return error(MessageUtils.message("c2c.order.not.exist"));//订单编号无效
+        }
 
         if( StpUtil.getLoginIdAsLong() != order.getUserId().longValue()
                 && StpUtil.getLoginIdAsLong() != order.getTranUserId().longValue()) {
             return error(MessageUtils.message("c2c.order.no.permission.view"));//您无权查看
         }
 
-        if(checkOrderTranUser(order)) {
+        if(c2cOrderService.checkOrderTranUser(order)) {
             complainList = orderComplainService.selectC2cOrderComplainList(orderComplain.getOrderId());
         }
         return success(complainList);
     }
 
-    /**
-     * 检查登陆用户是否是买家或卖家
-     * @param order
-     * @return true 是
-     */
-    private boolean checkOrderTranUser(C2cOrderEntity order)
-    {
-        if(order.getUserId().longValue()==StpUtil.getLoginIdAsLong() ||
-                order.getTranUserId().longValue()==StpUtil.getLoginIdAsLong() ) {
-            return true;
-        } else {
-            return false;
-        }
-    }
-
-
-    /**
-     * 用户或商家查询申诉详情
-     */
+    @Operation(summary = "用户或商家申诉详情")
     @PostMapping("/complainDetail")
     public Result complainDetail(@RequestBody C2cOrderComplainDetailDTO dto)
     {
         ValidatorUtils.validateEntity(dto);
+        if(dto.getOrderId() == null && dto.getComplainId() == null) {
+            return error(MessageUtils.message("c2c.order.complainId.orderId.all.empty"));//申诉编号、订单编号不能都为空
+        }
 
         C2cOrderComplainEntity orderComplain = null;
-        if (dto.getOrderId() != null) {
-            List<C2cOrderComplainEntity> orderComplainList = orderComplainService.selectC2cOrderComplainList(dto.getOrderId());
-            orderComplain = orderComplainList.get(0);
-        }
         if (dto.getComplainId() != null) {
             orderComplain = orderComplainService.selectById(dto.getComplainId());
+        } else {
+            List<C2cOrderComplainEntity> orderComplainList = orderComplainService.selectC2cOrderComplainList(dto.getOrderId());
+            orderComplain = orderComplainList.get(0);
         }
 
         if(orderComplain==null) {
@@ -862,7 +763,7 @@ public class C2cOrderController extends ApiBaseController {
         List<C2cOrderComplainVoucherEntity> complainList = new ArrayList<>();
         C2cOrderEntity order = c2cOrderService.selectOrder(orderComplain.getOrderId());
 
-        if(checkOrderTranUser(order)) {
+        if(c2cOrderService.checkOrderTranUser(order)) {
             complainList = orderComplainVoucherService.selectList(orderComplain.getId());
         }
         Map data = MapUtil.of("complainInfo", orderComplain);

+ 2 - 0
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dao/C2cOrderDao.java

@@ -23,4 +23,6 @@ public interface C2cOrderDao extends BaseDao<C2cOrderEntity> {
 
     @Select("select count(1) NUM from c2c_order where tran_user_id=#{tranUserId} and status=1 and direction=1")
     public List<Map> selectMtUnReleaseCount(@Param("tranUserId") Long tranUserId);
+
+    public int insertC2cOrder(C2cOrderEntity c2cOrder);
 }

+ 2 - 2
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/C2cAdListDTO.java

@@ -29,8 +29,8 @@ public class C2cAdListDTO implements Serializable {
     @NotNull(message="{NotNull.direction}")//方向不能为空
 	private Integer direction;
 
-	@SchemaProperty(name = "1可用 2不可用")
-    @NotNull(message="{NotNull.status}")//状态不能空
+	@SchemaProperty(name = "1可用 -1不可用")
+//    @NotNull(message="{NotNull.status}")//状态不能空
 	private Integer status;
 
 	@SchemaProperty(name = "页码")

+ 2 - 2
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/C2cOrderComplainDetailDTO.java

@@ -20,11 +20,11 @@ public class C2cOrderComplainDetailDTO implements Serializable {
     private static final long serialVersionUID = 1L;
 
 	@SchemaProperty(name = "订单编号")
-    @NotNull(message="{NotNull.orderId}")//订单编号不能为空
+//    @NotNull(message="{NotNull.orderId}")//订单编号不能为空
 	private Long orderId;
 
 	@SchemaProperty(name = "申诉编号")
-    @NotNull(message="{NotNull.complainId}")//申诉编号不能为空
+//    @NotNull(message="{NotNull.complainId}")//申诉编号不能为空
 	private Long complainId;
 
 

+ 1 - 1
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/dto/C2cOrderListDTO.java

@@ -22,7 +22,7 @@ public class C2cOrderListDTO implements Serializable {
     private static final long serialVersionUID = 1L;
 
 	@SchemaProperty(name = "订单编号")
-    @NotBlank(message="{NotBlank.orderNo}")//订单编号不能空
+//    @NotBlank(message="{NotBlank.orderNo}")//订单编号不能空
 	private String orderNo;
 
 	@SchemaProperty(name = "方向1买入2卖出")

+ 1 - 1
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/entity/C2cMerchantEntity.java

@@ -47,7 +47,7 @@ public class C2cMerchantEntity implements Serializable {
      */
 	private Integer margin;
     /**
-     * 状态 0 审批中  1通过 -1不通过
+     * 状态 0 申请审批中  1 审批通过 -1 审批不通过 2锁定 -2已删除
      */
 	private Integer status;
     /**

+ 1 - 0
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/enums/MerchantStatusEnum.java

@@ -8,6 +8,7 @@ public enum MerchantStatusEnum {
     PENDING(0,"审核中"),
     PASS(1,"通过"),
     NOPASS(-1,"不通过"),
+    CLOSE(-2,"注销"),
     LOCK(2,"锁定");
 
     private Integer code;

+ 24 - 2
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/C2cOrderService.java

@@ -121,14 +121,14 @@ public interface C2cOrderService extends BaseService<C2cOrderEntity> {
      * @param tranUserId
      * @return
      */
-    List<Map> selectMtUnPayCount(Long tranUserId);
+//    List<Map> selectMtUnPayCount(Long tranUserId);
 
     /**
      *  获取商户待放币订单
      * @param tranUserId
      * @return
      */
-    List<Map> selectMtUnReleaseCount(Long tranUserId);
+//    List<Map> selectMtUnReleaseCount(Long tranUserId);
 
 
     /**
@@ -141,4 +141,26 @@ public interface C2cOrderService extends BaseService<C2cOrderEntity> {
      */
     public Result complain(C2cOrderEntity c2cOrder, C2cOrderComplainEntity c2cOrderComplain, Long loginId) throws Exception;
 
+
+    /**
+     * 设置商户待付款订单数
+     * @param unpayCountsKey
+     * @return
+     */
+    Integer setMtUnPayCount(String unpayCountsKey);
+
+    /**
+     * 设置商户待放币订单数
+     * @param releaseCountsKey
+     * @return
+     */
+    Integer setMtUnReleaseCount(String releaseCountsKey);
+
+    /**
+     * 检测是否交易用户
+     * @param order
+     * @return
+     */
+    boolean checkOrderTranUser(C2cOrderEntity order);
+
 }

+ 28 - 14
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/impl/C2cAdServiceImpl.java

@@ -4,6 +4,7 @@ import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.json.JSONArray;
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.Query;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -29,6 +30,7 @@ import com.qnfhq.modules.user.enums.AssetEnum;
 import com.qnfhq.modules.user.service.AppAssetService;
 import com.qnfhq.utils.OrderUtils;
 import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -45,6 +47,7 @@ import java.util.concurrent.TimeUnit;
  * @author yelz 30262728@qq.com
  * @since 1.0.0 2025-11-17
  */
+@Slf4j
 @Service
 public class C2cAdServiceImpl extends BaseServiceImpl<C2cAdDao, C2cAdEntity> implements C2cAdService {
 
@@ -286,6 +289,9 @@ public class C2cAdServiceImpl extends BaseServiceImpl<C2cAdDao, C2cAdEntity> imp
         }
         //法币和usdt兑换利率
         C2cLegalCoinEntity tLegalCoin = c2cLegalCoinService.selectC2cLegalCoinByLegalCoin(tranLegalCoin);
+        if(Objects.isNull(tLegalCoin)) {
+            return result.error(MessageUtils.message("c2c.ad.legalCoin.notset"));//当前法币未设置
+        }
         BigDecimal maxAmount = BigDecimal.ZERO;
         if (tranDTO.getDirection().intValue() == DirectionEnum.BUY.getCode().intValue()) {
             maxAmount = tranDTO.getAmount();//法币cny的金额
@@ -296,22 +302,24 @@ public class C2cAdServiceImpl extends BaseServiceImpl<C2cAdDao, C2cAdEntity> imp
 
 
         boolean flag = true;
-        //1按支付方式从redis取数
+        //1从redis取数
         for(C2cPayWayEntity payway : paywayList) {
-            long payId = payway.getId();
             String zsetKey = getViewAdKey(tranDirection, tranLegalCoin, tranSymbol);
             String zQuickKey = getQuickAdKey(zsetKey,payway.getId().toString());
 
             ArrayList<Object> adidList = null;
-            //最小买入金额 ?test
+            //配置 最小买入金额
             adidList = redisUtils.getRangeByScore(zQuickKey, 10.0, maxAmount.doubleValue());
             if (adidList != null) {
                 List<C2cAdEntity> adList = new ArrayList<>();
                 for (Object adId : adidList) {
-                    Long adIdLong = (Long) adId;//Long.valueOf((String)adId)
+                    Long adIdLong = Long.valueOf((String)adId);
                     C2cAdEntity ad = selectAdFromRedis(adIdLong);
                     if(ad == null) {
                         ad = selectById(adIdLong);
+                        if(ad==null) {
+                            redisUtils.removeZset(zQuickKey, adIdLong.toString());
+                        }
                         delSetAdCache(ad);
                     }
                     if (ad!=null && ad.getMaxAmount().compareTo(maxAmount) != -1) {
@@ -422,23 +430,22 @@ public class C2cAdServiceImpl extends BaseServiceImpl<C2cAdDao, C2cAdEntity> imp
             direction = DirectionEnum.BUY.getCode();
             params.put("direction", DirectionEnum.BUY.getCode());
         }
-        long pageNum = Convert.toLong(viewDTO.getPageNum(), 1L);
-        long pageSize = Convert.toLong(viewDTO.getPageSize(), 10L);
-        params.put(Constant.PAGE,pageNum);
-        params.put(Constant.LIMIT,pageSize);
+        Integer pageNum = Convert.toInt(viewDTO.getPageNum(), 1);
+        Integer pageSize = Convert.toInt(viewDTO.getPageSize(), 10);
+        params.put(Constant.PAGE,pageNum.toString());
+        params.put(Constant.LIMIT,pageSize.toString());
         String inputSymbol = viewDTO.getSymbol().toLowerCase();
         String inputLegalCoin = viewDTO.getLegalCoin().toUpperCase();
 
-        //1从redis取数
+        //1从redis查询
         if(amount == null && StrUtil.isEmpty(payway)) {
             long start = (pageNum - 1) * pageSize;
             long end = pageNum * pageSize-1;
             String zsetKey = getViewAdKey(direction, inputLegalCoin, inputSymbol);
-
             ArrayList<Object> adList = redisUtils.getRange(zsetKey, type, start, end);
             if (adList != null) {
                 for(Object adId : adList) {
-                    Long adIdLong = (Long) adId;
+                    Long adIdLong = Long.valueOf((String)adId);
                     C2cAdEntity ad = selectAdFromRedis(adIdLong);
                     if(ad == null) {
                         ad = selectById(adIdLong);
@@ -448,7 +455,7 @@ public class C2cAdServiceImpl extends BaseServiceImpl<C2cAdDao, C2cAdEntity> imp
                         resList.add(ad);
                     }
                 }
-                PageData<C2cAdEntity> data = new PageData<C2cAdEntity>(resList,redisUtils.countZset(zsetKey));
+                PageData<C2cAdEntity> data = new PageData<C2cAdEntity>(resList,resList.size());
                 return result.ok(data);
             }
         }
@@ -460,7 +467,7 @@ public class C2cAdServiceImpl extends BaseServiceImpl<C2cAdDao, C2cAdEntity> imp
         }
         LambdaQueryWrapper<C2cAdEntity> wrapper = new LambdaQueryWrapper<C2cAdEntity>()
                 .ne(C2cAdEntity::getUserId, StpUtil.getLoginIdAsLong())
-                .eq(C2cAdEntity::getDirection, direction)
+                .eq(Objects.nonNull(direction),C2cAdEntity::getDirection, direction)
                 .eq(StrUtil.isNotBlank(inputLegalCoin),C2cAdEntity::getLegalCoin, inputLegalCoin)
                 .eq(StrUtil.isNotBlank(inputSymbol),C2cAdEntity::getSymbol, inputSymbol)
                 .eq(C2cAdEntity::getStatus,AdStatusEnum.PASS.getCode())
@@ -490,7 +497,14 @@ public class C2cAdServiceImpl extends BaseServiceImpl<C2cAdDao, C2cAdEntity> imp
     @Override
     public C2cAdEntity selectAdFromRedis(Long id) {
         String adHKey = getAdHKey(id);
-        Map<String, Object> adMap = redisUtils.hGetAll(adHKey);
+        Map<String, Object> adMap = null;
+        try {
+            adMap = redisUtils.hGetAll(adHKey);
+        } catch (Exception e) {
+            log.error("JSON.parseObject error",e);
+            adMap = null;
+            redisUtils.delete(adHKey);
+        }
         if(adMap == null || adMap.isEmpty()) {
             return null;
         }

+ 1 - 0
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/impl/C2cMerchantServiceImpl.java

@@ -128,6 +128,7 @@ public class C2cMerchantServiceImpl extends BaseServiceImpl<C2cMerchantDao, C2cM
      * @param loginId
      * @return
      */
+    @Override
     public void apply(C2cMerchantApplyDTO appUserMerchant, long loginId) {
         //冻结保证金
         C2cMerchantConfigEntity merchantConfig = c2cMerchantConfigService.getMerchantConfig(appUserMerchant.getLegalCoin().toUpperCase());

+ 60 - 7
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/service/impl/C2cOrderServiceImpl.java

@@ -31,6 +31,7 @@ import com.qnfhq.modules.user.service.AppAssetService;
 import com.qnfhq.modules.user.service.AppUserService;
 import com.qnfhq.modules.user.service.AppWalletRecordService;
 import com.qnfhq.utils.OrderUtils;
+import com.qnfhq.utils.RandomNumberGenerator;
 import jakarta.annotation.Resource;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -80,6 +81,9 @@ public class C2cOrderServiceImpl extends BaseServiceImpl<C2cOrderDao, C2cOrderEn
     @Resource
     private AppWalletRecordService appWalletRecordService;
 
+    @Resource
+    private C2cOrderDao c2cOrderDao;
+
 
     @Override
     public PageData<C2cOrderEntity> page(Map<String, Object> params) {
@@ -170,10 +174,12 @@ public class C2cOrderServiceImpl extends BaseServiceImpl<C2cOrderDao, C2cOrderEn
 
     private C2cOrderEntity selectOrderFromRedis(Long id) {
         String odHKey = getC2cOrderKeyByOid(id.toString());
+        log.error("odHKey:"+odHKey);
         Map<String, Object> odMap = redisUtils.hGetAll(odHKey);
         if(odMap == null || odMap.isEmpty()) {
             return null;
         }
+        redisUtils.expire(odHKey, RandomNumberGenerator.getRandomNumber(3600,3*3600));
 
         C2cOrderEntity order = new C2cOrderEntity();
         order.setId(id);
@@ -302,7 +308,7 @@ public class C2cOrderServiceImpl extends BaseServiceImpl<C2cOrderDao, C2cOrderEn
         c2cOrder.setEndTime(DateUtils.getNowDateAddMins(CacheConstants.C2C_ORDER_EXPIRE_MIN));
 
         String adHKey = CacheConstants.getC2cAdHKey(c2cAd.getId().toString());
-        if(!insert(c2cOrder)) {
+        if(c2cOrderDao.insertC2cOrder(c2cOrder)<=0) {
             throw new Exception(MessageUtils.message("c2c.order.save.fail"));//保存广告失败
         }
         insertC2cOrderLog(c2cOrder.getId(), null, C2cOrderStatusEnum.CREATE.getCode(), "创建订单",loginUserId,"app");
@@ -691,14 +697,14 @@ public class C2cOrderServiceImpl extends BaseServiceImpl<C2cOrderDao, C2cOrderEn
         return orderList;
     }
 
-    @Override
-    public List<Map> selectMtUnPayCount(Long tranUserId) {
-        return selectMtUnPayCount(tranUserId);
+
+    private List<Map> selectMtUnPayCount(Long tranUserId) {
+        return c2cOrderDao.selectMtUnPayCount(tranUserId);
     }
 
-    @Override
-    public List<Map> selectMtUnReleaseCount(Long tranUserId) {
-        return selectMtUnReleaseCount(tranUserId);
+
+    private List<Map> selectMtUnReleaseCount(Long tranUserId) {
+        return c2cOrderDao.selectMtUnReleaseCount(tranUserId);
     }
 
 
@@ -763,5 +769,52 @@ public class C2cOrderServiceImpl extends BaseServiceImpl<C2cOrderDao, C2cOrderEn
     }
 
 
+    /**
+     * 设置商家待支付订单数
+     * @param unpayCountsKey
+     * @return
+     */
+    @Override
+    public Integer setMtUnPayCount(String unpayCountsKey) {
+        List<Map> mtUpPayList = selectMtUnPayCount(StpUtil.getLoginIdAsLong());
+        Map<String, Object> upPayMap = mtUpPayList.get(0);
+        Integer unpayCounts = Convert.toInt(upPayMap.get("NUM"), 0);
+        Random random = new Random();
+        int randomSecond = random.nextInt(12*3600)+  12*3600; // 生成12到24之间的随机数
+        redisUtils.set(unpayCountsKey, unpayCounts, randomSecond);
+        return unpayCounts;
+    }
+
+    /**
+     * 设置商家待放币数
+     * @param releaseCountsKey
+     * @return
+     */
+    @Override
+    public Integer setMtUnReleaseCount(String releaseCountsKey) {
+        List<Map> mtReleaseList = selectMtUnReleaseCount(StpUtil.getLoginIdAsLong());
+        Map<String,Object> releaseMap = mtReleaseList.get(0);
+        Integer releaseCounts = Convert.toInt(releaseMap.get("NUM"),0);
+        Random random = new Random();
+        int randomSecond = random.nextInt(12*3600)+12*3600; // 生成12到24之间的随机数
+        redisUtils.set(releaseCountsKey,releaseCounts,randomSecond);
+        return releaseCounts;
+    }
+
+    /**
+     * 检查登陆用户是否是买家或卖家
+     * @param order
+     * @return true 是
+     */
+    @Override
+    public boolean checkOrderTranUser(C2cOrderEntity order)
+    {
+        if(order.getUserId().longValue()==StpUtil.getLoginIdAsLong() ||
+                order.getTranUserId().longValue()==StpUtil.getLoginIdAsLong() ) {
+            return true;
+        } else {
+            return false;
+        }
+    }
 
 }

+ 25 - 46
qnfhq-api/src/main/java/com/qnfhq/modules/user/controller/ApiAppUserController.java

@@ -1,6 +1,8 @@
 package com.qnfhq.modules.user.controller;
 
 import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.lang.Validator;
+import cn.hutool.core.map.MapUtil;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.qnfhq.common.exception.ErrorCode;
 import com.qnfhq.common.exception.RenException;
@@ -63,6 +65,7 @@ public class ApiAppUserController {
     }
 
 
+
     @PostMapping("/login")
     @Operation(summary = "登录")
     public Result login(@RequestBody AppLoginDTO dto, HttpServletRequest request) {
@@ -103,10 +106,7 @@ public class ApiAppUserController {
 
 
 
-    /**
-     * 发送email通用验证码
-     */
-    @Operation(summary = "发送邮箱验证码")
+    @Operation(summary = "发送email通用验证码")
     @PostMapping("/sendEmailCode")
     public Result sendEmailCode(@RequestBody SendEmailCodeDTO sendCodeDTO) {
 
@@ -117,11 +117,7 @@ public class ApiAppUserController {
     }
 
 
-    /**
-     * 发送手机通用验证码
-     *
-     * @return
-     */
+    @Operation(summary = "发送手机通用验证码")
     @PostMapping("/sendMobileCode")
     public Result sendMobileCode (@RequestBody SendPhoneCodeDTO codeDTO){
         ValidatorUtils.validateEntity(codeDTO);
@@ -130,7 +126,7 @@ public class ApiAppUserController {
 
 
     @GetMapping("/captcha")
-    @Operation(summary = "图形验证码")
+    @Operation(summary = "获取图形验证码")
     @Parameter(in = ParameterIn.QUERY, ref = "string", name = "uuid", required = true)
     public void captcha(HttpServletResponse response, String uuid) throws IOException {
         //唯一标识不能为空
@@ -147,32 +143,25 @@ public class ApiAppUserController {
      *
      * @return
      */
-    @PostMapping("/resetPwdByEmail")
-    public Result resetPwdByEmail (@RequestBody ResetPwdByEmailDTO codeDTO){
-        ValidatorUtils.validateEntity(codeDTO);
-        return appUserService.resetPwdByEmail(codeDTO);
-    }
+//    @PostMapping("/resetPwdByEmail")
+//    public Result resetPwdByEmail (@RequestBody ResetPwdByEmailDTO codeDTO){
+//        ValidatorUtils.validateEntity(codeDTO);
+//        return appUserService.resetPwdByEmail(codeDTO);
+//    }
 
     /**
      * 重置登陆密码 old
      *
      * @return
      */
-    @PostMapping("/resetPwdByPhone")
-    public Result resetPwdByPhone (@RequestBody ResetPwdByPhoneDTO codeDTO){
-        ValidatorUtils.validateEntity(codeDTO);
+//    @PostMapping("/resetPwdByPhone")
+//    public Result resetPwdByPhone (@RequestBody ResetPwdByPhoneDTO codeDTO){
+//        ValidatorUtils.validateEntity(codeDTO);
+//
+//        return appUserService.resetPwdByPhone(codeDTO);
+//    }
 
-        return appUserService.resetPwdByPhone(codeDTO);
-    }
 
-    /**
-     * 验证图形验证码:
-     * 找回密码 FIND_PASSWORD
-     *
-     * @param dto
-     * @param request
-     * @return
-     */
     @PostMapping("/checkCaptcha")
     @Operation(summary = "验证图形验证码")
     public Result checkCaptcha(@RequestBody CheckCaptchaDTO dto, HttpServletRequest request) {
@@ -180,42 +169,32 @@ public class ApiAppUserController {
         return appUserService.checkCaptcha(dto,request);
     }
 
-    /**
-     * 验证手机验证码
-     * @return
-     */
+
+    @Operation(summary = "验证手机验证码")
     @PostMapping("/checkPhoneCode")
     public Result checkPhoneCode (@RequestBody CheckPhoneCodeDTO dto){
         ValidatorUtils.validateEntity(dto);
         return appUserService.checkPhoneCode(dto.getCodeType(),dto.getZone(),dto.getPhone(),dto.getCode());
     }
 
-    /**
-     * 验证邮箱验证码
-     * @return
-     */
+
+    @Operation(summary = "验证邮箱验证码")
     @PostMapping("/checkEmailCode")
     public Result checkEmailCode (@RequestBody CheckEmailCodeDTO dto){
         ValidatorUtils.validateEntity(dto);
         return appUserService.checkEmailCode(dto.getCodeType(),dto.getEmail(),dto.getCode());
     }
 
-    /**
-     * 重置登陆密码
-     *
-     * @return
-     */
+
+    @Operation(summary = "按邮箱重置登陆密码")
     @PostMapping("/resetPwdEmail")
     public Result resetPwdEmail (@RequestBody ResetPwdEmailDTO dto){
         ValidatorUtils.validateEntity(dto);
         return appUserService.resetPwdByEmail(dto.getEmail(),dto.getNewPwd());
     }
 
-    /**
-     * 重置登陆密码
-     *
-     * @return
-     */
+
+    @Operation(summary = "按手机重置登陆密码")
     @PostMapping("/resetPwdPhone")
     public Result resetPwdPhone (@RequestBody ResetPwdPhoneDTO dto){
         ValidatorUtils.validateEntity(dto);

+ 12 - 0
qnfhq-api/src/main/java/com/qnfhq/modules/user/service/AppUserService.java

@@ -23,6 +23,18 @@ public interface AppUserService extends BaseService<AppUserEntity> {
 
     AppUserEntity getUserByActiveCode(String activeCode);
 
+
+    /**
+     * 初始化用户详情
+     * @param user
+     */
+    void initAppUserDetail(AppUserEntity user);
+
+    /**
+     * 初始化用户资产
+     * @param user
+     */
+    void initAppUserAsset(AppUserEntity user);
     /**
      * 注册
      * @param dto

+ 6 - 2
qnfhq-api/src/main/java/com/qnfhq/modules/user/service/impl/AppUserServiceImpl.java

@@ -272,7 +272,8 @@ public class AppUserServiceImpl extends BaseServiceImpl<AppUserDao, AppUserEntit
     }
 
 
-    private void initAppUserDetail(AppUserEntity user) {
+    @Override
+    public void initAppUserDetail(AppUserEntity user) {
         //添加玩家详情表
         AppUserDetailEntity tAppUserDetail = new AppUserDetailEntity();
         tAppUserDetail.setUserId(user.getId());
@@ -291,7 +292,8 @@ public class AppUserServiceImpl extends BaseServiceImpl<AppUserDao, AppUserEntit
 
 
 
-    private void initAppUserAsset(AppUserEntity user) {
+    @Override
+    public void initAppUserAsset(AppUserEntity user) {
         SettingEntity setting = settingService.getSetting(SettingEnum.ASSET_COIN.name());
         List<AssetSymbolSetting> currencyList = JSONUtil.toList(JSONUtil.parseArray(setting.getSettingValue()), AssetSymbolSetting.class);
         if (!CollectionUtils.isEmpty(currencyList)) {
@@ -461,6 +463,7 @@ public class AppUserServiceImpl extends BaseServiceImpl<AppUserDao, AppUserEntit
         verifyResult(phoneCodeResultKey);
 
         appUser.setLoginPassword(PasswordUtils.encode(newPwd));
+        //提币或c2c卖出限制时间
         appUser.setTransferOutTime(DateUtils.addDays(new Date(),1));
         updateById(appUser);
 
@@ -488,6 +491,7 @@ public class AppUserServiceImpl extends BaseServiceImpl<AppUserDao, AppUserEntit
         verifyResult(emailCodeResultKey);
 
         appUser.setLoginPassword(PasswordUtils.encode(newPwd));
+        appUser.setTransferOutTime(DateUtils.addDays(new Date(),1));
         updateById(appUser);
         return result;
 

+ 16 - 0
qnfhq-api/src/main/java/com/qnfhq/utils/RandomNumberGenerator.java

@@ -0,0 +1,16 @@
+package com.qnfhq.utils;
+
+import java.util.concurrent.ThreadLocalRandom;
+
+/**
+ * 一句话描述
+ *
+ * @Author: Yelz 30262728@qq.com
+ * @Date: 2025/11/21 15:39
+ * @Description:
+ */
+public class RandomNumberGenerator {
+    public static int getRandomNumber(int start,int end) {
+        return ThreadLocalRandom.current().nextInt(start, end);
+    }
+}

+ 56 - 0
qnfhq-api/src/main/java/com/qnfhq/utils/http/HttpHelper.java

@@ -0,0 +1,56 @@
+package com.qnfhq.utils.http;
+
+import org.apache.commons.lang3.exception.ExceptionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import jakarta.servlet.ServletRequest;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * 通用http工具封装
+ * 
+ * @author table
+ */
+public class HttpHelper
+{
+    private static final Logger LOGGER = LoggerFactory.getLogger(HttpHelper.class);
+
+    public static String getBodyString(ServletRequest request)
+    {
+        StringBuilder sb = new StringBuilder();
+        BufferedReader reader = null;
+        try (InputStream inputStream = request.getInputStream())
+        {
+            reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
+            String line = "";
+            while ((line = reader.readLine()) != null)
+            {
+                sb.append(line);
+            }
+        }
+        catch (IOException e)
+        {
+            LOGGER.warn("getBodyString出现问题!");
+        }
+        finally
+        {
+            if (reader != null)
+            {
+                try
+                {
+                    reader.close();
+                }
+                catch (IOException e)
+                {
+                    LOGGER.error(ExceptionUtils.getMessage(e));
+                }
+            }
+        }
+        return sb.toString();
+    }
+}

+ 20 - 1
qnfhq-api/src/main/resources/application.yml

@@ -82,6 +82,15 @@ mybatis-plus:
     blobType: BLOB
     boolValue: TRUE
 
+# token配置
+token:
+  # 令牌自定义标识
+  header: Authorization
+  # 令牌密钥
+  secret: aecfp3duvwzqbcpjklmn1r2lhgwt3ghi9xter
+  # 令牌有效期(默认30分钟)
+  expireTime: 180
+
 ############## Sa-Token 配置 (文档: https://sa-token.cc) ##############
 sa-token:
   # token 名称(同时也是 cookie 名称)
@@ -101,4 +110,14 @@ sa-token:
   # 日志等级(trace、debug、info、warn、error、fatal)
   log-level: error
   # 同一账号最大登录数量,-1代表不限 (只有在 isConcurrent=true,isShare=false 时此配置才有效)
-  max-login-count: 2
+  max-login-count: 2
+
+
+#springdoc:
+#  api-docs:
+#    enabled: true                  # 启用/禁用API文档的访问
+#    path: /v3/api-docs            # 设置API文档的访问路径
+#  swagger-ui:
+#    path: /swagger-ui.html        # 设置Swagger UI的访问路径
+#    enabled: true
+#  default-flat-param-object: false

+ 134 - 0
qnfhq-api/src/main/resources/i18n/messages.properties

@@ -0,0 +1,134 @@
+500=Ralat dalaman pelayan
+401=Tidak dibenarkan
+10001={0} tidak boleh kosong
+10002=Rekod ini sudah wujud dalam pangkalan data
+10003=Gagal mendapatkan parameter
+10004=Nama pengguna atau kata laluan salah
+10005=Nama pengguna telah dinyahaktifkan
+10006=Pengenal unik tidak boleh kosong
+10007=Kod pengesahan tidak betul
+10008=Padam dahulu submenu atau butang
+10009=Kata laluan asal tidak betul
+10010=Nama pengguna tidak wujud
+10011=Pemilihan jabatan atasan salah
+10012=Menu atasan tidak boleh sama dengan diri sendiri
+10013=Antara muka kebenaran data hanya boleh menggunakan parameter jenis Map
+10014=Sila padam jabatan bawahan dahulu
+10015=Sila padam pengguna dalam jabatan dahulu
+10019=Sila muat naik fail
+10020=Token tidak boleh kosong
+10021=Token telah tamat tempoh, sila log masuk semula
+10022=Nama pengguna telah dikunci
+10024=Gagal memuat naik fail {0}
+10027=Perkhidmatan Redis mengalami masalah
+10028=Tugas berjadual gagal
+10029=Tidak boleh mengandungi aksara tidak sah
+
+user.register.fail=Pendaftaran gagal
+user.register.success=Pendaftaran berjaya
+user.register.code.err=Kod pengesahan salah
+user.register.activecode.notexisit=Kod rujukan tidak wujud
+user.register.email.format=Format emel tidak betul
+user.register.email.exisit=Emel sudah wujud
+user.register.phone.exist=Nombor telefon sudah wujud
+phone_code_empty=Nombor telefon tidak boleh kosong!
+user.code.send=Kod pengesahan berjaya dihantar
+app.verification.email.code=Kod pengesahan telah dihantar ke emel anda, sila semak
+common.send.success=Penghantaran berjaya
+sms.template.not.exist=Templat SMS tidak wujud
+appUser.login.code.err=Kod pengesahan salah
+appUser.loginName.or.password.err=Nama pengguna atau kata laluan salah
+user_is_black=Nama pengguna anda telah disenaraihitamkan, tidak boleh log masuk.
+appUser.login.success=Log masuk berjaya
+user.not.login.err=Belum log masuk
+user.not.exist=Pengguna tidak wujud
+code.try.times.limit=Bilangan percubaan terlalu banyak
+user.sendcode.frequency.limit=Permintaan kod pengesahan terlalu kerap, sila cuba semula selepas 60 saat
+user.email.send.fail=Gagal menghantar emel
+system.busy.try.again.later=Sistem sibuk, sila cuba lagi kemudian
+user.register.phone.exisit=Nombor telefon sudah wujud
+appUser.loginName.or.password.err.limit.chance=Nama pengguna atau kata laluan salah, anda mempunyai {0} peluang lagi
+pwd.fail.times.excess.hour.lock=Nama pengguna dikunci, akan dibuka selepas {0} minit
+pwd.fail.times.excess.day.lock=Nama pengguna dikunci, akan dibuka selepas {0} jam
+pwd.fail.times.excess.second.lock=Nama pengguna dikunci, akan dibuka selepas {0} saat
+user.register.email.must.lowerCase=Sila gunakan emel huruf kecil dan periksa baris kosong
+user.register.email.isTemp=Emel sementara dikesan, sila gunakan emel yang biasa dan dipercayai
+complete.mobile.bind=Pengikatan nombor telefon selesai
+your.account.available.balance.insufficient=Akaun dana anda mesti mempunyai sekurang-kurangnya {0} USDT yang tersedia
+
+complete.email.bind=Selesai pengikatan emel
+complete.identity.verification=Selesai pengesahan identiti
+c2c.merchant.apply.not.config=Jaminan deposit peniaga pengesahan c2c tidak dikonfigurasi
+merchant.param.direction.invalid=Nilai parameter direction tidak betul
+merchant.ad.minAmount.bigger.zero=Had minimum mesti lebih besar daripada 0
+merchant.minAmount.smaller.maxAmount=Had minimum mesti lebih kecil daripada had maksimum
+merchant.num.bigger.zero=Jumlah mesti lebih besar daripada 0
+merchant.price.bigger.zero=Harga mesti lebih besar daripada 0
+merchant.maxAmount.smaller.price.num=Had maksimum mesti lebih kecil daripada hasil darab harga dan jumlah
+c2cAd.price.must.bigger.set=Harga mesti lebih besar daripada {}
+c2cAd.price.must.small.set=Harga mesti lebih kecil daripada {}
+c2cAd.minAmount.must.bigger.set=Had minimum mesti lebih besar daripada {}
+c2cAd.maxAmount.must.small.set=Had maksimum mesti lebih kecil daripada {}
+merchant.complete.merchant.apply=Sila lengkapkan permohonan peniaga yang disahkan
+merchant.under.review=Peniaga yang disahkan sedang dalam proses semakan
+merchant.under.lock=Peniaga yang disahkan sedang dikunci
+merchant.approval.reject=Peniaga yang disahkan tidak diluluskan
+merchant.buyCount.greater.sellCount=Aset platform yang tersedia mesti lebih besar daripada jumlah jualan
+c2c.order.save.fail=Gagal menyimpan iklan
+seller.asset.freeze.fail=Gagal membekukan aset penjual
+c2c.ad.id.invalid=ID iklan tidak sah
+c2c.ad.cannot.cancel=Anda tidak mempunyai hak untuk membatalkan, anda bukan pihak iklan
+c2c.ad.exist.order.cancel=Terdapat pesanan yang sedang berjalan untuk iklan ini, tidak boleh dibatalkan
+c2c.ad.cancel.fail=Gagal membatalkan iklan
+c2c.user.occupied.asset.fail=Gagal mencairkan aset pengguna
+c2c.ad.merchant.id.blank=ID peniaga tidak boleh kosong
+c2c.userReceipt.add.repeat=Berjaya ditambah, sila jangan hantar berulang kali
+
+c2c.ad.current.payway.empty=Kaedah pembayaran mata wang fiat semasa belum ditetapkan
+c2c.order.create.tran.fail=Anda mempunyai transaksi yang sedang berjalan, sila selesaikan terlebih dahulu. Setelah selesai, anda boleh meneruskan transaksi.
+user.authentication.not.certified=Sila lakukan pengesahan identiti terlebih dahulu
+c2c.order.availableAmount.insufficient=Aset yang boleh digunakan mesti lebih besar daripada jumlah jualan
+c2c.order.param.adid=Nombor iklan tidak sah
+c2c.order.param.adid.invalid=Iklan tidak boleh digunakan
+c2c.order.direction.invalid=Nilai parameter direction tidak betul
+c2c.order.buyer.seller.must.different=Pembeli dan penjual tidak boleh menjadi pengguna yang sama
+c2c.order.param.tranAmt.min=Jumlah transaksi mesti lebih besar daripada had minimum
+c2c.order.param.tranAmt.max=Jumlah transaksi mesti kurang daripada had maksimum
+c2c.order.update.asset.fail=Gagal mengemas kini aset penjual
+c2c.order.not.exist=Nombor pesanan tidak sah
+c2c.order.status.end.not.cancel=Pesanan telah selesai dan tidak boleh dibatalkan
+c2c.order.complain.not.cancel=Pesanan dalam aduan tidak boleh dibatalkan
+c2c.order.sell.payed.not.cancel=Pesanan jualan telah dibayar dan tidak boleh dibatalkan
+operation.fail.please.refresh=Operasi gagal, sila segarkan dan cuba lagi
+c2c.seller.uid.not.empty=Nombor penjual tidak boleh kosong
+c2c.order.log.fail=Gagal memasukkan log pesanan
+c2c.order.update.fail=Gagal mengemas kini pesanan
+c2c.order.pay.not.buyer=Anda bukan pembeli
+c2c.order.is.end=Pesanan telah selesai
+c2c.order.uploadPayment.fail=Gagal memuat naik bukti pembayaran
+c2c.order.pay.cert.id.invalid=Nombor bukti tidak sah
+c2c.order.no.permission.view=Anda tidak mempunyai kebenaran untuk melihat
+c2c.order.status.complain.fail=Status pesanan semasa ({0}) tidak membenarkan permohonan aduan
+c2c.complain.submit.fail=Gagal memulakan aduan, anda bukan pembeli atau penjual
+c2c.order.not.buyer.seller=Anda bukan pengguna transaksi, tidak boleh memulakan aduan
+c2c.order.pay.update.fail=Gagal mengemas kini pesanan
+c2c.order.complain.submit.fail=Gagal menghantar aduan
+c2c.order.complain.not.exist=Nombor aduan tidak sah
+c2c.complain.voucher.submit.fail=Gagal menghantar, anda bukan pengadu atau yang diadukan
+c2c.order.complain.remark.notEmpty=Sebab aduan tidak boleh kosong
+c2c.order.complain.remark.maxval=Penerangan maksimum 250 aksara
+c2c.order.complain.voucher.id.invalid=Nombor bukti aduan tidak sah
+
+c2c.order.complain.voucher.is.end=Rayuan telah berakhir
+c2c.order.complain.voucher.save.fail=Gagal menyimpan bukti rayuan
+c2c.order.complain.voucher.update.fail=Gagal mengemas kini bukti rayuan
+c2c.order.complainId.orderId.invalid=Nombor rayuan atau nombor pesanan tidak sah
+password.length.lt8=Kata laluan mesti sekurang-kurangnya 8 aksara
+password.length.gt32=Kata laluan tidak boleh melebihi 32 aksara
+password.must.include.digit.alpha.sc=Kata laluan mesti mengandungi nombor, huruf besar dan kecil, serta aksara khas
+c2c.ad.legalCoin.notset=Mata wang fiat semasa belum ditetapkan
+c2c.order.availableAmount.buzu=Aset boleh guna anda tidak mencukupi
+c2c.order.not.seller=Anda bukan penjual
+c2c.userReceipt.id.invalid=Nombor tidak sah
+c2c.order.complainId.orderId.all.empty=Nombor rayuan dan nombor pesanan tidak boleh kosong serentak
+

+ 134 - 0
qnfhq-api/src/main/resources/i18n/messages_de.properties

@@ -0,0 +1,134 @@
+500=Interner Serverfehler  
+401=Nicht autorisiert  
+10001={0} darf nicht leer sein  
+10002=Datensatz existiert bereits in der Datenbank  
+10003=Parameterabruf fehlgeschlagen  
+10004=Kontoname oder Passwort falsch  
+10005=Konto wurde deaktiviert  
+10006=Eindeutige Kennung darf nicht leer sein  
+10007=Verifizierungscode ist falsch  
+10008=Bitte zuerst Untermen\u00fcs oder Buttons l\u00f6schen  
+10009=Altes Passwort ist falsch  
+10010=Konto existiert nicht  
+10011=Falsche Auswahl der \u00fcbergeordneten Abteilung  
+10012=\u00dcbergeordnetes Men\u00fc kann nicht das eigene sein  
+10013=Schnittstelle f\u00fcr Datenberechtigungen, nur Map-Typ-Parameter erlaubt  
+10014=Bitte zuerst untergeordnete Abteilungen l\u00f6schen  
+10015=Bitte zuerst Benutzer in der Abteilung l\u00f6schen  
+10019=Bitte Datei hochladen  
+10020=Token darf nicht leer sein  
+10021=Token ung\u00fcltig, bitte erneut einloggen  
+10022=Konto wurde gesperrt  
+10024=Datei-Upload fehlgeschlagen {0}  
+10027=Redis-Dienstfehler  
+10028=Fehler beim geplanten Task  
+10029=Keine unerlaubten Zeichen erlaubt  
+
+user.register.fail=Registrierung fehlgeschlagen  
+user.register.success=Registrierung erfolgreich  
+user.register.code.err=Verifizierungscode falsch  
+user.register.activecode.notexisit=Empfehlungscode existiert nicht  
+user.register.email.format=Ung\u00fcltiges E-Mail-Format  
+user.register.email.exisit=E-Mail existiert bereits  
+user.register.phone.exist=Telefonnummer existiert bereits  
+phone_code_empty=Telefonnummer darf nicht leer sein!  
+user.code.send=Verifizierungscode erfolgreich gesendet  
+app.verification.email.code=Der Verifizierungscode wurde an Ihre E-Mail gesendet, bitte pr\u00fcfen Sie Ihr Postfach  
+common.send.success=Erfolgreich gesendet  
+sms.template.not.exist=SMS-Vorlage existiert nicht  
+appUser.login.code.err=Verifizierungscode falsch  
+appUser.loginName.or.password.err=Kontoname oder Passwort falsch  
+user_is_black=Ihr Konto wurde auf die schwarze Liste gesetzt, Anmeldung nicht m\u00f6glich.  
+appUser.login.success=Anmeldung erfolgreich  
+user.not.login.err=Nicht angemeldet  
+user.not.exist=Benutzer existiert nicht  
+code.try.times.limit=Zu viele Wiederholungsversuche  
+user.sendcode.frequency.limit=Zu viele Anfragen f\u00fcr den Verifizierungscode, bitte versuchen Sie es in 60 Sekunden erneut  
+user.email.send.fail=E-Mail-Versand fehlgeschlagen  
+system.busy.try.again.later=System ausgelastet, bitte sp\u00e4ter erneut versuchen  
+user.register.phone.exisit=Telefonnummer existiert bereits  
+appUser.loginName.or.password.err.limit.chance=Kontoname oder Passwort falsch, Sie haben noch {0} Versuche  
+pwd.fail.times.excess.hour.lock=Konto gesperrt, Entsperrung in {0} Minuten  
+pwd.fail.times.excess.day.lock=Konto gesperrt, Entsperrung in {0} Stunden  
+pwd.fail.times.excess.second.lock=Konto gesperrt, Entsperrung in {0} Sekunden  
+user.register.email.must.lowerCase=Bitte verwenden Sie eine E-Mail-Adresse in Kleinbuchstaben und pr\u00fcfen Sie Leerzeilen  
+user.register.email.isTemp=Tempor\u00e4re E-Mail erkannt, bitte verwenden Sie eine g\u00e4ngige und vertrauensw\u00fcrdige E-Mail-Adresse  
+complete.mobile.bind=Telefonnummer erfolgreich gebunden  
+your.account.available.balance.insufficient=Ihr Guthabenkonto muss mindestens {0} USDT verf\u00fcgbar haben
+
+complete.email.bind=E-Mail-Bindung abschlie\u00dfen  
+complete.identity.verification=Identit\u00e4tspr\u00fcfung abschlie\u00dfen  
+c2c.merchant.apply.not.config=C2C-H\u00e4ndler-Kaution nicht konfiguriert  
+merchant.param.direction.invalid=Parameterwert f\u00fcr direction ist ung\u00fcltig  
+merchant.ad.minAmount.bigger.zero=Der Mindestbetrag muss gr\u00f6\u00dfer als 0 sein  
+merchant.minAmount.smaller.maxAmount=Der Mindestbetrag muss kleiner als der H\u00f6chstbetrag sein  
+merchant.num.bigger.zero=Die Menge muss gr\u00f6\u00dfer als 0 sein  
+merchant.price.bigger.zero=Der Preis muss gr\u00f6\u00dfer als 0 sein  
+merchant.maxAmount.smaller.price.num=Der H\u00f6chstbetrag muss kleiner als das Produkt aus Preis und Menge sein  
+c2cAd.price.must.bigger.set=Der Preis muss gr\u00f6\u00dfer als {} sein  
+c2cAd.price.must.small.set=Der Preis muss kleiner als {} sein  
+c2cAd.minAmount.must.bigger.set=Der Mindestbetrag muss gr\u00f6\u00dfer als {} sein  
+c2cAd.maxAmount.must.small.set=Der H\u00f6chstbetrag muss kleiner als {} sein  
+merchant.complete.merchant.apply=Bitte schlie\u00dfen Sie die H\u00e4ndler-Zertifizierung ab  
+merchant.under.review=H\u00e4ndler-Zertifizierung wird gepr\u00fcft  
+merchant.under.lock=H\u00e4ndler-Zertifizierung ist gesperrt  
+merchant.approval.reject=H\u00e4ndler-Zertifizierung abgelehnt  
+merchant.buyCount.greater.sellCount=Verf\u00fcgbare Verm\u00f6genswerte m\u00fcssen gr\u00f6\u00dfer als die Verkaufsmenge sein  
+c2c.order.save.fail=Anzeige konnte nicht gespeichert werden  
+seller.asset.freeze.fail=Verm\u00f6genswerte des Verk\u00e4ufers konnten nicht eingefroren werden  
+c2c.ad.id.invalid=Ung\u00fcltige Anzeigen-ID  
+c2c.ad.cannot.cancel=Sie sind nicht berechtigt, die Anzeige zu stornieren, da Sie nicht der Anzeigeninhaber sind  
+c2c.ad.exist.order.cancel=Es gibt laufende Bestellungen f\u00fcr diese Anzeige, Stornierung nicht m\u00f6glich  
+c2c.ad.cancel.fail=Anzeige konnte nicht storniert werden  
+c2c.user.occupied.asset.fail=Verm\u00f6genswerte des Nutzers konnten nicht freigegeben werden  
+c2c.ad.merchant.id.blank=H\u00e4ndler-ID darf nicht leer sein  
+c2c.userReceipt.add.repeat=Erfolgreich hinzugef\u00fcgt, bitte nicht erneut einreichen
+
+c2c.ad.current.payway.empty=F\u00fcr die aktuelle Fiat-W\u00e4hrung ist keine Zahlungsmethode festgelegt  
+c2c.order.create.tran.fail=Sie haben eine laufende Transaktion. Bitte bearbeiten Sie diese zuerst. Nach Abschluss k\u00f6nnen Sie weiter handeln.  
+user.authentication.not.certified=Bitte f\u00fchren Sie zuerst die Identit\u00e4tsverifizierung durch  
+c2c.order.availableAmount.insufficient=Ihr verf\u00fcgbares Verm\u00f6gen muss gr\u00f6\u00dfer als die Verkaufsmenge sein  
+c2c.order.param.adid=Ung\u00fcltige Anzeigen-ID  
+c2c.order.param.adid.invalid=Anzeige ist nicht mehr verf\u00fcgbar  
+c2c.order.direction.invalid=Der Parameterwert f\u00fcr direction ist nicht korrekt  
+c2c.order.buyer.seller.must.different=K\u00e4ufer und Verk\u00e4ufer d\u00fcrfen nicht der gleiche Benutzer sein  
+c2c.order.param.tranAmt.min=Der Transaktionsbetrag muss gr\u00f6\u00dfer als das Mindestlimit sein  
+c2c.order.param.tranAmt.max=Der Transaktionsbetrag muss kleiner als das H\u00f6chstlimit sein  
+c2c.order.update.asset.fail=Aktualisierung des Verk\u00e4uferverm\u00f6gens fehlgeschlagen  
+c2c.order.not.exist=Ung\u00fcltige Bestellnummer  
+c2c.order.status.end.not.cancel=Die Bestellung ist abgeschlossen und kann nicht storniert werden  
+c2c.order.complain.not.cancel=Die Bestellung befindet sich im Beschwerdeprozess und kann nicht storniert werden  
+c2c.order.sell.payed.not.cancel=Die Verkaufsbestellung wurde bereits bezahlt und kann nicht storniert werden  
+operation.fail.please.refresh=Vorgang fehlgeschlagen, bitte aktualisieren Sie die Seite und versuchen Sie es erneut  
+c2c.seller.uid.not.empty=Verk\u00e4ufer-ID darf nicht leer sein  
+c2c.order.log.fail=Fehler beim Einf\u00fcgen des Bestellprotokolls  
+c2c.order.update.fail=Fehler beim Aktualisieren der Bestellung  
+c2c.order.pay.not.buyer=Sie sind nicht der K\u00e4ufer  
+c2c.order.is.end=Die Bestellung ist abgeschlossen  
+c2c.order.uploadPayment.fail=Fehler beim Hochladen des Zahlungsnachweises  
+c2c.order.pay.cert.id.invalid=Ung\u00fcltige Nachweis-ID  
+c2c.order.no.permission.view=Sie haben keine Berechtigung zur Ansicht  
+c2c.order.status.complain.fail=F\u00fcr den aktuellen Bestellstatus ({0}) kann keine Beschwerde eingereicht werden  
+c2c.complain.submit.fail=Beschwerde konnte nicht eingereicht werden, Sie sind weder K\u00e4ufer noch Verk\u00e4ufer  
+c2c.order.not.buyer.seller=Sie sind kein Handelsteilnehmer und k\u00f6nnen keine Beschwerde einreichen  
+c2c.order.pay.update.fail=Fehler beim Aktualisieren der Bestellung  
+c2c.order.complain.submit.fail=Fehler beim Einreichen der Beschwerde  
+c2c.order.complain.not.exist=Ung\u00fcltige Beschwerde-ID  
+c2c.complain.voucher.submit.fail=Einreichung fehlgeschlagen, Sie sind weder Beschwerdef\u00fchrer noch Beschwerdegegner  
+c2c.order.complain.remark.notEmpty=Beschwerdegrund darf nicht leer sein  
+c2c.order.complain.remark.maxval=Beschreibung darf maximal 250 Zeichen enthalten  
+c2c.order.complain.voucher.id.invalid=Ung\u00fcltige Beschwerdenachweis-ID
+
+c2c.order.complain.voucher.is.end=Die Beschwerde ist abgeschlossen
+c2c.order.complain.voucher.save.fail=Speichern des Beschwerdebelegs fehlgeschlagen
+c2c.order.complain.voucher.update.fail=Aktualisierung des Beschwerdebelegs fehlgeschlagen
+c2c.order.complainId.orderId.invalid=Beschwerde- oder Bestellnummer ung\u00fcltig
+password.length.lt8=Das Passwort muss mindestens 8 Zeichen lang sein
+password.length.gt32=Das Passwort darf nicht l\u00e4nger als 32 Zeichen sein
+password.must.include.digit.alpha.sc=Das Passwort muss Zahlen, Gro\u00df- und Kleinbuchstaben sowie Sonderzeichen enthalten
+c2c.ad.legalCoin.notset=Die aktuelle Fiatw\u00e4hrung ist nicht eingestellt
+c2c.order.availableAmount.buzu=Ihr verf\u00fcgbares Guthaben ist unzureichend
+c2c.order.not.seller=Sie sind kein Verk\u00e4ufer
+c2c.userReceipt.id.invalid=Ung\u00fcltige Nummer
+c2c.order.complainId.orderId.all.empty=Beschwerde- und Bestellnummer d\u00fcrfen nicht beide leer sein
+

+ 133 - 0
qnfhq-api/src/main/resources/i18n/messages_en.properties

@@ -0,0 +1,133 @@
+500=Internal server error
+401=Unauthorized
+10001={0} cannot be empty
+10002=The record already exists in the database
+10003=Failed to get parameters
+10004=Incorrect account or password
+10005=Account has been deactivated
+10006=Unique identifier cannot be empty
+10007=Incorrect verification code
+10008=Please delete submenus or buttons first
+10009=Original password is incorrect
+10010=Account does not exist
+10011=Incorrect selection of superior department
+10012=Superior menu cannot be itself
+10013=Data permission interface can only be a Map type parameter
+10014=Please delete subordinate departments first
+10015=Please delete users under the department first
+10019=Please upload a file
+10020=Token cannot be empty
+10021=Token has expired, please log in again
+10022=Account has been locked
+10024=File upload failed {0}
+10027=Redis service exception
+10028=Scheduled task failed
+10029=Cannot contain illegal characters
+
+user.register.fail=Registration failed
+user.register.success=Registration successful
+user.register.code.err=Verification code error
+user.register.activecode.notexisit=Referral code does not exist
+user.register.email.format=Incorrect email format
+user.register.email.exisit=Email already exists
+user.register.phone.exist=Phone number already exists
+phone_code_empty=Phone number cannot be empty!
+user.code.send=Verification code sent successfully
+app.verification.email.code=Verification code has been sent to your email, please check
+common.send.success=Sent successfully
+sms.template.not.exist=SMS template does not exist
+appUser.login.code.err=Verification code error
+appUser.loginName.or.password.err=Incorrect account or password
+user_is_black=Your account has been blacklisted and cannot log in.
+appUser.login.success=Login successful
+user.not.login.err=Not logged in
+user.not.exist=User does not exist
+code.try.times.limit=Too many retry attempts
+user.sendcode.frequency.limit=Verification code request frequency too high, please try again after 60 seconds
+user.email.send.fail=Email sending failed
+system.busy.try.again.later=System busy, please try again later
+user.register.phone.exisit=Phone number already exists
+appUser.loginName.or.password.err.limit.chance=Incorrect account or password, you have {0} attempts left
+pwd.fail.times.excess.hour.lock=Account locked, will unlock after {0} minutes
+pwd.fail.times.excess.day.lock=Account locked, will unlock after {0} hours
+pwd.fail.times.excess.second.lock=Account locked, will unlock after {0} seconds
+user.register.email.must.lowerCase=Please use lowercase email and check for blank lines
+user.register.email.isTemp=Temporary email detected, please use a common trusted email
+complete.mobile.bind=Mobile number binding completed
+your.account.available.balance.insufficient=Your fund account should have at least {0} USDT available balance
+
+complete.email.bind=Complete email binding
+complete.identity.verification=Complete identity verification
+c2c.merchant.apply.not.config=C2C certified merchant deposit not configured
+merchant.param.direction.invalid=Invalid parameter value for direction
+merchant.ad.minAmount.bigger.zero=Minimum limit must be greater than 0
+merchant.minAmount.smaller.maxAmount=Minimum limit must be less than maximum limit
+merchant.num.bigger.zero=Quantity must be greater than 0
+merchant.price.bigger.zero=Price must be greater than 0
+merchant.maxAmount.smaller.price.num=Maximum limit must be less than the product of price and quantity
+c2cAd.price.must.bigger.set=Price must be greater than {}
+c2cAd.price.must.small.set=Price must be less than {}
+c2cAd.minAmount.must.bigger.set=Minimum limit must be greater than {}
+c2cAd.maxAmount.must.small.set=Maximum limit must be less than {}
+merchant.complete.merchant.apply=Please complete certified merchant application
+merchant.under.review=Certified merchant under review
+merchant.under.lock=Certified merchant locked
+merchant.approval.reject=Certified merchant approval rejected
+merchant.buyCount.greater.sellCount=Platform available assets must be greater than sell quantity
+c2c.order.save.fail=Failed to save advertisement
+seller.asset.freeze.fail=Failed to freeze seller assets
+c2c.ad.id.invalid=Invalid advertisement ID
+c2c.ad.cannot.cancel=You do not have permission to cancel, you are not the advertiser
+c2c.ad.exist.order.cancel=Current advertisement has ongoing orders and cannot be cancelled
+c2c.ad.cancel.fail=Failed to cancel advertisement
+c2c.user.occupied.asset.fail=Failed to unfreeze user assets
+c2c.ad.merchant.id.blank=Merchant ID cannot be empty
+c2c.userReceipt.add.repeat=Added successfully, please do not submit repeatedly
+
+c2c.ad.current.payway.empty=No payment method set for the current fiat currency  
+c2c.order.create.tran.fail=You have an ongoing transaction, please handle it first. After completion, you can continue trading.  
+user.authentication.not.certified=Please complete real-name authentication first  
+c2c.order.availableAmount.insufficient=Your available assets must be greater than the selling quantity  
+c2c.order.param.adid=Invalid advertisement ID  
+c2c.order.param.adid.invalid=Advertisement is no longer available  
+c2c.order.direction.invalid=Invalid value for parameter direction  
+c2c.order.buyer.seller.must.different=Buyer and seller cannot be the same user  
+c2c.order.param.tranAmt.min=Transaction amount must be greater than the minimum limit  
+c2c.order.param.tranAmt.max=Transaction amount must be less than the maximum limit  
+c2c.order.update.asset.fail=Failed to update seller?s assets  
+c2c.order.not.exist=Invalid order number  
+c2c.order.status.end.not.cancel=Order has ended and cannot be canceled  
+c2c.order.complain.not.cancel=Order under complaint cannot be canceled  
+c2c.order.sell.payed.not.cancel=Sell order has been paid and cannot be canceled  
+operation.fail.please.refresh=Operation failed, please refresh and try again  
+c2c.seller.uid.not.empty=Seller ID cannot be empty  
+c2c.order.log.fail=Failed to insert order log  
+c2c.order.update.fail=Failed to update order  
+c2c.order.pay.not.buyer=You are not the buyer  
+c2c.order.is.end=Order has ended  
+c2c.order.uploadPayment.fail=Failed to upload payment proof  
+c2c.order.pay.cert.id.invalid=Invalid proof ID  
+c2c.order.no.permission.view=You do not have permission to view  
+c2c.order.status.complain.fail=Current order status ({0}) cannot initiate complaint  
+c2c.complain.submit.fail=Failed to initiate complaint, you are not the buyer or seller  
+c2c.order.not.buyer.seller=You are not a transaction user and cannot initiate a complaint  
+c2c.order.pay.update.fail=Failed to update order  
+c2c.order.complain.submit.fail=Failed to submit complaint  
+c2c.order.complain.not.exist=Invalid complaint ID  
+c2c.complain.voucher.submit.fail=Submission failed, you are not the complainant or respondent  
+c2c.order.complain.remark.notEmpty=Complaint reason cannot be empty  
+c2c.order.complain.remark.maxval=Description up to 250 characters  
+c2c.order.complain.voucher.id.invalid=Invalid complaint proof ID
+
+c2c.order.complain.voucher.is.end=The complaint has ended
+c2c.order.complain.voucher.save.fail=Failed to save complaint voucher
+c2c.order.complain.voucher.update.fail=Failed to update complaint voucher
+c2c.order.complainId.orderId.invalid=Invalid complaint ID or order ID
+password.length.lt8=Password length cannot be less than 8 characters
+password.length.gt32=Password length cannot exceed 32 characters
+password.must.include.digit.alpha.sc=Password must include digits, uppercase and lowercase letters, and special characters
+c2c.ad.legalCoin.notset=The current fiat currency is not set
+c2c.order.availableAmount.buzu=Your available assets are insufficient
+c2c.order.not.seller=You are not the seller
+c2c.userReceipt.id.invalid=Invalid ID
+c2c.order.complainId.orderId.all.empty=Complaint ID and order ID cannot both be empty

+ 134 - 0
qnfhq-api/src/main/resources/i18n/messages_es.properties

@@ -0,0 +1,134 @@
+500=Excepci\u00f3n interna del servidor  
+401=No autorizado  
+10001={0} no puede estar vac\u00edo  
+10002=El registro ya existe en la base de datos  
+10003=Error al obtener par\u00e1metros  
+10004=Cuenta o contrase\u00f1a incorrecta  
+10005=La cuenta ha sido desactivada  
+10006=El identificador \u00fanico no puede estar vac\u00edo  
+10007=C\u00f3digo de verificaci\u00f3n incorrecto  
+10008=Primero elimine el submen\u00fa o bot\u00f3n  
+10009=Contrase\u00f1a original incorrecta  
+10010=La cuenta no existe  
+10011=Selecci\u00f3n incorrecta del departamento superior  
+10012=El men\u00fa superior no puede ser uno mismo  
+10013=La interfaz de permisos de datos solo puede ser un par\u00e1metro de tipo Map  
+10014=Por favor, elimine primero los departamentos inferiores  
+10015=Por favor, elimine primero los usuarios del departamento  
+10019=Por favor, suba un archivo  
+10020=El token no puede estar vac\u00edo  
+10021=Token inv\u00e1lido, por favor inicie sesi\u00f3n de nuevo  
+10022=La cuenta ha sido bloqueada  
+10024=Error al subir archivo {0}  
+10027=Excepci\u00f3n en el servicio Redis  
+10028=Error en la tarea programada  
+10029=No puede contener caracteres ilegales  
+
+user.register.fail=Registro fallido  
+user.register.success=Registro exitoso  
+user.register.code.err=C\u00f3digo de verificaci\u00f3n incorrecto  
+user.register.activecode.notexisit=El c\u00f3digo de recomendaci\u00f3n no existe  
+user.register.email.format=Formato de correo electr\u00f3nico incorrecto  
+user.register.email.exisit=El correo electr\u00f3nico ya existe  
+user.register.phone.exist=El n\u00famero de tel\u00e9fono ya existe  
+phone_code_empty=\u00a1El n\u00famero de tel\u00e9fono no puede estar vac\u00edo!  
+user.code.send=C\u00f3digo de verificaci\u00f3n enviado con \u00e9xito  
+app.verification.email.code=El c\u00f3digo de verificaci\u00f3n ha sido enviado a su correo electr\u00f3nico, por favor revise  
+common.send.success=Enviado con \u00e9xito  
+sms.template.not.exist=La plantilla de SMS no existe  
+appUser.login.code.err=C\u00f3digo de verificaci\u00f3n incorrecto  
+appUser.loginName.or.password.err=Cuenta o contrase\u00f1a incorrecta  
+user_is_black=Su cuenta ha sido incluida en la lista negra, no puede iniciar sesi\u00f3n.  
+appUser.login.success=Inicio de sesi\u00f3n exitoso  
+user.not.login.err=No ha iniciado sesi\u00f3n  
+user.not.exist=El usuario no existe  
+code.try.times.limit=Demasiados intentos fallidos  
+user.sendcode.frequency.limit=Demasiada frecuencia en la solicitud de c\u00f3digo, por favor intente de nuevo en 60 segundos  
+user.email.send.fail=Error al enviar correo electr\u00f3nico  
+system.busy.try.again.later=El sistema est\u00e1 ocupado, por favor intente m\u00e1s tarde  
+user.register.phone.exisit=El n\u00famero de tel\u00e9fono ya existe  
+appUser.loginName.or.password.err.limit.chance=Cuenta o contrase\u00f1a incorrecta, le quedan {0} intentos  
+pwd.fail.times.excess.hour.lock=Cuenta bloqueada, se desbloquear\u00e1 en {0} minutos  
+pwd.fail.times.excess.day.lock=Cuenta bloqueada, se desbloquear\u00e1 en {0} horas  
+pwd.fail.times.excess.second.lock=Cuenta bloqueada, se desbloquear\u00e1 en {0} segundos  
+user.register.email.must.lowerCase=Por favor use correo electr\u00f3nico en min\u00fasculas y revise l\u00edneas en blanco  
+user.register.email.isTemp=Se detect\u00f3 un correo temporal, por favor use un correo com\u00fan y confiable  
+complete.mobile.bind=Vinculaci\u00f3n de n\u00famero de tel\u00e9fono completada  
+your.account.available.balance.insufficient=Su cuenta de fondos debe tener al menos {0} USDT disponibles
+
+complete.email.bind=Completar vinculaci\u00f3n de correo electr\u00f3nico
+complete.identity.verification=Completar verificaci\u00f3n de identidad
+c2c.merchant.apply.not.config=Dep\u00f3sito de garant\u00eda para comerciantes C2C no configurado
+merchant.param.direction.invalid=Valor del par\u00e1metro direction no es correcto
+merchant.ad.minAmount.bigger.zero=El monto m\u00ednimo debe ser mayor que 0
+merchant.minAmount.smaller.maxAmount=El monto m\u00ednimo debe ser menor que el monto m\u00e1ximo
+merchant.num.bigger.zero=La cantidad debe ser mayor que 0
+merchant.price.bigger.zero=El precio debe ser mayor que 0
+merchant.maxAmount.smaller.price.num=El monto m\u00e1ximo debe ser menor que el producto del precio y la cantidad
+c2cAd.price.must.bigger.set=El precio debe ser mayor que {}
+c2cAd.price.must.small.set=El precio debe ser menor que {}
+c2cAd.minAmount.must.bigger.set=El monto m\u00ednimo debe ser mayor que {}
+c2cAd.maxAmount.must.small.set=El monto m\u00e1ximo debe ser menor que {}
+merchant.complete.merchant.apply=Por favor complete la solicitud de comerciante verificado
+merchant.under.review=Comerciante verificado en revisi\u00f3n
+merchant.under.lock=Comerciante verificado bloqueado
+merchant.approval.reject=Aprobaci\u00f3n de comerciante verificado rechazada
+merchant.buyCount.greater.sellCount=Los activos disponibles en la plataforma deben ser mayores que la cantidad a vender
+c2c.order.save.fail=Error al guardar el anuncio
+seller.asset.freeze.fail=Error al congelar activos del vendedor
+c2c.ad.id.invalid=ID de anuncio inv\u00e1lido
+c2c.ad.cannot.cancel=No tiene permiso para cancelar, no es el anunciante
+c2c.ad.exist.order.cancel=El anuncio actual tiene \u00f3rdenes en curso, no se puede cancelar
+c2c.ad.cancel.fail=Error al cancelar el anuncio
+c2c.user.occupied.asset.fail=Error al descongelar activos del usuario
+c2c.ad.merchant.id.blank=El ID del comerciante no puede estar vac\u00edo
+c2c.userReceipt.add.repeat=Agregado con \u00e9xito, por favor no env\u00ede repetidamente
+
+c2c.ad.current.payway.empty=No se ha configurado el m\u00e9todo de pago para la moneda actual  
+c2c.order.create.tran.fail=Tiene una transacci\u00f3n en curso, por favor procese esa primero. Despu\u00e9s de completarla, podr\u00e1 continuar con nuevas transacciones.  
+user.authentication.not.certified=Por favor, realice la verificaci\u00f3n de identidad primero  
+c2c.order.availableAmount.insufficient=Su activo disponible debe ser mayor que la cantidad de venta  
+c2c.order.param.adid=El n\u00famero de anuncio no es v\u00e1lido  
+c2c.order.param.adid.invalid=El anuncio ya no est\u00e1 disponible  
+c2c.order.direction.invalid=El valor del par\u00e1metro direction no es correcto  
+c2c.order.buyer.seller.must.different=El comprador y el vendedor no pueden ser el mismo usuario  
+c2c.order.param.tranAmt.min=El monto de la transacci\u00f3n debe ser mayor que el l\u00edmite m\u00ednimo  
+c2c.order.param.tranAmt.max=El monto de la transacci\u00f3n debe ser menor que el l\u00edmite m\u00e1ximo  
+c2c.order.update.asset.fail=Error al actualizar los activos del vendedor  
+c2c.order.not.exist=El n\u00famero de orden no es v\u00e1lido  
+c2c.order.status.end.not.cancel=La orden ha finalizado y no puede ser cancelada  
+c2c.order.complain.not.cancel=La orden est\u00e1 en disputa y no puede ser cancelada  
+c2c.order.sell.payed.not.cancel=La orden de venta ha sido pagada y no puede ser cancelada  
+operation.fail.please.refresh=Operaci\u00f3n fallida, por favor actualice y vuelva a intentar  
+c2c.seller.uid.not.empty=El n\u00famero de vendedor no puede estar vac\u00edo  
+c2c.order.log.fail=Error al insertar el registro de la orden  
+c2c.order.update.fail=Error al actualizar la orden  
+c2c.order.pay.not.buyer=Usted no es el comprador  
+c2c.order.is.end=La orden ha finalizado  
+c2c.order.uploadPayment.fail=Error al subir el comprobante de pago  
+c2c.order.pay.cert.id.invalid=El n\u00famero del comprobante no es v\u00e1lido  
+c2c.order.no.permission.view=No tiene permiso para ver  
+c2c.order.status.complain.fail=El estado actual de la orden ({0}) no permite iniciar una disputa  
+c2c.complain.submit.fail=Error al iniciar la disputa, usted no es comprador ni vendedor  
+c2c.order.not.buyer.seller=Usted no es parte de la transacci\u00f3n, no puede iniciar una disputa  
+c2c.order.pay.update.fail=Error al actualizar la orden  
+c2c.order.complain.submit.fail=Error al enviar la disputa  
+c2c.order.complain.not.exist=El n\u00famero de disputa no es v\u00e1lido  
+c2c.complain.voucher.submit.fail=Error al enviar, usted no es el reclamante ni el reclamado  
+c2c.order.complain.remark.notEmpty=La raz\u00f3n de la disputa no puede estar vac\u00eda  
+c2c.order.complain.remark.maxval=La descripci\u00f3n puede tener un m\u00e1ximo de 250 caracteres  
+c2c.order.complain.voucher.id.invalid=El n\u00famero del comprobante de disputa no es v\u00e1lido
+
+c2c.order.complain.voucher.is.end=La apelaci\u00f3n ha terminado  
+c2c.order.complain.voucher.save.fail=Error al guardar el comprobante de apelaci\u00f3n  
+c2c.order.complain.voucher.update.fail=Error al modificar el comprobante de apelaci\u00f3n  
+c2c.order.complainId.orderId.invalid=El n\u00famero de apelaci\u00f3n o el n\u00famero de pedido no son v\u00e1lidos  
+password.length.lt8=La contrase\u00f1a no puede tener menos de 8 caracteres  
+password.length.gt32=La contrase\u00f1a no puede tener m\u00e1s de 32 caracteres  
+password.must.include.digit.alpha.sc=La contrase\u00f1a debe incluir n\u00fameros, letras may\u00fasculas y min\u00fasculas, y caracteres especiales  
+c2c.ad.legalCoin.notset=La moneda fiduciaria actual no est\u00e1 configurada  
+c2c.order.availableAmount.buzu=Sus activos disponibles son insuficientes  
+c2c.order.not.seller=Usted no es el vendedor  
+c2c.userReceipt.id.invalid=Identificaci\u00f3n no v\u00e1lida  
+c2c.order.complainId.orderId.all.empty=El n\u00famero de apelaci\u00f3n y el n\u00famero de pedido no pueden estar ambos vac\u00edos
+

+ 134 - 0
qnfhq-api/src/main/resources/i18n/messages_fr.properties

@@ -0,0 +1,134 @@
+500=Erreur interne du serveur
+401=Non autoris\u00e9
+10001={0} ne peut pas \u00eatre vide
+10002=Cet enregistrement existe d\u00e9j\u00e0 dans la base de donn\u00e9es
+10003=\u00c9chec de l'obtention des param\u00e8tres
+10004=Identifiant ou mot de passe incorrect
+10005=Le compte a \u00e9t\u00e9 d\u00e9sactiv\u00e9
+10006=L'identifiant unique ne peut pas \u00eatre vide
+10007=Code de v\u00e9rification incorrect
+10008=Supprimez d'abord les sous-menus ou les boutons
+10009=Mot de passe original incorrect
+10010=Le compte n'existe pas
+10011=Erreur de s\u00e9lection du d\u00e9partement sup\u00e9rieur
+10012=Le menu sup\u00e9rieur ne peut pas \u00eatre lui-m\u00eame
+10013=L'interface des droits de donn\u00e9es doit \u00eatre un param\u00e8tre de type Map
+10014=Veuillez d'abord supprimer les d\u00e9partements inf\u00e9rieurs
+10015=Veuillez d'abord supprimer les utilisateurs du d\u00e9partement
+10019=Veuillez t\u00e9l\u00e9charger un fichier
+10020=Le token ne peut pas \u00eatre vide
+10021=Le token a expir\u00e9, veuillez vous reconnecter
+10022=Le compte a \u00e9t\u00e9 verrouill\u00e9
+10024=\u00c9chec du t\u00e9l\u00e9chargement du fichier {0}
+10027=Exception du service Redis
+10028=\u00c9chec de la t\u00e2che planifi\u00e9e
+10029=Ne peut pas contenir de caract\u00e8res ill\u00e9gaux
+
+user.register.fail=\u00c9chec de l'inscription
+user.register.success=Inscription r\u00e9ussie
+user.register.code.err=Code de v\u00e9rification incorrect
+user.register.activecode.notexisit=Le code de recommandation n'existe pas
+user.register.email.format=Format d'email incorrect
+user.register.email.exisit=L'email existe d\u00e9j\u00e0
+user.register.phone.exist=Le num\u00e9ro de t\u00e9l\u00e9phone existe d\u00e9j\u00e0
+phone_code_empty=Le num\u00e9ro de t\u00e9l\u00e9phone ne peut pas \u00eatre vide !
+user.code.send=Code de v\u00e9rification envoy\u00e9 avec succ\u00e8s
+app.verification.email.code=Le code de v\u00e9rification a \u00e9t\u00e9 envoy\u00e9 \u00e0 votre email, veuillez v\u00e9rifier
+common.send.success=Envoi r\u00e9ussi
+sms.template.not.exist=Le mod\u00e8le de SMS n'existe pas
+appUser.login.code.err=Code de v\u00e9rification incorrect
+appUser.loginName.or.password.err=Identifiant ou mot de passe incorrect
+user_is_black=Votre compte a \u00e9t\u00e9 mis sur liste noire, connexion impossible.
+appUser.login.success=Connexion r\u00e9ussie
+user.not.login.err=Non connect\u00e9
+user.not.exist=L'utilisateur n'existe pas
+code.try.times.limit=Nombre de tentatives d\u00e9pass\u00e9
+user.sendcode.frequency.limit=Fr\u00e9quence de demande de code trop \u00e9lev\u00e9e, veuillez r\u00e9essayer dans 60 secondes
+user.email.send.fail=\u00c9chec de l'envoi de l'email
+system.busy.try.again.later=Syst\u00e8me occup\u00e9, veuillez r\u00e9essayer plus tard
+user.register.phone.exisit=Le num\u00e9ro de t\u00e9l\u00e9phone existe d\u00e9j\u00e0
+appUser.loginName.or.password.err.limit.chance=Identifiant ou mot de passe incorrect, il vous reste {0} tentatives
+pwd.fail.times.excess.hour.lock=Compte verrouill\u00e9, d\u00e9verrouillage dans {0} minutes
+pwd.fail.times.excess.day.lock=Compte verrouill\u00e9, d\u00e9verrouillage dans {0} heures
+pwd.fail.times.excess.second.lock=Compte verrouill\u00e9, d\u00e9verrouillage dans {0} secondes
+user.register.email.must.lowerCase=Veuillez utiliser un email en minuscules et v\u00e9rifier les lignes vides
+user.register.email.isTemp=Adresse email temporaire d\u00e9tect\u00e9e, veuillez utiliser une adresse email courante et fiable
+complete.mobile.bind=Validation du num\u00e9ro de t\u00e9l\u00e9phone termin\u00e9e
+your.account.available.balance.insufficient=Votre compte dispose d'un solde disponible d'au moins {0} USDT
+
+complete.email.bind=Compl\u00e9ter la liaison de l'email
+complete.identity.verification=Compl\u00e9ter la v\u00e9rification d'identit\u00e9
+c2c.merchant.apply.not.config=La caution du commer\u00e7ant certifi\u00e9 C2C n'est pas configur\u00e9e
+merchant.param.direction.invalid=La valeur du param\u00e8tre direction est incorrecte
+merchant.ad.minAmount.bigger.zero=Le montant minimum doit \u00eatre sup\u00e9rieur \u00e0 0
+merchant.minAmount.smaller.maxAmount=Le montant minimum doit \u00eatre inf\u00e9rieur au montant maximum
+merchant.num.bigger.zero=La quantit\u00e9 doit \u00eatre sup\u00e9rieure \u00e0 0
+merchant.price.bigger.zero=Le prix doit \u00eatre sup\u00e9rieur \u00e0 0
+merchant.maxAmount.smaller.price.num=Le montant maximum doit \u00eatre inf\u00e9rieur au produit du prix et de la quantit\u00e9
+c2cAd.price.must.bigger.set=Le prix doit \u00eatre sup\u00e9rieur \u00e0 {}
+c2cAd.price.must.small.set=Le prix doit \u00eatre inf\u00e9rieur \u00e0 {}
+c2cAd.minAmount.must.bigger.set=Le montant minimum doit \u00eatre sup\u00e9rieur \u00e0 {}
+c2cAd.maxAmount.must.small.set=Le montant maximum doit \u00eatre inf\u00e9rieur \u00e0 {}
+merchant.complete.merchant.apply=Veuillez compl\u00e9ter la demande de commer\u00e7ant certifi\u00e9
+merchant.under.review=Approbation du commer\u00e7ant certifi\u00e9 en cours
+merchant.under.lock=Commer\u00e7ant certifi\u00e9 verrouill\u00e9
+merchant.approval.reject=Approbation du commer\u00e7ant certifi\u00e9 refus\u00e9e
+merchant.buyCount.greater.sellCount=Les actifs disponibles sur la plateforme doivent \u00eatre sup\u00e9rieurs \u00e0 la quantit\u00e9 vendue
+c2c.order.save.fail=\u00c9chec de l'enregistrement de l'annonce
+seller.asset.freeze.fail=\u00c9chec du gel des actifs du vendeur
+c2c.ad.id.invalid=Num\u00e9ro d'annonce invalide
+c2c.ad.cannot.cancel=Vous n'avez pas le droit d'annuler, vous n'\u00eates pas l'annonceur
+c2c.ad.exist.order.cancel=Il existe des commandes en cours pour cette annonce, impossible d'annuler
+c2c.ad.cancel.fail=\u00c9chec de l'annulation de l'annonce
+c2c.user.occupied.asset.fail=\u00c9chec du d\u00e9gel des actifs de l'utilisateur
+c2c.ad.merchant.id.blank=Le num\u00e9ro du commer\u00e7ant ne peut pas \u00eatre vide
+c2c.userReceipt.add.repeat=Ajout r\u00e9ussi, veuillez ne pas soumettre plusieurs fois
+
+c2c.ad.current.payway.empty=La m\u00e9thode de paiement en monnaie fiduciaire actuelle n'est pas d\u00e9finie  
+c2c.order.create.tran.fail=Vous avez une transaction en cours, veuillez la traiter d'abord. Une fois termin\u00e9e, vous pouvez continuer la transaction.  
+user.authentication.not.certified=Veuillez d'abord effectuer la v\u00e9rification d'identit\u00e9 r\u00e9elle  
+c2c.order.availableAmount.insufficient=Votre actif disponible doit \u00eatre sup\u00e9rieur \u00e0 la quantit\u00e9 \u00e0 vendre  
+c2c.order.param.adid=Num\u00e9ro d'annonce invalide  
+c2c.order.param.adid.invalid=L'annonce n'est plus disponible  
+c2c.order.direction.invalid=La valeur du param\u00e8tre direction est incorrecte  
+c2c.order.buyer.seller.must.different=L'acheteur et le vendeur ne peuvent pas \u00eatre le m\u00eame utilisateur  
+c2c.order.param.tranAmt.min=Le montant de la transaction doit \u00eatre sup\u00e9rieur au minimum autoris\u00e9  
+c2c.order.param.tranAmt.max=Le montant de la transaction doit \u00eatre inf\u00e9rieur au maximum autoris\u00e9  
+c2c.order.update.asset.fail=\u00c9chec de la mise \u00e0 jour des actifs du vendeur  
+c2c.order.not.exist=Num\u00e9ro de commande invalide  
+c2c.order.status.end.not.cancel=La commande est termin\u00e9e et ne peut pas \u00eatre annul\u00e9e  
+c2c.order.complain.not.cancel=La commande est en cours de r\u00e9clamation et ne peut pas \u00eatre annul\u00e9e  
+c2c.order.sell.payed.not.cancel=La commande de vente a \u00e9t\u00e9 pay\u00e9e et ne peut pas \u00eatre annul\u00e9e  
+operation.fail.please.refresh=\u00c9chec de l'op\u00e9ration, veuillez rafra\u00eechir et r\u00e9essayer  
+c2c.seller.uid.not.empty=Le num\u00e9ro du vendeur ne peut pas \u00eatre vide  
+c2c.order.log.fail=\u00c9chec de l'insertion du journal de commande  
+c2c.order.update.fail=\u00c9chec de la mise \u00e0 jour de la commande  
+c2c.order.pay.not.buyer=Vous n'\u00eates pas l'acheteur  
+c2c.order.is.end=La commande est termin\u00e9e  
+c2c.order.uploadPayment.fail=\u00c9chec du t\u00e9l\u00e9chargement du justificatif de paiement  
+c2c.order.pay.cert.id.invalid=Num\u00e9ro de justificatif invalide  
+c2c.order.no.permission.view=Vous n'avez pas la permission de voir  
+c2c.order.status.complain.fail=L'\u00e9tat actuel de la commande ({0}) ne permet pas d'initier une r\u00e9clamation  
+c2c.complain.submit.fail=\u00c9chec de l'initiation de la r\u00e9clamation, vous n'\u00eates ni acheteur ni vendeur  
+c2c.order.not.buyer.seller=Vous n'\u00eates pas un utilisateur de la transaction, vous ne pouvez pas initier une r\u00e9clamation  
+c2c.order.pay.update.fail=\u00c9chec de la mise \u00e0 jour de la commande  
+c2c.order.complain.submit.fail=\u00c9chec de la soumission de la r\u00e9clamation  
+c2c.order.complain.not.exist=Num\u00e9ro de r\u00e9clamation invalide  
+c2c.complain.voucher.submit.fail=\u00c9chec de la soumission, vous n'\u00eates ni le plaignant ni le d\u00e9fendeur  
+c2c.order.complain.remark.notEmpty=La raison de la r\u00e9clamation ne peut pas \u00eatre vide  
+c2c.order.complain.remark.maxval=La description ne peut pas d\u00e9passer 250 caract\u00e8res  
+c2c.order.complain.voucher.id.invalid=Num\u00e9ro de justificatif de r\u00e9clamation invalide
+
+c2c.order.complain.voucher.is.end=La r\u00e9clamation est termin\u00e9e  
+c2c.order.complain.voucher.save.fail=\u00c9chec de la sauvegarde du justificatif de r\u00e9clamation  
+c2c.order.complain.voucher.update.fail=\u00c9chec de la modification du justificatif de r\u00e9clamation  
+c2c.order.complainId.orderId.invalid=Num\u00e9ro de r\u00e9clamation ou num\u00e9ro de commande invalide  
+password.length.lt8=La longueur du mot de passe ne peut pas \u00eatre inf\u00e9rieure \u00e0 8 caract\u00e8res  
+password.length.gt32=La longueur du mot de passe ne peut pas d\u00e9passer 32 caract\u00e8res  
+password.must.include.digit.alpha.sc=Le mot de passe doit inclure des chiffres, des lettres majuscules et minuscules, et des caract\u00e8res sp\u00e9ciaux  
+c2c.ad.legalCoin.notset=La monnaie l\u00e9gale actuelle n'est pas d\u00e9finie  
+c2c.order.availableAmount.buzu=Vos actifs disponibles sont insuffisants  
+c2c.order.not.seller=Vous n'\u00eates pas le vendeur  
+c2c.userReceipt.id.invalid=Num\u00e9ro invalide  
+c2c.order.complainId.orderId.all.empty=Le num\u00e9ro de r\u00e9clamation et le num\u00e9ro de commande ne peuvent pas \u00eatre tous deux vides
+

+ 134 - 0
qnfhq-api/src/main/resources/i18n/messages_ja.properties

@@ -0,0 +1,134 @@
+500=\u30b5\u30fc\u30d0\u30fc\u5185\u90e8\u30a8\u30e9\u30fc
+401=\u8a8d\u8a3c\u3055\u308c\u3066\u3044\u307e\u305b\u3093
+10001={0}\u306f\u7a7a\u306b\u3067\u304d\u307e\u305b\u3093
+10002=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u65e2\u306b\u3053\u306e\u30ec\u30b3\u30fc\u30c9\u304c\u5b58\u5728\u3057\u307e\u3059
+10003=\u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u53d6\u5f97\u306b\u5931\u6557\u3057\u307e\u3057\u305f
+10004=\u30a2\u30ab\u30a6\u30f3\u30c8\u307e\u305f\u306f\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u9593\u9055\u3063\u3066\u3044\u307e\u3059
+10005=\u30a2\u30ab\u30a6\u30f3\u30c8\u306f\u7121\u52b9\u5316\u3055\u308c\u3066\u3044\u307e\u3059
+10006=\u4e00\u610f\u306e\u8b58\u5225\u5b50\u306f\u7a7a\u306b\u3067\u304d\u307e\u305b\u3093
+10007=\u8a8d\u8a3c\u30b3\u30fc\u30c9\u304c\u6b63\u3057\u304f\u3042\u308a\u307e\u305b\u3093
+10008=\u5148\u306b\u5b50\u30e1\u30cb\u30e5\u30fc\u307e\u305f\u306f\u30dc\u30bf\u30f3\u3092\u524a\u9664\u3057\u3066\u304f\u3060\u3055\u3044
+10009=\u5143\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u6b63\u3057\u304f\u3042\u308a\u307e\u305b\u3093
+10010=\u30a2\u30ab\u30a6\u30f3\u30c8\u304c\u5b58\u5728\u3057\u307e\u305b\u3093
+10011=\u4e0a\u4f4d\u90e8\u7f72\u306e\u9078\u629e\u304c\u9593\u9055\u3063\u3066\u3044\u307e\u3059
+10012=\u4e0a\u4f4d\u30e1\u30cb\u30e5\u30fc\u306f\u81ea\u8eab\u306b\u3067\u304d\u307e\u305b\u3093
+10013=\u30c7\u30fc\u30bf\u6a29\u9650\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u306fMap\u578b\u306e\u30d1\u30e9\u30e1\u30fc\u30bf\u3067\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093
+10014=\u5148\u306b\u4e0b\u4f4d\u90e8\u7f72\u3092\u524a\u9664\u3057\u3066\u304f\u3060\u3055\u3044
+10015=\u5148\u306b\u90e8\u7f72\u306e\u30e6\u30fc\u30b6\u30fc\u3092\u524a\u9664\u3057\u3066\u304f\u3060\u3055\u3044
+10019=\u30d5\u30a1\u30a4\u30eb\u3092\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3057\u3066\u304f\u3060\u3055\u3044
+10020=\u30c8\u30fc\u30af\u30f3\u306f\u7a7a\u306b\u3067\u304d\u307e\u305b\u3093
+10021=\u30c8\u30fc\u30af\u30f3\u304c\u7121\u52b9\u3067\u3059\u3002\u518d\u30ed\u30b0\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044
+10022=\u30a2\u30ab\u30a6\u30f3\u30c8\u306f\u30ed\u30c3\u30af\u3055\u308c\u3066\u3044\u307e\u3059
+10024=\u30d5\u30a1\u30a4\u30eb\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u306b\u5931\u6557\u3057\u307e\u3057\u305f{0}
+10027=Redis\u30b5\u30fc\u30d3\u30b9\u30a8\u30e9\u30fc
+10028=\u5b9a\u6642\u30bf\u30b9\u30af\u5931\u6557
+10029=\u4e0d\u6b63\u306a\u6587\u5b57\u3092\u542b\u3081\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093
+
+user.register.fail=\u767b\u9332\u306b\u5931\u6557\u3057\u307e\u3057\u305f
+user.register.success=\u767b\u9332\u6210\u529f
+user.register.code.err=\u8a8d\u8a3c\u30b3\u30fc\u30c9\u304c\u9593\u9055\u3063\u3066\u3044\u307e\u3059
+user.register.activecode.notexisit=\u7d39\u4ecb\u30b3\u30fc\u30c9\u304c\u5b58\u5728\u3057\u307e\u305b\u3093
+user.register.email.format=\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u5f62\u5f0f\u304c\u6b63\u3057\u304f\u3042\u308a\u307e\u305b\u3093
+user.register.email.exisit=\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306f\u65e2\u306b\u5b58\u5728\u3057\u307e\u3059
+user.register.phone.exist=\u96fb\u8a71\u756a\u53f7\u306f\u65e2\u306b\u5b58\u5728\u3057\u307e\u3059
+phone_code_empty=\u96fb\u8a71\u756a\u53f7\u306f\u7a7a\u306b\u3067\u304d\u307e\u305b\u3093\uff01
+user.code.send=\u8a8d\u8a3c\u30b3\u30fc\u30c9\u306e\u9001\u4fe1\u306b\u6210\u529f\u3057\u307e\u3057\u305f
+app.verification.email.code=\u8a8d\u8a3c\u30b3\u30fc\u30c9\u3092\u30e1\u30fc\u30eb\u306b\u9001\u4fe1\u3057\u307e\u3057\u305f\u3002\u3054\u78ba\u8a8d\u304f\u3060\u3055\u3044
+common.send.success=\u9001\u4fe1\u6210\u529f
+sms.template.not.exist=SMS\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u304c\u5b58\u5728\u3057\u307e\u305b\u3093
+appUser.login.code.err=\u8a8d\u8a3c\u30b3\u30fc\u30c9\u304c\u9593\u9055\u3063\u3066\u3044\u307e\u3059
+appUser.loginName.or.password.err=\u30a2\u30ab\u30a6\u30f3\u30c8\u307e\u305f\u306f\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u9593\u9055\u3063\u3066\u3044\u307e\u3059
+user_is_black=\u3042\u306a\u305f\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u306f\u30d6\u30e9\u30c3\u30af\u30ea\u30b9\u30c8\u306b\u767b\u9332\u3055\u308c\u3066\u304a\u308a\u3001\u30ed\u30b0\u30a4\u30f3\u3067\u304d\u307e\u305b\u3093\u3002
+appUser.login.success=\u30ed\u30b0\u30a4\u30f3\u6210\u529f
+user.not.login.err=\u672a\u30ed\u30b0\u30a4\u30f3
+user.not.exist=\u30e6\u30fc\u30b6\u30fc\u304c\u5b58\u5728\u3057\u307e\u305b\u3093
+code.try.times.limit=\u518d\u8a66\u884c\u56de\u6570\u304c\u591a\u3059\u304e\u307e\u3059
+user.sendcode.frequency.limit=\u8a8d\u8a3c\u30b3\u30fc\u30c9\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u304c\u591a\u3059\u304e\u307e\u3059\u300260\u79d2\u5f8c\u306b\u518d\u8a66\u884c\u3057\u3066\u304f\u3060\u3055\u3044
+user.email.send.fail=\u30e1\u30fc\u30eb\u9001\u4fe1\u306b\u5931\u6557\u3057\u307e\u3057\u305f
+system.busy.try.again.later=\u30b7\u30b9\u30c6\u30e0\u304c\u6df7\u96d1\u3057\u3066\u3044\u307e\u3059\u3002\u5f8c\u3067\u3082\u3046\u4e00\u5ea6\u304a\u8a66\u3057\u304f\u3060\u3055\u3044
+user.register.phone.exisit=\u96fb\u8a71\u756a\u53f7\u306f\u65e2\u306b\u5b58\u5728\u3057\u307e\u3059
+appUser.loginName.or.password.err.limit.chance=\u30a2\u30ab\u30a6\u30f3\u30c8\u307e\u305f\u306f\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u9593\u9055\u3063\u3066\u3044\u307e\u3059\u3002\u3042\u3068{0}\u56de\u8a66\u305b\u307e\u3059
+pwd.fail.times.excess.hour.lock=\u30a2\u30ab\u30a6\u30f3\u30c8\u306f\u30ed\u30c3\u30af\u3055\u308c\u3066\u3044\u307e\u3059\u3002{0}\u5206\u5f8c\u306b\u89e3\u9664\u3055\u308c\u307e\u3059
+pwd.fail.times.excess.day.lock=\u30a2\u30ab\u30a6\u30f3\u30c8\u306f\u30ed\u30c3\u30af\u3055\u308c\u3066\u3044\u307e\u3059\u3002{0}\u6642\u9593\u5f8c\u306b\u89e3\u9664\u3055\u308c\u307e\u3059
+pwd.fail.times.excess.second.lock=\u30a2\u30ab\u30a6\u30f3\u30c8\u306f\u30ed\u30c3\u30af\u3055\u308c\u3066\u3044\u307e\u3059\u3002{0}\u79d2\u5f8c\u306b\u89e3\u9664\u3055\u308c\u307e\u3059
+user.register.email.must.lowerCase=\u5c0f\u6587\u5b57\u306e\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3092\u4f7f\u7528\u3057\u3001\u7a7a\u767d\u884c\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044
+user.register.email.isTemp=\u4e00\u6642\u7684\u306a\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u304c\u691c\u51fa\u3055\u308c\u307e\u3057\u305f\u3002\u4e00\u822c\u7684\u3067\u4fe1\u983c\u3067\u304d\u308b\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3092\u4f7f\u7528\u3057\u3066\u304f\u3060\u3055\u3044
+complete.mobile.bind=\u96fb\u8a71\u756a\u53f7\u306e\u7d10\u4ed8\u3051\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f
+your.account.available.balance.insufficient=\u3042\u306a\u305f\u306e\u8cc7\u91d1\u30a2\u30ab\u30a6\u30f3\u30c8\u306b\u306f\u6700\u4f4e\u3067\u3082{0}USDT\u306e\u5229\u7528\u53ef\u80fd\u6b8b\u9ad8\u304c\u5fc5\u8981\u3067\u3059
+
+complete.email.bind=\u30e1\u30fc\u30eb\u30d0\u30a4\u30f3\u30c9\u5b8c\u4e86
+complete.identity.verification=\u672c\u4eba\u78ba\u8a8d\u5b8c\u4e86
+c2c.merchant.apply.not.config=C2C\u8a8d\u8a3c\u5546\u5bb6\u4fdd\u8a3c\u91d1\u304c\u672a\u8a2d\u5b9a\u3067\u3059
+merchant.param.direction.invalid=\u30d1\u30e9\u30e1\u30fc\u30bfdirection\u306e\u5024\u304c\u6b63\u3057\u304f\u3042\u308a\u307e\u305b\u3093
+merchant.ad.minAmount.bigger.zero=\u6700\u5c0f\u9650\u5ea6\u984d\u306f0\u3088\u308a\u5927\u304d\u304f\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093
+merchant.minAmount.smaller.maxAmount=\u6700\u5c0f\u9650\u5ea6\u984d\u306f\u6700\u5927\u9650\u5ea6\u984d\u3088\u308a\u5c0f\u3055\u304f\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093
+merchant.num.bigger.zero=\u6570\u91cf\u306f0\u3088\u308a\u5927\u304d\u304f\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093
+merchant.price.bigger.zero=\u4fa1\u683c\u306f0\u3088\u308a\u5927\u304d\u304f\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093
+merchant.maxAmount.smaller.price.num=\u6700\u5927\u9650\u5ea6\u984d\u306f\u4fa1\u683c\u3068\u6570\u91cf\u306e\u7a4d\u3088\u308a\u5c0f\u3055\u304f\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093
+c2cAd.price.must.bigger.set=\u4fa1\u683c\u306f{}\u3088\u308a\u5927\u304d\u304f\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093
+c2cAd.price.must.small.set=\u4fa1\u683c\u306f{}\u3088\u308a\u5c0f\u3055\u304f\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093
+c2cAd.minAmount.must.bigger.set=\u6700\u5c0f\u9650\u5ea6\u984d\u306f{}\u3088\u308a\u5927\u304d\u304f\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093
+c2cAd.maxAmount.must.small.set=\u6700\u5927\u9650\u5ea6\u984d\u306f{}\u3088\u308a\u5c0f\u3055\u304f\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093
+merchant.complete.merchant.apply=\u8a8d\u8a3c\u5546\u5bb6\u7533\u8acb\u3092\u5b8c\u4e86\u3057\u3066\u304f\u3060\u3055\u3044
+merchant.under.review=\u8a8d\u8a3c\u5546\u5bb6\u5be9\u67fb\u4e2d
+merchant.under.lock=\u8a8d\u8a3c\u5546\u5bb6\u30ed\u30c3\u30af\u4e2d
+merchant.approval.reject=\u8a8d\u8a3c\u5546\u5bb6\u5be9\u67fb\u4e0d\u5408\u683c
+merchant.buyCount.greater.sellCount=\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u5229\u7528\u53ef\u80fd\u8cc7\u7523\u306f\u58f2\u5374\u6570\u91cf\u3088\u308a\u591a\u304f\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093
+c2c.order.save.fail=\u5e83\u544a\u306e\u4fdd\u5b58\u306b\u5931\u6557\u3057\u307e\u3057\u305f
+seller.asset.freeze.fail=\u58f2\u308a\u624b\u8cc7\u7523\u306e\u51cd\u7d50\u306b\u5931\u6557\u3057\u307e\u3057\u305f
+c2c.ad.id.invalid=\u5e83\u544aID\u304c\u7121\u52b9\u3067\u3059
+c2c.ad.cannot.cancel=\u30ad\u30e3\u30f3\u30bb\u30eb\u6a29\u9650\u304c\u3042\u308a\u307e\u305b\u3093\u3002\u3042\u306a\u305f\u306f\u5e83\u544a\u4e3b\u3067\u306f\u3042\u308a\u307e\u305b\u3093
+c2c.ad.exist.order.cancel=\u73fe\u5728\u306e\u5e83\u544a\u306b\u306f\u9032\u884c\u4e2d\u306e\u6ce8\u6587\u304c\u3042\u308b\u305f\u3081\u3001\u30ad\u30e3\u30f3\u30bb\u30eb\u3067\u304d\u307e\u305b\u3093
+c2c.ad.cancel.fail=\u5e83\u544a\u306e\u30ad\u30e3\u30f3\u30bb\u30eb\u306b\u5931\u6557\u3057\u307e\u3057\u305f
+c2c.user.occupied.asset.fail=\u30e6\u30fc\u30b6\u30fc\u8cc7\u7523\u306e\u89e3\u51cd\u306b\u5931\u6557\u3057\u307e\u3057\u305f
+c2c.ad.merchant.id.blank=\u5546\u5bb6ID\u306f\u7a7a\u306b\u3067\u304d\u307e\u305b\u3093
+c2c.userReceipt.add.repeat=\u8ffd\u52a0\u6210\u529f\u3001\u91cd\u8907\u9001\u4fe1\u3057\u306a\u3044\u3067\u304f\u3060\u3055\u3044
+
+c2c.ad.current.payway.empty=\u73fe\u5728\u306e\u6cd5\u5b9a\u901a\u8ca8\u306e\u652f\u6255\u3044\u65b9\u6cd5\u304c\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u307e\u305b\u3093
+c2c.order.create.tran.fail=\u9032\u884c\u4e2d\u306e\u53d6\u5f15\u304c\u3042\u308a\u307e\u3059\u3002\u5148\u306b\u51e6\u7406\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u51e6\u7406\u5b8c\u4e86\u5f8c\u3001\u53d6\u5f15\u3092\u7d9a\u3051\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002
+user.authentication.not.certified=\u5148\u306b\u672c\u4eba\u78ba\u8a8d\u3092\u884c\u3063\u3066\u304f\u3060\u3055\u3044
+c2c.order.availableAmount.insufficient=\u5229\u7528\u53ef\u80fd\u306a\u8cc7\u7523\u306f\u58f2\u5374\u6570\u91cf\u3088\u308a\u591a\u304f\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093
+c2c.order.param.adid=\u5e83\u544a\u756a\u53f7\u304c\u7121\u52b9\u3067\u3059
+c2c.order.param.adid.invalid=\u5e83\u544a\u306f\u5229\u7528\u3067\u304d\u307e\u305b\u3093
+c2c.order.direction.invalid=\u30d1\u30e9\u30e1\u30fc\u30bfdirection\u306e\u5024\u304c\u6b63\u3057\u304f\u3042\u308a\u307e\u305b\u3093
+c2c.order.buyer.seller.must.different=\u8cb7\u3044\u624b\u3068\u58f2\u308a\u624b\u306f\u540c\u4e00\u30e6\u30fc\u30b6\u30fc\u3067\u3042\u3063\u3066\u306f\u306a\u308a\u307e\u305b\u3093
+c2c.order.param.tranAmt.min=\u53d6\u5f15\u91d1\u984d\u306f\u6700\u5c0f\u9650\u5ea6\u984d\u3088\u308a\u5927\u304d\u304f\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093
+c2c.order.param.tranAmt.max=\u53d6\u5f15\u91d1\u984d\u306f\u6700\u5927\u9650\u5ea6\u984d\u3088\u308a\u5c0f\u3055\u304f\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093
+c2c.order.update.asset.fail=\u58f2\u308a\u624b\u306e\u8cc7\u7523\u66f4\u65b0\u306b\u5931\u6557\u3057\u307e\u3057\u305f
+c2c.order.not.exist=\u6ce8\u6587\u756a\u53f7\u304c\u7121\u52b9\u3067\u3059
+c2c.order.status.end.not.cancel=\u6ce8\u6587\u306f\u7d42\u4e86\u3057\u3066\u304a\u308a\u3001\u30ad\u30e3\u30f3\u30bb\u30eb\u3067\u304d\u307e\u305b\u3093
+c2c.order.complain.not.cancel=\u6ce8\u6587\u306f\u7533\u7acb\u3066\u4e2d\u306e\u305f\u3081\u30ad\u30e3\u30f3\u30bb\u30eb\u3067\u304d\u307e\u305b\u3093
+c2c.order.sell.payed.not.cancel=\u58f2\u5374\u6ce8\u6587\u306f\u652f\u6255\u3044\u6e08\u307f\u306e\u305f\u3081\u30ad\u30e3\u30f3\u30bb\u30eb\u3067\u304d\u307e\u305b\u3093
+operation.fail.please.refresh=\u64cd\u4f5c\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002\u30ea\u30d5\u30ec\u30c3\u30b7\u30e5\u3057\u3066\u518d\u8a66\u884c\u3057\u3066\u304f\u3060\u3055\u3044
+c2c.seller.uid.not.empty=\u58f2\u308a\u624b\u756a\u53f7\u306f\u7a7a\u306b\u3067\u304d\u307e\u305b\u3093
+c2c.order.log.fail=\u6ce8\u6587\u30ed\u30b0\u306e\u633f\u5165\u306b\u5931\u6557\u3057\u307e\u3057\u305f
+c2c.order.update.fail=\u6ce8\u6587\u306e\u66f4\u65b0\u306b\u5931\u6557\u3057\u307e\u3057\u305f
+c2c.order.pay.not.buyer=\u3042\u306a\u305f\u306f\u8cb7\u3044\u624b\u3067\u306f\u3042\u308a\u307e\u305b\u3093
+c2c.order.is.end=\u6ce8\u6587\u306f\u7d42\u4e86\u3057\u3066\u3044\u307e\u3059
+c2c.order.uploadPayment.fail=\u652f\u6255\u3044\u8a3c\u660e\u66f8\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u306b\u5931\u6557\u3057\u307e\u3057\u305f
+c2c.order.pay.cert.id.invalid=\u8a3c\u660e\u66f8\u756a\u53f7\u304c\u7121\u52b9\u3067\u3059
+c2c.order.no.permission.view=\u95b2\u89a7\u6a29\u9650\u304c\u3042\u308a\u307e\u305b\u3093
+c2c.order.status.complain.fail=\u73fe\u5728\u306e\u6ce8\u6587\u72b6\u614b({0})\u3067\u306f\u7533\u7acb\u3066\u3092\u884c\u3048\u307e\u305b\u3093
+c2c.complain.submit.fail=\u7533\u7acb\u3066\u306e\u958b\u59cb\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002\u3042\u306a\u305f\u306f\u8cb7\u3044\u624b\u307e\u305f\u306f\u58f2\u308a\u624b\u3067\u306f\u3042\u308a\u307e\u305b\u3093
+c2c.order.not.buyer.seller=\u3042\u306a\u305f\u306f\u53d6\u5f15\u30e6\u30fc\u30b6\u30fc\u3067\u306f\u306a\u3044\u305f\u3081\u7533\u7acb\u3066\u3092\u958b\u59cb\u3067\u304d\u307e\u305b\u3093
+c2c.order.pay.update.fail=\u6ce8\u6587\u306e\u66f4\u65b0\u306b\u5931\u6557\u3057\u307e\u3057\u305f
+c2c.order.complain.submit.fail=\u7533\u7acb\u3066\u306e\u63d0\u51fa\u306b\u5931\u6557\u3057\u307e\u3057\u305f
+c2c.order.complain.not.exist=\u7533\u7acb\u3066\u756a\u53f7\u304c\u7121\u52b9\u3067\u3059
+c2c.complain.voucher.submit.fail=\u63d0\u51fa\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002\u3042\u306a\u305f\u306f\u7533\u7acb\u3066\u4eba\u307e\u305f\u306f\u88ab\u7533\u7acb\u3066\u4eba\u3067\u306f\u3042\u308a\u307e\u305b\u3093
+c2c.order.complain.remark.notEmpty=\u7533\u7acb\u3066\u7406\u7531\u306f\u7a7a\u306b\u3067\u304d\u307e\u305b\u3093
+c2c.order.complain.remark.maxval=\u8aac\u660e\u306f\u6700\u5927250\u6587\u5b57\u307e\u3067\u3067\u3059
+c2c.order.complain.voucher.id.invalid=\u7533\u7acb\u3066\u8a3c\u660e\u66f8\u756a\u53f7\u304c\u7121\u52b9\u3067\u3059
+
+c2c.order.complain.voucher.is.end=\u7533\u8a34\u306f\u7d42\u4e86\u3057\u307e\u3057\u305f
+c2c.order.complain.voucher.save.fail=\u7533\u8a34\u8a3c\u660e\u306e\u4fdd\u5b58\u306b\u5931\u6557\u3057\u307e\u3057\u305f
+c2c.order.complain.voucher.update.fail=\u7533\u8a34\u8a3c\u660e\u306e\u5909\u66f4\u306b\u5931\u6557\u3057\u307e\u3057\u305f
+c2c.order.complainId.orderId.invalid=\u7533\u8a34\u756a\u53f7\u307e\u305f\u306f\u6ce8\u6587\u756a\u53f7\u304c\u7121\u52b9\u3067\u3059
+password.length.lt8=\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u9577\u3055\u306f8\u6587\u5b57\u4ee5\u4e0a\u3067\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093
+password.length.gt32=\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u9577\u3055\u306f32\u6587\u5b57\u3092\u8d85\u3048\u3066\u306f\u3044\u3051\u307e\u305b\u3093
+password.must.include.digit.alpha.sc=\u30d1\u30b9\u30ef\u30fc\u30c9\u306b\u306f\u6570\u5b57\u3001\u5927\u6587\u5b57\u30fb\u5c0f\u6587\u5b57\u306e\u30a2\u30eb\u30d5\u30a1\u30d9\u30c3\u30c8\u3001\u7279\u6b8a\u6587\u5b57\u3092\u542b\u3081\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059
+c2c.ad.legalCoin.notset=\u73fe\u5728\u306e\u6cd5\u5b9a\u901a\u8ca8\u304c\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u307e\u305b\u3093
+c2c.order.availableAmount.buzu=\u5229\u7528\u53ef\u80fd\u306a\u8cc7\u7523\u304c\u4e0d\u8db3\u3057\u3066\u3044\u307e\u3059
+c2c.order.not.seller=\u3042\u306a\u305f\u306f\u58f2\u308a\u624b\u3067\u306f\u3042\u308a\u307e\u305b\u3093
+c2c.userReceipt.id.invalid=\u756a\u53f7\u304c\u7121\u52b9\u3067\u3059
+c2c.order.complainId.orderId.all.empty=\u7533\u8a34\u756a\u53f7\u3068\u6ce8\u6587\u756a\u53f7\u306e\u4e21\u65b9\u3092\u7a7a\u306b\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093
+

+ 134 - 0
qnfhq-api/src/main/resources/i18n/messages_ko.properties

@@ -0,0 +1,134 @@
+500=\uc11c\ubc84 \ub0b4\ubd80 \uc624\ub958
+401=\uad8c\ud55c \uc5c6\uc74c
+10001={0}\uc740(\ub294) \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4
+10002=\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \ud574\ub2f9 \uae30\ub85d\uc774 \uc774\ubbf8 \uc874\uc7ac\ud569\ub2c8\ub2e4
+10003=\ub9e4\uac1c\ubcc0\uc218 \uac00\uc838\uc624\uae30 \uc2e4\ud328
+10004=\uacc4\uc815 \ub610\ub294 \ube44\ubc00\ubc88\ud638 \uc624\ub958
+10005=\uacc4\uc815\uc774 \ube44\ud65c\uc131\ud654\ub418\uc5c8\uc2b5\ub2c8\ub2e4
+10006=\uace0\uc720 \uc2dd\ubcc4\uc790\ub294 \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4
+10007=\uc778\uc99d\ubc88\ud638\uac00 \uc62c\ubc14\ub974\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4
+10008=\uba3c\uc800 \ud558\uc704 \uba54\ub274 \ub610\ub294 \ubc84\ud2bc\uc744 \uc0ad\uc81c\ud558\uc138\uc694
+10009=\uae30\uc874 \ube44\ubc00\ubc88\ud638\uac00 \uc62c\ubc14\ub974\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4
+10010=\uacc4\uc815\uc774 \uc874\uc7ac\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4
+10011=\uc0c1\uc704 \ubd80\uc11c \uc120\ud0dd \uc624\ub958
+10012=\uc0c1\uc704 \uba54\ub274\ub294 \uc790\uae30 \uc790\uc2e0\uc77c \uc218 \uc5c6\uc2b5\ub2c8\ub2e4
+10013=\ub370\uc774\ud130 \uad8c\ud55c \uc778\ud130\ud398\uc774\uc2a4\ub294 Map \uc720\ud615 \ub9e4\uac1c\ubcc0\uc218\ub9cc \ud5c8\uc6a9\ub429\ub2c8\ub2e4
+10014=\uba3c\uc800 \ud558\uc704 \ubd80\uc11c\ub97c \uc0ad\uc81c\ud558\uc138\uc694
+10015=\uba3c\uc800 \ubd80\uc11c \ub0b4 \uc0ac\uc6a9\uc790\ub97c \uc0ad\uc81c\ud558\uc138\uc694
+10019=\ud30c\uc77c\uc744 \uc5c5\ub85c\ub4dc\ud558\uc138\uc694
+10020=\ud1a0\ud070\uc740 \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4
+10021=\ud1a0\ud070\uc774 \ub9cc\ub8cc\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ub2e4\uc2dc \ub85c\uadf8\uc778\ud558\uc138\uc694
+10022=\uacc4\uc815\uc774 \uc7a0\uacbc\uc2b5\ub2c8\ub2e4
+10024=\ud30c\uc77c \uc5c5\ub85c\ub4dc \uc2e4\ud328{0}
+10027=Redis \uc11c\ube44\uc2a4 \uc624\ub958
+10028=\uc2a4\ucf00\uc904 \uc791\uc5c5 \uc2e4\ud328
+10029=\ubd88\ubc95 \ubb38\uc790\ub97c \ud3ec\ud568\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4
+
+user.register.fail=\ub4f1\ub85d \uc2e4\ud328
+user.register.success=\ub4f1\ub85d \uc131\uacf5
+user.register.code.err=\uc778\uc99d\ubc88\ud638 \uc624\ub958
+user.register.activecode.notexisit=\ucd94\ucc9c \ucf54\ub4dc\uac00 \uc874\uc7ac\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4
+user.register.email.format=\uc774\uba54\uc77c \ud615\uc2dd\uc774 \uc62c\ubc14\ub974\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4
+user.register.email.exisit=\uc774\uba54\uc77c\uc774 \uc774\ubbf8 \uc874\uc7ac\ud569\ub2c8\ub2e4
+user.register.phone.exist=\ud734\ub300\ud3f0 \ubc88\ud638\uac00 \uc774\ubbf8 \uc874\uc7ac\ud569\ub2c8\ub2e4
+phone_code_empty=\ud734\ub300\ud3f0 \ubc88\ud638\ub294 \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4!
+user.code.send=\uc778\uc99d\ubc88\ud638\uac00 \uc131\uacf5\uc801\uc73c\ub85c \uc804\uc1a1\ub418\uc5c8\uc2b5\ub2c8\ub2e4
+app.verification.email.code=\uc778\uc99d\ubc88\ud638\uac00 \uc774\uba54\uc77c\ub85c \ubc1c\uc1a1\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ud655\uc778\ud574 \uc8fc\uc138\uc694
+common.send.success=\uc804\uc1a1 \uc131\uacf5
+sms.template.not.exist=\ubb38\uc790 \ud15c\ud50c\ub9bf\uc774 \uc874\uc7ac\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4
+appUser.login.code.err=\uc778\uc99d\ubc88\ud638 \uc624\ub958
+appUser.loginName.or.password.err=\uacc4\uc815 \ub610\ub294 \ube44\ubc00\ubc88\ud638 \uc624\ub958
+user_is_black=\uadc0\ud558\uc758 \uacc4\uc815\uc740 \ube14\ub799\ub9ac\uc2a4\ud2b8\uc5d0 \ub4f1\ub85d\ub418\uc5b4 \ub85c\uadf8\uc778\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
+appUser.login.success=\ub85c\uadf8\uc778 \uc131\uacf5
+user.not.login.err=\ub85c\uadf8\uc778\ud558\uc9c0 \uc54a\uc74c
+user.not.exist=\uc0ac\uc6a9\uc790\uac00 \uc874\uc7ac\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4
+code.try.times.limit=\uc7ac\uc2dc\ub3c4 \ud69f\uc218 \ucd08\uacfc
+user.sendcode.frequency.limit=\uc778\uc99d\ubc88\ud638 \uc694\uccad \ube48\ub3c4\uac00 \ub108\ubb34 \ub192\uc2b5\ub2c8\ub2e4. 60\ucd08 \ud6c4\uc5d0 \ub2e4\uc2dc \uc2dc\ub3c4\ud558\uc138\uc694
+user.email.send.fail=\uc774\uba54\uc77c \uc804\uc1a1 \uc2e4\ud328
+system.busy.try.again.later=\uc2dc\uc2a4\ud15c\uc774 \ubc14\uc069\ub2c8\ub2e4. \uc7a0\uc2dc \ud6c4 \ub2e4\uc2dc \uc2dc\ub3c4\ud558\uc138\uc694
+user.register.phone.exisit=\ud734\ub300\ud3f0 \ubc88\ud638\uac00 \uc774\ubbf8 \uc874\uc7ac\ud569\ub2c8\ub2e4
+appUser.loginName.or.password.err.limit.chance=\uacc4\uc815 \ub610\ub294 \ube44\ubc00\ubc88\ud638 \uc624\ub958\uc785\ub2c8\ub2e4. {0}\ud68c\uc758 \uae30\ud68c\uac00 \ub0a8\uc558\uc2b5\ub2c8\ub2e4
+pwd.fail.times.excess.hour.lock=\uacc4\uc815\uc774 \uc7a0\uacbc\uc2b5\ub2c8\ub2e4. {0}\ubd84 \ud6c4\uc5d0 \uc7a0\uae08 \ud574\uc81c\ub429\ub2c8\ub2e4
+pwd.fail.times.excess.day.lock=\uacc4\uc815\uc774 \uc7a0\uacbc\uc2b5\ub2c8\ub2e4. {0}\uc2dc\uac04 \ud6c4\uc5d0 \uc7a0\uae08 \ud574\uc81c\ub429\ub2c8\ub2e4
+pwd.fail.times.excess.second.lock=\uacc4\uc815\uc774 \uc7a0\uacbc\uc2b5\ub2c8\ub2e4. {0}\ucd08 \ud6c4\uc5d0 \uc7a0\uae08 \ud574\uc81c\ub429\ub2c8\ub2e4
+user.register.email.must.lowerCase=\uc18c\ubb38\uc790 \uc774\uba54\uc77c\uc744 \uc0ac\uc6a9\ud558\uace0 \uacf5\ubc31 \ud589\uc744 \ud655\uc778\ud558\uc138\uc694
+user.register.email.isTemp=\uc784\uc2dc \uc774\uba54\uc77c\uc774 \uac10\uc9c0\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc77c\ubc18\uc801\uc774\uace0 \uc2e0\ub8b0\ud560 \uc218 \uc788\ub294 \uc774\uba54\uc77c\uc744 \uc0ac\uc6a9\ud558\uc138\uc694
+complete.mobile.bind=\ud734\ub300\ud3f0 \ubc88\ud638 \uc5f0\uacb0 \uc644\ub8cc
+your.account.available.balance.insufficient=\uadc0\ud558\uc758 \uc790\uae08 \uacc4\uc88c\uc5d0\ub294 \ucd5c\uc18c {0}USDT\uc758 \uc0ac\uc6a9 \uac00\ub2a5 \uae08\uc561\uc774 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4
+
+complete.email.bind=\uc774\uba54\uc77c \ubc14\uc778\ub529 \uc644\ub8cc
+complete.identity.verification=\uc2e0\uc6d0 \uc778\uc99d \uc644\ub8cc
+c2c.merchant.apply.not.config=C2C \uc778\uc99d \uc0c1\uc778 \ubcf4\uc99d\uae08 \ubbf8\uc124\uc815
+merchant.param.direction.invalid=\ud30c\ub77c\ubbf8\ud130 direction \uac12\uc774 \uc62c\ubc14\ub974\uc9c0 \uc54a\uc74c
+merchant.ad.minAmount.bigger.zero=\ucd5c\uc18c \ud55c\ub3c4\ub294 0\ubcf4\ub2e4 \ucee4\uc57c \ud569\ub2c8\ub2e4
+merchant.minAmount.smaller.maxAmount=\ucd5c\uc18c \ud55c\ub3c4\ub294 \ucd5c\ub300 \ud55c\ub3c4\ubcf4\ub2e4 \uc791\uc544\uc57c \ud569\ub2c8\ub2e4
+merchant.num.bigger.zero=\uc218\ub7c9\uc740 0\ubcf4\ub2e4 \ucee4\uc57c \ud569\ub2c8\ub2e4
+merchant.price.bigger.zero=\uac00\uaca9\uc740 0\ubcf4\ub2e4 \ucee4\uc57c \ud569\ub2c8\ub2e4
+merchant.maxAmount.smaller.price.num=\ucd5c\ub300 \ud55c\ub3c4\ub294 \uac00\uaca9\uacfc \uc218\ub7c9\uc758 \uacf1\ubcf4\ub2e4 \uc791\uc544\uc57c \ud569\ub2c8\ub2e4
+c2cAd.price.must.bigger.set=\uac00\uaca9\uc740 {}\ubcf4\ub2e4 \ucee4\uc57c \ud569\ub2c8\ub2e4
+c2cAd.price.must.small.set=\uac00\uaca9\uc740 {}\ubcf4\ub2e4 \uc791\uc544\uc57c \ud569\ub2c8\ub2e4
+c2cAd.minAmount.must.bigger.set=\ucd5c\uc18c \ud55c\ub3c4\ub294 {}\ubcf4\ub2e4 \ucee4\uc57c \ud569\ub2c8\ub2e4
+c2cAd.maxAmount.must.small.set=\ucd5c\ub300 \ud55c\ub3c4\ub294 {}\ubcf4\ub2e4 \uc791\uc544\uc57c \ud569\ub2c8\ub2e4
+merchant.complete.merchant.apply=\uc778\uc99d \uc0c1\uc778 \uc2e0\uccad\uc744 \uc644\ub8cc\ud574 \uc8fc\uc138\uc694
+merchant.under.review=\uc778\uc99d \uc0c1\uc778 \uc2ec\uc0ac \uc911
+merchant.under.lock=\uc778\uc99d \uc0c1\uc778 \uc7a0\uae08 \uc911
+merchant.approval.reject=\uc778\uc99d \uc0c1\uc778 \uc2ec\uc0ac \ubd88\ud569\uaca9
+merchant.buyCount.greater.sellCount=\ud50c\ub7ab\ud3fc \uc0ac\uc6a9 \uac00\ub2a5 \uc790\uc0b0\uc740 \ud310\ub9e4 \uc218\ub7c9\ubcf4\ub2e4 \ucee4\uc57c \ud569\ub2c8\ub2e4
+c2c.order.save.fail=\uad11\uace0 \uc800\uc7a5 \uc2e4\ud328
+seller.asset.freeze.fail=\ud310\ub9e4\uc790 \uc790\uc0b0 \ub3d9\uacb0 \uc2e4\ud328
+c2c.ad.id.invalid=\uad11\uace0 \ubc88\ud638\uac00 \uc720\ud6a8\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4
+c2c.ad.cannot.cancel=\ucde8\uc18c \uad8c\ud55c\uc774 \uc5c6\uc2b5\ub2c8\ub2e4, \uad11\uace0\uc8fc\uac00 \uc544\ub2d9\ub2c8\ub2e4
+c2c.ad.exist.order.cancel=\ud604\uc7ac \uad11\uace0\uc5d0 \uc9c4\ud589 \uc911\uc778 \uc8fc\ubb38\uc774 \uc788\uc5b4 \ucde8\uc18c\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4
+c2c.ad.cancel.fail=\uad11\uace0 \ucde8\uc18c \uc2e4\ud328
+c2c.user.occupied.asset.fail=\uc0ac\uc6a9\uc790 \uc790\uc0b0 \ud574\ub3d9 \uc2e4\ud328
+c2c.ad.merchant.id.blank=\uc0c1\uc778 \ubc88\ud638\ub294 \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4
+c2c.userReceipt.add.repeat=\ucd94\uac00 \uc131\uacf5, \uc911\ubcf5 \uc81c\ucd9c\ud558\uc9c0 \ub9c8\uc138\uc694
+
+c2c.ad.current.payway.empty=\ud604\uc7ac \ubc95\uc815\ud654\ud3d0 \uacb0\uc81c \uc218\ub2e8\uc774 \uc124\uc815\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4
+c2c.order.create.tran.fail=\uc9c4\ud589 \uc911\uc778 \uac70\ub798\uac00 \uc788\uc2b5\ub2c8\ub2e4. \uba3c\uc800 \ucc98\ub9ac\ud574 \uc8fc\uc138\uc694. \ucc98\ub9ac \uc644\ub8cc \ud6c4 \uac70\ub798\ub97c \uacc4\uc18d\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.
+user.authentication.not.certified=\uba3c\uc800 \uc2e4\uba85 \uc778\uc99d\uc744 \uc9c4\ud589\ud574 \uc8fc\uc138\uc694
+c2c.order.availableAmount.insufficient=\uc0ac\uc6a9 \uac00\ub2a5\ud55c \uc790\uc0b0\uc774 \ud310\ub9e4 \uc218\ub7c9\ubcf4\ub2e4 \ub9ce\uc544\uc57c \ud569\ub2c8\ub2e4
+c2c.order.param.adid=\uad11\uace0 \ubc88\ud638\uac00 \uc720\ud6a8\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4
+c2c.order.param.adid.invalid=\uad11\uace0\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4
+c2c.order.direction.invalid=\ud30c\ub77c\ubbf8\ud130 direction \uac12\uc774 \uc62c\ubc14\ub974\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4
+c2c.order.buyer.seller.must.different=\uad6c\ub9e4\uc790\uc640 \ud310\ub9e4\uc790\ub294 \ub3d9\uc77c\ud55c \uc0ac\uc6a9\uc790\uac00 \ub420 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4
+c2c.order.param.tranAmt.min=\uac70\ub798 \uae08\uc561\uc740 \ucd5c\uc18c \ud55c\ub3c4\ubcf4\ub2e4 \ucee4\uc57c \ud569\ub2c8\ub2e4
+c2c.order.param.tranAmt.max=\uac70\ub798 \uae08\uc561\uc740 \ucd5c\ub300 \ud55c\ub3c4\ubcf4\ub2e4 \uc791\uc544\uc57c \ud569\ub2c8\ub2e4
+c2c.order.update.asset.fail=\ud310\ub9e4\uc790 \uc790\uc0b0 \uc5c5\ub370\uc774\ud2b8 \uc2e4\ud328
+c2c.order.not.exist=\uc8fc\ubb38 \ubc88\ud638\uac00 \uc720\ud6a8\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4
+c2c.order.status.end.not.cancel=\uc8fc\ubb38\uc774 \uc885\ub8cc\ub418\uc5b4 \ucde8\uc18c\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4
+c2c.order.complain.not.cancel=\uc8fc\ubb38\uc774 \ubd84\uc7c1 \uc911\uc774\uc5b4\uc11c \ucde8\uc18c\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4
+c2c.order.sell.payed.not.cancel=\ud310\ub9e4 \uc8fc\ubb38\uc774 \uacb0\uc81c\ub418\uc5b4 \ucde8\uc18c\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4
+operation.fail.please.refresh=\uc791\uc5c5 \uc2e4\ud328, \uc0c8\ub85c \uace0\uce68 \ud6c4 \ub2e4\uc2dc \uc2dc\ub3c4\ud574 \uc8fc\uc138\uc694
+c2c.seller.uid.not.empty=\ud310\ub9e4\uc790 \ubc88\ud638\ub294 \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4
+c2c.order.log.fail=\uc8fc\ubb38 \ub85c\uadf8 \uc0bd\uc785 \uc2e4\ud328
+c2c.order.update.fail=\uc8fc\ubb38 \uc5c5\ub370\uc774\ud2b8 \uc2e4\ud328
+c2c.order.pay.not.buyer=\ub2f9\uc2e0\uc740 \uad6c\ub9e4\uc790\uac00 \uc544\ub2d9\ub2c8\ub2e4
+c2c.order.is.end=\uc8fc\ubb38\uc774 \uc885\ub8cc\ub418\uc5c8\uc2b5\ub2c8\ub2e4
+c2c.order.uploadPayment.fail=\uacb0\uc81c \uc99d\ube59 \uc5c5\ub85c\ub4dc \uc2e4\ud328
+c2c.order.pay.cert.id.invalid=\uc99d\ube59 \ubc88\ud638\uac00 \uc720\ud6a8\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4
+c2c.order.no.permission.view=\uc870\ud68c \uad8c\ud55c\uc774 \uc5c6\uc2b5\ub2c8\ub2e4
+c2c.order.status.complain.fail=\ud604\uc7ac \uc8fc\ubb38 \uc0c1\ud0dc({0})\uc5d0\uc11c\ub294 \ubd84\uc7c1\uc744 \uc81c\uae30\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4
+c2c.complain.submit.fail=\ubd84\uc7c1 \uc81c\uae30 \uc2e4\ud328, \ub2f9\uc2e0\uc740 \uad6c\ub9e4\uc790 \ub610\ub294 \ud310\ub9e4\uc790\uac00 \uc544\ub2d9\ub2c8\ub2e4
+c2c.order.not.buyer.seller=\uac70\ub798 \uc0ac\uc6a9\uc790\uac00 \uc544\ub2c8\ubbc0\ub85c \ubd84\uc7c1\uc744 \uc81c\uae30\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4
+c2c.order.pay.update.fail=\uc8fc\ubb38 \uc5c5\ub370\uc774\ud2b8 \uc2e4\ud328
+c2c.order.complain.submit.fail=\ubd84\uc7c1 \uc81c\ucd9c \uc2e4\ud328
+c2c.order.complain.not.exist=\ubd84\uc7c1 \ubc88\ud638\uac00 \uc720\ud6a8\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4
+c2c.complain.voucher.submit.fail=\uc81c\ucd9c \uc2e4\ud328, \ub2f9\uc2e0\uc740 \ubd84\uc7c1 \ub2f9\uc0ac\uc790\uac00 \uc544\ub2d9\ub2c8\ub2e4
+c2c.order.complain.remark.notEmpty=\ubd84\uc7c1 \uc0ac\uc720\ub97c \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4
+c2c.order.complain.remark.maxval=\uc124\uba85\uc740 \ucd5c\ub300 250\uc790\uae4c\uc9c0 \uac00\ub2a5\ud569\ub2c8\ub2e4
+c2c.order.complain.voucher.id.invalid=\ubd84\uc7c1 \uc99d\ube59 \ubc88\ud638\uac00 \uc720\ud6a8\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4
+
+c2c.order.complain.voucher.is.end=\uc2e0\uccad\uc774 \uc885\ub8cc\ub418\uc5c8\uc2b5\ub2c8\ub2e4
+c2c.order.complain.voucher.save.fail=\uc2e0\uccad \uc99d\ube59 \uc800\uc7a5 \uc2e4\ud328
+c2c.order.complain.voucher.update.fail=\uc2e0\uccad \uc99d\ube59 \uc218\uc815 \uc2e4\ud328
+c2c.order.complainId.orderId.invalid=\uc2e0\uccad \ubc88\ud638 \ub610\ub294 \uc8fc\ubb38 \ubc88\ud638\uac00 \uc720\ud6a8\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4
+password.length.lt8=\ube44\ubc00\ubc88\ud638 \uae38\uc774\ub294 8\uc790\ub9ac \uc774\uc0c1\uc774\uc5b4\uc57c \ud569\ub2c8\ub2e4
+password.length.gt32=\ube44\ubc00\ubc88\ud638 \uae38\uc774\ub294 32\uc790\ub9ac\ub97c \ucd08\uacfc\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4
+password.must.include.digit.alpha.sc=\ube44\ubc00\ubc88\ud638\ub294 \uc22b\uc790, \ub300\uc18c\ubb38\uc790, \ud2b9\uc218 \ubb38\uc790\ub97c \ud3ec\ud568\ud574\uc57c \ud569\ub2c8\ub2e4
+c2c.ad.legalCoin.notset=\ud604\uc7ac \ubc95\uc815\ud654\ud3d0\uac00 \uc124\uc815\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4
+c2c.order.availableAmount.buzu=\uc0ac\uc6a9 \uac00\ub2a5\ud55c \uc790\uc0b0\uc774 \ubd80\uc871\ud569\ub2c8\ub2e4
+c2c.order.not.seller=\ub2f9\uc2e0\uc740 \ud310\ub9e4\uc790\uac00 \uc544\ub2d9\ub2c8\ub2e4
+c2c.userReceipt.id.invalid=\ubc88\ud638\uac00 \uc720\ud6a8\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4
+c2c.order.complainId.orderId.all.empty=\uc2e0\uccad \ubc88\ud638\uc640 \uc8fc\ubb38 \ubc88\ud638\ub294 \ubaa8\ub450 \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4
+

+ 134 - 0
qnfhq-api/src/main/resources/i18n/messages_th.properties

@@ -0,0 +1,134 @@
+500=\u0e02\u0e49\u0e2d\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14\u0e20\u0e32\u0e22\u0e43\u0e19\u0e40\u0e0b\u0e34\u0e23\u0e4c\u0e1f\u0e40\u0e27\u0e2d\u0e23\u0e4c
+401=\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e2d\u0e19\u0e38\u0e0d\u0e32\u0e15
+10001={0} \u0e2b\u0e49\u0e32\u0e21\u0e27\u0e48\u0e32\u0e07\u0e40\u0e1b\u0e25\u0e48\u0e32
+10002=\u0e23\u0e30\u0e40\u0e1a\u0e35\u0e22\u0e19\u0e19\u0e35\u0e49\u0e21\u0e35\u0e2d\u0e22\u0e39\u0e48\u0e43\u0e19\u0e10\u0e32\u0e19\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e41\u0e25\u0e49\u0e27
+10003=\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e14\u0e36\u0e07\u0e1e\u0e32\u0e23\u0e32\u0e21\u0e34\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e44\u0e14\u0e49
+10004=\u0e1a\u0e31\u0e0d\u0e0a\u0e35\u0e2b\u0e23\u0e37\u0e2d\u0e23\u0e2b\u0e31\u0e2a\u0e1c\u0e48\u0e32\u0e19\u0e44\u0e21\u0e48\u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07
+10005=\u0e1a\u0e31\u0e0d\u0e0a\u0e35\u0e16\u0e39\u0e01\u0e23\u0e30\u0e07\u0e31\u0e1a\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19
+10006=\u0e15\u0e31\u0e27\u0e23\u0e30\u0e1a\u0e38\u0e17\u0e35\u0e48\u0e44\u0e21\u0e48\u0e0b\u0e49\u0e33\u0e01\u0e31\u0e19\u0e2b\u0e49\u0e32\u0e21\u0e27\u0e48\u0e32\u0e07\u0e40\u0e1b\u0e25\u0e48\u0e32
+10007=\u0e23\u0e2b\u0e31\u0e2a\u0e22\u0e37\u0e19\u0e22\u0e31\u0e19\u0e44\u0e21\u0e48\u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07
+10008=\u0e01\u0e23\u0e38\u0e13\u0e32\u0e25\u0e1a\u0e40\u0e21\u0e19\u0e39\u0e22\u0e48\u0e2d\u0e22\u0e2b\u0e23\u0e37\u0e2d\u0e1b\u0e38\u0e48\u0e21\u0e01\u0e48\u0e2d\u0e19
+10009=\u0e23\u0e2b\u0e31\u0e2a\u0e1c\u0e48\u0e32\u0e19\u0e40\u0e14\u0e34\u0e21\u0e44\u0e21\u0e48\u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07
+10010=\u0e44\u0e21\u0e48\u0e1e\u0e1a\u0e1a\u0e31\u0e0d\u0e0a\u0e35\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49
+10011=\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e41\u0e1c\u0e19\u0e01\u0e15\u0e49\u0e19\u0e2a\u0e31\u0e07\u0e01\u0e31\u0e14\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14
+10012=\u0e40\u0e21\u0e19\u0e39\u0e15\u0e49\u0e19\u0e2a\u0e31\u0e07\u0e01\u0e31\u0e14\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e40\u0e1b\u0e47\u0e19\u0e15\u0e31\u0e27\u0e40\u0e2d\u0e07\u0e44\u0e14\u0e49
+10013=\u0e2d\u0e34\u0e19\u0e40\u0e17\u0e2d\u0e23\u0e4c\u0e40\u0e1f\u0e0b\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e4c\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25 \u0e15\u0e49\u0e2d\u0e07\u0e40\u0e1b\u0e47\u0e19\u0e1e\u0e32\u0e23\u0e32\u0e21\u0e34\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e1b\u0e23\u0e30\u0e40\u0e20\u0e17 Map \u0e40\u0e17\u0e48\u0e32\u0e19\u0e31\u0e49\u0e19
+10014=\u0e01\u0e23\u0e38\u0e13\u0e32\u0e25\u0e1a\u0e41\u0e1c\u0e19\u0e01\u0e25\u0e39\u0e01\u0e01\u0e48\u0e2d\u0e19
+10015=\u0e01\u0e23\u0e38\u0e13\u0e32\u0e25\u0e1a\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49\u0e43\u0e19\u0e41\u0e1c\u0e19\u0e01\u0e01\u0e48\u0e2d\u0e19
+10019=\u0e01\u0e23\u0e38\u0e13\u0e32\u0e2d\u0e31\u0e1b\u0e42\u0e2b\u0e25\u0e14\u0e44\u0e1f\u0e25\u0e4c
+10020=token \u0e2b\u0e49\u0e32\u0e21\u0e27\u0e48\u0e32\u0e07\u0e40\u0e1b\u0e25\u0e48\u0e32
+10021=token \u0e2b\u0e21\u0e14\u0e2d\u0e32\u0e22\u0e38 \u0e01\u0e23\u0e38\u0e13\u0e32\u0e40\u0e02\u0e49\u0e32\u0e2a\u0e39\u0e48\u0e23\u0e30\u0e1a\u0e1a\u0e43\u0e2b\u0e21\u0e48
+10022=\u0e1a\u0e31\u0e0d\u0e0a\u0e35\u0e16\u0e39\u0e01\u0e25\u0e47\u0e2d\u0e01
+10024=\u0e2d\u0e31\u0e1b\u0e42\u0e2b\u0e25\u0e14\u0e44\u0e1f\u0e25\u0e4c\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27 {0}
+10027=\u0e1a\u0e23\u0e34\u0e01\u0e32\u0e23 Redis \u0e1c\u0e34\u0e14\u0e1b\u0e01\u0e15\u0e34
+10028=\u0e07\u0e32\u0e19\u0e15\u0e32\u0e21\u0e40\u0e27\u0e25\u0e32\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27
+10029=\u0e2b\u0e49\u0e32\u0e21\u0e21\u0e35\u0e2d\u0e31\u0e01\u0e02\u0e23\u0e30\u0e15\u0e49\u0e2d\u0e07\u0e2b\u0e49\u0e32\u0e21
+
+user.register.fail=\u0e25\u0e07\u0e17\u0e30\u0e40\u0e1a\u0e35\u0e22\u0e19\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27
+user.register.success=\u0e25\u0e07\u0e17\u0e30\u0e40\u0e1a\u0e35\u0e22\u0e19\u0e2a\u0e33\u0e40\u0e23\u0e47\u0e08
+user.register.code.err=\u0e23\u0e2b\u0e31\u0e2a\u0e22\u0e37\u0e19\u0e22\u0e31\u0e19\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14
+user.register.activecode.notexisit=\u0e23\u0e2b\u0e31\u0e2a\u0e41\u0e19\u0e30\u0e19\u0e33\u0e44\u0e21\u0e48\u0e1e\u0e1a
+user.register.email.format=\u0e23\u0e39\u0e1b\u0e41\u0e1a\u0e1a\u0e2d\u0e35\u0e40\u0e21\u0e25\u0e44\u0e21\u0e48\u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07
+user.register.email.exisit=\u0e2d\u0e35\u0e40\u0e21\u0e25\u0e21\u0e35\u0e2d\u0e22\u0e39\u0e48\u0e41\u0e25\u0e49\u0e27
+user.register.phone.exist=\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e25\u0e02\u0e42\u0e17\u0e23\u0e28\u0e31\u0e1e\u0e17\u0e4c\u0e21\u0e35\u0e2d\u0e22\u0e39\u0e48\u0e41\u0e25\u0e49\u0e27
+phone_code_empty=\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e25\u0e02\u0e42\u0e17\u0e23\u0e28\u0e31\u0e1e\u0e17\u0e4c\u0e2b\u0e49\u0e32\u0e21\u0e27\u0e48\u0e32\u0e07\u0e40\u0e1b\u0e25\u0e48\u0e32!
+user.code.send=\u0e2a\u0e48\u0e07\u0e23\u0e2b\u0e31\u0e2a\u0e22\u0e37\u0e19\u0e22\u0e31\u0e19\u0e2a\u0e33\u0e40\u0e23\u0e47\u0e08
+app.verification.email.code=\u0e23\u0e2b\u0e31\u0e2a\u0e22\u0e37\u0e19\u0e22\u0e31\u0e19\u0e16\u0e39\u0e01\u0e2a\u0e48\u0e07\u0e44\u0e1b\u0e22\u0e31\u0e07\u0e2d\u0e35\u0e40\u0e21\u0e25\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13 \u0e01\u0e23\u0e38\u0e13\u0e32\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a
+common.send.success=\u0e2a\u0e48\u0e07\u0e2a\u0e33\u0e40\u0e23\u0e47\u0e08
+sms.template.not.exist=\u0e44\u0e21\u0e48\u0e1e\u0e1a\u0e41\u0e21\u0e48\u0e41\u0e1a\u0e1a\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21 SMS
+appUser.login.code.err=\u0e23\u0e2b\u0e31\u0e2a\u0e22\u0e37\u0e19\u0e22\u0e31\u0e19\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14
+appUser.loginName.or.password.err=\u0e1a\u0e31\u0e0d\u0e0a\u0e35\u0e2b\u0e23\u0e37\u0e2d\u0e23\u0e2b\u0e31\u0e2a\u0e1c\u0e48\u0e32\u0e19\u0e1c\u0e34\u0e14
+user_is_black=\u0e1a\u0e31\u0e0d\u0e0a\u0e35\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e16\u0e39\u0e01\u0e1a\u0e25\u0e47\u0e2d\u0e01 \u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e40\u0e02\u0e49\u0e32\u0e2a\u0e39\u0e48\u0e23\u0e30\u0e1a\u0e1a\u0e44\u0e14\u0e49
+appUser.login.success=\u0e40\u0e02\u0e49\u0e32\u0e2a\u0e39\u0e48\u0e23\u0e30\u0e1a\u0e1a\u0e2a\u0e33\u0e40\u0e23\u0e47\u0e08
+user.not.login.err=\u0e22\u0e31\u0e07\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e40\u0e02\u0e49\u0e32\u0e2a\u0e39\u0e48\u0e23\u0e30\u0e1a\u0e1a
+user.not.exist=\u0e44\u0e21\u0e48\u0e1e\u0e1a\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49
+code.try.times.limit=\u0e25\u0e2d\u0e07\u0e43\u0e2b\u0e21\u0e48\u0e2b\u0e25\u0e32\u0e22\u0e04\u0e23\u0e31\u0e49\u0e07\u0e40\u0e01\u0e34\u0e19\u0e44\u0e1b
+user.sendcode.frequency.limit=\u0e02\u0e2d\u0e23\u0e2b\u0e31\u0e2a\u0e22\u0e37\u0e19\u0e22\u0e31\u0e19\u0e1a\u0e48\u0e2d\u0e22\u0e40\u0e01\u0e34\u0e19\u0e44\u0e1b \u0e01\u0e23\u0e38\u0e13\u0e32\u0e23\u0e2d 60 \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35\u0e41\u0e25\u0e49\u0e27\u0e25\u0e2d\u0e07\u0e43\u0e2b\u0e21\u0e48
+user.email.send.fail=\u0e2a\u0e48\u0e07\u0e2d\u0e35\u0e40\u0e21\u0e25\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27
+system.busy.try.again.later=\u0e23\u0e30\u0e1a\u0e1a\u0e22\u0e38\u0e48\u0e07 \u0e01\u0e23\u0e38\u0e13\u0e32\u0e25\u0e2d\u0e07\u0e43\u0e2b\u0e21\u0e48\u0e20\u0e32\u0e22\u0e2b\u0e25\u0e31\u0e07
+user.register.phone.exisit=\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e25\u0e02\u0e42\u0e17\u0e23\u0e28\u0e31\u0e1e\u0e17\u0e4c\u0e21\u0e35\u0e2d\u0e22\u0e39\u0e48\u0e41\u0e25\u0e49\u0e27
+appUser.loginName.or.password.err.limit.chance=\u0e1a\u0e31\u0e0d\u0e0a\u0e35\u0e2b\u0e23\u0e37\u0e2d\u0e23\u0e2b\u0e31\u0e2a\u0e1c\u0e48\u0e32\u0e19\u0e1c\u0e34\u0e14 \u0e04\u0e38\u0e13\u0e22\u0e31\u0e07\u0e21\u0e35\u0e42\u0e2d\u0e01\u0e32\u0e2a {0} \u0e04\u0e23\u0e31\u0e49\u0e07
+pwd.fail.times.excess.hour.lock=\u0e1a\u0e31\u0e0d\u0e0a\u0e35\u0e16\u0e39\u0e01\u0e25\u0e47\u0e2d\u0e01 \u0e08\u0e30\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01\u0e2b\u0e25\u0e31\u0e07 {0} \u0e19\u0e32\u0e17\u0e35
+pwd.fail.times.excess.day.lock=\u0e1a\u0e31\u0e0d\u0e0a\u0e35\u0e16\u0e39\u0e01\u0e25\u0e47\u0e2d\u0e01 \u0e08\u0e30\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01\u0e2b\u0e25\u0e31\u0e07 {0} \u0e0a\u0e31\u0e48\u0e27\u0e42\u0e21\u0e07
+pwd.fail.times.excess.second.lock=\u0e1a\u0e31\u0e0d\u0e0a\u0e35\u0e16\u0e39\u0e01\u0e25\u0e47\u0e2d\u0e01 \u0e08\u0e30\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01\u0e2b\u0e25\u0e31\u0e07 {0} \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35
+user.register.email.must.lowerCase=\u0e01\u0e23\u0e38\u0e13\u0e32\u0e43\u0e0a\u0e49\u0e2d\u0e35\u0e40\u0e21\u0e25\u0e15\u0e31\u0e27\u0e1e\u0e34\u0e21\u0e1e\u0e4c\u0e40\u0e25\u0e47\u0e01\u0e41\u0e25\u0e30\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e1a\u0e23\u0e23\u0e17\u0e31\u0e14\u0e27\u0e48\u0e32\u0e07
+user.register.email.isTemp=\u0e15\u0e23\u0e27\u0e08\u0e1e\u0e1a\u0e2d\u0e35\u0e40\u0e21\u0e25\u0e0a\u0e31\u0e48\u0e27\u0e04\u0e23\u0e32\u0e27 \u0e01\u0e23\u0e38\u0e13\u0e32\u0e43\u0e0a\u0e49\u0e2d\u0e35\u0e40\u0e21\u0e25\u0e17\u0e35\u0e48\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e16\u0e37\u0e2d\u0e44\u0e14\u0e49\u0e17\u0e31\u0e48\u0e27\u0e44\u0e1b
+complete.mobile.bind=\u0e1c\u0e39\u0e01\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e25\u0e02\u0e42\u0e17\u0e23\u0e28\u0e31\u0e1e\u0e17\u0e4c\u0e40\u0e23\u0e35\u0e22\u0e1a\u0e23\u0e49\u0e2d\u0e22\u0e41\u0e25\u0e49\u0e27
+your.account.available.balance.insufficient=\u0e1a\u0e31\u0e0d\u0e0a\u0e35\u0e40\u0e07\u0e34\u0e19\u0e17\u0e38\u0e19\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e04\u0e27\u0e23\u0e21\u0e35\u0e40\u0e07\u0e34\u0e19\u0e17\u0e35\u0e48\u0e43\u0e0a\u0e49\u0e44\u0e14\u0e49\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e19\u0e49\u0e2d\u0e22 {0} USDT
+
+complete.email.bind=\u0e01\u0e32\u0e23\u0e1c\u0e39\u0e01\u0e2d\u0e35\u0e40\u0e21\u0e25\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e2a\u0e21\u0e1a\u0e39\u0e23\u0e13\u0e4c
+complete.identity.verification=\u0e01\u0e32\u0e23\u0e22\u0e37\u0e19\u0e22\u0e31\u0e19\u0e15\u0e31\u0e27\u0e15\u0e19\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e2a\u0e21\u0e1a\u0e39\u0e23\u0e13\u0e4c
+c2c.merchant.apply.not.config=\u0e22\u0e31\u0e07\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e21\u0e31\u0e14\u0e08\u0e33\u0e1c\u0e39\u0e49\u0e04\u0e49\u0e32\u0e23\u0e31\u0e1a\u0e23\u0e2d\u0e07 C2C
+merchant.param.direction.invalid=\u0e04\u0e48\u0e32\u0e1e\u0e32\u0e23\u0e32\u0e21\u0e34\u0e40\u0e15\u0e2d\u0e23\u0e4c direction \u0e44\u0e21\u0e48\u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07
+merchant.ad.minAmount.bigger.zero=\u0e08\u0e33\u0e19\u0e27\u0e19\u0e02\u0e31\u0e49\u0e19\u0e15\u0e48\u0e33\u0e15\u0e49\u0e2d\u0e07\u0e21\u0e32\u0e01\u0e01\u0e27\u0e48\u0e32 0
+merchant.minAmount.smaller.maxAmount=\u0e08\u0e33\u0e19\u0e27\u0e19\u0e02\u0e31\u0e49\u0e19\u0e15\u0e48\u0e33\u0e15\u0e49\u0e2d\u0e07\u0e19\u0e49\u0e2d\u0e22\u0e01\u0e27\u0e48\u0e32\u0e08\u0e33\u0e19\u0e27\u0e19\u0e2a\u0e39\u0e07\u0e2a\u0e38\u0e14
+merchant.num.bigger.zero=\u0e08\u0e33\u0e19\u0e27\u0e19\u0e15\u0e49\u0e2d\u0e07\u0e21\u0e32\u0e01\u0e01\u0e27\u0e48\u0e32 0
+merchant.price.bigger.zero=\u0e23\u0e32\u0e04\u0e32\u0e15\u0e49\u0e2d\u0e07\u0e21\u0e32\u0e01\u0e01\u0e27\u0e48\u0e32 0
+merchant.maxAmount.smaller.price.num=\u0e08\u0e33\u0e19\u0e27\u0e19\u0e2a\u0e39\u0e07\u0e2a\u0e38\u0e14\u0e15\u0e49\u0e2d\u0e07\u0e19\u0e49\u0e2d\u0e22\u0e01\u0e27\u0e48\u0e32\u0e1c\u0e25\u0e04\u0e39\u0e13\u0e02\u0e2d\u0e07\u0e23\u0e32\u0e04\u0e32\u0e41\u0e25\u0e30\u0e08\u0e33\u0e19\u0e27\u0e19
+c2cAd.price.must.bigger.set=\u0e23\u0e32\u0e04\u0e32\u0e15\u0e49\u0e2d\u0e07\u0e21\u0e32\u0e01\u0e01\u0e27\u0e48\u0e32 {}
+c2cAd.price.must.small.set=\u0e23\u0e32\u0e04\u0e32\u0e15\u0e49\u0e2d\u0e07\u0e19\u0e49\u0e2d\u0e22\u0e01\u0e27\u0e48\u0e32 {}
+c2cAd.minAmount.must.bigger.set=\u0e08\u0e33\u0e19\u0e27\u0e19\u0e02\u0e31\u0e49\u0e19\u0e15\u0e48\u0e33\u0e15\u0e49\u0e2d\u0e07\u0e21\u0e32\u0e01\u0e01\u0e27\u0e48\u0e32 {}
+c2cAd.maxAmount.must.small.set=\u0e08\u0e33\u0e19\u0e27\u0e19\u0e2a\u0e39\u0e07\u0e2a\u0e38\u0e14\u0e15\u0e49\u0e2d\u0e07\u0e19\u0e49\u0e2d\u0e22\u0e01\u0e27\u0e48\u0e32 {}
+merchant.complete.merchant.apply=\u0e01\u0e23\u0e38\u0e13\u0e32\u0e17\u0e33\u0e01\u0e32\u0e23\u0e2a\u0e21\u0e31\u0e04\u0e23\u0e1c\u0e39\u0e49\u0e04\u0e49\u0e32\u0e23\u0e31\u0e1a\u0e23\u0e2d\u0e07\u0e43\u0e2b\u0e49\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e2a\u0e21\u0e1a\u0e39\u0e23\u0e13\u0e4c
+merchant.under.review=\u0e01\u0e33\u0e25\u0e31\u0e07\u0e2d\u0e22\u0e39\u0e48\u0e23\u0e30\u0e2b\u0e27\u0e48\u0e32\u0e07\u0e01\u0e32\u0e23\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e1c\u0e39\u0e49\u0e04\u0e49\u0e32\u0e23\u0e31\u0e1a\u0e23\u0e2d\u0e07
+merchant.under.lock=\u0e1c\u0e39\u0e49\u0e04\u0e49\u0e32\u0e23\u0e31\u0e1a\u0e23\u0e2d\u0e07\u0e16\u0e39\u0e01\u0e25\u0e47\u0e2d\u0e01\u0e2d\u0e22\u0e39\u0e48
+merchant.approval.reject=\u0e01\u0e32\u0e23\u0e2d\u0e19\u0e38\u0e21\u0e31\u0e15\u0e34\u0e1c\u0e39\u0e49\u0e04\u0e49\u0e32\u0e23\u0e31\u0e1a\u0e23\u0e2d\u0e07\u0e44\u0e21\u0e48\u0e1c\u0e48\u0e32\u0e19
+merchant.buyCount.greater.sellCount=\u0e2a\u0e34\u0e19\u0e17\u0e23\u0e31\u0e1e\u0e22\u0e4c\u0e17\u0e35\u0e48\u0e43\u0e0a\u0e49\u0e44\u0e14\u0e49\u0e43\u0e19\u0e41\u0e1e\u0e25\u0e15\u0e1f\u0e2d\u0e23\u0e4c\u0e21\u0e15\u0e49\u0e2d\u0e07\u0e21\u0e32\u0e01\u0e01\u0e27\u0e48\u0e32\u0e08\u0e33\u0e19\u0e27\u0e19\u0e17\u0e35\u0e48\u0e02\u0e32\u0e22
+c2c.order.save.fail=\u0e01\u0e32\u0e23\u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01\u0e42\u0e06\u0e29\u0e13\u0e32\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27
+seller.asset.freeze.fail=\u0e01\u0e32\u0e23\u0e41\u0e0a\u0e48\u0e41\u0e02\u0e47\u0e07\u0e2a\u0e34\u0e19\u0e17\u0e23\u0e31\u0e1e\u0e22\u0e4c\u0e02\u0e2d\u0e07\u0e1c\u0e39\u0e49\u0e02\u0e32\u0e22\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27
+c2c.ad.id.invalid=\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e25\u0e02\u0e42\u0e06\u0e29\u0e13\u0e32\u0e44\u0e21\u0e48\u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07
+c2c.ad.cannot.cancel=\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e21\u0e35\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e4c\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01 \u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e43\u0e0a\u0e48\u0e1d\u0e48\u0e32\u0e22\u0e42\u0e06\u0e29\u0e13\u0e32
+c2c.ad.exist.order.cancel=\u0e42\u0e06\u0e29\u0e13\u0e32\u0e1b\u0e31\u0e08\u0e08\u0e38\u0e1a\u0e31\u0e19\u0e21\u0e35\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e0b\u0e37\u0e49\u0e2d\u0e17\u0e35\u0e48\u0e01\u0e33\u0e25\u0e31\u0e07\u0e14\u0e33\u0e40\u0e19\u0e34\u0e19\u0e01\u0e32\u0e23\u0e2d\u0e22\u0e39\u0e48 \u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01\u0e44\u0e14\u0e49
+c2c.ad.cancel.fail=\u0e01\u0e32\u0e23\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01\u0e42\u0e06\u0e29\u0e13\u0e32\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27
+c2c.user.occupied.asset.fail=\u0e01\u0e32\u0e23\u0e1b\u0e25\u0e14\u0e25\u0e47\u0e2d\u0e01\u0e2a\u0e34\u0e19\u0e17\u0e23\u0e31\u0e1e\u0e22\u0e4c\u0e02\u0e2d\u0e07\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27
+c2c.ad.merchant.id.blank=\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e25\u0e02\u0e1c\u0e39\u0e49\u0e04\u0e49\u0e32\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e40\u0e27\u0e49\u0e19\u0e27\u0e48\u0e32\u0e07\u0e44\u0e14\u0e49
+c2c.userReceipt.add.repeat=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e2a\u0e33\u0e40\u0e23\u0e47\u0e08 \u0e01\u0e23\u0e38\u0e13\u0e32\u0e2d\u0e22\u0e48\u0e32\u0e2a\u0e48\u0e07\u0e0b\u0e49\u0e33
+
+c2c.ad.current.payway.empty=\u0e2a\u0e01\u0e38\u0e25\u0e40\u0e07\u0e34\u0e19\u0e17\u0e32\u0e07\u0e01\u0e32\u0e23\u0e1b\u0e31\u0e08\u0e08\u0e38\u0e1a\u0e31\u0e19\u0e22\u0e31\u0e07\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e0a\u0e48\u0e2d\u0e07\u0e17\u0e32\u0e07\u0e01\u0e32\u0e23\u0e0a\u0e33\u0e23\u0e30\u0e40\u0e07\u0e34\u0e19  
+c2c.order.create.tran.fail=\u0e04\u0e38\u0e13\u0e21\u0e35\u0e01\u0e32\u0e23\u0e17\u0e33\u0e18\u0e38\u0e23\u0e01\u0e23\u0e23\u0e21\u0e17\u0e35\u0e48\u0e01\u0e33\u0e25\u0e31\u0e07\u0e14\u0e33\u0e40\u0e19\u0e34\u0e19\u0e2d\u0e22\u0e39\u0e48 \u0e01\u0e23\u0e38\u0e13\u0e32\u0e14\u0e33\u0e40\u0e19\u0e34\u0e19\u0e01\u0e32\u0e23\u0e43\u0e2b\u0e49\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e01\u0e48\u0e2d\u0e19 \u0e2b\u0e25\u0e31\u0e07\u0e08\u0e32\u0e01\u0e19\u0e31\u0e49\u0e19\u0e08\u0e36\u0e07\u0e08\u0e30\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e17\u0e33\u0e18\u0e38\u0e23\u0e01\u0e23\u0e23\u0e21\u0e15\u0e48\u0e2d\u0e44\u0e14\u0e49  
+user.authentication.not.certified=\u0e01\u0e23\u0e38\u0e13\u0e32\u0e17\u0e33\u0e01\u0e32\u0e23\u0e22\u0e37\u0e19\u0e22\u0e31\u0e19\u0e15\u0e31\u0e27\u0e15\u0e19\u0e01\u0e48\u0e2d\u0e19  
+c2c.order.availableAmount.insufficient=\u0e2a\u0e34\u0e19\u0e17\u0e23\u0e31\u0e1e\u0e22\u0e4c\u0e17\u0e35\u0e48\u0e43\u0e0a\u0e49\u0e44\u0e14\u0e49\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e15\u0e49\u0e2d\u0e07\u0e21\u0e32\u0e01\u0e01\u0e27\u0e48\u0e32\u0e08\u0e33\u0e19\u0e27\u0e19\u0e17\u0e35\u0e48\u0e08\u0e30\u0e02\u0e32\u0e22  
+c2c.order.param.adid=\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e25\u0e02\u0e42\u0e06\u0e29\u0e13\u0e32\u0e44\u0e21\u0e48\u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07  
+c2c.order.param.adid.invalid=\u0e42\u0e06\u0e29\u0e13\u0e32\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19\u0e44\u0e14\u0e49  
+c2c.order.direction.invalid=\u0e04\u0e48\u0e32\u0e1e\u0e32\u0e23\u0e32\u0e21\u0e34\u0e40\u0e15\u0e2d\u0e23\u0e4c direction \u0e44\u0e21\u0e48\u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07  
+c2c.order.buyer.seller.must.different=\u0e1c\u0e39\u0e49\u0e0b\u0e37\u0e49\u0e2d\u0e41\u0e25\u0e30\u0e1c\u0e39\u0e49\u0e02\u0e32\u0e22\u0e15\u0e49\u0e2d\u0e07\u0e44\u0e21\u0e48\u0e43\u0e0a\u0e48\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49\u0e04\u0e19\u0e40\u0e14\u0e35\u0e22\u0e27\u0e01\u0e31\u0e19  
+c2c.order.param.tranAmt.min=\u0e08\u0e33\u0e19\u0e27\u0e19\u0e40\u0e07\u0e34\u0e19\u0e43\u0e19\u0e01\u0e32\u0e23\u0e17\u0e33\u0e18\u0e38\u0e23\u0e01\u0e23\u0e23\u0e21\u0e15\u0e49\u0e2d\u0e07\u0e21\u0e32\u0e01\u0e01\u0e27\u0e48\u0e32\u0e02\u0e31\u0e49\u0e19\u0e15\u0e48\u0e33  
+c2c.order.param.tranAmt.max=\u0e08\u0e33\u0e19\u0e27\u0e19\u0e40\u0e07\u0e34\u0e19\u0e43\u0e19\u0e01\u0e32\u0e23\u0e17\u0e33\u0e18\u0e38\u0e23\u0e01\u0e23\u0e23\u0e21\u0e15\u0e49\u0e2d\u0e07\u0e19\u0e49\u0e2d\u0e22\u0e01\u0e27\u0e48\u0e32\u0e02\u0e31\u0e49\u0e19\u0e2a\u0e39\u0e07\u0e2a\u0e38\u0e14  
+c2c.order.update.asset.fail=\u0e2d\u0e31\u0e1b\u0e40\u0e14\u0e15\u0e2a\u0e34\u0e19\u0e17\u0e23\u0e31\u0e1e\u0e22\u0e4c\u0e02\u0e2d\u0e07\u0e1c\u0e39\u0e49\u0e02\u0e32\u0e22\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27  
+c2c.order.not.exist=\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e25\u0e02\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e0b\u0e37\u0e49\u0e2d\u0e44\u0e21\u0e48\u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07  
+c2c.order.status.end.not.cancel=\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e0b\u0e37\u0e49\u0e2d\u0e2a\u0e34\u0e49\u0e19\u0e2a\u0e38\u0e14\u0e41\u0e25\u0e49\u0e27 \u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01\u0e44\u0e14\u0e49  
+c2c.order.complain.not.cancel=\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e0b\u0e37\u0e49\u0e2d\u0e2d\u0e22\u0e39\u0e48\u0e23\u0e30\u0e2b\u0e27\u0e48\u0e32\u0e07\u0e01\u0e32\u0e23\u0e23\u0e49\u0e2d\u0e07\u0e40\u0e23\u0e35\u0e22\u0e19 \u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01\u0e44\u0e14\u0e49  
+c2c.order.sell.payed.not.cancel=\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e0b\u0e37\u0e49\u0e2d\u0e02\u0e32\u0e22\u0e44\u0e14\u0e49\u0e0a\u0e33\u0e23\u0e30\u0e40\u0e07\u0e34\u0e19\u0e41\u0e25\u0e49\u0e27 \u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01\u0e44\u0e14\u0e49  
+operation.fail.please.refresh=\u0e01\u0e32\u0e23\u0e14\u0e33\u0e40\u0e19\u0e34\u0e19\u0e01\u0e32\u0e23\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27 \u0e01\u0e23\u0e38\u0e13\u0e32\u0e23\u0e35\u0e40\u0e1f\u0e23\u0e0a\u0e41\u0e25\u0e49\u0e27\u0e25\u0e2d\u0e07\u0e43\u0e2b\u0e21\u0e48  
+c2c.seller.uid.not.empty=\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e25\u0e02\u0e1c\u0e39\u0e49\u0e02\u0e32\u0e22\u0e15\u0e49\u0e2d\u0e07\u0e44\u0e21\u0e48\u0e27\u0e48\u0e32\u0e07  
+c2c.order.log.fail=\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e0b\u0e37\u0e49\u0e2d\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27  
+c2c.order.update.fail=\u0e2d\u0e31\u0e1b\u0e40\u0e14\u0e15\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e0b\u0e37\u0e49\u0e2d\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27  
+c2c.order.pay.not.buyer=\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e43\u0e0a\u0e48\u0e1c\u0e39\u0e49\u0e0b\u0e37\u0e49\u0e2d  
+c2c.order.is.end=\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e0b\u0e37\u0e49\u0e2d\u0e2a\u0e34\u0e49\u0e19\u0e2a\u0e38\u0e14\u0e41\u0e25\u0e49\u0e27  
+c2c.order.uploadPayment.fail=\u0e2d\u0e31\u0e1b\u0e42\u0e2b\u0e25\u0e14\u0e2b\u0e25\u0e31\u0e01\u0e10\u0e32\u0e19\u0e01\u0e32\u0e23\u0e0a\u0e33\u0e23\u0e30\u0e40\u0e07\u0e34\u0e19\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27  
+c2c.order.pay.cert.id.invalid=\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e25\u0e02\u0e2b\u0e25\u0e31\u0e01\u0e10\u0e32\u0e19\u0e44\u0e21\u0e48\u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07  
+c2c.order.no.permission.view=\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e21\u0e35\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e4c\u0e43\u0e19\u0e01\u0e32\u0e23\u0e14\u0e39  
+c2c.order.status.complain.fail=\u0e2a\u0e16\u0e32\u0e19\u0e30\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e0b\u0e37\u0e49\u0e2d\u0e1b\u0e31\u0e08\u0e08\u0e38\u0e1a\u0e31\u0e19 ({0}) \u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e40\u0e23\u0e34\u0e48\u0e21\u0e23\u0e49\u0e2d\u0e07\u0e40\u0e23\u0e35\u0e22\u0e19\u0e44\u0e14\u0e49  
+c2c.complain.submit.fail=\u0e40\u0e23\u0e34\u0e48\u0e21\u0e23\u0e49\u0e2d\u0e07\u0e40\u0e23\u0e35\u0e22\u0e19\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27 \u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e43\u0e0a\u0e48\u0e1c\u0e39\u0e49\u0e0b\u0e37\u0e49\u0e2d\u0e2b\u0e23\u0e37\u0e2d\u0e1c\u0e39\u0e49\u0e02\u0e32\u0e22  
+c2c.order.not.buyer.seller=\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e43\u0e0a\u0e48\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49\u0e43\u0e19\u0e01\u0e32\u0e23\u0e17\u0e33\u0e18\u0e38\u0e23\u0e01\u0e23\u0e23\u0e21 \u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e40\u0e23\u0e34\u0e48\u0e21\u0e23\u0e49\u0e2d\u0e07\u0e40\u0e23\u0e35\u0e22\u0e19\u0e44\u0e14\u0e49  
+c2c.order.pay.update.fail=\u0e2d\u0e31\u0e1b\u0e40\u0e14\u0e15\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e0b\u0e37\u0e49\u0e2d\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27  
+c2c.order.complain.submit.fail=\u0e2a\u0e48\u0e07\u0e04\u0e33\u0e23\u0e49\u0e2d\u0e07\u0e40\u0e23\u0e35\u0e22\u0e19\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27  
+c2c.order.complain.not.exist=\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e25\u0e02\u0e23\u0e49\u0e2d\u0e07\u0e40\u0e23\u0e35\u0e22\u0e19\u0e44\u0e21\u0e48\u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07  
+c2c.complain.voucher.submit.fail=\u0e2a\u0e48\u0e07\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27 \u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e43\u0e0a\u0e48\u0e1c\u0e39\u0e49\u0e23\u0e49\u0e2d\u0e07\u0e40\u0e23\u0e35\u0e22\u0e19\u0e2b\u0e23\u0e37\u0e2d\u0e1c\u0e39\u0e49\u0e16\u0e39\u0e01\u0e23\u0e49\u0e2d\u0e07\u0e40\u0e23\u0e35\u0e22\u0e19  
+c2c.order.complain.remark.notEmpty=\u0e40\u0e2b\u0e15\u0e38\u0e1c\u0e25\u0e43\u0e19\u0e01\u0e32\u0e23\u0e23\u0e49\u0e2d\u0e07\u0e40\u0e23\u0e35\u0e22\u0e19\u0e15\u0e49\u0e2d\u0e07\u0e44\u0e21\u0e48\u0e27\u0e48\u0e32\u0e07  
+c2c.order.complain.remark.maxval=\u0e04\u0e33\u0e2d\u0e18\u0e34\u0e1a\u0e32\u0e22\u0e2a\u0e39\u0e07\u0e2a\u0e38\u0e14 250 \u0e15\u0e31\u0e27\u0e2d\u0e31\u0e01\u0e29\u0e23  
+c2c.order.complain.voucher.id.invalid=\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e25\u0e02\u0e2b\u0e25\u0e31\u0e01\u0e10\u0e32\u0e19\u0e23\u0e49\u0e2d\u0e07\u0e40\u0e23\u0e35\u0e22\u0e19\u0e44\u0e21\u0e48\u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07
+
+c2c.order.complain.voucher.is.end=\u0e01\u0e32\u0e23\u0e23\u0e49\u0e2d\u0e07\u0e40\u0e23\u0e35\u0e22\u0e19\u0e2a\u0e34\u0e49\u0e19\u0e2a\u0e38\u0e14\u0e41\u0e25\u0e49\u0e27
+c2c.order.complain.voucher.save.fail=\u0e01\u0e32\u0e23\u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01\u0e2b\u0e25\u0e31\u0e01\u0e10\u0e32\u0e19\u0e01\u0e32\u0e23\u0e23\u0e49\u0e2d\u0e07\u0e40\u0e23\u0e35\u0e22\u0e19\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27
+c2c.order.complain.voucher.update.fail=\u0e01\u0e32\u0e23\u0e41\u0e01\u0e49\u0e44\u0e02\u0e2b\u0e25\u0e31\u0e01\u0e10\u0e32\u0e19\u0e01\u0e32\u0e23\u0e23\u0e49\u0e2d\u0e07\u0e40\u0e23\u0e35\u0e22\u0e19\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27
+c2c.order.complainId.orderId.invalid=\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e25\u0e02\u0e23\u0e49\u0e2d\u0e07\u0e40\u0e23\u0e35\u0e22\u0e19\u0e2b\u0e23\u0e37\u0e2d\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e25\u0e02\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e0b\u0e37\u0e49\u0e2d\u0e44\u0e21\u0e48\u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07
+password.length.lt8=\u0e23\u0e2b\u0e31\u0e2a\u0e1c\u0e48\u0e32\u0e19\u0e15\u0e49\u0e2d\u0e07\u0e21\u0e35\u0e04\u0e27\u0e32\u0e21\u0e22\u0e32\u0e27\u0e44\u0e21\u0e48\u0e19\u0e49\u0e2d\u0e22\u0e01\u0e27\u0e48\u0e32 8 \u0e15\u0e31\u0e27\u0e2d\u0e31\u0e01\u0e29\u0e23
+password.length.gt32=\u0e23\u0e2b\u0e31\u0e2a\u0e1c\u0e48\u0e32\u0e19\u0e15\u0e49\u0e2d\u0e07\u0e21\u0e35\u0e04\u0e27\u0e32\u0e21\u0e22\u0e32\u0e27\u0e44\u0e21\u0e48\u0e40\u0e01\u0e34\u0e19 32 \u0e15\u0e31\u0e27\u0e2d\u0e31\u0e01\u0e29\u0e23
+password.must.include.digit.alpha.sc=\u0e23\u0e2b\u0e31\u0e2a\u0e1c\u0e48\u0e32\u0e19\u0e15\u0e49\u0e2d\u0e07\u0e1b\u0e23\u0e30\u0e01\u0e2d\u0e1a\u0e14\u0e49\u0e27\u0e22\u0e15\u0e31\u0e27\u0e40\u0e25\u0e02 \u0e15\u0e31\u0e27\u0e2d\u0e31\u0e01\u0e29\u0e23\u0e1e\u0e34\u0e21\u0e1e\u0e4c\u0e43\u0e2b\u0e0d\u0e48 \u0e1e\u0e34\u0e21\u0e1e\u0e4c\u0e40\u0e25\u0e47\u0e01 \u0e41\u0e25\u0e30\u0e2d\u0e31\u0e01\u0e02\u0e23\u0e30\u0e1e\u0e34\u0e40\u0e28\u0e29
+c2c.ad.legalCoin.notset=\u0e2a\u0e01\u0e38\u0e25\u0e40\u0e07\u0e34\u0e19\u0e15\u0e32\u0e21\u0e01\u0e0e\u0e2b\u0e21\u0e32\u0e22\u0e1b\u0e31\u0e08\u0e08\u0e38\u0e1a\u0e31\u0e19\u0e22\u0e31\u0e07\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32
+c2c.order.availableAmount.buzu=\u0e2a\u0e34\u0e19\u0e17\u0e23\u0e31\u0e1e\u0e22\u0e4c\u0e17\u0e35\u0e48\u0e43\u0e0a\u0e49\u0e44\u0e14\u0e49\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e40\u0e1e\u0e35\u0e22\u0e07\u0e1e\u0e2d
+c2c.order.not.seller=\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e43\u0e0a\u0e48\u0e1c\u0e39\u0e49\u0e02\u0e32\u0e22
+c2c.userReceipt.id.invalid=\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e25\u0e02\u0e44\u0e21\u0e48\u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07
+c2c.order.complainId.orderId.all.empty=\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e25\u0e02\u0e23\u0e49\u0e2d\u0e07\u0e40\u0e23\u0e35\u0e22\u0e19\u0e41\u0e25\u0e30\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e25\u0e02\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e0b\u0e37\u0e49\u0e2d\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e40\u0e27\u0e49\u0e19\u0e27\u0e48\u0e32\u0e07\u0e44\u0e14\u0e49\u0e17\u0e31\u0e49\u0e07\u0e04\u0e39\u0e48
+

+ 134 - 0
qnfhq-api/src/main/resources/i18n/messages_tw.properties

@@ -0,0 +1,134 @@
+500=\u4f3a\u670d\u5668\u5167\u90e8\u7570\u5e38
+401=\u672a\u6388\u6b0a
+10001={0}\u4e0d\u80fd\u70ba\u7a7a
+10002=\u8cc7\u6599\u5eab\u4e2d\u5df2\u5b58\u5728\u8a72\u8a18\u9304
+10003=\u7372\u53d6\u53c3\u6578\u5931\u6557
+10004=\u5e33\u865f\u6216\u5bc6\u78bc\u932f\u8aa4
+10005=\u5e33\u865f\u5df2\u88ab\u505c\u7528
+10006=\u552f\u4e00\u6a19\u8b58\u4e0d\u80fd\u70ba\u7a7a
+10007=\u9a57\u8b49\u78bc\u4e0d\u6b63\u78ba
+10008=\u8acb\u5148\u522a\u9664\u5b50\u9078\u55ae\u6216\u6309\u9215
+10009=\u539f\u5bc6\u78bc\u4e0d\u6b63\u78ba
+10010=\u5e33\u865f\u4e0d\u5b58\u5728
+10011=\u4e0a\u7d1a\u90e8\u9580\u9078\u64c7\u932f\u8aa4
+10012=\u4e0a\u7d1a\u9078\u55ae\u4e0d\u80fd\u70ba\u81ea\u8eab
+10013=\u8cc7\u6599\u6b0a\u9650\u4ecb\u9762\uff0c\u53ea\u80fd\u662fMap\u985e\u578b\u53c3\u6578
+10014=\u8acb\u5148\u522a\u9664\u4e0b\u7d1a\u90e8\u9580
+10015=\u8acb\u5148\u522a\u9664\u90e8\u9580\u4e0b\u7684\u4f7f\u7528\u8005
+10019=\u8acb\u4e0a\u50b3\u6a94\u6848
+10020=token\u4e0d\u80fd\u70ba\u7a7a
+10021=token\u5931\u6548\uff0c\u8acb\u91cd\u65b0\u767b\u5165
+10022=\u5e33\u865f\u5df2\u88ab\u9396\u5b9a
+10024=\u4e0a\u50b3\u6a94\u6848\u5931\u6557{0}
+10027=Redis\u670d\u52d9\u7570\u5e38
+10028=\u5b9a\u6642\u4efb\u52d9\u5931\u6557
+10029=\u4e0d\u80fd\u5305\u542b\u975e\u6cd5\u5b57\u5143
+
+user.register.fail=\u8a3b\u518a\u5931\u6557
+user.register.success=\u8a3b\u518a\u6210\u529f
+user.register.code.err=\u9a57\u8b49\u78bc\u932f\u8aa4
+user.register.activecode.notexisit=\u63a8\u85a6\u78bc\u4e0d\u5b58\u5728
+user.register.email.format=\u96fb\u5b50\u90f5\u4ef6\u683c\u5f0f\u4e0d\u6b63\u78ba
+user.register.email.exisit=\u96fb\u5b50\u90f5\u4ef6\u5df2\u5b58\u5728
+user.register.phone.exist=\u624b\u6a5f\u865f\u78bc\u5df2\u5b58\u5728
+phone_code_empty=\u624b\u6a5f\u865f\u78bc\u4e0d\u80fd\u70ba\u7a7a\uff01
+user.code.send=\u9a57\u8b49\u78bc\u767c\u9001\u6210\u529f
+app.verification.email.code=\u9a57\u8b49\u78bc\u5df2\u767c\u9001\u5230\u60a8\u7684\u96fb\u5b50\u90f5\u4ef6\uff0c\u8acb\u6ce8\u610f\u67e5\u6536
+common.send.success=\u767c\u9001\u6210\u529f
+sms.template.not.exist=\u7c21\u8a0a\u7bc4\u672c\u4e0d\u5b58\u5728
+appUser.login.code.err=\u9a57\u8b49\u78bc\u932f\u8aa4
+appUser.loginName.or.password.err=\u5e33\u865f\u6216\u5bc6\u78bc\u932f\u8aa4
+user_is_black=\u60a8\u7684\u5e33\u865f\u5df2\u88ab\u5217\u5165\u9ed1\u540d\u55ae\uff0c\u7121\u6cd5\u767b\u5165\u3002
+appUser.login.success=\u767b\u5165\u6210\u529f
+user.not.login.err=\u672a\u767b\u5165
+user.not.exist=\u4f7f\u7528\u8005\u4e0d\u5b58\u5728
+code.try.times.limit=\u91cd\u8a66\u6b21\u6578\u904e\u591a
+user.sendcode.frequency.limit=\u9a57\u8b49\u78bc\u8acb\u6c42\u904e\u65bc\u983b\u7e41\uff0c\u8acb60\u79d2\u5f8c\u518d\u8a66
+user.email.send.fail=\u96fb\u5b50\u90f5\u4ef6\u767c\u9001\u5931\u6557
+system.busy.try.again.later=\u7cfb\u7d71\u7e41\u5fd9\uff0c\u8acb\u7a0d\u5f8c\u518d\u8a66
+user.register.phone.exisit=\u624b\u6a5f\u865f\u78bc\u5df2\u5b58\u5728
+appUser.loginName.or.password.err.limit.chance=\u5e33\u865f\u6216\u5bc6\u78bc\u932f\u8aa4\uff0c\u60a8\u9084\u6709{0}\u6b21\u6a5f\u6703
+pwd.fail.times.excess.hour.lock=\u5e33\u865f\u5df2\u9396\uff0c{0}\u5206\u9418\u5f8c\u89e3\u9396
+pwd.fail.times.excess.day.lock=\u5e33\u865f\u5df2\u9396\uff0c{0}\u5c0f\u6642\u5f8c\u89e3\u9396
+pwd.fail.times.excess.second.lock=\u5e33\u865f\u5df2\u9396\uff0c{0}\u79d2\u5f8c\u89e3\u9396
+user.register.email.must.lowerCase=\u8acb\u4f7f\u7528\u5c0f\u5beb\u96fb\u5b50\u90f5\u4ef6\u4e26\u6aa2\u67e5\u7a7a\u767d\u884c
+user.register.email.isTemp=\u6aa2\u6e2c\u5230\u81e8\u6642\u96fb\u5b50\u90f5\u4ef6\uff0c\u8acb\u4f7f\u7528\u5e38\u898b\u53ef\u4fe1\u96fb\u5b50\u90f5\u4ef6
+complete.mobile.bind=\u5b8c\u6210\u624b\u6a5f\u865f\u78bc\u7d81\u5b9a
+your.account.available.balance.insufficient=\u60a8\u7684\u8cc7\u91d1\u5e33\u6236\u81f3\u5c11\u61c9\u6709 {0}USDT\u7684\u53ef\u7528\u91d1\u984d
+
+complete.email.bind=\u5b8c\u6210\u90f5\u7bb1\u7d81\u5b9a
+complete.identity.verification=\u5b8c\u6210\u8eab\u4efd\u9a57\u8b49
+c2c.merchant.apply.not.config=\u672a\u914d\u7f6ec2c\u8a8d\u8b49\u5546\u5bb6\u4fdd\u8b49\u91d1
+merchant.param.direction.invalid=\u53c3\u6578direction\u503c\u4e0d\u6b63\u78ba
+merchant.ad.minAmount.bigger.zero=\u6700\u5c0f\u9650\u984d\u5fc5\u9808\u5927\u65bc0
+merchant.minAmount.smaller.maxAmount=\u6700\u5c0f\u9650\u984d\u5fc5\u9808\u5c0f\u65bc\u6700\u5927\u9650\u984d
+merchant.num.bigger.zero=\u6578\u91cf\u5fc5\u9808\u5927\u65bc0
+merchant.price.bigger.zero=\u50f9\u683c\u5fc5\u9808\u5927\u65bc0
+merchant.maxAmount.smaller.price.num=\u6700\u5927\u9650\u984d\u5fc5\u9808\u5c0f\u65bc\u50f9\u683c\u548c\u6578\u91cf\u4e4b\u7a4d
+c2cAd.price.must.bigger.set=\u50f9\u683c\u5fc5\u9808\u5927\u65bc{}
+c2cAd.price.must.small.set=\u50f9\u683c\u5fc5\u9808\u5c0f\u65bc{}
+c2cAd.minAmount.must.bigger.set=\u6700\u5c0f\u9650\u984d\u5fc5\u9808\u5927\u65bc{}
+c2cAd.maxAmount.must.small.set=\u6700\u5927\u9650\u984d\u5fc5\u9808\u5c0f\u65bc{}
+merchant.complete.merchant.apply=\u8acb\u5b8c\u6210\u8a8d\u8b49\u5546\u5bb6\u7533\u8acb
+merchant.under.review=\u8a8d\u8b49\u5546\u5bb6\u5be9\u6279\u4e2d
+merchant.under.lock=\u8a8d\u8b49\u5546\u5bb6\u9396\u5b9a\u4e2d
+merchant.approval.reject=\u8a8d\u8b49\u5546\u5bb6\u5be9\u6279\u4e0d\u901a\u904e
+merchant.buyCount.greater.sellCount=\u5e73\u53f0\u53ef\u7528\u8cc7\u7522\u5fc5\u9808\u5927\u65bc\u8ce3\u51fa\u6578\u91cf
+c2c.order.save.fail=\u4fdd\u5b58\u5ee3\u544a\u5931\u6557
+seller.asset.freeze.fail=\u51cd\u7d50\u8ce3\u5bb6\u8cc7\u7522\u5931\u6557
+c2c.ad.id.invalid=\u5ee3\u544a\u7de8\u865f\u7121\u6548
+c2c.ad.cannot.cancel=\u60a8\u7121\u6b0a\u53d6\u6d88\uff0c\u60a8\u4e0d\u662f\u5ee3\u544a\u65b9
+c2c.ad.exist.order.cancel=\u7576\u524d\u5ee3\u544a\u5b58\u5728\u9032\u884c\u4e2d\u7684\u8a02\u55ae\uff0c\u7121\u6cd5\u53d6\u6d88
+c2c.ad.cancel.fail=\u53d6\u6d88\u5ee3\u544a\u5931\u6557
+c2c.user.occupied.asset.fail=\u7528\u6236\u8cc7\u7522\u89e3\u51cd\u5931\u6557
+c2c.ad.merchant.id.blank=\u5546\u5bb6\u7de8\u865f\u4e0d\u80fd\u7a7a
+c2c.userReceipt.add.repeat=\u6dfb\u52a0\u6210\u529f\uff0c\u8acb\u52ff\u91cd\u8907\u63d0\u4ea4
+
+c2c.ad.current.payway.empty=\u7576\u524d\u6cd5\u5e63\u672a\u8a2d\u7f6e\u652f\u4ed8\u65b9\u5f0f
+c2c.order.create.tran.fail=\u60a8\u6709\u4e00\u7b46\u6b63\u5728\u9032\u884c\u4e2d\u7684\u4ea4\u6613\uff0c\u8acb\u5148\u8655\u7406\u3002\u8655\u7406\u5b8c\u6210\u5f8c\uff0c\u53ef\u7e7c\u7e8c\u4ea4\u6613\u3002
+user.authentication.not.certified=\u8acb\u5148\u9032\u884c\u5be6\u540d\u8a8d\u8b49
+c2c.order.availableAmount.insufficient=\u60a8\u7684\u53ef\u7528\u8cc7\u7522\u5fc5\u9808\u5927\u65bc\u8ce3\u51fa\u6578\u91cf
+c2c.order.param.adid=\u5ee3\u544a\u7de8\u865f\u7121\u6548
+c2c.order.param.adid.invalid=\u5ee3\u544a\u5df2\u4e0d\u53ef\u7528
+c2c.order.direction.invalid=\u53c3\u6578direction\u503c\u4e0d\u6b63\u78ba
+c2c.order.buyer.seller.must.different=\u8cb7\u5bb6\u548c\u8ce3\u5bb6\u4e0d\u80fd\u662f\u540c\u4e00\u500b\u7528\u6236
+c2c.order.param.tranAmt.min=\u4ea4\u6613\u91d1\u984d\u5fc5\u9808\u5927\u65bc\u6700\u5c0f\u9650\u984d
+c2c.order.param.tranAmt.max=\u4ea4\u6613\u91d1\u984d\u5fc5\u9808\u5c0f\u65bc\u6700\u5927\u9650\u984d
+c2c.order.update.asset.fail=\u66f4\u65b0\u8ce3\u5bb6\u8cc7\u7522\u5931\u6557
+c2c.order.not.exist=\u8a02\u55ae\u7de8\u865f\u7121\u6548
+c2c.order.status.end.not.cancel=\u8a02\u55ae\u5df2\u7d50\u675f\u4e0d\u80fd\u53d6\u6d88
+c2c.order.complain.not.cancel=\u8a02\u55ae\u7533\u8a34\u4e2d\u4e0d\u80fd\u53d6\u6d88
+c2c.order.sell.payed.not.cancel=\u8ce3\u51fa\u8a02\u55ae\u5df2\u4ed8\u6b3e\u4e0d\u80fd\u53d6\u6d88
+operation.fail.please.refresh=\u64cd\u4f5c\u5931\u6557\uff0c\u8acb\u5237\u65b0\u5f8c\u91cd\u8a66
+c2c.seller.uid.not.empty=\u8ce3\u5bb6\u7de8\u865f\u4e0d\u80fd\u7a7a
+c2c.order.log.fail=\u63d2\u5165\u8a02\u55ae\u65e5\u8a8c\u5931\u6557
+c2c.order.update.fail=\u66f4\u65b0\u8a02\u55ae\u5931\u6557
+c2c.order.pay.not.buyer=\u60a8\u4e0d\u662f\u8cb7\u5bb6
+c2c.order.is.end=\u8a02\u55ae\u5df2\u7d50\u675f
+c2c.order.uploadPayment.fail=\u4e0a\u50b3\u4ed8\u6b3e\u6191\u8b49\u5931\u6557
+c2c.order.pay.cert.id.invalid=\u6191\u8b49\u7de8\u865f\u7121\u6548
+c2c.order.no.permission.view=\u60a8\u7121\u6b0a\u67e5\u770b
+c2c.order.status.complain.fail=\u7576\u524d\u8a02\u55ae\u72c0\u614b({0})\u4e0d\u80fd\u767c\u8d77\u7533\u8a34
+c2c.complain.submit.fail=\u767c\u8d77\u7533\u8a34\u5931\u6557\uff0c\u60a8\u4e0d\u662f\u8cb7\u5bb6\u6216\u8ce3\u5bb6
+c2c.order.not.buyer.seller=\u60a8\u4e0d\u662f\u4ea4\u6613\u7528\u6236\uff0c\u4e0d\u80fd\u767c\u8d77\u7533\u8a34
+c2c.order.pay.update.fail=\u8a02\u55ae\u66f4\u65b0\u5931\u6557
+c2c.order.complain.submit.fail=\u63d0\u4ea4\u7533\u8a34\u5931\u6557
+c2c.order.complain.not.exist=\u7533\u8a34\u7de8\u865f\u7121\u6548
+c2c.complain.voucher.submit.fail=\u63d0\u4ea4\u5931\u6557\uff0c\u60a8\u4e0d\u662f\u7533\u8a34\u4eba\u6216\u88ab\u7533\u8a34\u4eba
+c2c.order.complain.remark.notEmpty=\u7533\u8a34\u539f\u56e0\u4e0d\u80fd\u7a7a
+c2c.order.complain.remark.maxval=\u63cf\u8ff0\u6700\u591a250\u500b\u5b57
+c2c.order.complain.voucher.id.invalid=\u7533\u8a34\u6191\u8b49\u7de8\u865f\u7121\u6548
+
+c2c.order.complain.voucher.is.end=\u7533\u8a34\u5df2\u7d50\u675f
+c2c.order.complain.voucher.save.fail=\u4fdd\u5b58\u7533\u8a34\u6191\u8b49\u5931\u6557
+c2c.order.complain.voucher.update.fail=\u4fee\u6539\u7533\u8a34\u6191\u8b49\u5931\u6557
+c2c.order.complainId.orderId.invalid=\u7533\u8a34\u7de8\u865f\u6216\u8a02\u55ae\u7de8\u865f\u7121\u6548
+password.length.lt8=\u5bc6\u78bc\u9577\u5ea6\u4e0d\u80fd\u5c11\u65bc8\u4f4d
+password.length.gt32=\u5bc6\u78bc\u9577\u5ea6\u4e0d\u80fd\u8d85\u904e32\u4f4d
+password.must.include.digit.alpha.sc=\u5bc6\u78bc\u5fc5\u9808\u5305\u542b\u6578\u5b57\u3001\u5927\u5c0f\u5beb\u5b57\u6bcd\u3001\u7279\u6b8a\u5b57\u7b26
+c2c.ad.legalCoin.notset=\u7576\u524d\u6cd5\u5e63\u672a\u8a2d\u7f6e
+c2c.order.availableAmount.buzu=\u60a8\u7684\u53ef\u7528\u8cc7\u7522\u4e0d\u8db3
+c2c.order.not.seller=\u60a8\u4e0d\u662f\u8ce3\u5bb6
+c2c.userReceipt.id.invalid=\u7de8\u865f\u7121\u6548
+c2c.order.complainId.orderId.all.empty=\u7533\u8a34\u7de8\u865f\u3001\u8a02\u55ae\u7de8\u865f\u4e0d\u80fd\u90fd\u70ba\u7a7a
+

+ 133 - 0
qnfhq-api/src/main/resources/i18n/messages_vi.properties

@@ -0,0 +1,133 @@
+500=L\u1ed7i n\u1ed9i b\u1ed9 m\u00e1y ch\u1ee7
+401=Kh\u00f4ng \u0111\u01b0\u1ee3c ph\u00e9p
+10001={0} kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1ec3 tr\u1ed1ng
+10002=B\u1ea3n ghi \u0111\u00e3 t\u1ed3n t\u1ea1i trong c\u01a1 s\u1edf d\u1eef li\u1ec7u
+10003=L\u1ea5y tham s\u1ed1 th\u1ea5t b\u1ea1i
+10004=T\u00e0i kho\u1ea3n ho\u1eb7c m\u1eadt kh\u1ea9u sai
+10005=T\u00e0i kho\u1ea3n \u0111\u00e3 b\u1ecb v\u00f4 hi\u1ec7u h\u00f3a
+10006=Ch\u1ec9 \u0111\u1ecbnh duy nh\u1ea5t kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1ec3 tr\u1ed1ng
+10007=M\u00e3 x\u00e1c nh\u1eadn kh\u00f4ng ch\u00ednh x\u00e1c
+10008=Vui l\u00f2ng x\u00f3a tr\u01b0\u1edbc c\u00e1c menu con ho\u1eb7c n\u00fat
+10009=M\u1eadt kh\u1ea9u c\u0169 kh\u00f4ng ch\u00ednh x\u00e1c
+10010=T\u00e0i kho\u1ea3n kh\u00f4ng t\u1ed3n t\u1ea1i
+10011=L\u1ef1a ch\u1ecdn ph\u00f2ng ban c\u1ea5p tr\u00ean sai
+10012=Menu c\u1ea5p tr\u00ean kh\u00f4ng th\u1ec3 l\u00e0 ch\u00ednh n\u00f3
+10013=Giao di\u1ec7n quy\u1ec1n d\u1eef li\u1ec7u ch\u1ec9 \u0111\u01b0\u1ee3c ph\u00e9p l\u00e0 tham s\u1ed1 ki\u1ec3u Map
+10014=Vui l\u00f2ng x\u00f3a tr\u01b0\u1edbc c\u00e1c ph\u00f2ng ban c\u1ea5p d\u01b0\u1edbi
+10015=Vui l\u00f2ng x\u00f3a tr\u01b0\u1edbc ng\u01b0\u1eddi d\u00f9ng trong ph\u00f2ng ban
+10019=Vui l\u00f2ng t\u1ea3i l\u00ean t\u1eadp tin
+10020=Token kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1ec3 tr\u1ed1ng
+10021=Token h\u1ebft h\u1ea1n, vui l\u00f2ng \u0111\u0103ng nh\u1eadp l\u1ea1i
+10022=T\u00e0i kho\u1ea3n \u0111\u00e3 b\u1ecb kh\u00f3a
+10024=T\u1ea3i l\u00ean t\u1eadp tin th\u1ea5t b\u1ea1i {0}
+10027=D\u1ecbch v\u1ee5 Redis g\u1eb7p s\u1ef1 c\u1ed1
+10028=Nhi\u1ec7m v\u1ee5 \u0111\u1ecbnh th\u1eddi th\u1ea5t b\u1ea1i
+10029=Kh\u00f4ng \u0111\u01b0\u1ee3c ch\u1ee9a k\u00fd t\u1ef1 kh\u00f4ng h\u1ee3p l\u1ec7
+
+user.register.fail=\u0110\u0103ng k\u00fd th\u1ea5t b\u1ea1i
+user.register.success=\u0110\u0103ng k\u00fd th\u00e0nh c\u00f4ng
+user.register.code.err=M\u00e3 x\u00e1c nh\u1eadn sai
+user.register.activecode.notexisit=M\u00e3 gi\u1edbi thi\u1ec7u kh\u00f4ng t\u1ed3n t\u1ea1i
+user.register.email.format=\u0110\u1ecbnh d\u1ea1ng email kh\u00f4ng \u0111\u00fang
+user.register.email.exisit=Email \u0111\u00e3 t\u1ed3n t\u1ea1i
+user.register.phone.exist=S\u1ed1 \u0111i\u1ec7n tho\u1ea1i \u0111\u00e3 t\u1ed3n t\u1ea1i
+phone_code_empty=S\u1ed1 \u0111i\u1ec7n tho\u1ea1i kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1ec3 tr\u1ed1ng!
+user.code.send=G\u1eedi m\u00e3 x\u00e1c nh\u1eadn th\u00e0nh c\u00f4ng
+app.verification.email.code=M\u00e3 x\u00e1c nh\u1eadn \u0111\u00e3 \u0111\u01b0\u1ee3c g\u1eedi \u0111\u1ebfn email c\u1ee7a b\u1ea1n, vui l\u00f2ng ki\u1ec3m tra
+common.send.success=G\u1eedi th\u00e0nh c\u00f4ng
+sms.template.not.exist=M\u1eabu tin nh\u1eafn kh\u00f4ng t\u1ed3n t\u1ea1i
+appUser.login.code.err=M\u00e3 x\u00e1c nh\u1eadn sai
+appUser.loginName.or.password.err=T\u00e0i kho\u1ea3n ho\u1eb7c m\u1eadt kh\u1ea9u sai
+user_is_black=T\u00e0i kho\u1ea3n c\u1ee7a b\u1ea1n \u0111\u00e3 b\u1ecb \u0111\u01b0a v\u00e0o danh s\u00e1ch \u0111en, kh\u00f4ng th\u1ec3 \u0111\u0103ng nh\u1eadp.
+appUser.login.success=\u0110\u0103ng nh\u1eadp th\u00e0nh c\u00f4ng
+user.not.login.err=Ch\u01b0a \u0111\u0103ng nh\u1eadp
+user.not.exist=Ng\u01b0\u1eddi d\u00f9ng kh\u00f4ng t\u1ed3n t\u1ea1i
+code.try.times.limit=Qu\u00e1 s\u1ed1 l\u1ea7n th\u1eed
+user.sendcode.frequency.limit=Y\u00eau c\u1ea7u m\u00e3 x\u00e1c nh\u1eadn qu\u00e1 th\u01b0\u1eddng xuy\u00ean, vui l\u00f2ng th\u1eed l\u1ea1i sau 60 gi\u00e2y
+user.email.send.fail=G\u1eedi email th\u1ea5t b\u1ea1i
+system.busy.try.again.later=H\u1ec7 th\u1ed1ng b\u1eadn, vui l\u00f2ng th\u1eed l\u1ea1i sau
+user.register.phone.exisit=S\u1ed1 \u0111i\u1ec7n tho\u1ea1i \u0111\u00e3 t\u1ed3n t\u1ea1i
+appUser.loginName.or.password.err.limit.chance=T\u00e0i kho\u1ea3n ho\u1eb7c m\u1eadt kh\u1ea9u sai, b\u1ea1n c\u00f2n {0} c\u01a1 h\u1ed9i
+pwd.fail.times.excess.hour.lock=T\u00e0i kho\u1ea3n \u0111\u00e3 b\u1ecb kh\u00f3a, s\u1ebd m\u1edf kh\u00f3a sau {0} ph\u00fat
+pwd.fail.times.excess.day.lock=T\u00e0i kho\u1ea3n \u0111\u00e3 b\u1ecb kh\u00f3a, s\u1ebd m\u1edf kh\u00f3a sau {0} gi\u1edd
+pwd.fail.times.excess.second.lock=T\u00e0i kho\u1ea3n \u0111\u00e3 b\u1ecb kh\u00f3a, s\u1ebd m\u1edf kh\u00f3a sau {0} gi\u00e2y
+user.register.email.must.lowerCase=Vui l\u00f2ng s\u1eed d\u1ee5ng email ch\u1eef th\u01b0\u1eddng v\u00e0 ki\u1ec3m tra d\u00f2ng tr\u1ed1ng
+user.register.email.isTemp=Ph\u00e1t hi\u1ec7n email t\u1ea1m th\u1eddi, vui l\u00f2ng s\u1eed d\u1ee5ng email ph\u1ed5 bi\u1ebfn v\u00e0 \u0111\u00e1ng tin c\u1eady
+complete.mobile.bind=Ho\u00e0n th\u00e0nh li\u00ean k\u1ebft s\u1ed1 \u0111i\u1ec7n tho\u1ea1i
+your.account.available.balance.insufficient=S\u1ed1 d\u01b0 kh\u1ea3 d\u1ee5ng trong t\u00e0i kho\u1ea3n c\u1ee7a b\u1ea1n ph\u1ea3i \u00edt nh\u1ea5t l\u00e0 {0} USDT
+complete.email.bind=Ho\u00e0n th\u00e0nh li\u00ean k\u1ebft email
+complete.identity.verification=Ho\u00e0n th\u00e0nh x\u00e1c minh danh t\u00ednh
+c2c.merchant.apply.not.config=Ch\u01b0a c\u1ea5u h\u00ecnh ti\u1ec1n \u0111\u1ea3m b\u1ea3o th\u01b0\u01a1ng nh\u00e2n x\u00e1c th\u1ef1c C2C
+merchant.param.direction.invalid=Gi\u00e1 tr\u1ecb tham s\u1ed1 direction kh\u00f4ng ch\u00ednh x\u00e1c
+merchant.ad.minAmount.bigger.zero=S\u1ed1 l\u01b0\u1ee3ng t\u1ed1i thi\u1ec3u ph\u1ea3i l\u1edbn h\u01a1n 0
+merchant.minAmount.smaller.maxAmount=S\u1ed1 l\u01b0\u1ee3ng t\u1ed1i thi\u1ec3u ph\u1ea3i nh\u1ecf h\u01a1n s\u1ed1 l\u01b0\u1ee3ng t\u1ed1i \u0111a
+merchant.num.bigger.zero=S\u1ed1 l\u01b0\u1ee3ng ph\u1ea3i l\u1edbn h\u01a1n 0
+merchant.price.bigger.zero=Gi\u00e1 ph\u1ea3i l\u1edbn h\u01a1n 0
+merchant.maxAmount.smaller.price.num=S\u1ed1 l\u01b0\u1ee3ng t\u1ed1i \u0111a ph\u1ea3i nh\u1ecf h\u01a1n t\u00edch c\u1ee7a gi\u00e1 v\u00e0 s\u1ed1 l\u01b0\u1ee3ng
+c2cAd.price.must.bigger.set=Gi\u00e1 ph\u1ea3i l\u1edbn h\u01a1n {}
+c2cAd.price.must.small.set=Gi\u00e1 ph\u1ea3i nh\u1ecf h\u01a1n {}
+c2cAd.minAmount.must.bigger.set=S\u1ed1 l\u01b0\u1ee3ng t\u1ed1i thi\u1ec3u ph\u1ea3i l\u1edbn h\u01a1n {}
+c2cAd.maxAmount.must.small.set=S\u1ed1 l\u01b0\u1ee3ng t\u1ed1i \u0111a ph\u1ea3i nh\u1ecf h\u01a1n {}
+merchant.complete.merchant.apply=Vui l\u00f2ng ho\u00e0n th\u00e0nh \u0111\u01a1n \u0111\u0103ng k\u00fd th\u01b0\u01a1ng nh\u00e2n x\u00e1c th\u1ef1c
+merchant.under.review=\u0110ang xem x\u00e9t ph\u00ea duy\u1ec7t th\u01b0\u01a1ng nh\u00e2n x\u00e1c th\u1ef1c
+merchant.under.lock=Th\u01b0\u01a1ng nh\u00e2n x\u00e1c th\u1ef1c \u0111ang b\u1ecb kh\u00f3a
+merchant.approval.reject=Ph\u00ea duy\u1ec7t th\u01b0\u01a1ng nh\u00e2n x\u00e1c th\u1ef1c kh\u00f4ng th\u00e0nh c\u00f4ng
+merchant.buyCount.greater.sellCount=T\u00e0i s\u1ea3n kh\u1ea3 d\u1ee5ng tr\u00ean n\u1ec1n t\u1ea3ng ph\u1ea3i l\u1edbn h\u01a1n s\u1ed1 l\u01b0\u1ee3ng b\u00e1n
+c2c.order.save.fail=L\u01b0u qu\u1ea3ng c\u00e1o th\u1ea5t b\u1ea1i
+seller.asset.freeze.fail=\u0110\u00f3ng b\u0103ng t\u00e0i s\u1ea3n ng\u01b0\u1eddi b\u00e1n th\u1ea5t b\u1ea1i
+c2c.ad.id.invalid=M\u00e3 qu\u1ea3ng c\u00e1o kh\u00f4ng h\u1ee3p l\u1ec7
+c2c.ad.cannot.cancel=B\u1ea1n kh\u00f4ng c\u00f3 quy\u1ec1n h\u1ee7y, b\u1ea1n kh\u00f4ng ph\u1ea3i l\u00e0 b\u00ean qu\u1ea3ng c\u00e1o
+c2c.ad.exist.order.cancel=Qu\u1ea3ng c\u00e1o hi\u1ec7n t\u1ea1i c\u00f3 \u0111\u01a1n h\u00e0ng \u0111ang ti\u1ebfn h\u00e0nh, kh\u00f4ng th\u1ec3 h\u1ee7y
+c2c.ad.cancel.fail=H\u1ee7y qu\u1ea3ng c\u00e1o th\u1ea5t b\u1ea1i
+c2c.user.occupied.asset.fail=Gi\u1ea3i ph\u00f3ng t\u00e0i s\u1ea3n ng\u01b0\u1eddi d\u00f9ng th\u1ea5t b\u1ea1i
+c2c.ad.merchant.id.blank=M\u00e3 th\u01b0\u01a1ng nh\u00e2n kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1ec3 tr\u1ed1ng
+c2c.userReceipt.add.repeat=Th\u00eam th\u00e0nh c\u00f4ng, vui l\u00f2ng kh\u00f4ng g\u1eedi l\u1ea1i d\u1eef li\u1ec7u tr\u00f9ng l\u1eb7p
+
+c2c.ad.current.payway.empty=Ph\u01b0\u01a1ng th\u1ee9c thanh to\u00e1n b\u1eb1ng ti\u1ec1n ph\u00e1p \u0111\u1ecbnh hi\u1ec7n t\u1ea1i ch\u01b0a \u0111\u01b0\u1ee3c thi\u1ebft l\u1eadp  
+c2c.order.create.tran.fail=B\u1ea1n c\u00f3 m\u1ed9t giao d\u1ecbch \u0111ang ti\u1ebfn h\u00e0nh, vui l\u00f2ng x\u1eed l\u00fd tr\u01b0\u1edbc. Sau khi x\u1eed l\u00fd xong, c\u00f3 th\u1ec3 ti\u1ebfp t\u1ee5c giao d\u1ecbch.  
+user.authentication.not.certified=Vui l\u00f2ng th\u1ef1c hi\u1ec7n x\u00e1c th\u1ef1c danh t\u00ednh tr\u01b0\u1edbc  
+c2c.order.availableAmount.insufficient=T\u00e0i s\u1ea3n kh\u1ea3 d\u1ee5ng c\u1ee7a b\u1ea1n ph\u1ea3i l\u1edbn h\u01a1n s\u1ed1 l\u01b0\u1ee3ng b\u00e1n  
+c2c.order.param.adid=M\u00e3 qu\u1ea3ng c\u00e1o kh\u00f4ng h\u1ee3p l\u1ec7  
+c2c.order.param.adid.invalid=Qu\u1ea3ng c\u00e1o kh\u00f4ng c\u00f2n kh\u1ea3 d\u1ee5ng  
+c2c.order.direction.invalid=Gi\u00e1 tr\u1ecb tham s\u1ed1 direction kh\u00f4ng ch\u00ednh x\u00e1c  
+c2c.order.buyer.seller.must.different=Ng\u01b0\u1eddi mua v\u00e0 ng\u01b0\u1eddi b\u00e1n kh\u00f4ng th\u1ec3 l\u00e0 c\u00f9ng m\u1ed9t ng\u01b0\u1eddi d\u00f9ng  
+c2c.order.param.tranAmt.min=S\u1ed1 ti\u1ec1n giao d\u1ecbch ph\u1ea3i l\u1edbn h\u01a1n gi\u1edbi h\u1ea1n t\u1ed1i thi\u1ec3u  
+c2c.order.param.tranAmt.max=S\u1ed1 ti\u1ec1n giao d\u1ecbch ph\u1ea3i nh\u1ecf h\u01a1n gi\u1edbi h\u1ea1n t\u1ed1i \u0111a  
+c2c.order.update.asset.fail=C\u1eadp nh\u1eadt t\u00e0i s\u1ea3n ng\u01b0\u1eddi b\u00e1n th\u1ea5t b\u1ea1i  
+c2c.order.not.exist=M\u00e3 \u0111\u01a1n h\u00e0ng kh\u00f4ng h\u1ee3p l\u1ec7  
+c2c.order.status.end.not.cancel=\u0110\u01a1n h\u00e0ng \u0111\u00e3 k\u1ebft th\u00fac kh\u00f4ng th\u1ec3 h\u1ee7y  
+c2c.order.complain.not.cancel=\u0110\u01a1n h\u00e0ng \u0111ang khi\u1ebfu n\u1ea1i kh\u00f4ng th\u1ec3 h\u1ee7y  
+c2c.order.sell.payed.not.cancel=\u0110\u01a1n h\u00e0ng b\u00e1n \u0111\u00e3 thanh to\u00e1n kh\u00f4ng th\u1ec3 h\u1ee7y  
+operation.fail.please.refresh=Thao t\u00e1c th\u1ea5t b\u1ea1i, vui l\u00f2ng l\u00e0m m\u1edbi v\u00e0 th\u1eed l\u1ea1i  
+c2c.seller.uid.not.empty=M\u00e3 ng\u01b0\u1eddi b\u00e1n kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1ec3 tr\u1ed1ng  
+c2c.order.log.fail=Ch\u00e8n nh\u1eadt k\u00fd \u0111\u01a1n h\u00e0ng th\u1ea5t b\u1ea1i  
+c2c.order.update.fail=C\u1eadp nh\u1eadt \u0111\u01a1n h\u00e0ng th\u1ea5t b\u1ea1i  
+c2c.order.pay.not.buyer=B\u1ea1n kh\u00f4ng ph\u1ea3i l\u00e0 ng\u01b0\u1eddi mua  
+c2c.order.is.end=\u0110\u01a1n h\u00e0ng \u0111\u00e3 k\u1ebft th\u00fac  
+c2c.order.uploadPayment.fail=T\u1ea3i l\u00ean ch\u1ee9ng t\u1eeb thanh to\u00e1n th\u1ea5t b\u1ea1i  
+c2c.order.pay.cert.id.invalid=M\u00e3 ch\u1ee9ng t\u1eeb kh\u00f4ng h\u1ee3p l\u1ec7  
+c2c.order.no.permission.view=B\u1ea1n kh\u00f4ng c\u00f3 quy\u1ec1n xem  
+c2c.order.status.complain.fail=Tr\u1ea1ng th\u00e1i \u0111\u01a1n h\u00e0ng hi\u1ec7n t\u1ea1i ({0}) kh\u00f4ng th\u1ec3 kh\u1edfi ki\u1ec7n  
+c2c.complain.submit.fail=Kh\u1edfi ki\u1ec7n th\u1ea5t b\u1ea1i, b\u1ea1n kh\u00f4ng ph\u1ea3i ng\u01b0\u1eddi mua ho\u1eb7c ng\u01b0\u1eddi b\u00e1n  
+c2c.order.not.buyer.seller=B\u1ea1n kh\u00f4ng ph\u1ea3i ng\u01b0\u1eddi tham gia giao d\u1ecbch, kh\u00f4ng th\u1ec3 kh\u1edfi ki\u1ec7n  
+c2c.order.pay.update.fail=C\u1eadp nh\u1eadt \u0111\u01a1n h\u00e0ng th\u1ea5t b\u1ea1i  
+c2c.order.complain.submit.fail=G\u1eedi kh\u1edfi ki\u1ec7n th\u1ea5t b\u1ea1i  
+c2c.order.complain.not.exist=M\u00e3 khi\u1ebfu n\u1ea1i kh\u00f4ng h\u1ee3p l\u1ec7  
+c2c.complain.voucher.submit.fail=G\u1eedi th\u1ea5t b\u1ea1i, b\u1ea1n kh\u00f4ng ph\u1ea3i ng\u01b0\u1eddi khi\u1ebfu n\u1ea1i ho\u1eb7c b\u1ecb khi\u1ebfu n\u1ea1i  
+c2c.order.complain.remark.notEmpty=L\u00fd do khi\u1ebfu n\u1ea1i kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1ec3 tr\u1ed1ng  
+c2c.order.complain.remark.maxval=M\u00f4 t\u1ea3 t\u1ed1i \u0111a 250 k\u00fd t\u1ef1  
+c2c.order.complain.voucher.id.invalid=M\u00e3 ch\u1ee9ng t\u1eeb khi\u1ebfu n\u1ea1i kh\u00f4ng h\u1ee3p l\u1ec7
+
+c2c.order.complain.voucher.is.end=Khi\u1ebfu n\u1ea1i \u0111\u00e3 k\u1ebft th\u00fac  
+c2c.order.complain.voucher.save.fail=L\u01b0u ch\u1ee9ng t\u1eeb khi\u1ebfu n\u1ea1i th\u1ea5t b\u1ea1i  
+c2c.order.complain.voucher.update.fail=C\u1eadp nh\u1eadt ch\u1ee9ng t\u1eeb khi\u1ebfu n\u1ea1i th\u1ea5t b\u1ea1i  
+c2c.order.complainId.orderId.invalid=M\u00e3 khi\u1ebfu n\u1ea1i ho\u1eb7c m\u00e3 \u0111\u01a1n h\u00e0ng kh\u00f4ng h\u1ee3p l\u1ec7  
+password.length.lt8=M\u1eadt kh\u1ea9u kh\u00f4ng \u0111\u01b0\u1ee3c \u00edt h\u01a1n 8 k\u00fd t\u1ef1  
+password.length.gt32=M\u1eadt kh\u1ea9u kh\u00f4ng \u0111\u01b0\u1ee3c v\u01b0\u1ee3t qu\u00e1 32 k\u00fd t\u1ef1  
+password.must.include.digit.alpha.sc=M\u1eadt kh\u1ea9u ph\u1ea3i bao g\u1ed3m ch\u1eef s\u1ed1, ch\u1eef c\u00e1i hoa th\u01b0\u1eddng v\u00e0 k\u00fd t\u1ef1 \u0111\u1eb7c bi\u1ec7t  
+c2c.ad.legalCoin.notset=Ti\u1ec1n ph\u00e1p \u0111\u1ecbnh hi\u1ec7n t\u1ea1i ch\u01b0a \u0111\u01b0\u1ee3c thi\u1ebft l\u1eadp  
+c2c.order.availableAmount.buzu=T\u00e0i s\u1ea3n kh\u1ea3 d\u1ee5ng c\u1ee7a b\u1ea1n kh\u00f4ng \u0111\u1ee7  
+c2c.order.not.seller=B\u1ea1n kh\u00f4ng ph\u1ea3i l\u00e0 ng\u01b0\u1eddi b\u00e1n  
+c2c.userReceipt.id.invalid=M\u00e3 kh\u00f4ng h\u1ee3p l\u1ec7  
+c2c.order.complainId.orderId.all.empty=M\u00e3 khi\u1ebfu n\u1ea1i v\u00e0 m\u00e3 \u0111\u01a1n h\u00e0ng kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1ec3 tr\u1ed1ng c\u00f9ng l\u00fac
+

+ 9 - 5
qnfhq-api/src/main/resources/i18n/messages_zh.properties

@@ -24,7 +24,6 @@
 10028=\u5b9a\u65f6\u4efb\u52a1\u5931\u8d25
 10029=\u4e0d\u80fd\u5305\u542b\u975e\u6cd5\u5b57\u7b26
 
-user.register.signtype.err=\u767b\u5f55\u7c7b\u578b\u9519\u8bef
 user.register.fail=\u6ce8\u518c\u5931\u8d25
 user.register.success=\u6ce8\u518c\u6210\u529f
 user.register.code.err=\u9a8c\u8bc1\u7801\u9519\u8bef
@@ -33,7 +32,6 @@ user.register.email.format=\u90AE\u7BB1\u683C\u5F0F\u4E0D\u6B63\u786E
 user.register.email.exisit=\u90AE\u7BB1\u5DF2\u5B58\u5728
 user.register.phone.exist=\u624B\u673A\u53F7\u5DF2\u7ECF\u5B58\u5728
 phone_code_empty=\u624B\u673A\u53F7\u4E0D\u80FD\u4E3A\u7A7A!
-email.code_empty=\u90AE\u7BB1\u4E0D\u80FD\u4E3A\u7A7A!
 user.code.send=\u9A8C\u8BC1\u7801\u53D1\u9001\u6210\u529F
 app.verification.email.code=\u9A8C\u8BC1\u7801\u5DF2\u53D1\u9001\u5230\u60A8\u7684\u90AE\u7BB1\uFF0C\u8BF7\u6CE8\u610F\u67E5\u6536
 common.send.success=\u53d1\u9001\u6210\u529f
@@ -55,13 +53,12 @@ pwd.fail.times.excess.day.lock=\u8d26\u53f7\u5df2\u9501\uff0c{0}\u5c0f\u65f6\u54
 pwd.fail.times.excess.second.lock=\u8d26\u53f7\u5df2\u9501\uff0c{0}\u79d2\u540e\u89e3\u9501
 user.register.email.must.lowerCase=\u8bf7\u4f7f\u7528\u5c0f\u5199\u90ae\u7bb1\u5e76\u68c0\u67e5\u7a7a\u767d\u884c
 user.register.email.isTemp=\u68c0\u6d4b\u5230\u4e34\u65f6\u90ae\u7bb1\uff0c\u8bf7\u4f7f\u7528\u5e38\u89c1\u53ef\u4fe1\u90ae\u7bb1
-
 complete.mobile.bind=\u5b8c\u6210\u624b\u673a\u53f7\u7ed1\u5b9a
 your.account.available.balance.insufficient=\u60a8\u7684\u8d44\u91d1\u8d26\u6237\u81f3\u5c11\u5e94\u6709 {0}USDT\u7684\u53ef\u7528\u91d1\u989d
+
 complete.email.bind=\u5b8c\u6210\u90ae\u7bb1\u7ed1\u5b9a
 complete.identity.verification=\u5b8c\u6210\u8eab\u4efd\u9a8c\u8bc1
 c2c.merchant.apply.not.config=\u672a\u914d\u7f6ec2c\u8ba4\u8bc1\u5546\u5bb6\u4fdd\u8bc1\u91d1
-
 merchant.param.direction.invalid=\u53c2\u6570direction\u503c\u4e0d\u6b63\u786e
 merchant.ad.minAmount.bigger.zero=\u6700\u5c0f\u9650\u989d\u5fc5\u987b\u5927\u4e8e0
 merchant.minAmount.smaller.maxAmount=\u6700\u5c0f\u9650\u989d\u5fc5\u987b\u5c0f\u4e8e\u6700\u5927\u9650\u989d
@@ -87,6 +84,7 @@ c2c.user.occupied.asset.fail=\u7528\u6237\u8d44\u4ea7\u89e3\u51bb\u5931\u8d25
 c2c.ad.merchant.id.blank=\u5546\u5bb6\u7f16\u53f7\u4e0d\u80fd\u7a7a
 c2c.userReceipt.add.repeat=\u6dfb\u52a0\u6210\u529f\uff0c\u8bf7\u52ff\u91cd\u590d\u63d0\u4ea4
 
+
 c2c.ad.current.payway.empty=\u5f53\u524d\u6cd5\u5e01\u672a\u8bbe\u7f6e\u652f\u4ed8\u65b9\u5f0f
 c2c.order.create.tran.fail=\u60a8\u6709\u4e00\u7b14\u6b63\u5728\u8fdb\u884c\u4e2d\u7684\u4ea4\u6613\uff0c\u8bf7\u5148\u5904\u7406\u3002\u5904\u7406\u5b8c\u6210\u540e\uff0c\u53ef\u7ee7\u7eed\u4ea4\u6613\u3002
 user.authentication.not.certified=\u8bf7\u5148\u8fdb\u884c\u5b9e\u540d\u8ba4\u8bc1
@@ -97,7 +95,6 @@ c2c.order.direction.invalid=\u53c2\u6570direction\u503c\u4e0d\u6b63\u786e
 c2c.order.buyer.seller.must.different=\u4e70\u5bb6\u548c\u5356\u5bb6\u4e0d\u80fd\u662f\u540c\u4e00\u4e2a\u7528\u6237
 c2c.order.param.tranAmt.min=\u4ea4\u6613\u91d1\u989d\u5fc5\u987b\u5927\u4e8e\u6700\u5c0f\u9650\u989d
 c2c.order.param.tranAmt.max=\u4ea4\u6613\u91d1\u989d\u5fc5\u987b\u5c0f\u4e8e\u6700\u5927\u9650\u989d
-c2c.order.symbolNum.over.avail=\u4ea4\u6613\u6570\u91cf\u8d85\u8fc7\u53ef\u7528\u6570\u91cf
 c2c.order.update.asset.fail=\u66f4\u65b0\u5356\u5bb6\u8d44\u4ea7\u5931\u8d25
 c2c.order.not.exist=\u8ba2\u5355\u7f16\u53f7\u65e0\u6548
 c2c.order.status.end.not.cancel=\u8ba2\u5355\u5df2\u7ed3\u675f\u4e0d\u80fd\u53d6\u6d88
@@ -122,6 +119,7 @@ c2c.complain.voucher.submit.fail=\u63d0\u4ea4\u5931\u8d25\uff0c\u60a8\u4e0d\u662
 c2c.order.complain.remark.notEmpty=\u7533\u8bc9\u539f\u56e0\u4e0d\u80fd\u7a7a
 c2c.order.complain.remark.maxval=\u63cf\u8ff0\u6700\u591a250\u4e2a\u5b57
 c2c.order.complain.voucher.id.invalid=\u7533\u8bc9\u51ed\u8bc1\u7f16\u53f7\u65e0\u6548
+
 c2c.order.complain.voucher.is.end=\u7533\u8bc9\u5df2\u7ed3\u675f
 c2c.order.complain.voucher.save.fail=\u4fdd\u5b58\u7533\u8bc9\u51ed\u8bc1\u5931\u8d25
 c2c.order.complain.voucher.update.fail=\u4fee\u6539\u7533\u8bc9\u51ed\u8bc1\u5931\u8d25
@@ -129,4 +127,10 @@ c2c.order.complainId.orderId.invalid=\u7533\u8bc9\u7f16\u53f7\u6216\u8ba2\u5355\
 password.length.lt8=\u5bc6\u7801\u957f\u5ea6\u4e0d\u80fd\u5c11\u4e8e8\u4f4d
 password.length.gt32=\u5bc6\u7801\u957f\u5ea6\u4e0d\u80fd\u8d85\u8fc732\u4f4d
 password.must.include.digit.alpha.sc=\u5bc6\u7801\u5fc5\u987b\u5305\u542b\u6570\u5b57\u3001\u5927\u5c0f\u5199\u5b57\u6bcd\u3001\u7279\u6b8a\u5b57\u7b26
+c2c.ad.legalCoin.notset=\u5f53\u524d\u6cd5\u5e01\u672a\u8bbe\u7f6e
+c2c.order.availableAmount.buzu=\u60a8\u7684\u53ef\u7528\u8d44\u4ea7\u4e0d\u8db3
+c2c.order.not.seller=\u60a8\u4e0d\u662f\u5356\u5bb6
+c2c.userReceipt.id.invalid=\u7f16\u53f7\u65e0\u6548
+c2c.order.complainId.orderId.all.empty=\u7533\u8bc9\u7f16\u53f7\u3001\u8ba2\u5355\u7f16\u53f7\u4e0d\u80fd\u90fd\u4e3a\u7a7a
+
 

+ 47 - 1
qnfhq-api/src/main/resources/mapper/c2c/C2cOrderDao.xml

@@ -27,5 +27,51 @@
         <result property="expireTime" column="expire_time"/>
     </resultMap>
 
-
+    <insert id="insertC2cOrder" parameterType="com.qnfhq.modules.c2c.entity.C2cOrderEntity" useGeneratedKeys="true" keyProperty="id">
+        insert into c2c_order
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="orderNo != null">order_no,</if>
+            <if test="userId != null">user_id,</if>
+            <if test="userName != null">user_name,</if>
+            <if test="direction != null">direction,</if>
+            <if test="legalCoin != null">legal_coin,</if>
+            <if test="symbol != null">symbol,</if>
+            <if test="c2cAdId != null">c2c_ad_id,</if>
+            <if test="tranUserId != null">tran_user_id,</if>
+            <if test="tranUserName != null">tran_user_name,</if>
+            <if test="tranPrice != null">tran_price,</if>
+            <if test="symbolNum != null">symbol_num,</if>
+            <if test="tranAmount != null">tran_amount,</if>
+            <if test="payType != null">pay_type,</if>
+            <if test="flow != null">flow,</if>
+            <if test="status != null">status,</if>
+            <if test="remark != null">remark,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="endTime != null">end_time,</if>
+            expire_time,
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="orderNo != null">#{orderNo},</if>
+            <if test="userId != null">#{userId},</if>
+            <if test="userName != null">#{userName},</if>
+            <if test="direction != null">#{direction},</if>
+            <if test="legalCoin != null">#{legalCoin},</if>
+            <if test="symbol != null">#{symbol},</if>
+            <if test="c2cAdId != null">#{c2cAdId},</if>
+            <if test="tranUserId != null">#{tranUserId},</if>
+            <if test="tranUserName != null">#{tranUserName},</if>
+            <if test="tranPrice != null">#{tranPrice},</if>
+            <if test="symbolNum != null">#{symbolNum},</if>
+            <if test="tranAmount != null">#{tranAmount},</if>
+            <if test="payType != null">#{payType},</if>
+            <if test="flow != null">#{flow},</if>
+            <if test="status != null">#{status},</if>
+            <if test="remark != null">#{remark},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="endTime != null">#{endTime},</if>
+            UNIX_TIMESTAMP()+1800
+        </trim>
+    </insert>
 </mapper>

+ 4 - 4
qnfhq-api/src/main/resources/mapper/user/AppAssetDao.xml

@@ -44,8 +44,8 @@
     <update id="addAssetByUserId" parameterType="java.util.Map">
         update t_app_asset
         <set>
-            amout = amout + #{money},
-            available_amount=available_amount + #{money},
+            total = total + #{money},
+            available=available + #{money},
             update_time = now()
         </set>
         where user_id = #{userId} and symbol =#{symbol} and type=#{type}
@@ -55,8 +55,8 @@
     <update id="releaseAssetByUserId" parameterType="java.util.Map">
         update t_app_asset
         <set>
-            amout = amout - #{money},
-            occupied_amount=occupied_amount - #{money},
+            total = total - #{money},
+            frozen=frozen - #{money},
             update_time = now()
         </set>
         where user_id = #{userId} and symbol =#{symbol} and type=#{type}

+ 17 - 0
qnfhq-common/src/main/java/com/qnfhq/common/utils/IpUtils.java

@@ -10,6 +10,9 @@ import org.lionsoul.ip2region.Util;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.core.io.ClassPathResource;
+import org.springframework.web.context.request.RequestAttributes;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
 
 import java.io.InputStream;
 import java.lang.reflect.Method;
@@ -23,6 +26,20 @@ import java.lang.reflect.Method;
 public class IpUtils {
 	private static Logger logger = LoggerFactory.getLogger(IpUtils.class);
 
+    /**
+     * 获取客户端IP
+     *
+     * @return IP地址
+     */
+    public static String getIpAddr()
+    {
+        RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
+        ServletRequestAttributes request = (ServletRequestAttributes) attributes;
+        return getIpAddr(request.getRequest());
+    }
+
+
+
 	/**
 	 * 获取IP地址
 	 *