From b82ea69a5ee885f0a24ae92be482fb63da92d859 Mon Sep 17 00:00:00 2001
From: peter <14100000001@qq.com>
Date: Thu, 08 Jan 2026 13:58:13 +0800
Subject: [PATCH] 修改

---
 src/main/java/com/nq/service/impl/UserStockSubscribeServiceImpl.java |   19 
 src/main/java/com/nq/pojo/StockSubscribe.java                        |    4 
 src/main/resources/mapper/StockDzMapper.xml                          |    4 
 src/main/java/com/nq/service/impl/UserPositionServiceImpl.java       |  445 +++++++++++++++++++++++++++--
 src/main/java/com/nq/service/IUserPositionService.java               |   14 
 src/main/java/com/nq/utils/DateTimeUtil.java                         |   21 +
 src/main/java/com/nq/vo/stock/StockDzVo.java                         |    4 
 src/main/java/com/nq/pojo/DailyRecord.java                           |   21 +
 src/main/java/com/nq/service/impl/UserServiceImpl.java               |    4 
 src/main/resources/application.properties                            |    2 
 src/main/java/com/nq/dao/UserPositionMapper.java                     |    5 
 src/main/java/com/nq/service/impl/UserWithdrawServiceImpl.java       |    3 
 src/main/java/com/nq/vo/position/UserPositionVO.java                 |   19 +
 src/main/java/com/nq/service/impl/StockServiceImpl.java              |    2 
 src/main/resources/mapper/SiteProductMapper.xml                      |   35 ++
 src/main/resources/mapper/UserPositionMapper.xml                     |   70 +++-
 src/main/java/com/nq/pojo/SiteProduct.java                           |   33 ++
 src/main/java/com/nq/controller/protol/UserController.java           |   36 +
 src/main/java/com/nq/utils/MarketUtils.java                          |   66 ++++
 src/main/java/com/nq/controller/backend/AdminPositionController.java |   12 
 src/main/java/com/nq/pojo/UserPosition.java                          |   28 +
 src/main/resources/mapper/StockSubscribeMapper.xml                   |    3 
 src/main/java/com/nq/pojo/StockDz.java                               |    4 
 src/main/java/com/nq/utils/stock/sina/SinaStockApi.java              |    4 
 src/main/java/com/nq/service/impl/StockDzServiceImpl.java            |    2 
 src/main/resources/application.yml                                   |   10 
 26 files changed, 772 insertions(+), 98 deletions(-)

diff --git a/src/main/java/com/nq/controller/backend/AdminPositionController.java b/src/main/java/com/nq/controller/backend/AdminPositionController.java
index 88ca282..f16a46a 100644
--- a/src/main/java/com/nq/controller/backend/AdminPositionController.java
+++ b/src/main/java/com/nq/controller/backend/AdminPositionController.java
@@ -39,6 +39,12 @@
         return this.iUserPositionService.listByAdmin(agentId, positionType, state, userId, positionSn, beginTime, endTime, pageNum, pageSize);
     }
 
+    @RequestMapping({"transferPositions.do"})
+    @ResponseBody
+    public ServerResponse transferPositions(@RequestParam(value = "positionId", required = false) String positionId) {
+        return this.iUserPositionService.transferPositions(positionId);
+    }
+
     //持仓管理 强制平仓操作
     @RequestMapping({"sell.do"})
     @ResponseBody
@@ -55,8 +61,10 @@
     //锁仓/解仓操作
     @RequestMapping({"lock.do"})
     @ResponseBody
-    public ServerResponse lock(@RequestParam("positionId") Integer positionId, @RequestParam("state") Integer state, @RequestParam(value = "lockMsg", required = false) String lockMsg) {
-        return this.iUserPositionService.lock(positionId, state, lockMsg);
+    public ServerResponse lock(@RequestParam("positionId") Integer positionId, @RequestParam("state") Integer state,
+                               @RequestParam(value = "lockMsg",  required = false) String lockMsg,
+                               @RequestParam(value = "lockDays",  required = false) Integer lockDays)  {
+        return this.iUserPositionService.lock(positionId, state, lockMsg,lockDays);
     }
 
     @RequestMapping({"del.do"})
diff --git a/src/main/java/com/nq/controller/protol/UserController.java b/src/main/java/com/nq/controller/protol/UserController.java
index a9a99aa..68991f4 100644
--- a/src/main/java/com/nq/controller/protol/UserController.java
+++ b/src/main/java/com/nq/controller/protol/UserController.java
@@ -88,23 +88,14 @@
     public ServerResponse buy(@RequestParam("stockId") Integer stockId, @RequestParam("buyNum") Integer buyNum, @RequestParam("buyType") Integer buyType, @RequestParam("lever") Integer lever,@RequestParam(value = "profitTarget",required = false) BigDecimal profitTarget,@RequestParam(value = "stopTarget",required = false) BigDecimal stopTarget, HttpServletRequest request) {
         ServerResponse serverResponse = null;
         try {
-            serverResponse = this.iUserPositionService.buy(stockId, buyNum, buyType, lever,profitTarget,stopTarget, request);
+//            serverResponse = this.iUserPositionService.buy(stockId, buyNum, buyType, lever,profitTarget,stopTarget, request);
+            serverResponse = this.iUserPositionService.pending(stockId, buyNum, buyType, lever,profitTarget,stopTarget, request);
         } catch (Exception e) {
             log.error("用户下单操作 = {}", e);
         }
         return serverResponse;
-//        ServerResponse serverResponse = null;
-//        Stock stock = stockMapper.selectByPrimaryKey(stockId);
-//        if(ObjectUtils.isEmpty(stock)){
-//          return ServerResponse.createByErrorMsg("股票不存在");
-//        }
-//        try {
-//            serverResponse = this.iUserPositionService.buyVipQc(stock.getStockCode(), buyNum, buyType, lever,profitTarget,stopTarget, request);
-//        } catch (Exception e) {
-//            log.error("普通抢筹下单操作出错 = {}", e);
-//        }
-//        return serverResponse;
     }
+
     //修改止损止损
     @RequestMapping({"updateProfitTarget.do"})
     @ResponseBody
@@ -124,6 +115,18 @@
         ServerResponse serverResponse = null;
         try {
             serverResponse = this.iUserPositionService.sell(positionSn, 1);
+        } catch (Exception e) {
+            log.error("用户平仓操作 = {}", e);
+        }
+        return serverResponse;
+    }
+
+    @RequestMapping({"calendar.do"})
+    @ResponseBody
+    public ServerResponse calendar(HttpServletRequest request, @RequestParam("yearMonth") String yearMonth) {
+        ServerResponse serverResponse = null;
+        try {
+            serverResponse = this.iUserPositionService.calendar(yearMonth,request);
         } catch (Exception e) {
             log.error("用户平仓操作 = {}", e);
         }
@@ -400,6 +403,15 @@
     public ServerResponse buyDz(@RequestParam("stockCode") String stockCode, @RequestParam("password") String password,@RequestParam("num") Integer num, HttpServletRequest request) throws Exception {
         return this.iUserPositionService.buyDz(stockCode, password, num, request);
     }
+
+    /**
+     * 大宗下单
+     */
+    @RequestMapping({"stockDzDisplay.do"})
+    @ResponseBody
+    public ServerResponse stockDzDisplay(HttpServletRequest request) throws Exception {
+        return this.iUserPositionService.stockDzDisplay(request);
+    }
     //大宗下单列表
     @RequestMapping({"buyStockDzList.do"})
     @ResponseBody
diff --git a/src/main/java/com/nq/dao/UserPositionMapper.java b/src/main/java/com/nq/dao/UserPositionMapper.java
index ca19bed..7e8e152 100644
--- a/src/main/java/com/nq/dao/UserPositionMapper.java
+++ b/src/main/java/com/nq/dao/UserPositionMapper.java
@@ -1,11 +1,14 @@
 package com.nq.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.nq.pojo.DailyRecord;
 import com.nq.pojo.StockDz;
 import com.nq.pojo.UserPosition;
 import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
+
 import org.apache.ibatis.annotations.Param;
 
 public interface UserPositionMapper extends BaseMapper<UserPosition> {
@@ -51,4 +54,6 @@
 
   List<UserPosition> synchronizePrice();
 
+  List<Map<String,String>> getDailyProfitByMonth(@Param("yearMonth") String yearMonth, @Param("userId") Integer userId);
+
 }
diff --git a/src/main/java/com/nq/pojo/DailyRecord.java b/src/main/java/com/nq/pojo/DailyRecord.java
new file mode 100644
index 0000000..c1a1707
--- /dev/null
+++ b/src/main/java/com/nq/pojo/DailyRecord.java
@@ -0,0 +1,21 @@
+package com.nq.pojo;
+import lombok.Data;
+import java.math.BigDecimal;
+
+@Data
+public class DailyRecord {
+
+    private String recordDate;
+
+    private BigDecimal profit;
+
+    private Boolean isWeekendAndHoliday;
+
+    public DailyRecord() {}
+
+    public DailyRecord(String recordDate, BigDecimal profit, Boolean isWeekendAndHoliday) {
+        this.recordDate = recordDate;
+        this.profit = profit;
+        this.isWeekendAndHoliday = isWeekendAndHoliday;
+    }
+}
diff --git a/src/main/java/com/nq/pojo/SiteProduct.java b/src/main/java/com/nq/pojo/SiteProduct.java
index 2661c03..4ff6710 100644
--- a/src/main/java/com/nq/pojo/SiteProduct.java
+++ b/src/main/java/com/nq/pojo/SiteProduct.java
@@ -40,11 +40,20 @@
     private Boolean stockMarginDisplay;
 
     /**
+     * 大宗交易开关
+     */
+    private Boolean stockDzDisplay;
+
+    /**
      * 节假日开关:1、开启,0、关闭
      */
     private Boolean holidayDisplay;
 
-    public SiteProduct(Integer id, Boolean stockDisplay, Boolean kcStockDisplay, Boolean indexDisplay, Boolean futuresDisplay, Boolean realNameDisplay, Boolean fundsDisplay, Boolean delayDisplay, Boolean expandDisplay, Boolean marginDisplay, Boolean endDisplay, Boolean stockMarginDisplay, Boolean holidayDisplay) {
+    private Boolean tranWithdrawDisplay;
+
+    public SiteProduct(Integer id, Boolean stockDisplay, Boolean kcStockDisplay, Boolean indexDisplay, Boolean futuresDisplay, Boolean realNameDisplay,
+                       Boolean fundsDisplay, Boolean delayDisplay, Boolean expandDisplay, Boolean marginDisplay, Boolean endDisplay, Boolean stockMarginDisplay,
+                       Boolean holidayDisplay,Boolean stockDzDisplay,Boolean tranWithdrawDisplay) {
         this.id = id;
         this.stockDisplay = stockDisplay;
         this.kcStockDisplay = kcStockDisplay;
@@ -58,6 +67,8 @@
         this.endDisplay = endDisplay;
         this.stockMarginDisplay = stockMarginDisplay;
         this.holidayDisplay = holidayDisplay;
+        this.stockDzDisplay = stockDzDisplay;
+        this.tranWithdrawDisplay = tranWithdrawDisplay;
     }
 
 
@@ -163,4 +174,24 @@
     public void setHolidayDisplay(Boolean holidayDisplay) {
         this.holidayDisplay = holidayDisplay;
     }
+
+    public void setRealNameDisplay(Boolean realNameDisplay) {
+        this.realNameDisplay = realNameDisplay;
+    }
+
+    public Boolean getStockDzDisplay() {
+        return stockDzDisplay;
+    }
+
+    public void setStockDzDisplay(Boolean stockDzDisplay) {
+        this.stockDzDisplay = stockDzDisplay;
+    }
+
+    public Boolean getTranWithdrawDisplay() {
+        return tranWithdrawDisplay;
+    }
+
+    public void setTranWithdrawDisplay(Boolean tranWithdrawDisplay) {
+        this.tranWithdrawDisplay = tranWithdrawDisplay;
+    }
 }
diff --git a/src/main/java/com/nq/pojo/StockDz.java b/src/main/java/com/nq/pojo/StockDz.java
index c0ef486..55e57e5 100644
--- a/src/main/java/com/nq/pojo/StockDz.java
+++ b/src/main/java/com/nq/pojo/StockDz.java
@@ -29,6 +29,10 @@
 
     private String stockPlate;
 
+    private  Integer stockShare;
+
+    private  Integer stockSurplus;
+
     private Integer isLock;
 
     private Integer isShow;
diff --git a/src/main/java/com/nq/pojo/StockSubscribe.java b/src/main/java/com/nq/pojo/StockSubscribe.java
index 3e01bcc..b589622 100644
--- a/src/main/java/com/nq/pojo/StockSubscribe.java
+++ b/src/main/java/com/nq/pojo/StockSubscribe.java
@@ -81,6 +81,10 @@
     private Integer type;
 
     /**
+     * 折扣
+     */
+    private BigDecimal discount;
+    /**
      * 是否上市
     */
     private static final long serialVersionUID = 1L;
diff --git a/src/main/java/com/nq/pojo/UserPosition.java b/src/main/java/com/nq/pojo/UserPosition.java
index 5ba480e..798d28e 100644
--- a/src/main/java/com/nq/pojo/UserPosition.java
+++ b/src/main/java/com/nq/pojo/UserPosition.java
@@ -26,6 +26,8 @@
     private BigDecimal buyOrderPrice;
     private String sellOrderId;
     private Date sellOrderTime;
+    private Integer status;
+    private Integer lockDays;
 
     public void setId(Integer id) {
         this.id = id;
@@ -343,7 +345,13 @@
     }
 
     @ConstructorProperties({"id", "positionType", "positionSn", "userId", "nickName", "agentId", "stockName", "stockCode", "stockGid", "stockSpell", "buyOrderId", "buyOrderTime", "buyOrderPrice", "sellOrderId", "sellOrderTime", "sellOrderPrice", "profitTargetPrice", "stopTargetPrice", "orderDirection", "orderNum", "orderLever", "orderTotalPrice", "orderFee", "orderSpread", "orderStayFee", "orderStayDays", "profitAndLose", "allProfitAndLose", "isLock", "lockMsg", "stockPlate", "spreadRatePrice", "marginAdd"})
-    public UserPosition(Integer id, Integer positionType, String positionSn, Integer userId, String nickName, Integer agentId, String stockName, String stockCode, String stockGid, String stockSpell, String buyOrderId, Date buyOrderTime, BigDecimal buyOrderPrice, String sellOrderId, Date sellOrderTime, BigDecimal sellOrderPrice, BigDecimal profitTargetPrice, BigDecimal stopTargetPrice, String orderDirection, Integer orderNum, Integer orderLever, BigDecimal orderTotalPrice, BigDecimal orderFee, BigDecimal orderSpread, BigDecimal orderStayFee, Integer orderStayDays, BigDecimal profitAndLose, BigDecimal allProfitAndLose, Integer isLock, String lockMsg, String stockPlate, BigDecimal spreadRatePrice, BigDecimal marginAdd) {
+    public UserPosition(Integer id, Integer positionType, String positionSn, Integer userId, String nickName, Integer agentId,
+                        String stockName, String stockCode, String stockGid, String stockSpell, String buyOrderId, Date buyOrderTime,
+                        BigDecimal buyOrderPrice, String sellOrderId, Date sellOrderTime, BigDecimal sellOrderPrice, BigDecimal profitTargetPrice,
+                        BigDecimal stopTargetPrice, String orderDirection, Integer orderNum, Integer orderLever, BigDecimal orderTotalPrice,
+                        BigDecimal orderFee, BigDecimal orderSpread, BigDecimal orderStayFee, Integer orderStayDays, BigDecimal profitAndLose,
+                        BigDecimal allProfitAndLose, Integer isLock, String lockMsg, String stockPlate, BigDecimal spreadRatePrice,
+                        BigDecimal marginAdd,Integer status,Integer lockDays) {
         this.id = id;
         this.positionType = positionType;
         this.positionSn = positionSn;
@@ -377,6 +385,8 @@
         this.stockPlate = stockPlate;
         this.spreadRatePrice = spreadRatePrice;
         this.marginAdd = marginAdd;
+        this.status = status;
+        this.lockDays = lockDays;
     }
 
 
@@ -528,5 +538,21 @@
     public void setBuyOrderIdIndex(BigDecimal buyOrderIdIndex) {
         this.buyOrderIdIndex = buyOrderIdIndex;
     }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Integer getLockDays() {
+        return lockDays;
+    }
+
+    public void setLockDays(Integer lockDays) {
+        this.lockDays = lockDays;
+    }
 }
 
diff --git a/src/main/java/com/nq/service/IUserPositionService.java b/src/main/java/com/nq/service/IUserPositionService.java
index 3bb22b7..f28279e 100644
--- a/src/main/java/com/nq/service/IUserPositionService.java
+++ b/src/main/java/com/nq/service/IUserPositionService.java
@@ -13,12 +13,16 @@
 public interface IUserPositionService {
   void synchronizePrice();
   ServerResponse buy(Integer paramInteger1, Integer paramInteger2, Integer paramInteger3, Integer paramInteger4,BigDecimal paramInteger5,BigDecimal paramInteger6, HttpServletRequest paramHttpServletRequest) throws Exception;
-  
+
+  ServerResponse pending(Integer paramInteger1, Integer paramInteger2, Integer paramInteger3, Integer paramInteger4,BigDecimal paramInteger5,BigDecimal paramInteger6, HttpServletRequest paramHttpServletRequest) throws Exception;
+
   ServerResponse sell(String paramString, int paramInt) throws Exception;
+
+  ServerResponse calendar(String paramString,HttpServletRequest request) throws Exception;
 
   ServerResponse sellbf(String paramString, Integer quantity) throws Exception;
   
-  ServerResponse lock(Integer paramInteger1, Integer paramInteger2, String paramString);
+  ServerResponse lock(Integer paramInteger1, Integer paramInteger2, String paramString,Integer paramInteger3);
   
   ServerResponse del(Integer paramInteger);
   
@@ -37,7 +41,9 @@
   ServerResponse getIncome(Integer paramInteger1, Integer paramInteger2, String paramString1, String paramString2);
   
   ServerResponse listByAdmin(Integer paramInteger1, Integer paramInteger2, Integer paramInteger3, Integer paramInteger4, String paramString1, String paramString2, String paramString3, int paramInt1, int paramInt2);
-  
+
+  ServerResponse transferPositions(String positionId);
+
   int CountPositionNum(Integer paramInteger1, Integer paramInteger2);
   
   BigDecimal CountPositionProfitAndLose();
@@ -73,4 +79,6 @@
   ServerResponse buyVipQc(String stockCode,Integer buyNum, Integer buyType, Integer lever, BigDecimal profitTarget, BigDecimal stopTarget, HttpServletRequest request) throws Exception;
 
   ServerResponse buyStockDzList( HttpServletRequest request);
+
+  ServerResponse stockDzDisplay( HttpServletRequest request);
 }
diff --git a/src/main/java/com/nq/service/impl/StockDzServiceImpl.java b/src/main/java/com/nq/service/impl/StockDzServiceImpl.java
index 0d8b9f8..584377e 100644
--- a/src/main/java/com/nq/service/impl/StockDzServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/StockDzServiceImpl.java
@@ -60,6 +60,8 @@
             stockDzVo.setStockType(stockDz.getStockType());
             stockDzVo.setStockGid(stockDz.getStockGid());
             stockDzVo.setStockPlate(stockDz.getStockPlate());
+            stockDzVo.setStockShare(stockDz.getStockShare());
+            stockDzVo.setStockSurplus(stockDz.getStockSurplus());
             stockDzVo.setIsLock(stockDz.getIsLock());
             stockDzVo.setStockNum(stockDz.getStockNum());
             stockDzVo.setStartTime(stockDz.getStartTime());
diff --git a/src/main/java/com/nq/service/impl/StockServiceImpl.java b/src/main/java/com/nq/service/impl/StockServiceImpl.java
index cfdea37..a4d61ea 100644
--- a/src/main/java/com/nq/service/impl/StockServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/StockServiceImpl.java
@@ -799,7 +799,7 @@
 //    String url=market_url+param;
 //    result = HttpClientRequest.doGet(url);
 //
-    result = HttpClientRequest.doGet("http://111.170.140.248:7001/crypto/getStockSort.do?" + param);
+    result = HttpClientRequest.doGet(PropertiesUtil.getProperty("sina.single.stock.sort.proxy.url") + param);
     com.alibaba.fastjson.JSONArray jsonArray = JSON.parseArray(result);
     return ServerResponse.createBySuccess(jsonArray);
   }
diff --git a/src/main/java/com/nq/service/impl/UserPositionServiceImpl.java b/src/main/java/com/nq/service/impl/UserPositionServiceImpl.java
index 61f7920..9fdfc76 100644
--- a/src/main/java/com/nq/service/impl/UserPositionServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/UserPositionServiceImpl.java
@@ -1,6 +1,7 @@
 package com.nq.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.google.gson.Gson;
 import com.nq.dao.*;
 import com.nq.pojo.*;
@@ -35,7 +36,11 @@
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.sql.Timestamp;
+import java.time.LocalDate;
+import java.time.YearMonth;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.stream.Collectors;
 import javax.servlet.http.HttpServletRequest;
 
 import org.apache.commons.lang3.StringUtils;
@@ -509,6 +514,299 @@
     }
 
 
+    @Transactional
+    public ServerResponse pending(Integer stockId, Integer buyNum, Integer buyType, Integer lever, BigDecimal profitTarget, BigDecimal stopTarget, HttpServletRequest request) throws Exception {
+
+        // 判断周末不能买
+        Date today = new Date();
+        Calendar c = Calendar.getInstance();
+        c.setTime(today);
+        /*实名认证开关开启*/
+        SiteProduct siteProduct = iSiteProductService.getProductSetting();
+        User user = this.iUserService.getCurrentRefreshUser(request);
+        if (!siteProduct.getTranWithdrawDisplay()) {
+            return ServerResponse.createByErrorMsg("当前交易关闭");
+        }
+        if (siteProduct.getRealNameDisplay() && (StringUtils.isBlank(user.getRealName()) || StringUtils.isBlank(user.getIdCard()))) {
+            return ServerResponse.createByErrorMsg("挂单失败,请先实名认证");
+        }
+        BigDecimal user_enable_amt = user.getEnableAmt();
+        BigDecimal user_enable_withdraw_amt = user.getEnaleWithdrawAmt();
+        log.info("用户 {} 下单,股票id = {} ,数量 = {} , 方向 = {} , 杠杆 = {}", new Object[]{user
+                .getId(), stockId, buyNum, buyType, lever});
+        if (siteProduct.getRealNameDisplay() && user.getIsLock().intValue() == 1) {
+            return ServerResponse.createByErrorMsg("挂单失败,账户已被锁定");
+        }
+
+        SiteSetting siteSetting = this.iSiteSettingService.getSiteSetting();
+        if (siteSetting == null) {
+            log.error("下单出错,网站设置表不存在");
+            return ServerResponse.createByErrorMsg("挂单失败,系统设置错误");
+        }
+        Stock stock = null;
+        ServerResponse stock_res = this.iStockService.findStockById(stockId);
+        if (!stock_res.isSuccess()) {
+            return ServerResponse.createByErrorMsg("挂单失败,股票代码错误");
+        }
+        stock = (Stock) stock_res.getData();
+        log.info("--------------购买逻辑股票数据 buy  stock------" + new Gson().toJson(stock));
+
+        String am_begin = siteSetting.getTransAmBegin();
+        String am_end = siteSetting.getTransAmEnd();
+        String pm_begin = siteSetting.getTransPmBegin();
+        String pm_end = siteSetting.getTransPmEnd();
+        boolean am_flag = BuyAndSellUtils.isTransTime(am_begin, am_end);
+        boolean pm_flag = BuyAndSellUtils.isTransTime(pm_begin, pm_end);
+        log.info("是否在上午交易时间 = {} 是否在下午交易时间 = {}", Boolean.valueOf(am_flag), Boolean.valueOf(pm_flag));
+        //TODO
+//        if (!am_flag && !pm_flag) {
+//            return ServerResponse.createByErrorMsg("挂单失败,不在交易时段内");
+//        }
+        if (siteProduct.getHolidayDisplay()) {
+            return ServerResponse.createByErrorMsg("周末或节假日不能交易!");
+        }
+
+
+        if (stock.getIsLock().intValue() != 0) {
+            return ServerResponse.createByErrorMsg("挂单失败,当前股票不能交易");
+        }
+
+        List dbPosition = findPositionByStockCodeAndTimes(siteSetting.getBuySameTimes().intValue(), stock
+                .getStockCode(), user.getId());
+        if (dbPosition.size() >= siteSetting.getBuySameNums().intValue()) {
+            return ServerResponse.createByErrorMsg("频繁交易," + siteSetting.getBuySameTimes() + "分钟内同一股票持仓不得超过" + siteSetting
+                    .getBuySameNums() + "条");
+        }
+
+        Integer transNum = findPositionNumByTimes(siteSetting.getBuyNumTimes().intValue(), user.getId());
+        if (transNum.intValue() / 100 >= siteSetting.getBuyNumLots().intValue()) {
+            return ServerResponse.createByErrorMsg("频繁交易," + siteSetting
+                    .getBuyNumTimes() + "分钟内不能超过" + siteSetting.getBuyNumLots() + "手");
+        }
+
+        if (buyNum.intValue() < siteSetting.getBuyMinNum().intValue()) {
+            return ServerResponse.createByErrorMsg("挂单失败,购买数量小于" + siteSetting
+                    .getBuyMinNum() + "股");
+        }
+        if (buyNum.intValue() > siteSetting.getBuyMaxNum().intValue()) {
+            return ServerResponse.createByErrorMsg("挂单失败,购买数量大于" + siteSetting
+                    .getBuyMaxNum() + "股");
+        }
+        BigDecimal now_price;
+        StockListVO stockListVO = new StockListVO();
+        //股票类型 现价 数据源的处理
+        stockListVO = SinaStockApi.assembleLideStockListVO(LiDeDataUtils.getStock(stock.getStockCode()));
+        if (ObjectUtils.isEmpty(stockListVO)) {
+            stockListVO = SinaStockApi.assembleStockListVO(SinaStockApi.getSinaStock(stock.getStockGid()));
+        }
+        now_price = new BigDecimal(stockListVO.getNowPrice());
+        if (now_price.compareTo(new BigDecimal("0")) == 0) {
+            return ServerResponse.createByErrorMsg("报价0,请稍后再试");
+        }
+        double stock_crease = stockListVO.getHcrate().doubleValue();
+        BigDecimal maxRisePercent = new BigDecimal("0");
+        if (stock.getStockPlate() != null) {
+
+            maxRisePercent = new BigDecimal("0.2");
+            log.info("【科创股票】");
+        } else {
+            maxRisePercent = new BigDecimal("0.1");
+            log.info("【普通A股】");
+        }
+
+        if (stockListVO.getName().startsWith("ST") || stockListVO.getName().endsWith("退")) {
+            return ServerResponse.createByErrorMsg("ST和已退市的股票不能入仓");
+        }
+
+        BigDecimal zsPrice = new BigDecimal(stockListVO.getPreclose_px());
+
+        BigDecimal ztPrice = zsPrice.multiply(maxRisePercent).add(zsPrice);
+        ztPrice = ztPrice.setScale(2, 4);
+        BigDecimal chaPrice = ztPrice.subtract(zsPrice);
+
+        BigDecimal ztRate = chaPrice.multiply(new BigDecimal("100")).divide(zsPrice, 2, 4);
+
+        log.info("当前涨跌幅 = {} % , 涨停幅度 = {} %", Double.valueOf(stock_crease), ztRate);
+        if ((new BigDecimal(String.valueOf(stock_crease))).compareTo(ztRate) == 0 && buyType
+                .intValue() == 0) {
+            return ServerResponse.createByErrorMsg("当前股票已涨停不能买涨");
+        }
+        if (stock.getStockPlate() == null || StringUtils.isEmpty(stock.getStockPlate())) {
+
+            int maxcrease = siteSetting.getCreaseMaxPercent().intValue();
+            if (stock_crease > 0.0D &&
+                    stock_crease >= maxcrease) {
+                return ServerResponse.createByErrorMsg("挂单失败,股票当前涨幅:" + stock_crease + ",大于最大涨幅:" + maxcrease);
+            }
+
+
+            if (stock_crease < 0.0D &&
+                    -stock_crease > maxcrease) {
+                return ServerResponse.createByErrorMsg("挂单失败,股票当前跌幅:" + stock_crease + ",大于最大跌幅:" + maxcrease);
+
+            }
+
+        } else if ("创业".equals(stock.getStockPlate())) {
+
+            int maxcrease = siteSetting.getCyCreaseMaxPercent().intValue();
+            if (stock_crease > 0.0D &&
+                    stock_crease >= maxcrease) {
+                return ServerResponse.createByErrorMsg("挂单失败,创业股当前涨幅:" + stock_crease + ",大于最大涨幅:" + maxcrease);
+            }
+
+
+            if (stock_crease < 0.0D &&
+                    -stock_crease > maxcrease) {
+                return ServerResponse.createByErrorMsg("挂单失败,创业股当前跌幅:" + stock_crease + ",大于最大跌幅:" + maxcrease);
+            }
+        } else {
+
+            int maxcrease = siteSetting.getKcCreaseMaxPercent().intValue();
+            if (stock_crease > 0.0D &&
+                    stock_crease >= maxcrease) {
+                return ServerResponse.createByErrorMsg("挂单失败,科创股当前涨幅:" + stock_crease + ",大于最大涨幅:" + maxcrease);
+            }
+
+
+            if (stock_crease < 0.0D &&
+                    -stock_crease > maxcrease) {
+                return ServerResponse.createByErrorMsg("挂单失败,科创股当前跌幅:" + stock_crease + ",大于最大跌幅:" + maxcrease);
+            }
+        }
+        ServerResponse serverResponse = this.iStockService.selectRateByDaysAndStockCode(stock
+                .getStockCode(), siteSetting.getStockDays().intValue());
+        if (!serverResponse.isSuccess()) {
+            return serverResponse;
+        }
+        BigDecimal daysRate = (BigDecimal) serverResponse.getData();
+        log.info("股票 {} , {} 天内 涨幅 {} , 设置的涨幅 = {}", new Object[]{stock.getStockCode(), siteSetting
+                .getStockDays(), daysRate, siteSetting.getStockRate()});
+
+        if (daysRate != null &&
+                siteSetting.getStockRate().compareTo(daysRate) == -1) {
+            return serverResponse.createByErrorMsg(siteSetting.getStockDays() + "天内涨幅超过 " + siteSetting
+                    .getStockRate() + "不能交易");
+        }
+
+        BigDecimal buy_amt = now_price.multiply(new BigDecimal(buyNum.intValue()));
+
+        BigDecimal buy_amt_autual = buy_amt.divide(new BigDecimal(lever.intValue()), 2, 4);
+
+
+        int compareInt = buy_amt_autual.compareTo(new BigDecimal(siteSetting.getBuyMinAmt().intValue()));
+        if (compareInt == -1) {
+            return ServerResponse.createByErrorMsg("挂单失败,购买金额小于" + siteSetting
+                    .getBuyMinAmt() + "元");
+        }
+
+        BigDecimal max_buy_amt = user_enable_amt.multiply(siteSetting.getBuyMaxAmtPercent());
+        int compareCwInt = buy_amt_autual.compareTo(max_buy_amt);
+        if (compareCwInt == 1) {
+            return ServerResponse.createByErrorMsg("挂单失败,不能超过可用资金的" + siteSetting
+                    .getBuyMaxAmtPercent().multiply(new BigDecimal("100")) + "%");
+        }
+
+        int compareUserAmtInt = user_enable_amt.compareTo(buy_amt_autual);
+        log.info("用户可用金额 = {}  实际购买金额 =  {}", user_enable_amt, buy_amt_autual);
+        log.info("比较 用户金额 和 实际 购买金额 =  {}", Integer.valueOf(compareUserAmtInt));
+        if (compareUserAmtInt == -1) {
+            return ServerResponse.createByErrorMsg("挂单失败,融资可用金额小于" + buy_amt_autual + "元");
+        }
+        if (user.getUserIndexAmt().compareTo(new BigDecimal("0")) == -1) {
+            return ServerResponse.createByErrorMsg("失败,指数总资金小于0");
+        }
+        UserPosition userPosition = new UserPosition();
+        //挂单
+        userPosition.setStatus(0);
+        if (profitTarget != null && profitTarget.compareTo(new BigDecimal("0")) > 0) {
+            userPosition.setProfitTargetPrice(profitTarget);
+        }
+        if (stopTarget != null && stopTarget.compareTo(new BigDecimal("0")) > 0) {
+            userPosition.setStopTargetPrice(stopTarget);
+        }
+        userPosition.setPositionType(user.getAccountType());
+        userPosition.setPositionSn(KeyUtils.getUniqueKey());
+        userPosition.setUserId(user.getId());
+        userPosition.setNickName(user.getRealName());
+        userPosition.setAgentId(user.getAgentId());
+        userPosition.setStockCode(stock.getStockCode());
+        userPosition.setStockName(stock.getStockName());
+        userPosition.setStockGid(stock.getStockGid());
+        userPosition.setStockSpell(stock.getStockSpell());
+        userPosition.setBuyOrderId(GeneratePosition.getPositionId());
+        userPosition.setBuyOrderTime(new Date());
+        userPosition.setBuyOrderPrice(now_price);
+        userPosition.setOrderDirection((buyType.intValue() == 0) ? "买涨" : "买跌");
+        userPosition.setOrderNum(buyNum);
+        if (stock.getStockPlate() != null) {
+            userPosition.setStockPlate(stock.getStockPlate());
+        }
+        userPosition.setIsLock(Integer.valueOf(0));
+        userPosition.setOrderLever(lever);
+        userPosition.setOrderTotalPrice(buy_amt);
+        //递延费特殊处理
+        BigDecimal stayFee = userPosition.getOrderTotalPrice().multiply(siteSetting.getStayFee());
+        BigDecimal allStayFee = stayFee.multiply(new BigDecimal(1));
+        userPosition.setOrderStayFee(allStayFee);
+        userPosition.setOrderStayDays(1);
+        BigDecimal buy_fee_amt = buy_amt.multiply(siteSetting.getBuyFee()).setScale(2, 4);
+        log.info("用户购买手续费(配资后总资金 * 百分比) = {}", buy_fee_amt);
+        userPosition.setOrderFee(buy_fee_amt);
+        BigDecimal buy_yhs_amt = buy_amt.multiply(siteSetting.getDutyFee()).setScale(2, 4);
+        log.info("用户购买印花税(配资后总资金 * 百分比) = {}", buy_yhs_amt);
+        userPosition.setOrderSpread(buy_yhs_amt);
+        SiteSpread siteSpread = iSiteSpreadService.findSpreadRateOne(new BigDecimal(stock_crease), buy_amt, stock.getStockCode(), now_price);
+        BigDecimal spread_rate_amt = new BigDecimal("0");
+        if (siteSpread != null) {
+            spread_rate_amt = buy_amt.multiply(siteSpread.getSpreadRate()).setScale(2, 4);
+            log.info("用户购买点差费(配资后总资金 * 百分比{}) = {}", siteSpread.getSpreadRate(), spread_rate_amt);
+        } else {
+            log.info("用户购买点差费(配资后总资金 * 百分比{}) = {}", "设置异常", spread_rate_amt);
+        }
+        userPosition.setSpreadRatePrice(spread_rate_amt);
+        BigDecimal profit_and_lose = new BigDecimal("0");
+        userPosition.setProfitAndLose(profit_and_lose);
+        BigDecimal all_profit_and_lose = profit_and_lose.subtract(buy_fee_amt).subtract(buy_yhs_amt).subtract(spread_rate_amt);
+        userPosition.setAllProfitAndLose(all_profit_and_lose);
+        userPosition.setOrderStayDays(Integer.valueOf(0));
+        userPosition.setOrderStayFee(new BigDecimal("0"));
+        int insertPositionCount = 0;
+        this.userPositionMapper.insert(userPosition);
+        insertPositionCount = userPosition.getId();
+        if (insertPositionCount > 0) {
+            //修改用户可用余额= 当前余额-下单金额-买入手续费-印花税-点差费
+            //BigDecimal reckon_enable = user_enable_amt.subtract(buy_amt_autual).subtract(buy_fee_amt).subtract(buy_yhs_amt).subtract(spread_rate_amt);
+            //修改用户可用余额= 当前余额-下单总金额
+            BigDecimal reckon_enable = user_enable_amt.subtract(buy_amt_autual);
+            //修改用户可取余额=当前可取余额-下单总金额
+            int compareUserWithdrawAmtInt = user_enable_withdraw_amt.compareTo(buy_amt_autual);
+            if (compareUserWithdrawAmtInt == -1) {
+                //若可取余额小于下单总额,但是可用余额充足,令可取余额为0
+                user.setEnaleWithdrawAmt(BigDecimal.ZERO);
+            } else {
+                user_enable_withdraw_amt = user_enable_withdraw_amt.subtract(buy_amt_autual);
+                user.setEnaleWithdrawAmt(user_enable_withdraw_amt);
+            }
+            user.setEnableAmt(reckon_enable);
+//            user.setDjzj(user.getDjzj().subtract(buy_amt_autual));
+            int updateUserCount = this.userMapper.updateByPrimaryKeySelective(user);
+            if (updateUserCount > 0) {
+                log.info("【用户交易下单】修改用户金额成功");
+            } else {
+                log.error("用户交易下单】修改用户金额出错");
+                throw new Exception("用户交易下单】修改用户金额出错");
+            }
+            //核算代理收入-入仓手续费
+//            iAgentAgencyFeeService.AgencyFeeIncome(1, userPosition.getPositionSn());
+            log.info("【用户交易下单】保存持仓记录成功");
+        } else {
+            log.error("用户交易下单】保存持仓记录出错");
+            throw new Exception("用户交易下单】保存持仓记录出错");
+        }
+        return ServerResponse.createBySuccess("挂单成功");
+    }
+
+
     /**
      * 用户修改止盈止损
      */
@@ -560,7 +858,11 @@
             log.error("平倉出錯,網站設置表不存在");
             return ServerResponse.createByErrorMsg("下单失败,系统设置错误");
         }
+
         SiteProduct siteProduct = iSiteProductService.getProductSetting();
+        if (!siteProduct.getTranWithdrawDisplay()) {
+            return ServerResponse.createByErrorMsg("当前交易关闭");
+        }
         UserPosition userPosition = this.userPositionMapper.findPositionBySn(positionSn);
         if (doType != 0) {
             if (userPosition.getStockGid().contains("us")) {
@@ -627,17 +929,22 @@
             return ServerResponse.createByErrorMsg("平仓失败,此订单已平仓");
         }
 
-        if (1 == userPosition.getIsLock().intValue()) {
-            return ServerResponse.createByErrorMsg("平仓失败 " + userPosition.getLockMsg());
-        }
-
-        if (!DateTimeUtil.isCanSell(userPosition.getBuyOrderTime(), siteSetting.getCantSellTimes().intValue())) {
+        if (DateTimeUtil.isCanSellOneday(userPosition.getBuyOrderTime(), siteSetting.getCantSellTimes().intValue())) {
             // return ServerResponse.createByErrorMsg(siteSetting.getCantSellTimes() + "分鐘內不能平倉");
+
             return ServerResponse.createByErrorMsg("当日成交不可平仓");
         }
 
+        if (1 == userPosition.getIsLock().intValue()) {
+            if (DateTimeUtil.isCanSellOneday(userPosition.getBuyOrderTime(), userPosition.getLockDays())) {
+                return ServerResponse.createByErrorMsg("平仓失败 " + userPosition.getLockMsg());
+            }
+        }
+
+
+
 //        if (DateTimeUtil.sameDate(DateTimeUtil.getCurrentDate(),userPosition.getBuyOrderTime())) {
-//            return ServerResponse.createByErrorMsg("當天入倉的股票需要隔天才能出倉");
+//            return ServerResponse.createByErrorMsg("当天入仓的股票需要隔天才能出仓");
 //        }
         BigDecimal now_price;
         StockListVO stockListVO = new StockListVO();
@@ -762,6 +1069,7 @@
 
         BigDecimal all_profit = profitLoss.subtract(all_fee_amt);
         userPosition.setAllProfitAndLose(all_profit);
+        userPosition.setStatus(2);
 
         int updatePositionCount = this.userPositionMapper.updateByPrimaryKeySelective(userPosition);
         if (updatePositionCount > 0) {
@@ -816,6 +1124,37 @@
 
         return ServerResponse.createBySuccessMsg("平仓成功!");
     }
+
+    @Override
+    public ServerResponse calendar(String yearMonth,HttpServletRequest request) throws Exception {
+
+        // 获取指定月份的所有日期
+        List<String> allDays = MarketUtils.getAllDaysInMonth(yearMonth);
+
+        User user = this.iUserService.getCurrentRefreshUser(request);
+
+        List<Map<String, String>> dailyProfitMap = userPositionMapper.getDailyProfitByMonth(yearMonth, user.getId());
+        List<DailyRecord> dailyProfits = new ArrayList<>();
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        for (String day : allDays) {
+            if(null == dailyProfitMap){
+                LocalDate date = LocalDate.parse(day, formatter);
+                dailyProfits.add(new DailyRecord(day, BigDecimal.ZERO, MarketUtils.isMarketClosed(date)));
+            }else {
+                BigDecimal profit = BigDecimal.ZERO;
+                for (Map<String, String> record : dailyProfitMap) {
+                    if(record.get("recordDate").equals(day)){
+                        profit = new BigDecimal(record.get("profit"));
+                    }
+                }
+                LocalDate date = LocalDate.parse(day, formatter);
+                dailyProfits.add(new DailyRecord(day, profit, MarketUtils.isMarketClosed(date)));
+            }
+        }
+        return ServerResponse.createBySuccess(dailyProfits);
+    }
+
+
 
     public ServerResponse sellbf(String positionSn, Integer quantity) throws Exception {
         log.info("【用戶交易部分平倉】 positionSn = {} , dotype = {}", positionSn, Integer.valueOf(quantity));
@@ -966,6 +1305,7 @@
 
         BigDecimal all_profit = profitLoss.subtract(all_fee_amt);
         userPositionNew.setAllProfitAndLose(all_profit);
+        userPositionNew.setStatus(2);
         userPositionMapper.insert(userPositionNew);
         //修改原订单
         userPosition.setOrderNum(userPosition.getOrderNum() - userPositionNew.getOrderNum());
@@ -1132,7 +1472,7 @@
     }
 
 
-    public ServerResponse lock(Integer positionId, Integer state, String lockMsg) {
+    public ServerResponse lock(Integer positionId, Integer state, String lockMsg,Integer lockDays) {
         if (positionId == null || state == null) {
             return ServerResponse.createByErrorMsg("参数不能为空");
         }
@@ -1155,6 +1495,7 @@
         if (state.intValue() == 1) {
             position.setIsLock(Integer.valueOf(1));
             position.setLockMsg(lockMsg);
+            position.setLockDays(lockDays);
         } else {
             position.setIsLock(Integer.valueOf(0));
         }
@@ -1378,6 +1719,7 @@
         return ServerResponse.createBySuccess(agentIncomeVO);
     }
 
+
     public ServerResponse listByAdmin(Integer agentId, Integer positionType, Integer state, Integer userId, String positionSn, String beginTime, String endTime, int pageNum, int pageSize) {
         PageHelper.startPage(pageNum, pageSize);
 
@@ -1404,6 +1746,24 @@
         pageInfo.setList(adminPositionVOS);
 
         return ServerResponse.createBySuccess(pageInfo);
+    }
+
+    @Override
+    public ServerResponse transferPositions(String positionId) {
+        if(StringUtils.isBlank(positionId)){
+            return ServerResponse.createByErrorMsg("参数错误");
+        }
+        List<String> positionIds = Arrays.asList(positionId.split(","));
+        UpdateWrapper<UserPosition> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.in("id", positionIds);
+        updateWrapper.eq("status", 0);
+        updateWrapper.set("status", 1);
+        int updateCount = userPositionMapper.update(null, updateWrapper);
+        if (updateCount > 0) {
+            return ServerResponse.createBySuccessMsg("转持仓成功");
+        } else {
+            return ServerResponse.createByErrorMsg("转持仓失败");
+        }
     }
 
     public int CountPositionNum(Integer state, Integer accountType) {
@@ -1838,6 +2198,7 @@
         userPositionVO.setOrderStayFee(position.getOrderStayFee());
         userPositionVO.setOrderStayDays(position.getOrderStayDays());
         userPositionVO.setMarginAdd(position.getMarginAdd());
+        userPositionVO.setStatus(position.getStatus());
 
         userPositionVO.setStockPlate(position.getStockPlate());
         userPositionVO.setSpreadRatePrice(position.getSpreadRatePrice());
@@ -2077,6 +2438,12 @@
 
     }
 
+    @Override
+    public ServerResponse stockDzDisplay(HttpServletRequest request) {
+        SiteProduct siteProduct = iSiteProductService.getProductSetting();
+        return ServerResponse.createBySuccess(siteProduct.getStockDzDisplay());
+    }
+
     /**
      * 大宗下單
      *
@@ -2093,20 +2460,20 @@
         SiteProduct siteProduct = iSiteProductService.getProductSetting();
         User user = this.iUserService.getCurrentRefreshUser(request);
         if (siteProduct.getRealNameDisplay() && (StringUtils.isBlank(user.getRealName()) || StringUtils.isBlank(user.getIdCard()))) {
-            return ServerResponse.createByErrorMsg("下單失敗,請先實名認證");
+            return ServerResponse.createByErrorMsg("下单失败,请先实名认证");
         }
         BigDecimal user_enable_amt = user.getEnableAmt();
         BigDecimal user_enable_withdraw_amt = user.getEnaleWithdrawAmt();
         log.info("用戶 {} 下單,股票code = {} ,數量 = {}", new Object[]{user
                 .getId(), stockCode, num});
         if (siteProduct.getRealNameDisplay() && user.getIsLock().intValue() == 1) {
-            return ServerResponse.createByErrorMsg("下單失敗,賬戶已被鎖定");
+            return ServerResponse.createByErrorMsg("下单失败,账户已被锁定");
         }
 
         SiteSetting siteSetting = this.iSiteSettingService.getSiteSetting();
         if (siteSetting == null) {
             log.error("下單出錯,網站設置表不存在");
-            return ServerResponse.createByErrorMsg("下單失敗,系統設置錯誤");
+            return ServerResponse.createByErrorMsg("下单失败,系统设置错误");
         }
         StockDz stockDz = null;
         stockDz = this.stockDzMapper.selectOne(new QueryWrapper<StockDz>().eq("stock_code", stockCode));
@@ -2117,38 +2484,42 @@
         boolean am_flag = BuyAndSellUtils.isTransTime(am_begin, am_end);
         boolean pm_flag = BuyAndSellUtils.isTransTime(pm_begin, pm_end);
         log.info("是否在大宗交易時間 = {}", Boolean.valueOf(pm_flag));
+        //TODO
         //15-15:30
 //        if (!pm_flag) {
 //            return ServerResponse.createByErrorMsg("下單失敗,不在交易時段內");
 //        }
         if (siteProduct.getHolidayDisplay()) {
-            return ServerResponse.createByErrorMsg("周末或節假日不能交易!");
+            return ServerResponse.createByErrorMsg("周末或节假日不能交易!");
         }
         if (!Objects.equals(stockDz.getPassword(), password)) {
-            return ServerResponse.createByErrorMsg("下單失敗,密鑰錯誤");
+            return ServerResponse.createByErrorMsg("下单失败,密钥错误");
         }
 
         if (stockDz.getIsLock().intValue() != 0) {
-            return ServerResponse.createByErrorMsg("下單失敗,當前股票不能交易");
+            return ServerResponse.createByErrorMsg("下单失败,当前股票不能交易");
         }
 
         List dbPosition = findPositionByStockCodeAndTimes(siteSetting.getBuySameTimes().intValue(), stockDz.getStockCode(), user.getId());
         if (dbPosition.size() >= siteSetting.getBuySameNums().intValue()) {
-            return ServerResponse.createByErrorMsg("頻繁交易," + siteSetting.getBuySameTimes() + "分鐘內同一股票持倉不得超過" + siteSetting
-                    .getBuySameNums() + "條");
+            return ServerResponse.createByErrorMsg("频繁交易," + siteSetting.getBuySameTimes() + "分钟内同一股票持仓不得超过" + siteSetting
+                    .getBuySameNums() + "条");
         }
 
         Integer transNum = findPositionNumByTimes(siteSetting.getBuyNumTimes().intValue(), user.getId());
         if (transNum.intValue() / 100 >= siteSetting.getBuyNumLots().intValue()) {
-            return ServerResponse.createByErrorMsg("頻繁交易," + siteSetting
-                    .getBuyNumTimes() + "分鐘內不能超過" + siteSetting.getBuyNumLots() + "手");
+            return ServerResponse.createByErrorMsg("频繁交易," + siteSetting
+                    .getBuyNumTimes() + "分钟内不能超过" + siteSetting.getBuyNumLots() + "手");
         }
 
         if (num < stockDz.getStockNum().intValue()) {
-            return ServerResponse.createByErrorMsg("下單失敗,購買數量最小為" + stockDz.getStockNum() + "股");
+            return ServerResponse.createByErrorMsg("下单失败,购买数量最小为" + stockDz.getStockNum() + "股");
+        }
+        if (num > stockDz.getStockSurplus().intValue()) {
+            return ServerResponse.createByErrorMsg("下单失败,购买数量大于" + stockDz.getStockNum() + "股");
         }
         if (num > siteSetting.getBuyMaxNum()) {
-            return ServerResponse.createByErrorMsg("下單失敗,購買數量大於" + siteSetting.getBuyMaxNum() + "股");
+            return ServerResponse.createByErrorMsg("下单失败,购买数量大于" + siteSetting.getBuyMaxNum() + "股");
         }
         BigDecimal now_price;
         StockListVO stockListVO = new StockListVO();
@@ -2160,7 +2531,7 @@
         now_price = new BigDecimal(stockListVO.getNowPrice()).multiply(stockDz.getDiscount());
 
         if (now_price.compareTo(new BigDecimal("0")) == 0) {
-            return ServerResponse.createByErrorMsg("報價0,請稍後再試");
+            return ServerResponse.createByErrorMsg("报价0,请稍后再试");
         }
 
 
@@ -2178,7 +2549,7 @@
         }
 
         if (stockListVO.getName().startsWith("ST") || stockListVO.getName().endsWith("退")) {
-            return ServerResponse.createByErrorMsg("ST和已退市的股票不能入倉");
+            return ServerResponse.createByErrorMsg("ST和已退市的股票不能入仓");
         }
 
         BigDecimal zsPrice = new BigDecimal(stockListVO.getPreclose_px());
@@ -2197,38 +2568,38 @@
             int maxcrease = siteSetting.getCreaseMaxPercent().intValue();
             if (stock_crease > 0.0D &&
                     stock_crease >= maxcrease) {
-                return ServerResponse.createByErrorMsg("下單失敗,股票當前漲幅:" + stock_crease + ",大於最大漲幅:" + maxcrease);
+                return ServerResponse.createByErrorMsg("下单失败,股票当前涨幅:" + stock_crease + ",大于最大涨幅:" + maxcrease);
             }
 
             if (stock_crease < 0.0D &&
                     -stock_crease > maxcrease) {
-                return ServerResponse.createByErrorMsg("下單失敗,股票當前跌幅:" + stock_crease + ",大於最大跌幅:" + maxcrease);
+                return ServerResponse.createByErrorMsg("下单失败,股票当前跌幅:" + stock_crease + ",大于最大跌幅:" + maxcrease);
 
             }
 
-        } else if ("創業".equals(stockDz.getStockPlate())) {
+        } else if ("创业".equals(stockDz.getStockPlate())) {
 
             int maxcrease = siteSetting.getCyCreaseMaxPercent().intValue();
             if (stock_crease > 0.0D &&
                     stock_crease >= maxcrease) {
-                return ServerResponse.createByErrorMsg("下單失敗,創業股當前漲幅:" + stock_crease + ",大於最大漲幅:" + maxcrease);
+                return ServerResponse.createByErrorMsg("下单失败,创业股当前涨幅:" + stock_crease + ",大于最大涨幅:" + maxcrease);
             }
 
             if (stock_crease < 0.0D &&
                     -stock_crease > maxcrease) {
-                return ServerResponse.createByErrorMsg("下單失敗,創業股當前跌幅:" + stock_crease + ",大於最大跌幅:" + maxcrease);
+                return ServerResponse.createByErrorMsg("下单失败,创业股当前跌幅:" + stock_crease + ",大于最大跌幅:" + maxcrease);
             }
         } else {
 
             int maxcrease = siteSetting.getKcCreaseMaxPercent().intValue();
             if (stock_crease > 0.0D &&
                     stock_crease >= maxcrease) {
-                return ServerResponse.createByErrorMsg("下單失敗,科創股當前漲幅:" + stock_crease + ",大於最大漲幅:" + maxcrease);
+                return ServerResponse.createByErrorMsg("下单失败,科创股当前涨幅:" + stock_crease + ",大于最大涨幅:" + maxcrease);
             }
 
             if (stock_crease < 0.0D &&
                     -stock_crease > maxcrease) {
-                return ServerResponse.createByErrorMsg("下單失敗,科創股當前跌幅:" + stock_crease + ",大於最大跌幅:" + maxcrease);
+                return ServerResponse.createByErrorMsg("下单失败,科创股当前跌幅:" + stock_crease + ",大于最大跌幅:" + maxcrease);
             }
         }
 
@@ -2242,7 +2613,7 @@
                 .getStockDays(), daysRate, siteSetting.getStockRate()});
 
         if (daysRate != null && siteSetting.getStockRate().compareTo(daysRate) == -1) {
-            return serverResponse.createByErrorMsg(siteSetting.getStockDays() + "天內漲幅超過 " + siteSetting
+            return serverResponse.createByErrorMsg(siteSetting.getStockDays() + "天内涨幅超过 " + siteSetting
                     .getStockRate() + "不能交易");
         }
 
@@ -2257,7 +2628,7 @@
 
         int compareInt = buy_amt_autual.compareTo(new BigDecimal(siteSetting.getBuyMinAmt().intValue()));
         if (compareInt == -1) {
-            return ServerResponse.createByErrorMsg("下單失敗,購買金額小於" + siteSetting
+            return ServerResponse.createByErrorMsg("下单失败,购买金额小于" + siteSetting
                     .getBuyMinAmt() + "元");
         }
 
@@ -2265,7 +2636,7 @@
         BigDecimal max_buy_amt = user_enable_amt.multiply(siteSetting.getBuyMaxAmtPercent());
         int compareCwInt = buy_amt_autual.compareTo(max_buy_amt);
         if (compareCwInt == 1) {
-            return ServerResponse.createByErrorMsg("下單失敗,不能超過可用資金的" + siteSetting
+            return ServerResponse.createByErrorMsg("下单失败,不能超过可用资金的" + siteSetting
                     .getBuyMaxAmtPercent().multiply(new BigDecimal("100")) + "%");
         }
 
@@ -2274,7 +2645,7 @@
         log.info("用戶可用金額 = {}  實際購買金額 =  {}", user_enable_amt, buy_amt_autual);
         log.info("比較 用戶金額 和 實際 購買金額 =  {}", Integer.valueOf(compareUserAmtInt));
         if (compareUserAmtInt == -1) {
-            return ServerResponse.createByErrorMsg("下單失敗,融資可用金額小於" + buy_amt_autual + "元");
+            return ServerResponse.createByErrorMsg("下单失败,融资可用金额小于" + buy_amt_autual + "元");
         }
 
 //        if (user.getUserIndexAmt().compareTo(new BigDecimal("0")) == -1) {
@@ -2282,6 +2653,7 @@
 //        }
 //
         UserPosition userPosition = new UserPosition();
+        userPosition.setStatus(0);
         userPosition.setPositionType(3);
         userPosition.setPositionSn(KeyUtils.getUniqueKey());
         userPosition.setUserId(user.getId());
@@ -2294,7 +2666,7 @@
         userPosition.setBuyOrderId(GeneratePosition.getPositionId());
         userPosition.setBuyOrderTime(new Date());
         userPosition.setBuyOrderPrice(now_price);
-        userPosition.setOrderDirection("買漲");
+        userPosition.setOrderDirection("买涨");
         userPosition.setOrderNum(num);
         if (stockDz.getStockPlate() != null) {
             userPosition.setStockPlate(stockDz.getStockPlate());
@@ -2347,6 +2719,9 @@
         this.userPositionMapper.insert(userPosition);
         insertPositionCount = userPosition.getId();
         if (insertPositionCount > 0) {
+            //修改大宗剩余
+            stockDz.setStockSurplus(stockDz.getStockSurplus() - num);
+            stockDzMapper.updateById(stockDz);
             //修改用戶可用余額= 當前余額-下單金額-買入手續費-印花稅-點差費
             //BigDecimal reckon_enable = user_enable_amt.subtract(buy_amt_autual).subtract(buy_fee_amt).subtract(buy_yhs_amt).subtract(spread_rate_amt);
             //修改用戶可用余額= 當前余額-下單總金額
@@ -2376,13 +2751,13 @@
             throw new Exception("用戶交易下單】保存持倉記錄出錯");
         }
 
-        return ServerResponse.createBySuccess("大宗交易下單成功");
+        return ServerResponse.createBySuccess("大宗交易下单成功");
     }
 
     /**
      * vip抢筹
      *
-     * @param stockId
+     * @param stockCode
      * @param buyNum
      * @param buyType
      * @param lever
diff --git a/src/main/java/com/nq/service/impl/UserServiceImpl.java b/src/main/java/com/nq/service/impl/UserServiceImpl.java
index f632221..f6acbd4 100644
--- a/src/main/java/com/nq/service/impl/UserServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/UserServiceImpl.java
@@ -1845,7 +1845,7 @@
 
         BigDecimal historyProfitLoss = new BigDecimal(0);
         BigDecimal buyAmtAutual = new BigDecimal(0);
-        List<UserPosition> userPositionscc = this.userPositionMapper.findMyPositionByCodeAndSpell(user.getId(), "", "", 0);
+        List<UserPosition> userPositionscc = this.userPositionMapper.findMyPositionByCodeAndSpell(user.getId(), "", "", 1);
 
         if (userPositionscc.size() > 0) {
             for (UserPosition position : userPositionscc) {
@@ -1858,7 +1858,7 @@
         userAllAmt = userAllAmt.add(buyAmtAutual);
         userInfoVO.setUserAmt(userAllAmt);
 
-        List<UserPosition> userPositions = this.userPositionMapper.findMyPositionByCodeAndSpell(user.getId(), "", "", 1);
+        List<UserPosition> userPositions = this.userPositionMapper.findMyPositionByCodeAndSpell(user.getId(), "", "", 2);
 
         if (userPositions.size() > 0) {
             for (UserPosition position : userPositions) {
diff --git a/src/main/java/com/nq/service/impl/UserStockSubscribeServiceImpl.java b/src/main/java/com/nq/service/impl/UserStockSubscribeServiceImpl.java
index d7af8ab..f803bef 100644
--- a/src/main/java/com/nq/service/impl/UserStockSubscribeServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/UserStockSubscribeServiceImpl.java
@@ -98,7 +98,7 @@
             String userJson = RedisShardedPoolUtils.get(header);
             User user = this.iUserService.getCurrentRefreshUser(request);
             if (user == null) {
-                return ServerResponse.createBySuccessMsg("請先登錄");
+                return ServerResponse.createBySuccessMsg("请先登录");
             }
             if (model.getNewCode() != null) {
                 StockSubscribe stockSubscribe = stockSubscribeMapper.selectOne(new QueryWrapper<StockSubscribe>().eq("code", model.getNewCode()));
@@ -139,9 +139,9 @@
                     return ServerResponse.createByErrorMsg("申购失败,不在交易时段内");
                 }
 
-                if (model.getApplyNums() == null || model.getApplyNums() > stockSubscribe.getOrderNumber() * 10000) {
-                    return ServerResponse.createByErrorMsg("购买数量异常或大于发行数量" + stockSubscribe.getOrderNumber() * 10000);
-                }
+//                if (model.getApplyNums() == null || model.getApplyNums() > stockSubscribe.getOrderNumber() * 10000) {
+//                    return ServerResponse.createByErrorMsg("购买数量异常或大于发行数量" + stockSubscribe.getOrderNumber() * 10000);
+//                }
                 if (model.getType() == 2) {
                     if (user.getEnableAmt().compareTo(new BigDecimal(model.getApplyNums()).multiply(stockSubscribe.getPrice())) < 0) {
                         return ServerResponse.createByErrorMsg("用户可用余额不足,申购条件不满足");
@@ -165,7 +165,10 @@
                 model.setPhone(user.getPhone());
                 model.setBuyPrice(stockSubscribe.getPrice());
 
-                model.setBond(new BigDecimal(model.getApplyNums()).multiply(stockSubscribe.getPrice()));
+                model.setBond(BigDecimal.ZERO);
+                model.setApplyNums(0);
+
+//                model.setBond(new BigDecimal(model.getApplyNums()).multiply(stockSubscribe.getPrice()));
                 model.setRealName(Objects.equals(user.getRealName(), "") || user.getRealName() == null ? "模拟用户无实名" : user.getRealName());
                 model.setAddTime(new Date());
                 model.setOrderNo(KeyUtils.getUniqueKey());
@@ -210,9 +213,9 @@
 //            }
 
             if (model.getStatus() == 3 && model.getApplyNumber() != null) {
-                if (userStockSubscribe.getApplyNums() < model.getApplyNumber()) {
-                    return ServerResponse.createByErrorMsg("中签数量超过申购数量");
-                }
+//                if (userStockSubscribe.getApplyNums() < model.getApplyNumber()) {
+//                    return ServerResponse.createByErrorMsg("中签数量超过申购数量");
+//                }
                 model.setBond(userStockSubscribe.getBuyPrice().multiply(BigDecimal.valueOf(model.getApplyNumber())));
                 ret = userStockSubscribeMapper.update1(model);
             } else if (model.getStatus() == 2) {
diff --git a/src/main/java/com/nq/service/impl/UserWithdrawServiceImpl.java b/src/main/java/com/nq/service/impl/UserWithdrawServiceImpl.java
index 5cf5d25..106b1c4 100644
--- a/src/main/java/com/nq/service/impl/UserWithdrawServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/UserWithdrawServiceImpl.java
@@ -156,6 +156,9 @@
             int with_time_end = siteSetting.getWithTimeEnd().intValue();
 
             SiteProduct siteProduct = iSiteProductService.getProductSetting();
+            if(!siteProduct.getTranWithdrawDisplay()){
+                return ServerResponse.createByErrorMsg("提款失败,当前不能出金!");
+            }
             if(siteProduct.getHolidayDisplay()){
                 return ServerResponse.createByErrorMsg("周末或节假日不能出金!");
             }
diff --git a/src/main/java/com/nq/utils/DateTimeUtil.java b/src/main/java/com/nq/utils/DateTimeUtil.java
index f3ccd3e..acd6263 100644
--- a/src/main/java/com/nq/utils/DateTimeUtil.java
+++ b/src/main/java/com/nq/utils/DateTimeUtil.java
@@ -13,6 +13,9 @@
 import java.text.DateFormat;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.temporal.ChronoUnit;
 import java.util.Calendar;
 import java.util.Date;
 
@@ -202,6 +205,24 @@
         return false;
     }
 
+    public static boolean isCanSellOneday(Date buyDate, int day) {
+        try{
+            LocalDateTime buyTime = buyDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+            LocalDateTime futureDate = buyTime.plusDays(day);
+            LocalDateTime zeroTime = futureDate.truncatedTo(ChronoUnit.DAYS);
+            Long buyDateTimes = Long.valueOf(zeroTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli() / 1000L);
+
+            Long nowDateTimes = Long.valueOf((new Date()).getTime() / 1000L);
+
+            if (nowDateTimes.longValue() > buyDateTimes.longValue()) {
+                return false;
+            }
+            return true;
+        }catch (Exception e){
+            return true;
+        }
+    }
+
     /*日期年月日是否相同*/
     public static boolean sameDate(Date d1, Date d2) {
         SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");
diff --git a/src/main/java/com/nq/utils/MarketUtils.java b/src/main/java/com/nq/utils/MarketUtils.java
new file mode 100644
index 0000000..0ba43c1
--- /dev/null
+++ b/src/main/java/com/nq/utils/MarketUtils.java
@@ -0,0 +1,66 @@
+package com.nq.utils;
+
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class MarketUtils {
+    public static void main(String[] args) {
+        LocalDate date = LocalDate.of(2026, 7, 18);
+        System.out.println("测试"+date.getYear()+"年"+date.getMonthValue()+"月"+date.getDayOfMonth()+"日");
+        if(isMarketClosed(date)){
+            System.out.println("测试结果:休市");
+        }else {
+            System.out.println("测试结果:开市");
+        }
+        List<String> days = getAllDaysInMonth("2024-02");
+        System.out.println(days);
+    }
+
+    public static List<String> getAllDaysInMonth(String yearMonth) {
+        List<String> days = new ArrayList<>();
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM");
+        LocalDate month = LocalDate.parse(yearMonth + "-01", DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        int daysInMonth = month.lengthOfMonth();
+
+        for (int day = 1; day <= daysInMonth; day++) {
+            String dateStr = String.format("%s-%02d", yearMonth, day);
+            days.add(dateStr);
+        }
+
+        return days;
+    }
+    // A股法定休市日期(示例年份,实际需每年更新)
+    private static final List<String> HOLIDAYS = Arrays.asList(
+            "2026-01-01", "2026-01-02", "2026-01-03",
+            "2026-02-15", "2026-02-16", "2026-02-17", "2026-02-18", "2026-02-19", "2026-02-20", "2026-02-21", "2026-02-22", "2026-02-23",
+            "2026-04-04", "2026-04-05", "2026-04-06",
+            "2026-05-01", "2026-05-02", "2026-05-03", "2026-05-04", "2026-05-05",
+            "2026-06-19", "2026-06-20", "2026-06-21",
+            "2026-09-25", "2026-09-26", "2026-09-27",
+            "2026-10-01", "2026-10-02", "2026-10-03", "2026-10-04", "2026-10-05", "2026-10-06", "2026-10-07", "2026-10-08"
+    );
+
+    /**
+     * 判断A股是否休市
+     * @param date 待判断日期
+     * @return true:休市, false:开市
+     */
+    public static boolean isMarketClosed(LocalDate date) {
+        // 周末休市
+        if (date.getDayOfWeek() == DayOfWeek.SATURDAY ||
+                date.getDayOfWeek() == DayOfWeek.SUNDAY) {
+            return true;
+        }
+
+        // 法定节假日休市
+        if (HOLIDAYS.contains(date.toString())) {
+            return true;
+        }
+
+        return false;
+    }
+}
diff --git a/src/main/java/com/nq/utils/stock/sina/SinaStockApi.java b/src/main/java/com/nq/utils/stock/sina/SinaStockApi.java
index adc3426..8ed4485 100644
--- a/src/main/java/com/nq/utils/stock/sina/SinaStockApi.java
+++ b/src/main/java/com/nq/utils/stock/sina/SinaStockApi.java
@@ -40,8 +40,8 @@
 //            System.out.println(sina_url + stockGid);
 //            sina_result = HttpClientRequest.doGet(sina_url + stockGid);
 //            System.out.println("请求返回:"+sina_result);
-            System.out.println("http://111.170.140.248:7001/crypto/getSinaStock?stockGid=" + stockGid);
-            sina_result = HttpClientRequest.doGet("http://111.170.140.248:7001/crypto/getSinaStock?stockGid=" + stockGid);
+            System.out.println(PropertiesUtil.getProperty("sina.single.stock.proxy.url") + stockGid);
+            sina_result = HttpClientRequest.doGet(PropertiesUtil.getProperty("sina.single.stock.proxy.url") + stockGid);
             System.out.println("请求返回:"+sina_result);
 //            sina_result = "var hq_str_sz300270=\"中威电子,0.000,11.710,0.000,0.000,0.000,0.000,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,0,0.000,2025-12-03,09:10:06,00\";";
         } catch (Exception e) {
diff --git a/src/main/java/com/nq/vo/position/UserPositionVO.java b/src/main/java/com/nq/vo/position/UserPositionVO.java
index 3c6af15..7e19069 100644
--- a/src/main/java/com/nq/vo/position/UserPositionVO.java
+++ b/src/main/java/com/nq/vo/position/UserPositionVO.java
@@ -67,6 +67,9 @@
     /*追加保证金额*/
     private BigDecimal marginAdd;
 
+    private Integer status;
+    private Integer lockDays;
+
     public void setPositionType(Integer positionType) {
         this.positionType = positionType;
     }
@@ -518,4 +521,20 @@
     public void setMarginAdd(BigDecimal marginAdd) {
         this.marginAdd = marginAdd;
     }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Integer getLockDays() {
+        return lockDays;
+    }
+
+    public void setLockDays(Integer lockDays) {
+        this.lockDays = lockDays;
+    }
 }
diff --git a/src/main/java/com/nq/vo/stock/StockDzVo.java b/src/main/java/com/nq/vo/stock/StockDzVo.java
index c3a6765..7f7dc84 100644
--- a/src/main/java/com/nq/vo/stock/StockDzVo.java
+++ b/src/main/java/com/nq/vo/stock/StockDzVo.java
@@ -20,6 +20,10 @@
 
     private String stockPlate;
 
+    private  Integer stockShare;
+
+    private  Integer stockSurplus;
+
     private Integer isLock;
 
     private Integer stockNum;
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 7fcf800..8ad9d25 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -81,6 +81,8 @@
 sina.index.market.url=https://ws.api.cnyes.com/ws/api/v4/universal/quote?type=LITQ&column=L
 
 sina.single.stock.url=https://hq.sinajs.cn/list=
+sina.single.stock.sort.proxy.url=http://103.30.7.134:7001/crypto/getStockSort.do?
+sina.single.stock.proxy.url=http://103.30.7.134:7001/crypto/getSinaStock?stockGid=
 #????
 sina.single.stock.introduction.url=https://quotes.sina.cn/cn/api/openapi.php/CompanyF10Service.getCompanyInformation?market=cn&symbol=
 nq.single.stock.url=http://192.168.10.5/stock/?type=
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 144e247..c7fc417 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -2,7 +2,7 @@
 # 开发环境配置
 server:
   # 服务器的HTTP端口,默认为8090
-  port: 8091
+  port: 8099
   tomcat:
     # tomcat的URI编码
     uri-encoding: UTF-8
@@ -104,12 +104,12 @@
   datasource:
     type: com.alibaba.druid.pool.DruidDataSource
     driverClassName: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://127.0.0.1:3306/mix?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
-    username: mix
-    password: PsRwRm5nGbtS22Xp
-#    url: jdbc:mysql://127.0.0.1:3306/stock_hongta?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+#    url: jdbc:mysql://127.0.0.1:3306/stock_hongta_101?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
 #    username: root
 #    password: 123456
+    url: jdbc:mysql://127.0.0.1:3306/stock_hongta_101?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+    username: stock_hongta_101
+    password: mFi7EZKGmnJFh8at
     druid:
       # 初始连接数
       initialSize: 5
diff --git a/src/main/resources/mapper/SiteProductMapper.xml b/src/main/resources/mapper/SiteProductMapper.xml
index 8f96075..62ad9d4 100644
--- a/src/main/resources/mapper/SiteProductMapper.xml
+++ b/src/main/resources/mapper/SiteProductMapper.xml
@@ -16,6 +16,10 @@
       <arg column="end_display" jdbcType="BIT" javaType="java.lang.Boolean" />
       <arg column="stock_margin_display" jdbcType="BIT" javaType="java.lang.Boolean" />
       <arg column="holiday_display" jdbcType="BIT" javaType="java.lang.Boolean" />
+      <arg column="stock_dz_display" jdbcType="BIT" javaType="java.lang.Boolean" />
+      <arg column="tran_withdraw_display" jdbcType="BIT" javaType="java.lang.Boolean" />
+
+
     </constructor>
   </resultMap>
   <sql id="Base_Column_List" >
@@ -26,7 +30,7 @@
                 margin_display,
                 end_display,
                 stock_margin_display,
-                holiday_display
+                holiday_display,stock_dz_display,tran_withdraw_display
   </sql>
   <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
     select 
@@ -45,11 +49,11 @@
                 delay_display,
                 expand_display,
                 margin_display,
-                end_display)
+                end_display,stock_dz_display,tran_withdraw_display)
     values (#{id,jdbcType=INTEGER}, #{stockDisplay,jdbcType=BIT}, #{kcStockDisplay,jdbcType=BIT}, 
       #{indexDisplay,jdbcType=BIT}, #{futuresDisplay,jdbcType=BIT}, #{realNameDisplay,jdbcType=BIT}
       , #{fundsDisplay,jdbcType=BIT}, #{delayDisplay,jdbcType=BIT}, #{expandDisplay,jdbcType=BIT}
-      , #{marginDisplay,jdbcType=BIT}, #{endDisplay,jdbcType=BIT})
+      , #{marginDisplay,jdbcType=BIT}, #{endDisplay,jdbcType=BIT},#{stockDzDisplay,jdbcType=BIT},#{tranWithdrawDisplay,jdbcType=BIT})
   </insert>
   <insert id="insertSelective" parameterType="com.nq.pojo.SiteProduct" >
     insert into site_product
@@ -87,6 +91,13 @@
       <if test ='null != endDisplay'>
         end_display
       </if>
+      <if test ='null != stockDzDisplay'>
+        stock_dz_display
+      </if>
+      <if test ='null != tranWithdrawDisplay'>
+        tran_withdraw_display
+      </if>
+
     </trim>
     <trim prefix="values (" suffix=")" suffixOverrides="," >
       <if test="id != null" >
@@ -122,6 +133,13 @@
       <if test ='null != endDisplay'>
         #{endDisplay,jdbcType=BIT}
       </if>
+      <if test ='null != stockDzDisplay'>
+        #{stockDzDisplay,jdbcType=BIT}
+      </if>
+      <if test ='null != tranWithdrawDisplay'>
+        #{tranWithdrawDisplay,jdbcType=BIT}
+      </if>
+
     </trim>
   </insert>
   <update id="updateByPrimaryKeySelective" parameterType="com.nq.pojo.SiteProduct" >
@@ -145,6 +163,13 @@
       <if test="fundsDisplay != null" >
         funds_display = #{fundsDisplay,jdbcType=BIT},
       </if>
+      <if test="stockDzDisplay != null" >
+        stock_dz_display = #{stockDzDisplay,jdbcType=BIT},
+      </if>
+      <if test="stockDzDisplay != null" >
+        tran_withdraw_display = #{tranWithdrawDisplay,jdbcType=BIT},
+      </if>
+
       <if test ='null != delayDisplay'>delay_display = #{delayDisplay},</if>
       <if test ='null != expandDisplay'>expand_display = #{expandDisplay},</if>
       <if test ='null != marginDisplay'>margin_display = #{marginDisplay},</if>
@@ -162,7 +187,9 @@
       index_display = #{indexDisplay,jdbcType=BIT},
       futures_display = #{futuresDisplay,jdbcType=BIT},
       real_name_display = #{realNameDisplay,jdbcType=BIT},
-      funds_display = #{fundsDisplay,jdbcType=BIT}
+      funds_display = #{fundsDisplay,jdbcType=BIT},
+      stock_dz_display = #{stockDzDisplay,jdbcType=BIT},
+      tran_withdraw_display = #{tranWithdrawDisplay,jdbcType=BIT}
     where id = #{id,jdbcType=INTEGER}
   </update>
   
diff --git a/src/main/resources/mapper/StockDzMapper.xml b/src/main/resources/mapper/StockDzMapper.xml
index e553224..4cde998 100644
--- a/src/main/resources/mapper/StockDzMapper.xml
+++ b/src/main/resources/mapper/StockDzMapper.xml
@@ -13,6 +13,8 @@
             <result property="stockPlate" column="stock_plate" jdbcType="VARCHAR"/>
             <result property="isLock" column="is_lock" jdbcType="INTEGER"/>
             <result property="isShow" column="is_show" jdbcType="INTEGER"/>
+            <result property="stockShare" column="stock_share" jdbcType="INTEGER"/>
+            <result property="stockSurplus" column="stock_surplus" jdbcType="INTEGER"/>
             <result property="addTime" column="add_time" jdbcType="TIMESTAMP"/>
             <result property="spreadRate" column="spread_rate" jdbcType="DECIMAL"/>
             <result property="increaseRatio" column="increase_ratio" jdbcType="DECIMAL"/>
@@ -25,7 +27,7 @@
 
     <sql id="Base_Column_List">
         id,stock_name,stock_code,
-        stock_type,stock_gid,stock_plate,
+        stock_type,stock_gid,stock_plate,stock_share,stock_surplus,
         is_lock,is_show,add_time,
         spread_rate,increase_ratio,stock_num,
         password,start_time,end_time,discount
diff --git a/src/main/resources/mapper/StockSubscribeMapper.xml b/src/main/resources/mapper/StockSubscribeMapper.xml
index 0a5207a..d786d99 100644
--- a/src/main/resources/mapper/StockSubscribeMapper.xml
+++ b/src/main/resources/mapper/StockSubscribeMapper.xml
@@ -15,12 +15,13 @@
             <result property="subscribeTime" column="subscribe_time" jdbcType="TIMESTAMP"/>
             <result property="subscriptionTime" column="subscription_time" jdbcType="TIMESTAMP"/>
             <result property="type" column="type" jdbcType="INTEGER"/>
+            <result property="discount" column="discount" jdbcType="DECIMAL"/>
     </resultMap>
 
     <sql id="Base_Column_List">
         newlist_id,name,code,
         price,order_number,zt,is_lock,
-        subscribe_time,subscription_time,type
+        subscribe_time,subscription_time,type,discount
     </sql>
 <!--    <select id="listByAdmin"  resultMap="BaseResultMap" parameterType="map">-->
 <!--        select-->
diff --git a/src/main/resources/mapper/UserPositionMapper.xml b/src/main/resources/mapper/UserPositionMapper.xml
index 67df1d3..6a99a68 100644
--- a/src/main/resources/mapper/UserPositionMapper.xml
+++ b/src/main/resources/mapper/UserPositionMapper.xml
@@ -38,6 +38,9 @@
       <arg column="stock_plate" jdbcType="VARCHAR" javaType="java.lang.String" />
       <arg column="spread_rate_price" jdbcType="DECIMAL" javaType="java.math.BigDecimal" />
       <arg column="margin_add" jdbcType="DECIMAL" javaType="java.math.BigDecimal" />
+      <arg column="status" jdbcType="INTEGER" javaType="java.lang.Integer" />
+      <arg column="lock_days" jdbcType="INTEGER" javaType="java.lang.Integer" />
+
     </constructor>
   </resultMap>
   <sql id="Base_Column_List" >
@@ -45,7 +48,7 @@
     stock_gid, stock_spell, buy_order_id, buy_order_time, buy_order_price, sell_order_id, 
     sell_order_time, sell_order_price, profit_target_price, stop_target_price, order_direction, 
     order_num, order_lever, order_total_price, order_fee, order_spread, order_stay_fee, 
-    order_stay_days, profit_and_lose, all_profit_and_lose,is_lock,lock_msg,stock_plate,spread_rate_price,margin_add,buy_order_id_index
+    order_stay_days, profit_and_lose, all_profit_and_lose,is_lock,lock_msg,stock_plate,spread_rate_price,margin_add,buy_order_id_index,status,lock_days
   </sql>
   <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
     select 
@@ -67,7 +70,7 @@
       order_direction, order_num, order_lever, 
       order_total_price, order_fee, order_spread, 
       order_stay_fee, order_stay_days, profit_and_lose, 
-      all_profit_and_lose, is_lock, lock_msg,stock_plate,spread_rate_price)
+      all_profit_and_lose, is_lock, lock_msg,stock_plate,spread_rate_price,status,lock_days)
     values (#{id,jdbcType=INTEGER}, #{positionType,jdbcType=INTEGER}, #{positionSn,jdbcType=VARCHAR}, 
       #{userId,jdbcType=INTEGER}, #{nickName,jdbcType=VARCHAR}, #{agentId,jdbcType=INTEGER}, 
       #{stockName,jdbcType=VARCHAR}, #{stockCode,jdbcType=VARCHAR}, #{stockGid,jdbcType=VARCHAR}, 
@@ -78,7 +81,7 @@
       #{orderTotalPrice,jdbcType=DECIMAL}, #{orderFee,jdbcType=DECIMAL}, #{orderSpread,jdbcType=DECIMAL}, 
       #{orderStayFee,jdbcType=DECIMAL}, #{orderStayDays,jdbcType=INTEGER}, #{profitAndLose,jdbcType=DECIMAL}, 
       #{allProfitAndLose,jdbcType=DECIMAL}, #{isLock,jdbcType=INTEGER}, #{lockMsg,jdbcType=VARCHAR},
-      #{stockPlate,jdbcType=VARCHAR},#{spreadRatePrice,jdbcType=DECIMAL}
+      #{stockPlate,jdbcType=VARCHAR},#{spreadRatePrice,jdbcType=DECIMAL}, #{status,jdbcType=INTEGER},#{lockDays,jdbcType=INTEGER}
       )
   </insert>
 
@@ -182,6 +185,12 @@
       <if test="spreadRatePrice != null" >
         spread_rate_price,
       </if>
+      <if test="status != null" >
+        status,
+      </if>
+      <if test="lockDays != null" >
+        lock_days,
+      </if>
 
     </trim>
     <trim prefix="values (" suffix=")" suffixOverrides="," >
@@ -282,6 +291,12 @@
       </if>
       <if test="spreadRatePrice != null" >
         #{spreadRatePrice,jdbcType=DECIMAL},
+      </if>
+      <if test="status != null" >
+        #{status,jdbcType=INTEGER},
+      </if>
+      <if test="lockDays != null" >
+        #{lockDays,jdbcType=INTEGER},
       </if>
 
     </trim>
@@ -386,6 +401,13 @@
       <if test="marginAdd != null" >
         margin_add = #{marginAdd,jdbcType=DECIMAL},
       </if>
+      <if test="status != null" >
+        status = #{status,jdbcType=INTEGER},
+      </if>
+      <if test="lockDays != null" >
+        lock_days = #{lockDays,jdbcType=INTEGER},
+      </if>
+
     </set>
     where id = #{id,jdbcType=INTEGER}
   </update>
@@ -423,7 +445,9 @@
       lock_msg = #{lockMsg,jdbcType=VARCHAR},
       stock_plate = #{stockPlate,jdbcType=VARCHAR},
       buy_order_id_index = #{buyOrderIdIndex,jdbcType=DECIMAL},
-      spread_rate_price = #{spreadRatePrice,jdbcType=DECIMAL}
+      spread_rate_price = #{spreadRatePrice,jdbcType=DECIMAL},
+      status = #{status,jdbcType=INTEGER},
+      lock_days = #{lockDays,jdbcType=INTEGER}
     where id = #{id,jdbcType=INTEGER}
   </update>
 
@@ -441,13 +465,8 @@
     FROM user_position
     <where>
       user_id = #{uid}
-      <if test="state != null ">
-        <if test="state == 0">
-          and sell_order_id is null
-        </if>
-        <if test="state == 1">
-          and sell_order_id is not null
-        </if>
+      <if test="state != null">
+        and status = #{state, jdbcType=INTEGER}
       </if>
       <if test="stockCode != null and stockCode != '' ">
         and stock_code like CONCAT('%','${stockCode}','%')
@@ -483,13 +502,8 @@
       <if test="searchId != null  ">
         and agent_id = #{searchId}
       </if>
-      <if test="state != null  ">
-        <if test="state == 0">
-          and sell_order_id is null
-        </if>
-        <if test="state == 1">
-          and sell_order_id is not null
-        </if>
+      <if test="state != null">
+        and status = #{state, jdbcType=INTEGER}
       </if>
       <if test="userId != null and userId != '' ">
         and user_id = #{userId}
@@ -597,8 +611,24 @@
     ORDER BY id ASC
     limit 1
   </select>
-
-
+  <select id="getDailyProfitByMonth" parameterType="map" resultType="java.util.Map">
+    SELECT
+      DATE_FORMAT(buy_order_time, '%Y-%m-%d') AS recordDate,
+      CAST(
+              SUM(
+                      (
+                        COALESCE (sell_order_price, 0) - COALESCE (buy_order_price, 0)
+                        ) * COALESCE (order_num, 1) - COALESCE (order_fee, 0) - COALESCE (order_spread, 0)
+              ) AS CHAR
+      ) AS profit
+    FROM
+      user_position
+    WHERE
+      DATE_FORMAT(buy_order_time, '%Y-%m') = #{yearMonth}
+      AND status = 2
+      AND user_id = #{userId}
+    GROUP BY DATE_FORMAT(buy_order_time, '%Y-%m-%d')
+  </select>
 
 </mapper>
 

--
Gitblit v1.9.3