浏览代码

互联网医院

Trick 5 年之前
父节点
当前提交
a0f15c003f

+ 192 - 93
server/svr-authentication/src/main/java/com/yihu/jw/security/core/userdetails/jdbc/WlyyUserDetailsService.java

@ -118,10 +118,12 @@ public class WlyyUserDetailsService extends JdbcDaoSupport implements UserDetail
        } else if ("2".equals(loginType)) {//2.为医生账号
            //解除锁定
            this.getJdbcTemplate().update("update base_doctor d set d.login_failure_count = 0, d.locked = 0 where d.mobile = ? or d.idcard = ?", username, username);
        } else if ("3".equals(loginType) || "4".equals(loginType)) { //3.患者账号
        } else if ("3".equals(loginType)) { //3.患者账号
            //解除锁定
            this.getJdbcTemplate().update("update base_patient p set p.login_failure_count = 5, p.locked = 0 where p.mobile = ? or p.idcard = ?", username, username);
        } //...
        } else if("4".equals(loginType)){
            this.getJdbcTemplate().update("update base_patient p set p.login_failure_count = 5, p.locked = 0 where p.mobile = ? or p.idcard = ?", username, getIdcard());
        }//...
    }
    /**
@ -155,98 +157,174 @@ public class WlyyUserDetailsService extends JdbcDaoSupport implements UserDetail
                redisTemplate.delete(BespeakRegist + username);
            }
            users = this.getJdbcTemplate().query(DEFAULT_PATIENT_DETAILS_STATEMENT, new BeanPropertyRowMapper(WlyyUserDetails.class), username, username);
            // 去i健康查询用户
            // 第三方同步居民,端查询用户
        }else if("4".equals(loginType)){
            users = this.getJdbcTemplate().query(DEFAULT_PATIENT_DETAILS_IDCARD_STATEMENT, new BeanPropertyRowMapper(WlyyUserDetails.class), getIdcard());
            if ((null == users || users.size() == 0) && "4".equals(loginType)) {
                List<NameValuePair> params = new ArrayList<>();
                params.add(new BasicNameValuePair("clientId", getClientId()));
                ClientDetails clientDetails = clientDetailsService.loadClientByClientId(getClientId());
                params.add(new BasicNameValuePair("clientSecret", clientDetails.getClientSecret()));
                params.add(new BasicNameValuePair("code", username));
                params.add(new BasicNameValuePair("openid", getOpenid()));
                String res = null;
                try{
                    res = httpClientUtil.post(iHealthUserInfoUrl, params, "UTF-8");
                }catch (Exception e){
                    logger.error("远程请求i健康用户信息异常:" + e.getMessage());
                    return users;
                }
                if(null == res){
                    return users;
                }
                JSONObject patient = JSONObject.parseObject(res);
                if(patient.getInteger("status") == -1){
                    logger.error("去i健康查询用户信息失败:" + patient.getString("error"));
                    return users;
                }
                try {
                    String salt = randomString(5);
                    String idcard = patient.getString("idcard");
                    String pw = idcard.substring(idcard.length()-6);
                    this.getJdbcTemplate().update(DEFAULT_PATIENT_INSERT_STATEMENT,
                            new Object[]{patient.getString("code"),
                                    patient.getString("photo"),
                                    patient.getString("idcard"),
                                    MD5.md5Hex(pw + "{" + salt + "}"),
                                    patient.getString("salt"),
                                    patient.getString("name"),
                                    patient.getDate("birthday"),
                                    patient.getInteger("sex"),
                                    patient.getString("mobile"),
                                    patient.getString("province"),
                                    patient.getString("provinceName"),
                                    patient.getString("city"),
                                    patient.getString("cityName"),
                                    patient.getString("town"),
                                    patient.getString("townName"),
                                    patient.getString("street"),
                                    patient.getString("streetName"),
                                    patient.getString("address"),
                                    1,
                                    0,
                                    1,
                                    0,
                                    new Date()
                            }
                    );
                }catch (Exception e){
                    logger.error("将i健康居民数据同步到互联网医院居民表失败:" + e.getMessage());
                    return users;
                }
                try {
                    this.getJdbcTemplate().update(PATIENT_INSERT_WEHCAT,
                            new Object[]{
                                    UUID.randomUUID().toString(),
                                    getWechatId(),
                                    patient.getString("code"),
                                    getOpenid(),
                                    new Date()
                            }
                    );
                }catch (Exception e){
                    logger.error("将i健康居民微信openid数据同步到互联网医院居民微信关联表失败:" + e.getMessage());
                    return users;
                }
            users = this.getJdbcTemplate().query(DEFAULT_PATIENT_DETAILS_STATEMENT, new BeanPropertyRowMapper(WlyyUserDetails.class),username,getIdcard());
            if (null == users || users.size() == 0) {
                //厦门I健康账号同步
                if("xm_ihealth_wx".equals(getWechatId())){
                    List<NameValuePair> params = new ArrayList<>();
                    params.add(new BasicNameValuePair("clientId", getClientId()));
                    ClientDetails clientDetails = clientDetailsService.loadClientByClientId(getClientId());
                    params.add(new BasicNameValuePair("clientSecret", clientDetails.getClientSecret()));
                    params.add(new BasicNameValuePair("code", username));
                    params.add(new BasicNameValuePair("openid", getOpenid()));
                    String res = null;
                    try{
                        res = httpClientUtil.post(getSynPath(getWechatId()), params, "UTF-8");
                    }catch (Exception e){
                        logger.error("远程请求i健康用户信息异常:" + e.getMessage());
                        return users;
                    }
                    if(null == res){
                        return users;
                    }
                    JSONObject patient = JSONObject.parseObject(res);
                    if(patient.getInteger("status") == -1){
                        logger.error("去i健康查询用户信息失败:" + patient.getString("error"));
                        return users;
                    }
                    try {
                        String salt = randomString(5);
                        String idcard = patient.getString("idcard");
                        String pw = idcard.substring(idcard.length()-6);
                        this.getJdbcTemplate().update(DEFAULT_PATIENT_INSERT_STATEMENT,
                                new Object[]{patient.getString("code"),
                                        patient.getString("photo"),
                                        patient.getString("idcard"),
                                        MD5.md5Hex(pw + "{" + salt + "}"),
                                        salt,
                                        patient.getString("name"),
                                        patient.getDate("birthday"),
                                        patient.getInteger("sex"),
                                        patient.getString("mobile"),
                                        patient.getString("province"),
                                        patient.getString("provinceName"),
                                        patient.getString("city"),
                                        patient.getString("cityName"),
                                        patient.getString("town"),
                                        patient.getString("townName"),
                                        patient.getString("street"),
                                        patient.getString("streetName"),
                                        patient.getString("address"),
                                        1,
                                        0,
                                        1,
                                        0,
                                        new Date()
                                }
                        );
                    }catch (Exception e){
                        logger.error("将i健康居民数据同步到互联网医院居民表失败:" + e.getMessage());
                        return users;
                    }
                    try {
                        this.getJdbcTemplate().update(PATIENT_INSERT_WEHCAT,
                                new Object[]{
                                        UUID.randomUUID().toString(),
                                        getWechatId(),
                                        patient.getString("code"),
                                        getOpenid(),
                                        new Date()
                                }
                        );
                    }catch (Exception e){
                        logger.error("将i健康居民微信openid数据同步到互联网医院居民微信关联表失败:" + e.getMessage());
                        return users;
                    }
                    WlyyUserDetails user = new WlyyUserDetails();
                    user.setName(patient.getString("name"));
                    user.setPassword(patient.getString("password"));
                    if(patient.getInteger("sex") == 1){
                        user.setGender(WlyyUserDetails.Gender.male);
                    }else if(patient.getInteger("sex") == 2){
                        user.setGender(WlyyUserDetails.Gender.female);
                    }
                    user.setId(username);
                    user.setIdcard(patient.getString("idcard"));
                    user.setMobile(patient.getString("mobile"));
                    user.setEnabled(true);
                    user.setLocked(false);
                    user.setLockedDate(null);
                    users.add(user);
                }else if("xm_zsyy_wx".equals(getWechatId())){
                    List<NameValuePair> params = new ArrayList<>();
                    params.add(new BasicNameValuePair("openid", getOpenid()));
                    String res = null;
                    try{
                        res = httpClientUtil.post(getSynPath("xm_zsyy_wx"), params, "UTF-8");
                    }catch (Exception e){
                        logger.error("远程请求中山医院用户信息异常:" + e.getMessage());
                        return users;
                    }
                    if(null == res){
                        return users;
                    }
                    JSONObject object1 = JSONObject.parseObject(res);
                    if (null != object1&&null!=object1.get("status") && "200".equals(object1.get("status").toString())) {
                        JSONObject patient = object1.getJSONObject("userinfo");
                        String salt = randomString(5);
                        String mobile = patient.getString("mobile");
                        String pw = mobile.substring(mobile.length()-6);
                        try {
                            this.getJdbcTemplate().update(DEFAULT_PATIENT_INSERT_STATEMENT,
                                    new Object[]{patient.getString("id"),
                                            null,
                                            patient.getString("idcard"),
                                            MD5.md5Hex(pw + "{" + salt + "}"),
                                            salt,
                                            patient.getString("name"),
                                            patient.getDate("birthday"),
                                            patient.getInteger("sex"),
                                            mobile,
                                            null,
                                            null,
                                            null,
                                            null,
                                            null,
                                            null,
                                            null,
                                            null,
                                            null,
                                            1,
                                            0,
                                            1,
                                            0,
                                            new Date()
                                    }
                            );
                        }catch (Exception e){
                            logger.error("将中山医院居民数据同步到互联网医院居民表失败:" + e.getMessage());
                            return users;
                        }
                        WlyyUserDetails user = new WlyyUserDetails();
                        user.setName(patient.getString("name"));
                        user.setPassword(MD5.md5Hex(pw + "{" + salt + "}"));
                        if(patient.getInteger("sex") == 1){
                            user.setGender(WlyyUserDetails.Gender.male);
                        }else if(patient.getInteger("sex") == 2){
                            user.setGender(WlyyUserDetails.Gender.female);
                        }
                        user.setId(patient.getString("id"));
                        user.setIdcard(patient.getString("idcard"));
                        user.setMobile(patient.getString("mobile"));
                        user.setEnabled(true);
                        user.setLocked(false);
                        user.setLockedDate(null);
                        users.add(user);
                    }else{
                        logger.error("远程请求中山医院用户信息异常:" + res.toString());
                        return users;
                    }
                WlyyUserDetails user = new WlyyUserDetails();
                user.setName(patient.getString("name"));
                user.setPassword(patient.getString("password"));
                if(patient.getInteger("sex") == 1){
                    user.setGender(WlyyUserDetails.Gender.male);
                }else if(patient.getInteger("sex") == 2){
                    user.setGender(WlyyUserDetails.Gender.female);
                }
                user.setId(username);
                user.setIdcard(patient.getString("idcard"));
                user.setMobile(patient.getString("mobile"));
                user.setEnabled(true);
                user.setLocked(false);
                user.setLockedDate(null);
                users.add(user);
            }
        }
        return users;
@ -313,6 +391,8 @@ public class WlyyUserDetailsService extends JdbcDaoSupport implements UserDetail
            result = this.getJdbcTemplate().queryForMap("select d.login_failure_count,d.last_login_failure_time from base_doctor d where d.mobile = ? or d.idcard = ?", username, username);
        } else if ("3".equals(loginType)) { //3.患者账号
            result = this.getJdbcTemplate().queryForMap("select p.login_failure_count,p.last_login_failure_time from base_patient p where p.mobile = ? or p.idcard = ?", username, username);
        } else if ("4".equals(loginType)) { //4.第三方患者账号
            result = this.getJdbcTemplate().queryForMap("select p.login_failure_count,p.last_login_failure_time from base_patient p where p.mobile = ? or p.idcard = ?", username, getIdcard());
        }
        return result;
    }
@ -333,7 +413,10 @@ public class WlyyUserDetailsService extends JdbcDaoSupport implements UserDetail
        } else if ("3".equals(loginType)) { //3.患者账号
            //账号锁定
            this.getJdbcTemplate().update("update base_patient p set p.login_failure_count = 5, p.locked = 1, p.locked_date = ?  where p.mobile = ? or p.idcard = ?", new Date(), username, username);
        } //...
        }else if ("4".equals(loginType)) { //3.同步的患者账号
            //账号锁定
            this.getJdbcTemplate().update("update base_patient p set p.login_failure_count = 5, p.locked = 1, p.locked_date = ?  where p.mobile = ? or p.idcard = ?", new Date(), username, getIdcard());
        }  //...
    }
    /**
@ -353,6 +436,9 @@ public class WlyyUserDetailsService extends JdbcDaoSupport implements UserDetail
        } else if ("3".equals(loginType)) { //3.患者账号
            //更新失败次数
            this.getJdbcTemplate().update("update base_patient p set p.login_failure_count = ? ,p.last_login_failure_time = ? where p.mobile = ? or p.idcard = ?", loginFailureCount, new Date(), username, username);
        } else if ("4".equals(loginType)) { //4.第三方同步患者账号
            //更新失败次数
            this.getJdbcTemplate().update("update base_patient p set p.login_failure_count = ? ,p.last_login_failure_time = ? where p.mobile = ? or p.idcard = ?", loginFailureCount, new Date(), username, getIdcard());
        } //...
    }
@ -392,7 +478,7 @@ public class WlyyUserDetailsService extends JdbcDaoSupport implements UserDetail
            users = this.getJdbcTemplate().query(DEFAULT_PATIENT_DETAILS_STATEMENT, new BeanPropertyRowMapper(WlyyUserSimple.class), username, username);
        } else if("4".equals(loginType)){
            //更新登录时间
            this.getJdbcTemplate().update("update base_patient p set p.login_failure_count = 0, p.login_date = ? where p.mobile = ? or p.idcard = ?", new Date(), username, username);
            this.getJdbcTemplate().update("update base_patient p set p.login_failure_count = 0, p.login_date = ? where p.mobile = ? or p.idcard = ?", new Date(), username, getIdcard());
            users = this.getJdbcTemplate().query(DEFAULT_PATIENT_DETAILS_IDCARD_STATEMENT, new BeanPropertyRowMapper(WlyyUserSimple.class), getIdcard());
        }
@ -485,6 +571,19 @@ public class WlyyUserDetailsService extends JdbcDaoSupport implements UserDetail
        this.getJdbcTemplate().update("update base_patient p set p.openid = ? where p.id= ?", openid, userId);
    }
    public String getSynPath(String wxId){
        String sql = "SELECT w.syn_path AS sysPath FROM wx_wechat w WHERE w.id ='"+wxId+"'";
        List<Map<String,Object>> list = this.getJdbcTemplate().queryForList(sql);
        if(list!=null&&list.size()>0){
            return (String)list.get(0).get("sysPath");
        }else{
            logger.error("getSynPath error");
        }
        return "";
    }
    public String randomString(int length) {
        String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        StringBuffer buffer = new StringBuffer();

+ 2 - 1
server/svr-authentication/src/main/java/com/yihu/jw/security/oauth2/provider/endpoint/WlyyLoginEndpoint.java

@ -104,7 +104,7 @@ public class WlyyLoginEndpoint extends AbstractEndpoint {
     *                    captcha 验证码
     *                    password 密码
     *                    username 用户名/手机/身份证号
     *                    login_type 用户类型 1或默认为user,2:医生登录,3:患者登录
     *                    login_type 用户类型 1或默认为user,2:医生登录,3:患者登录,4:第三方同步账号登录
     * @param httpSession
     * @return
     * @throws Exception
@ -127,6 +127,7 @@ public class WlyyLoginEndpoint extends AbstractEndpoint {
                String password = com.yihu.jw.security.utils.RSAUtils.decryptBase64(parameters.get("password"), keyPair);
                parameters.put("password", password);
            } else {
                //第三方同步账号模式登录
                parameters.put("grant_type", "ihealthCode");
            }
        } else {