29 changed files with 928 additions and 16 deletions
			
			
		@ -0,0 +1,49 @@ | 
				
			|||
package com.epmet.controller; | 
				
			|||
 | 
				
			|||
import com.epmet.commons.tools.utils.Result; | 
				
			|||
import com.epmet.commons.tools.validator.ValidatorUtils; | 
				
			|||
import com.epmet.dto.form.LoginFormDTO; | 
				
			|||
import com.epmet.dto.result.UserTokenResultDTO; | 
				
			|||
import com.epmet.service.ThirdLoginService; | 
				
			|||
import org.springframework.beans.factory.annotation.Autowired; | 
				
			|||
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; | 
				
			|||
 | 
				
			|||
/** | 
				
			|||
 * @Description 第三方-居民端、政府端登陆服务 | 
				
			|||
 * @author sun | 
				
			|||
 */ | 
				
			|||
@RestController | 
				
			|||
@RequestMapping("thirdlogin") | 
				
			|||
public class ThirdLoginController { | 
				
			|||
 | 
				
			|||
    @Autowired | 
				
			|||
    private ThirdLoginService thirdLoginService; | 
				
			|||
 | 
				
			|||
    /** | 
				
			|||
     * @param formDTO | 
				
			|||
     * @return | 
				
			|||
     * @Author sun | 
				
			|||
     * @Description 单客户-居民端微信小程序登录 | 
				
			|||
     **/ | 
				
			|||
    @PostMapping("resilogin") | 
				
			|||
    public Result<UserTokenResultDTO> resiLogin(@RequestBody LoginFormDTO formDTO) { | 
				
			|||
        ValidatorUtils.validateEntity(formDTO); | 
				
			|||
        return new Result<UserTokenResultDTO>().ok(thirdLoginService.resiLogin(formDTO)); | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    /** | 
				
			|||
     * @param formDTO | 
				
			|||
     * @return | 
				
			|||
     * @Author sun | 
				
			|||
     * @Description 单客户-政府端微信小程序登录 | 
				
			|||
     **/ | 
				
			|||
    @PostMapping("worklogin") | 
				
			|||
    public Result<UserTokenResultDTO> workLogin(@RequestBody LoginFormDTO formDTO) { | 
				
			|||
        ValidatorUtils.validateEntity(formDTO); | 
				
			|||
        return new Result<UserTokenResultDTO>().ok(thirdLoginService.workLogin(formDTO)); | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
} | 
				
			|||
@ -0,0 +1,28 @@ | 
				
			|||
package com.epmet.dto.form; | 
				
			|||
 | 
				
			|||
import lombok.Data; | 
				
			|||
 | 
				
			|||
import javax.validation.constraints.NotBlank; | 
				
			|||
import java.io.Serializable; | 
				
			|||
 | 
				
			|||
/** | 
				
			|||
 * @Description 单客户-居民端微信小程序登录 | 
				
			|||
 * @Author sun | 
				
			|||
 */ | 
				
			|||
@Data | 
				
			|||
public class LoginFormDTO extends LoginCommonFormDTO implements Serializable { | 
				
			|||
	private static final long serialVersionUID = 7950477424010655108L; | 
				
			|||
 | 
				
			|||
	/** | 
				
			|||
	 * 小程序appId | 
				
			|||
	 */ | 
				
			|||
	@NotBlank(message = "appId不能为空",groups = {AddUserInternalGroup.class}) | 
				
			|||
	private String appId; | 
				
			|||
 | 
				
			|||
	/** | 
				
			|||
	 * 用户微信code | 
				
			|||
	 */ | 
				
			|||
	@NotBlank(message = "wxCode不能为空",groups = {AddUserInternalGroup.class}) | 
				
			|||
	private String wxCode; | 
				
			|||
 | 
				
			|||
} | 
				
			|||
@ -0,0 +1,27 @@ | 
				
			|||
package com.epmet.service; | 
				
			|||
 | 
				
			|||
import com.epmet.dto.form.LoginFormDTO; | 
				
			|||
import com.epmet.dto.result.UserTokenResultDTO; | 
				
			|||
 | 
				
			|||
/** | 
				
			|||
 * @Description 第三方-居民端、政府端登陆服务 | 
				
			|||
 * @author sun | 
				
			|||
 */ | 
				
			|||
public interface ThirdLoginService { | 
				
			|||
 | 
				
			|||
	/** | 
				
			|||
	 * @param formDTO | 
				
			|||
	 * @return | 
				
			|||
	 * @Author sun | 
				
			|||
	 * @Description 单客户-居民端微信小程序登录 | 
				
			|||
	 **/ | 
				
			|||
	UserTokenResultDTO resiLogin(LoginFormDTO formDTO); | 
				
			|||
 | 
				
			|||
	/** | 
				
			|||
	 * @param formDTO | 
				
			|||
	 * @return | 
				
			|||
	 * @Author sun | 
				
			|||
	 * @Description 单客户-政府端微信小程序登录 | 
				
			|||
	 **/ | 
				
			|||
	UserTokenResultDTO workLogin(LoginFormDTO formDTO); | 
				
			|||
} | 
				
			|||
@ -0,0 +1,348 @@ | 
				
			|||
package com.epmet.service.impl; | 
				
			|||
 | 
				
			|||
import com.epmet.common.token.constant.LoginConstant; | 
				
			|||
import com.epmet.commons.tools.exception.EpmetErrorCode; | 
				
			|||
import com.epmet.commons.tools.exception.ExceptionUtils; | 
				
			|||
import com.epmet.commons.tools.exception.RenException; | 
				
			|||
import com.epmet.commons.tools.security.dto.GovTokenDto; | 
				
			|||
import com.epmet.commons.tools.security.dto.TokenDto; | 
				
			|||
import com.epmet.commons.tools.utils.ConvertUtils; | 
				
			|||
import com.epmet.commons.tools.utils.CpUserDetailRedis; | 
				
			|||
import com.epmet.commons.tools.utils.DateUtils; | 
				
			|||
import com.epmet.commons.tools.utils.Result; | 
				
			|||
import com.epmet.dto.CustomerAgencyDTO; | 
				
			|||
import com.epmet.dto.GovStaffRoleDTO; | 
				
			|||
import com.epmet.dto.UserDTO; | 
				
			|||
import com.epmet.dto.UserWechatDTO; | 
				
			|||
import com.epmet.dto.form.*; | 
				
			|||
import com.epmet.dto.result.DepartmentListResultDTO; | 
				
			|||
import com.epmet.dto.result.GridByStaffResultDTO; | 
				
			|||
import com.epmet.dto.result.StaffLatestAgencyResultDTO; | 
				
			|||
import com.epmet.dto.result.UserTokenResultDTO; | 
				
			|||
import com.epmet.feign.EpmetThirdFeignClient; | 
				
			|||
import com.epmet.feign.EpmetUserOpenFeignClient; | 
				
			|||
import com.epmet.feign.GovOrgOpenFeignClient; | 
				
			|||
import com.epmet.jwt.JwtTokenProperties; | 
				
			|||
import com.epmet.jwt.JwtTokenUtils; | 
				
			|||
import com.epmet.service.ThirdLoginService; | 
				
			|||
import lombok.extern.slf4j.Slf4j; | 
				
			|||
import org.slf4j.Logger; | 
				
			|||
import org.slf4j.LoggerFactory; | 
				
			|||
import org.springframework.beans.factory.annotation.Autowired; | 
				
			|||
import org.springframework.stereotype.Service; | 
				
			|||
import org.springframework.util.CollectionUtils; | 
				
			|||
 | 
				
			|||
import java.util.HashMap; | 
				
			|||
import java.util.List; | 
				
			|||
import java.util.Map; | 
				
			|||
import java.util.Set; | 
				
			|||
import java.util.stream.Collectors; | 
				
			|||
 | 
				
			|||
/** | 
				
			|||
 * @author sun | 
				
			|||
 * @Description 第三方-居民端、政府端登陆服务 | 
				
			|||
 */ | 
				
			|||
@Slf4j | 
				
			|||
@Service | 
				
			|||
public class ThirdLoginServiceImpl implements ThirdLoginService { | 
				
			|||
 | 
				
			|||
    private static final Logger logger = LoggerFactory.getLogger(ThirdLoginServiceImpl.class); | 
				
			|||
    @Autowired | 
				
			|||
    private JwtTokenUtils jwtTokenUtils; | 
				
			|||
    @Autowired | 
				
			|||
    private JwtTokenProperties jwtTokenProperties; | 
				
			|||
    @Autowired | 
				
			|||
    private CpUserDetailRedis cpUserDetailRedis; | 
				
			|||
    @Autowired | 
				
			|||
    private EpmetThirdFeignClient epmetThirdFeignClient; | 
				
			|||
    @Autowired | 
				
			|||
    private EpmetUserOpenFeignClient epmetUserOpenFeignClient; | 
				
			|||
    @Autowired | 
				
			|||
    private GovOrgOpenFeignClient govOrgOpenFeignClient; | 
				
			|||
 | 
				
			|||
    /** | 
				
			|||
     * @param formDTO | 
				
			|||
     * @return | 
				
			|||
     * @Author sun | 
				
			|||
     * @Description 单客户-居民端微信小程序登录 | 
				
			|||
     **/ | 
				
			|||
    @Override | 
				
			|||
    public UserTokenResultDTO resiLogin(LoginFormDTO formDTO) { | 
				
			|||
        //1.调用epmet_third服务,校验appId是否有效以及是否授权,校验通过的调用微信API获取用户基本信息
 | 
				
			|||
        WxLoginFormDTO resiLoginFormDTO = new WxLoginFormDTO(); | 
				
			|||
        resiLoginFormDTO.setAppId(formDTO.getAppId()); | 
				
			|||
        resiLoginFormDTO.setWxCode(formDTO.getWxCode()); | 
				
			|||
        Result<UserWechatDTO> result = epmetThirdFeignClient.resiAndWorkLogin(resiLoginFormDTO); | 
				
			|||
        if (!result.success()) { | 
				
			|||
            throw new RenException(result.getCode()); | 
				
			|||
        } | 
				
			|||
        UserWechatDTO userWechatDTO = result.getData(); | 
				
			|||
 | 
				
			|||
        //2.调用epmet-user服务,新增用户信息(先判断用户是否存在,不存在则新增存在则更新)
 | 
				
			|||
        WxUserFormDTO wxUserFormDTO = new WxUserFormDTO(); | 
				
			|||
        wxUserFormDTO.setWechatDTO(userWechatDTO); | 
				
			|||
        wxUserFormDTO.setApp(formDTO.getApp()); | 
				
			|||
        Result<UserDTO> userResult = epmetUserOpenFeignClient.saveWxUser(wxUserFormDTO); | 
				
			|||
        if (!userResult.success()) { | 
				
			|||
            throw new RenException(result.getCode()); | 
				
			|||
        } | 
				
			|||
        UserDTO userDTO = userResult.getData(); | 
				
			|||
 | 
				
			|||
        //3.生成业务token
 | 
				
			|||
        String userId = userDTO.getId(); | 
				
			|||
        String token = this.generateToken(formDTO, userId); | 
				
			|||
 | 
				
			|||
        //4.存放Redis
 | 
				
			|||
        this.saveTokenDto(formDTO, userId, userWechatDTO, token); | 
				
			|||
 | 
				
			|||
        //5.接口返参
 | 
				
			|||
        UserTokenResultDTO userTokenResultDTO = new UserTokenResultDTO(); | 
				
			|||
        userTokenResultDTO.setToken(token); | 
				
			|||
 | 
				
			|||
        return userTokenResultDTO; | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    /** | 
				
			|||
     * @Description 居民端登陆生成业务token的key | 
				
			|||
     **/ | 
				
			|||
    private String generateToken(LoginCommonFormDTO formDTO, String userId) { | 
				
			|||
        Map<String, Object> map = new HashMap<>(); | 
				
			|||
        map.put("app", formDTO.getApp()); | 
				
			|||
        map.put("client", formDTO.getClient()); | 
				
			|||
        map.put("userId", userId); | 
				
			|||
        String token = jwtTokenUtils.createToken(map); | 
				
			|||
        logger.info("app:" + formDTO.getApp() + ";client:" + formDTO.getClient() + ";userId:" + userId + ";生成token[" + token + "]"); | 
				
			|||
        return token; | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    /** | 
				
			|||
     * @Description 将token存入redis | 
				
			|||
     **/ | 
				
			|||
    private String saveTokenDto(LoginCommonFormDTO formDTO, String userId, UserWechatDTO userWechatDTO, String token) { | 
				
			|||
        int expire = jwtTokenProperties.getExpire(); | 
				
			|||
        TokenDto tokenDto = new TokenDto(); | 
				
			|||
        tokenDto.setApp(formDTO.getApp()); | 
				
			|||
        tokenDto.setClient(formDTO.getClient()); | 
				
			|||
        tokenDto.setUserId(userId); | 
				
			|||
        tokenDto.setOpenId(userWechatDTO.getWxOpenId()); | 
				
			|||
        tokenDto.setSessionKey(userWechatDTO.getSessionKey()); | 
				
			|||
        tokenDto.setUnionId(userWechatDTO.getUnionId()); | 
				
			|||
        tokenDto.setToken(token); | 
				
			|||
        tokenDto.setUpdateTime(System.currentTimeMillis()); | 
				
			|||
        tokenDto.setExpireTime(jwtTokenUtils.getExpiration(token).getTime()); | 
				
			|||
        cpUserDetailRedis.set(tokenDto, expire); | 
				
			|||
        logger.info("截止时间:" + DateUtils.format(jwtTokenUtils.getExpiration(token), "yyyy-MM-dd HH:mm:ss")); | 
				
			|||
        return token; | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    /** | 
				
			|||
     * @param formDTO | 
				
			|||
     * @return | 
				
			|||
     * @Author sun | 
				
			|||
     * @Description 单客户-政府端微信小程序登录 | 
				
			|||
     **/ | 
				
			|||
    @Override | 
				
			|||
    public UserTokenResultDTO workLogin(LoginFormDTO formDTO) { | 
				
			|||
        //1.调用epmet_third服务,校验appId是否有效以及是否授权,校验通过的调用微信API获取用户基本信息
 | 
				
			|||
        WxLoginFormDTO resiLoginFormDTO = new WxLoginFormDTO(); | 
				
			|||
        resiLoginFormDTO.setAppId(formDTO.getAppId()); | 
				
			|||
        resiLoginFormDTO.setWxCode(formDTO.getWxCode()); | 
				
			|||
        Result<UserWechatDTO> result = epmetThirdFeignClient.resiAndWorkLogin(resiLoginFormDTO); | 
				
			|||
        if (!result.success()) { | 
				
			|||
            throw new RenException(result.getCode()); | 
				
			|||
        } | 
				
			|||
        UserWechatDTO userWechatDTO = result.getData(); | 
				
			|||
 | 
				
			|||
        //2.根据openid查询用户是否存在历史登陆信息
 | 
				
			|||
        Result<StaffLatestAgencyResultDTO> latestStaffWechat = epmetUserOpenFeignClient.getLatestStaffWechatLoginRecord(userWechatDTO.getWxOpenId()); | 
				
			|||
        if (!latestStaffWechat.success() || null == latestStaffWechat.getData()) { | 
				
			|||
            logger.error(String.format("没有获取到用户最近一次登录账户信息,code[%s],msg[%s]", EpmetErrorCode.PLEASE_LOGIN.getCode(), EpmetErrorCode.PLEASE_LOGIN.getMsg())); | 
				
			|||
            throw new RenException(EpmetErrorCode.PLEASE_LOGIN.getCode()); | 
				
			|||
        } | 
				
			|||
        StaffLatestAgencyResultDTO staffLatestAgencyResultDTO = latestStaffWechat.getData(); | 
				
			|||
 | 
				
			|||
        //3.记录staff_wechat
 | 
				
			|||
        this.savestaffwechat(staffLatestAgencyResultDTO.getStaffId(), userWechatDTO.getWxOpenId()); | 
				
			|||
 | 
				
			|||
        //4.记录登录日志
 | 
				
			|||
        this.saveStaffLoginRecord(staffLatestAgencyResultDTO); | 
				
			|||
 | 
				
			|||
        //5.获取用户token
 | 
				
			|||
        String token = this.generateGovWxmpToken(staffLatestAgencyResultDTO.getStaffId()); | 
				
			|||
 | 
				
			|||
        //6.保存到redis
 | 
				
			|||
        this.saveLatestGovTokenDto(staffLatestAgencyResultDTO, userWechatDTO, token); | 
				
			|||
        UserTokenResultDTO userTokenResultDTO = new UserTokenResultDTO(); | 
				
			|||
        userTokenResultDTO.setToken(token); | 
				
			|||
        return userTokenResultDTO; | 
				
			|||
 | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    /** | 
				
			|||
     * @param userId openid | 
				
			|||
     * @return | 
				
			|||
     * @Author sun | 
				
			|||
     * @Description 保存微信和当前登录用户关系 | 
				
			|||
     **/ | 
				
			|||
    private Result savestaffwechat(String userId, String openid) { | 
				
			|||
        StaffWechatFormDTO staffWechatFormDTO = new StaffWechatFormDTO(); | 
				
			|||
        staffWechatFormDTO.setUserId(userId); | 
				
			|||
        staffWechatFormDTO.setWxOpenId(openid); | 
				
			|||
        return epmetUserOpenFeignClient.saveStaffWechat(staffWechatFormDTO); | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    /** | 
				
			|||
     * @param latestStaffWechatLoginDTO | 
				
			|||
     * @return | 
				
			|||
     * @Author sun | 
				
			|||
     * @Description 保存登录日志 | 
				
			|||
     **/ | 
				
			|||
    private Result saveStaffLoginRecord(StaffLatestAgencyResultDTO latestStaffWechatLoginDTO) { | 
				
			|||
        StaffLoginAgencyRecordFormDTO staffLoginAgencyRecordFormDTO = new StaffLoginAgencyRecordFormDTO(); | 
				
			|||
        staffLoginAgencyRecordFormDTO.setCustomerId(latestStaffWechatLoginDTO.getCustomerId()); | 
				
			|||
        staffLoginAgencyRecordFormDTO.setStaffId(latestStaffWechatLoginDTO.getStaffId()); | 
				
			|||
        staffLoginAgencyRecordFormDTO.setWxOpenId(latestStaffWechatLoginDTO.getWxOpenId()); | 
				
			|||
        staffLoginAgencyRecordFormDTO.setMobile(latestStaffWechatLoginDTO.getMobile()); | 
				
			|||
        staffLoginAgencyRecordFormDTO.setAgencyId(latestStaffWechatLoginDTO.getAgencyId()); | 
				
			|||
        Result staffLoginRecordResult = epmetUserOpenFeignClient.saveStaffLoginRecord(staffLoginAgencyRecordFormDTO); | 
				
			|||
        return staffLoginRecordResult; | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    /** | 
				
			|||
     * @Description 生成政府端小程序业务token Key | 
				
			|||
     * @Author sun | 
				
			|||
     **/ | 
				
			|||
    private String generateGovWxmpToken(String staffId) { | 
				
			|||
        Map<String, Object> map = new HashMap<>(); | 
				
			|||
        map.put("app", LoginConstant.APP_GOV); | 
				
			|||
        map.put("client", LoginConstant.CLIENT_WXMP); | 
				
			|||
        map.put("userId", staffId); | 
				
			|||
        String token = jwtTokenUtils.createToken(map); | 
				
			|||
        logger.info("app:" + LoginConstant.APP_GOV + ";client:" + LoginConstant.CLIENT_WXMP + ";userId:" + staffId + ";生成token[" + token + "]"); | 
				
			|||
        return token; | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    /** | 
				
			|||
     * @Description 保存tokenDto到redis | 
				
			|||
     * @Author sun | 
				
			|||
     **/ | 
				
			|||
    private void saveLatestGovTokenDto(StaffLatestAgencyResultDTO staffLatestAgency, UserWechatDTO userWechatDTO, String token) { | 
				
			|||
        int expire = jwtTokenProperties.getExpire(); | 
				
			|||
        GovTokenDto govTokenDto = new GovTokenDto(); | 
				
			|||
        govTokenDto.setApp(LoginConstant.APP_GOV); | 
				
			|||
        govTokenDto.setClient(LoginConstant.CLIENT_WXMP); | 
				
			|||
        govTokenDto.setUserId(staffLatestAgency.getStaffId()); | 
				
			|||
        govTokenDto.setOpenId(userWechatDTO.getWxOpenId()); | 
				
			|||
        govTokenDto.setSessionKey(userWechatDTO.getSessionKey()); | 
				
			|||
        govTokenDto.setUnionId(userWechatDTO.getUnionId()); | 
				
			|||
        govTokenDto.setToken(token); | 
				
			|||
        govTokenDto.setUpdateTime(System.currentTimeMillis()); | 
				
			|||
        govTokenDto.setExpireTime(jwtTokenUtils.getExpiration(token).getTime()); | 
				
			|||
        govTokenDto.setRootAgencyId(staffLatestAgency.getAgencyId()); | 
				
			|||
        govTokenDto.setCustomerId(staffLatestAgency.getCustomerId()); | 
				
			|||
 | 
				
			|||
        //设置部门,网格,角色列表
 | 
				
			|||
        govTokenDto.setDeptIdList(getDeptartmentIdList(staffLatestAgency.getStaffId())); | 
				
			|||
        govTokenDto.setGridIdList(getGridIdList(staffLatestAgency.getStaffId())); | 
				
			|||
        CustomerAgencyDTO agency = getAgencyByStaffId(staffLatestAgency.getStaffId()); | 
				
			|||
        if (agency != null) { | 
				
			|||
            govTokenDto.setAgencyId(agency.getId()); | 
				
			|||
            govTokenDto.setRoleList(queryGovStaffRoles(staffLatestAgency.getStaffId(), agency.getId())); | 
				
			|||
        } | 
				
			|||
        govTokenDto.setOrgIdPath(getOrgIdPath(staffLatestAgency.getStaffId())); | 
				
			|||
 | 
				
			|||
        cpUserDetailRedis.set(govTokenDto, expire); | 
				
			|||
        logger.info("截止时间:" + DateUtils.format(jwtTokenUtils.getExpiration(token), "yyyy-MM-dd HH:mm:ss")); | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    public Set<String> getDeptartmentIdList(String staffId) { | 
				
			|||
        try { | 
				
			|||
            Result<List<DepartmentListResultDTO>> deptListResult = govOrgOpenFeignClient.getDepartmentListByStaffId(staffId); | 
				
			|||
            if (deptListResult.success()) { | 
				
			|||
                if (!CollectionUtils.isEmpty(deptListResult.getData())) { | 
				
			|||
                    Set<String> deptIdLists = deptListResult.getData().stream().map(dept -> dept.getDepartmentId()).collect(Collectors.toSet()); | 
				
			|||
                    return deptIdLists; | 
				
			|||
                } | 
				
			|||
            } else { | 
				
			|||
                logger.error("登录:查询部门列表,远程调用返回错误:{}", deptListResult.getMsg()); | 
				
			|||
            } | 
				
			|||
        } catch (Exception e) { | 
				
			|||
            String errorStackTrace = ExceptionUtils.getErrorStackTrace(e); | 
				
			|||
            logger.error("登录:查询部门列表异常:{}", errorStackTrace); | 
				
			|||
        } | 
				
			|||
        return null; | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    /** | 
				
			|||
     * 根据工作人员ID查询网格ID列表 | 
				
			|||
     * | 
				
			|||
     * @param staffId | 
				
			|||
     * @return | 
				
			|||
     */ | 
				
			|||
    public Set<String> getGridIdList(String staffId) { | 
				
			|||
        Result<List<GridByStaffResultDTO>> result = govOrgOpenFeignClient.listGridsbystaffid(staffId); | 
				
			|||
        if (!result.success()) { | 
				
			|||
            logger.error("登录:查询网格列表,远程调用返回错误:{}", result.getMsg()); | 
				
			|||
            return null; | 
				
			|||
        } else { | 
				
			|||
            List<GridByStaffResultDTO> grids = result.getData(); | 
				
			|||
            return grids.stream().map(grid -> grid.getGridId()).collect(Collectors.toSet()); | 
				
			|||
        } | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    /** | 
				
			|||
     * 根据staffId查询所属的组织机构 | 
				
			|||
     * | 
				
			|||
     * @param staffId | 
				
			|||
     */ | 
				
			|||
    public CustomerAgencyDTO getAgencyByStaffId(String staffId) { | 
				
			|||
        Result<CustomerAgencyDTO> result = govOrgOpenFeignClient.getAgencyByStaff(staffId); | 
				
			|||
        if (!result.success()) { | 
				
			|||
            logger.error("登录:查询登录人所属的机关OrgIdPath失败:{}", result.getMsg()); | 
				
			|||
            return null; | 
				
			|||
        } | 
				
			|||
        return result.getData(); | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    /** | 
				
			|||
     * 查询人员在某机关单位下的角色列表 | 
				
			|||
     * | 
				
			|||
     * @param staffId orgId | 
				
			|||
     */ | 
				
			|||
    public List<GovTokenDto.Role> queryGovStaffRoles(String staffId, String orgId) { | 
				
			|||
        StaffRoleFormDTO formDTO = new StaffRoleFormDTO(); | 
				
			|||
        formDTO.setStaffId(staffId); | 
				
			|||
        formDTO.setOrgId(orgId); | 
				
			|||
        Result<List<GovStaffRoleDTO>> gridResult = epmetUserOpenFeignClient.getRolesOfStaff(formDTO); | 
				
			|||
        if (!CollectionUtils.isEmpty(gridResult.getData())) { | 
				
			|||
            //return gridResult.getData().stream().map(role -> role.getId()).collect(Collectors.toSet());
 | 
				
			|||
            return ConvertUtils.sourceToTarget(gridResult.getData(), GovTokenDto.Role.class); | 
				
			|||
        } | 
				
			|||
        return null; | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    /** | 
				
			|||
     * 查询工作人员的OrgIdPath | 
				
			|||
     * | 
				
			|||
     * @param staffId | 
				
			|||
     * @return | 
				
			|||
     */ | 
				
			|||
    public String getOrgIdPath(String staffId) { | 
				
			|||
        Result<CustomerAgencyDTO> result = govOrgOpenFeignClient.getAgencyByStaff(staffId); | 
				
			|||
        if (!result.success()) { | 
				
			|||
            logger.error("登录:查询登录人所属的机关OrgIdPath失败:{}", result.getMsg()); | 
				
			|||
            return null; | 
				
			|||
        } | 
				
			|||
        CustomerAgencyDTO agency = result.getData(); | 
				
			|||
        if (agency != null) { | 
				
			|||
            if ("0".equals(agency.getPid())) { | 
				
			|||
                // 顶级
 | 
				
			|||
                return agency.getId(); | 
				
			|||
            } else { | 
				
			|||
                return agency.getPids().concat(":").concat(agency.getId()); | 
				
			|||
            } | 
				
			|||
        } | 
				
			|||
        return null; | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
} | 
				
			|||
@ -0,0 +1,27 @@ | 
				
			|||
package com.epmet.dto.form; | 
				
			|||
 | 
				
			|||
import lombok.Data; | 
				
			|||
 | 
				
			|||
import java.io.Serializable; | 
				
			|||
import java.util.Date; | 
				
			|||
 | 
				
			|||
/** | 
				
			|||
 * @Author sun | 
				
			|||
 * @Description 小程序居民端登陆-接口入参 | 
				
			|||
 */ | 
				
			|||
@Data | 
				
			|||
public class WxLoginFormDTO implements Serializable { | 
				
			|||
 | 
				
			|||
    private static final long serialVersionUID = -6163303184086480522L; | 
				
			|||
 | 
				
			|||
    /** | 
				
			|||
     * 小程序AppId | 
				
			|||
     */ | 
				
			|||
    private String appId; | 
				
			|||
 | 
				
			|||
    /** | 
				
			|||
     * 用户微信code | 
				
			|||
     */ | 
				
			|||
    private String wxCode; | 
				
			|||
 | 
				
			|||
} | 
				
			|||
@ -0,0 +1,20 @@ | 
				
			|||
package com.epmet.wxapi.constant; | 
				
			|||
 | 
				
			|||
/** | 
				
			|||
 * 微信登陆-获取用户信息-API | 
				
			|||
 * @author sun | 
				
			|||
 */ | 
				
			|||
public interface WxLoginConstant { | 
				
			|||
 | 
				
			|||
    /** | 
				
			|||
     * 第三方平台代小程序实现-小程序登陆-根据wxcode获取openid | 
				
			|||
     */ | 
				
			|||
    String WXCODE_BY_OPENID = "https://api.weixin.qq.com/sns/component/jscode2session"; | 
				
			|||
 | 
				
			|||
    /** | 
				
			|||
     * 获取用户基本信息(UnionID机制) | 
				
			|||
     * 根据小程序token和openid获取用户基本信息 | 
				
			|||
     */ | 
				
			|||
    String OPENID_TO_INFORMATION = "https://api.weixin.qq.com/cgi-bin/user/info"; | 
				
			|||
 | 
				
			|||
} | 
				
			|||
@ -0,0 +1,21 @@ | 
				
			|||
package com.epmet.wxapi.service; | 
				
			|||
 | 
				
			|||
import com.epmet.dto.UserWechatDTO; | 
				
			|||
 | 
				
			|||
import java.util.HashMap; | 
				
			|||
 | 
				
			|||
/** | 
				
			|||
 * 小程序代码管理相关 API(微信登陆) | 
				
			|||
 * 文档:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1489140610_Uavc4&token=&lang=zh_CN
 | 
				
			|||
 * @author sun | 
				
			|||
 */ | 
				
			|||
public interface WxLoginService { | 
				
			|||
 | 
				
			|||
	/** | 
				
			|||
	 * @param appId wxCode customerId clientType | 
				
			|||
	 * @return | 
				
			|||
	 * @Author sun | 
				
			|||
	 * @Description 微信登陆获取用户信息 | 
				
			|||
	 **/ | 
				
			|||
	UserWechatDTO resiAndWorkLogin(String appId, String wxCode, String customerId, String clientType); | 
				
			|||
} | 
				
			|||
@ -0,0 +1,89 @@ | 
				
			|||
package com.epmet.wxapi.service.impl; | 
				
			|||
 | 
				
			|||
import com.alibaba.fastjson.JSON; | 
				
			|||
import com.epmet.commons.tools.exception.RenException; | 
				
			|||
import com.epmet.commons.tools.redis.RedisUtils; | 
				
			|||
import com.epmet.commons.tools.utils.HttpClientManager; | 
				
			|||
import com.epmet.dto.UserWechatDTO; | 
				
			|||
import com.epmet.wxapi.constant.WxLoginConstant; | 
				
			|||
import com.epmet.wxapi.service.WxLoginService; | 
				
			|||
import org.slf4j.Logger; | 
				
			|||
import org.slf4j.LoggerFactory; | 
				
			|||
import org.springframework.beans.factory.annotation.Autowired; | 
				
			|||
import org.springframework.beans.factory.annotation.Value; | 
				
			|||
import org.springframework.stereotype.Service; | 
				
			|||
 | 
				
			|||
import java.util.HashMap; | 
				
			|||
import java.util.Map; | 
				
			|||
 | 
				
			|||
/** | 
				
			|||
 * 小程序代码管理相关 API(微信登陆) | 
				
			|||
 * 文档:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1489140610_Uavc4&token=&lang=zh_CN
 | 
				
			|||
 * @author sun | 
				
			|||
 */ | 
				
			|||
@Service | 
				
			|||
public class WxLoginServiceImpl implements WxLoginService { | 
				
			|||
	private static final Logger logger = LoggerFactory.getLogger(WxLoginServiceImpl.class); | 
				
			|||
 | 
				
			|||
	@Value("${third.platform.appId}") | 
				
			|||
	private String componentAppId; | 
				
			|||
	@Autowired | 
				
			|||
	private RedisUtils redisUtils; | 
				
			|||
 | 
				
			|||
 | 
				
			|||
	/** | 
				
			|||
	 * @param appId wxCode customerId clientType | 
				
			|||
	 * @return | 
				
			|||
	 * @Author sun | 
				
			|||
	 * @Description 微信登陆获取用户信息 | 
				
			|||
	 **/ | 
				
			|||
	@Override | 
				
			|||
	public UserWechatDTO resiAndWorkLogin(String appId, String wxCode, String customerId, String clientType) { | 
				
			|||
		//1.获取用户openid和session_key
 | 
				
			|||
		Map<String, Object> map = new HashMap<>(); | 
				
			|||
		map.put("appid", appId); | 
				
			|||
		map.put("js_code", wxCode); | 
				
			|||
		map.put("grant_type", "authorization_code"); | 
				
			|||
		map.put("component_appid", componentAppId); | 
				
			|||
		String componentAccessToken = (String) redisUtils.get("epmet:wechartthird:componentaccesstoken"); | 
				
			|||
		map.put("component_access_token", componentAccessToken); | 
				
			|||
		String resultStr = HttpClientManager.getInstance().sendGet(WxLoginConstant.WXCODE_BY_OPENID, map).getData(); | 
				
			|||
		HashMap<String, String> hashMap = JSON.parseObject(resultStr, HashMap.class); | 
				
			|||
		if (null != hashMap.get("errorCode")) { | 
				
			|||
			logger.error("wxcode换取openid接口调用失败"); | 
				
			|||
			throw new RenException(hashMap.get("errorMsg")); | 
				
			|||
		} | 
				
			|||
		String openid = hashMap.get("openid"); | 
				
			|||
		String sessionKey = hashMap.get("session_key"); | 
				
			|||
 | 
				
			|||
		//2.换取用户基本信息
 | 
				
			|||
		//小程序access_token
 | 
				
			|||
		String access_token = (String) redisUtils.get("epmet:wechartthird:authinfo" + ":" + customerId + ":" + clientType); | 
				
			|||
		Map<String, Object> hash = new HashMap<>(); | 
				
			|||
		hash.put("access_token", access_token); | 
				
			|||
		hash.put("openid", openid); | 
				
			|||
		hash.put("lang", "zh_CN"); | 
				
			|||
		String getStr = HttpClientManager.getInstance().sendGet(WxLoginConstant.OPENID_TO_INFORMATION, map).getData(); | 
				
			|||
		HashMap<String, String> resultMap = JSON.parseObject(getStr, HashMap.class); | 
				
			|||
		if (null != resultMap.get("errorCode")) { | 
				
			|||
			logger.error("openid和access_token换取微信用户基本信息接口调用失败"); | 
				
			|||
			throw new RenException(resultMap.get("errorMsg")); | 
				
			|||
		} | 
				
			|||
 | 
				
			|||
		//3.返回结果
 | 
				
			|||
		UserWechatDTO dto = new UserWechatDTO(); | 
				
			|||
		dto.setSessionKey(sessionKey); | 
				
			|||
		dto.setWxOpenId(resultMap.get("openid")); | 
				
			|||
		dto.setUnionId(resultMap.get("unionid")); | 
				
			|||
		dto.setNickname(resultMap.get("nickname")); | 
				
			|||
		dto.setSex(Integer.parseInt(resultMap.get("sex"))); | 
				
			|||
		dto.setHeadImgUrl(resultMap.get("headimgurl")); | 
				
			|||
		dto.setCountry(resultMap.get("country")); | 
				
			|||
		dto.setProvince(resultMap.get("province")); | 
				
			|||
		dto.setCity(resultMap.get("city")); | 
				
			|||
		dto.setLanguage(resultMap.get("language")); | 
				
			|||
 | 
				
			|||
		return dto; | 
				
			|||
	} | 
				
			|||
 | 
				
			|||
} | 
				
			|||
@ -0,0 +1,26 @@ | 
				
			|||
package com.epmet.dto.form; | 
				
			|||
 | 
				
			|||
import com.epmet.dto.UserWechatDTO; | 
				
			|||
import lombok.Data; | 
				
			|||
 | 
				
			|||
import java.io.Serializable; | 
				
			|||
 | 
				
			|||
/** | 
				
			|||
 * @Description 小程序陌生人登陆,新增或更新用户信息-接口入参 | 
				
			|||
 * @Author sun | 
				
			|||
 */ | 
				
			|||
@Data | 
				
			|||
public class WxUserFormDTO implements Serializable{ | 
				
			|||
    private static final long serialVersionUID = -7994579456530273809L; | 
				
			|||
 | 
				
			|||
    /** | 
				
			|||
     * 微信用户基本信息 | 
				
			|||
     */ | 
				
			|||
    private UserWechatDTO wechatDTO; | 
				
			|||
 | 
				
			|||
    /** | 
				
			|||
     * 政府端:gov、居民端:resi、运营端:oper | 
				
			|||
     */ | 
				
			|||
    private String app; | 
				
			|||
 | 
				
			|||
} | 
				
			|||
					Loading…
					
					
				
		Reference in new issue