/** @import * as TYPES from "./types.ts" */ /** @type {TYPES.GraphBuilder} */ export default function Builder({user, role, part, desk, pass}) { // mutate users /** @type {Record} */ //@ts-ignore const UserList = user; for(let userId in user) { const name = user[userId]; UserList[userId] = {name, desk:new Set()}; } // mutate roles /** @type {Record} */ //@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} */ //@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} */ //@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 needMax) needMax = part.time; } for(let i=0; i makeMin) { dirtyNeed.push(id); } } console.log("scan", dirtyNeed, dirtyMake); return [dirtyNeed, dirtyMake]; };