package com.xiaopeng.operation.service.impl; import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.xiaopeng.api.model.operation.XpTradingStrategy; import com.xiaopeng.api.model.operation.XpTradingStrategyCity; import com.xiaopeng.api.model.operation.XpTradingStrategyPush; import com.xiaopeng.common.core.exception.ServiceException; import com.xiaopeng.operation.dto.XpTradingStrategyEditDTO; import com.xiaopeng.operation.mapper.XpTradingStrategyMapper; import com.xiaopeng.operation.service.IXpTradingStrategyCityService; import com.xiaopeng.operation.service.IXpTradingStrategyPushService; import com.xiaopeng.operation.service.IXpTradingStrategyService; import com.xiaopeng.api.vo.operation.XpTradingStrategyDetailVO; import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.transaction.annotation.ShardingSphereTransactionType; import org.apache.shardingsphere.transaction.core.TransactionType; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.util.List; import java.util.Objects; /** *

* 交易策略配置 服务实现类 *

* * @author mitao * @since 2026-02-03 */ @Service @RequiredArgsConstructor(onConstructor_ = @Lazy) public class XpTradingStrategyServiceImpl extends ServiceImpl implements IXpTradingStrategyService { private final IXpTradingStrategyCityService tradingStrategyCityService; @Resource private IXpTradingStrategyPushService xpTradingStrategyPushService; @Override public XpTradingStrategyDetailVO queryDetail() { // 1. 查询交易策略主表(系统中只有一条配置,取第一条) XpTradingStrategy strategy = this.lambdaQuery() .orderByDesc(XpTradingStrategy::getId) .last("LIMIT 1") .one(); if (Objects.isNull(strategy)) { throw new ServiceException("交易策略配置不存在"); } // 2. 查询关联的城市列表 List cityList = tradingStrategyCityService.lambdaQuery() .eq(XpTradingStrategyCity::getStrategyId, strategy.getId()) .list(); // 3. 组装 VO XpTradingStrategyDetailVO vo = BeanUtil.copyProperties(strategy, XpTradingStrategyDetailVO.class); vo.setCityList(cityList); List tradingStrategyId = xpTradingStrategyPushService.list(new QueryWrapper() .eq("trading_strategy_id", strategy.getId()).orderByAsc("start_time")); vo.setTimePushStrategyList(tradingStrategyId); return vo; } @Override @Transactional @ShardingSphereTransactionType(TransactionType.BASE) public void editStrategy(XpTradingStrategyEditDTO dto) { // 1. 校验策略是否存在 XpTradingStrategy strategy = this.getById(dto.getId()); if (Objects.isNull(strategy)) { throw new ServiceException("交易策略配置不存在"); } // 2. 更新主表数据 XpTradingStrategy updateStrategy = BeanUtil.copyProperties(dto, XpTradingStrategy.class); this.updateById(updateStrategy); //更新分时段推单策略 xpTradingStrategyPushService.remove(new QueryWrapper().eq("trading_strategy_id", dto.getId())); if(null != dto.getPushTimeList()){ List pushTimeList = dto.getPushTimeList(); for (XpTradingStrategyPush xpTradingStrategyPush : pushTimeList) { xpTradingStrategyPush.setTradingStrategyId(dto.getId()); xpTradingStrategyPushService.save(xpTradingStrategyPush); } } // 3. 删除旧的城市关联 tradingStrategyCityService.remove( new LambdaQueryWrapper() .eq(XpTradingStrategyCity::getStrategyId, dto.getId()) ); // 4. 插入新的城市关联 if (!CollectionUtils.isEmpty(dto.getCityList())) { // 设置 strategyId dto.getCityList().forEach(city -> { city.setStrategyId(dto.getId()); city.setId(null); // 清空 ID,让数据库自动生成 }); tradingStrategyCityService.saveBatch(dto.getCityList()); } } /** * 根据开通城市获取交易策略 * @param cityCode * @return */ @Override public XpTradingStrategy getTradingStrategyByCityCode(String cityCode) { XpTradingStrategyCity one = tradingStrategyCityService.lambdaQuery() .eq(XpTradingStrategyCity::getCityCode, cityCode) .one(); if(Objects.isNull(one)){ return null; } XpTradingStrategy xpTradingStrategy = this.getById(one.getStrategyId()); return xpTradingStrategy; } }