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.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
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;
}
}