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 page = Page.of(pageNum, pageSize); // 创建查询条件 LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); // 状态查询 if (status != null) { wrapper.eq(SmartIntraday::getStatus, status); } // 按创建时间倒序 wrapper.orderByDesc(SmartIntraday::getCreatedAt); // 执行分页查询 Page 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 intradayOrderList = intradayOrderMapper.conditionQuery(userId,phone,stockName,stockGid,status); PageInfo 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); } }