1
zj
2024-10-29 57c2b6875b5f026a1432f3209471d6b4503f43fc
1
30 files modified
1 files added
462 ■■■■ changed files
src/main/java/com/nq/config/ScheduleConfig.java 1 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/controller/PayApiController.java 6 ●●●●● patch | view | raw | blame | history
src/main/java/com/nq/controller/RechargeAddressController.java 3 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/controller/backend/AdminController.java 5 ●●●●● patch | view | raw | blame | history
src/main/java/com/nq/controller/backend/AdminRechargeController.java 15 ●●●●● patch | view | raw | blame | history
src/main/java/com/nq/controller/protol/UserController.java 4 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/dao/StockMapper.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/nq/dao/UserRechargeMapper.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/nq/pojo/UserPendingorder.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/com/nq/service/IUserAssetsServices.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/nq/service/IUserRechargeService.java 4 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/service/UserPendingorderService.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/nq/service/impl/PriceServicesImpl.java 28 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/service/impl/StockServiceImpl.java 36 ●●●● 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/UserPendingorderServiceImpl.java 18 ●●●●● patch | view | raw | blame | history
src/main/java/com/nq/service/impl/UserPositionServiceImpl.java 10 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/service/impl/UserRechargeServiceImpl.java 14 ●●●●● 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 19 ●●●●● patch | view | raw | blame | history
src/main/java/com/nq/service/impl/UserWithdrawServiceImpl.java 4 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/utils/task/news/NewsTask.java 30 ●●●●● patch | view | raw | blame | history
src/main/java/com/nq/utils/task/stock/CarryPositionTask.java 18 ●●●●● patch | view | raw | blame | history
src/main/java/com/nq/utils/task/stock/StockTask.java 21 ●●●● patch | view | raw | blame | history
src/main/java/com/nq/ws/USWebsocketRunClient.java 108 ●●●●● patch | view | raw | blame | history
src/main/java/com/nq/ws/WebSocketClientBeanConfig.java 22 ●●●●● patch | view | raw | blame | history
src/main/resources/application.properties 6 ●●●● patch | view | raw | blame | history
src/main/resources/mapper/StockMapper.xml 7 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/UserPositionMapper.xml 19 ●●●● patch | view | raw | blame | history
src/main/resources/mapper/UserRechargeMapper.xml 24 ●●●● patch | view | raw | blame | history
src/main/resources/mapper/UserWithdrawMapper.xml 2 ●●● patch | view | raw | blame | history
src/main/java/com/nq/config/ScheduleConfig.java
@@ -15,7 +15,6 @@
// * @author leon
// * @createDate    2018年10月15日 下午4:02:38
// * @version    v1.0
// * @classRemarks TODO
// */
//@Configuration
//public class ScheduleConfig implements SchedulingConfigurer {
src/main/java/com/nq/controller/PayApiController.java
@@ -80,7 +80,6 @@
        if ("1".equals((String) request.getParameter("status"))) {
            // 这里编写用户业务逻辑代码,如存储订单状态,自动发货等
            //TODO
            if (amount != null & !StringUtils.isEmpty(amount)) {
                System.out.println("============更新用户金额===============");
                Double aDouble = Double.valueOf(amount);
@@ -89,7 +88,7 @@
                UserRecharge userRecharge = this.userRechargeMapper.findUserRechargeByOrderSn(orderno);
                if(userRecharge == null){
                    System.out.println("============充值完成===============");
                    iUserRechargeService.createOrder(Integer.valueOf(arr[0]), 1, aDouble.intValue(), orderno);
//                    iUserRechargeService.createOrder(Integer.valueOf(arr[0]), 1, aDouble.intValue(), orderno);
                    jsonObj.put("reason", "success");
                } else {
                    System.out.println("============充值失败,已回调成功无需重复回调===============");
@@ -127,7 +126,6 @@
        //if ("200".equals((String) request.getParameter("status"))) {
            // 这里编写用户业务逻辑代码,如存储订单状态,自动发货等
            //TODO
            if (amount != null & !StringUtils.isEmpty(amount)) {
                System.out.println("============更新用户金额===============");
                Double aDouble = Double.valueOf(amount);
@@ -136,7 +134,7 @@
                UserRecharge userRecharge = this.userRechargeMapper.findUserRechargeByOrderSn(orderno);
                if(userRecharge == null){
                    System.out.println("============充值完成===============");
                    iUserRechargeService.createOrder(Integer.valueOf(arr[0]), 1, aDouble.intValue(), orderno);
//                    iUserRechargeService.createOrder(Integer.valueOf(arr[0]), 1, aDouble.intValue(), orderno);
                } else {
                    System.out.println("============充值失败,已回调成功无需重复回调===============");
                }
src/main/java/com/nq/controller/RechargeAddressController.java
@@ -41,7 +41,8 @@
    public ServerResponse createUSDTOrder(@RequestParam("userId") Integer userId,
                                          @RequestParam("amt") Integer amt,
                                          @RequestParam("img") String img,
                                          @RequestParam("accectType") String accectType,
                                          HttpServletRequest request) {
        return ServerResponse.createBySuccess(iUserRechargeService.createUSDTOrder(userId,amt,img,request));
        return ServerResponse.createBySuccess(iUserRechargeService.createUSDTOrder(userId,amt,img,accectType,request));
    }
}
src/main/java/com/nq/controller/backend/AdminController.java
@@ -373,10 +373,11 @@
    public  ServerResponse updateayChnnel(
            @RequestParam("id") Integer id,
            @RequestParam("amt") String amt,
            @RequestParam("type") String type
            @RequestParam("type") String type,
            @RequestParam("accectType") String accectType
    ){
        return  iUserAssetsServices.updateUserAssets(id,amt,type);
        return  iUserAssetsServices.updateUserAssets(id,amt,type,accectType);
    }
    //查询首页充值,提现,注册统计
src/main/java/com/nq/controller/backend/AdminRechargeController.java
@@ -91,12 +91,15 @@
        return serverResponse;
    }
    //创建资金管理 充值订单
    @RequestMapping({"createOrder.do"})
    @ResponseBody
    public ServerResponse createOrder(@RequestParam(value = "userId", required = false) Integer userId, @RequestParam(value = "state", required = false) Integer state, @RequestParam(value = "amt", required = false) Integer amt, @RequestParam(value = "payChannel", required = false) String payChannel) {
        return this.iUserRechargeService.createOrder(userId, state, amt, payChannel);
    }
//    //创建资金管理 充值订单
//    @RequestMapping({"createOrder.do"})
//    @ResponseBody
//    public ServerResponse createOrder(@RequestParam(value = "userId", required = false) Integer userId,
//                                      @RequestParam(value = "state", required = false) Integer state,
//                                      @RequestParam(value = "amt", required = false) Integer amt,
//                                      @RequestParam(value = "payChannel", required = false) String payChannel) {
//        return this.iUserRechargeService.createOrder(userId, state, amt, payChannel);
//    }
    //删除资金管理 充值列表订单信息
    @RequestMapping({"del.do"})
src/main/java/com/nq/controller/protol/UserController.java
@@ -185,11 +185,11 @@
    //挂单操作-列表
    @RequestMapping({"orderList.do"})
    @ResponseBody
    public ServerResponse orderList(HttpServletRequest request) {
    public ServerResponse orderList(@RequestParam("stockType") String stockType,HttpServletRequest request) {
        ServerResponse serverResponse = null;
        try {
            serverResponse = this.userPendingorderService.orderList(request);
            serverResponse = this.userPendingorderService.orderList(stockType,request);
        } catch (Exception e) {
            log.error("挂单操作-列表 = {}", e);
        }
src/main/java/com/nq/dao/StockMapper.java
@@ -56,5 +56,5 @@
  List findStockByType(@Param("orderBy") String orderBy, @Param("stockType") String stockType,@Param("keyWords") String keyWords);
  List findStockTypeDz(@Param("orderBy") String orderBy, @Param("stockType") String stockType,@Param("keyWords") String keyWords);
  List findStockTypeDz(@Param("orderBy") String orderBy, @Param("keyWords") String keyWords);
}
src/main/java/com/nq/dao/UserRechargeMapper.java
@@ -9,7 +9,7 @@
public interface UserRechargeMapper extends BaseMapper<UserRecharge> {
  int insert(UserRecharge paramUserRecharge);
//  int insert(UserRecharge paramUserRecharge);
  
  int insertSelective(UserRecharge paramUserRecharge);
  
src/main/java/com/nq/pojo/UserPendingorder.java
@@ -38,6 +38,8 @@
    private Date addTime;
    private String assetsType;
    private Integer status;
    private static final long serialVersionUID = 1L;
src/main/java/com/nq/service/IUserAssetsServices.java
@@ -21,7 +21,7 @@
    ServerResponse updateUserAssets(Integer id, String amt,String type);
    ServerResponse updateUserAssets(Integer id, String amt,String type,String accectType);
    List<UserAssets>  assetsByUserId(Integer userId);
src/main/java/com/nq/service/IUserRechargeService.java
@@ -30,7 +30,7 @@
  
  ServerResponse updateState(Integer paramInteger1, Integer paramInteger2) throws Exception;
  
  ServerResponse createOrder(Integer paramInteger1, Integer paramInteger2, Integer paramInteger3, String paramString);
  ServerResponse createOrder(Integer paramInteger1, Integer paramInteger2, Integer paramInteger3, String paramString,String accectType);
  
  ServerResponse del(Integer paramInteger);
  
@@ -42,5 +42,5 @@
  List<UserRecharge> exportByAdmin( Integer agentId, Integer userId, String realName, Integer state, String beginTime, String endTime, HttpServletRequest request);
  public ServerResponse createUSDTOrder(Integer userId,Integer amt,String currency,HttpServletRequest request);
  public ServerResponse createUSDTOrder(Integer userId,Integer amt,String currency,String accectType,HttpServletRequest request);
}
src/main/java/com/nq/service/UserPendingorderService.java
@@ -17,7 +17,7 @@
    ServerResponse addOrder(String stockId, Integer buyNum, Integer buyType, Integer lever, BigDecimal profitTarget, BigDecimal stopTarget, BigDecimal targetPrice, HttpServletRequest request);
    ServerResponse orderList( HttpServletRequest request);
    ServerResponse orderList(String stockType, HttpServletRequest request);
    void orderTask();
src/main/java/com/nq/service/impl/PriceServicesImpl.java
@@ -57,19 +57,27 @@
                if (stockSetting.getType().equals("0")) {
                    return new BigDecimal(stockSetting.getPrice());
                } else {
                    String s = doPost(stock.getStockCode());
                    String s = doPost(stock.getStockCode(),stock.getStockType());
                    if (null != s) {
                        Map<String, Object> stringObjectMap = jsonToMap(s);
                        return new BigDecimal(stringObjectMap.get("last").toString()).multiply(new BigDecimal(stockSetting.getPrice()));
                        if(stock.getStockType().equals("US")){
                            return new BigDecimal(stringObjectMap.get("Last").toString()).multiply(new BigDecimal(stockSetting.getPrice()));
                        }else{
                            return new BigDecimal(stringObjectMap.get("last").toString()).multiply(new BigDecimal(stockSetting.getPrice()));
                        }
                    }
                }
            }
        }
        String s = doPost(stock.getStockCode());
        String s = doPost(stock.getStockCode(),stock.getStockType());
        if (null != s) {
            Map<String, Object> stringObjectMap = jsonToMap(s);
            return new BigDecimal(stringObjectMap.get("last").toString());
            if(stock.getStockType().equals("US")){
                return new BigDecimal(stringObjectMap.get("Last").toString());
            }else{
                return new BigDecimal(stringObjectMap.get("last").toString());
            }
        }
        return BigDecimal.ZERO;
    }
@@ -77,7 +85,7 @@
    @Override
    public Map<String, Object> getNewStock(String stockCode) {
        Stock stock = stockMapper.selectOne(new QueryWrapper<Stock>().eq("stock_code", stockCode));
        String s = doPost(stock.getStockCode());
        String s = doPost(stock.getStockCode(),stock.getStockType());
        if (null != s) {
            Map<String, Object> stringObjectMap = jsonToMap(s);
            return stringObjectMap;
@@ -99,10 +107,14 @@
        }
    }
    public String doPost(String pid) {
    public String doPost(String pid,String stockType) {
        String url;
        if(stockType.equals("JP")){
            url = PropertiesUtil.getProperty("JP_HTTP_API") + "stock?version=v1&key=" + PropertiesUtil.getProperty("JP_KEY");
        }else{
            url = PropertiesUtil.getProperty("US_HTTP_API") + "stock?version=v1&key=" + PropertiesUtil.getProperty("US_KEY");
        }
        try {
            String url = PropertiesUtil.getProperty("JP_HTTP_API") + "stock?version=v1&key=" + PropertiesUtil.getProperty("JP_KEY");
            URL obj = new URL(url);
            HttpURLConnection con = (HttpURLConnection) obj.openConnection();
src/main/java/com/nq/service/impl/StockServiceImpl.java
@@ -172,12 +172,13 @@
    @Override
    public ServerResponse getStockByType(int pageNum, int pageSize, String orderBy, String keyWords, String stockType, HttpServletRequest request) {
        List<Stock> stockList = new ArrayList<>();
        if(stockType.equals(EStockType.JP.getCode())){
        PageHelper.startPage(pageNum, pageSize);
        if(!stockType.equals("DZ")){
            PageHelper.startPage(pageNum, pageSize);
            stockList.addAll(stockMapper.findStockByType(orderBy,stockType,keyWords));
        }else{
            PageHelper.startPage(pageNum, pageSize);
            stockList.addAll(stockMapper.findStockTypeDz(orderBy,EStockType.JP.getCode(), keyWords));
            stockList.addAll(stockMapper.findStockTypeDz(orderBy, keyWords));
        }
        List<StockListVO> stockListVOS = Lists.newArrayList();
@@ -222,10 +223,17 @@
        stockVO.setName(stock.getStockName());
        stockVO.setSpell(stock.getStockSpell());
        stockVO.setGid(stock.getStockGid().toUpperCase());
        Map<String, Object> newStock = iPriceServices.getNewStock(stock.getStockCode());
        stockVO.setHcrate(newStock.get("pcp").toString().replaceAll("%", ""));
        stockVO.setToday_max(newStock.get("high").toString());
        stockVO.setToday_min(newStock.get("low").toString());
        if(stock.getStockType().equals("US")){
            stockVO.setHcrate(newStock.get("ChgPct").toString().replaceAll("%", ""));
            stockVO.setToday_max(newStock.get("High").toString());
            stockVO.setToday_min(newStock.get("Low").toString());
        }else{
            stockVO.setHcrate(newStock.get("pcp").toString().replaceAll("%", ""));
            stockVO.setToday_max(newStock.get("high").toString());
            stockVO.setToday_min(newStock.get("low").toString());
        }
        if(null != cacheBaseStock){
            stockVO.setOpen_px(cacheBaseStock.getOpen());
            stockVO.setPreclose_px(cacheBaseStock.getPrevClose());
@@ -492,8 +500,24 @@
            lastData.setL(stockVO.getToday_min());
            return gson.toJson(dataList);
        }else{
            Object object = HttpUtil.get(eStockType.stockUrl + "kline?pid=" + pid + "&interval=" + interval + "&key=" + eStockType.stockKey);
            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));
            BigDecimal nowPrice = iPriceServices.getNowPrice(stock.getStockCode());
            Map singleStock = getSingleStock(stock.getStockCode());
            StockVO stockVO = (StockVO)singleStock.get("stock");
            // 修改 List 中的最后一条数据
            kData lastData = dataList.get(dataList.size() - 1);
            lastData.setC(nowPrice.toString());
            lastData.setO(stockVO.getOpen_px());
            lastData.setH(stockVO.getToday_max());
            lastData.setL(stockVO.getToday_min());
            return gson.toJson(dataList);
        }
        return  HttpUtil.get(eStockType.stockUrl + "kline?pid=" + pid + "&interval=" + interval + "&key=" + eStockType.stockKey);
//        return  HttpUtil.get(eStockType.stockUrl + "kline?pid=" + pid + "&interval=" + interval + "&key=" + eStockType.stockKey);
    }
    @Override
src/main/java/com/nq/service/impl/UserAssetsServices.java
@@ -62,8 +62,8 @@
    }
    @Override
    public ServerResponse updateUserAssets(Integer id, String amt,String type) {
        UserAssets userAssets = userAssetsMapper.selectOne(new LambdaQueryWrapper<>(UserAssets.class).eq(UserAssets::getUserId,id));
    public ServerResponse updateUserAssets(Integer id, String amt,String type,String accectType) {
        UserAssets userAssets = userAssetsMapper.selectOne(new LambdaQueryWrapper<>(UserAssets.class).eq(UserAssets::getUserId,id).eq(UserAssets::getAccectType,accectType));
        //  0 入款  1是扣钱  2 是充值  3 是提币
        BigDecimal bigAmt = new BigDecimal(amt);
        if(type.equals("0") || type.equals("1")){
@@ -105,7 +105,7 @@
            }
        }else{
            if(type.equals("2")){
                return  userRechargeService.createOrder(id,1,bigAmt.intValue(),"1");
                return  userRechargeService.createOrder(id,1,bigAmt.intValue(),"1",accectType);
            }else{
src/main/java/com/nq/service/impl/UserPendingorderServiceImpl.java
@@ -72,7 +72,7 @@
    UserAssetsMapper userAssetsMapper;
    @Override
    public ServerResponse addOrder(String stockId, Integer buyNum, Integer buyType, Integer lever, BigDecimal profitTarget, BigDecimal stopTarget, BigDecimal targetPrice, HttpServletRequest request) {
    public ServerResponse addOrder(String stockId, Integer buyNum, Integer buyType, Integer lever, BigDecimal profitTarget, BigDecimal stopTarget, BigDecimal targetPrice,HttpServletRequest request) {
        User user = this.iUserService.getCurrentRefreshUser(request);
        if (user == null) {
@@ -87,17 +87,17 @@
            return ServerResponse.createByErrorMsg("The pending order failed because the purchased quantity was greater than" + siteSetting
                    .getBuyMaxNum() + "stocks",request);
        }
        Stock stock = stockMapper.selectOne(new LambdaQueryWrapper<>(Stock.class).eq(Stock::getStockCode, stockId));
        UserAssets userAssets = userAssetsMapper.selectOne(new LambdaQueryWrapper<UserAssets>()
                .eq(UserAssets::getUserId, user.getId())
                .eq(UserAssets::getAccectType, "JP")
                .eq(UserAssets::getAccectType, stock.getStockType())
        );
        BigDecimal amount = new BigDecimal(buyNum).multiply(targetPrice).setScale(5, RoundingMode.DOWN);
        if (userAssets.getAvailableBalance().compareTo(amount) < 0) {
            return ServerResponse.createByErrorMsg("订单失败,余额不足", request);
        }
        if(buyNum<100){
        if(buyNum<siteSetting.getBuyMinNum()){
            return ServerResponse.createByErrorMsg("最低购买数量"+siteSetting.getBuyMinNum(), request);
        }
@@ -118,6 +118,7 @@
        userPendingorder.setTargetPrice(targetPrice);
        userPendingorder.setAddTime(new Date());
        userPendingorder.setStatus(0);
        userPendingorder.setAssetsType(stock.getStockType());
        int ret = userPendingorderMapper.insert(userPendingorder);
        if (ret > 0) {
            String lang = request.getHeader("lang");
@@ -133,7 +134,7 @@
    }
    @Override
    public ServerResponse orderList(HttpServletRequest request) {
    public ServerResponse orderList(String stockType,HttpServletRequest request) {
        String property = PropertiesUtil.getProperty("user.cookie.name");
        String header = request.getHeader(property);
@@ -143,7 +144,10 @@
            User user = (User) JsonUtil.string2Obj(userJson, User.class);
//            log.info("user:{}",user);
            if (user != null) {
                List<UserPendingorder> userPendingorders = userPendingorderMapper.selectList(new QueryWrapper<UserPendingorder>().eq("user_id", user.getId()).ne("status",1));
                List<UserPendingorder> userPendingorders = userPendingorderMapper.selectList(new QueryWrapper<UserPendingorder>()
                        .eq("user_id", user.getId())
                        .eq("assets_type",stockType)
                        .ne("status",1));
                List UserPendingorderList = new ArrayList();
@@ -330,7 +334,7 @@
            if (delCount > 0) {
                UserAssets userAssets = userAssetsMapper.selectOne(new LambdaQueryWrapper<UserAssets>()
                        .eq(UserAssets::getUserId, user.getId())
                        .eq(UserAssets::getAccectType, "JP")
                        .eq(UserAssets::getAccectType, userPendingorder.getAssetsType())
                );
                BigDecimal amount = new BigDecimal(userPendingorder.getBuyNum()).multiply(userPendingorder.getTargetPrice()).setScale(5, RoundingMode.DOWN);
                userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(amount));
src/main/java/com/nq/service/impl/UserPositionServiceImpl.java
@@ -1555,19 +1555,19 @@
        if (siteProduct.getRealNameDisplay() && user.getIsLock().intValue() == 1) {
            return ServerResponse.createByErrorMsg("Order failed, account has been locked");
        }
        UserAssets userAssets = userAssetsServices.assetsByTypeAndUserId("JP", user.getId());
        //价格处理
        StockDz stockDz = this.stockDzMapper.selectOne(new QueryWrapper<StockDz>().eq("stock_code", stockCode));
        Stock stock = stockMapper.selectOne(new QueryWrapper<Stock>().eq("stock_code", stockDz.getStockCode()));
        UserAssets userAssets = userAssetsServices.assetsByTypeAndUserId(stock.getStockType(), user.getId());
        if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){
            return ServerResponse.createByErrorMsg("请先缴清待补资金", request);
        }
        StockDz stockDz = this.stockDzMapper.selectOne(new QueryWrapper<StockDz>().eq("stock_code", stockCode));
        if (!Objects.equals(stockDz.getPassword(), password)) {
            return ServerResponse.createByErrorMsg("密码错误", request);
        }
        if (stockDz.getIsLock() != 0) {
            return ServerResponse.createByErrorMsg("股票被锁定,不能购买", request);
        }
        //价格处理
        Stock stock = stockMapper.selectOne(new QueryWrapper<Stock>().eq("stock_code", stockDz.getStockCode()));
        if(stockDz.getStartTime().getTime() > new Date().getTime() || stockDz.getEndTime().getTime() < new Date().getTime()){
            return ServerResponse.createByErrorMsg("不在内幕交易时间之内", request);
@@ -1619,7 +1619,7 @@
        userPosition.setOrderSpread(BigDecimal.ZERO);
        userPositionMapper.insert(userPosition);
        userAssetsServices.availablebalanceChange(EStockType.JP.getCode(), user.getId(), EUserAssets.BUY, buyAmt.negate(),"","");
        userAssetsServices.availablebalanceChange(userAssets.getAccectType(), user.getId(), EUserAssets.BUY, buyAmt.negate(),"","");
        return ServerResponse.createBySuccess("购买成功", request);
    }
src/main/java/com/nq/service/impl/UserRechargeServiceImpl.java
@@ -222,8 +222,8 @@
        for (int i = 0; i <userRecharges.size() ; i++) {
          SitePay s =   sitePayMapper.selectById(userRecharges.get(i).getPayId());
            userRecharges.get(i).setAssetsType(EStockType.JP.getSymbol1());
            userRecharges.get(i).setChannelName(EStockType.JP.getSymbol());
            userRecharges.get(i).setAssetsType(EStockType.getEStockTypeByCode(userRecharges.get(i).getAssetsType()).getSymbol1());
            userRecharges.get(i).setChannelName(EStockType.getEStockTypeByCode(userRecharges.get(i).getAssetsType()).getSymbol());
        }
        return ServerResponse.createBySuccess(pageInfo);
@@ -306,7 +306,7 @@
                return ServerResponse.createByErrorMsg("用户不存在");
            }
//            SitePay payChnnel = sitePayMapper.selectById(userRecharge.getPayId());
            userAssetsServices.availablebalanceChange(EStockType.JP.getCode(),user.getId(), EUserAssets.TOP_UP,userRecharge.getPayAmt(),"","");
            userAssetsServices.availablebalanceChange(userRecharge.getAssetsType(),user.getId(), EUserAssets.TOP_UP,userRecharge.getPayAmt(),"","");
        }
        userRecharge.setOrderStatus(Integer.valueOf((state.intValue() == 1) ? 1 : 2));
        userRecharge.setPayTime(new Date());
@@ -318,7 +318,7 @@
    }
    public ServerResponse createOrder(Integer userId, Integer state, Integer amt, String payChannel) {
    public ServerResponse createOrder(Integer userId, Integer state, Integer amt, String payChannel,String accectType) {
        if (userId == null || state == null || amt == null) {
            return ServerResponse.createByErrorMsg("参数不能为空");
        }
@@ -342,7 +342,8 @@
        userRecharge.setPayTime(new Date());
        userRecharge.setOrderStatus(Integer.valueOf(1));
        userRecharge.setPayId(1);
        userAssetsServices.availablebalanceChange(EStockType.JP.getCode(),
        userRecharge.setAssetsType(accectType);
        userAssetsServices.availablebalanceChange(userRecharge.getAssetsType(),
                userId,EUserAssets.TOP_UP,new BigDecimal(amt),"","");
        int insertCount = this.userRechargeMapper.insert(userRecharge);
        if (insertCount > 0) {
@@ -352,7 +353,7 @@
    }
    @Override
    public ServerResponse createUSDTOrder(Integer userId, Integer amt,String currency, HttpServletRequest request) {
    public ServerResponse createUSDTOrder(Integer userId, Integer amt,String currency,String accectType, HttpServletRequest request) {
        if (userId == null || amt == null) {
            return ServerResponse.createByErrorMsg("参数不能为空");
        }
@@ -378,6 +379,7 @@
        userRecharge.setPayId(1);
        userRecharge.setRechargeType(1);
        userRecharge.setImg(currency);
        userRecharge.setAssetsType(accectType);
        int insertCount = this.userRechargeMapper.insert(userRecharge);
        if (insertCount > 0) {
            return ServerResponse.createBySuccessMsg("提交成功",request);
src/main/java/com/nq/service/impl/UserServiceImpl.java
@@ -202,6 +202,7 @@
                return ServerResponse.createByErrorMsg("登录失败。账户锁定",request);
            }
            userAssetsServices.assetsByTypeAndUserId(EStockType.JP.getCode(),user.getId());
            userAssetsServices.assetsByTypeAndUserId(EStockType.US.getCode(),user.getId());
            this.iSiteLoginLogService.saveLog(user, request);
            return ServerResponse.createBySuccess(user);
        }
@@ -495,6 +496,13 @@
         *  总手续费
         * */
        BigDecimal allHMoney = BigDecimal.ZERO;
        /**
         *  总手续费
         * */
        BigDecimal amountToBeCovered = BigDecimal.ZERO;
        for (int i = 0; i <userAssetsList.size() ; i++) {
            RUserAssets rUserAssets  = new RUserAssets();
            UserAssets userAssets = userAssetsList.get(i);
@@ -557,7 +565,7 @@
            rUserAssets.setCumulativeProfitAndLossUSD(cumulativeProfitAndLossUSD.setScale(s,BigDecimal.ROUND_UP).toString());
            rUserAssets.setHandlingChargeUSD(handlingChargeUSD.setScale(s,BigDecimal.ROUND_UP).toString());
            rUserAssets.setProfitAndLossUSD(profitAndLossUSD.setScale(s,BigDecimal.ROUND_UP).toString());
            rUserAssets.setProfitAndLoss(getProfitAndLose(userId).toString());
            rUserAssets.setProfitAndLoss(getProfitAndLose(userId,userAssets.getAccectType()).toString());
            BigDecimal decimal = new BigDecimal(rUserAssets.getTotalMoney()).add(new BigDecimal(rUserAssets.getProfitAndLoss()));
            rUserAssets.setTotalMoney(decimal.toString());
            AllProfitAndLose = AllProfitAndLose.add(profitAndLossUSD);
@@ -566,10 +574,7 @@
            AllHProfitAndLose = AllHProfitAndLose.add(handlingChargeUSD);
            allFreeMoney = allFreeMoney.add(freezeMoneyUSD);
            allHMoney = allHMoney.add(handlingChargeUSD);
            amountToBeCovered = amountToBeCovered.add(new BigDecimal(rUserAssets.getAmountToBeCovered()));
            rUserAssetsList.add(rUserAssets);
        }
@@ -593,17 +598,18 @@
        rUserAssets.setFreezeMoneyUSD(allFreeMoney.setScale(s,BigDecimal.ROUND_DOWN).toString());
        rUserAssets.setSymbol("$");
        rUserAssets.setSymbolCode("USD");
        rUserAssets.setAmountToBeCovered(amountToBeCovered.setScale(s,BigDecimal.ROUND_DOWN).toString());
        rUserAssetsList.add(rUserAssets);
        return ServerResponse.createBySuccess(rUserAssetsList);
    }
    public BigDecimal getProfitAndLose(Integer userId){
    public BigDecimal getProfitAndLose(Integer userId,String  accectType){
        List<UserPosition> userPositions;
        userPositions = userPositionMapper.
                findMyPositionByCodeAndSpell(userId,
                        "","",
                        0, "JP");
                        0, accectType);
        List<UserPositionVO> userPositionVOS = Lists.newArrayList();
@@ -812,7 +818,7 @@
            ServerResponse money = iUserService.getMoney(user.getId());
            List<RUserAssets> rUserAssetsList = (List<RUserAssets>) money.getData();
            RUserAssets rUserAssets = rUserAssetsList.stream()
                    .filter(stock -> "JP".equals(stock.getAccectType()))
                    .filter(stock -> "ALL".equals(stock.getAccectType()))
                    .findFirst()
                    .orElse(null);
src/main/java/com/nq/service/impl/UserStockSubscribeServiceImpl.java
@@ -1,14 +1,12 @@
package com.nq.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.nq.common.ServerResponse;
import com.nq.dao.StockSubscribeMapper;
import com.nq.dao.UserAssetsMapper;
import com.nq.dao.UserMapper;
import com.nq.dao.UserStockSubscribeMapper;
import com.nq.dao.*;
import com.nq.enums.EStockType;
import com.nq.enums.EUserAssets;
import com.nq.pojo.*;
@@ -70,6 +68,9 @@
    @Autowired
    UserAssetsMapper userAssetsMapper;
    @Autowired
    StockMapper stockMapper;
    /**
     * 用户新股申购
     * @param model
@@ -82,8 +83,9 @@
        if (model == null) {
            return ServerResponse.createByErrorMsg("参数错误",request);
        }
        Stock stock = stockMapper.selectOne(new LambdaQueryWrapper<>(Stock.class).eq(Stock::getStockCode, model.getNewCode()));
        User user = iUserService.getCurrentRefreshUser(request);
        UserAssets userAssets =   iUserAssetsServices.assetsByTypeAndUserId("JP",user.getId());
        UserAssets userAssets =   iUserAssetsServices.assetsByTypeAndUserId(stock.getStockType(),user.getId());
        if (model.getNewCode() != null) {
            StockSubscribe stockSubscribe = stockSubscribeMapper.selectOne(new QueryWrapper<StockSubscribe>()
                    .eq("code", model.getNewCode()).eq("type",model.getType()));
@@ -152,7 +154,7 @@
                model.setType(stockSubscribe.getType());
                model.setDbMoney(BigDecimal.ZERO);
                ret = userStockSubscribeMapper.insert(model);
                iUserAssetsServices.availablebalanceChange(EStockType.JP.getCode(), user.getId(),EUserAssets.BUY,bound.negate(),"","");
                iUserAssetsServices.availablebalanceChange(stock.getStockType(), user.getId(),EUserAssets.BUY,bound.negate(),"","");
                if (ret > 0) {
                    return ServerResponse.createBySuccessMsg("配售成功",request);
                } else {
@@ -191,12 +193,13 @@
            if((model.getStatus() == 3 && model.getApplyNumber() == null) || (model.getStatus() == 3 && model.getApplyNumber() == 0) ){
                return ServerResponse.createByErrorMsg("中签数量不能小于0");
            }
            Stock stock = stockMapper.selectOne(new LambdaQueryWrapper<>(Stock.class).eq(Stock::getStockCode, stockSubscribe.getCode()));
            if (model.getStatus() == 3 && model.getApplyNumber() != null){
                if(stockSubscribe.getType() == 1){
                    model.setBond(stockSubscribe.getPrice().multiply(BigDecimal.valueOf(model.getApplyNumber())));
                    model.setDbMoney(model.getDbMoney());
                    //客户中签直接扣除客户账户可用资金
                    UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId("JP", userStockSubscribe.getUserId());
                    UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(stock.getStockType(), userStockSubscribe.getUserId());
                    if(null == userAssets){
                        return ServerResponse.createByErrorMsg("客户资金账户不存在");
                    }
@@ -217,7 +220,7 @@
                    }
                    BigDecimal cCount = new BigDecimal(model.getApplyNums()-model.getApplyNumber());
                    BigDecimal tMoney = stockSubscribe.getPrice().multiply(cCount);
                    iUserAssetsServices.availablebalanceChange(EStockType.JP.getCode(),userStockSubscribe.getUserId(),
                    iUserAssetsServices.availablebalanceChange(stock.getStockType(),userStockSubscribe.getUserId(),
                            EUserAssets.TOP_UP,tMoney,"","");
                    model.setBond(stockSubscribe.getPrice().multiply(BigDecimal.valueOf(model.getApplyNumber())));
                    model.setDbMoney(BigDecimal.ZERO);
src/main/java/com/nq/service/impl/UserWithdrawServiceImpl.java
@@ -240,7 +240,7 @@
            User user = this.userMapper.selectById(userWithdraw.getUserId());
            UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId("JP", user.getId());
            UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(userWithdraw.getAssetsType(), user.getId());
            if (userAssets == null) {
                return ServerResponse.createByErrorMsg("用户资金账户不存在");
            }
@@ -353,7 +353,7 @@
            if (user == null) {
                return ServerResponse.createByErrorMsg("用户不存在");
            }
            UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId("JP", user.getId());
            UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(userWithdraw.getAssetsType(), user.getId());
            if (userAssets == null) {
                return ServerResponse.createByErrorMsg("用户资金账户不存在");
            }
src/main/java/com/nq/utils/task/news/NewsTask.java
@@ -35,6 +35,13 @@
    private final Lock NewsInfoTaskLock = new ReentrantLock();
    private final AtomicBoolean USNewsInfoTask = new AtomicBoolean(false);
    private final Lock USNewsInfoTaskLock = new ReentrantLock();
    /*
     * 新聞資訊抓取
     * */
@@ -58,6 +65,29 @@
        }
    }
    /*
     * 新聞資訊抓取
     * */
    @Scheduled(cron = "0 0/10 * * * ?")
    public void USNewsInfoTask() {
        if (USNewsInfoTask.get()) { // 判断任务是否在处理中
            return;
        }
        if (USNewsInfoTaskLock.tryLock()) { // 加锁
            try {
                USNewsInfoTask.set(true); // 设置处理中标识为true
                System.out.println("美国新闻定时任务---->开始");
                iSiteNewsService.grabNews();
            } catch (Exception e) {
                System.err.println("美国新闻抓取出现异常: " + e.getMessage()); // 打印具体的异常信息
            } finally {
                USNewsInfoTaskLock.unlock(); // 释放锁
                USNewsInfoTask.set(false); // 设置处理中标识为false
                System.out.println("美国新闻定时任务---->结束");
            }
        }
    }
    /*
src/main/java/com/nq/utils/task/stock/CarryPositionTask.java
@@ -5,14 +5,8 @@
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.nq.common.ServerResponse;
import com.nq.dao.StockSubscribeMapper;
import com.nq.dao.UserAssetsMapper;
import com.nq.dao.UserMapper;
import com.nq.dao.UserStockSubscribeMapper;
import com.nq.pojo.StockSubscribe;
import com.nq.pojo.User;
import com.nq.pojo.UserAssets;
import com.nq.pojo.UserStockSubscribe;
import com.nq.dao.*;
import com.nq.pojo.*;
import com.nq.service.IUserAssetsServices;
import com.nq.service.IUserPositionService;
import lombok.extern.slf4j.Slf4j;
@@ -53,6 +47,9 @@
    @Autowired
    IUserAssetsServices userAssetsServices;
    @Autowired
    StockMapper stockMapper;
    private final Lock ballotLock = new ReentrantLock();
    private final Lock subscriptionLock = new ReentrantLock();
@@ -60,7 +57,7 @@
    private final AtomicBoolean ballot = new AtomicBoolean(false);
    @Scheduled(cron = "0 0/10 * * * ?")
    @Scheduled(cron = "0 0/1 * * * ?")
    public void ballot() {
        if (ballot.get()) { // 判断任务是否在处理中
            return;
@@ -112,7 +109,8 @@
                List<UserStockSubscribe> userStockSubscribes = userStockSubscribeMapper.selectList(new LambdaQueryWrapper<UserStockSubscribe>()
                        .eq(UserStockSubscribe::getStatus, 3));
                userStockSubscribes.forEach(f->{
                    UserAssets userAssets = userAssetsServices.assetsByTypeAndUserId("JP",f.getUserId());
                    Stock stock = stockMapper.selectOne(new LambdaQueryWrapper<>(Stock.class).eq(Stock::getStockCode, f.getNewCode()));
                    UserAssets userAssets = userAssetsServices.assetsByTypeAndUserId(stock.getStockType(),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
@@ -58,10 +58,14 @@
    private final Lock syncINStockDataLock = new ReentrantLock();
    private final AtomicBoolean syncUSStockData = new AtomicBoolean(false);
    private final Lock syncUSStockDataLock = new ReentrantLock();
    /**
     * 同步系统所需要的股票
     */
    @Scheduled(cron = "0 */1 * * * ?")
    @Scheduled(cron = "0 0/1 * * * ?")
    public void syncINStockData() {
        if (syncINStockData.get()) { // 判断任务是否在处理中
            return;
@@ -81,9 +85,20 @@
    /**
     * 同步美国股票
     */
//    @Scheduled(cron = "0 0/30 * * * ?")
    @Scheduled(cron = "0 0/1 * * * ?")
    public void loadStockCompanies() {
        loadAllCompanies();
        if (syncUSStockData.get()) { // 判断任务是否在处理中
            return;
        }
        if (syncUSStockDataLock.tryLock()) {
            try {
                syncUSStockData.set(true); // 设置处理中标识为true
                loadAllStock(EStockType.US);
            } finally {
                syncUSStockDataLock.unlock();
                syncUSStockData.set(false); // 设置处理中标识为false
            }
        }
    }
src/main/java/com/nq/ws/USWebsocketRunClient.java
New file
@@ -0,0 +1,108 @@
package com.nq.ws;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.nq.enums.EStockType;
import com.nq.pojo.StockRealTimeBean;
import com.nq.utils.redis.RedisKeyUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import java.io.IOException;
import java.lang.reflect.Type;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
 * @program: dabaogp
 * @description:
 * @create: 2024-10-25 14:44
 **/
@Slf4j
public class USWebsocketRunClient  extends WebSocketClient {
    private EStockType eStockType;
    public USWebsocketRunClient(URI serverUri,
                              EStockType eStockType
    ) {
        super(serverUri);
        this.eStockType = eStockType;
    }
    @Override
    public void onOpen(ServerHandshake serverHandshake) {
        send(("key:"+ eStockType.getStockKey()+":"+eStockType.getContryId()+":v1").getBytes());
    }
    @Override
    public void onMessage(String s) {
        try {
            if(!s.equals("pong") && !s.equals("身份验证成功")){
                StockRealTimeBean stockDetailBean =  new Gson().fromJson(s, StockRealTimeBean.class);
                RedisKeyUtil.setCacheRealTimeStock(eStockType,stockDetailBean);
                send(s);
            }
        }catch (Exception e){
            log.error("ws 消息接收错误:"+s);
        }
    }
    public static Map<String, Object> jsonToMap(String json) {
        Gson gson = new Gson();
        Type type = new TypeToken<Map<String, Object>>(){}.getType();
        return gson.fromJson(json, type);
    }
    @Override
    public void onClose(int i, String s, boolean b) {
        log.info("websocket  美股  关闭"+1);
    }
    @Override
    public void onError(Exception e) {
        log.info("websocket 错误");
    }
    private HttpClient httpClient;  //  声明一个成员变量
    private HttpPost httpPost = new HttpPost("http://127.0.0.1:8002/api/sendNotification");  //  创建一个HttpPost对象
    @Override
    public void send(String message) {
        try {
            if (httpClient == null) {
                httpClient = HttpClients.createDefault();  //  使用单例模式创建HttpClient对象
            }
            //  准备  form-data  参数
            List<BasicNameValuePair> params = new ArrayList<>();
            params.add(new BasicNameValuePair("message", message));
            //  设置编码格式为  UTF-8
            UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params, StandardCharsets.UTF_8);
            httpPost.setEntity(entity);  //  设置HttpPost对象的参数
            //  发送请求
            HttpResponse response = httpClient.execute(httpPost);
            //  处理响应
            int statusCode = response.getStatusLine().getStatusCode();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
src/main/java/com/nq/ws/WebSocketClientBeanConfig.java
@@ -21,8 +21,26 @@
    public Map<String, WebSocketClient> websocketRunClientMap() {
        Map<String, WebSocketClient> retMap = new HashMap<>(2);
//        try {
//            WebsocketRunClient websocketRunClient = new WebsocketRunClient(new URI(PropertiesUtil.getProperty("JP_WS_URL")),EStockType.JP);
//            websocketRunClient.connect();
//            websocketRunClient.setConnectionLostTimeout(0);
//            new Thread(() -> {
//                while (true) {
//                    try {
//                        Thread.sleep(8000);
//                        websocketRunClient.send("heartbeat".getBytes());
//                    } catch (Exception e) {
//                        websocketRunClient.reconnect();
//                        websocketRunClient.setConnectionLostTimeout(0);
//                    }
//                }
//            }).start();
//        } catch (Exception e) {
//        }
        try {
            WebsocketRunClient websocketRunClient = new WebsocketRunClient(new URI(PropertiesUtil.getProperty("JP_WS_URL")),EStockType.JP);
            USWebsocketRunClient websocketRunClient = new USWebsocketRunClient(new URI(PropertiesUtil.getProperty("US_WS_URL")),EStockType.US);
            websocketRunClient.connect();
            websocketRunClient.setConnectionLostTimeout(0);
            new Thread(() -> {
@@ -40,9 +58,9 @@
        }
        return retMap;
    }
}
src/main/resources/application.properties
@@ -42,9 +42,9 @@
#JS_IN_WS_URL =ws://api-in-2-ws.js-stock.top
#JS_IN_KEY = eVKtHt7aG4m6ozwWL9qG
#
#US_HTTP_API = http://api-us.js-stock.top/
#US_WS_URL = ws://ws-us.js-stock.top
#US_KEY = jZFrku4RGQjP87Hmq5tm
US_HTTP_API = http://api-us-v2.js-stock.top/
US_WS_URL = ws://api-us-v2-ws.js-stock.top
US_KEY = bP1PkxkXyzV2mfb3miun
#
#HK_HTTP_API = http://test.js-stock.top/
#HK_WS_URL = ws://test-ws.js-stock.top
src/main/resources/mapper/StockMapper.xml
@@ -262,7 +262,7 @@
    <include refid="Base_Column_List" />
    from stock
    <where>
       stock_gid = 'TSE'
        1=1
      <if test="showState != null  ">
        and is_show = #{showState}
      </if>
@@ -316,7 +316,8 @@
        <include refid="Base_Column_List"/>
         FROM stock
    where stock_type = #{stockType} and stock_gid = 'TSE'
    where stock_type = #{stockType}
--       and stock_gid = 'TSE'
    <if test="keyWords != null and keyWords != '' ">
      and (stock_spell like concat('%',#{keyWords},'%')  or stock_name like concat('%',#{keyWords},'%')  )
@@ -335,7 +336,7 @@
    <include refid="Base_Column_List"/>
    FROM stock
    where stock_type = #{stockType}
    where 1 = 1
    <if test="keyWords != null and keyWords != '' ">
      and (stock_spell like concat('%',#{keyWords},'%')  or stock_name like concat('%',#{keyWords},'%')  )
src/main/resources/mapper/UserPositionMapper.xml
@@ -436,27 +436,26 @@
  <select id="findMyPositionByCodeAndSpell" parameterType="map" resultMap="BaseResultMap">
    SELECT
    <include refid="Base_Column_List"/>
    FROM user_position
    u.*
    FROM user_position u  left join stock s on u.stock_code = s.stock_code
    <where>
      user_id = #{uid}
      u.user_id = #{uid}
    and s.stock_type = #{stockType}
      <if test="state != null ">
        <if test="state == 0">
          and sell_order_id is null
          and u.sell_order_id is null
        </if>
        <if test="state == 1">
          and sell_order_id is not null
          and u.sell_order_id is not null
        </if>
      </if>
      <if test="stockCode != null and stockCode != '' ">
        and stock_code like CONCAT('%','${stockCode}','%')
        and u.stock_code like CONCAT('%','${stockCode}','%')
      </if>
      <if test="stockSpell != null and stockSpell != '' ">
        and stock_spell like CONCAT('%','${stockSpell}','%')
        and u.stock_spell like CONCAT('%','${stockSpell}','%')
      </if>
<!--      <if test="stockType != null and stockType!= ''">-->
<!--        and stock_gid = #{stockType}-->
<!--      </if>-->
    </where>
src/main/resources/mapper/UserRechargeMapper.xml
@@ -22,18 +22,18 @@
    id, user_id, nick_name, agent_id, order_sn, pay_sn, pay_channel, pay_amt, order_status,
    order_desc, add_time, pay_time, pay_id,img
  </sql>
  <insert id="insert" parameterType="com.nq.pojo.UserRecharge" >
    insert into user_recharge (id, user_id, nick_name,
      agent_id, order_sn, pay_sn,
      pay_channel, pay_amt, order_status,
      order_desc, add_time, pay_time,pay_id,img
      )
    values (#{id,jdbcType=INTEGER}, #{userId,jdbcType=INTEGER}, #{nickName,jdbcType=VARCHAR},
      #{agentId,jdbcType=INTEGER}, #{orderSn,jdbcType=VARCHAR}, #{paySn,jdbcType=VARCHAR},
      #{payChannel,jdbcType=VARCHAR}, #{payAmt,jdbcType=DECIMAL}, #{orderStatus,jdbcType=INTEGER},
      #{orderDesc,jdbcType=VARCHAR}, #{addTime,jdbcType=TIMESTAMP}, #{payTime,jdbcType=TIMESTAMP}, #{payId,jdbcType=INTEGER}, #{img,jdbcType=VARCHAR}
      )
  </insert>
<!--  <insert id="insert" parameterType="com.nq.pojo.UserRecharge" >-->
<!--    insert into user_recharge (id, user_id, nick_name,-->
<!--      agent_id, order_sn, pay_sn,-->
<!--      pay_channel, pay_amt, order_status,-->
<!--      order_desc, add_time, pay_time,pay_id,img-->
<!--      )-->
<!--    values (#{id,jdbcType=INTEGER}, #{userId,jdbcType=INTEGER}, #{nickName,jdbcType=VARCHAR},-->
<!--      #{agentId,jdbcType=INTEGER}, #{orderSn,jdbcType=VARCHAR}, #{paySn,jdbcType=VARCHAR},-->
<!--      #{payChannel,jdbcType=VARCHAR}, #{payAmt,jdbcType=DECIMAL}, #{orderStatus,jdbcType=INTEGER},-->
<!--      #{orderDesc,jdbcType=VARCHAR}, #{addTime,jdbcType=TIMESTAMP}, #{payTime,jdbcType=TIMESTAMP}, #{payId,jdbcType=INTEGER}, #{img,jdbcType=VARCHAR}-->
<!--      )-->
<!--  </insert>-->
  <insert id="insertSelective" parameterType="com.nq.pojo.UserRecharge" >
    insert into user_recharge
    <trim prefix="(" suffix=")" suffixOverrides="," >
src/main/resources/mapper/UserWithdrawMapper.xml
@@ -23,7 +23,7 @@
  </sql>
  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
    select 
    <include refid="Base_Column_List" />
    *
    from user_withdraw
    where id = #{id,jdbcType=INTEGER}
  </select>