wwservice/wwsync/organsync.cs

434 lines
18 KiB
C#

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<int, ww_dept> dtdept = new Dictionary<int, ww_dept>();
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<ww_dept> olddepts = context.ww_depts.Where(obj=>obj.corpid==corp.corpid).ToList();
HashSet<int> old_ids = new HashSet<int>();
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<string, ww_grouptag> dttags = new Dictionary<string, ww_grouptag>();
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<ww_grouptag> oldtags = context.ww_grouptags.Where(obj => obj.corpid == corp.corpid).ToList();
HashSet<string> old_ids = new HashSet<string>();
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<string> webids = new HashSet<string>();
HashSet<string> dbids = new HashSet<string>();
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<ww_hhuser> dbusers = context.ww_hhusers.Where(u=>u.corpid==corpid).ToList<ww_hhuser>();
Dictionary<string, ww_hhuser> 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<Boolean> 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<string> wextids = new();
foreach (string userid in obj["external_userid"])
wextids.Add(userid);
List<ww_user_extuser> dblist =
context.ww_user_extusers.Where(u => u.corpid == corp.corpid && u.userid == uid).ToList();
//enable or delete: set deleted
HashSet<string> 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<string> 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<ww_hhuser> 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<Tuple<ww_extuser, ww_user_extuser>> 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<ww_extuser, ww_user_extuser>(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<ww_extuser, ww_user_extuser>(user, friend);
}
catch(Exception ex)
{
LogHelper.Error(ex.ToString());
return error;
}
}
}
}