123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 |
- const { ManagementClient } = require('authing-node-sdk')
- const managementClient = new ManagementClient({
- accessKeyId: '669b25e1731d50c59f5494d1',
- accessKeySecret: "4cfc095a72a67e22065c97e90054315c",
- host: 'https://textbook.u2-dev.hep.com.cn', // 应用的认证地址
- })
- // const pgp = require('pg-promise')();
- // const pgClient = () => {return pgp("postgresql://textbook:Edu2024textbask@oss-cn-beijing-internal.aliyuncs.com:5432/textbook");}
- import { pgClient } from '../../db/pg-instance'
- export function defineAuthingDepartSync(){
- Parse.Cloud.define("authingDepartSync", async (request) => {
- let result = await syncOrganizationsFromAuthing()
- return result
- });
- }
-
- /**
- * 同步全部组织架构 From Authing
- * @desc
- * https://docs.authing.cn/v3/reference/sdk/node/management/管理组织机构/list-organizations.html
- * @param {*} token
- * @returns
- */
- async function syncOrganizationsFromAuthing(){
- // 通过用户的 id_token 初始化之后获取用户信息
-
- let orgList = []
- try{
- let result = await managementClient.listOrganizations({
- page: 1,
- limit: 50,
- withPost: true,
- withCustomData: true
- });
- if(result?.data?.list?.length){
- orgList = orgList.concat(result?.data?.list)
- let departList = await getAllChildDepartments(orgList[0])
- // console.log(departList)
- console.log(departList?.length)
- // return
- let insertRes = await InsertAllDepartment(departList);
- console.log(insertRes)
- // 将所有不存在的部门,设置为isDeleted删除状态
- try{
- let deleteRes = await UpdateAllDeleteDepartment(departList);
- }catch(err){}
- return {code:200,count:departList?.length,message:`成功导入${departList?.length}条`}
- }
-
- }catch(err){
- console.error(err)
- }
- return
- // console.log(user)
- }
- module.exports.syncOrganizationsFromAuthing = syncOrganizationsFromAuthing
- async function UpdateAllDeleteDepartment(departList){
- let existsIdList = departList.map(depart=>depart?.departmentId)
- existsIdList = existsIdList.filter(item=>item)
- let sql = `
- UPDATE "Department" SET "isDeleted" = true
- WHERE "objectId" <> ALL ($1);
- `
- let result = await pgClient().any(sql,[existsIdList]);
- return result
- }
- async function InsertAllDepartment(departList){
- // {
- // departmentId: '66868df17adf199d1c77875d',
- // organizationCode: '1000000',
- // name: '河北人民出版社有限责任公司',
- // description: '',
- // code: '30000095',
- // hasChildren: false,
- // isVirtualNode: false,
- // i18n: { name: [Object] },
- // customData: {},
- // status: true
- // createdAt: '2024-07-04T11:56:33.813Z',
- // updatedAt: '2024-07-04T11:56:33.813Z',
- // },
- let rowData = []
- departList.forEach(depart=>{
- let objectId = depart?.departmentId
- if(!depart?.hasChildren){ // 最后一级,类型为单位
- depart.type = "单位"
- }
- let parentId = depart?.parent?.departmentId // 指针是正常的
- let branchName = depart?.branch?.name // 分值为当前单位最上级分支(表示应用下,分支最高级名称)
- rowData.push([
- // 1-5
- objectId, depart?.organizationCode, depart?.name, depart?.description, branchName,
- // 6-10
- parentId, depart?.code, depart?.createdAt || new Date(), depart?.updatedAt || new Date(), depart?.status,
- // 11
- depart?.type,depart?.hasChildren
- ])
- })
- let flattenedParams = rowData.flat();
- let syncDepartSQL = `
- INSERT INTO "Department" ("objectId", "organizationCode", "name", "description","branch","parent","code","createdAt","updatedAt","status","type","hasChildren")
- VALUES
- ${rowData.map((_, i) => `($${i * 12 + 1}, $${i * 12 + 2}, $${i * 12 + 3}, $${i * 12 + 4}, $${i * 12 + 5}, $${i * 12 + 6}, $${i * 12 + 7}, $${i * 12 + 8}, $${i * 12 + 9}, $${i * 12 + 10}, $${i * 12 + 11}, $${i * 12 + 12})`).join(',\n')}
- ON CONFLICT ("objectId") DO UPDATE
- SET
- "organizationCode" = EXCLUDED."organizationCode",
- "name" = EXCLUDED."name",
- "description" = EXCLUDED."description",
- "branch" = EXCLUDED."branch",
- "parent" = EXCLUDED."parent",
- "code" = EXCLUDED."code",
- "status" = EXCLUDED."status",
- "createdAt" = EXCLUDED."createdAt",
- "updatedAt" = EXCLUDED."updatedAt",
- "type" = EXCLUDED."type",
- "hasChildren" = EXCLUDED."hasChildren";
- `
- let result = await pgClient().any(syncDepartSQL,flattenedParams);
- return result
- }
- async function getAllChildDepartments(organization,depart,parentMap,level){
- // if(level>3) return []
- let newParentMap = JSON.parse(JSON.stringify(parentMap||{}))
- level = level || 1
- let currentDepart = depart || organization
- if(level==1) newParentMap["1"] = newParentMap["1"] || depart
- if(level==2) newParentMap["2"] = newParentMap["2"] || depart
- if(level==3) newParentMap["3"] = newParentMap["3"] || depart
- if(level==4) newParentMap["4"] = newParentMap["4"] || depart
- if(!currentDepart?.hasChildren) return []
- let departmentList = []
-
- let childDepartList
- // if(organization){
- try{
- childDepartList = await getDepartmentOfOrg(currentDepart?.organizationCode,currentDepart?.departmentId,currentDepart,newParentMap)
- // childDepartList?.forEach(item=>item.parent = currentDepart)
- }catch(err){console.error(err)}
- // }
- departmentList = departmentList.concat(childDepartList)
- // console.log("childDepartList",childDepartList)
- let pList = childDepartList?.map(item=>getAllChildDepartments(null,item,newParentMap,level+1))
- let resList = await Promise.all(pList);
- resList.forEach((list,index)=>{
- list = list?.map(item=>{
- return item
- })
- if(list?.length) departmentList = departmentList.concat(list)
- })
- return departmentList
- }
- async function getDepartmentOfOrg(organizationCode,departmentId,parent,parentMap){
- let newParent = JSON.parse(JSON.stringify(parent))
- let newParentMap = JSON.parse(JSON.stringify(parentMap))
- let result
- try{
- result = await managementClient.listChildrenDepartments({
- // 替换组织 Code 和部门 ID
- organizationCode: organizationCode,
- departmentId: departmentId,
- departmentIdType: 'department_id',
- withCustomData: true
- });
- }catch(err){}
- if(result?.data?.list?.length) {
- let list = result?.data?.list;
- list.forEach(item=>{
- item.branch = newParentMap?.["2"]
- item.parent = newParent
- })
- return result?.data?.list
- }
- return []
- }
- // const crypto = require('crypto');
- // function generateObjectId(inputString) {
- // const hash = crypto.createHash('sha256').update(inputString).digest('hex');
- // const objectId = hash;
- // return objectId;
- // }
|