From bd78b99b0ae6b55d3ec4618e218445d94622b990 Mon Sep 17 00:00:00 2001 From: jinchao <383321154@qq.com> Date: Fri, 9 May 2025 15:03:01 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E4=B8=AD=E5=AD=98=E5=82=A8=E7=9A=84=E8=AE=A1=E5=88=92?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E6=A0=BC=E5=BC=8F=E4=B8=8D=E5=AF=B9=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Release/database/XNSim.db | Bin 172032 -> 172032 bytes XNSimHtml/components/todo-component.js | 117 ++++++++++++++++++------- XNSimHtml/utils/db-utils.js | 26 +++++- 3 files changed, 107 insertions(+), 36 deletions(-) diff --git a/Release/database/XNSim.db b/Release/database/XNSim.db index 437e4841563eeafe878e3db8eb01212661371f0a..ed0ea284b704d3eb634da74eb1dd03242858ebb8 100644 GIT binary patch delta 2455 zcma)8OKcle6t$sgQk`PMg$C$&AzD*zqTm4O{4v1v}=wnb{BtseA65H+G!Fp-7fBbKiOQ-Fxo2 z_l@t+HZ5BxBH&#N|8QM`pGru7#U&xZw(Fg^AkKS6;WYHf8Nj=>+~5%H&N_i_p=#_;KD3g zi0DrhRDGs5VyHaV4M6d*R`a2q7343Wd%~Si(LD&;X@Q&AiXpl8}_ub2U^?YO0Kr`+xcTU*EoaXU6*D7|t`wz;EIz z>lS!UaC2=F$6F>=;CX>z+ExHEUI2=K^xwKnD7YDT_y1GS2~y9_8li1?rHQa(+WrzS z16iYd87Cq%14!IZQhKta)#q@!j5Z3e&-7(=Ftg8$^s%YdJ!j-&0sWsl2OY!g#{qU| z=rYgqv@H_5*Wb?k`J40a%&)&Y-xrAwhB@hgxCO0V^Iv+6IQUljo>0_wfaZeGKQv?W zVbolGLJBosC3Tk+LusH`8X5_&C@8)Kg*G;xLiM$S3I(H9f&^l1!6}jSpVo-l1X_*Q zanWg0dZgW>TYg-~cbuY_Vgy=*Sfy!%elhkI@mj!;RbW!zS?J>P44u5-@d~2H-R6^L zdvU>d2+ZS_zPmuUU{7*E!`5@lIQrNuR?M{x+tOG;xdXJg4zZoJfZXw}|EQUDvEmpY z(4%#v>{BlkZKye;7}mkd{2nwGPAWJop+{M|3PTLUWUunat8gSWp4TBPBe=aZU+*Z- zK)#~DuqTTT!^eV2AM_14M&A4AF0H+-*tsBnQ2XqQ>$tK6V}r)kd8KW9%1B8d!!=md zp!OCg=pcyXEQBfc9Fr_4nx}D&kJ7pj)2SJ0p&Sm!{o}ff+9J0(e|23%nK0HaRaaqN zRTt^%r2)tA@bomD9`==E%|@+Ohr0)quQz73#vZOV(BcD}*+go_kjn^$+c7}wjX1A> zoJZh0BaRLLXkHI#;kJzF{b2#6d#_W?-tX?;6WoYhqQ%c)xNmlgw%gLp4T_}j&qca= z)XafG4YdF_r;Vp~tglIy_%Rsth8m(x{mlsl&uF_w~+9e zoGp}p_@XuR{FB`|+g}Y<4QQVtISjYEF4E75u7w^@OR`qGj?n_rYQr6>wepY~+)OZ= zV2-2stXbTrrM7vo3U0S;Jz)Z;08nCq?7oN_0l2N?=+0+fsde=SeTJU1;-Y0uzJnfnGe$OnfCwuol zpRz(BpeR2#vp7{RF(*gi`NDNi_RoFR+3;*mC$gre>w2DbOyGL9eK*h$h&j)@wmoZT ze7Pp0D8I z@2l{vV;a;UIhiH886~+nP;0Gr=~>q_E{Fjy+nc-~K5aIHBoI`ezMFQ6QC2d< Yz{JV`DH$jj8e16~S{axwyTEt>0M*$+4gdfE diff --git a/XNSimHtml/components/todo-component.js b/XNSimHtml/components/todo-component.js index e93c72f..f5e42c6 100644 --- a/XNSimHtml/components/todo-component.js +++ b/XNSimHtml/components/todo-component.js @@ -153,7 +153,13 @@ class TodoComponent extends HTMLElement { // 设置日期时间选择器的初始值 const scheduleInput = modal.querySelector('#schedule'); const scheduleDate = new Date(todo.sche_time); - scheduleInput.value = scheduleDate.toISOString().slice(0, 16); + const year = scheduleDate.getFullYear(); + const month = String(scheduleDate.getMonth() + 1).padStart(2, '0'); + const day = String(scheduleDate.getDate()).padStart(2, '0'); + const hours = String(scheduleDate.getHours()).padStart(2, '0'); + const minutes = String(scheduleDate.getMinutes()).padStart(2, '0'); + const seconds = String(scheduleDate.getSeconds()).padStart(2, '0'); + scheduleInput.value = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; // 添加保存按钮事件 const saveButton = modal.querySelector('.save-button'); @@ -193,7 +199,8 @@ class TodoComponent extends HTMLElement { const day = String(now.getDate()).padStart(2, '0'); const hours = String(now.getHours()).padStart(2, '0'); const minutes = String(now.getMinutes()).padStart(2, '0'); - scheduleInput.value = `${year}-${month}-${day}T${hours}:${minutes}`; + const seconds = String(now.getSeconds()).padStart(2, '0'); + scheduleInput.value = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; // 获取当前用户等级 const currentUserLevel = this.currentUser.access_level || 0; @@ -346,8 +353,34 @@ class TodoComponent extends HTMLElement { return []; } - // 首先根据项目/子项目筛选 + // 首先根据用户等级进行筛选 + const userLevel = this.currentUser.level || 0; let filteredTodos = this.todos; + + // 等级4可以看到所有待办事项 + if (userLevel !== 4) { + // 等级3不能看到创建人和执行人都是等级4的待办事项 + if (userLevel === 3) { + filteredTodos = filteredTodos.filter(todo => { + const creator = this.users.find(u => u.username === todo.adduser); + const executor = this.users.find(u => u.username === todo.exeuser); + + // 如果找不到用户信息,默认显示 + if (!creator || !executor) return true; + + // 只要创建人或执行人不是等级4,就显示 + return !(creator.level === 4 && executor.level === 4); + }); + } else { + // 等级2或更低只能看到创建人或执行人是自己的待办事项 + filteredTodos = filteredTodos.filter(todo => { + return todo.adduser === this.currentUser.username || + todo.exeuser === this.currentUser.username; + }); + } + } + + // 然后根据项目/子项目筛选 if (this.selectedProject) { filteredTodos = filteredTodos.filter(todo => { const matchesProject = todo.project === this.selectedProject; @@ -358,38 +391,12 @@ class TodoComponent extends HTMLElement { }); } - // 根据复选框状态筛选 + // 最后根据复选框状态筛选 if (!this.showCompleted) { filteredTodos = filteredTodos.filter(todo => !todo.completed); } - // 根据用户等级进行筛选 - const userLevel = this.currentUser.level || 0; - - // 等级4可以看到所有待办事项 - if (userLevel === 4) { - return filteredTodos; - } - - // 等级3不能看到创建人和执行人都是等级4的待办事项 - if (userLevel === 3) { - return filteredTodos.filter(todo => { - const creator = this.users.find(u => u.username === todo.adduser); - const executor = this.users.find(u => u.username === todo.exeuser); - - // 如果找不到用户信息,默认显示 - if (!creator || !executor) return true; - - // 只要创建人或执行人不是等级4,就显示 - return !(creator.level === 4 && executor.level === 4); - }); - } - - // 等级2或更低只能看到创建人或执行人是自己的待办事项 - return filteredTodos.filter(todo => { - return todo.adduser === this.currentUser.username || - todo.exeuser === this.currentUser.username; - }); + return filteredTodos; } render() { @@ -754,8 +761,35 @@ class TodoComponent extends HTMLElement { const container = document.createElement('div'); container.className = 'container'; - // 构建并渲染项目树 - const tree = TodoTree.buildProjectTree(this.todos); + // 首先根据用户等级过滤待办事项 + const userLevel = this.currentUser.level || 0; + let filteredTodos = this.todos; + + // 等级4可以看到所有待办事项 + if (userLevel !== 4) { + // 等级3不能看到创建人和执行人都是等级4的待办事项 + if (userLevel === 3) { + filteredTodos = filteredTodos.filter(todo => { + const creator = this.users.find(u => u.username === todo.adduser); + const executor = this.users.find(u => u.username === todo.exeuser); + + // 如果找不到用户信息,默认显示 + if (!creator || !executor) return true; + + // 只要创建人或执行人不是等级4,就显示 + return !(creator.level === 4 && executor.level === 4); + }); + } else { + // 等级2或更低只能看到创建人或执行人是自己的待办事项 + filteredTodos = filteredTodos.filter(todo => { + return todo.adduser === this.currentUser.username || + todo.exeuser === this.currentUser.username; + }); + } + } + + // 构建并渲染项目树(使用过滤后的待办事项) + const tree = TodoTree.buildProjectTree(filteredTodos); const treeContainer = TodoTree.renderProjectTree(tree, { expandedProjects: this.expandedProjects, selectedProject: this.selectedProject, @@ -791,8 +825,23 @@ class TodoComponent extends HTMLElement { onAddTodo: () => this.showNewTodoModal() }); + // 然后根据项目/子项目筛选 + if (this.selectedProject) { + filteredTodos = filteredTodos.filter(todo => { + const matchesProject = todo.project === this.selectedProject; + if (!this.selectedSubproject) { + return matchesProject; + } + return matchesProject && todo.subproject === this.selectedSubproject; + }); + } + + // 最后根据复选框状态筛选 + if (!this.showCompleted) { + filteredTodos = filteredTodos.filter(todo => !todo.completed); + } + // 渲染过滤后的待办事项 - const filteredTodos = this.filterTodos(); const todosContainer = TodoList.renderTodoList(filteredTodos, { onEditExecutor: (todo) => this.showEditExecutorModal(todo), onEditSchedule: (todo) => this.showEditScheduleModal(todo), diff --git a/XNSimHtml/utils/db-utils.js b/XNSimHtml/utils/db-utils.js index 620d64c..814085a 100644 --- a/XNSimHtml/utils/db-utils.js +++ b/XNSimHtml/utils/db-utils.js @@ -1257,6 +1257,18 @@ function addTodo(todoData) { const seconds = String(now.getSeconds()).padStart(2, '0'); const localDateTime = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; + // 处理计划时间 + let scheTime = todoData.sche_time; + if (scheTime) { + // 如果sche_time是datetime-local格式(YYYY-MM-DDTHH:mm),转换为数据库格式 + if (scheTime.includes('T')) { + const [datePart, timePart] = scheTime.split('T'); + scheTime = `${datePart} ${timePart}:00`; + } + } else { + scheTime = localDateTime; + } + const result = db.prepare(` INSERT INTO todos ( project, subproject, title, text, adduser, @@ -1270,7 +1282,7 @@ function addTodo(todoData) { todoData.adduser || '系统', todoData.exeuser || null, localDateTime, - todoData.sche_time || localDateTime + scheTime ); db.close(); @@ -1316,6 +1328,16 @@ function updateTodoStatus(id, completed, exeuser, title, text, sche_time) { const seconds = String(now.getSeconds()).padStart(2, '0'); const localDateTime = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; + // 处理计划时间 + let scheTime = sche_time; + if (scheTime) { + // 如果sche_time是datetime-local格式(YYYY-MM-DDTHH:mm),转换为数据库格式 + if (scheTime.includes('T')) { + const [datePart, timePart] = scheTime.split('T'); + scheTime = `${datePart} ${timePart}:00`; + } + } + const result = db.prepare(` UPDATE todos SET completed = ?, @@ -1330,7 +1352,7 @@ function updateTodoStatus(id, completed, exeuser, title, text, sche_time) { exeuser || null, title, text || '', - sche_time || null, + scheTime || null, completed ? 1 : 0, completed ? localDateTime : null, id