liusuyi
2026-05-06 99ab0d46d30b095d0e1c9d31349f42e0cefc9881
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
package com.ard.qs.service.impl;
 
import com.ard.common.core.utils.DateUtils;
import com.ard.qs.api.domain.QsRegion;
import com.ard.qs.domain.QsRegionTree;
import com.ard.qs.mapper.QsRegionMapper;
import com.ard.qs.service.IQsDeviceService;
import com.ard.qs.service.IQsRegionService;
import com.ard.qs.api.utils.CivilCodeUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils;
 
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
 
/**
 * 区域管理Service接口 实现类
 *
 * @FileName QsRegionServiceImpl
 * @Description
 * @Author fengcheng
 * @date 2026-04-13
 **/
@Slf4j
@Service
@Transactional(rollbackFor = Exception.class)
public class QsRegionServiceImpl implements IQsRegionService {
 
    @Autowired
    private QsRegionMapper qsRegionMapper;
    ;
 
    @Autowired
    private IQsDeviceService qsDeviceService;
 
    /**
     * 添加区域
     *
     * @param region 区域信息
     */
    @Override
    public void add(QsRegion region) {
        Assert.hasLength(region.getName(), "名称必须存在");
        Assert.hasLength(region.getDeviceId(), "国标编号必须存在");
        if (ObjectUtils.isEmpty(region.getParentDeviceId()) || ObjectUtils.isEmpty(region.getParentDeviceId().trim())) {
            region.setParentDeviceId(null);
        }
        region.setCreateTime(DateUtils.getNowDate());
 
        try {
            qsRegionMapper.add(region);
        } catch (DuplicateKeyException e) {
            throw new RuntimeException("此行政区划已存在");
        }
    }
 
    /**
     * 更新区域
     *
     * @param region 区域信息
     */
    @Override
    public void update(QsRegion region) {
        Assert.notNull(region.getDeviceId(), "编号不可为NULL");
        Assert.notNull(region.getName(), "名称不可为NULL");
        QsRegion regionInDb = qsRegionMapper.queryOne(region.getId());
        Assert.notNull(regionInDb, "待更新行政区划在数据库中不存在");
        region.setUpdateTime(DateUtils.getNowDate());
 
        if (!regionInDb.getDeviceId().equals(region.getDeviceId())) {
            QsRegion regionNewInDb = qsRegionMapper.queryByDeviceId(region.getDeviceId());
            Assert.isNull(regionNewInDb, "此行政区划已存在");
            // 编号发生变化,把分配了这个行政区划的设备全部更新,并发送数据
            qsDeviceService.updateCivilCode(regionInDb.getDeviceId(), region.getDeviceId());
            // 子节点信息更新
            qsRegionMapper.updateChild(region.getId(), region.getDeviceId());
        }
        qsRegionMapper.update(region);
    }
 
    /**
     * 删除区域
     *
     * @param id 区域ID
     * @return
     */
    @Override
    public boolean deleteByDeviceId(Integer id) {
        QsRegion region = qsRegionMapper.queryOne(id);
        // 获取所有子节点
        List<QsRegion> allChildren = getAllChildren(id);
        allChildren.add(region);
        // 设置使用这些节点的设备的civilCode为null,
        qsDeviceService.removeCivilCode(allChildren);
        qsRegionMapper.batchDelete(allChildren);
        return true;
    }
 
    /**
     * 查询区域节点
     *
     * @param parent    所属行政区划编号
     * @param hasDevice 是否查询设备
     * @return
     */
    @Override
    public List<QsRegionTree> queryForTree(Integer parent, Boolean hasDevice) {
        List<QsRegionTree> regionList = qsRegionMapper.queryForTree(parent);
        if (parent != null && hasDevice != null && hasDevice) {
            QsRegion parentRegion = qsRegionMapper.queryOne(parent);
            if (parentRegion != null) {
                List<QsRegionTree> channelList = qsDeviceService.queryForRegionTreeByCivilCode(parentRegion.getDeviceId());
                regionList.addAll(channelList);
            }
        }
        return regionList;
    }
 
    /**
     * 查询区域节点设备
     *
     * @return
     */
    @Override
    public List<QsRegionTree> queryForDevice() {
        return qsRegionMapper.queryForDevice();
    }
 
    /**
     * 查询区域
     *
     * @param query 要搜索的内容
     * @return
     */
    @Override
    public List<QsRegion> queryList(Integer pageNum, Integer pageSize, String query) {
        if (query != null) {
            query = query.replaceAll("/", "//")
                    .replaceAll("%", "/%")
                    .replaceAll("_", "/_");
        }
        return qsRegionMapper.query(query, null);
    }
 
    /**
     * 获取所属的行政区划下的行政区划
     *
     * @param parent 所属的行政区划
     * @return
     */
    @Override
    public List<QsRegion> getAllChild(String parent) {
        List<QsRegion> allChild = CivilCodeUtil.INSTANCE.getAllChild(parent);
        Collections.sort(allChild);
        return allChild;
    }
 
    /**
     * 获取所有子节点
     *
     * @param deviceId
     * @return
     */
    private List<QsRegion> getAllChildren(Integer deviceId) {
        if (deviceId == null) {
            return new ArrayList<>();
        }
        List<QsRegion> children = qsRegionMapper.getChildren(deviceId);
        if (ObjectUtils.isEmpty(children)) {
            return children;
        }
        List<QsRegion> regions = new ArrayList<>(children);
        for (QsRegion region : children) {
            if (region.getDeviceId().length() < 8) {
                regions.addAll(getAllChildren(region.getId()));
            }
        }
        return regions;
    }
}