import DB from "./db.js"; /** @typedef {{name:string, time:number, work:WorkData[], need:string[], make:string[]}} PartData */ const Part = DB({ path:"./db_part.csv", cols:2, load:(_i, id, name)=>[id, /**@type{PartData}*/({ name, time:0, work:[], need:[], make:[] })], }); /**@typedef {{part:string, user:string, time:number, data:string}} WorkData*/ const Work = DB({ path:"./db_work.csv", cols:4, load(_i, part, user, time, data) { const parsedTime = parseInt(time); /** @type {WorkData} */ const workObj = {part, user, time:parsedTime, data}; const partObj = Part.list[part]; if(parsedTime > partObj.time) { partObj.time = parsedTime; partObj.work.unshift(workObj); } else { partObj.work.push(workObj); } return ["", workObj]; } }); /**@type {(work:WorkData)=>void} */ const WorkMake =(work)=> { const part = Part.find(work.part); part.work.unshift(work); part.time = work.time; const itr = deskId=>Scan(Desk.find(deskId)); part.need.forEach(itr); part.make.forEach(itr); }; /** @typedef {"all"|"one"} DeskMode*/ /** @typedef {[need:Record, make:string[], ...role:string[]]} DeskJSON */ /** @typedef {{name:string, mode:DeskMode, need:Record, make:string[], role:string[]}} DeskData */ /** @type {(desk:DeskData)=>[dirtyNeed:string[], dirtyMake:string[]]} */ 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]; }; const Desk = DB({ path:"./db_desk.csv", cols:4, load(_i, id, name, /** @type {DeskMode}*/mode, data) { /**@type {DeskJSON} */ const [need, make, ...role] = JSON.parse(data); const deskObj = { name, mode, need, make, role }; make.forEach(partId=>Part.find(partId).make.push(id)); Object.keys(need).forEach(partId=>Part.find(partId).need.push(id)); Scan(deskObj); return [id, deskObj]; } }); await Part.load(); await Work.load(); await Desk.load(); WorkMake({part:"p3", user:"u1", time:new Date().getTime(), data:"NEW!"});