work-graph-simple/graph.js

213 lines
6.1 KiB
JavaScript

/** @import * as TYPES from "./types.ts" */
/** @type {TYPES.GraphBuilder} */
export default function Builder({user, role, part, desk, pass}, folderHandle, folderName)
{
// mutate users
/** @type {Record<string, TYPES.User>} */
//@ts-ignore
const UserList = user;
for(let userId in user)
{
const name = user[userId];
UserList[userId] = {name, desk:new Set()};
}
// mutate roles
/** @type {Record<string, TYPES.Role>} */
//@ts-ignore
const RoleList = role;
for(let roleId in role)
{
const [name, ...userIds] = role[roleId];
RoleList[roleId] = {name, user:userIds.map(uId=>UserList[/**@type{string}*/(uId)])};
}
// mutate parts
/** @type {Record<string, TYPES.Part>} */
//@ts-ignore
const PartList = part;
for(let partId in part)
{
const name = part[partId];
PartList[partId] = /** @type {TYPES.Part} */({name, need:[], make:[], pass:new Map()});
}
// mutate desks
/** @type {Record<string, TYPES.Desk>} */
//@ts-ignore
const DeskList = desk;
for(let deskId in desk)
{
const [name, roleIDs, mode, needObj, ...makePartIDs] = desk[deskId];
/** @type {TYPES.Part[]}*/ const need =[];
/** @type {number[]}*/ const time =[];
/** @type {TYPES.Desk} */
const deskObj = {
name,
mode,
need,
time,
make:[],
role:[]
};
for(const partId in needObj)
{
const part = PartList[partId];
need.push(part);
part.need.push(deskObj);
time.push(needObj[partId]);
}
deskObj.role = roleIDs.map(roleId=>
{
const role = RoleList[/**@type{string}*/(roleId)];
role.user.forEach(u =>u.desk.add(deskObj));
return role;
});
deskObj.make = makePartIDs.map( partId=>
{
const part = PartList[/**@type{string}*/(partId)];
part.make.push(deskObj);
return part;
} )
DeskList[deskId] = deskObj;
}
// Apply passes
/** @type {Record<string, TYPES.Pass>} */
const PassList = {};
for(let passID in pass)
{
const [passName] = pass[passID];
/** @type {TYPES.Pass} */
PassList[passID] = {
name: passName,
path:passID,
async load(){
const roomFolder = await folderHandle.getDirectoryHandle(folderName);
const passFolder = await roomFolder.getDirectoryHandle(passID);
for await (const [_, userFile] of passFolder.entries())
{
if(userFile.name.endsWith(".json"))
{
const userID = userFile.name.substring(0, userFile.name.length-5);
const userObject = UserList[userID];
try
{
/** @type {Record<string, Array<[time:number, data:string]>>} */
const loadedData = await userFile.getFile().then(d=>d.text()).then(t=>JSON.parse(t));
Object.entries(loadedData).forEach(([partID, payload])=>{
let latest = 0;
payload.forEach((condensedWork)=>{
if(condensedWork[0] > latest)
{
latest = condensedWork[0];
}
condensedWork.push(userObject);
});
let passCheck = PartList[partID].pass.get(this);
if(!passCheck)
{
passCheck = {time:0, work:[]}
PartList[partID].pass.set(this, passCheck);
}
if(latest > passCheck.time)
{
passCheck.time = latest;
}
passCheck.work = /** @type {TYPES.Work[]}*/(payload)
})
}
catch (e)
{
console.warn(`Couldn't parse user data: ${roomFolder.name} / ${passFolder.name} / ${userFile.name}`, e);
}
}
}
this.live = true;
},
dump(){
Object.entries(PartList).forEach(([partID, partObj])=>{
partObj.pass.delete(this);
});
this.live = false;
},
live:false
};
}
return {
Desk:DeskList,
Part:PartList,
User:UserList,
Role:RoleList,
Pass:PassList
};
}
/** @type {TYPES.MassDscription} */
export function Graph(params)
{
Object.entries(params).forEach( ([roomFolderName, roomData])=>
{
globalThis.ROOMS = Builder(roomData, globalThis.FOLDER, roomFolderName);
console.log(globalThis.ROOMS);
});
}
const Scan =(desk)=>
{
const need = Object.keys(desk.need);
const make = desk.make;
const dirtyNeed = [];
const dirtyMake = [];
let makeMin = Infinity;
let needMax = -Infinity;
for(let i=0; i<need.length; i++)
{
const id = need[i];
const part = Part.find(id);
if(part.time > needMax) needMax = part.time;
}
for(let i=0; i<make.length; i++)
{
const id = make[i];
const part = Part.find(make[i]);
if(part.time < makeMin) makeMin = part.time;
if(part.time < needMax)
{
dirtyMake.push(id);
}
}
for(let i=0; i<need.length; i++)
{
const id = need[i];
const part = Part.find(id);
if(part.time > makeMin)
{
dirtyNeed.push(id);
}
}
console.log("scan", dirtyNeed, dirtyMake);
return [dirtyNeed, dirtyMake];
};