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.请求成功); }
//[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); }
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); }
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; }
/// <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); }
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); }
//[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); }
//上传多媒体文件 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)); }
/// <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("]", "}"))); }
/// <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); }