WeEmpleCodeServiceImpl.java 16.0 KB
Newer Older
1 2 3
package com.linkwechat.wecom.service.impl;

import cn.hutool.core.collection.CollectionUtil;
fix  
孙喜旺 已提交
4
import com.alibaba.fastjson.JSONObject;
5
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
6
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
7
import com.linkwechat.common.constant.WeConstans;
8
import com.linkwechat.common.core.redis.RedisCache;
9
import com.linkwechat.common.exception.wecom.WeComException;
10
import com.linkwechat.common.utils.SecurityUtils;
S
sunxiwang 已提交
11
import com.linkwechat.common.utils.SnowFlakeUtil;
12
import com.linkwechat.common.utils.StringUtils;
13
import com.linkwechat.wecom.client.WeExternalContactClient;
S
sunxiwang 已提交
14
import com.linkwechat.wecom.domain.WeEmpleCode;
孙喜旺 已提交
15
import com.linkwechat.wecom.domain.WeEmpleCodeTag;
16
import com.linkwechat.wecom.domain.WeEmpleCodeUseScop;
17
import com.linkwechat.wecom.domain.WeMaterial;
18
import com.linkwechat.wecom.domain.dto.WeEmpleCodeDto;
19
import com.linkwechat.wecom.domain.dto.WeExternalContactDto;
Y
Bugfix  
YaoYuHang 已提交
20
import com.linkwechat.wecom.mapper.WeCommunityNewGroupMapper;
S
sunxiwang 已提交
21
import com.linkwechat.wecom.mapper.WeEmpleCodeMapper;
22 23
import com.linkwechat.wecom.mapper.WeEmpleCodeTagMapper;
import com.linkwechat.wecom.mapper.WeEmpleCodeUseScopMapper;
S
sunxiwang 已提交
24
import com.linkwechat.wecom.service.IWeEmpleCodeService;
25 26
import com.linkwechat.wecom.service.IWeEmpleCodeTagService;
import com.linkwechat.wecom.service.IWeEmpleCodeUseScopService;
27
import com.linkwechat.wecom.service.IWeMaterialService;
fix  
孙喜旺 已提交
28
import lombok.extern.slf4j.Slf4j;
29 30 31 32
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

S
sunxiwang 已提交
33
import java.util.*;
34
import java.util.concurrent.TimeUnit;
35
import java.util.stream.Collectors;
S
sunxiwang 已提交
36

37 38
/**
 * 员工活码Service业务层处理
S
sunxiwang 已提交
39
 *
40 41 42
 * @author ruoyi
 * @date 2020-10-04
 */
fix  
孙喜旺 已提交
43
@Slf4j
44
@Service
S
sunxiwang 已提交
45
public class WeEmpleCodeServiceImpl extends ServiceImpl<WeEmpleCodeMapper, WeEmpleCode> implements IWeEmpleCodeService {
46 47 48 49 50 51 52 53 54

    @Autowired
    private IWeEmpleCodeTagService weEmpleCodeTagService;


    @Autowired
    private IWeEmpleCodeUseScopService iWeEmpleCodeUseScopService;


S
fix  
sxw 已提交
55 56
    @Autowired
    private WeExternalContactClient weExternalContactClient;
57

58 59 60
    @Autowired
    private IWeMaterialService materialService;

61 62 63
    @Autowired
    private RedisCache redisCache;

64
    @Autowired
Y
Bugfix  
YaoYuHang 已提交
65
    private WeCommunityNewGroupMapper communityNewGroupMapper;
66

S
sunxiwang 已提交
67 68 69 70 71 72 73 74
    /**
     * 查询员工活码
     *
     * @param id 员工活码ID
     * @return 员工活码
     */
    @Override
    public WeEmpleCode selectWeEmpleCodeById(Long id) {
75 76 77 78 79 80 81 82 83
        WeEmpleCode weEmpleCode = this.baseMapper.selectWeEmpleCodeById(id);
        //查询活码详情中素材信息
        Optional.ofNullable(weEmpleCode).map(WeEmpleCode::getMediaId).ifPresent(mediaId -> {
            WeMaterial weMaterialInfo = materialService.findWeMaterialById(mediaId);
            if (weMaterialInfo != null) {
                weEmpleCode.setWeMaterial(weMaterialInfo);
            }
        });
        return weEmpleCode;
S
sunxiwang 已提交
84
    }
85

S
sunxiwang 已提交
86 87 88 89 90 91
    @Override
    public List<WeEmpleCode> selectWeEmpleCodeByIds(List<String> ids) {
        List<WeEmpleCode> weEmpleCodeList = this.baseMapper.selectWeEmpleCodeByIds(ids);
        if (weEmpleCodeList != null) {
            weEmpleCodeList.forEach(empleCode -> {
                List<WeEmpleCodeUseScop> weEmpleCodeUseScopList = empleCode.getWeEmpleCodeUseScops();
孙喜旺 已提交
92
                setUserData(empleCode, weEmpleCodeUseScopList);
S
sunxiwang 已提交
93 94 95 96 97
            });
        }
        return weEmpleCodeList;
    }

孙喜旺 已提交
98 99 100 101 102 103 104 105 106 107 108
    private void setUserData(WeEmpleCode empleCode, List<WeEmpleCodeUseScop> weEmpleCodeUseScopList) {
        if (CollectionUtil.isNotEmpty(weEmpleCodeUseScopList)) {
            String useUserName = weEmpleCodeUseScopList.stream().map(WeEmpleCodeUseScop::getBusinessName)
                    .filter(StringUtils::isNotEmpty).collect(Collectors.joining(","));
            empleCode.setUseUserName(useUserName);
            String mobile = weEmpleCodeUseScopList.stream().map(WeEmpleCodeUseScop::getMobile)
                    .filter(StringUtils::isNotEmpty).collect(Collectors.joining(","));
            empleCode.setMobile(mobile);
        }
    }

109 110
    /**
     * 查询员工活码列表
111
     *
112 113 114 115
     * @param weEmpleCode 员工活码
     * @return 员工活码
     */
    @Override
S
sunxiwang 已提交
116
    public List<WeEmpleCode> selectWeEmpleCodeList(WeEmpleCode weEmpleCode) {
水库浪子 已提交
117

118
        List<WeEmpleCode> weEmpleCodeList = this.baseMapper.selectWeEmpleCodeList(weEmpleCode);
水库浪子 已提交
119
        if (CollectionUtil.isNotEmpty(weEmpleCodeList)) {
孙喜旺 已提交
120 121 122
            List<Long> empleCodeIdList = weEmpleCodeList.stream().map(WeEmpleCode::getId).collect(Collectors.toList());
            List<WeEmpleCodeUseScop> useScopList = iWeEmpleCodeUseScopService.selectWeEmpleCodeUseScopListByIds(empleCodeIdList);
            List<WeEmpleCodeTag> tagList = weEmpleCodeTagService.selectWeEmpleCodeTagListByIds(empleCodeIdList);
123
            weEmpleCodeList.forEach(empleCode -> {
孙喜旺 已提交
124 125 126 127 128 129 130 131
                //活码使用人对象
                List<WeEmpleCodeUseScop> weEmpleCodeUseScopList = useScopList.stream()
                        .filter(useScop -> useScop.getEmpleCodeId().equals(empleCode.getId())).collect(Collectors.toList());
                setUserData(empleCode, weEmpleCodeUseScopList);
                empleCode.setWeEmpleCodeUseScops(weEmpleCodeUseScopList);
                //员工活码标签对象
                empleCode.setWeEmpleCodeTags(tagList.stream()
                        .filter(tag -> tag.getEmpleCodeId().equals(empleCode.getId())).collect(Collectors.toList()));
132 133 134
            });
        }
        return weEmpleCodeList;
135 136 137 138
    }

    /**
     * 新增员工活码
S
sunxiwang 已提交
139
     *
140 141 142 143
     * @param weEmpleCode 员工活码
     * @return 结果
     */
    @Override
144
    @Transactional(rollbackFor = Exception.class)
S
sunxiwang 已提交
145
    public void insertWeEmpleCode(WeEmpleCode weEmpleCode) {
146 147
        weEmpleCode.setCreateTime(new Date());
        weEmpleCode.setCreateBy(SecurityUtils.getUsername());
148 149
        // 使用员工活码的id作为state
        weEmpleCode.setState(weEmpleCode.getId().toString());
150
        addWeEmplCode(weEmpleCode);
151 152 153 154
    }

    /**
     * 修改员工活码
S
sunxiwang 已提交
155
     *
156 157 158 159
     * @param weEmpleCode 员工活码
     * @return 结果
     */
    @Override
160
    @Transactional(rollbackFor = Exception.class)
S
sunxiwang 已提交
161 162 163 164 165 166 167
    public void updateWeEmpleCode(WeEmpleCode weEmpleCode) {
        WeExternalContactDto.WeContactWay weContactWay = getWeContactWay(weEmpleCode);
        try {
            weExternalContactClient.updateContactWay(weContactWay);
        } catch (Exception e) {
            e.printStackTrace();
        }
168
        if (this.baseMapper.updateWeEmpleCode(weEmpleCode) == 1) {
S
sunxiwang 已提交
169
            if (CollectionUtil.isNotEmpty(weEmpleCode.getWeEmpleCodeUseScops())) {
S
fix  
sunxiwang 已提交
170
                weEmpleCode.getWeEmpleCodeUseScops().forEach(item -> item.setEmpleCodeId(weEmpleCode.getId()));
S
sunxiwang 已提交
171 172 173
                iWeEmpleCodeUseScopService.updateBatchById(weEmpleCode.getWeEmpleCodeUseScops());
            }
            if (CollectionUtil.isNotEmpty(weEmpleCode.getWeEmpleCodeTags())) {
S
fix  
sunxiwang 已提交
174
                weEmpleCode.getWeEmpleCodeTags().forEach(item -> item.setEmpleCodeId(weEmpleCode.getId()));
S
sunxiwang 已提交
175
                weEmpleCodeTagService.updateBatchById(weEmpleCode.getWeEmpleCodeTags());
176 177 178 179
            }
        }
    }

180 181 182 183 184 185 186 187 188 189 190 191
//    /**
//     * 批量删除员工活码
//     *
//     * @param ids 需要删除的员工活码ID
//     * @return 结果
//     */
//    @Override
//    public int deleteWeEmpleCodeByIds(Long[] ids)
//    {
//        return weEmpleCodeMapper.deleteWeEmpleCodeByIds(ids);
//    }
//
S
sunxiwang 已提交
192 193 194 195 196 197 198 199

    /**
     * 删除员工活码信息
     *
     * @param id 员工活码ID
     * @return 结果
     */
    @Override
200
    @Transactional(rollbackFor = Exception.class)
S
sunxiwang 已提交
201 202 203 204 205
    public int deleteWeEmpleCodeById(Long id) {
        WeEmpleCode weEmpleCode = getById(id);
        if (weEmpleCode != null && weEmpleCode.getConfigId() != null) {
            weExternalContactClient.delContactWay(weEmpleCode.getConfigId());
        }
Y
Bugfix  
YaoYuHang 已提交
206 207 208
        // 删除对应的新科拉群信息
        communityNewGroupMapper.removeWeCommunityNewGroupByEmplCodeId(id);
        // 删除员工活码
209
        return this.baseMapper.deleteWeEmpleCodeById(id);
S
sunxiwang 已提交
210 211 212 213 214 215 216 217 218 219
    }


    /**
     * 批量逻辑删除员工活码
     *
     * @param ids 需要删除的数据ID
     * @return 结果
     */
    @Override
220
    @Transactional(rollbackFor = Exception.class)
S
sunxiwang 已提交
221
    public int batchRemoveWeEmpleCodeIds(List<String> ids) {
222
        return this.baseMapper.batchRemoveWeEmpleCodeIds(ids);
S
sunxiwang 已提交
223 224
    }

225
    @Override
226 227 228 229 230 231 232 233 234 235 236 237
    public WeEmpleCodeDto selectWelcomeMsgByScenario(String scenario, String userId) {
        return this.baseMapper.selectWelcomeMsgByScenario(scenario, userId);
    }

    /**
     * 通过state定位员工活码
     * @param state state
     * @return 员工活码
     */
    @Override
    public WeEmpleCodeDto selectWelcomeMsgByState(String state) {
        return this.baseMapper.selectWelcomeMsgByState(state);
238 239
    }

S
sunxiwang 已提交
240 241 242 243 244 245
    /**
     * 批量新增员工活码
     *
     * @param weEmpleCode 员工信息
     * @return 结果
     */
246 247
    @Override
    @Transactional(rollbackFor = Exception.class)
S
sunxiwang 已提交
248 249 250 251
    public void insertWeEmpleCodeBatch(WeEmpleCode weEmpleCode) {
        weEmpleCode.setCreateTime(new Date());
        weEmpleCode.setCreateBy(SecurityUtils.getUsername());
        weEmpleCode.setCodeType(WeConstans.SINGLE_EMPLE_CODE_TYPE);
252
        weEmpleCode.setSkipVerify(Optional.ofNullable(weEmpleCode.getSkipVerify())
S
sunxiwang 已提交
253 254
                .orElse(WeConstans.IS_JOIN_CONFIR_MFRIENDS));

255
        weEmpleCode.setScenario(Optional.ofNullable(weEmpleCode.getScenario())
S
sunxiwang 已提交
256 257 258 259
                .orElse(WeConstans.ONE_PERSON_CODE_GENERATED_BATCH));

        Optional.ofNullable(weEmpleCode).map(WeEmpleCode::getWeEmpleCodeUseScops)
                .orElseGet(ArrayList::new).forEach(useScops -> {
260 261 262 263
            //机构类型数据返回不执行生成二维码业务
            if (WeConstans.USE_SCOP_BUSINESSID_TYPE_ORG.equals(useScops.getBusinessIdType())) {
                return;
            }
S
sunxiwang 已提交
264
            weEmpleCode.setId(SnowFlakeUtil.nextId());
265
            weEmpleCode.setState(weEmpleCode.getId().toString());
266 267 268 269 270 271 272
            List<WeEmpleCodeUseScop> weEmpleCodeUseScopList = new ArrayList<>();
            weEmpleCodeUseScopList.add(useScops);
            weEmpleCode.setWeEmpleCodeUseScops(weEmpleCodeUseScopList);
            addWeEmplCode(weEmpleCode);
        });
    }

S
sunxiwang 已提交
273 274 275 276 277 278 279
    @Override
    public WeExternalContactDto getQrcode(String userIds, String departmentIds) {
        String[] userIdArr = Arrays.stream(userIds.split(","))
                .filter(StringUtils::isNotEmpty).toArray(String[]::new);
        Long[] departmentIdArr = Arrays.stream(departmentIds.split(","))
                .filter(StringUtils::isNotEmpty)
                .map(Long::new).toArray(Long[]::new);
280 281
        WeExternalContactDto qrcode = getQrcode(userIdArr, departmentIdArr);
        //设置24小时过期
fix  
孙喜旺 已提交
282
        log.info("qrcode:>>>>>>>>>>>【{}】", JSONObject.toJSONString(qrcode));
fix  
孙喜旺 已提交
283 284 285
        if(qrcode !=null && qrcode.getConfig_id() != null){
            redisCache.setCacheObject(WeConstans.WE_EMPLE_CODE_KEY+":"+qrcode.getConfig_id(),qrcode.getConfig_id(),24, TimeUnit.HOURS);
        }
286
        return qrcode;
S
sunxiwang 已提交
287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303
    }

    @Override
    public WeExternalContactDto getQrcode(String[] userIdArr, Long[] departmentIdArr) {
        WeExternalContactDto.WeContactWay weContactWay = new WeExternalContactDto.WeContactWay();
        //当存在部门id或者用户id大于一个的情况为多人二维码
        if (departmentIdArr.length > 0 || userIdArr.length > 1) {
            weContactWay.setType(WeConstans.MANY_EMPLE_CODE_TYPE);
        } else {
            weContactWay.setType(WeConstans.SINGLE_EMPLE_CODE_TYPE);
        }
        weContactWay.setScene(WeConstans.QR_CODE_EMPLE_CODE_SCENE);
        weContactWay.setUser(userIdArr);
        weContactWay.setParty(departmentIdArr);
        return getQrCode(weContactWay);
    }

孙喜旺 已提交
304 305 306 307 308 309 310 311 312 313
    /**
     * 通过成员id 获取去成员活码
     * @param userId 成员id
     * @return
     */
    @Override
    public WeEmpleCode getQrcodeByUserId(String userId) {
        return this.baseMapper.getQrcodeByUserId(userId);
    }

314 315 316 317 318
    /**
     * 新增员工活码
     *
     * @param weEmpleCode
     */
S
sunxiwang 已提交
319 320
    private void addWeEmplCode(WeEmpleCode weEmpleCode) {
        /*List<WeEmpleCodeUseScop> weEmpleCodeUseScops = weEmpleCode.getWeEmpleCodeUseScops();
321 322 323
        List<String> businessIdList = Optional.ofNullable(weEmpleCodeUseScops).orElseGet(ArrayList::new)
                .stream().map(WeEmpleCodeUseScop::getBusinessId)
                .collect(Collectors.toList());
S
sunxiwang 已提交
324

325
        List<WeEmpleCodeUseScop> weEmpleCodeUseScopList = iWeEmpleCodeUseScopService.listByIds(businessIdList);
S
sunxiwang 已提交
326
        if (CollectionUtil.isNotEmpty(weEmpleCodeUseScopList)) {
327
            throw new WeComException("该员工或部门已经创建,无法重复创建");
S
sunxiwang 已提交
328
        }*/
329
        WeExternalContactDto.WeContactWay weContactWay = getWeContactWay(weEmpleCode);
S
sunxiwang 已提交
330 331 332 333
        WeExternalContactDto qrCode = getQrCode(weContactWay);
        if (qrCode != null) {
            weEmpleCode.setConfigId(qrCode.getConfig_id());
            weEmpleCode.setQrCode(qrCode.getQr_code());
334 335 336 337 338 339 340 341 342 343 344
        }
        if (this.baseMapper.insertWeEmpleCode(weEmpleCode) == 1) {
            if (CollectionUtil.isNotEmpty(weEmpleCode.getWeEmpleCodeUseScops())) {
                weEmpleCode.getWeEmpleCodeUseScops().forEach(item -> item.setEmpleCodeId(weEmpleCode.getId()));
                iWeEmpleCodeUseScopService.saveBatch(weEmpleCode.getWeEmpleCodeUseScops());
            }
            if (CollectionUtil.isNotEmpty(weEmpleCode.getWeEmpleCodeTags())) {
                weEmpleCode.getWeEmpleCodeTags().forEach(item -> item.setEmpleCodeId(weEmpleCode.getId()));
                weEmpleCodeTagService.saveBatch(weEmpleCode.getWeEmpleCodeTags());
            }
        }
345 346
    }

S
sunxiwang 已提交
347 348 349 350 351 352
    /**
     * 获取二维码
     *
     * @param weContactWay
     * @return
     */
浪涛飞 已提交
353
    public WeExternalContactDto getQrCode(WeExternalContactDto.WeContactWay weContactWay) {
S
sunxiwang 已提交
354 355 356 357 358 359 360 361 362 363 364 365 366
        try {
            return weExternalContactClient.addContactWay(weContactWay);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 企微接口参数生成方法
     * @param weEmpleCode 员工活码实体类
     * @return 企微接口参数实体类
     */
浪涛飞 已提交
367
    public WeExternalContactDto.WeContactWay getWeContactWay(WeEmpleCode weEmpleCode) {
S
sunxiwang 已提交
368 369
        WeExternalContactDto.WeContactWay weContactWay = new WeExternalContactDto.WeContactWay();
        List<WeEmpleCodeUseScop> weEmpleCodeUseScops = weEmpleCode.getWeEmpleCodeUseScops();
S
sunxiwang 已提交
370
        //根据类型生成相应的活码
S
sunxiwang 已提交
371 372
        weContactWay.setConfig_id(weEmpleCode.getConfigId());
        weContactWay.setType(weEmpleCode.getCodeType());
S
sunxiwang 已提交
373
        weContactWay.setScene(WeConstans.QR_CODE_EMPLE_CODE_SCENE);
374 375
        weContactWay.setSkip_verify(weEmpleCode.getSkipVerify());
        weContactWay.setState(weEmpleCode.getState());
S
sunxiwang 已提交
376
        if (CollectionUtil.isNotEmpty(weEmpleCodeUseScops)) {
S
sunxiwang 已提交
377 378 379 380
            //员工列表
            String[] userIdArr = weEmpleCodeUseScops.stream().filter(itme ->
                    WeConstans.USE_SCOP_BUSINESSID_TYPE_USER.equals(itme.getBusinessIdType())
                            && StringUtils.isNotEmpty(itme.getBusinessId()))
S
sunxiwang 已提交
381 382
                    .map(WeEmpleCodeUseScop::getBusinessId).toArray(String[]::new);
            weContactWay.setUser(userIdArr);
S
sunxiwang 已提交
383
            //部门列表
384
            if (!WeConstans.SINGLE_EMPLE_CODE_TYPE.equals(weEmpleCode.getCodeType())) {
S
sunxiwang 已提交
385 386 387
                Long[] partyArr = weEmpleCodeUseScops.stream().filter(itme ->
                        WeConstans.USE_SCOP_BUSINESSID_TYPE_ORG.equals(itme.getBusinessIdType())
                                && StringUtils.isNotEmpty(itme.getBusinessId()))
388 389 390 391
                        .map(item -> Long.valueOf(item.getBusinessId())).collect(Collectors.toList()).toArray(new Long[]{});
                weContactWay.setParty(partyArr);
            }

S
sunxiwang 已提交
392 393 394
        }
        return weContactWay;
    }
395 396 397 398 399 400 401 402 403 404

    /**
     * 递增扫码次数
     *
     * @param state state
     */
    @Override
    public void updateScanTimesByState(String state) {
        this.baseMapper.updateScanTimesByState(state);
    }
405
}