xieb
2023-09-05 a909fc1f03486df2b03a68b847d3e73e9986415d
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
package cn.gistack.system.user.sync.controller;
 
import cn.gistack.system.user.entity.User;
import cn.gistack.system.user.service.IUserService;
import cn.gistack.system.user.sync.dto.AccountBean;
import cn.gistack.system.user.sync.dto.ApiPushDTO;
import cn.gistack.system.user.sync.exception.ErrorCode;
import cn.gistack.system.user.sync.util.*;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import lombok.AllArgsConstructor;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.tenant.annotation.NonDS;
import org.springframework.scheduling.annotation.Async;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.*;
 
/**
 * @PROJECT_NAME: skjcmanager
 * @DESCRIPTION: 统一登陆平台用户同步
 * @USER: aix
 * @DATE: 2023/8/7 16:48
 */
@NonDS
@RestController
@RequestMapping("/sync")
@AllArgsConstructor
public class UserPushController {
 
    private final IUserService userService;
 
    private final static String appId = "46a23e7c5fe54f46a37848dc740dc001";
 
    private final static String appSecret = "AxVGmJcsfxEx36zptmr8J+sv7MAhL1mUuwrk4woGUrM=";
 
    private final static String method = "post";
 
    @PostMapping("/userpush")
    public Object userPush(@RequestBody ApiPushDTO apiPushDTO, HttpServletRequest request) {
        System.out.println("请求参数:" + JSON.toJSONString(apiPushDTO));
        Map<String, Object> ret = new HashMap<>();
 
        String clientId = request.getParameter("clientId");
        String timestamp = request.getParameter("timestamp");
        String sign = request.getParameter("sign");
        String salt = request.getParameter("salt");
 
        // 校验签名防止篡改参数
        String sign2 = SignBuilder.create(appId, MD5Util.getMD5String(appSecret))
            .requestPath("/api/blade-user/sync/userpush")
            .requestMethod("POST")
            .salt(salt)
            .timestamp(Long.valueOf(timestamp))
            .sign();
 
        if (!clientId.equals(appId) || !sign.equals(sign2)) {
            ret.put("code", ErrorCode.SIGN_CHECK_ERROR.getCode());
            ret.put("msg", ErrorCode.SIGN_CHECK_ERROR.getMsg());
            ret.put("data", "");
            return ret;
        }
 
        // 解密syncData
        String syncData = SecurityUtil.decryptAES(apiPushDTO.getSyncData(), MD5Util.getMD5String(appSecret));
        List<AccountBean> accountBeanList = JSONArray.parseArray(syncData, AccountBean.class);
 
        // 异步执行用户处理
 
        int pcount = Runtime.getRuntime().availableProcessors();
        //最大线程数控制
        int maxthreadNum = accountBeanList.size();
        ExecutorService executor = new ThreadPoolExecutor(pcount, maxthreadNum, 10, TimeUnit.SECONDS,
            new ArrayBlockingQueue<>(1000), Executors.defaultThreadFactory(), new ThreadPoolExecutor.CallerRunsPolicy());
        System.out.println("开始执行用户处理!!!!!!!!!!!!");
        //循环list
        for (int i = 0; i < maxthreadNum; i++)  {
            final int index = i;
            final AccountBean accountBean = accountBeanList.get(i);
            executor.execute(() -> {
                //业务处理
                System.out.println("当前线程:" + Thread.currentThread().getName() + " " + index);
                System.out.println("当前处理对象:" + JSON.toJSONString(accountBean));
                asyncUserGo(accountBean);
            });
        }
        // 关闭线程池
        executor.shutdown();
 
        ret.put("code", 1000);
        ret.put("msg", "成功");
        ret.put("data", apiPushDTO.getSign());
        System.out.println("处理返回了~~~~");
        return ret;
    }
 
    public void asyncUserGo(AccountBean accountBean) {
        //判断手机号是否在库中
        User params = new User();
        params.setPhone(accountBean.getPrincipalId());
        User one = userService.getOne(Condition.getQueryWrapper(params));
 
        if (one == null) {
            //不在,看status状态,若为1则不操作。0添加进库
            if (accountBean.getStatus().equals("0")) {
 
                User saveUser = new User();
                //设置id为手机号
//                    saveUser.setId(Long.parseLong(accountBean.getPrincipalId()));
                //账号为手机号
                saveUser.setAccount(accountBean.getPrincipalId());
                saveUser.setPhone(accountBean.getPrincipalId());
                //设置姓名
                saveUser.setRealName(accountBean.getAttributes().get("realName"));
                //设置部门(默认给省)
                saveUser.setDeptId("420000000000");
                //设置角色(权限与市州水库管理业务人员一致)
                saveUser.setRoleId("1688732764750766082");
                //设置租户id
                saveUser.setTenantId("000000");
                userService.save(saveUser);
            }
        } else {
            //在,看status状态,若为1则删除用户。0更新?
            if (accountBean.getStatus().equals("1")) {
                userService.removeUser(accountBean.getPrincipalId());
            } else { //更新
                //设置姓名
                one.setRealName(accountBean.getAttributes().get("realName"));
                userService.updateUser(one);
            }
        }
 
    }
 
}