/// <summary>
        /// 同步成员功能,与fishflow通信
        /// </summary>
        /// <param name="accountManageId"></param>
        public void SyncMember(int accountManageId)
        {
            var          url           = CommonService.GetSysConfig("FishflowUrl", "");
            var          userName      = CommonService.GetSysConfig("FishflowUserName", "");
            var          password      = CommonService.GetSysConfig("FishflowPassword", "");
            var          whiteCompany  = CommonService.GetSysConfig("FishflowWhiteCompany", "");
            var          dDepartmentID = int.Parse(CommonService.GetSysConfig("DimissionDepartment", ""));
            EmployeeInfo client        = new EmployeeInfo()
            {
                Url = url,
                GCSoapHeaderValue = new GCSoapHeader()
                {
                    UserName = userName, Password = password
                }
            };
            int total = 0;
            int index = 1;
            //每次通信得到50条记录
            int pageCount = 50;
            HashSet <string> employeeNoBag = new HashSet <string>();

            do
            {
                //fishflow通信
                var result = client.GetEmployeeInfo2(index, pageCount);
                result = EncryptionHelper.DecryptDES(result);
                //得到返回结果反序列化成我们的对象
                var view = JsonConvert.DeserializeObject <EmployeeInfoView>(result);
                var currentEmployeeList = new List <EmployeeData>();
                if (index == 1)
                {
                    total = view.Data.TotalQty - pageCount;
                }
                else
                {
                    total -= pageCount;
                }
                index++;
                if (view.IsSuccess)
                {
                    foreach (var e in view.Data.EmployeeInfo)
                    {
                        //fishflow的部门在我们这里部门ID要加10000,以示与丁香园区分
                        if (e.BUID != null)
                        {
                            e.BUID += 10000;
                        }
                        if (e.SBUID != null)
                        {
                            e.SBUID += 10000;
                        }
                        if (e.GroupID != null)
                        {
                            e.GroupID += 10000;
                        }
                        //经确认,只有部门子公司的员工需要同步
                        if (!string.IsNullOrEmpty(whiteCompany))
                        {
                            var companies = whiteCompany.Split(",".ToArray()).Select(a => a.Trim()).ToList();
                            if (e.CompanyID == null || !companies.Contains(e.CompanyID.ToString()))
                            {
                                continue;
                            }
                        }
                        //经确认,符合7开头长度是9位的员工号员工不需要同步
                        if (!string.IsNullOrEmpty(e.EmployeeNo) && e.EmployeeNo.StartsWith("7") && e.EmployeeNo.Length == 9)
                        {
                            continue;
                        }
                        //经确认,fishflow中重复的用户只添加第一个
                        if (employeeNoBag.Contains(e.EmployeeNo))
                        {
                            continue;
                        }
                        else
                        {
                            employeeNoBag.Add(e.EmployeeNo);
                            currentEmployeeList.Add(e);
                        }
                    }
                    //同步成员信息到我们数据库,先将数据存入SysAddressBookMemberTemp缓存表,方便对比变更的用户信息
                    var ctx      = (DbContext)_tempRepository.UnitOfWork;
                    var entities = currentEmployeeList.Select(e =>
                    {
                        var department = JsonConvert.SerializeObject(GetDepartmentId(e, accountManageId, dDepartmentID));
                        return(new SysAddressBookMemberTemp()
                        {
                            EmployeeNo = e.EmployeeNo,
                            Status = 4, //未关注
                            EmployeeStatus = e.EmployeeStatus,
                            UserName = e.CName,
                            EnName = e.EName,
                            AccountManageId = accountManageId,
                            //Avatar =
                            //Birthday =
                            Department = department,
                            FishflowDepartment = department,
                            UserId = GenerateUserId(e.EmployeeNo),
                            Gender = GetGenderNumber(e.Gender),
                            DirectManagerID = e.DirectManagerID,
                            CompanyID = e.CompanyID != null ? e.CompanyID.ToString() : string.Empty,
                            GradeCode = e.GradeCode,
                            City = e.City,
                            Mobile = GetMobileString(e.Mobile),
                            Position = GetPositionString(e.Position),
                            Email = e.Email,
                            DeleteFlag = 0,
                            CreateTime = DateTime.Now,
                            Extend1 = e.ADAccount,
                        });
                    }).Where(e => !e.Department.Equals("[]", StringComparison.CurrentCultureIgnoreCase));
                    using (var transactionScope = new TransactionScope())
                    {
                        #region SQL update
                        var options = new BulkInsertOptions
                        {
                            EnableStreaming = true,
                        };
                        ctx.BulkInsert(entities, options);
                        ctx.SaveChanges();
                        //经确认,已关注用户只更新姓名,性别,部门,在职离职状态变化的;
                        //未关注用户只更新姓名,性别,手机,邮箱,部门,在职离职状态变化的;
                        string findChangeSubscribeUserSQL   = @"select t.id from SysAddressBookMember m join SysAddressBookMemberTemp t on m.EmployeeNo = t.EmployeeNo where m.[Status] = 1 and (m.DeleteFlag != 1 or m.DeleteFlag is null) and
                        (m.[UserName] != t.[UserName] or m.[Gender] != t.[Gender] or m.[FishflowDepartment] != t.[FishflowDepartment] or m.[EmployeeStatus] != t.[EmployeeStatus]) ";
                        string findChangeUnsubscribeUserSQL = @"select t.id from SysAddressBookMember m join SysAddressBookMemberTemp t on m.EmployeeNo = t.EmployeeNo where m.[Status] != 1 and (m.DeleteFlag != 1 or m.DeleteFlag is null) and
                        (m.[UserName] != t.[UserName] or m.[Gender] != t.[Gender] or m.[Mobile] != t.[Mobile] or m.[Email] != t.[Email] or m.[FishflowDepartment] != t.[FishflowDepartment] or m.[EmployeeStatus] != t.[EmployeeStatus]) ";
                        string findChangeUserSQL            = @"select 
                        tt.[Id], tt.[Gender],tt.[UserName],tt.[EnName],tt.[Mobile],tt.[Position],tt.[Email],tt.[City],tt.[FishflowDepartment],tt.[Extend1],
                        CASE ISNULL(mm.[DXYDepartment], '') WHEN '' Then tt.[Department]
                        ELSE REPLACE(tt.[Department], ']',',')+REPLACE(mm.[DXYDepartment], '[','') End as Department,
                        mm.[WeiXinId],mm.[Status],mm.[Avatar],mm.[GradeCode],mm.[EmployeeNo],
                        mm.[EmployeeStatus],mm.[Birthday],mm.[CompanyID],mm.[DirectManagerID],
                        mm.[DeleteFlag],mm.[UserId] ,mm.[CreateTime],mm.[AccountManageId],mm.[TagList],mm.[LabourUnionStatus] 
                        from SysAddressBookMemberTemp tt join SysAddressBookMember mm on tt.EmployeeNo = mm.EmployeeNo where mm.AccountManageId = tt.AccountManageId and tt.id in (({0}) union ({1}))";
                        string findNewUserSQL   = @"select * from SysAddressBookMemberTemp where EmployeeStatus = 'A' and EmployeeNo in (select EmployeeNo from SysAddressBookMemberTemp except (select EmployeeNo from SysAddressBookMember where (DeleteFlag!=1 or DeleteFlag is null) and AccountManageId = {0}))";
                        string updateOldUserSQL = @"update SysAddressBookMember 
                                                                    set [UserName] = SysAddressBookMemberTemp.UserName,             
                                                                    [EmployeeStatus] = SysAddressBookMemberTemp.EmployeeStatus,
                                                                    [EnName] = SysAddressBookMemberTemp.EnName,
                                                                    [FishflowDepartment] = SysAddressBookMemberTemp.Department,
                                                                    [Department] = CASE ISNULL([DXYDepartment], '') WHEN '' Then SysAddressBookMemberTemp.Department
                                                                                               ELSE REPLACE(SysAddressBookMemberTemp.Department, ']',',')+REPLACE([DXYDepartment], '[','')
                                                                                               End,
                                                                    [Gender] = SysAddressBookMemberTemp.Gender,
                                                                    [City] = SysAddressBookMemberTemp.City,
                                                                    [Mobile] = SysAddressBookMemberTemp.Mobile,
                                                                    [Position] = SysAddressBookMemberTemp.Position,
                                                                    [Email] = SysAddressBookMemberTemp.Email,
                                                                    [DirectManagerID] = SysAddressBookMemberTemp.DirectManagerID,
                                                                    [CompanyID] = SysAddressBookMemberTemp.CompanyID,
                                                                    [GradeCode] = SysAddressBookMemberTemp.GradeCode,
                                                                    [Extend1] = SysAddressBookMemberTemp.Extend1
                                                                    from SysAddressBookMemberTemp
                                                                    where SysAddressBookMember.EmployeeNo = SysAddressBookMemberTemp.EmployeeNo
                                                                    and SysAddressBookMember.AccountManageId = SysAddressBookMemberTemp.AccountManageId
                                                                    and (SysAddressBookMember.DeleteFlag != 1 or SysAddressBookMember.DeleteFlag is null)";

                        StringBuilder builder     = new StringBuilder("insert into SysAddressBookMember (");
                        string        tableValues = @"[WeiXinId],[Status],[Gender],[UserName],[EnName],[Mobile],[Avatar],[Position],[Email],[Department],[FishflowDepartment],
                                                               [GradeCode],[EmployeeNo],[EmployeeStatus],[City],[Birthday],[CompanyID],[DirectManagerID],
                                                               [DeleteFlag],[UserId] ,[CreateTime],[AccountManageId],[TagList],[Extend1]";
                        builder.Append(tableValues);
                        builder.AppendFormat(") select {0} ", tableValues);
                        builder.Append(@"from SysAddressBookMemberTemp where EmployeeStatus = 'A' and EmployeeNo in (select EmployeeNo from SysAddressBookMemberTemp except (select EmployeeNo from SysAddressBookMember where (DeleteFlag!=1 or DeleteFlag is null)  and AccountManageId = {0}))");
                        string insertNewUserSQL = builder.ToString();
                        var    changeObjects    = _tempRepository.SqlQuery(string.Format(findChangeUserSQL, findChangeSubscribeUserSQL, findChangeUnsubscribeUserSQL)).ToList();
                        var    newObjects       = _tempRepository.SqlQuery(string.Format(findNewUserSQL, accountManageId)).ToList();
                        changeObjects.AddRange(newObjects);

                        logger.Debug("Start changeObjects! Count:{0} ", changeObjects.Count);

                        changeObjects.ForEach(a =>
                        {
                            if (!string.IsNullOrEmpty(a.EmployeeStatus) && a.EmployeeStatus.Equals("D", StringComparison.CurrentCultureIgnoreCase))
                            {
                                a.Department = JsonConvert.SerializeObject(new int[] { dDepartmentID });
                            }
                        });
                        var apiModels = changeObjects.Select(e => e.ConvertToMember()).Select(m => (new AddressBookMemberView()
                        {
                            ConvertEntity = m
                        }).ConvertApiModel).ToList();
                        apiModels.ForEach(a =>
                        {
                            if (a.status == 1 || a.department.Contains(dDepartmentID))
                            {
                                //裁减掉不需要同步到腾讯后台的用户信息
                                CutPropertyBefaultSync2TX(a);
                            }
                        });
                        var templateModels = apiModels.Select(a => (new AddressBookMemberView()
                        {
                            ConvertApiModel = a
                        }).ConvertTemplateModel).ToList();
                        this.Repository.SqlExcute(updateOldUserSQL);
                        this.Repository.SqlExcute(insertNewUserSQL, accountManageId);
                        //this.Repository.SqlExcute(updateTempUserIdSQL, accountManageId);
                        #endregion

                        //同步成员信息到腾讯后台
                        #region Batch API update
                        if (templateModels.Count > 0)
                        {
                            Dictionary <string, Stream> dic = new Dictionary <string, Stream>();
                            //var templateModels = _tempRepository.Entities.ToList().Select(e => e.ConvertToMember()).Select(m => (new AddressBookMemberView() { ConvertEntity = m }).ConvertTemplateModel).ToList();
                            templateModels.ForEach(t =>
                            {
                                if (!string.IsNullOrEmpty(t.Position) && t.Position.IndexOf(",") > 0)
                                {
                                    t.Position = "\"" + t.Position + "\"";
                                }
                                if (!string.IsNullOrEmpty(t.UserName) && t.UserName.IndexOf(",") > 0)
                                {
                                    t.UserName = "******"" + t.UserName + "\"";
                                }
                            });
                            var stream = GetUploadCsv(templateModels);
                            dic.Add("上传模板.csv", stream);

                            logger.Debug("Start upload User to WeChat Server! Count:{0} ", templateModels.Count);

                            var ret = MediaApi.Upload(GetToken(accountManageId), UploadMediaFileType.file, dic, "");
                            System.Threading.Thread.Sleep(200);
                            if (ret.errcode == Weixin.ReturnCode_QY.请求成功)
                            {
                                var       objConfig   = WeChatCommonService.lstSysWeChatConfig.Find(a => a.AccountManageId == accountManageId);
                                string    callbackUrl = CommonService.GetSysConfig(SysConfigCode.CallBackUrl, "");//从Sysconfig数据库中读url
                                BatchUser objUser     = new BatchUser()
                                {
                                    media_id = ret.media_id,
                                    callback = new callback()
                                    {
                                        token          = objConfig.WeixinToken,                                  // Token,
                                        encodingaeskey = objConfig.WeixinEncodingAESKey,                         // EncodingAESKey,
                                        url            = callbackUrl + string.Format("?appid={0}", objConfig.Id) //app.innocellence.com/wechatqy/led
                                    }
                                };
                                try
                                {
                                    var objRet = MailListApi.BatchUpdateUser(GetToken(accountManageId), objUser);
                                    if (objRet.errcode == Weixin.ReturnCode.请求成功)
                                    {
                                        var jobLog = new BatchJobLog()
                                        {
                                            JobID       = objRet.jobid,
                                            Status      = 0,
                                            Type        = "sync_user",
                                            CreatedDate = DateTime.Now
                                        };

                                        _batchJobLogService.Repository.Insert(jobLog);//插入表中

                                        //清除临时缓存数据
                                        _tempRepository.Delete(a => true);

                                        transactionScope.Complete();
                                    }
                                    else
                                    {
                                        logger.Error("An error occurred while uploading page: {0} msg:{1}", index, objRet.errmsg);
                                    }
                                }
                                catch (Exception e)
                                {
                                    logger.Error("An error occurred while uploading page {0}", index);
                                    logger.Error("CallbackURL: {0}", objUser.callback.url);
                                    logger.Error(e.ToString());
                                }
                            }
                        }
                        else
                        {
                            //清除临时缓存数据
                            _tempRepository.Delete(a => true);
                            transactionScope.Complete();
                        }

                        #endregion
                    }
                }
                else
                {
                    logger.Error("Sync Member Page Error: {0}, Index is {1}.", view.Message, index);
                }
            }while (total > 0);
        }