Example #1
0
        public void UploadVideoTest()
        {
            string _media      = "E:\\test2.mp4";
            var    accessToken = AccessTokenContainer.GetToken(_corpId);
            var    result      = MediaApi.Upload(accessToken, UploadMediaFileType.video, _media);

            Assert.IsNotNull(result);
            Assert.IsTrue(result.errcode == ReturnCode_QY.请求成功);
        }
Example #2
0
        //[TestMethod]
        public string UploadImageTest()
        {
            string _media      = "E:\\1.jpg";
            var    accessToken = AccessTokenContainer.GetToken(_corpId);
            var    result      = MediaApi.Upload(accessToken, UploadMediaFileType.image, _media);

            Assert.IsNotNull(result);
            Assert.IsTrue(result.errcode == ReturnCode_QY.请求成功);
            return(result.media_id);
        }
Example #3
0
        public string UploadImageTest()
        {
            string _media      = "E:\\Senparc项目\\WeiXinMPSDK\\src\\Senparc.Weixin.Work\\Senparc.Weixin.Work.Test\\AdvancedAPIs\\Media\\test.jpg";
            var    accessToken = AccessTokenContainer.GetToken(_corpId, base._corpSecret);
            var    result      = MediaApi.Upload(accessToken, UploadMediaFileType.image, _media);

            Assert.IsNotNull(result);
            Assert.IsTrue(result.errcode == ReturnCode_Work.请求成功);
            return(result.media_id);
        }
Example #4
0
        public void UploadTest()
        {
            var accessToken = AccessTokenContainer.GetToken(_appId);

            var type   = UploadMediaFileType.image;
            var file   = @"E:\testpic.jpg";
            var result = MediaApi.Upload(accessToken, type, file);

            Assert.AreEqual(type, result.type);
            Assert.IsNotNull(result.media_id);
            mediaId = result.media_id;
        }
Example #5
0
        /// <summary>
        /// 微信图文推送。该函数不建议使用,建议使用PublishMessage函数代替。
        /// </summary>
        /// <param name="iAppID"></param>
        /// <param name="strMsgType"></param>
        /// <param name="strUser"></param>
        /// <param name="strDept"></param>
        /// <param name="strTags"></param>
        /// <param name="strContent"></param>
        /// <param name="lstContent"></param>
        /// <returns></returns>
        public static MassResult SendMsg(int iAppID, string strMsgType, string strUser, string strDept, string strTags, string strContent, List <Article> lstContent)
        {
            MassResult objResult = null;

            int IsSec = 0;

            var objConfig = WeChatCommonService.GetWeChatConfig(iAppID);

            LogManager.GetLogger(typeof(WechatCommon)).Debug("strUser:{0} strDept:{1} strTags:{2} Msg:{3}", strUser, strDept, strTags, strContent);

            string strToken = AccessTokenContainer.TryGetToken(objConfig.WeixinCorpId, objConfig.WeixinCorpSecret);

            switch (strMsgType)
            {
            case "text":
                objResult = MassApi.SendText(strToken, strUser, strDept, strTags, iAppID.ToString(), strContent, IsSec);
                break;

            case "image":

                Dictionary <string, Stream> dic = new Dictionary <string, Stream>();

                // for (int i = 0; i < Request.Files.Count; i++)
                {
                    var stream = System.IO.File.OpenRead(HttpContext.Current.Server.MapPath("~/") + "/style/images/meteorshower.jpg");
                    dic.Add("meteorshower.jpg", stream);
                }
                var ret = MediaApi.Upload(strToken, UploadMediaFileType.file, dic, "");

                objResult = MassApi.SendImage(strToken, strUser, strDept, strTags, iAppID.ToString(), ret.media_id, IsSec);
                break;

            case "news":
                objResult = MassApi.SendNews(strToken, strUser, strDept, strTags, iAppID.ToString(), lstContent, IsSec);
                break;

            case "file":

                Dictionary <string, Stream> dic1 = new Dictionary <string, Stream>();

                for (int i = 0; i < HttpContext.Current.Request.Files.Count; i++)
                {
                    var stream = System.IO.File.OpenRead(HttpContext.Current.Server.MapPath("~/") + "/style/images/meteorshower.jpg");
                    dic1.Add("meteorshower.jpg", stream);
                }
                var ret1 = MediaApi.Upload(strToken, UploadMediaFileType.file, dic1, "");

                objResult = MassApi.SendFile(strToken, strUser, strDept, strTags, iAppID.ToString(), ret1.media_id, IsSec);
                break;
            }

            return(objResult);
        }
Example #6
0
        public void SendImageByGroupIdTest()
        {
            string file    = ""; //文件路径,以下以图片为例
            string groupId = ""; //分组Id

            var accessToken = AccessTokenContainer.GetToken(_appId);
            var mediaId     = MediaApi.Upload(accessToken, UploadMediaFileType.image, file).media_id;

            var result = GroupMessageApi.SendGroupMessageByGroupId(accessToken, groupId, mediaId, GroupMessageType.image, false);

            Assert.IsTrue(result.msg_id.Length > 0);
        }
Example #7
0
        //[TestMethod]
        public string SendImageByOpenIdTest()
        {
            string file = "";//文件路径,以下以图片为例

            string[] openIds = new string[] { _testOpenId };

            var accessToken = AccessTokenContainer.GetToken(_appId);
            var mediaId     = MediaApi.Upload(accessToken, UploadMediaFileType.image, file).media_id;
            var result      = GroupMessageApi.SendGroupMessageByOpenId(accessToken, GroupMessageType.image, mediaId, Config.TIME_OUT, openIds);

            Assert.IsTrue(result.msg_id.Length > 0);

            return(result.msg_id);
        }
        public static string GetMediaId(string strPath, string strToken)
        {
            // var saveFileName = Path.GetFileName(strPath.Replace("_t", "")); //不发缩略图
            // var targetFilePath = strPath.Substring(0, strPath.LastIndexOf(saveFileName));
            //  targetFilePath = targetFilePath.Trim('\\', '/');
            //var saveDir = Path.Combine(HttpContext.Current.Server.MapPath("~/"), targetFilePath);


            //   var fi = new FileInfo(HttpRuntime.AppDomainAppPath + strPath.Replace("_t", ""));
            var fi = new FileInfo(HttpRuntime.AppDomainAppPath + strPath);
            Dictionary <string, Stream> dic = new Dictionary <string, Stream>();

            dic.Add(fi.Name, fi.OpenRead());
            return(MediaApi.Upload(strToken, UploadMediaFileType.image, dic, "", 50 * 10000).media_id);
        }
Example #9
0
        //上传多媒体文件
        public JsonResult PostImage(string appid)
        {
            string mediaid = "";

            UploadTemporaryResultJson ret = new UploadTemporaryResultJson();

            if (Request.Files.Count > 0)
            {
                var strToken = rtntoken(int.Parse(appid));

                Dictionary <string, Stream> dic     = new Dictionary <string, Stream>();
                HttpPostedFileBase          objFile = Request.Files[0];
                var filename = objFile.FileName;
                var stream   = objFile.InputStream;
                dic.Add(filename, stream);
                // ret = MediaApi.UploadForeverMedia(strToken, appid, UploadMediaFileType.image, dic, "");
                ret = MediaApi.Upload(strToken, UploadMediaFileType.image, dic, "");
            }
            return(Json(ret, JsonRequestBehavior.AllowGet));
        }
Example #10
0
 /// <summary>
 /// 图片消息
 /// </summary>
 /// <param name="filePath"></param>
 /// <param name="strAPPID"></param>
 /// <param name="strUserS"></param>
 public void SendImage(string filePath, string strAPPID, string strUserS = "@all")
 {
     try
     {
         if (strUserS == "")
         {
             return;
         }
         if (Qyinfo.IsUseWX == "Y")
         {
             Senparc.Weixin.Work.AdvancedAPIs.Media.UploadTemporaryResultJson md = MediaApi.Upload(GetToken(), Senparc.Weixin.Work.UploadMediaFileType.image, filePath);
             if (md.media_id != "")
             {
                 MassApi.SendImage(GetToken(), strUserS, "", "", strAPPID, md.media_id);
             }
         }
     }
     catch { }
 }
        public static string GetMediaInfo(AutoReplyContentEnum cate, NewsInfoView news, int iAppID)
        {
            string   mediaId        = null;
            string   saveFileName   = null;
            string   targetFilePath = null;
            string   saveDir        = null;
            FileInfo fi             = null;
            dynamic  ret            = null;


            //上次的素材还没过期
            if (!string.IsNullOrEmpty(news.MediaId) && news.MediaCreateTime > 0)
            {
                if (DateTimeHelper.GetDateTimeFromXml(news.MediaCreateTime).AddDays(3) > DateTime.Now)
                {
                    return(news.MediaId);
                }
            }


            Dictionary <string, Stream> dic = new Dictionary <string, Stream>();

            var objConfig = WeChatCommonService.GetWeChatConfigByID(iAppID);

            bool isCrop = (objConfig.IsCorp == null || objConfig.IsCorp.Value);

            string strToken = (objConfig.IsCorp != null && !objConfig.IsCorp.Value) ? "" : Innocellence.Weixin.QY.CommonAPIs.AccessTokenContainer.TryGetToken(objConfig.WeixinCorpId, objConfig.WeixinCorpSecret);


            log.Debug("GetMediaInfo start:  cate:{0}  iAppID:{1}", cate, iAppID);

            switch (cate)
            {
            case AutoReplyContentEnum.IMAGE:
                //saveFileName = Path.GetFileName(news.ImageContent.Replace("_t", "")); //不发缩略图
                //targetFilePath = news.ImageContent.Substring(0, news.ImageContent.LastIndexOf(saveFileName));
                //targetFilePath = targetFilePath.Trim('\\', '/');
                //saveDir = Path.Combine(HttpContext.Current.Server.MapPath("~/"), targetFilePath);
                //fi = new FileInfo(Path.Combine(saveDir, saveFileName));

                fi = new FileInfo(HttpRuntime.AppDomainAppPath + news.ImageContent.Replace("_t", ""));

                if (isCrop)
                {
                    dic.Add(fi.Name, fi.OpenRead());
                    ret = MediaApi.Upload(strToken, UploadMediaFileType.image, dic, "", 50 * 10000);
                }
                else
                {
                    ret = Innocellence.Weixin.MP.AdvancedAPIs.MediaApi.UploadTemporaryMedia(objConfig.WeixinCorpId, objConfig.WeixinCorpSecret,
                                                                                            Innocellence.Weixin.MP.UploadMediaFileType.image, fi.OpenRead(), fi.FullName, 50 * 10000);
                }

                news.MediaId = ret.media_id;
                mediaId      = ret.media_id;
                break;

            case AutoReplyContentEnum.VOICE:
                //saveFileName = Path.GetFileName(news.SoundSrc);
                //targetFilePath = news.SoundSrc.Substring(0, news.SoundSrc.LastIndexOf(saveFileName));
                //targetFilePath = targetFilePath.Trim('\\', '/');
                //saveDir = Path.Combine(HttpContext.Current.Server.MapPath("~/"), targetFilePath);
                //fi = new FileInfo(Path.Combine(saveDir, saveFileName));

                fi = new FileInfo(HttpRuntime.AppDomainAppPath + news.SoundSrc.Replace("_t", ""));

                dic.Add(fi.Name, fi.OpenRead());
                try
                {
                    if (isCrop)
                    {
                        ret = MediaApi.Upload(strToken, UploadMediaFileType.voice, dic, "", 50 * 10000);
                    }
                    else
                    {
                        ret = Innocellence.Weixin.MP.AdvancedAPIs.MediaApi.UploadTemporaryMedia(objConfig.WeixinCorpId, objConfig.WeixinCorpSecret,
                                                                                                Innocellence.Weixin.MP.UploadMediaFileType.voice, fi.OpenRead(),
                                                                                                fi.FullName, 50 * 10000);
                    }
                }
                catch (ErrorJsonResultException ex)
                {
                    if (ex.JsonResult.errcode == Weixin.ReturnCode.语音播放时间超过限制)
                    {
                        throw new Exception("语音播放时间超过限制,请上传播放长度不超过60秒的语音文件。");
                    }
                    else
                    {
                        throw;
                    }
                }
                news.MediaId = ret.media_id;
                mediaId      = ret.media_id;
                break;

            case AutoReplyContentEnum.VIDEO:
                //saveFileName = Path.GetFileName(news.VideoContent);
                //targetFilePath = news.VideoContent.Substring(0, news.VideoContent.LastIndexOf(saveFileName));
                //targetFilePath = targetFilePath.Trim('\\', '/');
                //saveDir = Path.Combine(HttpContext.Current.Server.MapPath("~/"), targetFilePath);
                //fi = new FileInfo(Path.Combine(saveDir, saveFileName));

                fi = new FileInfo(HttpRuntime.AppDomainAppPath + news.VideoContent.Replace("_t", ""));


                if (isCrop)
                {
                    dic.Add(fi.Name, fi.OpenRead());
                    ret = MediaApi.Upload(strToken, UploadMediaFileType.video, dic, "", 50 * 10000);
                }
                else
                {
                    ret = Innocellence.Weixin.MP.AdvancedAPIs.MediaApi.UploadTemporaryMedia(objConfig.WeixinCorpId, objConfig.WeixinCorpSecret,
                                                                                            Innocellence.Weixin.MP.UploadMediaFileType.video, fi.OpenRead(), fi.FullName, 50 * 10000);
                }
                news.MediaId = ret.media_id;
                mediaId      = ret.media_id;
                break;

            case AutoReplyContentEnum.FILE:
                //saveFileName = Path.GetFileName(news.FileSrc);
                //targetFilePath = news.FileSrc.Substring(0, news.FileSrc.LastIndexOf(saveFileName));
                //targetFilePath = targetFilePath.Trim('\\', '/');
                //saveDir = Path.Combine(HttpContext.Current.Server.MapPath("~/"), targetFilePath);
                //fi = new FileInfo(Path.Combine(saveDir, saveFileName));

                fi = new FileInfo(HttpRuntime.AppDomainAppPath + news.FileSrc.Replace("_t", ""));
                string extention   = fi.Name.Substring(fi.Name.LastIndexOf('.'));
                string fileName    = string.IsNullOrEmpty(news.RealFileName) ? news.NewsTitle : news.RealFileName;
                string displayName = fileName.EndsWith(extention) ? fileName : fileName + extention;
                if (isCrop)
                {
                    dic.Add(displayName, fi.OpenRead());
                    ret = MediaApi.Upload(strToken, UploadMediaFileType.file, dic, "", 50 * 10000);
                }
                else
                {
                    //服务号暂时不支持推送文件.
                    //ret = Innocellence.Weixin.MP.AdvancedAPIs.MediaApi.UploadTemporaryMedia(objConfig.WeixinCorpId, objConfig.WeixinCorpSecret, Innocellence.Weixin.MP.UploadMediaFileType.voice, fi.OpenRead(), Path.Combine(saveDir, saveFileName), 50 * 10000);
                }
                news.MediaId = ret.media_id;
                mediaId      = ret.media_id;
                break;

            default:
                break;
            }

            if (ret != null)
            {
                news.MediaCreateTime = ret.created_at;


                log.Debug("GetMediaInfo end:  media_id:{0} ", ret.media_id);
            }
            return(mediaId);
        }
        /// <summary>
        /// 上传文件到微信服务器
        /// </summary>
        /// <param name="appId"></param>
        /// <param name="fileId"></param>
        /// <param name="replyType"></param>
        /// <returns></returns>
        public ActionResult UploadFileToWx(int appId, int fileId, int replyType)
        {
            var fileEntity = _attachmentsItemService.Repository.Entities.FirstOrDefault(x => x.Id == fileId);

            if (fileEntity == null || !System.IO.File.Exists(Path.Combine(Server.MapPath("~/"), fileEntity.AttachmentUrl)))
            {
                ModelState.AddModelError("Invalid Input", "此文件不存在,请确保已经上传到服务器");
                return(Json(GetErrorJson(), JsonRequestBehavior.AllowGet));
            }

            // 取得微信ID,非DB中用的AppID
            var    config     = WeChatCommonService.GetWeChatConfigByID(appId);
            var    dic        = new Dictionary <string, Stream>();
            var    fullPath   = Path.Combine(Server.MapPath("~/"), fileEntity.AttachmentUrl);
            var    fileStream = new FileStream(fullPath, FileMode.Open, FileAccess.Read);
            string fileName   = fileEntity.AttachmentTitle;

            if (!fileName.EndsWith(fileEntity.Extension))
            {
                fileName = fileName + fileEntity.Extension;
            }
            dic.Add(fileName, fileStream);
            // 取得微信Token
            var wxToken = getWxToken(appId);

            var uploadFileType = UploadMediaFileType.file;

            switch (replyType)
            {
            case (int)AutoReplyContentEnum.IMAGE:
            {
                uploadFileType = UploadMediaFileType.image;
                break;
            }

            case (int)AutoReplyContentEnum.VOICE:
            {
                uploadFileType = UploadMediaFileType.voice;
                break;
            }

            case (int)AutoReplyContentEnum.VIDEO:
            {
                uploadFileType = UploadMediaFileType.video;
                break;
            }

            default:
            {
                uploadFileType = UploadMediaFileType.file;
                break;
            }
            }

            var ret = MediaApi.Upload(wxToken, uploadFileType, dic, "", 10000 * 50);

            // 更新FileManage表的MediaID
            _attachmentsItemService.UpdateMediaId(fileEntity.Id, ret.media_id, DateTimeHelper.GetDateTimeFromXml(ret.created_at));

            return(Json(ret, JsonRequestBehavior.AllowGet));
        }
        /// <summary>
        /// 批量操作--导入成员
        /// </summary>
        /// <param name="OPType"></param>
        /// <returns></returns>
        public ActionResult batchuser(int?OPType)
        {
            string strRet = "[\"jsonrpc\" : \"2.0\", \"result\" : null, \"id\" : \"{0}\"]";

            string strErrRet = "[\"jsonrpc\" : \"2.0\", \"error\" : [\"code\": {0}, \"message\": \"{1}\"], \"id\" : \"id\"]";

            string operateType = "";

            try
            {
                if (Request.Files.Count == 0)
                {
                    strRet = string.Format(strErrRet, "100", "未发现上传文件!");
                    return(Content(strRet));
                }

                Dictionary <string, Stream> dic = new Dictionary <string, Stream>();

                for (int i = 0; i < Request.Files.Count; i++)
                {
                    HttpPostedFileBase objFile = Request.Files[i];
                    dic.Add(objFile.FileName, objFile.InputStream);
                }


                var ret = MediaApi.Upload(GetToken(), UploadMediaFileType.file, dic, "");

                System.Threading.Thread.Sleep(1000);

                //上传失败
                if (!string.IsNullOrEmpty(ret.errmsg) && ret.errmsg.IndexOf("ok") < 0)
                {
                    strRet = string.Format(strErrRet, ret.errcode, ret.errmsg);
                    return(Content(strRet));
                }

                BatchUserResult objRet;

                var       objConfig   = WeChatCommonService.GetWeChatConfig(AppId);
                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                     //app.innocellence.com/wechatqy/led
                    }
                };

                if (OPType == 1)
                {
                    objRet      = MailListApi.BatchUpdateUser(GetToken(), objUser);
                    operateType = "sync_user";
                }
                else if (OPType == 2)
                {
                    objRet      = MailListApi.BatchReplaceUser(GetToken(), objUser);
                    operateType = "replace_user";
                }
                else if (OPType == 3)
                {
                    objRet      = MailListApi.BatchReplaceDept(GetToken(), objUser);
                    operateType = "replace_party";
                }
                else
                {
                    objRet = new BatchUserResult()
                    {
                        errmsg = "参数错误!"
                    };
                }

                //当执行导入操作时将返回的jobId插入到表中去
                if (!string.IsNullOrEmpty(objRet.errmsg))
                {
                    strRet = string.Format(strRet, objRet.jobid);
                    var jobLog = new BatchJobLog()
                    {
                        JobID       = objRet.jobid,
                        Status      = 0,
                        Type        = operateType,
                        CreatedDate = DateTime.Now
                    };

                    _batchJobLogService.Repository.Insert(jobLog);//插入表中
                }
                else
                {
                    strRet = string.Format(strErrRet, objRet.errcode, objRet.errmsg);
                }
            }
            catch (Exception ex)
            {
                strRet = string.Format(strErrRet, "102", ex.Message);
            }


            return(Content(strRet.Replace("[", "{").Replace("]", "}")));
        }
Example #14
0
 /// <summary>
 /// 上传文件;
 /// </summary>
 /// <param name="filepath"></param>
 /// <returns></returns>
 public UploadTemporaryResultJson UploadFile(string filepath)
 {
     return(MediaApi.Upload(AccessTokenOrAppKey, Senparc.Weixin.Work.UploadMediaFileType.file, filepath));
 }
        /// <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);
        }