using CRM.Core.DTO; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using WX.CRM.BLL.Base; using WX.CRM.BLL.Res; using WX.CRM.BLL.Ww; using WX.CRM.BLL.Wx; using WX.CRM.Common; using WX.CRM.DAL; using WX.CRM.IBLL.Res; using WX.CRM.IBLL.Ww; using WX.CRM.IBLL.Wx; using WX.CRM.Model.Entity; namespace WX.CRM.CRMServices.WeiXin { /// /// 自动绑定 /// public static class AutoBound { //更新参数 //工作内容 //get wework.ww_extuser json //手机号转 resid //insert Orcl_TG.ww_extuser_resid //update Orcl_TG.res_customerdetail isbound private static BAS_PARAMETER_BL paramter_bl = new BAS_PARAMETER_BL(); private static IWX_SZZYORDER _wxSzzyorder = new WX_SZZYORDER_BL(); private static IWw_huser _iww_hhuser_service = new Ww_huser_BL(); private static readonly IRES_CUSTOMER res_customer = new RES_CUSTOMER_BL(); public static string extuserid = string.Empty; public static void Bound() { var syskey = paramter_bl.GetModel_Patameter("WW_Extuser_MAXUPDATE");//获取系统上次同步最后更新时间 DateTime preLastUpdate = new DateTime(); //DateTime preCtime = new DateTime(); //配置保存 ctime;lastupdate var lastUpdatekey = syskey.PARAVALUE.Split(';')[0]; // var ctimekey = syskey.PARAVALUE.Split(';')[1]; // var hasCtime = DateTime.TryParse(ctimekey, out preCtime);//上次获取是否 lastupdate 没变 if (DateTime.TryParse(lastUpdatekey, out preLastUpdate)) { List lastTimeList = new List(); List cTimeList = new List(); var companycode = Utility.GetSettingOrNullByKey("DataClientCode"); Dictionary> dicDept = _iww_hhuser_service.GetAllCorpDept(companycode); List logs = new List(); MySqlDbHelper mySqlhelper = new MySqlDbHelper("MysqlQWConn"); DateTime TODate = DateTime.Now.Date.AddDays(1); string sql = $@"select * from ww_extuser where lastupdate >='{preLastUpdate}' and lastupdate < '{TODate.ToString("yyyy-MM-dd")}' and date_format(lastupdate ,'%H:%i:%s')<>'00:00:00' {(!string.IsNullOrEmpty(extuserid) ? (" and (userid!='" + extuserid + "' or lastupdate>'" + preLastUpdate + "') ") : " ")} order by lastupdate asc,ctime asc limit 1000";//=必要:保证 一个客户多个用户电话信息在插入时其中一条插入失败,下次能被获取到 //LogHelper.Info(sql); DataSet table = mySqlhelper.ExecuteDataTable(sql);//获取外部联系人数据 //处理外部联系人关系数据 foreach (DataRow row in table.Tables[0].Rows) { var exinfo = row["exinfo"].ToString(); var corpid = row["corpid"].ToString(); lastTimeList.Add(Convert.ToDateTime(row["lastupdate"]));//记录每条数据的时间 cTimeList.Add(Convert.ToDateTime(row["ctime"]));//记录每条数据的时间 extuserid = row["userid"].ToString();//获取最后一条数据得 外部联系人ID List remark_mobiles = new List(); if (exinfo != "-" && !string.IsNullOrEmpty(exinfo)) { var model = JsonConvert.DeserializeObject(exinfo); var unionid = model.external_contact.unionid; var external_userid = model.external_contact.external_userid; foreach (var user in model.follow_user) { foreach (var mobile in user.remark_mobiles)//遍历json电话 { try { if (string.IsNullOrEmpty(mobile) || mobile.Trim().Length < 8) continue; string mobileM = Utility.GetMobile(mobile.Trim());//提取号码 if (string.IsNullOrEmpty(mobileM)) continue; //IDictionary r = new Dictionary(); //WW_EXTUSER_PARES wep = new WW_EXTUSER_PARES(); //wep.RESID = Common.ResUtil.CreateResId(mobileM); //wep.EXTERNAL_USERID = external_userid; //wep.USERID = user.userid; //wep.UNIONID = unionid ?? ""; //wep.REMAKE = user.remark ?? ""; //wep.CORPID = corpid ?? ""; //logs.Add(wep); ////注册资源 //res_customer.ResgisterCustomer(mobileM, wep.RESID, "qwzy");//企微资源 ww_extuser_pares_dept wep = new ww_extuser_pares_dept { RESID = Common.ResUtil.CreateResId(mobileM), EXTERNAL_USERID = external_userid, USERID = user.userid, UNIONID = unionid ?? "", REMAKE = user.remark ?? "", CORPID = corpid ?? "", MOBILE = mobileM }; logs.Add(wep); } catch (Exception ex) { WX.CRM.Common.LogHelper.Error("AutoBound错误记录:" + exinfo); throw; } } } } } // //using (TransactionScope tran = new TransactionScope()) { //} //时间由远到近 避免中途出错漏掉数据 //按照顺序 处理获取到的数据 foreach (var item in logs.OrderBy(m => m.CTIME)) { try { var hhuser = _iww_hhuser_service.HHuser_Get(item.USERID, item.CORPID); if (hhuser != null && hhuser.deptid.HasValue && dicDept.ContainsKey(hhuser.corpid) && dicDept[hhuser.corpid].Contains(hhuser.deptid.Value)) { //注册资源 res_customer.ResgisterCustomer(item.MOBILE, item.RESID, "qwzy");//企微资源 item.ISINNERDEPT = 1;//是内部资源 var res = _wxSzzyorder.UpdateResIdByWwUserName(item.RESID, item.EXTERNAL_USERID, item.USERID, item.CORPID); if (!res) { continue;//处理失败时跳出 } else { //_wxSzzyorder.UpdateIsBoundByResId(resId); var host = Utility.GetSettingOrNullByKey("DataSyncApiUrl"); var url = host + "/api/DataSync"; var data = new { resid = item.RESID, userid = item.EXTERNAL_USERID, deptcode = companycode }; var para = new SYNC_PUSH_DTO() { bidatatype = "Server_WwextUserResid", deptcode = companycode, jsontext = data.ToJson() }; var rep = Utility.PostAjaxData(url, para.ToJson(), Encoding.UTF8); var ret2 = Utility.JSONToObject(rep); if (!ret2.result) { LogHelper.Info("同步到中心点异常:" + para.ToJson()); //message = "关联成功!同步到总部失败!"; } } } else item.ISINNERDEPT = 0; var logRes = _wxSzzyorder.InsertWW_EXTUSER_PARES(new WW_EXTUSER_PARES() { RESID = item.RESID, EXTERNAL_USERID = item.EXTERNAL_USERID, USERID = item.USERID, UNIONID = item.UNIONID, REMAKE = item.REMAKE, CORPID = item.CORPID, ISINNERDEPT = item.ISINNERDEPT }); } catch (Exception e) { LogHelper.Error(e.ToString()); continue;//处理失败时跳出 } } if (lastTimeList.Any()) {//处理到数据才修改配置 //if (lastTimeList.Max() == lastTimeList.Min()) //{ // syskey.PARAVALUE = $"{lastTimeList.Max().ToString("yyyy-MM-dd HH:mm:ss")};{cTimeList.Max().ToString("yyyy-MM-dd HH:mm:ss")}"; //} //else //{ syskey.PARAVALUE = $"{lastTimeList.Max().ToString("yyyy-MM-dd HH:mm:ss")};"; //} //更新系统变量 最后处理数据时间 Common.ValidationErrors errors = new Common.ValidationErrors(); paramter_bl.Update_Parameter(ref errors, syskey); } } } } public class WwExtUserView { public External_Contact external_contact { get; set; } public List follow_user { get; set; } public string corpid { get; set; } } public class External_Contact { public string external_userid { get; set; } public string name { get; set; } public int type { get; set; } public string avatar { get; set; } public int gender { get; set; } public string unionid { get; set; } } public class Follow_User { public string saleeid { get; set; } public string userid { get; set; } public string remark { get; set; } public string description { get; set; } public long createtime { get; set; } public string bindtime { get; set; } public List remark_mobiles { get; set; } public string uname { get; set; } } public class ww_extuser_pares_dept { public string RESID { get; set; } public string EXTERNAL_USERID { get; set; } public string USERID { get; set; } public string UNIONID { get; set; } public string REMAKE { get; set; } public string CORPID { get; set; } public DateTime CTIME { get; set; } /// /// 是否是内部事业部的数据 /// public int ISINNERDEPT { get; set; } public string MOBILE { get; set; } } }