1
zj
2025-07-10 37670b2ff5379e8603d3b0eec6d493daf2d6cfcb
1
30 files modified
3 files added
597 ■■■■■ changed files
pom.xml 11 ●●●●● patch | view | raw | blame | history
src/main/java/com/nq/controller/AdminApiController.java 119 ●●●●● patch | view | raw | blame | history
src/main/java/com/nq/controller/UserPositionCheckDzController.java 4 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/controller/echo/EChoController.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/nq/controller/protol/UserController.java 80 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/enums/EStockType.java 36 ●●●●● patch | view | raw | blame | history
src/main/java/com/nq/pojo/GoogleAuthDto.java 14 ●●●●● patch | view | raw | blame | history
src/main/java/com/nq/pojo/SiteAdmin.java 11 ●●●●● patch | view | raw | blame | history
src/main/java/com/nq/pojo/UnbindingGoogleAuthModel.java 17 ●●●●● patch | view | raw | blame | history
src/main/java/com/nq/pojo/UpdateGoogleAuthDto.java 21 ●●●●● patch | view | raw | blame | history
src/main/java/com/nq/service/ISiteAdminService.java 6 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/service/impl/EchoServices.java 4 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/service/impl/PayServiceImpl.java 4 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/service/impl/PriceServicesImpl.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/nq/service/impl/SiteAdminServiceImpl.java 68 ●●●●● patch | view | raw | blame | history
src/main/java/com/nq/service/impl/SiteInfoServiceImpl.java 36 ●●●●● patch | view | raw | blame | history
src/main/java/com/nq/service/impl/SiteNewsServiceImpl.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/nq/service/impl/StockDzServiceImpl.java 4 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/service/impl/StockServiceImpl.java 4 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/service/impl/TradingHourServiceImpl.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/nq/service/impl/UserPositionServiceImpl.java 18 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/service/impl/UserRechargeServiceImpl.java 6 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/service/impl/UserServiceImpl.java 15 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/service/impl/UserStockSubscribeServiceImpl.java 14 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/service/impl/UserWithdrawServiceImpl.java 6 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/utils/redis/RedisKeyUtil.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/nq/utils/task/news/NewsTask.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/nq/utils/task/stock/CarryPositionTask.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/nq/utils/task/stock/StockTask.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/nq/ws/WebSocketClientBeanConfig.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/nq/ws/WebsocketRunClient.java 6 ●●●● patch | view | raw | blame | history
src/main/resources/application.properties 65 ●●●● patch | view | raw | blame | history
src/main/resources/application.yml 10 ●●●● patch | view | raw | blame | history
pom.xml
@@ -25,7 +25,16 @@
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.4.1</version> <!-- 或最新版本 -->
        </dependency>
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>javase</artifactId>
            <version>3.4.1</version> <!-- 如果需要生成/解析二维码图片 -->
        </dependency>
        <dependency>
            <groupId>org.flywaydb</groupId>
src/main/java/com/nq/controller/AdminApiController.java
@@ -1,9 +1,13 @@
package com.nq.controller;
import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.extra.qrcode.QrConfig;
import com.google.common.collect.Maps;
import com.nq.common.ServerResponse;
import com.nq.pojo.SiteAdminIndex;
import com.nq.pojo.SiteSpread;
import com.nq.dao.SiteAdminMapper;
import com.nq.pojo.*;
import com.nq.service.*;
import com.nq.service.impl.GoogleAuthenticator;
import com.nq.utils.PropertiesUtil;
import com.nq.utils.redis.CookieUtils;
import com.nq.utils.redis.JsonUtil;
@@ -13,14 +17,19 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.validation.Valid;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.Map;
@Controller
@RequestMapping({"/api/admin/"})
@@ -29,6 +38,9 @@
    @Autowired
    ISiteAdminService iSiteAdminService;
    @Autowired
    SiteAdminMapper siteAdminMapper;
    @Autowired
    ISiteSettingService iSiteSettingService;
@@ -51,8 +63,13 @@
    //管理系统登录
    @RequestMapping({"login.do"})
    @ResponseBody
    public ServerResponse login(@RequestParam("adminPhone") String adminPhone, @RequestParam("adminPwd") String adminPwd, @RequestParam("verifyCode") String verifyCode, HttpSession httpSession, HttpServletRequest request, HttpServletResponse response) {
        ServerResponse serverResponse = this.iSiteAdminService.login(adminPhone, adminPwd, verifyCode, request);
    public ServerResponse login(@RequestParam("adminPhone") String adminPhone,
                                @RequestParam("adminPwd") String adminPwd,
                                @RequestParam("verifyCode") String verifyCode,
                                @RequestParam(value = "googleAuthCode", required = false) Integer googleAuthCode,
                                HttpSession httpSession, HttpServletRequest request,
                                HttpServletResponse response) {
        ServerResponse serverResponse = this.iSiteAdminService.login(adminPhone, adminPwd, verifyCode, googleAuthCode,request);
        return serverResponse;
    }
@@ -125,8 +142,96 @@
    }
    /**
     * 获取当前登录用户
     * @return
     */
    @GetMapping("getAdmin")
    @ResponseBody
    public ServerResponse getAdmin(HttpServletRequest request) {
        String cookie_name = PropertiesUtil.getProperty("admin.cookie.name");
        SiteAdmin siteAdmin = null;
        if(StringUtils.isNotEmpty(cookie_name)){
            String logintoken = CookieUtils.readLoginToken(request, cookie_name);
            String adminJson = RedisShardedPoolUtils.get(logintoken);
            siteAdmin = (SiteAdmin) JsonUtil.string2Obj(adminJson, SiteAdmin.class);
            siteAdmin = siteAdminMapper.selectById(siteAdmin.getId());
        }
        return ServerResponse.createBySuccess(siteAdmin);
    }
    /**
     * 获取谷歌验证码密钥
     * @return
     */
    @GetMapping("getLoginGoogleAuthSecret")
    @ResponseBody
    public ServerResponse getLoginGoogleAuthSecret(HttpServletRequest request) {
        GoogleAuthDto dto = iSiteAdminService.getGoogleAuth(request);
        return ServerResponse.createBySuccess(dto);
    }
    /**
     * 绑定谷歌验证码
     */
    @PostMapping("bindGoogleAuth")
    @ResponseBody
    public ServerResponse updateGoogleAuth(@RequestParam("id") String id,
                                           @RequestParam("googleAuthCode") String googleAuthCode,
                                           @RequestParam("secret") String secret) {
        SiteAdmin siteAdmin = siteAdminMapper.selectById(id);
        if (siteAdmin == null) {
            return ServerResponse.createByErrorMsg("当前用户未找到");
        }
        long t = System.currentTimeMillis();
        GoogleAuthenticator ga = new GoogleAuthenticator();
        ga.setWindowSize(5);
        if (siteAdmin.getGoogleAuthBind()) {
            return ServerResponse.createByErrorMsg("谷歌验证码已绑定");
        }
        boolean userFlag = ga.check_code(secret, Long.valueOf(googleAuthCode), t);
        if (!userFlag) {
            return ServerResponse.createByErrorMsg("谷歌验证码错误");
        }
        siteAdmin.setGoogleAuthBind(true);
        siteAdmin.setGoogleAuthSecret(secret);
        siteAdminMapper.updateById(siteAdmin);
        return ServerResponse.createBySuccess();
    }
    /**
     * 解绑谷歌验证码
     * @param param
     * @return
     */
    @PostMapping("/unbindingGoogleAuth")
    @ResponseBody
    public ServerResponse unbindingGoogleAuth(@RequestParam("id") String id,
                                              @RequestParam("rootGoogleAuthCode") String rootGoogleAuthCode) {
        SiteAdmin siteAdmin = siteAdminMapper.selectById(id);
        if (siteAdmin == null) {
            return ServerResponse.createByErrorMsg("当前用户未找到");
        }
        long t = System.currentTimeMillis();
        GoogleAuthenticator ga = new GoogleAuthenticator();
        ga.setWindowSize(5);
        boolean flag = ga.check_code(siteAdmin.getGoogleAuthSecret(), Long.valueOf(rootGoogleAuthCode), t);
        if (flag) {
            if (!siteAdmin.getGoogleAuthBind()) {
                return ServerResponse.createByErrorMsg("谷歌验证码未绑定,无需解绑!");
            }
            siteAdmin.setGoogleAuthBind(false);
            siteAdmin.setGoogleAuthSecret("");
            siteAdminMapper.updateById(siteAdmin);
        } else {
            return ServerResponse.createByErrorMsg("超级谷歌验证码错误");
        }
        return ServerResponse.createBySuccess();
    }
//    //页面样式设置
src/main/java/com/nq/controller/UserPositionCheckDzController.java
@@ -107,7 +107,7 @@
        StockDz stockDz = this.stockDzMapper.selectOne(new QueryWrapper<StockDz>().eq("id", userPositionCheckDz.getDzId()));
        UserAssets userAssets = userAssetsServices.assetsByTypeAndUserId("IN", user.getId());
        UserAssets userAssets = userAssetsServices.assetsByTypeAndUserId("JP", user.getId());
        if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){
            return ServerResponse.createByErrorMsg("用户账户有待补资金未补齐,审核失败");
        }
@@ -132,7 +132,7 @@
        userPosition.setId(null);
        userPosition.setDzId(stockDz.getId());
        userPositionMapper.insert(userPosition);
        userAssetsServices.availablebalanceChange(EStockType.IN.getCode(), user.getId(), EUserAssets.BUY, buyAmt.negate(),"","");
        userAssetsServices.availablebalanceChange(EStockType.JP.getCode(), user.getId(), EUserAssets.BUY, buyAmt.negate(),"","");
        return ServerResponse.createBySuccessMsg("审核成功,订单已转客户持仓");
    }
}
src/main/java/com/nq/controller/echo/EChoController.java
@@ -62,7 +62,7 @@
            }
        }
        User user = this.iUserService.getCurrentRefreshUser(request);
        UserAssets userAssets = userAssetsServices.assetsByTypeAndUserId("IN", user.getId());
        UserAssets userAssets = userAssetsServices.assetsByTypeAndUserId("JP", user.getId());
        if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){
            return ServerResponse.createByErrorMsg("请先缴清待补资金", request);
        }
src/main/java/com/nq/controller/protol/UserController.java
@@ -417,30 +417,32 @@
    @RequestMapping({"thirdPartyRecharge.do"})
    @ResponseBody
    public ServerResponse thirdPartyRecharge(@RequestParam("tradeAmoun") String tradeAmoun,@RequestParam("type") Integer type,HttpServletRequest request) {
        payLock.lock();
        try {
            if (payCreated.get()) {
                return ServerResponse.createByErrorMsg("当前充值人数过多,请稍后重试", request);
            }
            if (!isIntegerGreaterThan100(tradeAmoun)) {
                return ServerResponse.createByErrorMsg("请输入整数!",request);
            }
            if(null == type){
                return ServerResponse.createByErrorMsg("请选择支付通道!",request);
            }
            if(new BigDecimal(tradeAmoun).compareTo(new BigDecimal("1000")) < 0){
                return ServerResponse.createByErrorMsg("请重新输入,最低充值金额:1000", request);
            }
            payCreated.set(true);
            return payService.thirdPartyRecharge(request,tradeAmoun,type);
        } catch (Exception e) {
            e.printStackTrace();
            return ServerResponse.createByErrorMsg("获取充值链接异常,请稍后重试", request);
        }  finally{
            payLock.unlock();
            payCreated.set(false);
        }
        return ServerResponse.createBySuccess("请联系客服充值");
//        payLock.lock();
//        try {
//
//            if (payCreated.get()) {
//                return ServerResponse.createByErrorMsg("当前充值人数过多,请稍后重试", request);
//            }
//            if (!isIntegerGreaterThan100(tradeAmoun)) {
//                return ServerResponse.createByErrorMsg("请输入整数!",request);
//            }
//            if(null == type){
//                return ServerResponse.createByErrorMsg("请选择支付通道!",request);
//            }
//            if(new BigDecimal(tradeAmoun).compareTo(new BigDecimal("1000")) < 0){
//                return ServerResponse.createByErrorMsg("请重新输入,最低充值金额:1000", request);
//            }
//
//            payCreated.set(true);
//            return payService.thirdPartyRecharge(request,tradeAmoun,type);
//        } catch (Exception e) {
//            e.printStackTrace();
//            return ServerResponse.createByErrorMsg("获取充值链接异常,请稍后重试", request);
//        }  finally{
//            payLock.unlock();
//            payCreated.set(false);
//        }
    }
    // 判断字符串是否是整数且大于100
    public static boolean isIntegerGreaterThan100(String str) {
@@ -452,19 +454,19 @@
        }
    }
    /**
     * 充值1异步接收地址
     */
    @PostMapping({"rechargeCallback.do"})
    public void rechargeCallback(PaymentResponse vo, HttpServletResponse response) throws IOException {
        payService.rechargeCallback(vo,response);
    }
    /**
     * 充值2异步接收地址
     */
    @PostMapping({"rechargeCallbackTwo.do"})
    public void rechargeCallbackTwo(TransactionStatusVo vo, HttpServletResponse response) throws IOException {
        payService.rechargeCallbackTwo(vo,response);
    }
//    /**
//     * 充值1异步接收地址
//     */
//    @PostMapping({"rechargeCallback.do"})
//    public void rechargeCallback(PaymentResponse vo, HttpServletResponse response) throws IOException {
//        payService.rechargeCallback(vo,response);
//    }
//
//    /**
//     * 充值2异步接收地址
//     */
//    @PostMapping({"rechargeCallbackTwo.do"})
//    public void rechargeCallbackTwo(TransactionStatusVo vo, HttpServletResponse response) throws IOException {
//        payService.rechargeCallbackTwo(vo,response);
//    }
}
src/main/java/com/nq/enums/EStockType.java
@@ -10,12 +10,13 @@
public enum EStockType {
    US("US","美国股票","5",PropertiesUtil.getProperty("US_HTTP_API"),PropertiesUtil.getProperty("US_KEY"),"USD","$"),
    HK("HK","香港股票","39",PropertiesUtil.getProperty("HK_HTTP_API"),PropertiesUtil.getProperty("HK_KEY"),"HKD","HK$"),
    MAS("MAS","马来西亚股票","42",PropertiesUtil.getProperty("MAS_HTTP_API"),PropertiesUtil.getProperty("MAS_KEY"),"MYR","RM"),
    IN("IN","印度股票","14", PropertiesUtil.getProperty("JS_IN_HTTP_URL"),PropertiesUtil.getProperty("JS_IN_KEY"),"INR","₹");
//
//    US("US","美国股票","5",PropertiesUtil.getProperty("US_HTTP_API"),PropertiesUtil.getProperty("US_KEY"),"USD","$"),
//    HK("HK","香港股票","39",PropertiesUtil.getProperty("HK_HTTP_API"),PropertiesUtil.getProperty("HK_KEY"),"HKD","HK$"),
//    MAS("MAS","马来西亚股票","42",PropertiesUtil.getProperty("MAS_HTTP_API"),PropertiesUtil.getProperty("MAS_KEY"),"MYR","RM"),
//
//    IN("IN","印度股票","14", PropertiesUtil.getProperty("JS_IN_HTTP_URL"),PropertiesUtil.getProperty("JS_IN_KEY"),"INR","₹");
    JP("JP","日本股票","35", PropertiesUtil.getProperty("JP_HTTP_API"),PropertiesUtil.getProperty("JP_KEY"),"JPY","¥");
//    TH("TH","泰国股票","41",PropertiesUtil.getProperty("TH_HTTP_API"),PropertiesUtil.getProperty("TH_KEY")),
//    HG("HG","韩国股票","11",PropertiesUtil.getProperty("HG_HTTP_API"),PropertiesUtil.getProperty("HG_KEY")),
//    SZHB("SZHB","数字货币","41",PropertiesUtil.getProperty("SZHB_HTTP_API"),PropertiesUtil.getProperty("SZHB_KEY"));
@@ -42,18 +43,21 @@
    }
    public static EStockType getEStockTypeByCode(String code){
        if(EStockType.US.getCode().equals(code)){
            return US;
        if(EStockType.JP.getCode().equals(code)){
            return JP;
        }else if(EStockType.HK.getCode().equals(code)){
            return  HK;
        }else if(EStockType.MAS.getCode().equals(code)){
            return  MAS;
        }else if(EStockType.IN.getCode().equals(code)){
            return  IN;
        }else{
            return  MAS;
        }else {
            return null;
        }
//        else if(EStockType.HK.getCode().equals(code)){
//            return  HK;
//        }else if(EStockType.MAS.getCode().equals(code)){
//            return  MAS;
//        }else if(EStockType.IN.getCode().equals(code)){
//            return  IN;
//        }else{
//            return  MAS;
//        }
    }
    public String getContryId() {
src/main/java/com/nq/pojo/GoogleAuthDto.java
New file
@@ -0,0 +1,14 @@
package com.nq.pojo;
import lombok.Data;
@Data
public class GoogleAuthDto {
    //密钥
    private  String googleAuthSecret;
    //密钥
    private  String googleAuthImg;
}
src/main/java/com/nq/pojo/SiteAdmin.java
@@ -1,6 +1,7 @@
package com.nq.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.Date;
@@ -15,6 +16,14 @@
    private Date addTime;
    private String token;
    /**
     * 谷歌验证器
     */
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private String googleAuthSecret;
    /**
     * 谷歌验证器是否绑定
     */
    private Boolean googleAuthBind=false;
}
src/main/java/com/nq/pojo/UnbindingGoogleAuthModel.java
New file
@@ -0,0 +1,17 @@
package com.nq.pojo;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
public class UnbindingGoogleAuthModel {
    private  long id;
    //谷歌验证码
    @NotBlank
    private String rootGoogleAuthCode;
}
src/main/java/com/nq/pojo/UpdateGoogleAuthDto.java
New file
@@ -0,0 +1,21 @@
package com.nq.pojo;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
public class UpdateGoogleAuthDto {
    private  long id;
    //谷歌密钥
    @NotBlank
    private String secret;
    //验证码
    private String googleAuthCode;
}
src/main/java/com/nq/service/ISiteAdminService.java
@@ -3,12 +3,13 @@
import com.github.pagehelper.PageInfo;
import com.nq.common.ServerResponse;
import com.nq.pojo.GoogleAuthDto;
import com.nq.pojo.SiteAdmin;
import javax.servlet.http.HttpServletRequest;
public interface ISiteAdminService {
  ServerResponse login(String paramString1, String paramString2, String paramString3, HttpServletRequest paramHttpServletRequest);
  ServerResponse login(String paramString1, String paramString2, String paramString3, Integer googleAuthCode,HttpServletRequest paramHttpServletRequest);
  
  ServerResponse<PageInfo> listByAdmin(String paramString1, String paramString2, HttpServletRequest paramHttpServletRequest, int paramInt1, int paramInt2);
  
@@ -26,7 +27,10 @@
  
  ServerResponse count();
  ServerResponse deleteAdmin(Integer adminId);
  ServerResponse moneyCount(String agentId, String startTime, String entTime);
  GoogleAuthDto getGoogleAuth(HttpServletRequest request);
}
src/main/java/com/nq/service/impl/EchoServices.java
@@ -77,7 +77,7 @@
            UserAssets userAssets = userAssetsMapper.selectOne(new LambdaQueryWrapper<UserAssets>()
                    .eq(UserAssets::getUserId, orderEchoBean.getUserId())
                    .eq(UserAssets::getAccectType, "IN")
                    .eq(UserAssets::getAccectType, "JP")
            );
            userAssets.setAvailableBalance(userAssets.getAvailableBalance().subtract(money));
            userAssets.setFreezeMoney(userAssets.getFreezeMoney().add(money));
@@ -120,7 +120,7 @@
                    BigDecimal aml = incomeAmount.add(money);
                    UserAssets userAssets = userAssetsMapper.selectOne(new LambdaQueryWrapper<UserAssets>()
                            .eq(UserAssets::getUserId, orderEchoBean.getUserId())
                            .eq(UserAssets::getAccectType, "IN")
                            .eq(UserAssets::getAccectType, "JP")
                    );
                    if (userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0) {
                        continue;
src/main/java/com/nq/service/impl/PayServiceImpl.java
@@ -724,7 +724,7 @@
            }
            UserAssets userAssets = userAssetsMapper.selectOne(new LambdaQueryWrapper<>(UserAssets.class)
                    .eq(UserAssets::getUserId, paymentRecharge.getUserId())
                    .eq(UserAssets::getAccectType, "IN")
                    .eq(UserAssets::getAccectType, "JP")
            );
            ServerResponse serverResponse = iUserAssetsServices.updateUserAssets(userAssets.getId(), vo.getOriAmount().toString(), "2");
            if(serverResponse.getStatus() == 0){
@@ -936,7 +936,7 @@
            }
            UserAssets userAssets = userAssetsMapper.selectOne(new LambdaQueryWrapper<>(UserAssets.class)
                    .eq(UserAssets::getUserId, paymentRecharge.getUserId())
                    .eq(UserAssets::getAccectType, "IN")
                    .eq(UserAssets::getAccectType, "JP")
            );
            ServerResponse serverResponse = iUserAssetsServices.updateUserAssets(userAssets.getId(), vo.getAccount_fee().toString(), "2");
            if(serverResponse.getStatus() == 0){
src/main/java/com/nq/service/impl/PriceServicesImpl.java
@@ -112,7 +112,7 @@
    public String doPost(String pid) {
        // 从配置中获取 API URL,并拼接 key
        String apiUrl = PropertiesUtil.getProperty("JS_IN_HTTP_URL") + "stock?key=" + PropertiesUtil.getProperty("JS_IN_KEY");
        String apiUrl = PropertiesUtil.getProperty("JP_HTTP_API") + "stock?key=" + PropertiesUtil.getProperty("JP_KEY");
        String result = null;
        try {
            URL url = new URL(apiUrl);
src/main/java/com/nq/service/impl/SiteAdminServiceImpl.java
@@ -1,8 +1,10 @@
package com.nq.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.extra.qrcode.QrConfig;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.nq.dao.*;
import com.github.pagehelper.PageHelper;
@@ -30,6 +32,7 @@
import com.nq.utils.PropertiesUtil;
import com.nq.utils.SymmetricCryptoUtil;
import com.nq.utils.redis.CookieUtils;
import com.nq.utils.redis.JsonUtil;
import com.nq.utils.redis.RedisConst;
import com.nq.utils.redis.RedisShardedPoolUtils;
@@ -109,53 +112,44 @@
    @Autowired
    AgentUserMapper agentUserMapper;
    public ServerResponse login(String adminPhone, String adminPwd, String verifyCode, HttpServletRequest request) {
    public ServerResponse login(String adminPhone, String adminPwd, String verifyCode,Integer googleAuthCode, HttpServletRequest request) {
        if (StringUtils.isBlank(verifyCode)) {
            return ServerResponse.createByErrorMsg("验证码不能为空");
        }
//
        String original = (String) request.getSession().getAttribute("KAPTCHA_SESSION_KEY");
        /*if (!verifyCode.equalsIgnoreCase(original)) {
            return ServerResponse.createByErrorMsg("验证码错误");
        }*/
        if (StringUtils.isBlank(adminPhone) || StringUtils.isBlank(adminPwd)) {
        if (StringUtils.isBlank(adminPhone) || StringUtils.isBlank(adminPwd) ) {
            return ServerResponse.createByErrorMsg("参数不能为空");
        }
        SymmetricCryptoUtil.decryptPassword("8OTlTNZ9EwQ29Pf0R8a37Q==");
        adminPwd = SymmetricCryptoUtil.encryptPassword(adminPwd);
        SiteAdmin siteAdmin = this.siteAdminMapper.login(adminPhone, adminPwd);
//        SiteAdmin siteAdmin = (SiteAdmin) siteAdminMapper.selectOne(new QueryWrapper<SiteAdmin>().eq("admin_phone", adminPhone).eq("admin_pwd", adminPwd));
        if (siteAdmin == null) {
            return ServerResponse.createByErrorMsg("账号密码错误");
        }
        if (siteAdmin.getIsLock().intValue() == 1) {
            return ServerResponse.createByErrorMsg("账号已被锁定");
        }
        if(siteAdmin.getGoogleAuthBind() && ObjectUtil.isEmpty(googleAuthCode)){
            return ServerResponse.createByErrorMsg("谷歌验证码不能为空");
        }
        if(siteAdmin.getGoogleAuthBind()){
            long t = System.currentTimeMillis();
            GoogleAuthenticator ga = new GoogleAuthenticator();
            ga.setWindowSize(5);
            boolean userFlag = ga.check_code(siteAdmin.getGoogleAuthSecret(), Long.valueOf(googleAuthCode), t);
            if (!userFlag) {
                return ServerResponse.createByErrorMsg("谷歌验证码错误!");
            }
        }
        siteAdmin.setAdminPwd(null);
        HttpSession httpSession = request.getSession();
        String token = RedisConst.getAdminRedisKey(httpSession.getId());
        String str = RedisShardedPoolUtils.setEx(token,
        RedisShardedPoolUtils.setEx(token,
                JsonUtil.obj2String(siteAdmin), 999999);
@@ -461,6 +455,30 @@
        return ServerResponse.createBySuccess(map);
    }
    @Override
    public GoogleAuthDto getGoogleAuth(HttpServletRequest request) {
        String secretKey = GoogleAuthenticator.generateSecretKey();
        QrConfig config = new QrConfig(345, 345);
        config.setMargin(3);
        String cookie_name = PropertiesUtil.getProperty("admin.cookie.name");
        SiteAdmin siteAdmin = null;
        if(StringUtils.isNotEmpty(cookie_name)){
            siteAdmin = getAdmin(cookie_name,request);
        }
        String content = String.format("otpauth://totp/%s?secret=%s", siteAdmin.getAdminName(),secretKey);
        String base64 = QrCodeUtil.generateAsBase64(content, config, "png");
        GoogleAuthDto dto = new GoogleAuthDto();
        dto.setGoogleAuthImg(base64);
        dto.setGoogleAuthSecret(secretKey);
        return dto;
    }
    public SiteAdmin getAdmin(String cookie_name,HttpServletRequest request){
        String logintoken = CookieUtils.readLoginToken(request, cookie_name);
        String adminJson = RedisShardedPoolUtils.get(logintoken);
        return (SiteAdmin) JsonUtil.string2Obj(adminJson, SiteAdmin.class);
    }
    public  static  List<Integer>  getAllChildrenIds(AgentUserNodeVO  parent)  {
        List<Integer>  allChildrenIds  =  new ArrayList<>();
        getAllChildrenIdsHelper(parent,  allChildrenIds);
src/main/java/com/nq/service/impl/SiteInfoServiceImpl.java
@@ -100,42 +100,12 @@
            log.info("当前以后名");
            if(user != null ){
                AgentUser agentUser = agentUserMapper.findAgentByAgentId(user.getAgentId());
                if(agentUser != null){
                if(agentUser != null) {
                    siteInfo.setAgentCode(agentUser.getAgentCode());
                    if(!agentUser.getOnLineServices().isEmpty()){
//                        siteInfo.setOnlineService(agentUser.getOnLineServices());
                        if(agentUser.getId().equals(17)){
                            siteInfo.setOnlineService("https://t.me/DuroCaspital035");
                        }else if(agentUser.getId().equals(18)){
                            siteInfo.setOnlineService("https://t.me/DC_1352");
                        }else if(agentUser.getId().equals(19)){
                            siteInfo.setOnlineService("https://t.me/DCBlocktrades");
                        }else if(agentUser.getId().equals(20)){
                            siteInfo.setOnlineService("https://t.me/JOP1090Q");
                        }else if(agentUser.getId().equals(22)){
                            siteInfo.setOnlineService("https://t.me/JOP1090Q");
                        }else if(agentUser.getId().equals(23)){
                            siteInfo.setOnlineService("https://t.me/DCcustomerservice");
                        }else if(agentUser.getId().equals(24)){
                            siteInfo.setOnlineService("https://t.me/Acc0880");
                        }else if(agentUser.getId().equals(25)){
                            siteInfo.setOnlineService("https://t.me/DCLisaService");
                        }else if(agentUser.getId().equals(26)){
                            siteInfo.setOnlineService("https://t.me/AliceKKQ");
                        }else if(agentUser.getId().equals(27)){
                            siteInfo.setOnlineService("https://t.me/Duro_Capital");
                        }else if(agentUser.getId().equals(28)){
                            siteInfo.setOnlineService("@https://t.me/DC11023");
                        }else if(agentUser.getId().equals(29)){
                            siteInfo.setOnlineService("https://t.me/Duro_Capital");
                        }else if(agentUser.getId().equals(30)){
                            siteInfo.setOnlineService("https://t.me/DL9855\t");
                        }
                    if (!agentUser.getOnLineServices().isEmpty()) {
                        siteInfo.setOnlineService(agentUser.getOnLineServices());
                    }
                }
            }else{
                siteInfo.setOnlineService("https://t.me/Duro_Capital");
            }
            return ServerResponse.createBySuccess(siteInfo);
        }
src/main/java/com/nq/service/impl/SiteNewsServiceImpl.java
@@ -132,7 +132,7 @@
    @Override
    public void grabNews() {
        addNews(1, PropertiesUtil.getProperty("JS_IN_HTTP_URL") + "stock-markets?key=" + PropertiesUtil.getProperty("JS_IN_KEY") + "&type=6");
        addNews(1, PropertiesUtil.getProperty("JP_HTTP_API") + "stock-markets?key=" + PropertiesUtil.getProperty("JP_KEY") + "&type=1&country_id=35");
    }
    private void addNews(Integer type, String url) {
src/main/java/com/nq/service/impl/StockDzServiceImpl.java
@@ -55,10 +55,6 @@
    @Override
    public ServerResponse getDzList(int pageNum, int pageSize, String orderBy, String keyWords,  HttpServletRequest request) {
        PageHelper.startPage(pageNum, pageSize);
        if (keyWords == null || keyWords.trim().isEmpty()) {
            // 如果 keyWords 为空,则直接返回空分页结果
            return ServerResponse.createBySuccess(new RPageInfo());
        }
        String formatDate = DateUtil.format(new Date(), DatePattern.NORM_DATETIME_PATTERN);
        List<StockDz> stockTypeDz = stockMapper.findStockTypeDz(orderBy, keyWords,formatDate);
        RPageInfo pageInfo = new RPageInfo();
src/main/java/com/nq/service/impl/StockServiceImpl.java
@@ -134,7 +134,7 @@
        List<Stock> stockList = new ArrayList<>();
        if (stockType.equals("99")) {
            PageHelper.startPage(pageNum, pageSize);
            stockList.addAll(stockMapper.findZtStockListByKeyWords(keyWords, stockPlate, "IN", Integer.valueOf(0)));
            stockList.addAll(stockMapper.findZtStockListByKeyWords(keyWords, stockPlate, "JP", Integer.valueOf(0)));
        } else if (stockType.equals("100")) {
            User user = iUserService.getCurrentRefreshUser(request);
            if (user == null) {
@@ -440,7 +440,7 @@
        Gson gson = new Gson();
        List<kData> dataList = gson.fromJson(object.toString(), new TypeToken<List<kData>>(){}.getType());
        Stock stock = stockMapper.selectOne(new LambdaQueryWrapper<Stock>().eq(Stock::getStockCode, pid).eq(Stock::getStockType, "IN"));
        Stock stock = stockMapper.selectOne(new LambdaQueryWrapper<Stock>().eq(Stock::getStockCode, pid).eq(Stock::getStockType, "JP"));
        BigDecimal nowPrice = iPriceServices.getNowPrice(stock.getStockCode());
        Map singleStock = getSingleStock(stock.getStockCode());
        StockVO stockVO = (StockVO)singleStock.get("stock");
src/main/java/com/nq/service/impl/TradingHourServiceImpl.java
@@ -48,7 +48,7 @@
    @Override
    public Boolean timeCheck(String  stockCode) {
        StockSetting stockSetting = stockSettingMapper.selectOne(new QueryWrapper<StockSetting>().eq("stock_code",stockCode));
        StockTimeSetting stockTimeSetting = stockTimeSettingMapper.selectOne(new QueryWrapper<StockTimeSetting>().eq("accets_type","IN"));
        StockTimeSetting stockTimeSetting = stockTimeSettingMapper.selectOne(new QueryWrapper<StockTimeSetting>().eq("accets_type","JP"));
        if(stockSetting!= null){
            // 说明进入盘前交易或者盘后交易时间
            Date newDate = new Date();
src/main/java/com/nq/service/impl/UserPositionServiceImpl.java
@@ -191,7 +191,7 @@
            BigDecimal buyAmt = nowPrice.multiply(new BigDecimal(buyNum)).divide(new BigDecimal(lever));
            BigDecimal orderFree = siteSettingBuyFee.multiply(buyAmt);
            BigDecimal   fundratio = new BigDecimal(user.getFundRatio()).divide(new BigDecimal(100));
            BigDecimal   fundratio = new BigDecimal(String.valueOf(user.getFundRatio().isEmpty() ? 100 : user.getFundRatio())).divide(new BigDecimal(100));
            BigDecimal availableBalance =  fundratio.multiply(userAssets.getAvailableBalance());
            if (availableBalance.compareTo(buyAmt.add(orderFree)) < 0) {
                return ServerResponse.createByErrorMsg("订单失败,配资不足", request);
@@ -344,7 +344,7 @@
        UserAssets userAssets = userAssetsMapper.selectOne(new LambdaQueryWrapper<UserAssets>()
                .eq(UserAssets::getUserId, userPosition.getUserId())
                .eq(UserAssets::getAccectType, "IN")
                .eq(UserAssets::getAccectType, "JP")
        );
        if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){
            return ServerResponse.createByErrorMsg("请先缴清待补资金", request);
@@ -1330,7 +1330,7 @@
//        StringBuffer gid = new StringBuffer();
//        gid.append(stockSubscribe.getStockType()!=null?stockSubscribe.getStockType():"");
//        gid.append(userStockSubscribe.getNewCode()!=null?userStockSubscribe.getNewCode():"stock code invaild");
        userPosition.setStockGid("IN");
        userPosition.setStockGid("JP");
        userPosition.setBuyOrderId(GeneratePosition.getPositionId());
        userPosition.setBuyOrderTime(new Date());
        userPosition.setBuyOrderPrice(userStockSubscribe.getBuyPrice());
@@ -1384,12 +1384,12 @@
        userPosition.setNewId(stockSubscribe.getNewlistId());
        int ret = 0;
        ret = this.userPositionMapper.insert(userPosition);
        UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId("IN", userPosition.getUserId());
        UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId("JP", userPosition.getUserId());
        if(null == userAssets){
            return ServerResponse.createByErrorMsg("新股转持仓失败");
        }
        userAssetsMapper.updateById(userAssets);
        iUserAssetsServices.availablebalanceChange("IN", userAssets.getUserId(), EUserAssets.HANDLING_CHARGE, buy_fee_amt, "", "");
        iUserAssetsServices.availablebalanceChange("JP", userAssets.getUserId(), EUserAssets.HANDLING_CHARGE, buy_fee_amt, "", "");
        if (ret > 0) {
            userStockSubscribe.setStatus(5);
            userStockSubscribeMapper.update1(userStockSubscribe);
@@ -1683,7 +1683,7 @@
        if (siteProduct.getRealNameDisplay() && user.getIsLock().intValue() == 1) {
            return ServerResponse.createByErrorMsg("Order failed, account has been locked");
        }
        UserAssets userAssets = userAssetsServices.assetsByTypeAndUserId("IN", user.getId());
        UserAssets userAssets = userAssetsServices.assetsByTypeAndUserId("JP", user.getId());
        if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){
            return ServerResponse.createByErrorMsg("请先缴清待补资金", request);
        }
@@ -1733,8 +1733,8 @@
        UserPosition userPosition = getUserPosition(dzId,num, user, stockDz, nowPrice, stock, buyAmt);
        userPositionMapper.insert(userPosition);
        BigDecimal buy_fee_amt = siteSettingBuyFee.multiply(buyAmt);
        userAssetsServices.availablebalanceChange(EStockType.IN.getCode(), user.getId(), EUserAssets.BUY, buyAmt.negate(),"","");
        iUserAssetsServices.availablebalanceChange("IN", userAssets.getUserId(), EUserAssets.HANDLING_CHARGE, buy_fee_amt, "", "");
        userAssetsServices.availablebalanceChange(EStockType.JP.getCode(), user.getId(), EUserAssets.BUY, buyAmt.negate(),"","");
        iUserAssetsServices.availablebalanceChange("JP", userAssets.getUserId(), EUserAssets.HANDLING_CHARGE, buy_fee_amt, "", "");
        return ServerResponse.createBySuccess("购买成功", request);
    }
@@ -1792,7 +1792,7 @@
            for (UserPosition position : list) {
                UserAssets userAssets = userAssetsMapper.selectOne(new LambdaQueryWrapper<UserAssets>()
                        .eq(UserAssets::getUserId, position.getUserId())
                        .eq(UserAssets::getAccectType, "IN")
                        .eq(UserAssets::getAccectType, "JP")
                );
                if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){
                    continue;
src/main/java/com/nq/service/impl/UserRechargeServiceImpl.java
@@ -223,8 +223,8 @@
        for (int i = 0; i <userRecharges.size() ; i++) {
          SitePay s =   sitePayMapper.selectById(userRecharges.get(i).getPayId());
            userRecharges.get(i).setAssetsType(EStockType.IN.getSymbol1());
            userRecharges.get(i).setChannelName(EStockType.IN.getSymbol());
            userRecharges.get(i).setAssetsType(EStockType.JP.getSymbol1());
            userRecharges.get(i).setChannelName(EStockType.JP.getSymbol());
        }
        return ServerResponse.createBySuccess(pageInfo);
@@ -344,7 +344,7 @@
        userRecharge.setPayTime(new Date());
        userRecharge.setOrderStatus(Integer.valueOf(1));
        userRecharge.setPayId(1);
        userAssetsServices.availablebalanceChange(EStockType.IN.getCode(),
        userAssetsServices.availablebalanceChange(EStockType.JP.getCode(),
                userId,EUserAssets.TOP_UP,new BigDecimal(amt),"","");
        int insertCount = this.userRechargeMapper.insert(userRecharge);
        if (insertCount > 0) {
src/main/java/com/nq/service/impl/UserServiceImpl.java
@@ -189,7 +189,6 @@
        user.setRegAddress(uadd);
        user.setIsLogin(Integer.valueOf(0));
        int insertCount = this.userMapper.insert(user);
        if (insertCount > 0) {
@@ -210,7 +209,7 @@
            if (user.getIsLogin().intValue() == 1) {
                return ServerResponse.createByErrorMsg("登录失败。账户锁定",request);
            }
            userAssetsServices.assetsByTypeAndUserId(EStockType.IN.getCode(),user.getId());
            userAssetsServices.assetsByTypeAndUserId(EStockType.JP.getCode(),user.getId());
            this.iSiteLoginLogService.saveLog(user, request);
            return ServerResponse.createBySuccess(user);
        }
@@ -527,7 +526,7 @@
            rUserAssets.setAmountToBeCovered((userAssets.getAmountToBeCovered().add(userAssets.getHandlingChargeWritten()).toString()));
            rUserAssets.setHandlingChargeWritten(userAssets.getHandlingChargeWritten());
            BigDecimal rate = rateServices.currencyRate(
                    EStockType.getEStockTypeByCode(userAssets.getAccectType()),EStockType.US);
                    EStockType.getEStockTypeByCode(userAssets.getAccectType()),EStockType.JP);
           BigDecimal  availableBalanceUSD = amt;
           if(amt.compareTo(BigDecimal.ZERO)>0){
@@ -613,7 +612,7 @@
        userPositions = userPositionMapper.
                findMyPositionByCodeAndSpell(userId,
                        "","",
                        0, "IN");
                        0, "JP");
        List<UserPositionVO> userPositionVOS = Lists.newArrayList();
@@ -770,7 +769,7 @@
            ServerResponse money = iUserService.getMoney(user.getId());
            List<RUserAssets> rUserAssetsList = (List<RUserAssets>) money.getData();
            RUserAssets rUserAssets = rUserAssetsList.stream()
                    .filter(stock -> "IN".equals(stock.getAccectType()))
                    .filter(stock -> "JP".equals(stock.getAccectType()))
                    .findFirst()
                    .orElse(null);
@@ -828,8 +827,8 @@
        int insertCount = this.userMapper.insert(user);
         dbUser = userMapper.selectOne(queryWrapper);
        userAssetsServices.getAvailableBalance(EStockType.IN.getCode(),dbUser.getId() );
        userAssetsServices.availablebalanceChange(EStockType.IN.getCode(),dbUser.getId(),EUserAssets.TOP_UP,new BigDecimal(amt),"","");
        userAssetsServices.getAvailableBalance(EStockType.JP.getCode(),dbUser.getId() );
        userAssetsServices.availablebalanceChange(EStockType.JP.getCode(),dbUser.getId(),EUserAssets.TOP_UP,new BigDecimal(amt),"","");
        if (insertCount > 0) {
            return ServerResponse.createBySuccessMsg("Success");
        }
@@ -854,7 +853,7 @@
            ServerResponse money = iUserService.getMoney(user.getId());
            List<RUserAssets> rUserAssetsList = (List<RUserAssets>) money.getData();
            RUserAssets rUserAssets = rUserAssetsList.stream()
                    .filter(stock -> "IN".equals(stock.getAccectType()))
                    .filter(stock -> "JP".equals(stock.getAccectType()))
                    .findFirst()
                    .orElse(null);
src/main/java/com/nq/service/impl/UserStockSubscribeServiceImpl.java
@@ -86,7 +86,7 @@
        }
        User user = iUserService.getCurrentRefreshUser(request);
        synchronized (user.getId()){
            UserAssets userAssets =   iUserAssetsServices.assetsByTypeAndUserId("IN",user.getId());
            UserAssets userAssets =   iUserAssetsServices.assetsByTypeAndUserId("JP",user.getId());
            if (model.getNewCode() != null) {
                StockSubscribe stockSubscribe = stockSubscribeMapper.selectOne(new QueryWrapper<StockSubscribe>()
                        .eq("newlist_id", model.getNewlistId()));
@@ -191,7 +191,7 @@
//                   bound =  new BigDecimal(model.getApplyNums()).multiply(stockSubscribe.getPrice());
//               }
//
                    BigDecimal useEnaAmount = iUserAssetsServices.getAvailableBalance(EStockType.IN.getCode(), user.getId());
                    BigDecimal useEnaAmount = iUserAssetsServices.getAvailableBalance(EStockType.JP.getCode(), user.getId());
                    if(useEnaAmount.compareTo(bound)<0){
                        return ServerResponse.createByErrorMsg("余额不足,配售失败",request);
                    }
@@ -210,7 +210,7 @@
                    UserStockSubscribe userStockSubscribe = Convert.convert(UserStockSubscribe.class, model);
                    userStockSubscribe.setNewStockId(stockSubscribe.getNewlistId());
                    ret = userStockSubscribeMapper.insert(userStockSubscribe);
                    iUserAssetsServices.availablebalanceChange(EStockType.IN.getCode(), user.getId(),EUserAssets.BUY,bound.negate(),"","");
                    iUserAssetsServices.availablebalanceChange(EStockType.JP.getCode(), user.getId(),EUserAssets.BUY,bound.negate(),"","");
                    if (ret > 0) {
                        return ServerResponse.createBySuccessMsg("配售成功",request);
                    } else {
@@ -255,7 +255,7 @@
            }
            //客户中签直接扣除客户账户可用资金
            UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId("IN", userStockSubscribe.getUserId());
            UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId("JP", userStockSubscribe.getUserId());
            if (model.getStatus() == 3 && model.getApplyNumber() != null){
                if(stockSubscribe.getType() == 1){
                    model.setBond((stockSubscribe.getMinPrice() != null ? stockSubscribe.getMinPrice() : stockSubscribe.getPrice()).multiply(BigDecimal.valueOf(model.getApplyNumber())));
@@ -295,7 +295,7 @@
                    }
                    BigDecimal cCount = new BigDecimal(model.getApplyNums()-model.getApplyNumber());
                    BigDecimal tMoney = ((stockSubscribe.getMinPrice() != null ? stockSubscribe.getMinPrice() : stockSubscribe.getPrice())).multiply(cCount);
                    iUserAssetsServices.availablebalanceChange(EStockType.IN.getCode(),userStockSubscribe.getUserId(),
                    iUserAssetsServices.availablebalanceChange(EStockType.JP.getCode(),userStockSubscribe.getUserId(),
                            EUserAssets.TOP_UP,tMoney,"","");
                    model.setBond((stockSubscribe.getMinPrice() != null ? stockSubscribe.getMinPrice() : stockSubscribe.getPrice()).multiply(BigDecimal.valueOf(model.getApplyNumber())));
                    model.setDbMoney(BigDecimal.ZERO);
@@ -499,14 +499,14 @@
                    userStockSubscribe.setSubmitTime(DateTimeUtil.getCurrentDate());
                    userStockSubscribe.setStatus(4);
                    BigDecimal bigDecimal =  iUserAssetsServices.
                            getAvailableBalance(EStockType.IN.getCode(),
                            getAvailableBalance(EStockType.JP.getCode(),
                                    userStockSubscribe.getUserId());
                    BigDecimal multiply = userStockSubscribe.getBuyPrice().multiply(new BigDecimal(userStockSubscribe.getApplyNumber()));
                    if(bigDecimal.compareTo(multiply) <= 0){
                        return ServerResponse.createByErrorMsg("余额不足",request);
                    }
                    iUserAssetsServices.availablebalanceChange(EStockType.IN.getCode(),userStockSubscribe.getUserId(),
                    iUserAssetsServices.availablebalanceChange(EStockType.JP.getCode(),userStockSubscribe.getUserId(),
                            EUserAssets.BUY,multiply.negate(),"","");
                    userStockSubscribe.setDbMoney(BigDecimal.ZERO);
                    userStockSubscribeMapper.update1(userStockSubscribe);
src/main/java/com/nq/service/impl/UserWithdrawServiceImpl.java
@@ -172,7 +172,7 @@
    }
    private boolean getServerResponse() {
        StockTimeSetting stockTimeSetting = stockTimeSettingMapper.selectOne(new QueryWrapper<StockTimeSetting>().eq("accets_type", "IN"));
        StockTimeSetting stockTimeSetting = stockTimeSettingMapper.selectOne(new QueryWrapper<StockTimeSetting>().eq("accets_type", "JP"));
        if (stockTimeSetting == null) {
            return false;
        }
@@ -240,7 +240,7 @@
            User user = this.userMapper.selectById(userWithdraw.getUserId());
            UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId("IN", user.getId());
            UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId("JP", user.getId());
            if (userAssets == null) {
                return ServerResponse.createByErrorMsg("用户资金账户不存在");
            }
@@ -354,7 +354,7 @@
            if (user == null) {
                return ServerResponse.createByErrorMsg("用户不存在");
            }
            UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId("IN", user.getId());
            UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId("JP", user.getId());
            if (userAssets == null) {
                return ServerResponse.createByErrorMsg("用户资金账户不存在");
            }
src/main/java/com/nq/utils/redis/RedisKeyUtil.java
@@ -91,7 +91,7 @@
    public static String doPost(String pid) {
        // 从配置中获取 API URL,并拼接 key
        String apiUrl = PropertiesUtil.getProperty("JS_IN_HTTP_URL") + "stock?key=" + PropertiesUtil.getProperty("JS_IN_KEY");
        String apiUrl = PropertiesUtil.getProperty("JP_HTTP_API") + "stock?key=" + PropertiesUtil.getProperty("JP_KEY");
        String result = null;
        try {
            URL url = new URL(apiUrl);
src/main/java/com/nq/utils/task/news/NewsTask.java
@@ -38,7 +38,7 @@
    /*
     * 新聞資訊抓取
     * */
    @Scheduled(cron = "0 0/5 * * * ?")
    @Scheduled(cron = "0 0/1 * * * ?")
    public void NewsInfoTask() {
        if (NewsInfoTask.get()) { // 判断任务是否在处理中
            return;
src/main/java/com/nq/utils/task/stock/CarryPositionTask.java
@@ -113,7 +113,7 @@
                List<UserStockSubscribe> userStockSubscribes = userStockSubscribeMapper.selectList(new LambdaQueryWrapper<UserStockSubscribe>()
                        .eq(UserStockSubscribe::getStatus, 3));
                userStockSubscribes.forEach(f->{
                    UserAssets userAssets = userAssetsServices.assetsByTypeAndUserId("IN",f.getUserId());
                    UserAssets userAssets = userAssetsServices.assetsByTypeAndUserId("JP",f.getUserId());
                    if(null != userAssets && userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) == 0){
                        f.setStatus(4);
                        userStockSubscribeMapper.updateById(f);
src/main/java/com/nq/utils/task/stock/StockTask.java
@@ -69,7 +69,7 @@
        if (syncINStockDataLock.tryLock()) {
            try {
                syncINStockData.set(true); // 设置处理中标识为true
                loadAllStock(EStockType.IN);
                loadAllStock(EStockType.JP);
            } finally {
                syncINStockDataLock.unlock();
                syncINStockData.set(false); // 设置处理中标识为false
src/main/java/com/nq/ws/WebSocketClientBeanConfig.java
@@ -22,7 +22,7 @@
        Map<String, WebSocketClient> retMap = new HashMap<>(2);
        try {
            WebsocketRunClient websocketRunClient = new WebsocketRunClient(new URI(PropertiesUtil.getProperty("JS_IN_WS_URL")),EStockType.IN);
            WebsocketRunClient websocketRunClient = new WebsocketRunClient(new URI(PropertiesUtil.getProperty("JS_IN_WS_URL")),EStockType.JP);
            websocketRunClient.connect();
            websocketRunClient.setConnectionLostTimeout(0);
            new Thread(() -> {
src/main/java/com/nq/ws/WebsocketRunClient.java
@@ -74,7 +74,7 @@
            stockRealTimeBean.setPc(stringObjectMap.get("Chg").toString());
            stockRealTimeBean.setPcp(stringObjectMap.get("ChgPct").toString()+"%");
            stockRealTimeBean.setTime(stringObjectMap.get("Time").toString());
            RedisKeyUtil.setCacheRealTimeStock(EStockType.IN,stockRealTimeBean);
            RedisKeyUtil.setCacheRealTimeStock(EStockType.JP,stockRealTimeBean);
            ObjectMapper objectMapper = new ObjectMapper();
            try {
                if(!stockRealTimeBean.getPcp().contains("-")){
@@ -83,7 +83,7 @@
                String json = objectMapper.writeValueAsString(stockRealTimeBean);
                sendLoca(json);
                StockRealTimeBean stockDetailBean =  new Gson().fromJson(s, StockRealTimeBean.class);
                RedisKeyUtil.setCacheRealTimeStock(EStockType.IN,stockDetailBean);
                RedisKeyUtil.setCacheRealTimeStock(EStockType.JP,stockDetailBean);
            } catch (JsonProcessingException e) {
                throw new RuntimeException(e);
            }
@@ -101,7 +101,7 @@
    @Override
    public void onClose(int i, String s, boolean b) {
        log.info("websocket  印度股票  关闭"+1);
        log.info("websocket  日本股票  关闭"+1);
    }
    @Override
src/main/resources/application.properties
@@ -17,10 +17,10 @@
ftp.user=ftp_stock
ftp.pass=123456
ftp.address =/www/wwwroot/ftp_stock/
ftp.server.http.prefix=https://img.durocaspitall.com/
ftp.server.http.prefix=https://img.yanshiz.com/
redis1.ip=localhost
redis1.port=6379
redis1.port=6380
redis1.pwd=
redis1.timeout=10000
redis.max.total=50
@@ -47,42 +47,45 @@
#IN_NEW_HTTP_API = http://api-in-2.js-stock.top/
#IN_NEW_KEY = eVKtHt7aG4m6ozwWL9qG
JS_IN_HTTP_API = http://api-in-3-socket.js-stock.top
JS_IN_HTTP_URL = http://api-in-pro.js-stock.top/
JS_IN_WS_URL = ws://api-in-pro-ws.js-stock.top
JS_IN_KEY = xKChgi47AP1NMwMeYI3c
US_HTTP_API = http://api-us.js-stock.top/
US_WS_URL = ws://ws-us.js-stock.top
US_KEY = jZFrku4RGQjP87Hmq5tm
HK_HTTP_API = http://test.js-stock.top/
HK_WS_URL = ws://test-ws.js-stock.top
HK_KEY = mG8QQDdjGuLjLnrryd0B
#JS_IN_HTTP_API = http://api-in-3-socket.js-stock.top
#JS_IN_HTTP_URL = http://api-in-pro.js-stock.top/
#JS_IN_WS_URL = ws://api-in-pro-ws.js-stock.top
#JS_IN_KEY = xKChgi47AP1NMwMeYI3c
#
#US_HTTP_API = http://api-us.js-stock.top/
#US_WS_URL = ws://ws-us.js-stock.top
#US_KEY = jZFrku4RGQjP87Hmq5tm
#
#HK_HTTP_API = http://test.js-stock.top/
#HK_WS_URL = ws://test-ws.js-stock.top
#HK_KEY = mG8QQDdjGuLjLnrryd0B
#HK_HTTP_API = http://api-v1.js-stock.top/
#HK_WS_URL = ws://api-v1-ws.js-stock.top
#HK_KEY = QgiqrYYZem1WWXWbHeT7
JP_HTTP_API = http://api-jp.js-stock.top/
JP_WS_URL = ws://api-jp-ws.js-stock.top
JP_KEY = XBAhluTZJ9hNvRJ0hHmj
HG_HTTP_API = http://test.js-stock.top/
HG_WS_URL = ws://test-ws.js-stock.top
HG_KEY = mG8QQDdjGuLjLnrryd0B
TH_HTTP_API = http://test.js-stock.top/
TH_WS_URL = ws://api-in-ws.js-stock.top
TH_KEY = GBZAcUPLKZzDMDjvV9Ea
MAS_HTTP_API = http://api-ms.js-stock.top/
MAS_WS_URL = ws://api-ms-ws.js-stock.top
MAS_KEY = PQWyZGrw7wRqdoWrvnY9
SZHB_HTTP_API = https://api.huobi.pro/
SZHB_WS_URL = ws://api-in-ws.js-stock.top
SZHB_KEY = GBZAcUPLKZzDMDjvV9Ea
#HG_HTTP_API = http://test.js-stock.top/
#HG_WS_URL = ws://test-ws.js-stock.top
#HG_KEY = mG8QQDdjGuLjLnrryd0B
#
#
#
#TH_HTTP_API = http://test.js-stock.top/
#TH_WS_URL = ws://api-in-ws.js-stock.top
#TH_KEY = GBZAcUPLKZzDMDjvV9Ea
#
#MAS_HTTP_API = http://api-ms.js-stock.top/
#MAS_WS_URL = ws://api-ms-ws.js-stock.top
#MAS_KEY = PQWyZGrw7wRqdoWrvnY9
#
#SZHB_HTTP_API = https://api.huobi.pro/
#SZHB_WS_URL = ws://api-in-ws.js-stock.top
#SZHB_KEY = GBZAcUPLKZzDMDjvV9Ea
src/main/resources/application.yml
@@ -2,7 +2,7 @@
# 开发环境配置
server:
  # 服务器的HTTP端口,默认为8090
  port: 8091
  port: 8092
  tomcat:
    # tomcat的URI编码
    uri-encoding: UTF-8
@@ -104,9 +104,9 @@
    # 地址
    host: localhost
    # 端口,默认为6379
    port: 6379
    port: 6380
    # 数据库索引
    database: 0
    database: 3
    # 密码
    password:
    # 连接超时时间
@@ -124,10 +124,10 @@
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/stock?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
    url: jdbc:mysql://127.0.0.1:6306/stock-rg?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
#    url: jdbc:mysql://127.0.0.1:3306/cgstock?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
    username: root
    password: 123456
    password: Err;2[eoGFUriwdgr
    druid:
      # 初始连接数
      initialSize: 5