puzhibing
2026-04-30 afbd8e340732c17a56693ad425dca59d8a0a8f37
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
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()));
        if(null != dto.getPushTimeList()){
            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;
    }
}