xuekang
2024-05-13 15a0280ae9e7db96fdf0744c722d214d2cb5a0e5
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
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
package com.nuvole.four.service.impl;
 
import com.nuvole.base.domain.SysUser;
import com.nuvole.four.contants.Contants;
import com.nuvole.four.domain.ChannelOrgConfig;
import com.nuvole.four.domain.dto.ChannelOrgConfigDetailDto;
import com.nuvole.four.domain.dto.ChannelOrgConfigDto;
import com.nuvole.four.domain.dto.ConfigOrgDetailChannel;
import com.nuvole.four.domain.params.ChannelOrgConfigParam;
import com.nuvole.four.mapper.ChannelOrgConfigMapper;
import com.nuvole.four.service.ChannelOrgConfigService;
import com.nuvole.four.util.SystemUtil;
import com.nuvole.util.IdGenerator;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import java.util.*;
 
/**
 * @Desc: 机构通道配置ServiceImpl
 * @Author: dqh
 * @Date: 2024-04-10
 **/
@Slf4j
@Service
public class ChannelOrgConfigServiceImpl implements ChannelOrgConfigService {
    @Autowired
    private ChannelOrgConfigMapper channelOrgConfigMapper;
    @Autowired
    private ChannelInfoServiceImpl channelInfoService;
    @Autowired
    private SysOrgServiceImpl sysOrgService;
    @Override
    public List<ChannelOrgConfig> getList(Map map) {
        return null;
    }
 
    @Override
    public List<ChannelOrgConfig> getList(ChannelOrgConfig channelOrgConfig) {
        return null;
    }
 
    @Override
    public List<Map> getListOfMap(Map map) {
        return null;
    }
 
    @Override
    public List<Map> getListOfMap(ChannelOrgConfig channelOrgConfig) {
        return null;
    }
 
    @Override
    public Integer save(ChannelOrgConfig channelOrgConfig) {
        return null;
    }
 
    @Override
    public Integer update(ChannelOrgConfig channelOrgConfig) {
        return null;
    }
 
    @Override
    public Integer del(Long id) {
        return null;
    }
 
    @Override
    public ChannelOrgConfig getById(Long id) {
        return null;
    }
 
    @Override
    public ChannelOrgConfig get(Long id) {
        return channelOrgConfigMapper.selectByPrimaryKey(id);
    }
 
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Integer configChannel(ChannelOrgConfigParam configParam) {
        Integer status = 0;
        ChannelOrgConfig dbIsExists = channelOrgConfigMapper.selectByOrgIdAndChannelId(configParam.getOrgId(),configParam.getChannelInfoId());
        if(dbIsExists == null){
            //不存在,进行新数据写入
            status = insertChannelConfig(configParam);
        }else{
            //参数校验
            ChannelOrgConfig updateConfig = checkParam(dbIsExists,configParam);
            //校验通过后,进行数据修改
            channelOrgConfigMapper.updateByPrimaryKeySelective(updateConfig);
        }
        return status;
    }
 
    /**
     * 机构通道配置数据写入
     */
    private Integer insertChannelConfig(ChannelOrgConfigParam configParam){
        ChannelOrgConfig channelOrgConfig = new ChannelOrgConfig();
        channelOrgConfig.setId(IdGenerator.getId());
        BeanUtils.copyProperties(configParam,channelOrgConfig);
        Date date = new Date();
        channelOrgConfig.setDefaultOrNot(0);
        channelOrgConfig.setCreateTime(date);
        channelOrgConfig.setUpdateTime(date);
        SysUser user = SystemUtil.getLoginUser(Contants.LOGIN_TYPE_PC);
        channelOrgConfig.setCreateBy(user.getId());
        channelOrgConfig.setUpdateBy(user.getId());
        channelOrgConfigMapper.insert(channelOrgConfig);
        return 1;
    }
 
    /**
     * 修改时参数逻辑校验
     * @param dbConfig  数据库已存在的数据
     * @param param     页面的请求数据
     */
    private ChannelOrgConfig checkParam(ChannelOrgConfig dbConfig,ChannelOrgConfigParam param){
        //dbConfig.defaultOrNot=1(默认通道)、param.status=0(禁用)时;返回错误描述
        if(param.getStatus() != null &&
                (dbConfig.getDefaultOrNot().equals(1) && param.getStatus().equals(0))){
            throw new IllegalArgumentException("当前为默认通道,不能禁用");
        }
        //dbConfig.status=0(禁用)、param.defaultOrNot=1(默认通道)时;返回错误描述
        if(param.getDefaultOrNot() != null &&
                (dbConfig.getStatus().equals(0) && param.getDefaultOrNot().equals(1))){
            throw new IllegalArgumentException("当前通道已被禁用,不能切换为默认");
        }
        //校验默认通道是否存在
        ChannelOrgConfig defaultChannelIsExists = channelOrgConfigMapper.queryDefaultChannelByOrgId(param.getOrgId());
        if(defaultChannelIsExists != null){
            /*
                param.defaultOrNot=1(默认通道)、且 请求的通道ID和数据库的默认通道ID不等时
                移除原有的默认通道,更新当前请求数据为默认通道
             */
            if(param.getDefaultOrNot() != null &&
                    (param.getDefaultOrNot().equals(1) && !defaultChannelIsExists.getChannelInfoId().equals(param.getChannelInfoId()))){
                ChannelOrgConfig config = new ChannelOrgConfig();
                config.setId(defaultChannelIsExists.getId());
                config.setDefaultOrNot(0);
                channelOrgConfigMapper.updateByPrimaryKeySelective(config);
            }
        }
        //校验通过;组装要入库的更新数据
        SysUser user = SystemUtil.getLoginUser(Contants.LOGIN_TYPE_PC);
        dbConfig.setUpdateBy(user.getId());
        dbConfig.setUpdateTime(new Date());
        dbConfig.setStatus(param.getStatus());
        dbConfig.setDefaultOrNot(param.getDefaultOrNot());
        return dbConfig;
    }
 
    /**
     * 查询机构通道配置列表
     * 仅包含当前orgId的下级,不包含(二三四级等)
     *
     * @param orgId 选择的机构ID
     * @param orgName   查询条件机构名称
     */
    @Override
    public List<ChannelOrgConfigDto> queryAllChannelOrg(Long orgId, String orgName) {
        return channelOrgConfigMapper.selectAllList(orgId,orgName);
    }
 
    /**
     * 方法描述: 查询机构通道详情
     * 详情中的通道 仅包含当前orgId对应的pId对应的通道
     * @date  2024-04-11 20:04
     **/
    @Override
    public ChannelOrgConfigDetailDto getChannelOrgConfigDetail(Long orgId) {
        // 查询当前机构、父级机构信息
        ChannelOrgConfigDetailDto dto = sysOrgService.queryNameAndParentName(orgId);
        if(dto == null){
            return dto;
        }
        if(dto.getLv() == null){
            throw new IllegalArgumentException("当前选择的机构层级为空");
        }
        List<ConfigOrgDetailChannel> channelList = null;
        switch (dto.getLv()) {
            case 0:
            case 1:
                // 如果机构层级=0、1(省市);查询所有通道
                channelList = channelOrgConfigMapper.selectAllAndChannelInfo(orgId);
                break;
            case 2:
            case 3:
                // 如果机构层级=2、3(县、支局);查询当前机构+父级机构 所有状态=1(开启)的通道
                channelList = getValidChannelsForOrg(orgId, dto.getPId());
                break;
            default:
                throw new IllegalArgumentException("机构层级无效");
        }
 
        dto.setChannelList(channelList);
        return dto;
    }
 
    /**
     * 方法描述: 查询当前机构+父级机构 所有状态=1(开启)的通道
     *
     * @date  2024-04-12 10:27
     **/
    private List<ConfigOrgDetailChannel> getValidChannelsForOrg(Long orgId, Long parentId) {
        List<ConfigOrgDetailChannel> orgConfigList = channelOrgConfigMapper.selectValidByCondition(orgId, parentId);
        Map<Long,ConfigOrgDetailChannel> map = new HashMap<>();
        orgConfigList.forEach(c -> {
            // 父级机构有,本级机构无的通道;设置数据为初始化状态
            if (!c.getOrgId().equals(orgId)) {
                c.setStatus(0);
                c.setDefaultOrNot(0);
            }
            /*
                本级机构有,父级也有的通道;则对父级的数据进行剔除。
                使用map特性,后者覆盖替换前者;
                其中后者=机构本身,前者=父级机构的通道
             */
            map.put(c.getChannelInfoId(),c);
        });
 
        return new ArrayList<>(map.values());
    }
}