package com.xiaopeng.operation.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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.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.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 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;
@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);
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);
// 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());
}
}
}