1
zj
2025-04-18 924d1f5a68d424e963e45dd82652bc65c6d25bea
1
33 files modified
518 ■■■■■ changed files
src/main/java/com/nq/common/ServerResponse.java 6 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/controller/SmsApiController.java 14 ●●●●● patch | view | raw | blame | history
src/main/java/com/nq/controller/UserApiController.java 6 ●●●● 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 3 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/controller/protol/UserPayController.java 1 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/dao/SiteNewsMapper.java 24 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/enums/EStockType.java 3 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/pojo/SiteLoginLog.java 4 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/pojo/SiteNews.java 8 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/service/IUserWithdrawService.java 1 ●●●● 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 1 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/service/impl/SiteNewsServiceImpl.java 37 ●●●● 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 3 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/service/impl/UserAssetsServices.java 6 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/service/impl/UserPositionServiceImpl.java 16 ●●●● 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 22 ●●●● 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 10 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/utils/redis/RedisKeyConstant.java 8 ●●●●● patch | view | raw | blame | history
src/main/java/com/nq/utils/smsUtil/smsUtil.java 41 ●●●●● patch | view | raw | blame | history
src/main/java/com/nq/utils/stock/sina/StockApi.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/nq/utils/task/news/NewsTask.java 12 ●●●●● patch | view | raw | blame | history
src/main/java/com/nq/utils/task/stock/CarryPositionTask.java 3 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/utils/task/stock/StockTask.java 96 ●●●● 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 44 ●●●●● patch | view | raw | blame | history
src/main/java/com/nq/ws/WsClientConfig.java 6 ●●●● patch | view | raw | blame | history
src/main/resources/application.properties 2 ●●● patch | view | raw | blame | history
src/main/resources/mapper/SiteNewsMapper.xml 105 ●●●●● patch | view | raw | blame | history
src/main/java/com/nq/common/ServerResponse.java
@@ -74,7 +74,7 @@
    public static <T> ServerResponse<T> createBySuccessMsg(String msg,HttpServletRequest request) {
        return new ServerResponse(ResponseCode.SUCCESS.getCode(), new GoogleTranslateUtil().translate(msg,request.getHeader(LANG)));
        return new ServerResponse(ResponseCode.SUCCESS.getCode(), msg);
    }
    public static <T> ServerResponse<T> createBySuccess(T data) {
@@ -83,7 +83,7 @@
    public static <T> ServerResponse<T> createBySuccess(String data,HttpServletRequest request) {
        return new ServerResponse(ResponseCode.SUCCESS.getCode(), new GoogleTranslateUtil().translate(data,request.getHeader(LANG)));
        return new ServerResponse(ResponseCode.SUCCESS.getCode(), data);
    }
    public static <T> ServerResponse<T> createBySuccess(String msg, T data) {
@@ -103,7 +103,7 @@
        return new ServerResponse(ResponseCode.ERROR.getCode(), errormsg);
    }
    public static <T> ServerResponse<T> createByErrorMsg(String errormsg, HttpServletRequest request) {
        return new ServerResponse(ResponseCode.ERROR.getCode(), new GoogleTranslateUtil().translate(errormsg,request.getHeader(LANG)));
        return new ServerResponse(ResponseCode.ERROR.getCode(), errormsg);
    }
src/main/java/com/nq/controller/SmsApiController.java
@@ -20,7 +20,10 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
@Controller
@@ -37,13 +40,14 @@
    //注册用户 短信发送
    @RequestMapping({"sendRegSms.do"})
    @ResponseBody
    public ServerResponse sendRegSms(String phoneNum) {
    public ServerResponse sendRegSms(@RequestParam("phoneNum") String phoneNum,
                                     HttpServletRequest request) {
        if (StringUtils.isBlank(phoneNum)) {
            return ServerResponse.createByErrorMsg("发送失败,手机号不能为空");
            return ServerResponse.createByErrorMsg("发送失败,手机号不能为空",request);
        }
        smsUtil smsUtil = new smsUtil();
        log.info("smsphone"+phoneNum);
        log.info("短信发送验证码手机号:"+phoneNum);
        String code = smsUtil.sendSMS(phoneNum);
        if (!StringUtils.isEmpty(code)) {
            SiteSmsLog siteSmsLog = new SiteSmsLog();
@@ -54,9 +58,9 @@
            siteSmsLog.setSmsTemplate("字段无用");
            siteSmsLog.setAddTime(DateTimeUtil.getCurrentDate());
            iSiteSmsLogService.addData(siteSmsLog);
            return ServerResponse.createBySuccessMsg("发送成功");
            return ServerResponse.createBySuccessMsg("发送成功",request);
        } else {
            return ServerResponse.createByErrorMsg("短信发送失败,请重试");
            return ServerResponse.createByErrorMsg("短信发送失败,请重试",request);
        }
    }
src/main/java/com/nq/controller/UserApiController.java
@@ -81,7 +81,11 @@
    //注册
    @RequestMapping(value = {"reg.do"}, method = {RequestMethod.POST})
    @ResponseBody
    public ServerResponse reg(@RequestParam("agentCode") String agentCode, @RequestParam("phone") String phone, @RequestParam(value = "yzmCode", defaultValue = "") String yzmCode, @RequestParam("userPwd") String userPwd, HttpServletRequest httpServletRequest) {
    public ServerResponse reg(@RequestParam("agentCode") String agentCode,
                              @RequestParam("phone") String phone,
                              @RequestParam(value = "yzmCode", defaultValue = "") String yzmCode,
                              @RequestParam("userPwd") String userPwd,
                              HttpServletRequest httpServletRequest) {
        return this.iUserService.reg(yzmCode, agentCode, phone, userPwd, httpServletRequest);
    }
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(EStockType.ST.getCode(), 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.ST.getCode(), user.getId(), EUserAssets.BUY, buyAmt.negate(),"","");
        return ServerResponse.createBySuccessMsg("审核成功,订单已转客户持仓");
    }
}
src/main/java/com/nq/controller/echo/EChoController.java
@@ -3,6 +3,7 @@
import com.nq.common.ServerResponse;
import com.nq.dao.EChoMapper;
import com.nq.dao.UserAssetsMapper;
import com.nq.enums.EStockType;
import com.nq.pojo.EChoBean;
import com.nq.pojo.User;
import com.nq.pojo.UserAssets;
@@ -62,7 +63,7 @@
            }
        }
        User user = this.iUserService.getCurrentRefreshUser(request);
        UserAssets userAssets = userAssetsServices.assetsByTypeAndUserId("IN", user.getId());
        UserAssets userAssets = userAssetsServices.assetsByTypeAndUserId(EStockType.ST.getCode(), user.getId());
        if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){
            return ServerResponse.createByErrorMsg("请先缴清待补资金", request);
        }
src/main/java/com/nq/controller/protol/UserPayController.java
@@ -54,7 +54,6 @@
                                 @RequestParam("payAmt") String payAmt,
                                 @RequestParam("img") String currency,
                                 HttpServletRequest request) {
        log.info("发起 fly 线上支付 payType = {} payAmt = {} currency = {}", new Object[]{payType, payAmt, currency});
        return this.iPayService.flyPay(payType, payAmt, currency, request);
    }
src/main/java/com/nq/dao/SiteNewsMapper.java
@@ -1,5 +1,7 @@
package com.nq.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.nq.pojo.AgentUser;
import com.nq.pojo.SiteNews;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Mapper;
@@ -13,28 +15,8 @@
 */
@Mapper
@Repository
public interface SiteNewsMapper {
public interface SiteNewsMapper extends BaseMapper<SiteNews> {
    /**
     * [新增]
     * @author lr
     * @date 2020/08/05
     **/
    int insert(SiteNews siteNews);
    /**
     * [刪除]
     * @author lr
     * @date 2020/08/05
     **/
    int delete(int id);
    /**
     * [更新]
     * @author lr
     * @date 2020/08/05
     **/
    int update(SiteNews siteNews);
    /**
     * [查询] 根据主键 id 查询
src/main/java/com/nq/enums/EStockType.java
@@ -45,13 +45,14 @@
    public static EStockType getEStockTypeByCode(String code){
        if(EStockType.US.getCode().equals(code)){
            return US;
        }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 if(EStockType.ST.getCode().equals(code)){
            return  ST;
        }else{
            return  MAS;
        }
src/main/java/com/nq/pojo/SiteLoginLog.java
@@ -1,9 +1,13 @@
package com.nq.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.util.Date;
public class SiteLoginLog {
    @TableId(type = IdType.AUTO,value = "id")
    private Integer id;
    private Integer userId;
    private String userName;
src/main/java/com/nq/pojo/SiteNews.java
@@ -1,6 +1,9 @@
package com.nq.pojo;
import java.io.Serializable;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import javax.xml.soap.Text;
@@ -18,6 +21,7 @@
    /**
     * 新闻主键id
     */
    @TableId(type = IdType.AUTO,value = "id")
    private Integer id;
    /**
@@ -79,8 +83,4 @@
     * 新闻内容
     */
    private String content;
    public SiteNews() {
    }
}
src/main/java/com/nq/service/IUserWithdrawService.java
@@ -31,4 +31,5 @@
  ServerResponse deleteWithdraw(Integer withdrawId);
  List<UserWithdraw> exportByAdmin( Integer agentId, Integer userId, String realName, Integer state, String beginTime, String endTime, 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, EStockType.ST.getCode())
            );
            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, EStockType.ST.getCode())
                    );
                    if (userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0) {
                        continue;
src/main/java/com/nq/service/impl/PayServiceImpl.java
@@ -234,6 +234,7 @@
        userRecharge.setAgentId(user.getAgentId());
        String ordersn = KeyUtils.getRechargeOrderSn();
        userRecharge.setOrderSn(ordersn);
        userRecharge.setPayChannel("1");
        userRecharge.setPayChannel(sitePay.getChannelName());
        userRecharge.setPayAmt(new BigDecimal(payAmt));
        userRecharge.setOrderStatus(Integer.valueOf(0));
src/main/java/com/nq/service/impl/SiteNewsServiceImpl.java
@@ -52,7 +52,7 @@
    @Override
    public int update(SiteNews model) {
        int ret = siteNewsMapper.update(model);
        int ret = siteNewsMapper.updateById(model);
        return ret>0 ? ret: 0;
    }
@@ -63,7 +63,7 @@
    public ServerResponse save(SiteNews model) {
        int ret = 0;
        if(model!=null && model.getId()>0){
            ret = siteNewsMapper.update(model);
            ret = siteNewsMapper.updateById(model);
        } else{
            ret = siteNewsMapper.insert(model);
        }
@@ -132,39 +132,58 @@
    @Override
    public void grabNews() {
        addNews(1, PropertiesUtil.getProperty("JS_IN_HTTP_URL") + "stock-markets?key=" + PropertiesUtil.getProperty("JS_IN_KEY") + "&type=6");
        String apiUrl = PropertiesUtil.getProperty("ST_HTTP_API");
        String apiKey = PropertiesUtil.getProperty("ST_KEY");
        // 定义需要抓取的类型
        int[] types = {1, 2, 3};
        // 批量抓取新闻
        for (int type : types) {
            String url = apiUrl + "stock-markets?key=" + apiKey + "&type=" + type;
            addNews(type, url);
        }
    }
    private void addNews(Integer type, String url) {
        try {
            String newlist = HttpRequest.doGrabGet(url);
            JSONArray jsonArray = JSONArray.fromObject(newlist);
            if (jsonArray.size() > 0) {
                for (int i = 0; i < jsonArray.size(); i++) {
                    JSONObject jsonObject = jsonArray.getJSONObject(i);
                    String newsId = jsonObject.getString("id");
                    // 检查是否已经存在新闻
                    if (siteNewsMapper.getNewsBySourceIdCount(newsId) == 0) {
                        SiteNews siteNews = new SiteNews();
                        siteNews.setSourceId(newsId);
                        siteNews.setSourceName("");
                        siteNews.setTitle(jsonObject.getString("title"));
                        Long showTime = jsonObject.getLong("time");
                        siteNews.setShowTime(new Date(showTime * 1000));
                        if(jsonObject.has("img")){
                            convertBase64ToImage(jsonObject.getString("img"),PropertiesUtil.getProperty("ftp.address")+newsId+".jpg");
                            siteNews.setImgurl(PropertiesUtil.getProperty("ftp.server.http.prefix")+newsId+".jpg");
                        if (jsonObject.has("img")) {
                            String imageUrl = jsonObject.getString("img");
                            String imagePath = PropertiesUtil.getProperty("ftp.address") + newsId + ".jpg";
                            convertBase64ToImage(imageUrl, imagePath);
                            siteNews.setImgurl(PropertiesUtil.getProperty("ftp.server.http.prefix") + newsId + ".jpg");
                        }
                        siteNews.setDescription(jsonObject.getString("content"));
                        siteNews.setContent(jsonObject.getString("content"));
                        siteNews.setStatus(1);
                        siteNews.setType(type);
                        siteNews.setType(type == 3 ? 4 : type);  // type == 3 时设为 4
                        siteNewsMapper.insert(siteNews);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            log.error("添加新闻出现异常: " + e.getMessage());
            log.error("添加新闻时出错,URL: {}, 类型: {}, 错误信息: {}", url, type, e.getMessage(), e);
        }
    }
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, EStockType.ST.getCode(), 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, EStockType.ST.getCode()));
        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
@@ -8,6 +8,7 @@
import com.nq.dao.StockSettingMapper;
import com.nq.dao.StockTimeSettingMapper;
import com.nq.dao.TradingHourMapper;
import com.nq.enums.EStockType;
import com.nq.pojo.Stock;
import com.nq.pojo.StockSetting;
import com.nq.pojo.StockTimeSetting;
@@ -48,7 +49,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", EStockType.ST.getCode()));
        if(stockSetting!= null){
            // 说明进入盘前交易或者盘后交易时间
            Date newDate = new Date();
src/main/java/com/nq/service/impl/UserAssetsServices.java
@@ -144,7 +144,7 @@
        userRecharge.setPayAmt(new BigDecimal(amt.intValue()));
        userRecharge.setAddTime(new Date());
        userRecharge.setPayTime(new Date());
        userRecharge.setOrderStatus(Integer.valueOf(1));
        userRecharge.setOrderStatus(Integer.valueOf(0));
        userRecharge.setPayId(1);
        userRechargeMapper.insert(userRecharge);
    }
@@ -211,9 +211,9 @@
                   userAssets.setAmountToBeCovered(BigDecimal.ZERO);
                   userAssets.setHandlingChargeWritten(BigDecimal.ZERO);
               }else{
                   BigDecimal amountToBeCovered = userAssets.getAmountToBeCovered().subtract(amount);
                   userAssets.setFreezeMoney(userAssets.getFreezeMoney().add(amount));
                   userAssets.setAmountToBeCovered(amountToBeCovered);
                   userAssets.setHandlingChargeWritten(BigDecimal.ZERO);
                   userAssets.setAmountToBeCovered(availableBalance.negate());
               }
           }else{
               userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(amount));
src/main/java/com/nq/service/impl/UserPositionServiceImpl.java
@@ -344,7 +344,7 @@
        UserAssets userAssets = userAssetsMapper.selectOne(new LambdaQueryWrapper<UserAssets>()
                .eq(UserAssets::getUserId, userPosition.getUserId())
                .eq(UserAssets::getAccectType, "IN")
                .eq(UserAssets::getAccectType, EStockType.ST.getCode())
        );
        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(EStockType.ST.getCode());
        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(EStockType.ST.getCode(), userPosition.getUserId());
        if(null == userAssets){
            return ServerResponse.createByErrorMsg("新股转持仓失败");
        }
        userAssetsMapper.updateById(userAssets);
        iUserAssetsServices.availablebalanceChange("IN", userAssets.getUserId(), EUserAssets.HANDLING_CHARGE, buy_fee_amt, "", "");
        iUserAssetsServices.availablebalanceChange(EStockType.ST.getCode(), 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(EStockType.ST.getCode(), 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.ST.getCode(), user.getId(), EUserAssets.BUY, buyAmt.negate(),"","");
        iUserAssetsServices.availablebalanceChange(EStockType.ST.getCode(), 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, EStockType.ST.getCode())
                );
                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.ST.getSymbol1());
            userRecharges.get(i).setChannelName(EStockType.ST.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.ST.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
@@ -140,21 +140,19 @@
    IUserService iUserService;
    public ServerResponse reg(String yzmCode, String agentCode, String phone, String userPwd, HttpServletRequest request) {
    public ServerResponse reg(String yzmCode, String agentCode, String phone, String userPwd,HttpServletRequest request) {
        if (StringUtils.isBlank(agentCode) || StringUtils.isBlank(phone) ||
                StringUtils.isBlank(userPwd) || StringUtils.isBlank(yzmCode)) {
            return ServerResponse.createByErrorMsg("注册失败。该参数不能为空",request);
        }
        String keys = "AliyunSmsCode:" + phone;
        String redis_yzm = RedisShardedPoolUtils.get(keys);
        String redis_yzm = RedisShardedPoolUtils.get(phone);
        log.info("redis_yzm = {},yzmCode = {}", redis_yzm, yzmCode);
        if (!yzmCode.equals(redis_yzm) && !"6666".equals(yzmCode)) {
            return ServerResponse.createByErrorMsg("由于验证码不正确,注册失败。过程",request);
        if (!yzmCode.equals(redis_yzm)) {
            return ServerResponse.createByErrorMsg("由于验证码不正确,注册失败。", request);
        }
        AgentUser agentUser = this.iAgentUserService.findByCode(agentCode);
        if (agentUser == null) {
@@ -210,7 +208,7 @@
            if (user.getIsLogin().intValue() == 1) {
                return ServerResponse.createByErrorMsg("登录失败。账户锁定",request);
            }
            userAssetsServices.assetsByTypeAndUserId(EStockType.IN.getCode(),user.getId());
            userAssetsServices.assetsByTypeAndUserId(EStockType.ST.getCode(),user.getId());
            this.iSiteLoginLogService.saveLog(user, request);
            return ServerResponse.createBySuccess(user);
        }
@@ -613,7 +611,7 @@
        userPositions = userPositionMapper.
                findMyPositionByCodeAndSpell(userId,
                        "","",
                        0, "IN");
                        0, EStockType.ST.getCode());
        List<UserPositionVO> userPositionVOS = Lists.newArrayList();
@@ -770,7 +768,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 -> EStockType.ST.getCode().equals(stock.getAccectType()))
                    .findFirst()
                    .orElse(null);
@@ -828,8 +826,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.ST.getCode(),dbUser.getId() );
        userAssetsServices.availablebalanceChange(EStockType.ST.getCode(),dbUser.getId(),EUserAssets.TOP_UP,new BigDecimal(amt),"","");
        if (insertCount > 0) {
            return ServerResponse.createBySuccessMsg("Success");
        }
@@ -854,7 +852,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 -> EStockType.ST.getCode().equals(stock.getAccectType()))
                    .findFirst()
                    .orElse(null);
src/main/java/com/nq/service/impl/UserStockSubscribeServiceImpl.java
@@ -85,7 +85,7 @@
            return ServerResponse.createByErrorMsg("参数错误",request);
        }
        User user = iUserService.getCurrentRefreshUser(request);
        UserAssets userAssets =   iUserAssetsServices.assetsByTypeAndUserId("IN",user.getId());
        UserAssets userAssets =   iUserAssetsServices.assetsByTypeAndUserId(EStockType.ST.getCode(),user.getId());
        if (model.getNewCode() != null) {
            StockSubscribe stockSubscribe = stockSubscribeMapper.selectOne(new QueryWrapper<StockSubscribe>()
                    .eq("newlist_id", model.getNewlistId()));
@@ -190,7 +190,7 @@
//                   bound =  new BigDecimal(model.getApplyNums()).multiply(stockSubscribe.getPrice());
//               }
//
               BigDecimal useEnaAmount = iUserAssetsServices.getAvailableBalance(EStockType.IN.getCode(), user.getId());
               BigDecimal useEnaAmount = iUserAssetsServices.getAvailableBalance(EStockType.ST.getCode(), user.getId());
               if(useEnaAmount.compareTo(bound)<0){
                   return ServerResponse.createByErrorMsg("余额不足,配售失败",request);
               }
@@ -209,7 +209,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.ST.getCode(), user.getId(),EUserAssets.BUY,bound.negate(),"","");
                if (ret > 0) {
                    return ServerResponse.createBySuccessMsg("配售成功",request);
                } else {
@@ -253,7 +253,7 @@
            }
            //客户中签直接扣除客户账户可用资金
            UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId("IN", userStockSubscribe.getUserId());
            UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(EStockType.ST.getCode(), 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())));
@@ -293,7 +293,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.ST.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);
@@ -497,14 +497,14 @@
                    userStockSubscribe.setSubmitTime(DateTimeUtil.getCurrentDate());
                    userStockSubscribe.setStatus(4);
                    BigDecimal bigDecimal =  iUserAssetsServices.
                            getAvailableBalance(EStockType.IN.getCode(),
                            getAvailableBalance(EStockType.ST.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.ST.getCode(),userStockSubscribe.getUserId(),
                            EUserAssets.BUY,multiply.negate(),"","");
                    userStockSubscribe.setDbMoney(BigDecimal.ZERO);
                    userStockSubscribeMapper.update1(userStockSubscribe);
src/main/java/com/nq/service/impl/UserWithdrawServiceImpl.java
@@ -5,6 +5,7 @@
import com.google.gson.Gson;
import com.nq.dao.*;
import com.nq.enums.EConfigKey;
import com.nq.enums.EStockType;
import com.nq.enums.EUserAssets;
import com.nq.pay.PayUtil;
import com.nq.pojo.*;
@@ -94,6 +95,9 @@
    @Autowired
    UserAssetsMapper userAssetsMapper;
    @Autowired
    UserAssetsServices userAssetsServices;
    @Resource
    StockTimeSettingMapper stockTimeSettingMapper;
@@ -168,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", EStockType.ST.getCode()));
        if(stockTimeSetting == null){
            return false;
        }
@@ -236,7 +240,7 @@
            User user = this.userMapper.selectById(userWithdraw.getUserId());
            UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId("IN", user.getId());
            UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(EStockType.ST.getCode(), user.getId());
            if (userAssets == null) {
                return ServerResponse.createByErrorMsg("用户资金账户不存在");
            }
@@ -349,7 +353,7 @@
        if (user == null) {
            return ServerResponse.createByErrorMsg("用户不存在");
        }
        UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId("IN", user.getId());
        UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(EStockType.ST.getCode(), user.getId());
        if (userAssets == null) {
            return ServerResponse.createByErrorMsg("用户资金账户不存在");
        }
src/main/java/com/nq/utils/redis/RedisKeyConstant.java
@@ -26,4 +26,12 @@
    public static final String RK_COMPANY_INFO = "rk_company_info";
    /**
     * 短信code
     */
    public static final String verification_code= "verification_code";
}
src/main/java/com/nq/utils/smsUtil/smsUtil.java
@@ -1,8 +1,10 @@
package com.nq.utils.smsUtil;
import com.google.gson.Gson;
import com.nq.controller.SmsApiController;
import com.nq.utils.PropertiesUtil;
import com.nq.utils.pay.CmcPayOuterRequestUtil;
import com.nq.utils.redis.RedisKeyConstant;
import com.nq.utils.redis.RedisShardedPoolUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.slf4j.Logger;
@@ -16,38 +18,25 @@
    private static final Logger log = LoggerFactory.getLogger(SmsApiController.class);
    public String sendSMS(String telephone) {
        String code = RandomStringUtils.randomNumeric(4);
        CmcPayOuterRequestUtil requestUtil = new CmcPayOuterRequestUtil();
        String sign = "【短信签名】";
        String uid = PropertiesUtil.getProperty("dxb.sms.USERNAME");
        String key = PropertiesUtil.getProperty("dxb.sms.PASSWORD");
//        String coding = PropertiesUtil.getProperty("wj.sms.coding");
        String smscontent = sign+"您正在申请手机注册,验证码为:" + code + ",5分钟内有效!";
        //设置签名
        // 生成6位数字验证码
        String verificationCode = RandomStringUtils.randomNumeric(6);
        try {
            uid = URLEncoder.encode(uid,"UTF-8");
            smscontent = URLEncoder.encode(smscontent,"UTF-8");
        } catch (UnsupportedEncodingException e){
            e.printStackTrace();
            // 将验证码存入 Redis,设置 30 秒过期时间
            String redisKey = RedisKeyConstant.verification_code + ":" + telephone; // 使用电话号码作为唯一标识符
            RedisShardedPoolUtils.setEx(redisKey, verificationCode, 30);
        } catch (Exception e) {
            // 捕获异常并记录日志,避免程序崩溃
            System.err.println("Error storing verification code in Redis: " + e.getMessage());
            // 你可以根据需要做进一步的异常处理,比如重新抛出异常
        }
//        String url = "http://"+ cod+ing +".api.smschinese.cn/?Uid="+ uid +"&Key="+ key +"&smsMob=" + telephone + "&smsText="+sign+smscontent;
        String url ="https://api.smsbao.com/sms?u="+uid+"&p="+key+"&m="+telephone+"&c="+smscontent;
        log.info("smsurl"+url);
        String result = requestUtil.sendGet(url);
        log.info("smsresult="+result+"==code="+code);
        if (Integer.valueOf(result) < 0) {
            return "";
        } else {
            String keys = "AliyunSmsCode:" + telephone;
            RedisShardedPoolUtils.setEx(keys, code, 5400);
            return code;
        }
        // 返回验证码
        return verificationCode;
    }
    /**
     * 找回密码
     */
src/main/java/com/nq/utils/stock/sina/StockApi.java
@@ -44,7 +44,7 @@
                    stockListVO.setColor(0);
                }else{
                    stockListVO.setColor(1);
                    stockListVO.setHcrateP("+"+realTimeStock.getPcp()+"%");
                    stockListVO.setHcrateP(realTimeStock.getPcp()+"%");
                }
                stockListVO.setNowPrice(realTimeStock.getLast());
                stockListVO.setToday_max(realTimeStock.getHigh());
src/main/java/com/nq/utils/task/news/NewsTask.java
@@ -38,7 +38,7 @@
    /*
     * 新聞資訊抓取
     * */
    @Scheduled(cron = "0 0/5 * * * ?")
    @Scheduled(cron = "0/10 * * * * ?")
    public void NewsInfoTask() {
        if (NewsInfoTask.get()) { // 判断任务是否在处理中
            return;
@@ -57,14 +57,4 @@
            }
        }
    }
    /*
     * 新聞公告抓取
     * */
//    @Scheduled(cron = "0 0/30 9-20 * * ?")
//    public void ArtInfoTask() {
//        this.iSiteArticleService.grabArticle();
//    }
}
src/main/java/com/nq/utils/task/stock/CarryPositionTask.java
@@ -9,6 +9,7 @@
import com.nq.dao.UserAssetsMapper;
import com.nq.dao.UserMapper;
import com.nq.dao.UserStockSubscribeMapper;
import com.nq.enums.EStockType;
import com.nq.pojo.StockSubscribe;
import com.nq.pojo.User;
import com.nq.pojo.UserAssets;
@@ -113,7 +114,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(EStockType.ST.getCode(),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.ST);
            } finally {
                syncINStockDataLock.unlock();
                syncINStockData.set(false); // 设置处理中标识为false
@@ -82,31 +82,31 @@
     * 同步美国股票
     */
//    @Scheduled(cron = "0 0/30 * * * ?")
    public void loadStockCompanies() {
        loadAllCompanies();
    }
    /**
     * 加载公司信息
     */
    public void loadAllCompanies() {
        List<Stock> list = stockMapper.findStockList();
        for (int i = 0; i < list.size(); i++) {
            Stock stock = list.get(i);
            EStockType eStockType = EStockType.getEStockTypeByCode(stock.getStockType());
            String result = HttpClientRequest.doGet(eStockType.stockUrl + "companies?pid=+" + stock.getStockCode() + "+country_id=" + eStockType.getContryId() + "&size=1&page=1&key=" + eStockType.stockKey);
            try {
                JSONObject jsonObject = JSONObject.parseObject(result);
                JSONObject companiesInfo = jsonObject.getJSONArray("data").getJSONObject(0);
                RedisKeyUtil.setCacheCompanies(stock, new Gson().toJson(companiesInfo));
            } catch (Exception e) {
                log.info("");
            }
        }
    }
//    public void loadStockCompanies() {
//        loadAllCompanies();
//    }
//
//
//    /**
//     * 加载公司信息
//     */
//    public void loadAllCompanies() {
//        List<Stock> list = stockMapper.findStockList();
//        for (int i = 0; i < list.size(); i++) {
//            Stock stock = list.get(i);
//            EStockType eStockType = EStockType.getEStockTypeByCode(stock.getStockType());
//            String result = HttpClientRequest.doGet(eStockType.stockUrl + "companies?pid=+" + stock.getStockCode() + "+country_id=" + eStockType.getContryId() + "&size=1&page=1&key=" + eStockType.stockKey);
//            try {
//                JSONObject jsonObject = JSONObject.parseObject(result);
//                JSONObject companiesInfo = jsonObject.getJSONArray("data").getJSONObject(0);
//                RedisKeyUtil.setCacheCompanies(stock, new Gson().toJson(companiesInfo));
//            } catch (Exception e) {
//                log.info("");
//
//            }
//        }
//
//    }
    /**
     * 加载所有股票数据
@@ -178,26 +178,26 @@
     * 强制平仓
     */
//    @Scheduled(cron = "0/1 * * * * ?")
    public void stockConstraint() {
        if (stockConstraint.get()) { // 判断任务是否在处理中
            return;
        }
        if (stockConstraintLock.tryLock()) {
            try {
                stockConstraint.set(true); // 设置处理中标识为true
                List<UserPosition> userPositions = userPositionMapper.selectList(new LambdaQueryWrapper<UserPosition>().isNull(UserPosition::getSellOrderId));
                if (CollectionUtils.isNotEmpty(userPositions)) {
                    userPositionService.stockConstraint(userPositions);
                }
            } catch (Exception e) {
                e.printStackTrace();
                log.error("强制平仓任务错误:" + e.getMessage());
            } finally {
                stockConstraintLock.unlock();
                stockConstraint.set(false); // 设置处理中标识为false
            }
        } else {
            log.info("强制平仓任务--------->上次任务还未执行完成,本次任务忽略");
        }
    }
//    public void stockConstraint() {
//        if (stockConstraint.get()) { // 判断任务是否在处理中
//            return;
//        }
//        if (stockConstraintLock.tryLock()) {
//            try {
//                stockConstraint.set(true); // 设置处理中标识为true
//                List<UserPosition> userPositions = userPositionMapper.selectList(new LambdaQueryWrapper<UserPosition>().isNull(UserPosition::getSellOrderId));
//                if (CollectionUtils.isNotEmpty(userPositions)) {
//                    userPositionService.stockConstraint(userPositions);
//                }
//            } catch (Exception e) {
//                e.printStackTrace();
//                log.error("强制平仓任务错误:" + e.getMessage());
//            } finally {
//                stockConstraintLock.unlock();
//                stockConstraint.set(false); // 设置处理中标识为false
//            }
//        } else {
//            log.info("强制平仓任务--------->上次任务还未执行完成,本次任务忽略");
//        }
//    }
}
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("ST_HTTP_API")),EStockType.IN);
            WebsocketRunClient websocketRunClient = new WebsocketRunClient(new URI(PropertiesUtil.getProperty("ST_WS_URL")),EStockType.ST);
            websocketRunClient.connect();
            websocketRunClient.setConnectionLostTimeout(0);
            new Thread(() -> {
src/main/java/com/nq/ws/WebsocketRunClient.java
@@ -45,24 +45,23 @@
    static {
        httpPost = new HttpPost("http://127.0.0.1:8001/api/sendNotification"); // 初始化 HttpPost
    }
    private Timer heartbeatTimer;
    @Override
    public void onOpen(ServerHandshake serverHandshake) {
        send(("key:"+ eStockType.getStockKey()+":"+eStockType.getContryId()).getBytes());
//        Timer heartbeatTimer;
//        // 启动心跳定时器
//        heartbeatTimer = new Timer();
//        heartbeatTimer.schedule(new TimerTask() {
//            @Override
//            public void run() {
//                send(("key:"+ eStockType.getStockKey()+":"+eStockType.getContryId()).getBytes());
//            }
//        }, 0, 3000); // 每3秒发送一次心跳消息
        // 启动心跳定时器
        heartbeatTimer = new Timer();
        heartbeatTimer.schedule(new TimerTask() {
            @Override
            public void run() {
                send("heartbeat");
            }
        }, 0, 3000); // 每3秒发送一次心跳消息
    }
    @Override
    public void onMessage(String s) {
        if(!s.equals("pong") && !s.equals("身份验证成功")){
        if(!s.equals("pong") && !s.equals("身份验证成功") && !s.equals("请先身份校验")){
            Map<String, String> stringObjectMap = jsonToMap(s);
            StockRealTimeBean stockRealTimeBean = new StockRealTimeBean();
            stockRealTimeBean.setPid(stringObjectMap.get("Id").toString());
@@ -74,14 +73,16 @@
            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.ST,stockRealTimeBean);
            ObjectMapper objectMapper = new ObjectMapper();
            try {
                if(!stockRealTimeBean.getPcp().contains("-")){
                    stockRealTimeBean.setPcp("+"+stringObjectMap.get("ChgPct").toString()+"%");
                }
                String json = objectMapper.writeValueAsString(stockRealTimeBean);
                sendLoca(json);
//                sendLoca(json);
                StockRealTimeBean stockDetailBean =  new Gson().fromJson(s, StockRealTimeBean.class);
                RedisKeyUtil.setCacheRealTimeStock(EStockType.ST,stockDetailBean);
            } catch (JsonProcessingException e) {
                throw new RuntimeException(e);
            }
@@ -96,13 +97,24 @@
    }
    @Override
    public void onClose(int i, String s, boolean b) {
        log.info("websocket  印度股票  关闭"+1);
    public void onClose(int code, String reason, boolean remote) {
        System.out.println("连接关闭: " + reason);
        if (heartbeatTimer != null) {
            heartbeatTimer.cancel(); // 取消心跳定时器
        }
        // 尝试重新连接
        try {
            System.out.println("尝试重新连接...");
            Thread.sleep(10000); // 10秒后尝试重新连接
            connect(); // 重新连接
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void onError(Exception e) {
        log.info("websocket 错误");
        log.info("websocket 错误"+e.getMessage());
    }
    public void sendLoca(String message) {
src/main/java/com/nq/ws/WsClientConfig.java
@@ -43,9 +43,9 @@
//@Configuration
//public class WsClientConfig {
//
//    private static final String SERVER_URL = PropertiesUtil.getProperty("JS_IN_HTTP_API");
//    private static final String AUTH_KEY = PropertiesUtil.getProperty("JS_IN_KEY");
//    private static final String ROOM_ID = "14";
//    private static final String SERVER_URL = PropertiesUtil.getProperty("ST_HTTP_API");
//    private static final String AUTH_KEY = PropertiesUtil.getProperty("ST_KEY");
//    private static final String ROOM_ID = "52";
//    private static Socket socket;
//
//    private static HttpClient httpClient = HttpClients.createDefault(); // 单例化 HttpClient
src/main/resources/application.properties
@@ -60,7 +60,7 @@
HK_WS_URL = ws://test-ws.js-stock.top
HK_KEY = mG8QQDdjGuLjLnrryd0B
ST_HTTP_API = http://api-sa.js-stock.top
ST_HTTP_API = http://api-sa.js-stock.top/
ST_WS_URL = ws://api-sa-ws.js-stock.top
ST_KEY = eiFMWvMcKgVlCYKD7S4y
src/main/resources/mapper/SiteNewsMapper.xml
@@ -35,111 +35,6 @@
                content
    </sql>
    <insert id="insert" useGeneratedKeys="true" keyColumn="id" keyProperty="id" parameterType="com.nq.pojo.SiteNews">
        INSERT INTO site_news
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test ='null != type'>
                type,
            </if>
            <if test ='null != title'>
                title,
            </if>
            <if test ='null != sourceId'>
                source_id,
            </if>
            <if test ='null != sourceName'>
                source_name,
            </if>
            <if test ='null != views'>
                views,
            </if>
            <if test ='null != status'>
                status,
            </if>
            <if test ='null != showTime'>
                show_time,
            </if>
            <if test ='null != addTime'>
                add_time,
            </if>
            <if test ='null != updateTime'>
                update_time,
            </if>
            <if test ='null != imgurl'>
                imgurl,
            </if>
            <if test ='null != description'>
                description,
            </if>
            <if test ='null != content'>
                content
            </if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test ='null != type'>
                #{type},
            </if>
            <if test ='null != title'>
                #{title},
            </if>
            <if test ='null != sourceId'>
                #{sourceId},
            </if>
            <if test ='null != sourceName'>
                #{sourceName},
            </if>
            <if test ='null != views'>
                #{views},
            </if>
            <if test ='null != status'>
                #{status},
            </if>
            <if test ='null != showTime'>
                #{showTime},
            </if>
            <if test ='null != addTime'>
                #{addTime},
            </if>
            <if test ='null != updateTime'>
                #{updateTime},
            </if>
            <if test ='null != imgurl'>
                #{imgurl},
            </if>
            <if test ='null != description'>
                #{description},
            </if>
            <if test ='null != content'>
                #{content}
            </if>
        </trim>
    </insert>
    <delete id="delete" >
        DELETE FROM site_news
        WHERE id = #{id}
    </delete>
    <update id="update" parameterType="com.nq.pojo.SiteNews">
        UPDATE site_news
        <set>
            <if test ='null != type'>type = #{type},</if>
            <if test ='null != title'>title = #{title},</if>
            <if test ='null != sourceId'>source_id = #{sourceId},</if>
            <if test ='null != sourceName'>source_name = #{sourceName},</if>
            <if test ='null != views'>views = #{views},</if>
            <if test ='null != status'>status = #{status},</if>
            <if test ='null != showTime'>show_time = #{showTime},</if>
            <if test ='null != addTime'>add_time = #{addTime},</if>
            <if test ='null != updateTime'>update_time = #{updateTime},</if>
            <if test ='null != imgurl'>imgurl = #{imgurl},</if>
            <if test ='null != description'>description = #{description},</if>
            <if test ='null != content'>content = #{content}</if>
        </set>
        WHERE id = #{id}
    </update>
    <select id="load" resultMap="BaseResultMap">
        SELECT <include refid="Base_Column_List" />
        FROM site_news