rk
2025-09-28 80f9adf3f7682edf1d997f48c65a9bac2e4c1605
钉钉授权 与 通知开发
已添加1个文件
已修改10个文件
236 ■■■■■ 文件已修改
server/system_service/src/main/java/com/doumee/dao/system/dto/LoginDTO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/dao/system/dto/LoginH5DTO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/dao/system/dto/LoginPhoneDTO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/dao/system/model/SystemUser.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/VisitorWebController.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/dingTalk/DingTalk.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/DDAuthorizeVO.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/MemberService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/dao/system/dto/LoginDTO.java
@@ -22,6 +22,9 @@
    @ApiModelProperty(value = "微信openId")
    private String openid;
    @ApiModelProperty(value = "钉钉 unionId")
    private String ddUnionId;
    @NotBlank(message = "密码不能为空")
    @ApiModelProperty(value = "密码")
    private String password;
server/system_service/src/main/java/com/doumee/dao/system/dto/LoginH5DTO.java
@@ -22,6 +22,9 @@
    @ApiModelProperty(value = "微信openId")
    private String openid;
    @ApiModelProperty(value = "钉钉 unionId")
    private String ddUnionId;
    @NotBlank(message = "密码不能为空")
    @ApiModelProperty(value = "密码")
    private String password;
server/system_service/src/main/java/com/doumee/dao/system/dto/LoginPhoneDTO.java
@@ -23,6 +23,8 @@
    private String code;
    @ApiModelProperty(value = "openid")
    private String openid;
    @ApiModelProperty(value = "钉钉 unionId")
    private String ddUnionId;
    @ApiModelProperty(value = "用户类型:0=司机;1=访客;2=内部员工")
    private Integer userType;
}
server/system_service/src/main/java/com/doumee/dao/system/model/SystemUser.java
@@ -98,6 +98,8 @@
    private String openidHkInfo;
    @ApiModelProperty(value = "微信openid推送海康时间", example = "1", hidden = true)
    private Date openidHkDate;
    @ApiModelProperty(value = "钉钉 unionId", example = "1", hidden = true)
    private String ddUnionId;
    //2024å¹´12月6日11:00:30 ç±»åž‹ 0司机人员 1普通访客  2内部人员 3tms管控人员
    @ApiModelProperty(value = "类型 0司机人员 1普通访客  2内部人员 3tms管控人员", example = "0")
server/system_service/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java
@@ -156,7 +156,7 @@
            }
        }
        try {
            LoginUserInfo user = dealLoginByPwdNewBiz(dto.getUsername(),dto.getPassword(),null,dto.getOpenid(),request);
            LoginUserInfo user = dealLoginByPwdNewBiz(dto.getUsername(),dto.getPassword(),null,dto.getOpenid(),dto.getDdUnionId(),request);
            systemLoginLogService.create(loginLog);
            return  user;
        }catch (BusinessException e){
@@ -186,7 +186,7 @@
                throw e;
            }
        }
        LoginUserInfo user = dealLoginByPwdNewBiz(dto.getUsername(),dto.getPassword(),null,dto.getOpenid(),request);
        LoginUserInfo user = dealLoginByPwdNewBiz(dto.getUsername(),dto.getPassword(),null,dto.getOpenid(),dto.getDdUnionId(),request);
        systemLoginLogService.create(loginLog);
        return  user;
    }
@@ -213,7 +213,7 @@
        isCaptcheValide(dto.getPhone(),dto.getCode());//检查验证码
        SystemLoginLog loginLog = getInitLoginlog(dto.getPhone(),request);
        try{
            LoginUserInfo userInfo = dealLoginByPwdNewBiz(null,null,dto.getPhone(),dto.getOpenid(), request );
            LoginUserInfo userInfo = dealLoginByPwdNewBiz(null,null,dto.getPhone(),dto.getOpenid(),dto.getDdUnionId(), request );
            systemLoginLogService.create(loginLog);
            return userInfo;
        }catch (BusinessException e){
@@ -227,7 +227,7 @@
            throw e;
        }
    }
    private LoginUserInfo dealLoginByPwdNewBiz(String username,String pwd, String phone, String openid, ServerHttpRequest request) {
    private LoginUserInfo dealLoginByPwdNewBiz(String username,String pwd, String phone, String openid, String ddUnionId, ServerHttpRequest request) {
        // æ ¹æ®ç”¨æˆ·åæŸ¥è¯¢ç”¨æˆ·å¯¹è±¡
        SystemUser queryDto = new SystemUser();
        queryDto.setMobile(phone);
@@ -248,7 +248,12 @@
                throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT);
            }
        }
        if(StringUtils.isNotBlank(openid)){
        dealOpenIdBiz(user,openid);
        }
        if(StringUtils.isNotBlank(ddUnionId)){
            dealDDUnionIdBiz(user,ddUnionId);
        }
        Company company = new Company();
        if(Objects.nonNull(user.getCompanyId())){
            company = companyMapper.selectById(user.getCompanyId());
@@ -320,6 +325,24 @@
                    .eq(SystemUser::getId,user.getId()));
        }
    }
    private void dealDDUnionIdBiz(SystemUser user, String ddUnionId) {
        if(StringUtils.isNotBlank(ddUnionId)){
            //如果openId不为空,绑定该用户openid
            systemUserMapper.update(null,new UpdateWrapper<SystemUser>().lambda()
                    .set(SystemUser::getDdUnionId,null)
                    .set(SystemUser::getOpenidHkStatus,Constants.ZERO)
                    .ne(SystemUser::getType,Constants.memberType.gkuser)
                    .eq(SystemUser::getDdUnionId,ddUnionId)
            );
            systemUserMapper.update(null,new UpdateWrapper<SystemUser>().lambda()
                    .set(SystemUser::getDdUnionId,ddUnionId)
                    .set(SystemUser::getOpenidHkStatus,Constants.ZERO)
                    .set(SystemUser::getOpenidHkDate,null)
                    .set(SystemUser::getOpenidHkInfo,null)
                    .eq(SystemUser::getId,user.getId()));
        }
    }
    private void dealOpenIdBizForGk(SystemUser user, String openid) {
        if(StringUtils.isNotBlank(openid)){
            //如果openId不为空,绑定该用户openid
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/VisitorWebController.java
@@ -3,6 +3,7 @@
import com.doumee.api.BaseController;
import com.doumee.config.annotation.LoginNoRequired;
import com.doumee.core.annotation.trace.Trace;
import com.doumee.dao.web.response.DDAuthorizeVO;
import com.doumee.service.business.third.model.ApiResponse;
import com.doumee.service.business.third.model.LoginUserInfo;
import com.doumee.service.business.third.model.PageData;
@@ -17,6 +18,7 @@
import com.doumee.service.business.MemberService;
import com.doumee.service.business.VisitReasonService;
import com.doumee.service.business.VisitsService;
import com.taobao.api.ApiException;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
@@ -65,6 +67,18 @@
        return ApiResponse.success("查询成功",wxAuthorizeVO);
    }
    @ApiOperation(value = "钉钉微信授权", notes = "访客微信授权获取openId")
    @GetMapping("/ddAuthorize")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "query", dataType = "String", name = "code", value = "授权码", required = true),
            @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "source", value = "来源:0=司机;1=访客;2=内部员工", required = true)
    })
    public ApiResponse<DDAuthorizeVO> ddAuthorize(@RequestParam String code, @RequestParam Integer source) throws ApiException {
        DDAuthorizeVO ddAuthorizeVO =  memberService.ddAuthorize(code,source);
        return ApiResponse.success("查询成功",ddAuthorizeVO);
    }
    @ApiOperation(value = "查询被访问人信息", notes = "查询被访问人信息")
    @PostMapping("/getVisitedMember")
    public ApiResponse<List<MemberVO>> getVisitedMember(@Valid @RequestBody CheckVisitedDTO checkVisitedDTO) {
@@ -78,6 +92,8 @@
        visits.setSourceType(Constants.ZERO);
        return ApiResponse.success("查询成功", visitsService.createFk(visits,false,Constants.ZERO));
    }
    @ApiOperation(value = "来访事由", notes = "来访事由")
    @PostMapping("/visitReason")
    public ApiResponse<List<VisitReason>> visitReason() {
server/visits/dmvisit_service/src/main/java/com/doumee/core/dingTalk/DingTalk.java
@@ -105,6 +105,19 @@
    }
    public OapiV2UserGetuserinfoResponse.UserGetByCodeResponse  getDDUserByCode(String code) throws ApiException {
        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/getuserinfo");
        OapiV2UserGetuserinfoRequest req = new OapiV2UserGetuserinfoRequest();
        req.setCode(code);
        OapiV2UserGetuserinfoResponse rsp = client.execute(req, getToken());
        if(rsp.getErrcode().equals(Constants.DD_ERR_CODE)){
           return  rsp.getResult();
        }else{
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),rsp.getMessage());
        }
    }
    /**
     * å…¨é‡åŒæ­¥ éƒ¨é—¨ä¿¡æ¯
     * æŽ¥å£æ–‡æ¡£åœ°å€ https://open.dingtalk.com/document/orgapp/obtain-the-department-list-v2
@@ -364,6 +377,41 @@
        }
    }
    public void workInfoOANotice(Long agentId,String userIds,OapiMessageCorpconversationAsyncsendV2Request.Msg msg)throws ApiException {
        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2");
        OapiMessageCorpconversationAsyncsendV2Request request = new OapiMessageCorpconversationAsyncsendV2Request();
        request.setAgentId(agentId);
        request.setUseridList(userIds);
        request.setToAllUser(false);
//        OapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg();
//        msg.setMsgtype("oa");
//        OapiMessageCorpconversationAsyncsendV2Request.OA oa = new OapiMessageCorpconversationAsyncsendV2Request.OA();
//        oa.setMessageUrl("");
//        OapiMessageCorpconversationAsyncsendV2Request.Head head = new OapiMessageCorpconversationAsyncsendV2Request.Head();
//        head.setText("");
//        head.setBgcolor("#279BAA");
//
//        oa.setHead(head);
//
//        OapiMessageCorpconversationAsyncsendV2Request.Body body = new OapiMessageCorpconversationAsyncsendV2Request.Body();
//        body.setTitle("");
//        List<OapiMessageCorpconversationAsyncsendV2Request.Form> form = new ArrayList<>();
//
//        body.setForm(form);
//        oa.setBody(body);
//        msg.setOa(oa);
        request.setMsg(msg);
        OapiMessageCorpconversationAsyncsendV2Response rsp = client.execute(request, getToken());
        if(rsp.getErrcode().equals(Constants.DD_ERR_CODE)){
        }else{
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),rsp.getMessage());
        }
    }
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/DDAuthorizeVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.doumee.dao.web.response;
import com.doumee.dao.business.model.Member;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/12/7 11:19
 */
@Data
public class DDAuthorizeVO {
    @ApiModelProperty(value = "授权 unionId ")
    private String unionId;
    @ApiModelProperty(value = "用户token")
    private String token;
    @ApiModelProperty(value = "用户信息")
    private Member member;
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/MemberService.java
@@ -1,5 +1,6 @@
package com.doumee.service.business;
import com.doumee.dao.web.response.DDAuthorizeVO;
import com.doumee.service.business.third.model.LoginUserInfo;
import com.doumee.service.business.third.model.PageData;
import com.doumee.service.business.third.model.PageWrap;
@@ -13,6 +14,7 @@
import com.doumee.dao.web.reqeust.VisitMemberDTO;
import com.doumee.dao.web.response.MemberVO;
import com.doumee.dao.web.response.WxAuthorizeVO;
import com.taobao.api.ApiException;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
@@ -172,6 +174,7 @@
     */
    WxAuthorizeVO wxAuthorize(String code,Integer source);
    DDAuthorizeVO ddAuthorize(String code, Integer source) throws ApiException;
    List<MemberVO> getVisitedMember(CheckVisitedDTO checkVisitedDTO);
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -9,6 +9,7 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.dingtalk.api.response.OapiV2DepartmentGetResponse;
import com.dingtalk.api.response.OapiV2UserGetResponse;
import com.dingtalk.api.response.OapiV2UserGetuserinfoResponse;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.config.DataSyncConfig;
import com.doumee.core.annotation.excel.ExcelImporter;
@@ -22,6 +23,7 @@
import com.doumee.core.haikang.model.param.respose.UserAddResponse;
import com.doumee.core.haikang.model.param.respose.UserDelResponse;
import com.doumee.core.haikang.service.HKService;
import com.doumee.dao.web.response.DDAuthorizeVO;
import com.doumee.service.business.third.TmsService;
import com.doumee.service.business.third.model.LoginUserInfo;
import com.doumee.service.business.third.model.PageData;
@@ -1845,6 +1847,12 @@
        return wxAuthorizeVO;
    }
    /**
     * å¾®ä¿¡æŽˆæƒ å†…部人员登录
     * @param wxAuthorizeVO
     * @param openId
     * @param source
     */
    private void dealSystemUserAuthBiz(WxAuthorizeVO wxAuthorizeVO, String openId, Integer source) {
        SystemUser user = systemUserMapper.selectOne(new QueryWrapper<SystemUser>().lambda()
                .eq(SystemUser::getOpenid,openId)
@@ -1874,6 +1882,44 @@
            wxAuthorizeVO.setToken(token);
        }
    }
    /**
     * é’‰é’‰æŽˆæƒèŽ·å–å†…éƒ¨äººå‘˜ç™»å½•ä¿¡æ¯
     * @param ddAuthorizeVO
     * @param unionId
     * @param source
     */
    private void dealSystemUserAuthBizByDD(DDAuthorizeVO ddAuthorizeVO, String unionId, Integer source) {
        SystemUser user = systemUserMapper.selectOne(new QueryWrapper<SystemUser>().lambda()
                .eq(SystemUser::getDdUnionId,unionId)
                .in(SystemUser::getType,Constants.memberType.internal)
                .eq(SystemUser::getDeleted,Constants.ZERO)
                .last(" limit 1 "));
        //非访客用户 è¿›è¡Œåˆ¤æ–­æ˜¯å¦å­˜åœ¨ç”¨æˆ·
        if(!Objects.isNull(user)){
            Member member = memberMapper.selectById(user.getMemberId());
            if(member == null || member.getIsdeleted() == Constants.ONE){
                return;
//                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"用户已删除,请联系管理员");
            }
            if(member.getStatus() != Constants.ZERO){
                return;
//                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"用户已禁用,请联系管理员");
            }
            if(StringUtils.isNotBlank(member.getIdcardNo())){
                member.setIdcardDecode(DESUtil.decrypt(Constants.EDS_PWD, member.getIdcardNo()));
            }
            String prefixUrl = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode() +
                    systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
            member.setPrefixUrl(prefixUrl);
            ddAuthorizeVO.setMember(member);
            //司机 ä¸Ž å†…部人员 æä¾›token
            String token = systemLoginService.loginByUserId(user.getId());
            ddAuthorizeVO.setToken(token);
        }
    }
    private void dealDriverUserAuthBiz(WxAuthorizeVO wxAuthorizeVO, String openId, Integer source) {
        SystemUser user = systemUserMapper.selectOne(new QueryWrapper<SystemUser>().lambda()
                .eq(SystemUser::getOpenid,openId)
@@ -2568,5 +2614,45 @@
        }
    }
    /**
     * é’‰é’‰æŽˆæƒç™»å½•
     * @param code
     * @param source
     * @return
     * @throws ApiException
     */
    @Override
    public DDAuthorizeVO ddAuthorize(String code, Integer source) throws ApiException {
        if(StringUtils.isBlank(code)||Objects.isNull(source)){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        OapiV2UserGetuserinfoResponse.UserGetByCodeResponse userGetByCodeResponse = dingTalk.getDDUserByCode(code);
        if(Objects.isNull(userGetByCodeResponse)
                || StringUtils.isBlank(userGetByCodeResponse.getUnionid())){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"钉钉授权失败");
        }
        String unionId = userGetByCodeResponse.getUnionid();
        DDAuthorizeVO ddAuthorizeVO = new DDAuthorizeVO();
        if(StringUtils.isBlank(unionId)){
            return ddAuthorizeVO;
        }
        ddAuthorizeVO.setUnionId(unionId);
//        if(source==1){
//            //处理普通访客人员自动授权逻辑
//            dealVisitUserAuthBiz(wxAuthorizeVO,openId,source);
//        }else if(source == 3){
//            //处理tms管控人员自动授权逻辑
//            dealGkUserAuthBiz(wxAuthorizeVO,openId,source);
//        }else if(source == 0){
//            //如果是司机,则从system_user查询
//            dealDriverUserAuthBiz(wxAuthorizeVO,openId,source);
//        }else{
            //如果是内部人员,则从system_user查询
            dealSystemUserAuthBizByDD(ddAuthorizeVO,unionId,source);
//        }
        return ddAuthorizeVO;
    }
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java
@@ -258,24 +258,6 @@
        //初始化访客信息
        initVisitInfo(visits,date);
//        if(StringUtils.isNotBlank(visits.getFaceImg())&&(Constants.equalsInteger(visits.getType(),Constants.ZERO)|| Constants.equalsInteger(visits.getType(),Constants.TWO))){
//            //人脸评分
//            FacePictureCheckRequest param = new FacePictureCheckRequest();
//            String prefixUrl = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_LOCAL_RESOURCE_PATH).getCode() +
//                    systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
//            param.setFacePicUrl(prefixUrl + visits.getFaceImg());
//            BaseResponse<FacePictureCheckResponse> response = HKService.facePictureCheck(param);
//            if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)){
//                throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,人脸评分获取数据失败~");
//            }
//            FacePictureCheckResponse facePictureCheckResponse = response.getData();
//            if(Objects.isNull(facePictureCheckResponse) || Objects.isNull(facePictureCheckResponse.getCheckResult())){
//                throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,人脸评分获取数据失败~");
//            }
//            if(!facePictureCheckResponse.getCheckResult()){
//                throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), facePictureCheckResponse.getStatusMessage());
//            }
//        }
        visits.setSendTimeOutNotice(Constants.ZERO);
        visitsMapper.insert(visits);