fs-danaus
2023-06-26 2e5389660d216dabf6ebee15e7a3fa6eab73d01d
src/com/yc/action/login/LoginAction.java
@@ -1,36 +1,67 @@
package com.yc.action.login;
import com.alibaba.fastjson.JSON;
import com.google.gson.Gson;
import com.yc.action.BaseAction;
import com.yc.action.grid.GridUtils;
import com.yc.api.bean.Gfrom;
import com.yc.api.bean.QrScanType;
import com.yc.api.bean.attendance.AppSalesSetting;
import com.yc.api.controller.QrCodeController;
import com.yc.api.service.QrServiceIfc;
import com.yc.api.utils.VersionUtils;
import com.yc.app.v2.entity.SysUserConfigEntity;
import com.yc.entity.*;
import com.yc.entity.attachment.AttachmentEntity;
import com.yc.exception.ApplicationException;
import com.yc.exception.CallBackMessage;
import com.yc.factory.FactoryBean;
import com.yc.factory.InitSystem;
import com.yc.im.util.RedisSocket;
import com.yc.jpush.JpushAction;
import com.yc.listener.SessionListener;
import com.yc.multiData.MultiDataSource;
import com.yc.multiData.SpObserver;
import com.yc.open.utils.HttpClientUtil;
import com.yc.sdk.WebSocketMessage.action.WebSocketMessageServer;
import com.yc.sdk.WebSocketMessage.entity.MessageInfo;
import com.yc.sdk.WebSocketMessage.entity.MessageType;
import com.yc.sdk.WebSocketMessage.entity.WsMessageUserEntity;
import com.yc.sdk.gaodemap.action.GdMapServiceInit;
import com.yc.sdk.gaodemap.api.GdMapService;
import com.yc.sdk.gaodemap.entity.GdErrorException;
import com.yc.sdk.gaodemap.entity.RegeoCodeEntity;
import com.yc.sdk.password.action.ChangePassword;
import com.yc.sdk.shopping.action.VerificationCodes;
import com.yc.sdk.shopping.action.api.InvitationCode;
import com.yc.sdk.shopping.service.sms.SendSMSMessagesIfc;
import com.yc.sdk.shopping.util.SettingKey;
import com.yc.sdk.weixinmp.util.UserAgentUtil;
import com.yc.sdk.weixinopen.entity.OpenComponentAppSetting;
import com.yc.service.BaseService;
import com.yc.service.demo.DemoIfc;
import com.yc.service.role.RoleIfc;
import com.yc.service.upload.AttachmentIfc;
import com.yc.service.user.EquipmentEntry;
import com.yc.service.user.LoginEquipmentIfc;
import com.yc.service.user.LoginRecordIfc;
import com.yc.service.user.UserAccountServiceIfc;
import com.yc.utils.*;
import eu.bitwalker.useragentutils.UserAgent;
import me.chanjar.weixin.common.util.http.URIUtil;
import okio.Source;
import org.apache.commons.lang.StringUtils;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -43,6 +74,7 @@
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
//@Scope("request")
@Controller
@@ -55,11 +87,17 @@
    private RoleIfc rIfc;
    @Autowired
    private DemoIfc demoIfc;
    //@Autowired
    //RedisClusterClient redisClusterClient;
    @Autowired
    ThreadPoolTaskExecutor threadPoolExecutor;
    @Autowired
    LoginEquipmentIfc loginEquipmentIfc;
    @Autowired
    SendSMSMessagesIfc sms ;
    @Autowired
    RedisTemplate redisTemplate;
    final Logger log = LoggerFactory.getLogger(this.getClass());
    private static String attachment_server = AttachmentConfig.get("attachment.server");
    ;
    private int prossSN(String cltsn) {
        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
@@ -76,7 +114,7 @@
        return r;
    }
   @RequestMapping("/login.do")
    @RequestMapping("/login.do")
    public String login(HttpServletRequest request, HttpServletResponse response) {
        String userCode = request.getParameter("account");
        if (userCode == null || "".equals(userCode)) {
@@ -156,22 +194,29 @@
        UserAccountEntity userAccount = null;
        // -------处理原生APP登录,通过手机号,注册时的密码 by danaus 2018-8-24
        // 1---有dbid的情况表明是通过选择一个数据源进行登录操作
        if (VersionUtils.getAPPTypeName(request) != null) {// ios,adnroid调用
        if (VersionUtils.getAPPTypeName(request) != null) {// ios,android调用
            try {
                InvitationCode invitationCode = (InvitationCode) FactoryBean.getBean("invitationCode");
                // userCode代表手机号 (在方法 invitationCode.getDbList() 切换数据源 )
                invitationCode.checkPasswordByTelephone(userCode, password, dbId);
                // 通过数据源id和手机号取得用户usercode进行登录,这时候不需要密码验证
                SpObserver.setDBtoInstance("_" + dbId);
                userAccount = userAccountService.getUserInfoByTelephone(userCode);//userCode 手机号
                if (userAccount != null) {
                    userAccount.setApp_userCode(userCode);
                    if(userAccount.isInActive()){
                        print2(response, "【" + userCode + "】手机号码已被停用,禁止登录本系统", redirect, isApp);
                        return null;// 验证出错返回
                    }
                    userAccount.setApp_userCode(userCode);//手机号
                    userAccount.setApp_Password(password);
                    userCode = userAccount.getUserCode();//转成ERP的usercode进行登陆
                    password = userAccount.getPassword();//转成ERP的密码进行登陆
                    ch_userid = true;
                    //---处理极光别名绑定过多(>10个)的情况,需要查询绑定数量,超过8个则需要删除最后一个,以保证客户端别名设置没问题
                    this.processJiguangAliases(userCode,dbId);
                } else {
                    print2(response, "【" + userCode + "】手机号码在ERP系统没有对应的用户信息或已停用", redirect, isApp);
                    print2(response, "【" + userCode + "】手机号码未开通ERP系统服务,登录失败", redirect, isApp);
                    return null;// 验证出错返回'
                }
            } catch (DataAccessException e) {
@@ -187,38 +232,40 @@
            }
        }
        //这里是短信登录 xin 2020-8-20 11:25:59
        String phone=request.getParameter("telephone");
        phone=(phone==null?"":phone);
        String phoneCode=request.getParameter("phoneCode");
        phoneCode=(phoneCode==null?"":phoneCode);
        if(StringUtils.isBlank(userCode) && !StringUtils.isBlank(phone) && !StringUtils.isBlank(phoneCode)) {
           try {
               @SuppressWarnings("rawtypes")
            RedisTemplate redisTemplate = (RedisTemplate) FactoryBean.getBean("redisTemplate");
              if(!redisTemplate.hasKey("CODE:" + phone + ":" + dbId)) {
                 print2(response, "验证码已失效,请重新获取验证码。", redirect, isApp);
                 return null;
              }
              if(!phoneCode.equals(redisTemplate.opsForValue().get("CODE:" + phone + ":" + dbId)+"")) {
                 print2(response, "验证码错误,请输入正确的验证码", redirect, isApp);
                 return null;
              }
              redisTemplate.delete("CODE:" + phone + ":" + dbId);//删除
              SpObserver.setDBtoInstance("_" + dbId);
       String phone = request.getParameter("telephone");
        phone = (phone == null ? "" : phone);
        String phoneCode = request.getParameter("phoneCode");
        phoneCode = (phoneCode == null ? "" : phoneCode);
        if (StringUtils.isBlank(userCode) && !StringUtils.isBlank(phone) && !StringUtils.isBlank(phoneCode)) {
            try {
                if (!redisTemplate.hasKey("CODE:" + phone + ":" + dbId)) {
                    print2(response, "验证码已失效,请重新获取验证码。", redirect, isApp);
                    return null;
                }
                if (!phoneCode.equals(redisTemplate.opsForValue().get("CODE:" + phone + ":" + dbId) + "")) {
                    print2(response, "验证码错误,请输入正确的验证码", redirect, isApp);
                    return null;
                }
                redisTemplate.delete("CODE:" + phone + ":" + dbId);//删除
                SpObserver.setDBtoInstance("_" + dbId);
                userAccount = userAccountService.getUserInfoByTelephone(phone);//phone 手机号
                if (userAccount != null) {
                    if(userAccount.isInActive()){
                        print2(response, "【" + phone + "】手机号码已被停用,禁止登录本系统", redirect, isApp);
                        return null;// 验证出错返回'
                    }
                    userCode = userAccount.getUserCode();//转成ERP的usercode进行登陆
                    password = userAccount.getPassword();//转成ERP的密码进行登陆
                }else {
                    print2(response, "【" + phone + "】手机号码在ERP系统没有对应的用户信息或已停用", redirect, isApp);
                     return null;// 验证出错返回'
                } else {
                    print2(response, "【" + phone + "】手机号码未开通ERP系统服务,登录失败", redirect, isApp);
                    return null;// 验证出错返回'
                }
         } catch (Exception e) {
             print2(response, "【" + phone + "】手机号码在ERP系统没有对应的用户信息或已停用", redirect, isApp);
                 return null;// 验证出错返回'
         }finally {
             SpObserver.setDBtoInstance();
         }
            } catch (Exception e) {
                print2(response, this.getErrorMsg(e), redirect, isApp);
                return null;// 验证出错返回'
            } finally {
                SpObserver.setDBtoInstance();
            }
        }
        //----------------
        // --------
@@ -229,6 +276,10 @@
                dbId = isone;
            session.setAttribute(SessionKey.DATA_BASE_ID, dbId);
            session.setAttribute(SessionKey.DATABASE_DIS, dataBaseDis);
            // 如果domain为空,则取默认的域名 by danaus 2021/4/12 11:18
            if (org.apache.commons.lang3.StringUtils.isBlank(domain)) {
                domain = SettingKey.getHostUrl(request);
            }
            session.setAttribute(SessionKey.DOMAIN, domain);
        }
        if (StringUtils.isBlank(userCode)) {
@@ -301,7 +352,6 @@
                return null;// 验证出错返回
            }
            // 检查限制用户登录时间和登录IP
            int s = 0;
            try {
                SpObserver.setDBtoInstance("_" + dbId);
@@ -315,7 +365,6 @@
            }
            //
            // 设置session
            try {
                if (userAccount == null) {
                    SpObserver.setDBtoInstance("_" + dbId);
@@ -329,20 +378,26 @@
                        userAccount = userAccountService.getUserInfoByEmail(userCode);   //允许邮箱号登录
                    }
                }
            } finally {
            }catch (Exception e){
                this.print2(response, this.getErrorMsg(e), request.getParameter("redirect"), isApp);
                return null;
            }finally {
                SpObserver.setDBtoInstance();
            }
            if (userAccount == null) {
                try {
                    SpObserver.setDBtoInstance("_" + dbId);
                    record.loginRecord(userCode, password, IPUtil.getIpAddr(request));// 记录登录登录失败的信息
                }catch (Exception e){
                    this.print2(response, this.getErrorMsg(e), request.getParameter("redirect"), isApp);
                    return null;
                } finally {
                    SpObserver.setDBtoInstance();
                }
                if (ch_userid) {
                    return "{\"ch_error\":\"ch_user_error\",\"info\":\"用户账号不存在!\"}";
                    return "{\"ch_error\":\"ch_user_error\",\"info\":\"未开通ERP系统服务,登录失败!\"}";
                } else {
                    this.print2(response, "用户账号不存在!", request.getParameter("redirect"), isApp);
                    this.print2(response, "未开通ERP系统服务,登录失败!", request.getParameter("redirect"), isApp);
                    return null;
                }
            }
@@ -351,6 +406,9 @@
                    try {
                        SpObserver.setDBtoInstance("_" + dbId);
                        record.loginRecord(userCode, password, IPUtil.getIpAddr(request));// 记录登录登录失败的信息
                    }catch (Exception e){
                        this.print2(response, this.getErrorMsg(e), request.getParameter("redirect"), isApp);
                        return null;
                    } finally {
                        SpObserver.setDBtoInstance();
                    }
@@ -361,37 +419,78 @@
                this.print2(response, ex.getMessage(), request.getParameter("redirect"), isApp);
                return null;
            }
            // 判断用户APP登录时是否禁用
            if (isApp && userAccount.getActiveApp() == 1) {
                this.print2(response, "用户APP端禁止登录!如有问题,请联系管理员", request.getParameter("redirect"), isApp);
            // 判断用户登录时是否禁用
            if (userAccount.isInActive()) {
                this.print2(response, "用户账号已禁止登录!如有问题,请联系管理员", request.getParameter("redirect"), isApp);
                return null;
            }
            processLoginUserToSession(ip, dbId, session, userAccount);
            // --------------
            // String ucode = account + Math.random();// 是为了区分用户重复问题,同一用户可以多人使用。
            // session.setAttribute(SessionKey.SAIL_USERCODE, ucode);
            // OnLineUser.setOnlineUser(dataString, ucode, session);
            /*
             * WebApplicationContext webApplicationContext =
             * ContextLoader.getCurrentWebApplicationContext(); ServletContext
             * servletContext =
             * webApplicationContext.getServletContext();//取得ServletContext对象实例
             * if((OnLineUser)servletContext.getAttribute("onlineuserlistener")==null) {
             * OnLineUser onuser=new
             * OnLineUser();//只设置一次,不同于上面日志文件的记录每次会话均设置。即当第一个客户连接到服务器时启动一个全局变量,
             * 此后所有的客户将使用相同的上下文。 servletContext.setAttribute("onlineuserlistener",onuser);//
             * 将监听器对象设置成ServletContext的属性,具有全局范围有效性,即所有的客户均可以取得它的实例。 }
             * session.setAttribute("onlineuserlistener",(OnLineUser)servletContext.
             * getAttribute("onlineuserlistener"));//取出此全局对象,并且将此对象绑定到某个会话中,
             * 此举将促使监听器调用valueBound,计数器加一。
             */
            // session.setAttribute(SessionKey.ONLINE_USERS, new OnLineUser());// 在线人数统计
            // ------------------
            if (isApp) {
                session.setAttribute(SessionKey.USER_LOGIN_TYPE, SessionKey.USER_LOGIN_TYPE_APP);//app 类型
                //判断当前登录设备是否与最新一次登录设备是一样,不一样需要返回给前端,输出短信进行验证登录
            } else if (redirect != null && !"".equals(redirect)) { // 增加登录后重定向页面功能,added by Johns Wang, 2016-02-17
                session.setAttribute(SessionKey.USER_LOGIN_TYPE, SessionKey.USER_LOGIN_TYPE_MINIAPP);//miniapp 类型
            } else {
                session.setAttribute(SessionKey.USER_LOGIN_TYPE, SessionKey.USER_LOGIN_TYPE_WEB);//web 类型
            }
            final DataSourceEntity dataSourceMap = MultiDataSource.getDataSourceMap(dbId);
            //---------------------------------
            if(dataSourceMap.isLoginOnceForOneUserCode()) {
            //开启了账号只能在相同类型设备上登录一个,禁止多方登录
            if (isApp) {
                //---验证当前设备是否为上一次登录设备
                //---1,检查是否有发送SMS验证的标记,有则不需要查,表明之前已查过,跳过下面checkSameEquipmentByLastLogin方法
                final Object object = request.getAttribute("loginByCode");
                if(object==null){
                    EquipmentEntry equipmentEntry=null;
                    try {
                        SpObserver.setDBtoDemo();
                         equipmentEntry = loginEquipmentIfc.checkSameEquipmentByLastLogin(userAccount.getApp_userCode(), request.getHeader("x-app-uniqueIdentifier"));
                    }catch (Exception e){
                        printJson(response, callBackMessage.sendErrorMessage(this.getErrorMsg(e)));
                        return null;
                    }finally {
                        SpObserver.setDBtoInstance();
                    }
                    if(equipmentEntry!=null&& org.apache.commons.lang3.StringUtils.isNotBlank(equipmentEntry.getEquipmentName())) {
                        //log.info(JSON.toJSONString("equipmentEntry:"+equipmentEntry));
                        //2----不相同,则需要SMS进行验证登录
                        session.invalidate();//删除当前会话
                        String error=String.format("已在另一台设备%s登录,登录时间%s,如果需要在本机登录,则需要验证您的身份。",equipmentEntry.getEquipmentName(),equipmentEntry.getLastLogonDate());
                        printJson(response, callBackMessage.sendErrorMessage(error,-1005));
                        return null;
                    }
                }else{
                    this.singleAccount(isApp ? "2" : "1", dbId, userAccount, request);
                }
            }else {
                //限制多设备登录
                this.singleAccount(isApp ? "2" : "1", dbId, userAccount, request);
            }
            }
            processLoginUserToSessionV2(ip, dbId, request, userAccount);
            //-------------------------------
            //--APP用户配置组装成对象输出
            SysUserConfigEntity sysUserConfigEntity=new SysUserConfigEntity();
            sysUserConfigEntity.setSwitchToPageWhenLogonApp(session.getAttribute(SessionKey.SWITCHTOPAGEWHENLOGONAPP)+"");
            sysUserConfigEntity.setSelectNextDocumentWhenApproved(session.getAttribute(SessionKey.SELECTNEXTDOCUMENTWHENAPPROVED)==null?0:Integer.parseInt(session.getAttribute(SessionKey.SELECTNEXTDOCUMENTWHENAPPROVED)+""));
            sysUserConfigEntity.setIsStartupPopupMessages(session.getAttribute(SessionKey.ISSTARTUPPOPUPMESSAGES)==null?0:Integer.parseInt(session.getAttribute(SessionKey.ISSTARTUPPOPUPMESSAGES)+""));
            session.setAttribute("userConfig",sysUserConfigEntity);
            if (isApp) {
                QrServiceIfc qrServiceIfc = (QrServiceIfc) FactoryBean.getBean("qrService");
                try {
                    SpObserver.setDBtoInstance("_" + dbId);
                    AppSalesSetting appSalesSetting = qrServiceIfc.getAppSalesOrderStyle();
                    //加到会话
                    session.setAttribute(SessionKey.APP_SALESORDER_MATCODE_LIST, appSalesSetting.getAppSalesOrderMatCodeList());
                    session.setAttribute(SessionKey.APP_SALESORDER_STYLE, appSalesSetting.getAppSalesOrderStyle());
                } catch (Exception e) {
                    e.printStackTrace();
                    throw new ApplicationException(e.getMessage());
                } finally {
                    SpObserver.setDBtoInstance();
                }
                Map<String, Object> map = new HashMap<String, Object>();
                map.put("success", "ok");
                map.put("sessionid", session.getId());
@@ -413,7 +512,6 @@
                    }
                }
                map.put("avatarUnid", avatarUnid);
                map.put("attachment_server", attachment_server);
                map.put("url", domain == null ? "" : domain);
                if (request.getAttribute("postTokenV2") == null) {
@@ -421,43 +519,67 @@
                }
                //---增加扫码显示方式
                QrServiceIfc qrServiceIfc= (QrServiceIfc) FactoryBean.getBean("qrService");
                QrScanType qrScanType=null;
                QrScanType qrScanType = null;
                //显示下单图标
                int appSalesMenuIcon = 0;
                try {
                    SpObserver.setDBtoInstance("_" + dbId);
                    qrScanType= qrServiceIfc.getQrScanType(userAccount.getUserCode(), userAccount.getUserName());
                }catch (EmptyResultDataAccessException e){
                   //不处理,合理存在的情况
                    qrScanType=new QrScanType();
                }catch (Exception e){
                    qrScanType = qrServiceIfc.getQrScanType(userAccount.getUserCode(), userAccount.getUserName());
                } catch (Exception e) {
                    e.printStackTrace();
                }finally {
                    throw new ApplicationException(e.getMessage());
                } finally {
                    SpObserver.setDBtoInstance();
                }
                //---增加是否可以显示下单图标
                try {
                    SpObserver.setDBtoInstance("_" + dbId);
                    BaseService baseService = (BaseService) FactoryBean.getBean("BaseService");
                    List<Gfrom> list = baseService.getJdbcTemplate().query("select a.formid,a.formname from gform a where exists(select 1 from gfield b where a.formid = b.formid and b.fieldid in ( 'matcode','barcode','qrcode') and b.ScanCodeField = 1 )", new BeanPropertyRowMapper<>(Gfrom.class));
                    if (list != null && list.size() > 0) {
                        QrCodeController qrCodeController = (QrCodeController) FactoryBean.getBean("qrCodeController");
                        List tempList = qrCodeController.procFormLimit(request, list);
                        if (tempList != null && tempList.size() > 0) {
                            appSalesMenuIcon = 1;
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    throw new ApplicationException(e.getMessage());
                } finally {
                    SpObserver.setDBtoInstance();
                }
                map.put("sessionInfo", getSessionInfo(session));
                map.put("isAdmin", session.getAttribute(SessionKey.SUPPER_USER));
                final DataSourceEntity dataSourceMap = MultiDataSource.getDataSourceMap(dbId);
                map.put("isShowAttendance", dataSourceMap.isShowAttendanceButton()?1:0);//打卡
                map.put("userType", session.getAttribute(SessionKey.USERTYPE));
                map.put("isStopSystem", session.getAttribute(SessionKey.isStopSystem));
                map.put("isAdmin", ("SuperUser".equalsIgnoreCase(session.getAttribute(SessionKey.USERTYPE) + "") || "DeveloperUser".equalsIgnoreCase(session.getAttribute(SessionKey.USERTYPE) + "")) ? 1 : 0);//非普通用户都有所有权限
                map.put("isShowAttendance", dataSourceMap.isShowAttendanceButton() ? 1 : 0);//打卡
                map.put("qrDisplayType", qrScanType.getScanMeterialAction());//扫码显示方式
                map.put("appSalesMenuIcon", appSalesMenuIcon);//是否显示下单图标,0不显示,1显示
                map.put("isRelatingMaterialWhenNewCustomer", qrScanType.getIsRelatingMaterialWhenNewCustomer());//是否关联客户
                OpenComponentAppSetting openComponentAppSetting=OpenComponentAppSetting.defaultSettings();
                map.put("mobileAppId", openComponentAppSetting==null?null:openComponentAppSetting.getMobileAppId());//小程序id
                map.put("mobileAppSecret", openComponentAppSetting==null?null:openComponentAppSetting.getMobileAppSecret());//小程序MobileAppSecret
                OpenComponentAppSetting openComponentAppSetting = OpenComponentAppSetting.defaultSettings();
                map.put("mobileAppId", openComponentAppSetting == null ? null : openComponentAppSetting.getMobileAppId());//小程序id
                map.put("mobileAppSecret", openComponentAppSetting == null ? null : openComponentAppSetting.getMobileAppSecret());//小程序MobileAppSecret
                map.put("miniAppOrgId", dataSourceMap.getMiniAppOrgId());//小程序miniAppOrgId
                map.put("isModifyPriceWhenScanQrCode", session.getAttribute(SessionKey.ISMODIFYPRICEWHENSCANQRCODE));
                map.put("isModifyPriceWhenSalesOrder", session.getAttribute(SessionKey.ISMODIFYPRICEWHENSALESORDER));
                map.put("isModifyPriceWhenPurchaseOrder", session.getAttribute(SessionKey.ISMODIFYPRICEWHENPURCHASEORDER));
                map.put("switchToPageWhenLogonApp", session.getAttribute(SessionKey.SWITCHTOPAGEWHENLOGONAPP));
                map.put("selectNextDocumentWhenApproved", session.getAttribute(SessionKey.SELECTNEXTDOCUMENTWHENAPPROVED));
                map.put("userConfig", sysUserConfigEntity);
                map.put("perssion", session.getAttribute(SessionKey.PERSSION));
                this.printJson(response, GridUtils.toJson(map));
                session.setAttribute(SessionKey.USER_LOGIN_TYPE, SessionKey.USER_LOGIN_TYPE_APP);//app 类型
                return null;
            } else if (redirect != null && !"".equals(redirect)) { // 增加登录后重定向页面功能,added by Johns Wang, 2016-02-17
                //return "redirect:" + redirect;
                callBackMessage.sendSuccessMessage("登录成功");
                callBackMessage.setData("{\"redirect\":\"" + redirect + "\"}");
                session.setAttribute(SessionKey.USER_LOGIN_TYPE, SessionKey.USER_LOGIN_TYPE_MINIAPP);//miniapp 类型
                this.printJson(response, callBackMessage.toString());
                return null;
            } else {
                session.setAttribute(SessionKey.USER_LOGIN_TYPE, SessionKey.USER_LOGIN_TYPE_WEB);//web 类型
                if (ch_userid)
                    return "{\"ok\":\"ch_user_ok\",\"info\":\"" + userCode + "\"}";
                else {
@@ -466,9 +588,9 @@
                    return null;
                }
            }
        } catch (IllegalStateException e) {
        }catch (IllegalStateException e) {
            e.printStackTrace();
            if (e.getMessage().contains("Session already invalidated")) {
            if (e.getMessage()!=null&&e.getMessage().contains("Session already invalidated")) {
                sb.append("会话已过期,请关闭浏览器再重新登录系统\\n");
                print2(response, sb.toString(), redirect, isApp);
                System.out.println(this.getClass() + " sessionid:" + session.getId());
@@ -490,17 +612,52 @@
            return null;
        } catch (RuntimeException e) {
            e.printStackTrace();
            if (e.getMessage().equals(SessionKey.DEMO_REF)) {
            if (e.getLocalizedMessage()!=null&&e.getMessage().equals(SessionKey.DEMO_REF)) {
                session.setAttribute(SessionKey.DEMO_REF, SessionKey.DEMO_REF);
                this.print(response, "<script>alert('请生成正确的配置信息');window.location.href='/demo/demoList.jsp';</script>");
            }else{
                this.print2(response, this.getErrorMsg(e), request.getParameter("redirect"), isApp);
            }
            return null;
        } catch (Exception e) {// 不存在此账号
        }catch (GdErrorException e) {// 不存在高德地图apiKey
            e.printStackTrace();
            this.print2(response, "高德地图KEY不存在,请在数据源里维护好", request.getParameter("redirect"), isApp);
            return null;
        }
        catch (Exception e) {// 不存在此账号
            e.printStackTrace();
            proccError(userCode, password, request, response);
            return null;
        }
    }
private void singleAccount(String userFromType,String dbId, UserAccountEntity userAccount, HttpServletRequest request){
        HttpSession session = request.getSession();
    List<OnlineUserEntity> onLineUser = SessionListener.getOnLineUser(request, dbId);//tomcat集群是采用会话复制,所以每个tomcat里的会话信息是一样,取到同一数据源所有会话,从中取到当前用户的会话
    if(onLineUser!=null&&onLineUser.size()>0) {
        for(OnlineUserEntity entity:onLineUser){
                if(entity.getUserCode().equalsIgnoreCase(userAccount.getUserCode())
                        &&userFromType.equalsIgnoreCase(entity.getLoginType()+"")//指明是PC,还是APP端
                        &&!session.getId().equalsIgnoreCase(entity.getSessionId())//排除当前的会话,取同账号的之前会话
                ){
                //只要会话存在,发webSocket回到登录界面
                //---通知webscoket
                MessageInfo messageInfo = new MessageInfo();
                messageInfo.setDbId(Integer.parseInt(dbId));
                messageInfo.setMsgType(MessageType.RETURN_LOGIN_PAGE);
                messageInfo.setUserFromType(userFromType);
                messageInfo.setUserCode(entity.getUserCode());
                messageInfo.setSessionId(entity.getSessionId());
                if(userFromType.equalsIgnoreCase("1")) {//PC端
                    messageInfo.setMsg("您的账号已在其他地方登录");
                }else{
                    messageInfo.setMsg("您的账号已在其他设备登录");
                }
                WebSocketMessageServer.publishMessageToRedis(messageInfo);
            }
        }
    }
}
    private String genToken(String pwd, String usercode, int dbid) {
        TokenInfo tokenInfo = new TokenInfo();
@@ -509,7 +666,7 @@
        try {
            String key = "Lg_Token:" + tokenInfo.getDbid() + ":" + tokenInfo.getUsercode();
            RedisTemplate redisTemplate = (RedisTemplate) FactoryBean.getBean("redisTemplate");
            Object object = redisTemplate.opsForValue().get(key);
            //if (object == null) {
            //不存在则加到redis里,过期时间设置为12小时
@@ -559,6 +716,101 @@
    }
    public boolean processLoginUserToSessionV2( String ip,  String dbId, HttpServletRequest request, UserAccountEntity userAccount) throws Exception {
            HttpSession session = request.getSession();
            // 设置权限
        LoginUserEntity userEntity = new LoginUserEntity();
        final DataSourceEntity dataSourceMap = MultiDataSource.getDataSourceMap(dbId);
        try {
            userEntity.setDbid(dbId);
            userEntity.setSystemDescribe(dataSourceMap.getSystemDescribe());
            userEntity.setLogonDomain(request.getHeader("host"));
                if (request.getParameter("isApp") != null || request.getAttribute("isApp") != null) {
                    // 手机app传过来
                    userEntity.setOSType(request.getHeader("x-app-type"));//ios,android
                    String equipmentCode = request.getHeader("x-app-equipmentCode");
                    String appVersion = request.getHeader("x-app-version");//app版本号
                    String  uniqueIdentifier = request.getHeader("x-app-uniqueIdentifier");//设备唯一码
                    userEntity.setUniqueIdentifier(uniqueIdentifier);
                    userEntity.setAppVersion(appVersion);
                    userEntity.setEquipmentModel(equipmentCode);//设备型号
                    userEntity.setUserLoginType("app");
                    //--从设备型号提取生产商名称,
                    if (org.apache.commons.lang3.StringUtils.isNotBlank(equipmentCode)) {
                        String[] equipment = equipmentCode.split("\\s+?");//空格分隔,取第一个作为生产商
                        userEntity.setManufacturer(equipment[0]);
                    }
                } else {
                    //pc ,小程序
                    int userLoginType = session.getAttribute(SessionKey.USER_LOGIN_TYPE)==null?1:Integer.parseInt(session.getAttribute(SessionKey.USER_LOGIN_TYPE)+"");
                    if (userLoginType==3) {
                        userEntity.setUserLoginType("minapp");
                    } else {
                        userEntity.setUserLoginType("web");
                    }
                    String userAgentString = UserAgentUtil.getUaInfo(request);  // request.getHeader("User-Agent");
                    UserAgent userAgent = UserAgent.parseUserAgentString(userAgentString);
                    String os = userAgent.getOperatingSystem().getGroup().getName();
                    //String osName = userAgent.getOperatingSystem().getName() ;
                    String manufacturer = userAgent.getOperatingSystem().getManufacturer().getName();
                    String model = UserAgentUtil.getPhoneModel(userAgentString);
                    //String mobileOS = UserAgentUtil.getMobileOS(userAgentString);
                    userEntity.setOSType(os);
                    userEntity.setManufacturer(manufacturer);
                    userEntity.setEquipmentModel(model);
                    userEntity.setUserAgent(userAgentString);
                }
                String longitude = request.getHeader("x-app-longitude");
                String latitude = request.getHeader("x-app-latitude");
                //---通过经纬度,IP 获取地理信息(国,省,市,区)
                if(org.apache.commons.lang3.StringUtils.isNotBlank(dataSourceMap.getGeoWebApiKey())) {
                    GdMapService gdMapService = GdMapServiceInit.getGdMapService(dataSourceMap.getGeoWebApiKey());
                    final RegeoCodeEntity regeo = gdMapService.getRegeoV2(longitude, latitude, ip);
                    if (regeo != null) {
                        userEntity.setCountryName(regeo.getCountry());
                        userEntity.setProvinceName(regeo.getProvince());
                        userEntity.setCityName(regeo.getCity());
                        userEntity.setCountyName(regeo.getDistrict());
                    }
                }
                    userEntity.setLongitude(longitude);
                    userEntity.setLatitude(latitude);
                    userEntity.setIp(ip);
                PerssionEntity perssionEntity = new PerssionEntity();
                SpObserver.setDBtoInstance("_" + dbId);
                perssionEntity.setRole(rIfc.getRole(userAccount.getUserCode()));
                perssionEntity.setPerssion(userAccountService.getUserProfiles(userAccount.getUserCode()));
                if (userAccount.getDefaultSet() != null && !"".equals(userAccount.getDefaultSet())) {
                    perssionEntity.setDefaultSet(userAccountService.getDefaultSet(userAccount.getDefaultSet()));
                }
                // 保存会话 session信息
                setSessionValues(dbId, userAccount, session, perssionEntity);
                // 登录成功清除登录错误信息
                record.clearLoginRecord(userAccount.getUserCode());
                // 记录登录信息
                userAccountService.loginLogV2(userAccount, userEntity, session.getId());
            } finally{
                SpObserver.setDBtoInstance();
            }
       // if (dataSourceMap.isLoginOnceForOneUserCode() &&request.getAttribute("loginByCode") != null) {
            //启用限制多设备登录,且通过短信二次验证登录
            try {
                SpObserver.setDBtoDemo();
                userEntity.setTelePhone(userAccount.getApp_userCode());//手机号
                loginEquipmentIfc.updateUserLoginEquipmentInfo(userEntity);
            } finally {
                SpObserver.setDBtoInstance();
            }
       // }
        return true;
    }
    /**
     * APP 自动登录接口
     *
@@ -577,7 +829,7 @@
            TokenInfo tokenInfo = gson.fromJson(value, new com.google.gson.reflect.TypeToken<TokenInfo>() {
            }.getType());
            RedisTemplate redisTemplate = (RedisTemplate) FactoryBean.getBean("redisTemplate");
            Object object = redisTemplate.opsForValue().get("Lg_Token:" + tokenInfo.getDbid() + ":" + tokenInfo.getUsercode());
            if (object == null) {
                this.printJson(response, "{\"error\":\"token已失效,请重新登录\"}");
@@ -614,7 +866,7 @@
            Gson gson = new Gson();
            TokenInfo tokenInfo = gson.fromJson(value, new com.google.gson.reflect.TypeToken<TokenInfo>() {
            }.getType());
            RedisTemplate redisTemplate = (RedisTemplate) FactoryBean.getBean("redisTemplate");
            //System.out.println("aaaaaa>>>>"+value);
            //System.out.println("bbbbb>>>>"+InvitationCode.TOKEN_STR + tokenInfo.getDbid() + ":" + tokenInfo.getUsercode());
            Object object = redisTemplate.opsForValue().get(InvitationCode.TOKEN_STR + tokenInfo.getDbid() + ":" + tokenInfo.getUsercode());
@@ -626,7 +878,7 @@
                return "";
            }
            //405调用需要刷新过期时间
            if(request.getParameter("refresh")!=null&&"1".equalsIgnoreCase(request.getParameter("refresh"))) {
            if (request.getParameter("refresh") != null && "1".equalsIgnoreCase(request.getParameter("refresh"))) {
                //刷新key过期时间
                redisTemplate.opsForValue().getOperations().expire(InvitationCode.TOKEN_STR + tokenInfo.getDbid() + ":" + tokenInfo.getUsercode(), 12, TimeUnit.HOURS);
            }
@@ -636,7 +888,15 @@
//                this.printJson(response, callBackMessage.sendErrorMessage("不是合法的token", -1001));
//                return null;
//            }
            //检查数据源是否已禁用
            final DataSourceEntity dataSourceMap = MultiDataSource.getDataSourceMap("" + tokenInfo.getDbid());
            if(dataSourceMap!=null){
                Integer expiredMinute = (dataSourceMap.getExpiredMinute() == null ? null : (Integer) dataSourceMap.getExpiredMinute());//过期时间:null或负数表示未过期,正数表示已过期
                boolean actived = dataSourceMap.getActived();
                if ((expiredMinute != null && expiredMinute.intValue() > 0) || !actived) {
                    throw  new ApplicationException("系统已过期,请联络服务提供商");
                }
            }
            //进行登录操作
            tokenInfo.setPwd(tokenStr[0]);
            request.setAttribute("account", tokenInfo.getUsercode());
@@ -645,13 +905,95 @@
            request.setAttribute("dataName", tokenInfo.getDbid() + "");
            request.setAttribute("isone", tokenInfo.getDbid() + "");
            request.setAttribute("postTokenV2", "1");//说明是通过V2版提交,之后在登录成功后就不返回token。
            if(org.apache.commons.lang3.StringUtils.isNotBlank(request.getParameter("loginByCode"))) {
                request.setAttribute("loginByCode", 1);//限制设备功能新增
            }
        } catch (Exception ex) {
            this.printJson(response, callBackMessage.sendErrorMessage(this.getErrorMsg(ex), -1));
            this.printJson(response, callBackMessage.sendErrorMessage(this.getErrorMsg(ex)));
            return "";
        }
        return login(request, response);
    }
    /**
     * SMS验证码进行登录
     * @param code
     * @param request
     * @param response
     * @return
     */
    @RequestMapping("/api/loginByCode.do")
    public String loginByCode(String tel, String code, HttpServletRequest request, HttpServletResponse response) {
        CallBackMessage callBackMessage = new CallBackMessage();
        if (org.apache.commons.lang3.StringUtils.isBlank(code)) {
            this.printJson(response, callBackMessage.sendErrorMessage("验证码不能为空", -1));
            return "";
        }
       String verifyCode = (String) redisTemplate.opsForValue().get(VerificationCodes.getCodeKey(tel));
        if (verifyCode==null) {
            printJson(response, callBackMessage.sendErrorMessage("验证码已失效,请重新获取验证码。",-1));
            return "";
        }
        if (!code.equals(verifyCode)) {
            printJson(response, callBackMessage.sendErrorMessage("验证码错误,请输入正确的验证码",-1));
            return "";
        }else {
            redisTemplate.delete(VerificationCodes.getCodeKey(tel));//删除
            printJson(response, callBackMessage.sendSuccessMessageByDefault());
            return "";
        }
    }
    /**
     * 处理极光别名
     * 先查询当前别名已绑定的设备数,如果超过8个则删除最后一个别人
     * @param usercode
     * @param dbid
     */
    public   void processJiguangAliases(String usercode,String dbid){
        try {
            //查询别名绑定的设备列表
            String aliase=dbid+"_"+usercode;
            String url = JpushAction.URL + "/v3/aliases/"+aliase+"?new_format=true";
            final HttpGet httpGet = HttpClientUtil.CreateHttpGetByAuthorization(url, null, JpushAction.appKey, JpushAction.masterSecret);
            CloseableHttpResponse response = HttpClientUtil.getClient().execute(httpGet);
            if (response.getStatusLine().getStatusCode() == 200) {
                final Map map = JSON.parseObject(EntityUtils.toString(response.getEntity(), "UTF-8"), Map.class);
                 List<JiGuangAliaseEntity> list= JSON.parseArray(map.get("data") + "",JiGuangAliaseEntity.class);
              if(list!=null&&list.size()>8){
                  //--处理为只保留最新活跃天数的8个设备
                  StringJoiner joiner=new StringJoiner(",");
                  int index=0;
                 list= list.stream().sorted(Comparator.comparing(JiGuangAliaseEntity::getLast_online_date).reversed()).collect(Collectors.toList());
                 for (JiGuangAliaseEntity entity:list){
                      if(index>8){
                          joiner.add("\""+entity.getRegistration_id()+"\"");
                      }
                      index++;
                  };
                 //---解绑多出来的设备
            url=JpushAction.URL+"/v3/aliases/"+aliase;
            String data="{\n" +
            "  \"registration_ids\":{\"remove\": ["+joiner.toString()+"]}\n" +
            "}";
            final HttpPost httpPost = HttpClientUtil.CreateHttpPostByAuthorization(url, data, false, JpushAction.appKey, JpushAction.masterSecret);
            response = HttpClientUtil.getClient().execute(httpPost);
            if (response.getStatusLine().getStatusCode() !=200) {
                log.info(usercode+"需要删除的极光别名关联设备ID:"+data);
               String msg= EntityUtils.toString(response.getEntity(), "UTF-8");
                throw new ApplicationException("删除极光别名关联设备出错:"+msg);
            }
              }
            } else {
                throw new ApplicationException("获取极光别名出错:" + response.getStatusLine().getStatusCode() + "[" + response.getStatusLine().getReasonPhrase() + "]");
            }
        }catch (Exception e){
            System.out.println(e.getCause()==null?e.getMessage():e.getCause().getMessage());
        }
}
    private void print2(HttpServletResponse response, String sb, String redirect, Boolean isApp) {
        CallBackMessage callBackMessage = new CallBackMessage();
        // redirect Added by Johns Wang, 2016-03-06
@@ -661,9 +1003,9 @@
        }
        callBackMessage.sendErrorMessage(sb);
        if (isApp != null && isApp) {
            if("密码错误".equalsIgnoreCase(sb)){
            if ("密码错误".equalsIgnoreCase(sb)) {
                //密码不正确 以状态码为-1004返回给app,弹出登录界面
                callBackMessage.sendErrorMessage(sb,-1004);
                callBackMessage.sendErrorMessage(sb, -1004);
            }
            this.print(response, callBackMessage.toString());
        } else {
@@ -716,6 +1058,11 @@
        map.put(SessionKey.CCCODEPERMISSION.replace("@", ""), session.getAttribute(SessionKey.CCCODEPERMISSION));
        map.put(SessionKey.USERTYPE.replace("@", ""), session.getAttribute(SessionKey.USERTYPE));
        map.put(SessionKey.ISMODIFYPRICEWHENSCANQRCODE, session.getAttribute(SessionKey.ISMODIFYPRICEWHENSCANQRCODE));
        map.put(SessionKey.ISMODIFYPRICEWHENSALESORDER, session.getAttribute(SessionKey.ISMODIFYPRICEWHENSALESORDER));
        map.put(SessionKey.ISMODIFYPRICEWHENPURCHASEORDER, session.getAttribute(SessionKey.ISMODIFYPRICEWHENPURCHASEORDER));
        map.put(SessionKey.SWITCHTOPAGEWHENLOGONAPP, session.getAttribute(SessionKey.SWITCHTOPAGEWHENLOGONAPP));
        map.put(SessionKey.SELECTNEXTDOCUMENTWHENAPPROVED, session.getAttribute(SessionKey.SELECTNEXTDOCUMENTWHENAPPROVED));
        map.put(SessionKey.ISSTARTUPPOPUPMESSAGES, session.getAttribute(SessionKey.ISSTARTUPPOPUPMESSAGES));
        map.put("day", DateUtil.getDay(0));
        map.put("month", DateUtil.getMonth(0));
        map.put("year", DateUtil.getYear(0));
@@ -724,11 +1071,12 @@
    }
    private void proccError(String account, String pwd, HttpServletRequest request, HttpServletResponse response) {
        Boolean isApp = Boolean.valueOf(request.getParameter("isApp") == null ? false : true);// 手机app传过来
        Boolean isApp = Boolean.valueOf((request.getParameter("isApp") == null&&request.getAttribute("isApp") == null) ? false : true);// 手机app传过来
        try {
            SpObserver.setDBtoInstance("_" + request.getSession().getAttribute(SessionKey.DATA_BASE_ID));
            record.loginRecord(account, pwd, IPUtil.getIpAddr(request));// 记录登录登录失败的信息
        } catch (Exception e2) {
            e2.printStackTrace();
            this.print2(response, e2.getMessage().replace("\"", ""), request.getParameter("redirect"), isApp);
        } finally {
            SpObserver.setDBtoInstance();
@@ -842,8 +1190,9 @@
        session.setAttribute(SessionKey.DEPARTMENT, userAccount.getCcName());
        session.setAttribute(SessionKey.CCCODE, userAccount.getCcCode());
        session.setAttribute(SessionKey.CCNAME, userAccount.getCcName());
        session.setAttribute(SessionKey.USER_TELE_PHONE, userAccount.getApp_userCode());//手机号
        session.setAttribute(SessionKey.SUPPER_USER,
                "superuser".equalsIgnoreCase((userAccount.getUserType())) ? "1" : "0");// 系统管理员
                ("SuperUser".equalsIgnoreCase(userAccount.getUserType()) || "DeveloperUser".equalsIgnoreCase(userAccount.getUserType())) ? "1" : "0");// 系统管理员
        session.setAttribute(SessionKey.isStopSystem, userAccount.isStopSystem() ? "1" : "0");
        session.setAttribute(SessionKey.OPEN_ID, userAccount.getOpenId());// openid号
        session.setAttribute(SessionKey.CURRENCY, userAccount.getCurrency());
@@ -881,7 +1230,12 @@
        session.setAttribute(SessionKey.DEFAULT_BRAND, userAccount.getDefaultBrand());
        session.setAttribute(SessionKey.CCCODEPERMISSION, userAccount.getCcCodePermission());
        session.setAttribute(SessionKey.ISMODIFYPRICEWHENSCANQRCODE, userAccount.getIsModifyPriceWhenScanQrCode());
        session.setAttribute(SessionKey.USERTYPE,userAccount.getUserType() );
        session.setAttribute(SessionKey.ISMODIFYPRICEWHENSALESORDER, userAccount.getIsModifyPriceWhenSalesOrder());
        session.setAttribute(SessionKey.ISMODIFYPRICEWHENPURCHASEORDER, userAccount.getIsModifyPriceWhenPurchaseOrder());
        session.setAttribute(SessionKey.SWITCHTOPAGEWHENLOGONAPP, userAccount.getSwitchToPageWhenLogonApp());
        session.setAttribute(SessionKey.SELECTNEXTDOCUMENTWHENAPPROVED, userAccount.getSelectNextDocumentWhenApproved());
        session.setAttribute(SessionKey.ISSTARTUPPOPUPMESSAGES, userAccount.getIsStartupPopupMessages());
        session.setAttribute(SessionKey.USERTYPE, userAccount.getUserType());
        session.setAttribute(SessionKey.PAGE_PATH,
                File.separator + "app" + File.separator + session.getAttribute(SessionKey.DATA_BASE_ID) + File.separator
@@ -905,6 +1259,7 @@
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
        session.setAttribute(SessionKey.LOGIN_TIME, df.format(new Date()));//登录时间 xin 2020-8-31 11:35:22
        
        session.setAttribute(SessionKey.WEIXIN_USERID,userAccount.getWeiXinCorpUserId());   //企业微信登录userid ,Added by Johns Wang,2022-12-23
        return userName;
    }
@@ -1056,8 +1411,13 @@
                    SpObserver.setDBtoInstance();
                }
                this.print2(response, "用户账号不存在!", request.getParameter("redirect"), isApp);
                this.print2(response, usercode+"未开通ERP系统服务,登录失败", request.getParameter("redirect"), isApp);
                return null;
            }else {
                if(userAccount.isInActive()){
                    this.print2(response, usercode+"已被停用,禁止登录本系统!", request.getParameter("redirect"), isApp);
                    return null;
                }
            }
            try {
                if (!userAccount.checkPassword(password)) {
@@ -1073,8 +1433,36 @@
            } catch (Exception ex) {
                this.print2(response, ex.getMessage(), request.getParameter("redirect"), isApp);
            }
            if (isApp) {
                session.setAttribute(SessionKey.USER_LOGIN_TYPE, SessionKey.USER_LOGIN_TYPE_APP);//app 类型
                //判断当前登录设备是否与最新一次登录设备是一样,不一样需要返回给前端,输出短信进行验证登录
            } else {
                session.setAttribute(SessionKey.USER_LOGIN_TYPE, SessionKey.USER_LOGIN_TYPE_WEB);//web 类型
            }
            final DataSourceEntity dataSourceMap = MultiDataSource.getDataSourceMap(dbid);
            //---------------------------------
            if(dataSourceMap.isLoginOnceForOneUserCode()) {
                //限制多设备登录
                this.singleAccount(isApp ? "2" : "1", dbid, userAccount, request);
            }
            // 设置权限
            processLoginUserToSession(ip, dbid, session, userAccount);
            processLoginUserToSessionV2(ip, dbid, request, userAccount);
            //把新会话id替换websocket中对应用户的会话id,
            //--同一用户重新连接,如果存在已有会话是打开状态,则删除这个会话,启用新会话
            if(WebSocketMessageServer.getOnlineUserList()!=null&&WebSocketMessageServer.getOnlineUserList().size()>0) {
                String key = RedisSocket.CHANEL_WS_MESSAGES + ":" + dbid + ":1:" + usercode + ":";
                for (Map.Entry<String, WsMessageUserEntity> entry : WebSocketMessageServer.getOnlineUserList().entrySet()) {
                    if (entry.getKey().contains(key)) {
                        if (entry.getValue().getSession().isOpen()) {
                            WsMessageUserEntity wsMessageUser= entry.getValue();
                            wsMessageUser.setSessionId(session.getId());
                            WebSocketMessageServer.getOnlineUserList().put(key+session.getId(),wsMessageUser);
                            break;
                        }
                    }
                }
            }
            callBackMessage.sendSuccessMessage("登录成功");
            this.printJson(response, callBackMessage.toString());
            return null;
@@ -1161,13 +1549,18 @@
                SpObserver.setDBtoInstance("_" + mDbId);
                mUserAccount = userAccountService.getUserInfoByTelephone(mUserCode);
                if (mUserAccount != null) {
                    if(mUserAccount.isInActive()){
                        print2(mResponse, mUserCode+"已被停用,禁止登录本系统", mRedirect, mIsApp);
                        myResult = true;
                        return this;
                    }
                    mUserAccount.setApp_userCode(mUserCode);
                    mUserAccount.setApp_Password(mPassword);
                    mUserCode = mUserAccount.getUserCode();//转成ERP的usercode进行登陆
                    mPassword = mUserAccount.getPassword();//转成ERP的密码进行登陆
                    mCh_userid = true;
                } else {
                    print2(mResponse, "该手机号码没有对应用户信息", mRedirect, mIsApp);
                    print2(mResponse, mUserCode+"未开通ERP系统服务,登录失败", mRedirect, mIsApp);
                    myResult = true;
                    return this;
                }