434 lines
18 KiB
C#
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;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
}
|