# pwms **Repository Path**: lrt99/pwms ## Basic Information - **Project Name**: pwms - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-10-05 - **Last Updated**: 2026-10-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # PWMS — 工艺技术人员工作计划完成情况统计系统 基于开发文档实现的 Monorepo 全栈项目: - **后端** `packages/server`:Node.js + Express + Sequelize + SQLite(migrations 版本化,可迁移 MySQL/PG) - **PC 端** `packages/admin-web`:Vue3 + Element Plus + Vite + Pinia + ECharts - **移动端** `packages/mobile`:uni-app(Vue3)骨架,可打包 H5 / App / 微信小程序 - **共享 SDK** `packages/shared-sdk`:请求适配器(axios / uni)+ 鉴权 + 各业务 API ## 快速开始 ```bash # 1. 安装依赖 pnpm install # (可选)Windows 无 VS 构建工具且 GitHub 下载失败时,手动修复 sqlite3 原生绑定 pnpm run fix:sqlite3 # 2. 初始化数据库(SQLite) pnpm run migrate pnpm run seed # 3. 启动后端(默认 8100 端口) pnpm run dev:server # 4. 启动 PC 端(默认 5173,/api 已代理到 8100) pnpm run dev:web # 5. 移动端 H5(需要先安装 uni-app 依赖,见下文) pnpm run dev:mobile ``` 默认账号(密码均为 `123456`): | 账号 | 角色 | 说明 | |------|------|------| | admin | 系统管理员 | 用户/室管理、全部数据 | | director1 | 室主任 | 工艺一室,任务下发/确认/本室统计 | | eng1 | 技术员 | 工艺一室,任务执行/填写 | | director2 / eng2 | 主任/技术员 | 工艺二室 | ## 环境变量 复制 `packages/server/.env.example` 为 `packages/server/.env`: ```ini PORT=8100 JWT_SECRET=please-change-me JWT_EXPIRES_IN=7d DB_DIALECT=sqlite DB_STORAGE=./data/pwms.sqlite # 微信小程序登录(可选) WECHAT_APPID=wx1234567890 WECHAT_SECRET=xxxxxxxx ``` ## 常用脚本 ```bash pnpm run migrate # 执行迁移 pnpm run migrate:undo # 回滚迁移(在 packages/server 内) pnpm run seed # 写入种子数据 pnpm --filter @pwms/server test # 后端冒烟测试(自动重建测试库) pnpm run build:web # PC 端生产构建 pnpm run build:h5 # 移动端 H5 构建 ``` ## 任务状态机 ``` pending(待开始) → processing(进行中) → submitted(已提交待确认) → confirmed(已确认完成) 任意未完成状态 + 超期 → overdue_days > 0(定时任务每日 00:05 刷新) ``` 延期天数在提交/确认时计算并落库;未完成天数按“未确认且超过计划完成日期”计算;距离任务天数 = 计划完成时间 - 今天(负数表示已逾期),随定时任务每日刷新。 ## 任务字段 任务编号、任务等级(高/中/低)、任务分类、产品号、任务内容、负责人、负责科室、**计划开始时间**、计划完成时间、实际完成时间、任务进展情况、距离任务天数、存在的风险、主要的解决措施、备注(另有状态、进度、延期/未完成天数等流程与统计字段)。 关于**计划开始时间**与补登记: - 下发给定时默认取**下达当天**,也可手工指定; - 当时忘了登记可以事后补填(支持选择过去的日期); - 已确认完成的任务**仅允许补登记计划开始时间**,其余字段锁定,避免改动历史数据。 任务分类由管理员在「系统管理 → 任务分类管理」维护;分类重命名会自动同步到已有任务,被任务使用的分类不可删除。 ## 统计口径 统计按**计划完成时间(plan_end_date)**归属年月,维度为:按科室 / 按个人 / 按月 / 按年,均支持年、月筛选。 | 指标 | 计算方式 | |------|---------| | 任务总数 | 范围内的任务数 | | 已完成 / 未完成 | 已确认完成数 / 其余(待开始、进行中、待确认) | | 按时完成 | 已确认且延期天数为 0 | | 延期完成 | 已确认且延期天数 > 0 | | 完成率 | 已完成 ÷ 任务总数 | | 按时完成率(占总数) | 按时完成 ÷ 任务总数 | | 延期完成率(占总数) | 延期完成 ÷ 任务总数 | | 按时/延期完成率(占已完成) | 按时完成、延期完成 ÷ 已完成,供绩效考核切换口径 | | 累计延期天数 | 所有延期任务延期天数之和 | | 平均延期天数 | 累计延期天数 ÷ 延期任务数 | | 最长延期天数 | 延期任务中的最大延期天数 | > 注:完成率 = 按时完成率(占总数)+ 延期完成率(占总数);未确认的任务计入“未完成”,不参与按时/延期完成率计算。 ## 角色与权限 系统采用「角色 → 权限级别」模型:**权限级别**决定"能做什么、能看到多少数据",**角色**只是可自定义的称呼。 | 权限级别 | 数据范围 | 操作权限 | |---------|---------|---------| | admin(系统管理员) | 全部数据 | 用户 / 科室 / 角色 / 任务分类管理,任务下发与确认,删除任务 | | director(室主任) | 本室数据 | 任务下发、确认 / 驳回,修改本室任务 | | engineer(工艺技术人员) | 仅本人任务 | 填写任务进展情况 | 角色在「系统管理 → 角色管理」维护(PC 端与手机端都有): - 可新增自定义角色(例如"工艺主管"),并指定其权限级别; - 内置三个角色受保护:不允许删除、不允许修改编码与权限级别(避免误操作导致无人能登录系统); - 被用户使用的角色不允许删除,需先调整这些用户的角色; - 角色停用后不能再分配给新用户(已使用该角色的用户仍可正常登录)。 ## 主要接口 ``` POST /api/auth/login 登录(JWT,7 天有效) POST /api/auth/wechat-login 微信小程序登录(预留,需配置 WECHAT_APPID/SECRET) GET /api/auth/profile 当前用户 PUT /api/auth/password 修改密码 GET/POST/PUT/DELETE /api/users 用户管理(admin) GET/POST/PUT/DELETE /api/departments 室管理(admin) GET/POST/PUT/DELETE /api/task-categories 任务分类管理(admin,列表全员可用) GET/POST/PUT/DELETE /api/roles 角色管理(admin,列表全员可用;/api/roles/levels 返回权限级别说明) GET /api/tasks 任务列表(多条件分页) POST /api/tasks 下发(admin/director) GET /api/tasks/my 我的任务 GET /api/tasks/todo 待确认(admin/director) PUT /api/tasks/:id/progress 填写完成情况(负责人) PUT /api/tasks/:id/confirm 确认 PUT /api/tasks/:id/reject 驳回 GET /api/stats/by-department / by-user / by-month / by-year / overview GET /api/stats/export Excel 导出 ``` 统一响应:`{ "code": 0, "message": "success", "data": {} }`,`code=0` 成功;`401` 未登录、`403` 无权限。 ## 目录结构 ``` pwms/ ├── pnpm-workspace.yaml ├── package.json ├── scripts/fix-sqlite3.ps1 └── packages/ ├── server/ # Express + Sequelize + SQLite │ ├── migrations/ # 版本化 schema │ ├── seeders/ # 初始数据 │ └── src/ │ ├── config/ # sequelize-cli 配置 + 连接实例 │ ├── models/ # Department / User / Task / OperationLog │ ├── controllers/ services/ routes/ middlewares/ utils/ jobs/ │ └── app.js ├── shared-sdk/ # 多端复用 API SDK(axios / uni 适配器) ├── admin-web/ # PC 端 Vue3 + Element Plus └── mobile/ # 移动端 uni-app 骨架 ``` ## 移动端(uni-app)说明 `packages/mobile` 为一套代码多端应用,功能与 PC 端对齐,按登录角色显示: | 角色 | 手机端可用功能 | |------|---------------| | 技术员 engineer | 首页看板、我的任务、任务详情、填写任务进展情况、统计(按室/按个人/按月)、修改密码 | | 室主任 director | 上述全部 + 下发任务、待确认(确认/驳回)、修改本室任务 | | 系统管理员 admin | 上述全部 + 用户管理、室管理、任务分类管理、删除任务(任务详情/编辑页内) | 权限三层校验:手机端按角色隐藏入口 → 页面内二次守卫 → 后端接口按角色/数据范围强校验。 ```bash cd packages/mobile pnpm install # uni-app 依赖较大,建议在 HBuilderX 或独立目录安装 npm run build:h5 # H5 npm run build:mp-weixin # 微信小程序(用微信开发者工具导入 dist/build/mp-weixin) npm run build:app # App(配合 HBuilderX 云打包) ``` 后端地址通过 `VITE_API_BASE` 配置(默认 `http://localhost:8100`),H5 devServer 已代理 `/api`。 移动端图表使用 [uCharts](https://www.ucharts.cn)(`@qiun/ucharts`),首页含完成率环形图,统计页含按月趋势折线图。App / 小程序打包与微信登录配置详见 [docs/mobile-packaging.md](docs/mobile-packaging.md)。 ## 离线部署(内网 / 无外网电脑) 系统可打包成一体化 exe 安装包:内嵌 Node.js 运行时与全部生产依赖,目标机无需外网、无需预装 Node.js。 ```powershell # 在开发机(需外网 + Inno Setup 6)执行,产物:dist\PWMSSetup-1.0.0.exe pwsh -File deploy/build.ps1 -Version 1.0.0 ``` 安装包会自动:生成配置文件 → 初始化数据库(幂等,可重复执行用于升级)→ 注册并启动 Windows 服务 `PWMS`(开机自启)→ 创建桌面/开始菜单快捷方式 → 可选添加防火墙入站规则。 - 数据库:`C:\ProgramData\PWMS\data\pwms.sqlite` - 服务日志:`安装目录\service\logs\` - PC 端:`http://localhost:8100`(局域网 `http://<本机IP>:8100`) - 移动端 H5:`http://<本机IP>:8100/m/`(手机浏览器,已随安装包部署) 完整的安装、静默部署、运维、升级、卸载说明见 [deploy/README.md](deploy/README.md)。 ## 迁移到 MySQL/PostgreSQL 1. `pnpm --filter @pwms/server add mysql2`(或 `pg pg-hstore`) 2. 修改 `packages/server/src/config/config.js` 的 `production.dialect` 与连接信息 3. 重新执行 `pnpm run migrate` 4. SQLite 存量数据可导出 CSV 后用工具导入 ## 注意事项 - 生产环境务必修改 `JWT_SECRET` - SQLite 已开启 WAL 模式与外键约束 - 前端权限仅为展示控制,后端已做数据范围与操作权限校验 - 每次 schema 变更新增 migration,不要手改表