/** @import * as TYPES from "./types.ts" */ /** @type {TYPES.GraphBuilder} */ export default function({users, roles, parts, desks, passes}) { // mutate users /** @type {Record} */ //@ts-ignore const UserList = users; for(let userId in users) { const name = users[userId]; UserList[userId] = {name, desk:new Set()}; } // mutate roles /** @type {Record} */ //@ts-ignore const RoleList = roles; for(let roleId in roles) { const [name, ...userIds] = roles[roleId]; RoleList[roleId] = {name, user:userIds.map(uId=>UserList[/**@type{string}*/(uId)])}; } // mutate parts /** @type {Record} */ //@ts-ignore const PartList = parts; for(let partId in parts) { const name = parts[partId]; PartList[partId] = /** @type {TYPES.Part} */({name, need:[], make:[], pass:new Map()}); } // mutate desks /** @type {Record} */ //@ts-ignore const DeskList = desks; for(let deskId in desks) { const [name, roleIDs, mode, needObj, ...makePartIDs] = desks[deskId]; /** @type {TYPES.Part[]}*/ const need =[]; /** @type {number[]}*/ const time =[]; /** @type {TYPES.Desk} */ const desk = { name, mode, need, time, make:[], role:[] }; for(const partId in needObj) { const part = PartList[partId]; need.push(part); part.need.push(desk); time.push(needObj[partId]); } desk.role = roleIDs.map(roleId=> { const role = RoleList[/**@type{string}*/(roleId)]; role.user.forEach(u =>u.desk.add(desk)); return role; }); desk.make = makePartIDs.map( partId=> { const part = PartList[/**@type{string}*/(partId)]; part.make.push(desk); return part; } ) DeskList[deskId] = desk; } // Apply passes for(let passID in passes) { const [name, users] = passes[passID]; /** @type {TYPES.Pass} */ const pass = {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(pass); if(!partPass) { partPass = {time:0, work:[]} part.pass.set(pass, partPass); } partPass.work.push(work); if(partPass.time < time) { partPass.time = time; } }); } } } console.log(users, parts, desks); } 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]; };