package thyyxxk.webserver.service; import com.alibaba.fastjson.JSONObject; import com.baomidou.dynamic.datasource.annotation.DS; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import thyyxxk.webserver.config.exception.ExceptionEnum; import thyyxxk.webserver.dao.his.LoginDao; import thyyxxk.webserver.entity.ResultVo; import thyyxxk.webserver.entity.dictionary.CodeName; import thyyxxk.webserver.entity.login.UserInfo; import thyyxxk.webserver.entity.login.VueMenu; import thyyxxk.webserver.service.externalhttp.CorpWxSrvc; import thyyxxk.webserver.service.redislike.RedisLikeService; import thyyxxk.webserver.utils.*; import java.util.*; /** * @author dj */ @Slf4j @Service public class LoginService { private final LoginDao dao; private final TokenService tokenService; private final RedisLikeService redisLikeService; private final CorpWxSrvc srvc; private final PublicServer publicServer; @Autowired public LoginService(LoginDao dao, TokenService tokenService, RedisLikeService redisLikeService, CorpWxSrvc srvc, PublicServer publicServer) { this.dao = dao; this.tokenService = tokenService; this.redisLikeService = redisLikeService; this.srvc = srvc; this.publicServer = publicServer; } public ResultVo login(UserInfo userInfo) { UserInfo tempUserInfo = dao.findUserByCodeRsFromDjUserBase(userInfo.getCodeRs()); if (null == tempUserInfo) { tempUserInfo = dao.findUserByCodeRsFromEmployeeMi(userInfo.getCodeRs()); if (null == tempUserInfo) { return ResultVoUtil.fail(ExceptionEnum.USER_NOT_EXIST); } dao.insertNewUserToDjUserBase(tempUserInfo); } if (!Objects.equals("fromTriageScreen", userInfo.getSid()) && !userInfo.getPassword().equals(tempUserInfo.getPassword())) { return ResultVoUtil.fail(ExceptionEnum.INVALID_PASSWORD); } String token = tokenService.getToken(tempUserInfo); try { JSONObject json = srvc.getUserinfo(tokenService.getWeComAddressBookToken(), tempUserInfo.getCodeRs()); tempUserInfo.setAvatar(json.getString("avatar")); } catch (Exception ignored) { } Set deptList = publicServer.getChildDeptByUserCode(tempUserInfo.getCode()); if (deptList != null && !deptList.isEmpty()) { Map tempMap = new HashMap<>(deptList.size()); deptList.forEach(item -> { tempMap.put(item, redisLikeService.getDeptName(item)); }); tempUserInfo.setPartTimeDeptMap(tempMap); } tempUserInfo.setToken(token); tempUserInfo.setSid(makeSid(tempUserInfo.getCode(), token, userInfo.getSid())); tempUserInfo.setRoles(dao.getUserRoles(tempUserInfo.getCode())); tempUserInfo.setDeptName(dao.getDeptName(tempUserInfo.getDeptCode())); tempUserInfo.setHzDay(dao.getDeptHzDayByCode(tempUserInfo.getDeptCode())); redisLikeService.handleUserLogin(tempUserInfo.getCode()); return ResultVoUtil.success(tempUserInfo); } public ResultVo simpleLogin(String code) { UserInfo us = dao.getUserInfoByCode(code); if (us == null) { return ResultVoUtil.fail(ExceptionEnum.NOT_EL_MESSAGE, "用户不存在"); } JSONObject js = new JSONObject(); ResultVo userInfoResultVo = login(us); if (userInfoResultVo.getCode() == 200) { js.put("userInfo", userInfoResultVo.getData()); } else { return ResultVoUtil.fail(ExceptionEnum.NOT_EL_MESSAGE, userInfoResultVo.getMessage()); } ResultVo> f = fetchVueMenus(us.getCode()); if (f.getCode() == 200) { js.put("fetchVueMenus", f.getData()); } else { return ResultVoUtil.fail(ExceptionEnum.NOT_EL_MESSAGE, f.getMessage()); } return ResultVoUtil.success(js); } @DS("his") public ResultVo> fetchVueMenus(String code) { // 63 只有个人中心的权限 List roles = dao.getUserRoles(code == null ? TokenUtil.getInstance().getTokenUserId() : code); if (null == roles || roles.isEmpty()) { roles = Collections.singletonList(63); } else { roles.add(63); } List temp = dao.selectVueMenusByRoles(roles); Map map = new HashMap<>(); List list = TreeUtil.getVueMenuTree(temp); map.put("routes", list); map.put("flatRoutes", dao.selectRoutesByRoles(roles)); map.put("paths", dao.selectVueMenusPathByRoles(roles)); return ResultVoUtil.success(map); } public ResultVo> getWards() { String code = TokenUtil.getInstance().getTokenUserId(); if (publicServer.needRule(2, 8, 52)) { return ResultVoUtil.success(dao.getAllWards()); } else { return ResultVoUtil.success(dao.getUserWards(code)); } } public UserInfo findUserByCode(String code) { return dao.findUserByCode(code); } private String makeSid(String code, String token, String sid) { String tempToken = token.replaceAll("\\.", "").replaceAll("_", "").replaceAll("-", ""); String flakeIdSub = "-" + SnowFlakeId.instance().nextId() + "-"; int random = new Random().nextInt(80); String tokenSub = tempToken.substring(random, random + 18); if (StringUtil.notBlank(sid) && "fromTriageScreen".equals(sid)) { tokenSub += "-triageFloorScreen"; } return code + flakeIdSub + tokenSub; } }