diff --git a/apps/server/src/models/staff/staff.router.ts b/apps/server/src/models/staff/staff.router.ts index 9f227a4..d93821e 100755 --- a/apps/server/src/models/staff/staff.router.ts +++ b/apps/server/src/models/staff/staff.router.ts @@ -12,6 +12,7 @@ const StaffWhereInputSchema: ZodType = z.any(); const StaffSelectSchema: ZodType = z.any(); const StaffUpdateInputSchema: ZodType = z.any(); const StaffFindManyArgsSchema: ZodType = z.any(); +const StaffFindUniqueArgsSchema: ZodType = z.any(); @Injectable() export class StaffRouter { constructor( @@ -89,5 +90,10 @@ export class StaffRouter { .mutation(async ({ input }) => { return this.staffService.updateOrder(input); }), + findUnique: this.trpc.procedure + .input(StaffFindUniqueArgsSchema) + .query(async ({ input }) => { + return await this.staffService.findUnique(input); + }), }); } diff --git a/apps/server/src/tasks/init/gendev.service.ts b/apps/server/src/tasks/init/gendev.service.ts index ea3f0ee..2e8111e 100755 --- a/apps/server/src/tasks/init/gendev.service.ts +++ b/apps/server/src/tasks/init/gendev.service.ts @@ -421,7 +421,7 @@ export class GenDevService { return trainSituation } - private async generateTrainSituations(probability: number = 0.7){ + private async generateTrainSituations(probability: number = 0.1){ this.logger.log("Start generating train situations...") const allTrainContents = await db.trainContent.findMany(); // 这里相当于两次遍历 找到没有parentID的即是 diff --git a/apps/web/src/app/main/dailyPage/page.tsx b/apps/web/src/app/main/dailyPage/page.tsx new file mode 100644 index 0000000..ba9510d --- /dev/null +++ b/apps/web/src/app/main/dailyPage/page.tsx @@ -0,0 +1,10 @@ +import DailyContext from "@web/src/components/models/daily/DailyContext"; +import DailyLayout from "@web/src/components/models/daily/DailyLayout"; + +export default function DailyPage(){ + return <> + + + + +} \ No newline at end of file diff --git a/apps/web/src/app/main/layout/NavigationMenu.tsx b/apps/web/src/app/main/layout/NavigationMenu.tsx index 5537793..b836594 100644 --- a/apps/web/src/app/main/layout/NavigationMenu.tsx +++ b/apps/web/src/app/main/layout/NavigationMenu.tsx @@ -9,7 +9,7 @@ export default function NavigationMenu() { const menuItems = [ { key: 'home', label: '首页', path: '/' }, { key: 'staff', label: '人员总览', path: '/staff' }, - { key: 'day', label: '日统计', path: '/day' }, + { key: 'day', label: '日统计', path: '/daily' }, { key: 'month', label: '月统计', path: '/month' }, { key: 'year', label: '年度统计', path: '/year' } ]; diff --git a/apps/web/src/components/models/daily/DailyContext.tsx b/apps/web/src/components/models/daily/DailyContext.tsx new file mode 100644 index 0000000..ac9436b --- /dev/null +++ b/apps/web/src/components/models/daily/DailyContext.tsx @@ -0,0 +1,53 @@ +import { api } from "@nice/client"; +import { useAuth } from "@web/src/providers/auth-provider"; +import { UserProfile } from "@nice/common"; +import { createContext, ReactNode, useContext, useEffect, useState } from "react"; + +interface DailyContextProviderProps{ + staffsMsg:{ + id:string, + showname:string, + username:string + }[], + staffsLoading:boolean, + selectedUserMsg:UserProfile, + setSelectedUserMsg:(userMsg:UserProfile)=>void +} + +interface DailyContextProps{ + children:ReactNode +} + +const DailyContextProvider = createContext(null) + +export default function DailyContext({children}:DailyContextProps){ + const {user} = useAuth() + const [selectedUserMsg,setSelectedUserMsg] = useState(null) + // 获取当前员工的单位下的所有staff的记录 + const {data:staffs,isLoading:staffsLoading} = api.staff.findByDept.useQuery({ + deptId:user.deptId + }) + const staffsMsg = staffs?.map((staff)=>{ + return { + id:staff.id, + showname:staff.showname, + username:staff.username + } + }) + + + return + {children} + +} + +export function useDaily(){ + const daily = useContext(DailyContextProvider) + if(!daily) {throw new Error("useParams must be used within a ParamsProvider");} + return daily +} \ No newline at end of file diff --git a/apps/web/src/components/models/daily/DailyLayout.tsx b/apps/web/src/components/models/daily/DailyLayout.tsx new file mode 100644 index 0000000..6d7ab8e --- /dev/null +++ b/apps/web/src/components/models/daily/DailyLayout.tsx @@ -0,0 +1,11 @@ +import DailyMsgDisplayLayout from "./dailyMsgDisplay/DailyMsgDisplayLayout"; +import { DailyMsgFormLayout } from "./dailyMsgForm/DailyMsgFormLayout"; + +export default function DailyLayout(){ + return ( +
+ + +
+ ) +} \ No newline at end of file diff --git a/apps/web/src/components/models/daily/dailyMsgDisplay/DailyMsgDisplayLayout.tsx b/apps/web/src/components/models/daily/dailyMsgDisplay/DailyMsgDisplayLayout.tsx new file mode 100644 index 0000000..7357e23 --- /dev/null +++ b/apps/web/src/components/models/daily/dailyMsgDisplay/DailyMsgDisplayLayout.tsx @@ -0,0 +1,12 @@ +import DailyPersonMsg from "../dailyMsgForm/DailyPersonMsg"; +import DailyTrainMsg from "../dailyMsgForm/DailyTrainMsg"; +import { useDaily } from "../DailyContext"; +export default function DailyMsgDisplayLayout(){ + const {selectedUserMsg} = useDaily() + return ( +
+ + +
+ ) +} \ No newline at end of file diff --git a/apps/web/src/components/models/daily/dailyMsgForm/DailyMsgFormLayout.tsx b/apps/web/src/components/models/daily/dailyMsgForm/DailyMsgFormLayout.tsx new file mode 100644 index 0000000..a9f4de6 --- /dev/null +++ b/apps/web/src/components/models/daily/dailyMsgForm/DailyMsgFormLayout.tsx @@ -0,0 +1,55 @@ +import { Form } from "antd"; +import StaffSelect from "../../staff/staff-select"; +import { useDaily } from "../DailyContext"; +import { useEffect, useState } from "react"; +import { staffDetailSelect, UserProfile } from "@nice/common"; +import { api } from "@nice/client"; +import { MonitorOutlined } from "@ant-design/icons"; + +export function DailyMsgFormLayout() { + const [form] = Form.useForm() + const { staffsMsg ,selectedUserMsg,setSelectedUserMsg} = useDaily() + const [selectedUserId, setSelectedUserId] = useState(null); + const { data: selectedUserData } = api.staff.findUnique.useQuery( + { + where: { + id: selectedUserId, + }, + select: staffDetailSelect + }, + { + enabled: !!selectedUserId, // 只有当selectedUserId存在时才执行查询 + } + ); + const handleChange = (value: string | string[]) => { + if (!value) { + setSelectedUserId(null); + setSelectedUserMsg(null); + return; + } + setSelectedUserId(Array.isArray(value) ? value[0] : value); + } + useEffect(() => { + if (selectedUserData) { + console.log(selectedUserData) + setSelectedUserMsg(selectedUserData as any as UserProfile); + } + }, [selectedUserData]); + + return ( +
+
+
+ + handleChange(value)} + > +
+
+
+ ) +} \ No newline at end of file diff --git a/apps/web/src/components/models/daily/dailyMsgForm/DailyPersonMsg.tsx b/apps/web/src/components/models/daily/dailyMsgForm/DailyPersonMsg.tsx new file mode 100644 index 0000000..961ecc7 --- /dev/null +++ b/apps/web/src/components/models/daily/dailyMsgForm/DailyPersonMsg.tsx @@ -0,0 +1,13 @@ +export default function DailyPersonMsg({selectedUserMsg}) { + return ( +
+ {selectedUserMsg?.showname ? selectedUserMsg?.showname : "暂无数据"} + {selectedUserMsg?.age ? selectedUserMsg?.age : "暂无数据"} + {selectedUserMsg?.sex ? selectedUserMsg?.sex : "暂无数据"} + {selectedUserMsg?.absent ? selectedUserMsg?.absent : "暂无数据"} + {selectedUserMsg?.department?.name ? selectedUserMsg?.department?.name : "暂无数据"} + {selectedUserMsg?.position?.type ? selectedUserMsg?.position?.type : "暂无数据"} + {selectedUserMsg?.avatar ? selectedUserMsg?.avatar : "暂无数据"} +
+ ) +} \ No newline at end of file diff --git a/apps/web/src/components/models/daily/dailyMsgForm/DailyTrainMsg.tsx b/apps/web/src/components/models/daily/dailyMsgForm/DailyTrainMsg.tsx new file mode 100644 index 0000000..927d727 --- /dev/null +++ b/apps/web/src/components/models/daily/dailyMsgForm/DailyTrainMsg.tsx @@ -0,0 +1,7 @@ +export default function DailyTrainMsg({selectedUserMsg}) { + return ( +
+ 每日培训消息 +
+ ) +} \ No newline at end of file diff --git a/apps/web/src/components/models/staff/staff-select.tsx b/apps/web/src/components/models/staff/staff-select.tsx index 5881f2a..761ef14 100755 --- a/apps/web/src/components/models/staff/staff-select.tsx +++ b/apps/web/src/components/models/staff/staff-select.tsx @@ -9,6 +9,13 @@ interface StaffSelectProps { multiple?: boolean; domainId?: string; placeholder?: string; + staffsMsg?: StaffsMsgProps[]; +} + +interface StaffsMsgProps { + id: string; + showname: string; + username: string; } export default function StaffSelect({ @@ -16,8 +23,9 @@ export default function StaffSelect({ onChange, placeholder, style, - multiple, + multiple = false, domainId, + staffsMsg, }: StaffSelectProps) { const [keyword, setQuery] = useState(""); @@ -50,7 +58,7 @@ export default function StaffSelect({ }, select: { id: true, showname: true, username: true }, - take: 30, + //take: 30, orderBy: { order: "asc" } }); @@ -59,6 +67,13 @@ export default function StaffSelect({ }; const options: SelectProps["options"] = + staffsMsg ? + staffsMsg.map((staff)=>{ + return { + value:staff.id, + label:staff.showname || staff.username + } + }) : data?.map((staff: any) => ({ value: staff.id, label: staff?.showname || staff?.username, @@ -77,7 +92,7 @@ export default function StaffSelect({ options={options} value={value} onChange={onChange} - style={{ minWidth: 200, ...style }} + style={{ minWidth: 600, ...style }} />{" "} ); diff --git a/apps/web/src/routes/index.tsx b/apps/web/src/routes/index.tsx index 10a960e..326bc27 100755 --- a/apps/web/src/routes/index.tsx +++ b/apps/web/src/routes/index.tsx @@ -10,6 +10,7 @@ import LoginPage from "../app/login"; import HomePage from "../app/main/home/page"; import StaffMessage from "../app/main/staffpage/page"; import MainLayout from "../app/main/layout/MainLayout"; +import DailyPage from "../app/main/dailyPage/page"; interface CustomIndexRouteObject extends IndexRouteObject { name?: string; breadcrumb?: string; @@ -52,9 +53,9 @@ export const routes: CustomRouteObject[] = [ element: , }, { - path: "/day", - element: , - }, + path:"/daily", + element: + } ], }, diff --git a/packages/common/src/models/select.ts b/packages/common/src/models/select.ts index f97fdf2..96dc776 100755 --- a/packages/common/src/models/select.ts +++ b/packages/common/src/models/select.ts @@ -163,7 +163,41 @@ export const trainSituationDetailSelect: Prisma.TrainSituationSelect = { select: { id: true, title: true, - + }, }, }; +export const staffDetailSelect: Prisma.StaffSelect = { + id: true, + showname: true, + username: true, + deptId: true, + avatar: true, + age: true, + sex: true, + absent: true, + trainSituations:{ + select:{ + id: true, + trainContent:{ + select:{ + id: true, + title: true, + type: true, + } + } + } + }, + department: { + select: { + id: true, + name: true, + } + }, + position: { + select: { + id: true, + type: true, + } + } +};