package com.nq.controller.backend;
|
|
import cn.hutool.core.collection.CollectionUtil;
|
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.github.pagehelper.PageHelper;
|
import com.github.pagehelper.PageInfo;
|
import com.nq.common.ServerResponse;
|
import com.nq.dao.*;
|
import com.nq.enums.EConfigKey;
|
import com.nq.enums.EStockType;
|
import com.nq.enums.EUserAssets;
|
import com.nq.pojo.*;
|
import com.nq.service.*;
|
import com.nq.service.impl.IntradayOrderSerivceImpl;
|
import com.nq.service.impl.SmartIntradaySerivceImpl;
|
import com.nq.service.impl.UserPositionServiceImpl;
|
import com.nq.utils.ConverterUtil;
|
import com.nq.utils.KeyUtils;
|
import com.nq.utils.stock.GeneratePosition;
|
import com.nq.vo.smart.IntradayOrderVo;
|
import com.nq.vo.smart.SmartIntradayVo;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.stereotype.Controller;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMethod;
|
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.ResponseBody;
|
|
import javax.annotation.Resource;
|
import javax.servlet.http.HttpServletRequest;
|
import javax.validation.Valid;
|
import javax.validation.constraints.DecimalMin;
|
import javax.validation.constraints.NotBlank;
|
import javax.validation.constraints.NotNull;
|
import java.math.BigDecimal;
|
import java.util.Date;
|
import java.util.List;
|
|
/**
|
* @program: dabaogp
|
* @description: 智能日内
|
* @create: 2025-07-15 10:20
|
**/
|
@Controller
|
@RequestMapping({"/admin/smart/"})
|
public class SmartIntradayController {
|
|
@Autowired
|
private SmartIntradaySerivceImpl smartIntradaySerivce;
|
|
@Autowired
|
private IntradayOrderSerivceImpl intradayOrderSerivce;
|
|
@Autowired
|
private IntradayOrderMapper intradayOrderMapper;
|
|
@Autowired
|
private UserMapper userMapper;
|
|
@Autowired
|
private IUserAssetsServices iUserAssetsServices;
|
|
@Autowired
|
private UserAssetsMapper userAssetsMapper;
|
|
@Autowired
|
private StockMapper stockMapper;
|
|
@Autowired
|
private UserPositionMapper userPositionMapper;
|
@Autowired
|
IStockConfigServices iStockConfigServices;
|
|
/**
|
* 添加智能日内
|
* @param vo
|
* @return
|
*/
|
@RequestMapping(value = {"addSmart.do"}, method = {RequestMethod.POST})
|
@ResponseBody
|
public ServerResponse addSmart(@Valid SmartIntradayVo vo) {
|
long count = smartIntradaySerivce.count(new LambdaQueryWrapper<>(SmartIntraday.class)
|
.eq(SmartIntraday::getDepositName, vo.getDepositName())
|
.eq(SmartIntraday::getAccountType, vo.getAccountType())
|
.eq(SmartIntraday::getStockType, vo.getStockType())
|
);
|
if(count > 0){
|
return ServerResponse.createByErrorMsg("已存在同名产品");
|
}
|
SmartIntraday smartIntraday = ConverterUtil.convert(vo, SmartIntraday.class);
|
|
smartIntraday.setStockType(EStockType.JP.getCode());
|
smartIntraday.setAccountType(EStockType.JP.getCode());
|
smartIntradaySerivce.save(smartIntraday);
|
return ServerResponse.createBySuccessMsg("添加成功");
|
}
|
|
/**
|
* 修改智能日内
|
* @param vo
|
* @return
|
*/
|
@RequestMapping(value = {"updateSmart.do"}, method = {RequestMethod.POST})
|
@ResponseBody
|
public ServerResponse updateSmart(@Valid SmartIntradayVo vo) {
|
long count = smartIntradaySerivce.count(new LambdaQueryWrapper<>(SmartIntraday.class)
|
.eq(SmartIntraday::getDepositName, vo.getDepositName())
|
.eq(SmartIntraday::getAccountType, vo.getAccountType())
|
.eq(SmartIntraday::getStockType, vo.getStockType())
|
.ne(SmartIntraday::getId,vo.getId())
|
);
|
if(count > 0){
|
return ServerResponse.createByErrorMsg("已存在同名产品");
|
}
|
SmartIntraday smartIntraday = ConverterUtil.convert(vo, SmartIntraday.class);
|
smartIntradaySerivce.updateById(smartIntraday);
|
return ServerResponse.createBySuccessMsg("修改成功");
|
}
|
|
/**
|
* 智能日内列表
|
*/
|
@RequestMapping(value = {"listSmart.do"}, method = {RequestMethod.POST})
|
@ResponseBody
|
public ServerResponse listSmart(@RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
|
@RequestParam(value = "pageSize", defaultValue = "15") int pageSize,
|
@RequestParam(value = "status" , required = false) Integer status) {
|
// 创建分页对象
|
Page<SmartIntraday> page = Page.of(pageNum, pageSize);
|
// 创建查询条件
|
LambdaQueryWrapper<SmartIntraday> wrapper = new LambdaQueryWrapper<>();
|
|
// 状态查询
|
if (status != null) {
|
wrapper.eq(SmartIntraday::getStatus, status);
|
}
|
// 按创建时间倒序
|
wrapper.orderByDesc(SmartIntraday::getCreatedAt);
|
// 执行分页查询
|
Page<SmartIntraday> intradayPage = smartIntradaySerivce.page(page, wrapper);
|
return ServerResponse.createBySuccess(intradayPage);
|
}
|
|
/**
|
* 删除智能日内
|
* @return
|
*/
|
@RequestMapping(value = {"deleteSmart.do"}, method = {RequestMethod.POST})
|
@ResponseBody
|
public ServerResponse deleteSmart( @RequestParam("id") Integer id) {
|
smartIntradaySerivce.removeById(id);
|
return ServerResponse.createBySuccessMsg("删除成功");
|
}
|
|
|
|
/**
|
* 审核日内订单
|
* @param vo
|
* @return
|
*/
|
@RequestMapping(value = {"updateIntraday.do"}, method = {RequestMethod.POST})
|
@ResponseBody
|
@Transactional(rollbackFor = Exception.class) // 异常时回滚
|
public ServerResponse updateIntraday(@Valid IntradayOrderVo vo) {
|
IntradayOrder intradayOrder = intradayOrderSerivce.getById(vo.getId());
|
if(intradayOrder.getAuditStatus() != 0){
|
return ServerResponse.createByErrorMsg("订单已操作");
|
}
|
Stock stock = stockMapper.findStockByCode(vo.getStockCode());
|
if(ObjectUtil.isEmpty(stock)){
|
return ServerResponse.createByErrorMsg("选择的股票不存在!");
|
}
|
|
|
intradayOrder.setStockType(vo.getStockType());
|
intradayOrder.setStockCode(vo.getStockCode());
|
intradayOrder.setStockName(stock.getStockName());
|
intradayOrder.setStockGid(stock.getStockGid());
|
intradayOrder.setStockQuantity(vo.getStockQuantity());
|
intradayOrder.setPriceType(vo.getPriceType());
|
intradayOrder.setStockPrice(new BigDecimal(vo.getStockPrice()));
|
intradayOrder.setAuditStatus(vo.getAuditStatus());
|
intradayOrder.setOrderTime(DateUtil.parse(vo.getOrderTime(),"yyyy-MM-dd HH:mm:ss"));
|
intradayOrder.setIsLocked(vo.getIsLocked());
|
intradayOrder.setStockId(stock.getId());
|
|
// 手续费率
|
BigDecimal siteSettingBuyFee = new BigDecimal(iStockConfigServices.queryByKey(EConfigKey.BUY_HANDLING_CHARGE.getCode()).getCValue()) ;
|
|
if(vo.getAuditStatus() == 2){
|
UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(EStockType.JP.getCode(), intradayOrder.getUserId());
|
BigDecimal orderAmount = vo.getOrderAmount();
|
userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(orderAmount));
|
userAssetsMapper.updateById(userAssets);
|
return ServerResponse.createBySuccessMsg("操作成功");
|
}
|
BigDecimal stockQuantity = new BigDecimal(intradayOrder.getStockQuantity());//股票数量
|
BigDecimal orderTotalPrice = intradayOrder.getStockPrice().multiply(stockQuantity);//订单总价
|
|
//手续费
|
BigDecimal orderFree = siteSettingBuyFee.multiply(orderTotalPrice);
|
BigDecimal totalPrice = orderFree.add(orderTotalPrice);
|
|
if(intradayOrder.getOrderAmount().compareTo(totalPrice) < 0){
|
return ServerResponse.createByErrorMsg("股票总价超过订单金额!");
|
}
|
|
|
User user = userMapper.selectById(intradayOrder.getUserId());
|
|
//结余资金返还账户
|
BigDecimal surplusAmount = intradayOrder.getOrderAmount().subtract(totalPrice);//结余
|
UserPosition userPosition = new UserPosition();
|
userPosition.setProfitTargetPrice(BigDecimal.ZERO);
|
userPosition.setStopTargetPrice(BigDecimal.ZERO);
|
userPosition.setPositionType(user.getAccountType());
|
userPosition.setPositionSn(KeyUtils.getUniqueKey());
|
userPosition.setUserId(intradayOrder.getUserId());
|
userPosition.setNickName(user.getRealName());
|
userPosition.setAgentId(user.getAgentId());
|
userPosition.setStockCode(stock.getStockCode());
|
userPosition.setStockName(stock.getStockName());
|
userPosition.setStockGid(stock.getStockType());
|
userPosition.setStockSpell(stock.getStockSpell());
|
userPosition.setBuyOrderId(GeneratePosition.getPositionId());
|
userPosition.setBuyOrderTime(new Date());
|
userPosition.setBuyOrderPrice(intradayOrder.getStockPrice());
|
userPosition.setOrderDirection((intradayOrder.getPriceType() == 1) ? "买涨" : "买跌");
|
userPosition.setOrderNum(intradayOrder.getStockQuantity());
|
if (stock.getStockPlate() != null) {
|
userPosition.setStockPlate(stock.getStockPlate());
|
}
|
userPosition.setIsLock(intradayOrder.getIsLocked());
|
userPosition.setOrderLever(1);
|
userPosition.setOrderTotalPrice(orderTotalPrice);
|
// 手续费
|
userPosition.setOrderFee(orderFree);
|
userPosition.setOrderSpread(BigDecimal.ZERO);
|
userPosition.setSpreadRatePrice(BigDecimal.ZERO);
|
BigDecimal profit_and_lose = new BigDecimal("0");
|
userPosition.setProfitAndLose(profit_and_lose);
|
userPosition.setAllProfitAndLose(profit_and_lose.add(BigDecimal.ZERO));
|
userPosition.setOrderStayDays(Integer.valueOf(0));
|
userPosition.setOrderStayFee(BigDecimal.ZERO);
|
userPositionMapper.insert(userPosition);
|
|
UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId(EStockType.JP.getCode(), intradayOrder.getUserId());
|
userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(surplusAmount));
|
userAssets.setFreezeMoney(userPosition.getOrderTotalPrice());
|
userAssetsMapper.updateById(userAssets);
|
intradayOrder.setPositionOrder(userPosition.getId());
|
intradayOrder.setPurchaseAmount(totalPrice);
|
intradayOrderMapper.updateById(intradayOrder);
|
return ServerResponse.createBySuccessMsg("操作成功");
|
}
|
|
/**
|
* 智能日内订单列表
|
*/
|
@RequestMapping(value = {"listIntraday.do"}, method = {RequestMethod.POST})
|
@ResponseBody
|
public ServerResponse listIntraday(@RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
|
@RequestParam(value = "pageSize", defaultValue = "15") int pageSize,
|
@RequestParam(value = "userId" , required = false) Integer userId,
|
@RequestParam(value = "phone" , required = false) String phone,
|
@RequestParam(value = "stockName" , required = false) String stockName,
|
@RequestParam(value = "stockGid" , required = false) String stockGid,
|
@RequestParam(value = "status" , required = false) Integer status
|
|
) {
|
// 执行分页查询
|
PageHelper.startPage(pageNum, pageSize);
|
List<IntradayOrder> intradayOrderList = intradayOrderMapper.conditionQuery(userId,phone,stockName,stockGid,status);
|
PageInfo<IntradayOrder> pageInfo = new PageInfo<>(intradayOrderList);
|
return ServerResponse.createBySuccess(pageInfo);
|
}
|
|
/**
|
* 删除日内订单
|
* @return
|
*/
|
@RequestMapping(value = {"deleteIntraday.do"}, method = {RequestMethod.POST})
|
@ResponseBody
|
public ServerResponse deleteIntraday( @RequestParam("id") Integer id) {
|
intradayOrderSerivce.removeById(id);
|
return ServerResponse.createBySuccessMsg("删除成功");
|
}
|
|
/**
|
* 根据条件查询所有股票
|
*/
|
@RequestMapping(value = {"getStockByKeyWords.do"}, method = {RequestMethod.POST})
|
@ResponseBody
|
public ServerResponse updateIntraday(@RequestParam("keyWords") String keyWords) {
|
Stock stock = stockMapper.selectOne(new LambdaQueryWrapper<>(Stock.class)
|
.eq(Stock::getStockCode, keyWords).last(" limit 1"));
|
if(ObjectUtil.isEmpty(stock)){
|
return ServerResponse.createBySuccessMsg("股票不存在");
|
}
|
return ServerResponse.createBySuccess(stock);
|
}
|
|
}
|