using System; using System.Linq; using System.Collections.Generic; using System.Threading.Tasks; using System.Threading; using System.Net.Http; using Quartz; using model; using Newtonsoft.Json.Linq; namespace wwsync { public class organsync: IJob { public organsync() { } public Task Execute(IJobExecutionContext context) { Console.WriteLine($"organsync execute at {DateTime.Now}"); InitUser(); Console.WriteLine($"organsync execute InitUser end at {DateTime.Now}"); return Task.CompletedTask; } public void InitUser() { LogHelper.Info("InitUser()"); var t1 = department_sync(); var t2 = corptag_sync(); var t3 = hhuser_sync(); Task.WaitAll(t1, t2, t3); } public async Task webdept(ww_corp corp) { try { Console.WriteLine($"department_sync {corp.corpid}"); HttpClient client = new(); var obj = await apicaller.wwapiwithtoken(appsetteings.URL_dept, corp.corpid, corp.txlsecret); if (obj["errcode"].ToString() != "0") return; Dictionary dtdept = new Dictionary(); foreach (var dpt in obj["department"]) { ww_dept oo = new ww_dept() { corpid = corp.corpid, deptid = Convert.ToInt32(dpt["id"]), deptname = dpt["name"].ToString(), parentid = Convert.ToInt32(dpt["parentid"]), orderseq = dpt["order"].ToString() }; dtdept[oo.deptid] = oo; } if (dtdept.Count == 0) return; using (var context = new DataContext()) { List olddepts = context.ww_depts.Where(obj=>obj.corpid==corp.corpid).ToList(); HashSet old_ids = new HashSet(); foreach (var dept in olddepts) { old_ids.Add(dept.deptid); if (!dtdept.ContainsKey(dept.deptid)) { context.ww_depts.Remove(dept); context.SaveChanges(); } else { var webdept = dtdept[dept.deptid]; dept.parentid = webdept.parentid; dept.deptname = webdept.deptname; dept.orderseq = webdept.orderseq; context.SaveChanges(); } } var newids = dtdept.Keys.Except(old_ids).ToList(); foreach (var id in newids) { var webdept = dtdept[id]; context.ww_depts.Add(webdept); context.SaveChanges(); } } } catch(Exception ex) { LogHelper.Error(ex.ToString()); } } public async Task department_sync() { /* return Task.Run(async () => { foreach (var corp in appsetteings.allcorp.Values) { await webdept(corp); } }); */ foreach (var corp in appsetteings.allcorp.Values) { await webdept(corp); } } private async Task webcorptag(ww_corp corp) { try { Console.WriteLine($"corptag_sync {corp.corpid}"); var obj = await apicaller.wwapiwithtoken(appsetteings.URL_corptaglist, corp.corpid, corp.khsecret); if (obj["errcode"].ToString() != "0") return; Dictionary dttags = new Dictionary(); foreach (JObject dpt in obj["tag_group"]) { ww_grouptag oo = new ww_grouptag() { corpid = corp.corpid, group_id = dpt["group_id"].ToString(), group_name = dpt["group_name"].ToString(), create_time =long.Parse(dpt["create_time"].ToString()), order = int.Parse(dpt["order"].ToString()), deleted = dpt.ContainsKey("deleted")? bool.Parse(dpt["deleted"].ToString()) : false, tag = dpt["tag"].ToString() }; dttags[oo.group_id] = oo; } if (dttags.Count == 0) return; using (var context = new DataContext()) { List oldtags = context.ww_grouptags.Where(obj => obj.corpid == corp.corpid).ToList(); HashSet old_ids = new HashSet(); foreach (var gtag in oldtags) { old_ids.Add(gtag.group_id); if (!dttags.ContainsKey(gtag.group_id)) { context.ww_grouptags.Remove(gtag); context.SaveChanges(); } else { var webgtag = dttags[gtag.group_id]; context.Entry(gtag).CurrentValues.SetValues(webgtag); context.SaveChanges(); } } var newids = dttags.Keys.Except(old_ids).ToList(); foreach (var id in newids) { var webgtag = dttags[id]; context.ww_grouptags.Add(webgtag); context.SaveChanges(); } } } catch (Exception ex) { LogHelper.Error(ex.ToString()); } } public async Task corptag_sync() { foreach (var corp in appsetteings.allcorp.Values) { await webcorptag(corp); } } public async Task hhuser_sync() { foreach (var corp in appsetteings.allcorp.Values) { try { string corpid = corp.corpid; LogHelper.Info($"{corpid} hhuser_sync"); HashSet webids = new HashSet(); HashSet dbids = new HashSet(); var obj = await apicaller.wwapiwithtoken(appsetteings.URL_extrightuser, corp.corpid, corp.khsecret); if (obj["errcode"].ToString() != "0") continue; foreach (var userid in obj["follow_user"]) { webids.Add(userid.ToString()); } using (var context = new DataContext()) { //List dbusers = context.ww_hhusers.Where(u=>u.corpid==corpid).ToList(); Dictionary dtusers = context.ww_hhusers.Where(u => u.corpid == corpid).ToDictionary(x => x.userid, x => x); dbids.UnionWith(dtusers.Keys); //new var webdiff = webids.Except(dbids); foreach (var uid in webdiff) { var wuser = await hhuserfromweb(corpid, corp.txlsecret, uid); if (wuser == null) continue; context.ww_hhusers.Add(wuser); context.SaveChanges(); } //update foreach (var uid in webids.Intersect(dbids)) { var huser = dtusers[uid]; if (huser.lastupdate < DateTime.Today) { var wuser = await hhuserfromweb(corpid, corp.txlsecret, uid); if (wuser == null) continue; context.Entry(huser).CurrentValues.SetValues(wuser); context.SaveChanges(); } } //delete foreach (var uid in dbids.Except(webids)) { context.ww_hhusers.Remove(dtusers[uid]); context.SaveChanges(); } } if (webids.Count == 0) continue; Console.WriteLine($"{corp.corpid} threadcount:({webids.Count})"); int i = 0; foreach (var uid in webids) { var bok = await hhuser_getextuser(uid, corp); if (bok) LogHelper.Info($"{corp.corpid} end getextuser({uid}) threadid:{Thread.CurrentThread.ManagedThreadId} i:{i++}"); } } catch (Exception ex) { LogHelper.Error(ex.ToString()); } } } public async Task hhuser_getextuser(string uid, ww_corp corp) { using (var context = new DataContext()) { string url = string.Format(appsetteings.URL_extuserlist, uid); var obj = await apicaller.wwapiwithtoken(url, corp.corpid, corp.khsecret); if (obj["errcode"].ToString() != "0") { if (obj["errcode"].ToString() != "84061") { LogHelper.Info($"{corp.corpid} await getextuser({uid}) threadid:{Thread.CurrentThread.ManagedThreadId} obj:{obj.ToString()}"); Thread.Sleep(2 * 1000); } return true; } HashSet wextids = new(); foreach (string userid in obj["external_userid"]) wextids.Add(userid); List dblist = context.ww_user_extusers.Where(u => u.corpid == corp.corpid && u.userid == uid).ToList(); //enable or delete: set deleted HashSet dbids = new(); foreach (var user in dblist) { dbids.Add(user.extuserid); if (user.deleted == wextids.Contains(user.extuserid)) { user.deleted = !user.deleted; context.SaveChanges(); } } //check new IEnumerable ndiff = wextids; if (!appsetteings.brefreshall) ndiff = wextids.Except(dbids); foreach (var extuid in ndiff) { //ww_extusres var wuser = await extuserfromweb(corp.corpid, corp.khsecret, uid, extuid); if (wuser.Item1 != null) { ww_extuser? dbuser = context.ww_extusres.FirstOrDefault(obj => obj.userid == extuid && obj.corpid == corp.corpid); if (dbuser == null) context.ww_extusres.Add(wuser.Item1); else context.Entry(dbuser).CurrentValues.SetValues(wuser.Item1); try { context.SaveChanges(); } catch (Exception ex) { LogHelper.Error(ex.ToString()); } } //ww_user_extusers if (wuser.Item2 != null) { var eue = dblist.FirstOrDefault(obj => obj.extuserid == extuid); try { if (eue == null) context.ww_user_extusers.Add(wuser.Item2); else { context.Entry(eue).CurrentValues.SetValues(wuser.Item2); } context.SaveChanges(); } catch(Exception ex) { LogHelper.Error(ex.ToString()); } } } } return true; } private async Task hhuserfromweb(string corpid, string txlsecret, string userid) { var wbuser = await apicaller.wwapiwithtoken(string.Format(appsetteings.URL_userinfo, userid), corpid, txlsecret); if (wbuser["errcode"].ToString() != "0") return null; wbuser.Remove("errcode"); wbuser.Remove("errmsg"); ww_hhuser user = new() { corpid = corpid, userid = userid, name = wbuser["name"].ToString(), mobile = wbuser["mobile"].ToString(), exinfo = wbuser.ToString(), lastupdate = DateTime.Now }; return user; } private async Task> extuserfromweb(string corpid, string khsecret, string uid, string extuid) { var wbuser = await apicaller.wwapiwithtoken(string.Format(appsetteings.URL_extuserinfo, extuid), corpid, khsecret); var error = new Tuple(null, null); try { if (wbuser["errcode"].ToString() != "0") return error; wbuser.Remove("errcode"); wbuser.Remove("errmsg"); ww_extuser user = new() { corpid = corpid, userid = extuid, unionid = (wbuser["external_contact"] as JObject).ContainsKey("unionid") ? wbuser["external_contact"]["unionid"].ToString() : "", name = wbuser["external_contact"]["name"].ToString(), avatar = wbuser["external_contact"]["avatar"].ToString(), ctime = DateTime.Now, lastupdate = DateTime.Now, exinfo = wbuser.ToString() }; ww_user_extuser friend = null; if (wbuser.ContainsKey("follow_user")) { foreach (var item in wbuser["follow_user"]) { var obitem = item as JObject; if (item["userid"].ToString() != uid) continue; int type = 0; if (obitem.ContainsKey("oper_userid")) { if (item["oper_userid"].ToString() == uid) type = 1; else if (item["oper_userid"].ToString() != extuid) type = 2; } //tags JArray tag1 = new JArray(); JArray tag2 = new JArray(); if (obitem.ContainsKey("tags")) { foreach (JObject tag in item["tags"]) { if (tag["type"].ToString() == "1") tag1.Add(tag); else if (tag["type"].ToString() == "2") tag2.Add(tag); } } friend = new() { corpid = corpid, userid = uid, extuserid = extuid, remark = obitem.ContainsKey("remark") ? item["remark"].ToString() : "", description = obitem.ContainsKey("description") ? item["description"].ToString() : "", createtime = obitem.ContainsKey("createtime") ? long.Parse(item["createtime"].ToString()) : new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds(), deleted = false, tags_type1 = tag1.ToString(), tags_type2 = tag2.ToString(), remark_corp_name = obitem.ContainsKey("remark_corp_name") ? item["remark_corp_name"].ToString() : "", add_type = type, add_way = obitem.ContainsKey("add_way") ? Int32.Parse(item["add_way"].ToString()):0 }; } } return new Tuple(user, friend); } catch(Exception ex) { LogHelper.Error(ex.ToString()); return error; } } } }