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="; // 测试key // private final static String appId = "30980cc0e70246df89f8b96b609db055"; // private final static String appSecret = "tZnrux6iKg0DWjFA8Pohf/ht4ARIREv2oHpRbSF/5us="; private final static String method = "post"; @PostMapping("/userpush") public Object userPush(@RequestBody ApiPushDTO apiPushDTO, HttpServletRequest request) { System.out.println("请求参数:" + JSON.toJSONString(apiPushDTO)); Map 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 accountBeanList = JSONArray.parseArray(syncData, AccountBean.class); // 异步执行用户处理 int pcount = Runtime.getRuntime().availableProcessors(); //最大线程数控制 int maxthreadNum = 30; ExecutorService executor = new ThreadPoolExecutor(pcount, maxthreadNum, 10, TimeUnit.SECONDS, new ArrayBlockingQueue<>(1000), Executors.defaultThreadFactory(), new ThreadPoolExecutor.CallerRunsPolicy()); System.out.println("开始执行用户处理!!!!!!!!!!!!"); executor.execute(() -> { //业务处理 //循环list for (int i = 0; i < maxthreadNum; i++) { final int index = i; final AccountBean accountBean = accountBeanList.get(i); 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")); one.setName(accountBean.getAttributes().get("realName")); userService.updateUser(one); // } } } }