/// <summary>
 /// 移动用户
 /// </summary>
 /// <param name="accountID">账号ID</param>
 /// <param name="openID">OpenID</param>
 /// <param name="groupID">分组ID</param>
 /// <returns>操作结果</returns>
 public OperateStatus MoveUser(Guid accountID, string openID, string groupID)
 {
     AccountServiceModel model = new AccountServiceModel();
     var account = model.GetById(accountID);
     if (account == null)
     {
         return new OperateStatus { ResultSign = ResultSign.Failed, Message = "账户不存在" };
     }
     var func = FunctionFactory.GetFunctionInstance<IGroup>();
     OperateStatus status = func.MoveUser(account, openID, groupID);
     return status;
 }
        /// <summary>
        /// 使用Code获取OpenID
        /// </summary>
        /// <param name="accountID">账号ID</param>
        /// <param name="code">Code</param>
        /// <returns>操作结果</returns>
        public OperateStatus GetOpenIDByCode(Guid accountID, string code)
        {
            AccountServiceModel model = new AccountServiceModel();
            var account = model.GetById(accountID);
            if (account == null)
            {
                return new OperateStatus { ResultSign = ResultSign.Failed, Message = "账户不存在" };
            }

            var func = FunctionFactory.GetFunctionInstance<IOAuth>();
            var result = func.GetOpenIDByCode(account, code);
            return new OperateStatus { ResultSign = ResultSign.Success, ReturnValue = result };
        }
        /// <summary>
        /// 获取认证用Url
        /// </summary>
        /// <param name="accountID">账号ID</param>
        /// <param name="redirectUrl">重定向Url</param>
        /// <param name="getAuthType">获取认证的类型</param>
        /// <returns>操作结果</returns>
        public OperateStatus GetAuthUrl(Guid accountID, string redirectUrl, EnumGetAuthType getAuthType)
        {
            AccountServiceModel model = new AccountServiceModel();
            var account = model.GetById(accountID);
            if (account == null)
            {
                return new OperateStatus { ResultSign = ResultSign.Failed, Message = "账户不存在" };
            }

            var func = FunctionFactory.GetFunctionInstance<IOAuth>();
            var result = func.GetAuthUrl(account, redirectUrl, getAuthType);
            return new OperateStatus {ResultSign = ResultSign.Success, ReturnValue = result};
        }
        /// <summary>
        /// 根据用户ID获取用户信息
        /// </summary>
        /// <param name="accountID">账号ID</param>
        /// <param name="userID">用户ID</param>
        /// <returns>操作结果,CorpUserInfo</returns>
        public OperateStatus GetUserByID(Guid accountID, string userID)
        {
            AccountServiceModel model = new AccountServiceModel();
            var currentAccount = model.GetById(accountID);
            if (currentAccount == null)
            {
                return new OperateStatus { ResultSign = ResultSign.Failed, Message = "账号不存在" };
            }

            var func = FunctionFactory.GetFunctionInstance<IUserGetByID>();
            OperateStatus status = func.GetByID(currentAccount, userID);
            return status;
        }
        /// <summary>
        /// 根据部门信息获取用户
        /// </summary>
        /// <param name="accountID">账号ID</param>
        /// <param name="departmentID">部门ID</param>
        /// <param name="fetchChild">查询分支</param>
        /// <param name="enumStatus">查询用户状态</param>
        /// <param name="getDetail">获取详情</param>
        /// <returns>操作结果</returns>
        public OperateStatus GetUserByDeparment(Guid accountID, string departmentID, bool fetchChild, int enumStatus, bool getDetail)
        {
            AccountServiceModel model = new AccountServiceModel();
            var currentAccount = model.GetById(accountID);
            if (currentAccount == null)
            {
                return new OperateStatus { ResultSign = ResultSign.Failed, Message = "账号不存在" };
            }

            var func = FunctionFactory.GetFunctionInstance<IUserGetByDepartment>();
            OperateStatus status = func.GetByDepartment(currentAccount, departmentID, fetchChild, enumStatus, getDetail);
            return status;
        }
        /// <summary>
        /// 创建用户
        /// </summary>
        /// <param name="accountID">账号ID</param>
        /// <param name="userInfo">用户信息</param>
        /// <returns>操作结果</returns>
        public OperateStatus CreateUser(Guid accountID, CorpUserInfo userInfo)
        {
            AccountServiceModel model = new AccountServiceModel();
            var currentAccount = model.GetById(accountID);
            if (currentAccount == null)
            {
                return new OperateStatus { ResultSign = ResultSign.Failed, Message = "账号不存在" };
            }

            var func = FunctionFactory.GetFunctionInstance<IUserCreate>();
            OperateStatus status = func.Create(currentAccount, userInfo);
            return status;
        }
        /// <summary>
        /// 发送内容消息
        /// </summary>
        /// <param name="accountID">账号ID</param>
        /// <param name="target">发送目标信息</param>
        /// <param name="message">消息内容</param>
        /// <returns>操作结果</returns>
        public OperateStatus SendTextMessage(Guid accountID, SendMessageTarget target, string message)
        {
            AccountServiceModel model = new AccountServiceModel();
            var currentAccount = model.GetById(accountID);
            if (currentAccount == null)
            {
                return new OperateStatus { ResultSign = ResultSign.Failed, Message = "账号不存在" };
            }

            var func = FunctionFactory.GetFunctionInstance<ISend>();
            OperateStatus status = func.SendTextMessage(currentAccount, target, message);
            return status;
        }
 /// <summary>
 /// 根据OpenID获取用户信息
 /// </summary>
 /// <param name="accountID">账号ID</param>
 /// <param name="openID">OpenID</param>
 /// <returns>操作结果,UserInfo信息</returns>
 public OperateStatus GetByOpenID(Guid accountID, string openID)
 {
     AccountServiceModel model = new AccountServiceModel();
     var account = model.GetById(accountID);
     if (account == null)
     {
         return new OperateStatus { ResultSign = ResultSign.Failed, Message = "账户不存在" };
     }
     var func = FunctionFactory.GetFunctionInstance<IGetUserBaseInfo>();
     var userInfo = func.GetByOpenID(account, openID);
     var jsonResult = JsonConvert.SerializeObject(userInfo);
     return new OperateStatus { ResultSign = ResultSign.Success, ReturnValue = jsonResult };
 }
 /// <summary>
 /// 通过Code获取用户信息
 /// </summary>
 /// <param name="accountID">账号ID</param>
 /// <param name="code">Code</param>
 /// <returns>操作结果</returns>
 public OperateStatus GetUserInfoByCode(Guid accountID, string code)
 {
     AccountServiceModel model = new AccountServiceModel();
     var account = model.GetById(accountID);
     if (account == null)
     {
         return new OperateStatus { ResultSign = ResultSign.Failed, Message = "账户不存在" };
     }
     UserInfo userInfo;
     if (account.IsCorp)
     {
         var func = FunctionFactory.GetFunctionInstance<Extentions.IFunction.Corp.Authenticate.IOAuth>();
         userInfo = func.GetUserInfoByCode(account, code);
     }
     else
     {
         var func = FunctionFactory.GetFunctionInstance<IOAuth>();
         userInfo = func.GetUserInfoByCode(account, code);
     }
     var jsonResult = JsonConvert.SerializeObject(userInfo);
     return new OperateStatus { ResultSign = ResultSign.Success, ReturnValue = jsonResult };
 }
        /// <summary>
        /// 获取JS请求所需数据
        /// </summary>
        /// <param name="accountID">账号ID</param>
        /// <param name="currentUrl">当前页面的Url</param>
        /// <returns>操作结果,WeiXinJsData</returns>
        public OperateStatus GetJsData(Guid accountID, string currentUrl)
        {
            AccountServiceModel model = new AccountServiceModel();
            var account = model.GetById(accountID);
            if (account == null)
            {
                return new OperateStatus { ResultSign = ResultSign.Failed, Message = "账户不存在" };
            }
            OperateStatus status;
            if (account.IsCorp)
            {
                var func = FunctionFactory.GetFunctionInstance<IJsSDK>();
                status = func.GetJsData(account, currentUrl);
            }
            else
            {
                var func = FunctionFactory.GetFunctionInstance<Extentions.IFunction.Normal.JsSDK.IJsSDK>();
                status = func.GetJsData(account, currentUrl);
            }

            return status;
        }
        public OperateStatus CreateMenus(Guid accountID, IList<CustomMenu> menus)
        {
            AccountServiceModel model = new AccountServiceModel();
            var account = model.GetById(accountID);
            if (account == null)
            {
                return new OperateStatus { ResultSign = ResultSign.Failed, Message = "账户不存在" };
            }
            OperateStatus status;
            if (account.IsCorp)
            {
                var func = FunctionFactory.GetFunctionInstance<ICreate>();
                status = func.Create(account, menus);
            }
            else
            {
                var func = FunctionFactory.GetFunctionInstance<Extentions.IFunction.Normal.CustomMenu.ICreate>();
                status = func.Create(account, menus);
            }

            return status;
        }
        /// <summary>
        /// 模板消息发送(只支持非企业号)
        /// </summary>
        /// <param name="accountID">账号ID</param>
        /// <param name="templateMsgParams">发送参数</param>
        /// <param name="parameters">模板参数</param>
        /// <returns>操作结果</returns>
        public OperateStatus TemplateMsg(Guid accountID, TemplateMsgParams templateMsgParams, IList<TemplateParameter> parameters)
        {
            AccountServiceModel model = new AccountServiceModel();
            var currentAccount = model.GetById(accountID);
            if (currentAccount == null)
            {
                return new OperateStatus { ResultSign = ResultSign.Failed, Message = "账号不存在" };
            }

            var func = FunctionFactory.GetFunctionInstance<ITemplateMsg>();
            OperateStatus status = func.SendTemplateMsg(currentAccount, templateMsgParams, parameters);
            return status;
        }