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;
|
|
/**
|
* <p>
|
* 交易策略配置 服务实现类
|
* </p>
|
*
|
* @author mitao
|
* @since 2026-02-03
|
*/
|
@Service
|
@RequiredArgsConstructor
|
public class XpTradingStrategyServiceImpl extends ServiceImpl<XpTradingStrategyMapper, XpTradingStrategy> 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<XpTradingStrategyCity> cityList = tradingStrategyCityService.lambdaQuery()
|
.eq(XpTradingStrategyCity::getStrategyId, strategy.getId())
|
.list();
|
|
// 3. 组装 VO
|
XpTradingStrategyDetailVO vo = BeanUtil.copyProperties(strategy, XpTradingStrategyDetailVO.class);
|
vo.setCityList(cityList);
|
List<XpTradingStrategyPush> tradingStrategyId = xpTradingStrategyPushService.list(new QueryWrapper<XpTradingStrategyPush>().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<XpTradingStrategyPush>().eq("trading_strategy_id", dto.getId()));
|
List<XpTradingStrategyPush> pushTimeList = dto.getPushTimeList();
|
for (XpTradingStrategyPush xpTradingStrategyPush : pushTimeList) {
|
xpTradingStrategyPush.setTradingStrategyId(dto.getId());
|
xpTradingStrategyPushService.save(xpTradingStrategyPush);
|
}
|
|
// 3. 删除旧的城市关联
|
tradingStrategyCityService.remove(
|
new LambdaQueryWrapper<XpTradingStrategyCity>()
|
.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;
|
}
|
}
|