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.operation.vo.XpTradingStrategyDetailVO; import lombok.RequiredArgsConstructor; 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(rollbackFor = Exception.class) 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()); } } }