using DAL.Redis; using Ninject; using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; using System.Web; using WX.CRM.Common; using WX.CRM.DAL.Redis; using WX.CRM.IBLL.Res; using WX.CRM.IBLL.WeWork; using WX.CRM.Model.DTO.wework; using WX.CRM.Model.Enum; using WX.CRM.WebHelper; using WX.CRM.WebHelper.Infrastructure; namespace WxService { // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“WeWorkService”。 // 注意: 为了启动 WCF 测试客户端以测试此服务,请在解决方案资源管理器中选择 WeWorkService.svc 或 WeWorkService.svc.cs,然后开始调试。 public class WeWorkService : IWeWorkService { private ICorpInfo wework_corpinfo = NinjectControllerFactory.ninjectKernel.Get(); private IRES_CUSTOMER _RES_CUSTOMER = NinjectControllerFactory.ninjectKernel.Get(); private IRcontact wework_rcontact = NinjectControllerFactory.ninjectKernel.Get(); private IWeWork_MsgKey wework_msgkey = NinjectControllerFactory.ninjectKernel.Get(); private RedisString _redisMsg = new RedisString(); private readonly PubSub _sub = new PubSub(); //private const string WxFix = "weworkid:"; private const string WxMsgFix = "wework:"; public async Task> XposedMessage(weworkmsg msg) { try { msg.JsonText = HttpUtility.UrlDecode(msg.JsonText, Encoding.UTF8);//url解码 if (msg.tabtype == "message") { bool isExists = true; StorageMessage info = JsonHelper.JsonDivertToObj(msg.JsonText);// JsonConvert.DeserializeObject(); string keyname = WxMsgFix + info.id + "|" + info.vid; isExists = await _redisMsg.ExistsAsync(keyname); if (!isExists) { isExists = wework_msgkey.HasMsgKey(keyname);//redis中找不到,就再从数据库中找一次 } if (isExists) { return new JsonResult { result = true, retcode = (int)EnumInterfaceErrcode.调用成功, retmsg = "success" }; } else { bool ret = await PushRedisAndPublish(info, "weworkmessage"); if (ret) { TimeSpan span = new TimeSpan(60, 0, 0, 0, 0);//保留60天 await _redisMsg.SetAsync(keyname, string.Empty, span); wework_msgkey.CheckAndSetKey(keyname); } else { return new JsonResult { result = false, retcode = (int)EnumInterfaceErrcode.调用成功但有错误, retmsg = "调用成功但有错误" }; } } //return new JsonResult { result = false, retcode = (int)EnumInterfaceErrcode.调用成功但有错误, retmsg = "暂时不处理Message数据" }; } else if (msg.tabtype == "corpinfo") { CorpInfo info = JsonHelper.JsonDivertToObj(msg.JsonText);// JsonConvert.DeserializeObject(); if (info.corpName == "微信") return new JsonResult { result = true, retcode = (int)EnumInterfaceErrcode.调用成功, retmsg = "上传成功" }; wework_corpinfo.CorpInfo_Set(info);//企业信息 入库 if (info.staffInfo != null) wework_corpinfo.StaffInfo_Set(info);//工作人员入库 } else if (msg.tabtype == "rcontact") { Rcontact info = JsonHelper.JsonDivertToObj(msg.JsonText);// JsonConvert.DeserializeObject(); if (info.extras != null) { wework_rcontact.Rcontact_Set(info, msg.JsonText);//好友 入库 //LogHelper.Info("好友上传了:" + msg.JsonText); var db = info.extras.remarkPhone; if (db != null && db.Length > 0) { List resids = new List(); foreach (var item in db) { string phone = Utility.JavaByteToString(item.phone); if (!string.IsNullOrEmpty(phone) && Utility.ChekMobile(phone)) { string resid = WX.CRM.Common.ResUtil.CreateResId(phone); resids.Add(resid); _RES_CUSTOMER.ResgisterCustomer(phone, resid, "CRM_WeWork"); wework_rcontact.Rcontact_Relate(info.remoteId.ToString(), info.vid.ToString(), resid); } } if (resids.Count > 1) { wework_rcontact.Res_Customer_Relate(string.Join(",", resids)); } } } } return new JsonResult { result = true, retcode = (int)EnumInterfaceErrcode.调用成功, retmsg = "上传成功" }; } catch (Exception ex) { LogHelper.Error("企业微信上传数据错误" + msg.tabtype + ":" + ex.ToString()); return new JsonResult { result = false, retcode = (int)EnumInterfaceErrcode.调用成功但有错误, retmsg = "调用成功但有错误" }; } } public JsonResult AlivePut(weworkalive info) { ValidationErrors errors = new ValidationErrors(); try { wework_corpinfo.Alive_Put(info);//改成过程逻辑方式 } catch (Exception ex) { LogHelper.Error("企业微信CRM心跳异常:" + ex.ToString()); errors.Add(ex.ToString()); } if (errors.Count == 0) return new JsonResult { result = true, retcode = (int)EnumInterfaceErrcode.调用成功, retmsg = "调用成功" }; return new JsonResult { result = false, retcode = (int)EnumInterfaceErrcode.调用成功但有错误, retmsg = "调用成功但有错误" }; } private async Task PushRedisAndPublish(T model, string key) { try { //写入队列 var result = await new RedisList().LeftPushAsync(key, model); if (result > 0) { //发送订阅通知 await _sub.PublishAsync("sub:" + key, ""); return true; } return false; } catch (Exception ex) { LogHelper.Error(ex.ToString()); return false; } } } }