work-graph-simple/graph.js
2025-07-10 09:46:35 -04:00

168 lines
4.2 KiB
JavaScript

/** @import * as TYPES from "./types.ts" */
/** @type {TYPES.GraphBuilder} */
export default function Builder({user, role, part, desk, pass})
{
// 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
for(let passID in pass)
{
const [name, users] = pass[passID];
/** @type {TYPES.Pass} */
const passObj = {name, path:passID};
for(let userID in users)
{
const userPart = users[userID];
const user = UserList[userID];
for(let partID in userPart)
{
const part = PartList[partID];
const entries = userPart[partID];
entries.forEach(([time, data]) => {
/** @type {TYPES.Work} */
const work = [user, time, data];
let partPass = part.pass.get(passObj);
if(!partPass)
{
partPass = {time:0, work:[]}
part.pass.set(passObj, partPass);
}
partPass.work.push(work);
if(partPass.time < time)
{
partPass.time = time;
}
});
}
}
}
console.log(user, part, desk);
}
/** @type {TYPES.GraphLoader} */
export function Loader(params)
{
params.pass = globalThis.Pass;
Builder(params);
}
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];
};