1、整理APP端主题变量,统一主色、浅色背景、边框色、页面背景及卡片背景等公共样式
2、排查APP端列表分页情况,区分主列表分页与下拉选择器数据请求
3、补齐考勤记录、考勤异常、考勤汇总、员工社保档案、薪酬核算、薪资发放、班次、节假日、考勤规则、备件台账、领用记录及工序流转等页面分页
已添加1个文件
已修改233个文件
2143 ■■■■■ 文件已修改
src/App.vue 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/custom-tab-bar/index.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/aftersales/AftersalesAttachmentField.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/aftersales/form.scss 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/aftersales/list.scss 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/aftersales/return/detail.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/ai/form.scss 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/ai/knowledge/retrieval.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/ai/list.scss 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/basic-data/category/form.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/basic-data/category/index.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/basic-data/material/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/basic-data/material/index.vue 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/basic-data/unit/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/basic-data/unit/index.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/bpm/business-attach/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/bpm/business-attach/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/bpm/category/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/bpm/category/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/bpm/components/BpmApprovalFlow.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/bpm/components/DeptTreePicker.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/bpm/form/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/bpm/form/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/bpm/group/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/bpm/group/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/bpm/model/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/bpm/model/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/bpm/oa/notice/detail.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/bpm/oa/notice/form.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/bpm/process-expression/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/bpm/process-expression/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/bpm/process-instance/create/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/bpm/process-instance/create/index.vue 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/bpm/process-instance/detail.vue 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/bpm/process-instance/manager/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/bpm/process-instance/my/index.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/bpm/process-listener/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/bpm/process-listener/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/bpm/task/copy/index.vue 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/bpm/task/done/index.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/bpm/task/manager/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/bpm/task/todo/index.vue 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/crm/backlog/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/crm/business/detail.vue 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/crm/business/form.vue 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/crm/business/index.vue 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/crm/business/status-config.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/crm/clue/detail.vue 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/crm/clue/form.vue 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/crm/clue/index.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/crm/contact/detail.vue 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/crm/contact/form.vue 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/crm/contact/index.vue 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/crm/contract/config.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/crm/contract/detail.vue 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/crm/contract/form.vue 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/crm/contract/index.vue 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/crm/customer/detail.vue 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/crm/customer/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/crm/customer/index.vue 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/crm/customer/limit-config.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/crm/customer/pool-config.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/crm/customer/pool.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/crm/invoice/detail.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/crm/invoice/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/crm/invoice/index.vue 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/crm/receivable-plan/detail.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/crm/receivable-plan/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/crm/receivable-plan/index.vue 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/crm/receivable/detail.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/crm/receivable/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/crm/receivable/index.vue 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/crm/sale-quotation/detail.vue 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/crm/sale-quotation/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/crm/sale-quotation/index.vue 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/energy/alert/index.vue 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/energy/analysis/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/energy/record/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/energy/record/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/home/classic.vue 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/hrm/HrmAttachmentField.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/hrm/attendance-exception/index.vue 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/hrm/attendance-holiday/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/hrm/attendance-record/index.vue 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/hrm/attendance-rule/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/hrm/attendance-summary/index.vue 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/hrm/components/HrmCrudPage.vue 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/hrm/employee-social-security/index.vue 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/hrm/employee/form.vue 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/hrm/form.scss 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/hrm/list.scss 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/hrm/overtime/form.vue 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/hrm/salary-calculation/index.vue 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/hrm/salary-payment/index.vue 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/hrm/shift/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/login/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/cal/calendar/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/cal/holiday/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/cal/plan/form.vue 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/cal/plan/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/cal/team/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/cal/team/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/dv/checkplan/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/dv/checkplan/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/dv/checkrecord/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/dv/checkrecord/index.vue 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/dv/components/MachineryScanPicker.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/dv/machinery/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/dv/machinery/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/dv/machinery/type/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/dv/machinery/type/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/dv/maintenrecord/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/dv/maintenrecord/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/dv/metering/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/dv/metering/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/dv/meteringcheck/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/dv/meteringcheck/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/dv/repair/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/dv/repair/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/dv/spare-record/index.vue 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/dv/spare/action.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/dv/spare/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/dv/spare/index.vue 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/dv/subject/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/dv/subject/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/md/item/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/md/item/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/md/workstation/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/md/workstation/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/md/workstation/workshop/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/md/workstation/workshop/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/pd/archive/detail.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/pd/archive/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/pd/project/bom.vue 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/pd/project/detail.vue 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/pd/project/form.vue 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/pd/project/index.vue 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/pd/project/review.vue 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/pd/project/task.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/pd/project/version.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/pro/card/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/pro/card/index.vue 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/pro/feedback/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/pro/feedback/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/pro/mps/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/pro/mps/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/pro/task/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/pro/task/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/pro/workorder/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/pro/workorder/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/pro/workrecord/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/process-design/components/PickerSheet.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/process-design/parameter/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/process-design/parameter/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/process-design/process/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/process-design/process/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/process-design/process/param.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/process-design/route/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/process-design/route/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/process-design/template/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/process-design/template/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/qc/batchtrace/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/qc/defect/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/qc/defect/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/qc/indicator/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/qc/indicator/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/qc/ipqc/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/qc/ipqc/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/qc/iqc/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/qc/iqc/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/qc/ledger/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/qc/ncr/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/qc/ncr/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/qc/oqc/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/qc/oqc/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/qc/pendinginspect/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/qc/report/instance/detail.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/qc/report/instance/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/qc/report/template/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/qc/report/template/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/qc/rqc/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/qc/rqc/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/qc/template/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/qc/template/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/tm/tool/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/tm/tool/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/tm/tool/type/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/mes/tm/tool/type/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/message/index.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/profile/center.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/profile/index.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/profile/settings.vue 177 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/purchase/components/PurchaseDetail.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/purchase/components/PurchaseForm.vue 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/purchase/invoice/index.vue 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/purchase/order/index.vue 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/purchase/payment/index.vue 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/purchase/request/index.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/report/jmreport/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/report/jmreport/webview.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/sale/order/detail.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/sale/order/form.vue 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/sale/order/index.vue 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/sale/sales-target/detail.vue 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/sale/sales-target/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/sale/sales-target/index.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/srm/statistics/index.vue 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/srm/tender/detail.vue 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/srm/tender/form.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/srm/tender/index.vue 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/supplier/access/index.vue 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/supplier/archive/index.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/supplier/certificate/index.vue 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/supplier/performance/index.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/wls/barcode/config.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/wls/barcode/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/wls/components/WlsComplexForm.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/wls/components/WlsComplexList.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/wls/components/WlsDocForm.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/wls/components/WlsDocList.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/wls/components/WlsExtraDocForm.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/wls/components/WlsExtraDocList.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/wls/components/WlsFlowDocForm.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/wls/components/WlsFlowDocList.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/wls/material-stock/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/wls/sn/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/wls/transaction/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/wls/warehouse/area.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/wls/warehouse/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/wls/warehouse/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/wls/warehouse/location.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/workbench/index.vue 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/stores/theme.ts 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/styles/theme.scss 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/App.vue
@@ -1,7 +1,14 @@
<script setup lang="ts">
import { onHide, onShow } from '@dcloudio/uni-app';
import { onHide, onLaunch, onShow } from '@dcloudio/uni-app';
import { restoreTheme } from './stores/theme';
onLaunch(() => {
  restoreTheme();
});
onShow(() => {
  restoreTheme();
  console.info('[App] åº”用进入前台');
});
@@ -11,10 +18,42 @@
</script>
<style lang="scss">
/* #ifdef H5 */
:root {
  --color-primary: #1769d8;
  --color-primary-dark: #0f54b8;
  --color-primary-light: #4b8ee8;
  --color-primary-soft: #eef5ff;
  --color-primary-border: #bfdbff;
  --color-bg-page: #f6f7f9;
  --color-bg-card: #ffffff;
  --color-text-primary: #202c3d;
  --color-text-secondary: #65758b;
  --color-text-muted: #8a96a8;
  --color-border: #e5eaf0;
}
/* #endif */
/* #ifndef H5 */
page {
  --color-primary: #1769d8;
  --color-primary-dark: #0f54b8;
  --color-primary-light: #4b8ee8;
  --color-primary-soft: #eef5ff;
  --color-primary-border: #bfdbff;
  --color-bg-page: #f6f7f9;
  --color-bg-card: #ffffff;
  --color-text-primary: #202c3d;
  --color-text-secondary: #65758b;
  --color-text-muted: #8a96a8;
  --color-border: #e5eaf0;
}
/* #endif */
page {
  min-height: 100%;
  color: #202c3d;
  background: #f6f7f9;
  color: var(--color-text-primary, #202c3d);
  background: var(--color-bg-page, #f6f7f9);
  font-family: -apple-system, BlinkMacSystemFont, 'PingFang SC', 'Microsoft YaHei', sans-serif;
  font-size: 28rpx;
  line-height: 1.5;
@@ -66,11 +105,11 @@
  height: 36rpx !important;
  min-height: 36rpx;
  padding: 4rpx 12rpx !important;
  color: #1769d8 !important;
  color: var(--color-primary, #1769d8) !important;
  font-size: 22rpx !important;
  line-height: 1.2 !important;
  background: #eef5ff !important;
  border: 1rpx solid #bfdbff !important;
  background: var(--color-primary-soft, #eef5ff) !important;
  border: 1rpx solid var(--color-primary-border, #bfdbff) !important;
  border-radius: 999rpx !important;
  white-space: nowrap;
  word-break: keep-all;
@@ -154,9 +193,9 @@
text.status.tag-approved,
text.tag.tag-approved,
.tags text.tag-approved {
  color: #1769d8 !important;
  background: #edf5ff !important;
  border-color: #bfdbff !important;
  color: var(--color-primary, #1769d8) !important;
  background: var(--color-primary-soft, #edf5ff) !important;
  border-color: var(--color-primary-border, #bfdbff) !important;
}
text.status.tag-ok,
@@ -297,17 +336,6 @@
  color: #8092a7 !important;
  font-size: 34rpx !important;
  line-height: 1 !important;
}
/* å°ç¨‹åºç«¯ä¸ä¼šå¯é åœ°ä¸ºç»å¯¹å®šä½ä¼ªå…ƒç´ è¡¥é½é™æ€ä½ç½®ï¼Œæ˜Žç¡®é”šå®šæµ®åŠ¨æ–°å¢žæŒ‰é’®çš„ä¸¤æ¡çº¿ã€‚ */
.fab > view::before {
  top: 17rpx !important;
  left: 0 !important;
}
.fab > view::after {
  top: 0 !important;
  left: 17rpx !important;
}
.safe-top { padding-top: calc(30rpx + env(safe-area-inset-top)); }
src/custom-tab-bar/index.vue
@@ -3,9 +3,11 @@
  import { onShow } from "@dcloudio/uni-app";
  import { useNotify } from "../stores/notify";
  import { useAppTheme } from "../stores/theme";
  const currentPath = ref("");
  const { hasUnread, unreadLabel, refreshUnreadCount } = useNotify();
  const { primaryColor } = useAppTheme();
  const tabs = [
    {
@@ -61,6 +63,7 @@
          :key="tab.path"
          class="tab-item"
          :class="{ active: activePath === tab.path }"
          :style="activePath === tab.path ? { color: primaryColor } : undefined"
          @click="switchTab(tab.path)">
      <view class="icon">
        <image class="icon-image"
@@ -98,7 +101,7 @@
    font-size: 20rpx;
  }
  .tab-item.active {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-weight: 600;
  }
  .icon {
src/pages/aftersales/AftersalesAttachmentField.vue
@@ -40,4 +40,4 @@
}
</script>
<template><view class="attachments"><view class="attachment-head"><text>附件</text><button v-if="!readonly" :loading="uploading" @click="addFiles">添加附件</button></view><view v-for="(file,index) in files" :key="file.id" class="file"><text class="file-name" @click="preview(file)">{{ file.name || `附件 ${index+1}` }}</text><text v-if="!readonly" @click="remove(index)">删除</text></view><text v-if="!files.length" class="empty">暂无附件</text></view></template>
<style scoped lang="scss">.attachments{padding:20rpx 24rpx}.attachment-head,.file{display:flex;align-items:center;justify-content:space-between;gap:20rpx}.attachment-head{color:#33455d;font-size:27rpx}.attachment-head button{width:150rpx;height:56rpx;margin:0;color:#1769d8;font-size:23rpx;line-height:54rpx;background:#f3f7fd;border:1rpx solid #b9d1f2}.attachment-head button::after{border:0}.file{padding:14rpx 0;color:#526780;font-size:24rpx}.file-name{min-width:0;flex:1;overflow:hidden;color:#1769d8;text-decoration:underline;text-overflow:ellipsis;white-space:nowrap}.file text:last-child{flex:none;color:#cf4d4d}.empty{display:block;margin-top:14rpx;color:#9aa7b8;font-size:24rpx}</style>
<style scoped lang="scss">.attachments{padding:20rpx 24rpx}.attachment-head,.file{display:flex;align-items:center;justify-content:space-between;gap:20rpx}.attachment-head{color:#33455d;font-size:27rpx}.attachment-head button{width:150rpx;height:56rpx;margin:0;color:var(--color-primary, #1769d8);font-size:23rpx;line-height:54rpx;background:#f3f7fd;border:1rpx solid #b9d1f2}.attachment-head button::after{border:0}.file{padding:14rpx 0;color:#526780;font-size:24rpx}.file-name{min-width:0;flex:1;overflow:hidden;color:var(--color-primary, #1769d8);text-decoration:underline;text-overflow:ellipsis;white-space:nowrap}.file text:last-child{flex:none;color:#cf4d4d}.empty{display:block;margin-top:14rpx;color:#9aa7b8;font-size:24rpx}</style>
src/pages/aftersales/form.scss
@@ -1,2 +1,2 @@
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.section-title{padding:18rpx 6rpx 12rpx;color:#728197;font-size:23rpx}.form-card,.detail-card{overflow:hidden;margin-bottom:20rpx;background:#fff;border-radius:14rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:18rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:205rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:flex-end;gap:10rpx}.picker text:first-child{min-width:0;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{color:#8092a7;font-size:36rpx}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:150rpx;font-size:27rpx}.required::before{content:"*";margin-right:6rpx;color:#e23b3b}.save{margin-top:32rpx;color:#fff;background:#1769d8;border-radius:10rpx}.save::after{border:0}.state{padding:38rpx;color:#8795a8;text-align:center}.item{padding:20rpx 24rpx;border-bottom:1rpx solid #eef1f5}.item-head{display:flex;align-items:center;justify-content:space-between;color:#20334c;font-size:27rpx;font-weight:600}.item-sub{display:block;margin-top:8rpx;color:#75859a;font-size:23rpx}.item-grid{display:grid;grid-template-columns:1fr 1fr;gap:14rpx;margin-top:16rpx}.item-grid input{height:68rpx;padding:0 14rpx;font-size:24rpx;text-align:right;background:#f6f8fb;border-radius:8rpx}.checks{display:flex;gap:26rpx;margin-top:16rpx;color:#526780;font-size:24rpx}.mini{height:52rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:50rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.mini.danger{color:#c65050;border-color:#e3a0a0}.mini::after{border:0}.detail-row{display:flex;justify-content:space-between;gap:24rpx;padding:18rpx 24rpx;color:#64758a;font-size:25rpx;border-bottom:1rpx solid #eef1f5}.detail-row text:last-child{color:#20334c;text-align:right}.toolbar{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding:18rpx 0}.toolbar button{min-height:58rpx;padding:0 20rpx;margin:0;color:#1769d8;font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid #8ab3ee;border-radius:8rpx}.toolbar .danger{color:#c65050;border-color:#e3a0a0}.toolbar button::after{border:0}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.section-title{padding:18rpx 6rpx 12rpx;color:#728197;font-size:23rpx}.form-card,.detail-card{overflow:hidden;margin-bottom:20rpx;background:#fff;border-radius:14rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:18rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:205rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:flex-end;gap:10rpx}.picker text:first-child{min-width:0;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{color:#8092a7;font-size:36rpx}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:150rpx;font-size:27rpx}.required::before{content:"*";margin-right:6rpx;color:#e23b3b}.save{margin-top:32rpx;color:#fff;background:var(--color-primary, #1769d8);border-radius:10rpx}.save::after{border:0}.state{padding:38rpx;color:#8795a8;text-align:center}.item{padding:20rpx 24rpx;border-bottom:1rpx solid #eef1f5}.item-head{display:flex;align-items:center;justify-content:space-between;color:#20334c;font-size:27rpx;font-weight:600}.item-sub{display:block;margin-top:8rpx;color:#75859a;font-size:23rpx}.item-grid{display:grid;grid-template-columns:1fr 1fr;gap:14rpx;margin-top:16rpx}.item-grid input{height:68rpx;padding:0 14rpx;font-size:24rpx;text-align:right;background:#f6f8fb;border-radius:8rpx}.checks{display:flex;gap:26rpx;margin-top:16rpx;color:#526780;font-size:24rpx}.mini{height:52rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:50rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.mini.danger{color:#c65050;border-color:#e3a0a0}.mini::after{border:0}.detail-row{display:flex;justify-content:space-between;gap:24rpx;padding:18rpx 24rpx;color:#64758a;font-size:25rpx;border-bottom:1rpx solid #eef1f5}.detail-row text:last-child{color:#20334c;text-align:right}.toolbar{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding:18rpx 0}.toolbar button{min-height:58rpx;padding:0 20rpx;margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.toolbar .danger{color:#c65050;border-color:#e3a0a0}.toolbar button::after{border:0}
src/pages/aftersales/list.scss
@@ -1,9 +1,9 @@
.page{min-height:100vh;padding:20rpx 30rpx 150rpx;box-sizing:border-box;background:#f3f6fb}
.scene-tabs{height:88rpx;margin-bottom:0;white-space:nowrap}.scene-tabs text{display:inline-block;padding:27rpx 20rpx 18rpx;color:#718198;font-size:27rpx}.scene-tabs .active{color:#1769d8;font-weight:600;border-bottom:4rpx solid #1769d8}
.search{display:flex;align-items:center;height:80rpx;padding:0 20rpx;margin-bottom:18rpx;background:#fff;border-radius:12rpx}.search input{min-width:0;flex:1;font-size:27rpx}.search text{padding-left:18rpx;color:#1769d8;font-size:24rpx}
.page{min-height:100vh;padding: 20rpx 30rpx 132rpx;box-sizing:border-box;background:#f3f6fb}
.scene-tabs{height:88rpx;margin-bottom:0;white-space:nowrap}.scene-tabs text{display:inline-block;padding:27rpx 20rpx 18rpx;color:#718198;font-size:27rpx}.scene-tabs .active{color:var(--color-primary, #1769d8);font-weight:600;border-bottom:4rpx solid var(--color-primary, #1769d8)}
.search{display:flex;align-items:center;height:80rpx;padding:0 20rpx;margin-bottom:18rpx;background:#fff;border-radius:12rpx}.search input{min-width:0;flex:1;font-size:27rpx}.search text{padding-left:18rpx;color:var(--color-primary, #1769d8);font-size:24rpx}
.card{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:14rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.07)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head-main{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:700;text-overflow:ellipsis;white-space:nowrap}.sub{color:#78879b;font-size:23rpx}
.tag{display:inline-flex;flex:none;align-items:center;height:42rpx;padding:0 15rpx;font-size:22rpx;border-radius:999rpx}.tag-blue{color:#1769d8;background:#eef6ff}.tag-green{color:#0e9663;background:#e9fbf2}.tag-orange{color:#c26a12;background:#fff4e7}.tag-danger{color:#c65050;background:#fff0f0}.tag-gray{color:#66778c;background:#f0f3f7}
.tag{display:inline-flex;flex:none;align-items:center;height:42rpx;padding:0 15rpx;font-size:22rpx;border-radius:999rpx}.tag-blue{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #eef6ff)}.tag-green{color:#0e9663;background:#e9fbf2}.tag-orange{color:#c26a12;background:#fff4e7}.tag-danger{color:#c65050;background:#fff0f0}.tag-gray{color:#66778c;background:#f0f3f7}
.grid{display:grid;grid-template-columns:1fr 1fr;gap:11rpx;padding:16rpx 0;margin-top:15rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}
.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}
.state,.more{display:block;padding:45rpx 0;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c65050}
.fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}.fab view{position:relative;width:38rpx;height:38rpx}.fab view::before,.fab view::after{position:absolute;content:"";background:#fff}.fab view::before{top:17rpx;width:38rpx;height:4rpx}.fab view::after{left:17rpx;width:4rpx;height:38rpx}
.fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}.fab view{position:relative;width:38rpx;height:38rpx}.fab view::before,.fab view::after{position:absolute;content:"";background:#fff}.fab view::before{top:17rpx;width:38rpx;height:4rpx}.fab view::after{left:17rpx;width:4rpx;height:38rpx}
src/pages/aftersales/return/detail.vue
@@ -82,5 +82,5 @@
<style scoped lang="scss">
@import "../form.scss";
.link { color: #1769d8 !important; text-decoration: underline; }
.link { color: var(--color-primary, #1769d8) !important; text-decoration: underline; }
</style>
src/pages/ai/form.scss
@@ -1 +1 @@
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:18rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:210rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:10rpx}.picker text:first-child{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{color:#8092a7;font-size:36rpx}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:150rpx;font-size:27rpx}.required{color:#e23b3b}.save{margin-top:32rpx;color:#fff;background:#1769d8;border-radius:12rpx}.save::after{border:0}.state{padding:38rpx;color:#8795a8;text-align:center}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:18rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:210rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:10rpx}.picker text:first-child{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{color:#8092a7;font-size:36rpx}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:150rpx;font-size:27rpx}.required{color:#e23b3b}.save{margin-top:32rpx;color:#fff;background:var(--color-primary, #1769d8);border-radius:12rpx}.save::after{border:0}.state{padding:38rpx;color:#8795a8;text-align:center}
src/pages/ai/knowledge/retrieval.vue
@@ -41,5 +41,5 @@
  </view>
</template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:24rpx 30rpx 60rpx;box-sizing:border-box;background:#f3f6fb}.query-card,.result-card{padding:24rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 22rpx rgba(43,69,107,.07)}.title{display:block;margin-bottom:18rpx;color:#20334c;font-size:30rpx;font-weight:700}.query-card textarea{width:100%;height:180rpx;padding:18rpx;box-sizing:border-box;font-size:26rpx;background:#f7f9fc;border-radius:10rpx}.params{display:grid;grid-template-columns:1fr 1fr;gap:18rpx;margin:18rpx 0}.params label{display:flex;align-items:center;gap:10rpx;color:#64758b;font-size:24rpx}.params input{min-width:0;height:60rpx;flex:1;text-align:center;background:#f7f9fc;border-radius:8rpx}.query-card button{color:#fff;background:#1769d8;border-radius:10rpx}.query-card button::after{border:0}.result-head{display:flex;justify-content:space-between;color:#1769d8;font-size:26rpx;font-weight:700}.document{display:block;margin-top:12rpx;color:#76869a;font-size:23rpx}.content{display:block;margin-top:14rpx;color:#334a65;font-size:26rpx;line-height:1.6}.meta{display:flex;justify-content:space-between;padding-top:16rpx;margin-top:16rpx;color:#8795a8;font-size:22rpx;border-top:1rpx solid #edf1f6}.empty{padding:60rpx;color:#8795a8;text-align:center}
.page{min-height:100vh;padding:24rpx 30rpx 60rpx;box-sizing:border-box;background:#f3f6fb}.query-card,.result-card{padding:24rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 22rpx rgba(43,69,107,.07)}.title{display:block;margin-bottom:18rpx;color:#20334c;font-size:30rpx;font-weight:700}.query-card textarea{width:100%;height:180rpx;padding:18rpx;box-sizing:border-box;font-size:26rpx;background:#f7f9fc;border-radius:10rpx}.params{display:grid;grid-template-columns:1fr 1fr;gap:18rpx;margin:18rpx 0}.params label{display:flex;align-items:center;gap:10rpx;color:#64758b;font-size:24rpx}.params input{min-width:0;height:60rpx;flex:1;text-align:center;background:#f7f9fc;border-radius:8rpx}.query-card button{color:#fff;background:var(--color-primary, #1769d8);border-radius:10rpx}.query-card button::after{border:0}.result-head{display:flex;justify-content:space-between;color:var(--color-primary, #1769d8);font-size:26rpx;font-weight:700}.document{display:block;margin-top:12rpx;color:#76869a;font-size:23rpx}.content{display:block;margin-top:14rpx;color:#334a65;font-size:26rpx;line-height:1.6}.meta{display:flex;justify-content:space-between;padding-top:16rpx;margin-top:16rpx;color:#8795a8;font-size:22rpx;border-top:1rpx solid #edf1f6}.empty{padding:60rpx;color:#8795a8;text-align:center}
</style>
src/pages/ai/list.scss
@@ -1 +1 @@
.page{min-height:100vh;padding:20rpx 30rpx 150rpx;box-sizing:border-box;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;padding:0 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.card{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view>text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:700;text-overflow:ellipsis;white-space:nowrap}.tag{flex:none;padding:6rpx 16rpx;font-size:22rpx;border-radius:999rpx}.tag-on{color:#0e9663;background:#e9fbf2;border:1rpx solid #b8eed4}.tag-off{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.tags{display:flex;gap:10rpx;margin-top:14rpx}.tags text{padding:5rpx 13rpx;font-size:21rpx;border-radius:999rpx}.tag-blue{color:#1769d8;background:#eef6ff}.tag-orange{color:#c78210;background:#fff5e6}.summary{margin-top:14rpx;padding:14rpx;color:#596b82;font-size:24rpx;line-height:1.5;background:#f7faff;border-radius:10rpx}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid.two{grid-template-columns:1fr 1fr}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.state,.more{display:block;padding:45rpx 0;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c65050}.fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}.fab view{position:relative;width:38rpx;height:38rpx}.fab view::before,.fab view::after{position:absolute;content:"";background:#fff;border-radius:3rpx}.fab view::before{top:17rpx;left:0;width:38rpx;height:4rpx}.fab view::after{top:0;left:17rpx;width:4rpx;height:38rpx}
.page{min-height:100vh;padding: 20rpx 30rpx 132rpx;box-sizing:border-box;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;padding:0 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.card{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view>text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:700;text-overflow:ellipsis;white-space:nowrap}.tag{flex:none;padding:6rpx 16rpx;font-size:22rpx;border-radius:999rpx}.tag-on{color:#0e9663;background:#e9fbf2;border:1rpx solid #b8eed4}.tag-off{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.tags{display:flex;gap:10rpx;margin-top:14rpx}.tags text{padding:5rpx 13rpx;font-size:21rpx;border-radius:999rpx}.tag-blue{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #eef6ff)}.tag-orange{color:#c78210;background:#fff5e6}.summary{margin-top:14rpx;padding:14rpx;color:#596b82;font-size:24rpx;line-height:1.5;background:#f7faff;border-radius:10rpx}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid.two{grid-template-columns:1fr 1fr}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.state,.more{display:block;padding:45rpx 0;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c65050}.fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}.fab view{position:relative;width:38rpx;height:38rpx}.fab view::before,.fab view::after{position:absolute;content:"";background:#fff;border-radius:3rpx}.fab view::before{top:17rpx;left:0;width:38rpx;height:4rpx}.fab view::after{top:0;left:17rpx;width:4rpx;height:38rpx}
src/pages/basic-data/category/form.vue
@@ -183,9 +183,9 @@
    min-width: 136rpx;
    margin: 0;
    padding: 0 16rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    background: #fff;
    border: 1rpx solid #1769d8;
    border: 1rpx solid var(--color-primary, #1769d8);
    border-radius: 8rpx;
    font-size: 24rpx;
    line-height: 56rpx;
@@ -231,7 +231,7 @@
  .save {
    margin-top: 32rpx;
    color: #fff;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 12rpx;
    font-size: 30rpx;
  }
src/pages/basic-data/category/index.vue
@@ -189,7 +189,7 @@
    min-height: 0;
    height: 0;
    flex: 1;
    padding-bottom: 150rpx;
    padding-bottom: 132rpx;
    box-sizing: border-box;
  }
  .row-main,
@@ -214,18 +214,18 @@
  }
  .search text {
    font-size: 24rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
  }
  .actions button {
    min-height: 52rpx;
    padding: 0 14rpx;
    margin: 0;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 23rpx;
    font-weight: 600;
    line-height: 50rpx;
    background: #f5f8ff;
    border: 1rpx solid #8ab3ee;
    background: var(--color-primary-soft, #f5f8ff);
    border: 1rpx solid var(--color-primary-border, #8ab3ee);
    border-radius: 8rpx;
  }
  .tools button::after,
@@ -354,16 +354,14 @@
    flex-direction: column;
    align-items: center;
    justify-content: center;
    width: 132rpx;
    height: 132rpx;
    min-height: 132rpx;
    width: 104rpx; height: 104rpx; min-height: 104rpx;
    padding: 0;
    margin: 0;
    color: #fff;
    font-size: 25rpx;
    font-weight: 600;
    line-height: 32rpx;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 50%;
    box-shadow: 0 12rpx 24rpx rgba(23, 105, 216, 0.3);
  }
src/pages/basic-data/material/form.vue
@@ -251,7 +251,7 @@
  .save {
    margin-top: 32rpx;
    color: #fff;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 12rpx;
    font-size: 30rpx;
  }
src/pages/basic-data/material/index.vue
@@ -189,7 +189,7 @@
    min-height: 0;
    height: 0;
    flex: 1;
    padding-bottom: 150rpx;
    padding-bottom: 132rpx;
    box-sizing: border-box;
  }
  .main,
@@ -222,7 +222,7 @@
  }
  .search text {
    font-size: 24rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
  }
  .list {
    background: transparent;
@@ -279,12 +279,12 @@
    min-height: 56rpx;
    padding: 0 18rpx;
    margin: 0;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 24rpx;
    font-weight: 600;
    line-height: 54rpx;
    background: #f5f8ff;
    border: 1rpx solid #8ab3ee;
    background: var(--color-primary-soft, #f5f8ff);
    border: 1rpx solid var(--color-primary-border, #8ab3ee);
    border-radius: 10rpx;
  }
  .actions button::after,
@@ -311,7 +311,7 @@
    width: 220rpx;
    margin: 20rpx auto;
    color: #fff;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 12rpx;
  }
  .create-fab {
@@ -323,16 +323,14 @@
    flex-direction: column;
    align-items: center;
    justify-content: center;
    width: 132rpx;
    height: 132rpx;
    min-height: 132rpx;
    width: 104rpx; height: 104rpx; min-height: 104rpx;
    padding: 0;
    margin: 0;
    color: #fff;
    font-size: 25rpx;
    font-weight: 600;
    line-height: 32rpx;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 50%;
    box-shadow: 0 12rpx 24rpx rgba(23, 105, 216, 0.3);
  }
src/pages/basic-data/unit/form.vue
@@ -8,4 +8,4 @@
onLoad(async query => { id.value = query.id ? Number(query.id) : undefined; if (!id.value || !state.accessToken) return; try { Object.assign(form, await getMeasureUnit(state.accessToken, id.value)); } catch (error) { uni.showToast({ title: error instanceof Error ? error.message : '数据加载失败', icon: 'none' }); } });
</script>
<template><view class="page"><view class="form-card"><view class="field"><text>单位编码 <text class="required">*</text></text><input v-model="form.code" placeholder="请输入单位编码" /></view><view class="field"><text>单位名称 <text class="required">*</text></text><input v-model="form.name" placeholder="请输入单位名称" /></view><view class="field"><text>状态</text><radio-group @change="form.status = Number($event.detail.value)"><label><radio :checked="form.status === 0" value="0" />启用</label><label><radio :checked="form.status === 1" value="1" />停用</label></radio-group></view><view class="field column"><text>备注</text><textarea v-model="form.remark" placeholder="请输入备注" ></textarea></view></view><button class="save" :loading="saving" :disabled="saving" @click="save">保存</button></view></template>
<style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.form-card{background:#fff;border-radius:16rpx;overflow:hidden}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;border-bottom:1rpx solid #eef1f5;gap:20rpx}.field>text{width:180rpx;color:#33455d;font-size:27rpx}.field input{flex:1;color:#1e3049;font-size:27rpx}.field radio-group{flex:1;display:flex;gap:30rpx;font-size:26rpx}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text{width:auto}.column textarea{width:100%;height:130rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;background:#1769d8;border-radius:12rpx;font-size:30rpx}.save::after{border:0}</style>
<style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.form-card{background:#fff;border-radius:16rpx;overflow:hidden}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;border-bottom:1rpx solid #eef1f5;gap:20rpx}.field>text{width:180rpx;color:#33455d;font-size:27rpx}.field input{flex:1;color:#1e3049;font-size:27rpx}.field radio-group{flex:1;display:flex;gap:30rpx;font-size:26rpx}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text{width:auto}.column textarea{width:100%;height:130rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;background:var(--color-primary, #1769d8);border-radius:12rpx;font-size:30rpx}.save::after{border:0}</style>
src/pages/basic-data/unit/index.vue
@@ -153,7 +153,7 @@
    min-height: 0;
    height: 0;
    flex: 1;
    padding-bottom: 150rpx;
    padding-bottom: 132rpx;
    box-sizing: border-box;
  }
  .row-head,
@@ -191,7 +191,7 @@
  }
  .search text {
    font-size: 24rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
  }
  .list {
    display: grid;
@@ -259,12 +259,12 @@
    min-height: 50rpx;
    padding: 0 14rpx;
    margin: 0;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 22rpx;
    font-weight: 600;
    line-height: 48rpx;
    background: #f5f8ff;
    border: 1rpx solid #8ab3ee;
    background: var(--color-primary-soft, #f5f8ff);
    border: 1rpx solid var(--color-primary-border, #8ab3ee);
    border-radius: 10rpx;
  }
  .actions button::after,
@@ -298,16 +298,14 @@
    flex-direction: column;
    align-items: center;
    justify-content: center;
    width: 132rpx;
    height: 132rpx;
    min-height: 132rpx;
    width: 104rpx; height: 104rpx; min-height: 104rpx;
    padding: 0;
    margin: 0;
    color: #fff;
    font-size: 25rpx;
    font-weight: 600;
    line-height: 32rpx;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 50%;
    box-shadow: 0 12rpx 24rpx rgba(23, 105, 216, 0.3);
  }
src/pages/bpm/business-attach/form.vue
@@ -10,4 +10,4 @@
  async function save(){ if(saving.value||!canSave.value)return; if(!state.accessToken)return; if(!form.name){toast("请填写配置名称");return;} saving.value=true; try{ if(id.value)await updateBusinessAttach(state.accessToken,form); else await createBusinessAttach(state.accessToken,form); uni.showToast({title:"已保存",icon:"success"}); setTimeout(()=>uni.navigateBack(),500);}catch(e){toast(e instanceof Error?e.message:"保存失败");}finally{saving.value=false}}
</script>
<template><view class="page"><view class="card"><view class="field"><text>配置名称 <text class="required">*</text></text><input v-model="form.name" :disabled="!canSave" placeholder="请输入配置名称"/></view><view class="field"><text>配置编码</text><input v-model="form.code" :disabled="!canSave" placeholder="请输入配置编码"/></view><view class="field"><text>流程定义 Key</text><input v-model="form.processDefinitionKey" :disabled="!canSave" placeholder="请输入流程定义 Key"/></view><view class="field"><text>节点 Key</text><input v-model="form.taskDefinitionKey" :disabled="!canSave" placeholder="请输入节点 Key"/></view><view class="field"><text>文件类型</text><input v-model="form.fileTypes" :disabled="!canSave" placeholder="如 pdf,jpg,png"/></view><view class="field"><text>最大大小</text><input :value="form.maxSize===undefined?'':String(form.maxSize)" :disabled="!canSave" type="number" @input="form.maxSize=Number($event.detail.value||0)"/></view><view class="field"><text>是否必填</text><switch :checked="Boolean(form.required)" :disabled="!canSave" @change="form.required=$event.detail.value"/></view><view class="field"><text>状态</text><switch :checked="form.status!==1" :disabled="!canSave" @change="form.status=$event.detail.value?0:1"/></view><view class="field column"><text>备注</text><textarea v-model="form.remark" :disabled="!canSave" placeholder="请输入备注"/></view></view><button v-if="canSave" class="save" :loading="saving" @click="save">保存</button></view></template>
<style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;gap:20rpx;padding:0 24rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:210rpx;flex:none;color:#33455d;font-size:27rpx}.field input{min-width:0;flex:1;color:#1e3049;font-size:27rpx;text-align:right}.required{color:#e23b3b}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:150rpx;box-sizing:border-box;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.save::after{border:0}</style>
<style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;gap:20rpx;padding:0 24rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:210rpx;flex:none;color:#33455d;font-size:27rpx}.field input{min-width:0;flex:1;color:#1e3049;font-size:27rpx;text-align:right}.required{color:#e23b3b}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:150rpx;box-sizing:border-box;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.save::after{border:0}</style>
src/pages/bpm/business-attach/index.vue
@@ -12,4 +12,4 @@
  onShow(()=>load(true)); onPullDownRefresh(async()=>{await load(true);uni.stopPullDownRefresh()}); onReachBottom(()=>load());
</script>
<template><view class="page"><view class="search"><input v-model="keyword" placeholder="搜索附件配置名称" confirm-type="search" @confirm="load(true)"/><text @click="load(true)">搜索</text></view><view v-if="error" class="state error" @click="load(true)">{{ error }}</view><view v-for="item in list" :key="item.id" class="card"><view class="head"><view><text class="name">{{ item.name }}</text><text>{{ fmt(item.code) }}</text></view><text :class="['tag',statusClass(item.status)]">{{ statusText(item.status) }}</text></view><view class="grid"><text>流程定义:{{ fmt(item.processDefinitionKey) }}</text><text>节点:{{ fmt(item.taskDefinitionKey) }}</text><text>文件类型:{{ fmt(item.fileTypes) }}</text><text>是否必填:{{ item.required ? '是' : '否' }}</text></view><view class="actions"><button @click="go(item.id,'detail')">详情</button><button v-if="canUpdate" @click="go(item.id)">编辑</button><button v-if="canDelete" class="danger" @click="remove(item.id)">删除</button></view></view><view v-if="!list.length&&!loading" class="state">暂无业务附件配置</view><view v-else class="more">{{ hasMore ? (loading?'加载中...':'上拉加载更多') : '没有更多了' }}</view><button v-if="canCreate" class="fab" @click="go()"><view /></button></view></template>
<style lang="scss" scoped>.page{min-height:100vh;padding:20rpx 30rpx 150rpx;box-sizing:border-box;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;padding:0 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.card{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view{min-width:0;display:flex;flex:1;flex-direction:column;gap:8rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:700;text-overflow:ellipsis;white-space:nowrap}.head text:last-child{color:#78879b;font-size:23rpx}.tag{flex:none;padding:6rpx 16rpx;font-size:22rpx;border-radius:999rpx}.tag-on{color:#0e9663;background:#e9fbf2;border:1rpx solid #b8eed4}.tag-off{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.state,.more{display:block;padding:45rpx 0;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c65050}.fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}.fab view{position:relative;width:38rpx;height:38rpx}.fab view::before,.fab view::after{position:absolute;content:"";background:#fff;border-radius:3rpx}.fab view::before{top:17rpx;left:0;width:38rpx;height:4rpx}.fab view::after{top:0;left:17rpx;width:4rpx;height:38rpx}</style>
<style lang="scss" scoped>.page{min-height:100vh;padding: 20rpx 30rpx 132rpx;box-sizing:border-box;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;padding:0 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.card{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view{min-width:0;display:flex;flex:1;flex-direction:column;gap:8rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:700;text-overflow:ellipsis;white-space:nowrap}.head text:last-child{color:#78879b;font-size:23rpx}.tag{flex:none;padding:6rpx 16rpx;font-size:22rpx;border-radius:999rpx}.tag-on{color:#0e9663;background:#e9fbf2;border:1rpx solid #b8eed4}.tag-off{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.state,.more{display:block;padding:45rpx 0;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c65050}.fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}.fab view{position:relative;width:38rpx;height:38rpx}.fab view::before,.fab view::after{position:absolute;content:"";background:#fff;border-radius:3rpx}.fab view::before{top:17rpx;left:0;width:38rpx;height:4rpx}.fab view::after{top:0;left:17rpx;width:4rpx;height:38rpx}</style>
src/pages/bpm/category/form.vue
@@ -12,4 +12,4 @@
  async function save() { if (!canSave.value) return; if (!state.accessToken) return; if (!form.name || !form.code) { toast("请填写分类名称和编码"); return; } saving.value = true; try { if (id.value) await updateCategory(state.accessToken, form); else await createCategory(state.accessToken, form); uni.showToast({ title:"已保存", icon:"success" }); setTimeout(()=>uni.navigateBack(),500); } finally { saving.value=false; } }
</script>
<template><view class="page"><view class="card"><view class="field"><text>分类名称 <text class="required">*</text></text><input v-model="form.name" :disabled="!canSave" placeholder="请输入分类名称"/></view><view class="field"><text>分类编码 <text class="required">*</text></text><input v-model="form.code" :disabled="!canSave" placeholder="请输入分类编码"/></view><view class="field"><text>显示排序</text><input :value="String(form.sort||0)" :disabled="!canSave" type="number" @input="form.sort=Number($event.detail.value||0)"/></view><view class="field"><text>状态</text><switch :checked="form.status !== 1" :disabled="!canSave" @change="form.status=$event.detail.value?0:1"/></view><view class="field column"><text>描述</text><textarea v-model="form.description" :disabled="!canSave" placeholder="请输入描述"/></view></view><button v-if="canSave" class="save" :loading="saving" @click="save">保存</button></view></template>
<style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;gap:20rpx;padding:0 24rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input{min-width:0;flex:1;color:#1e3049;font-size:27rpx;text-align:right}.required{color:#e23b3b}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:150rpx;box-sizing:border-box;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.save::after{border:0}</style>
<style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;gap:20rpx;padding:0 24rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input{min-width:0;flex:1;color:#1e3049;font-size:27rpx;text-align:right}.required{color:#e23b3b}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:150rpx;box-sizing:border-box;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.save::after{border:0}</style>
src/pages/bpm/category/index.vue
@@ -45,4 +45,4 @@
  onReachBottom(() => load());
</script>
<template><view class="page"><view class="search"><input v-model="keyword" placeholder="搜索分类名称" confirm-type="search" @confirm="load(true)"/><text @click="load(true)">搜索</text></view><view v-if="error" class="state error" @click="load(true)">{{ error }}</view><view v-for="item in list" :key="item.id" class="card"><view class="head"><view><text class="name">{{ item.name }}</text><text>{{ fmt(item.code) }}</text></view><text :class="['tag', statusClass(item.status)]">{{ statusText(item.status) }}</text></view><view class="grid"><text>排序:{{ fmt(item.sort) }}</text><text>描述:{{ fmt(item.description) }}</text></view><view class="actions"><button @click="go(item.id,'detail')">详情</button><button v-if="canUpdate" @click="go(item.id)">编辑</button><button v-if="canDelete" class="danger" @click="remove(item.id)">删除</button></view></view><view v-if="!list.length && !loading" class="state">暂无流程分类</view><view v-else class="more">{{ hasMore ? (loading ? '加载中...' : '上拉加载更多') : '没有更多了' }}</view><button v-if="canCreate" class="fab" @click="go()"><view /></button></view></template>
<style lang="scss" scoped>.page{min-height:100vh;padding:20rpx 30rpx 150rpx;box-sizing:border-box;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;padding:0 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.card{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view{min-width:0;display:flex;flex:1;flex-direction:column;gap:8rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:700;text-overflow:ellipsis;white-space:nowrap}.head text:last-child{color:#78879b;font-size:23rpx}.tag{flex:none;padding:6rpx 16rpx;font-size:22rpx;border-radius:999rpx}.tag-on{color:#0e9663;background:#e9fbf2;border:1rpx solid #b8eed4}.tag-off{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.state,.more{display:block;padding:45rpx 0;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c65050}.fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}.fab view{position:relative;width:38rpx;height:38rpx}.fab view::before,.fab view::after{position:absolute;content:"";background:#fff;border-radius:3rpx}.fab view::before{top:17rpx;left:0;width:38rpx;height:4rpx}.fab view::after{top:0;left:17rpx;width:4rpx;height:38rpx}</style>
<style lang="scss" scoped>.page{min-height:100vh;padding: 20rpx 30rpx 132rpx;box-sizing:border-box;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;padding:0 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.card{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view{min-width:0;display:flex;flex:1;flex-direction:column;gap:8rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:700;text-overflow:ellipsis;white-space:nowrap}.head text:last-child{color:#78879b;font-size:23rpx}.tag{flex:none;padding:6rpx 16rpx;font-size:22rpx;border-radius:999rpx}.tag-on{color:#0e9663;background:#e9fbf2;border:1rpx solid #b8eed4}.tag-off{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.state,.more{display:block;padding:45rpx 0;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c65050}.fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}.fab view{position:relative;width:38rpx;height:38rpx}.fab view::before,.fab view::after{position:absolute;content:"";background:#fff;border-radius:3rpx}.fab view::before{top:17rpx;left:0;width:38rpx;height:4rpx}.fab view::after{top:0;left:17rpx;width:4rpx;height:38rpx}</style>
src/pages/bpm/components/BpmApprovalFlow.vue
@@ -274,7 +274,7 @@
  }
  .node-user.picked {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    background: #eef4fd;
  }
src/pages/bpm/components/DeptTreePicker.vue
@@ -202,10 +202,10 @@
  .sheet{display:flex;flex-direction:column;width:100%;max-height:80vh;background:#fff;border-radius:24rpx 24rpx 0 0}
  .sheet-head{display:flex;align-items:center;justify-content:space-between;height:96rpx;padding:0 28rpx;border-bottom:1rpx solid #edf1f6}
  .sheet-head-title{color:#10233f;font-size:30rpx;font-weight:600}
  .sheet-close{color:#1769d8;font-size:25rpx}
  .sheet-close{color:var(--color-primary, #1769d8);font-size:25rpx}
  .sheet-search{display:flex;align-items:center;height:76rpx;gap:16rpx;margin:18rpx 28rpx 6rpx;padding:0 20rpx;background:#f4f7fb;border-radius:14rpx}
  .sheet-search input{min-width:0;flex:1;font-size:26rpx}
  .sheet-search text{flex:none;color:#1769d8;font-size:24rpx}
  .sheet-search text{flex:none;color:var(--color-primary, #1769d8);font-size:24rpx}
  .sheet-body{height:660rpx;flex:none;padding:8rpx 28rpx 0;box-sizing:border-box}
  .tree-row{display:flex;align-items:center;gap:10rpx;padding:20rpx 0;border-bottom:1rpx solid #f2f5f9}
  .tree-arrow{width:32rpx;flex:none;color:#8494a8;font-size:24rpx;text-align:center}
@@ -213,7 +213,7 @@
  .tree-label{min-width:0;flex:1;overflow:hidden;color:#1e3049;font-size:27rpx;text-overflow:ellipsis;white-space:nowrap}
  .tree-check{display:flex;width:40rpx;height:40rpx;flex:none;align-items:center;justify-content:center;color:#fff;font-size:24rpx;background:#fff;border:2rpx solid #cfd9e6;border-radius:8rpx}
  .tree-check.all,
  .tree-check.half{background:#1769d8;border-color:#1769d8}
  .tree-check.half{background:var(--color-primary, #1769d8);border-color:var(--color-primary, #1769d8)}
  .half-bar{width:20rpx;height:4rpx;background:#fff;border-radius:2rpx}
  .sheet-state{padding:60rpx 0;color:#8795a8;font-size:25rpx;text-align:center}
  .sheet-foot{display:flex;align-items:center;justify-content:space-between;padding:18rpx 28rpx 34rpx;border-top:1rpx solid #edf1f6}
@@ -221,6 +221,6 @@
  .sheet-foot>view{display:flex;gap:16rpx}
  .sheet-foot button{height:72rpx;min-height:72rpx;padding:0 34rpx;margin:0;font-size:26rpx;line-height:70rpx;border-radius:36rpx}
  .sheet-foot button::after{border:0}
  .ghost{color:#1769d8;background:#f2f6fc;border:1rpx solid #cfe0f7}
  .primary{color:#fff;background:#1769d8}
  .ghost{color:var(--color-primary, #1769d8);background:#f2f6fc;border:1rpx solid #cfe0f7}
  .primary{color:#fff;background:var(--color-primary, #1769d8)}
</style>
src/pages/bpm/form/form.vue
@@ -11,4 +11,4 @@
  async function save(){ if(!canSave.value)return; if(!state.accessToken)return; if(!form.name){toast("请填写表单名称");return;} form.fields=fieldsText.value.split(/\n|,/).map(x=>x.trim()).filter(Boolean); saving.value=true; try{ if(id.value) await updateForm(state.accessToken,form); else await createForm(state.accessToken,form); uni.showToast({title:"已保存",icon:"success"}); setTimeout(()=>uni.navigateBack(),500);}finally{saving.value=false}}
</script>
<template><view class="page"><view class="card"><view class="field"><text>表单名称 <text class="required">*</text></text><input v-model="form.name" :disabled="!canSave" placeholder="请输入表单名称"/></view><view class="field"><text>状态</text><switch :checked="form.status!==1" :disabled="!canSave" @change="form.status=$event.detail.value?0:1"/></view><view class="field column"><text>表单配置</text><textarea v-model="form.conf" :disabled="!canSave" placeholder="请输入表单配置 JSON"/></view><view class="field column"><text>字段配置</text><textarea v-model="fieldsText" :disabled="!canSave" placeholder="每行一个字段 JSON æˆ–字段名"/></view><view class="field column"><text>备注</text><textarea v-model="form.remark" :disabled="!canSave" placeholder="请输入备注"/></view></view><button v-if="canSave" class="save" :loading="saving" @click="save">保存</button></view></template>
<style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;gap:20rpx;padding:0 24rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input{min-width:0;flex:1;color:#1e3049;font-size:27rpx;text-align:right}.required{color:#e23b3b}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:190rpx;box-sizing:border-box;font-size:26rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.save::after{border:0}</style>
<style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;gap:20rpx;padding:0 24rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input{min-width:0;flex:1;color:#1e3049;font-size:27rpx;text-align:right}.required{color:#e23b3b}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:190rpx;box-sizing:border-box;font-size:26rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.save::after{border:0}</style>
src/pages/bpm/form/index.vue
@@ -12,4 +12,4 @@
  onShow(()=>load(true)); onPullDownRefresh(async()=>{await load(true);uni.stopPullDownRefresh()}); onReachBottom(()=>load());
</script>
<template><view class="page"><view class="search"><input v-model="keyword" placeholder="搜索表单名称" confirm-type="search" @confirm="load(true)"/><text @click="load(true)">搜索</text></view><view v-if="error" class="state error" @click="load(true)">{{ error }}</view><view v-for="item in list" :key="item.id" class="card"><view class="head"><view><text class="name">{{ item.name }}</text><text>字段数:{{ item.fields?.length || 0 }}</text></view><text :class="['tag',statusClass(item.status)]">{{ statusText(item.status) }}</text></view><view class="grid"><text>备注:{{ fmt(item.remark) }}</text><text>创建时间:{{ fmt(item.createTime) }}</text></view><view class="actions"><button @click="go(item.id,'detail')">详情</button><button v-if="canUpdate" @click="go(item.id)">编辑</button><button v-if="canDelete" class="danger" @click="remove(item.id)">删除</button></view></view><view v-if="!list.length&&!loading" class="state">暂无流程表单</view><view v-else class="more">{{ hasMore ? (loading?'加载中...':'上拉加载更多') : '没有更多了' }}</view><button v-if="canCreate" class="fab" @click="go()"><view /></button></view></template>
<style lang="scss" scoped>.page{min-height:100vh;padding:20rpx 30rpx 150rpx;box-sizing:border-box;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;padding:0 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.card{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view{min-width:0;display:flex;flex:1;flex-direction:column;gap:8rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:700;text-overflow:ellipsis;white-space:nowrap}.head text:last-child{color:#78879b;font-size:23rpx}.tag{flex:none;padding:6rpx 16rpx;font-size:22rpx;border-radius:999rpx}.tag-on{color:#0e9663;background:#e9fbf2;border:1rpx solid #b8eed4}.tag-off{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.state,.more{display:block;padding:45rpx 0;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c65050}.fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}.fab view{position:relative;width:38rpx;height:38rpx}.fab view::before,.fab view::after{position:absolute;content:"";background:#fff;border-radius:3rpx}.fab view::before{top:17rpx;left:0;width:38rpx;height:4rpx}.fab view::after{top:0;left:17rpx;width:4rpx;height:38rpx}</style>
<style lang="scss" scoped>.page{min-height:100vh;padding: 20rpx 30rpx 132rpx;box-sizing:border-box;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;padding:0 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.card{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view{min-width:0;display:flex;flex:1;flex-direction:column;gap:8rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:700;text-overflow:ellipsis;white-space:nowrap}.head text:last-child{color:#78879b;font-size:23rpx}.tag{flex:none;padding:6rpx 16rpx;font-size:22rpx;border-radius:999rpx}.tag-on{color:#0e9663;background:#e9fbf2;border:1rpx solid #b8eed4}.tag-off{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.state,.more{display:block;padding:45rpx 0;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c65050}.fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}.fab view{position:relative;width:38rpx;height:38rpx}.fab view::before,.fab view::after{position:absolute;content:"";background:#fff;border-radius:3rpx}.fab view::before{top:17rpx;left:0;width:38rpx;height:4rpx}.fab view::after{top:0;left:17rpx;width:4rpx;height:38rpx}</style>
src/pages/bpm/group/form.vue
@@ -13,4 +13,4 @@
  async function save(){ if(!canSave.value)return; if(!state.accessToken)return; if(!form.name){toast("请填写分组名称");return;} saving.value=true; try{ if(id.value) await updateUserGroup(state.accessToken,form); else await createUserGroup(state.accessToken,form); uni.showToast({title:"已保存",icon:"success"}); setTimeout(()=>uni.navigateBack(),500);}finally{saving.value=false}}
</script>
<template><view class="page"><view class="card"><view class="field"><text>分组名称 <text class="required">*</text></text><input v-model="form.name" :disabled="!canSave" placeholder="请输入分组名称"/></view><view class="field"><text>状态</text><switch :checked="form.status!==1" :disabled="!canSave" @change="form.status=$event.detail.value?0:1"/></view><view class="field" @click="canSave && (showUsers=true)"><text>成员</text><view class="value">{{ userNames }}<text>›</text></view></view><view class="field column"><text>描述</text><textarea v-model="form.description" :disabled="!canSave" placeholder="请输入描述"/></view><view class="field column"><text>备注</text><textarea v-model="form.remark" :disabled="!canSave" placeholder="请输入备注"/></view></view><button v-if="canSave" class="save" :loading="saving" @click="save">保存</button><view v-if="showUsers" class="mask" @click.self="showUsers=false"><view class="sheet"><view class="sheet-head"><text>选择成员</text><text @click="showUsers=false">完成</text></view><checkbox-group @change="changeUsers"><label v-for="user in users" :key="user.id" class="user"><text>{{ user.nickname || user.id }}</text><checkbox :value="String(user.id)" :checked="form.userIds?.includes(user.id || 0)"/></label></checkbox-group></view></view></view></template>
<style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;gap:20rpx;padding:0 24rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input{min-width:0;flex:1;color:#1e3049;font-size:27rpx;text-align:right}.value{display:flex;min-width:0;flex:1;align-items:center;justify-content:flex-end;gap:12rpx;color:#1e3049;font-size:27rpx;text-align:right}.value text{flex:none;color:#8092a7;font-size:36rpx}.required{color:#e23b3b}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:150rpx;box-sizing:border-box;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.save::after{border:0}.mask{position:fixed;inset:0;z-index:30;display:flex;align-items:flex-end;background:rgba(18,29,43,.42)}.sheet{width:100%;max-height:78vh;overflow:auto;background:#fff;border-radius:24rpx 24rpx 0 0}.sheet-head{display:flex;align-items:center;justify-content:space-between;height:92rpx;padding:0 30rpx;border-bottom:1rpx solid #edf1f6}.sheet-head text:first-child{color:#20334c;font-size:30rpx;font-weight:700}.sheet-head text:last-child{color:#1769d8;font-size:25rpx}.user{display:flex;align-items:center;justify-content:space-between;min-height:86rpx;padding:0 30rpx;border-bottom:1rpx solid #edf1f6}.user text{color:#20334c;font-size:26rpx}</style>
<style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;gap:20rpx;padding:0 24rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input{min-width:0;flex:1;color:#1e3049;font-size:27rpx;text-align:right}.value{display:flex;min-width:0;flex:1;align-items:center;justify-content:flex-end;gap:12rpx;color:#1e3049;font-size:27rpx;text-align:right}.value text{flex:none;color:#8092a7;font-size:36rpx}.required{color:#e23b3b}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:150rpx;box-sizing:border-box;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.save::after{border:0}.mask{position:fixed;inset:0;z-index:30;display:flex;align-items:flex-end;background:rgba(18,29,43,.42)}.sheet{width:100%;max-height:78vh;overflow:auto;background:#fff;border-radius:24rpx 24rpx 0 0}.sheet-head{display:flex;align-items:center;justify-content:space-between;height:92rpx;padding:0 30rpx;border-bottom:1rpx solid #edf1f6}.sheet-head text:first-child{color:#20334c;font-size:30rpx;font-weight:700}.sheet-head text:last-child{color:var(--color-primary, #1769d8);font-size:25rpx}.user{display:flex;align-items:center;justify-content:space-between;min-height:86rpx;padding:0 30rpx;border-bottom:1rpx solid #edf1f6}.user text{color:#20334c;font-size:26rpx}</style>
src/pages/bpm/group/index.vue
@@ -12,4 +12,4 @@
  onShow(()=>load(true)); onPullDownRefresh(async()=>{await load(true);uni.stopPullDownRefresh()}); onReachBottom(()=>load());
</script>
<template><view class="page"><view class="search"><input v-model="keyword" placeholder="搜索分组名称" confirm-type="search" @confirm="load(true)"/><text @click="load(true)">搜索</text></view><view v-if="error" class="state error" @click="load(true)">{{ error }}</view><view v-for="item in list" :key="item.id" class="card"><view class="head"><view><text class="name">{{ item.name }}</text><text>成员数:{{ item.userIds?.length || 0 }}</text></view><text :class="['tag',statusClass(item.status)]">{{ statusText(item.status) }}</text></view><view class="grid"><text>描述:{{ fmt(item.description) }}</text><text>备注:{{ fmt(item.remark) }}</text><text>创建时间:{{ fmt(item.createTime) }}</text></view><view class="actions"><button @click="go(item.id,'detail')">详情</button><button v-if="canUpdate" @click="go(item.id)">编辑</button><button v-if="canDelete" class="danger" @click="remove(item.id)">删除</button></view></view><view v-if="!list.length&&!loading" class="state">暂无用户分组</view><view v-else class="more">{{ hasMore ? (loading?'加载中...':'上拉加载更多') : '没有更多了' }}</view><button v-if="canCreate" class="fab" @click="go()"><view /></button></view></template>
<style lang="scss" scoped>.page{min-height:100vh;padding:20rpx 30rpx 150rpx;box-sizing:border-box;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;padding:0 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.card{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view{min-width:0;display:flex;flex:1;flex-direction:column;gap:8rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:700;text-overflow:ellipsis;white-space:nowrap}.head text:last-child{color:#78879b;font-size:23rpx}.tag{flex:none;padding:6rpx 16rpx;font-size:22rpx;border-radius:999rpx}.tag-on{color:#0e9663;background:#e9fbf2;border:1rpx solid #b8eed4}.tag-off{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.state,.more{display:block;padding:45rpx 0;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c65050}.fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}.fab view{position:relative;width:38rpx;height:38rpx}.fab view::before,.fab view::after{position:absolute;content:"";background:#fff;border-radius:3rpx}.fab view::before{top:17rpx;left:0;width:38rpx;height:4rpx}.fab view::after{top:0;left:17rpx;width:4rpx;height:38rpx}</style>
<style lang="scss" scoped>.page{min-height:100vh;padding: 20rpx 30rpx 132rpx;box-sizing:border-box;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;padding:0 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.card{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view{min-width:0;display:flex;flex:1;flex-direction:column;gap:8rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:700;text-overflow:ellipsis;white-space:nowrap}.head text:last-child{color:#78879b;font-size:23rpx}.tag{flex:none;padding:6rpx 16rpx;font-size:22rpx;border-radius:999rpx}.tag-on{color:#0e9663;background:#e9fbf2;border:1rpx solid #b8eed4}.tag-off{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.state,.more{display:block;padding:45rpx 0;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c65050}.fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}.fab view{position:relative;width:38rpx;height:38rpx}.fab view::before,.fab view::after{position:absolute;content:"";background:#fff;border-radius:3rpx}.fab view::before{top:17rpx;left:0;width:38rpx;height:4rpx}.fab view::after{top:0;left:17rpx;width:4rpx;height:38rpx}</style>
src/pages/bpm/model/form.vue
@@ -14,4 +14,4 @@
  async function save(){ if(!canSave.value)return; if(!state.accessToken)return; if(!form.name||!form.key){toast("请填写模型名称和流程标识");return;} saving.value=true; try{ if(id.value) await updateModel(state.accessToken,form); else await createModel(state.accessToken,form); uni.showToast({title:"已保存",icon:"success"}); setTimeout(()=>uni.navigateBack(),500);}finally{saving.value=false}}
</script>
<template><view class="page"><view class="card"><view class="field"><text>流程名称 <text class="required">*</text></text><input v-model="form.name" :disabled="!canSave" placeholder="请输入流程名称"/></view><view class="field"><text>流程标识 <text class="required">*</text></text><input v-model="form.key" :disabled="!canSave" placeholder="请输入流程标识"/></view><view class="field"><text>流程分类</text><picker :disabled="!canSave" :range="categories" range-key="name" :value="categoryIndex" @change="chooseCategory(Number($event.detail.value))"><view class="picker"><text>{{ categories[categoryIndex]?.name || '请选择分类' }}</text><text>›</text></view></picker></view><view class="field"><text>表单类型</text><picker :disabled="!canSave" :range="['流程表单','业务表单']" :value="form.formType===20?1:0" @change="form.formType=Number($event.detail.value)===1?20:10"><view class="picker"><text>{{ form.formType===20?'业务表单':'流程表单' }}</text><text>›</text></view></picker></view><view v-if="form.formType!==20" class="field"><text>流程表单</text><picker :disabled="!canSave" :range="forms" range-key="name" :value="formIndex" @change="chooseForm(Number($event.detail.value))"><view class="picker"><text>{{ form.formName || forms[formIndex]?.name || '请选择表单' }}</text><text>›</text></view></picker></view><template v-else><view class="field"><text>创建路径</text><input v-model="form.formCustomCreatePath" :disabled="!canSave" placeholder="请输入业务表单创建路径"/></view><view class="field"><text>查看路径</text><input v-model="form.formCustomViewPath" :disabled="!canSave" placeholder="请输入业务表单查看路径"/></view></template><view class="field"><text>状态</text><switch :checked="form.status!==1" :disabled="!canSave" @change="form.status=$event.detail.value?0:1"/></view><view class="field column"><text>描述</text><textarea v-model="form.description" :disabled="!canSave" placeholder="请输入描述"/></view><view class="field column"><text>备注</text><textarea v-model="form.remark" :disabled="!canSave" placeholder="请输入备注"/></view></view><view class="tips">流程图设计、节点权限、打印模板等复杂画布建议在 Web ç«¯ç»´æŠ¤ï¼›ç§»åŠ¨ç«¯ä¿ç•™åŸºç¡€ä¿¡æ¯å’Œéƒ¨ç½²æŽ§åˆ¶ã€‚</view><button v-if="canSave" class="save" :loading="saving" @click="save">保存</button></view></template>
<style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;gap:20rpx;padding:0 24rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input{text-align:right}.picker{display:flex;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;color:#8092a7;font-size:36rpx}.required{color:#e23b3b}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;box-sizing:border-box;font-size:27rpx}.tips{margin-top:20rpx;padding:20rpx 24rpx;color:#66778c;font-size:24rpx;line-height:1.6;background:#fff;border-radius:16rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.save::after{border:0}</style>
<style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;gap:20rpx;padding:0 24rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input{text-align:right}.picker{display:flex;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;color:#8092a7;font-size:36rpx}.required{color:#e23b3b}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;box-sizing:border-box;font-size:27rpx}.tips{margin-top:20rpx;padding:20rpx 24rpx;color:#66778c;font-size:24rpx;line-height:1.6;background:#fff;border-radius:16rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.save::after{border:0}</style>
src/pages/bpm/model/index.vue
@@ -12,4 +12,4 @@
  onShow(load); onPullDownRefresh(async()=>{await load();uni.stopPullDownRefresh()});
</script>
<template><view class="page"><view class="search"><input v-model="keyword" placeholder="搜索模型名称" confirm-type="search" @confirm="load"/><text @click="load">搜索</text></view><view v-if="error" class="state error" @click="load">{{ error }}</view><view v-for="item in list" :key="item.id" class="card"><view class="head"><view><text class="name">{{ item.name }}</text><text>{{ fmt(item.key) }}</text></view><text :class="['tag',statusClass(item.status)]">{{ statusText(item.status) }}</text></view><view class="chips"><text>{{ formTypeText(item.formType) }}</text><text>分类 {{ fmt(item.category) }}</text><text>版本 {{ fmt(item.processDefinition?.version) }}</text></view><view class="grid"><text>表单:{{ fmt(item.formName) }}</text><text>描述:{{ fmt(item.description) }}</text><text>创建时间:{{ fmt(item.createTime) }}</text></view><view class="actions"><button @click="go(item.id,'detail')">详情</button><button v-if="canUpdate" @click="go(item.id)">编辑</button><button v-if="canUpdate" @click="action('state',item)">{{ item.status===1?'启用':'禁用' }}</button><button v-if="canDeploy" @click="action('deploy',item)">部署</button><button v-if="canUpdate" @click="action('clean',item)">清理</button><button v-if="canDelete" class="danger" @click="action('delete',item)">删除</button></view></view><view v-if="!list.length&&!loading" class="state">暂无流程模型</view><button v-if="canCreate" class="fab" @click="go()"><view /></button></view></template>
<style lang="scss" scoped>.page{min-height:100vh;padding:20rpx 30rpx 150rpx;box-sizing:border-box;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;padding:0 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.card{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view{min-width:0;display:flex;flex:1;flex-direction:column;gap:8rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:700;text-overflow:ellipsis;white-space:nowrap}.head text:last-child{color:#78879b;font-size:23rpx}.tag{flex:none;padding:6rpx 16rpx;font-size:22rpx;border-radius:999rpx}.tag-on{color:#0e9663;background:#e9fbf2;border:1rpx solid #b8eed4}.tag-off{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.chips{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.chips text{padding:5rpx 12rpx;color:#1769d8;font-size:22rpx;background:#eef6ff;border-radius:999rpx}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.state{display:block;padding:45rpx 0;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c65050}.fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}.fab view{position:relative;width:38rpx;height:38rpx}.fab view::before,.fab view::after{position:absolute;content:"";background:#fff;border-radius:3rpx}.fab view::before{top:17rpx;left:0;width:38rpx;height:4rpx}.fab view::after{top:0;left:17rpx;width:4rpx;height:38rpx}</style>
<style lang="scss" scoped>.page{min-height:100vh;padding: 20rpx 30rpx 132rpx;box-sizing:border-box;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;padding:0 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.card{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view{min-width:0;display:flex;flex:1;flex-direction:column;gap:8rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:700;text-overflow:ellipsis;white-space:nowrap}.head text:last-child{color:#78879b;font-size:23rpx}.tag{flex:none;padding:6rpx 16rpx;font-size:22rpx;border-radius:999rpx}.tag-on{color:#0e9663;background:#e9fbf2;border:1rpx solid #b8eed4}.tag-off{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.chips{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.chips text{padding:5rpx 12rpx;color:var(--color-primary, #1769d8);font-size:22rpx;background:var(--color-primary-soft, #eef6ff);border-radius:999rpx}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.state{display:block;padding:45rpx 0;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c65050}.fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}.fab view{position:relative;width:38rpx;height:38rpx}.fab view::before,.fab view::after{position:absolute;content:"";background:#fff;border-radius:3rpx}.fab view::before{top:17rpx;left:0;width:38rpx;height:4rpx}.fab view::after{top:0;left:17rpx;width:4rpx;height:38rpx}</style>
src/pages/bpm/oa/notice/detail.vue
@@ -1,2 +1,2 @@
<script setup lang="ts">import { computed,ref } from "vue";import { onLoad } from "@dcloudio/uni-app";import { getNotice,type OaNotice } from "../../../../api/bpm";import { useAuth } from "../../../../stores/auth";const {hasPermission,state}=useAuth(),notice=ref<OaNotice>(),loading=ref(false),canQuery=computed(()=>hasPermission("bpm:oa-notice:query"));onLoad(async q=>{const id=Number(q.id);if(!id||!state.accessToken||!canQuery.value)return;loading.value=true;try{notice.value=await getNotice(state.accessToken,id)}catch(e){uni.showToast({title:e instanceof Error?e.message:"详情加载失败",icon:"none"})}finally{loading.value=false}});</script>
<template><view class="page"><view v-if="notice" class="detail"><view class="title-row"><text class="title">{{notice.title}}</text><text :class="['type',notice.type===2?'announcement':'notice']">{{notice.type===2?'公告':'通知'}}</text></view><view class="meta"><text>{{notice.status===0?'草稿':notice.status===1?'已发布':'已撤销'}}</text><text>{{notice.sendScope===2?'指定人员':'通知所有人'}}</text><text v-if="notice.isTop===1">置顶</text></view><view class="info"><text>发布时间:{{notice.publishTime||'--'}}</text><text>创建时间:{{notice.createTime||'--'}}</text><text v-if="notice.sendScope===2">指定人员:{{notice.userIds?.join('、')||'--'}}</text></view><view class="content"><rich-text :nodes="notice.content||''"/></view></view><view v-else class="state">{{loading?'加载中...':'暂无公告详情'}}</view></view></template><style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx;box-sizing:border-box;background:#f3f6fb}.detail{padding:30rpx 26rpx;background:#fff;border-radius:16rpx}.title-row{display:flex;align-items:flex-start;gap:16rpx}.title{min-width:0;flex:1;color:#20334c;font-size:34rpx;font-weight:700;line-height:1.4}.type{flex:none;padding:6rpx 14rpx;font-size:22rpx;border-radius:999rpx}.notice{color:#1769d8;background:#eef6ff}.announcement{color:#c78210;background:#fff5e6}.meta{display:flex;gap:12rpx;margin-top:18rpx}.meta text{padding:5rpx 12rpx;color:#64758b;font-size:22rpx;background:#f3f6fa;border-radius:999rpx}.info{display:grid;gap:12rpx;padding:22rpx 0;margin-top:22rpx;color:#718198;font-size:24rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.content{min-height:260rpx;padding-top:28rpx;color:#33455d;font-size:28rpx;line-height:1.8}.state{padding:80rpx;color:#8795a8;text-align:center}</style>
<template><view class="page"><view v-if="notice" class="detail"><view class="title-row"><text class="title">{{notice.title}}</text><text :class="['type',notice.type===2?'announcement':'notice']">{{notice.type===2?'公告':'通知'}}</text></view><view class="meta"><text>{{notice.status===0?'草稿':notice.status===1?'已发布':'已撤销'}}</text><text>{{notice.sendScope===2?'指定人员':'通知所有人'}}</text><text v-if="notice.isTop===1">置顶</text></view><view class="info"><text>发布时间:{{notice.publishTime||'--'}}</text><text>创建时间:{{notice.createTime||'--'}}</text><text v-if="notice.sendScope===2">指定人员:{{notice.userIds?.join('、')||'--'}}</text></view><view class="content"><rich-text :nodes="notice.content||''"/></view></view><view v-else class="state">{{loading?'加载中...':'暂无公告详情'}}</view></view></template><style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx;box-sizing:border-box;background:#f3f6fb}.detail{padding:30rpx 26rpx;background:#fff;border-radius:16rpx}.title-row{display:flex;align-items:flex-start;gap:16rpx}.title{min-width:0;flex:1;color:#20334c;font-size:34rpx;font-weight:700;line-height:1.4}.type{flex:none;padding:6rpx 14rpx;font-size:22rpx;border-radius:999rpx}.notice{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #eef6ff)}.announcement{color:#c78210;background:#fff5e6}.meta{display:flex;gap:12rpx;margin-top:18rpx}.meta text{padding:5rpx 12rpx;color:#64758b;font-size:22rpx;background:#f3f6fa;border-radius:999rpx}.info{display:grid;gap:12rpx;padding:22rpx 0;margin-top:22rpx;color:#718198;font-size:24rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.content{min-height:260rpx;padding-top:28rpx;color:#33455d;font-size:28rpx;line-height:1.8}.state{padding:80rpx;color:#8795a8;text-align:center}</style>
src/pages/bpm/oa/notice/form.vue
@@ -3,8 +3,10 @@
import { onLoad } from "@dcloudio/uni-app";
import { createNotice, getBpmUserListByIds, getBpmUserPage, getNotice, updateNotice, type BpmUser, type OaNotice } from "../../../../api/bpm";
import { useAuth } from "../../../../stores/auth";
import { useAppTheme } from "../../../../stores/theme";
const { hasPermission, state } = useAuth();
const { primaryColor } = useAppTheme();
const id = ref<number>();
const mode = ref("edit");
const saving = ref(false);
@@ -93,7 +95,7 @@
      <view class="field"><text>状态</text><picker v-if="!readonly" :range="['草稿','已发布','已撤销']" @change="form.status=Number($event.detail.value)"><view class="picker"><text>{{ ['草稿','已发布','已撤销'][form.status] }}</text><text>›</text></view></picker><text v-else class="value">{{ ['草稿','已发布','已撤销'][form.status] }}</text></view>
      <view class="field"><text>发送范围 <text class="required">*</text></text><picker v-if="!readonly" :range="['通知所有人','指定人员']" @change="changeScope(Number($event.detail.value))"><view class="picker"><text>{{ form.sendScope===2?'指定人员':'通知所有人' }}</text><text>›</text></view></picker><text v-else class="value">{{ form.sendScope===2?'指定人员':'通知所有人' }}</text></view>
      <view v-if="form.sendScope===2" class="field"><text>指定人员 <text class="required">*</text></text><view class="picker user-value" @click="openUserPicker"><text>{{ selectedUserText }}</text><text v-if="!readonly">›</text></view></view>
      <view class="field"><text>是否置顶</text><switch :checked="form.isTop===1" :disabled="readonly" color="#1769d8" @change="form.isTop=$event.detail.value?1:0"/></view>
      <view class="field"><text>是否置顶</text><switch :checked="form.isTop===1" :disabled="readonly" :color="primaryColor" @change="form.isTop=$event.detail.value?1:0"/></view>
      <view class="field column"><text>内容 <text class="required">*</text></text><textarea v-model="form.content" :disabled="readonly" placeholder="请输入通知公告内容"/></view>
    </view>
    <button v-if="canSave" class="save" :loading="saving" @click="save">保存</button>
@@ -118,5 +120,5 @@
<style lang="scss" scoped>
@import "../../../ai/form.scss";
.user-value{min-width:0}.user-value text:first-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mask{position:fixed;z-index:50;inset:0;display:flex;align-items:flex-end;background:rgba(21,35,52,.42)}.user-sheet{width:100%;height:76vh;overflow:hidden;background:#f5f7fa;border-radius:20rpx 20rpx 0 0}.sheet-head{display:grid;height:92rpx;grid-template-columns:120rpx 1fr 150rpx;align-items:center;padding:0 26rpx;color:#65768b;font-size:26rpx;background:#fff;border-bottom:1rpx solid #e9edf2}.sheet-title{color:#20334c;font-size:29rpx;font-weight:600;text-align:center}.confirm{color:#1769d8;text-align:right}.user-search{display:flex;align-items:center;height:76rpx;padding:0 20rpx;margin:18rpx 24rpx;background:#fff;border-radius:12rpx}.user-search input{min-width:0;flex:1;font-size:26rpx}.user-search text{padding-left:20rpx;color:#1769d8;font-size:25rpx}.user-list{height:calc(76vh - 204rpx);background:#fff}.user-row{display:flex;min-height:94rpx;align-items:center;padding:0 28rpx;border-bottom:1rpx solid #edf1f5}.user-main{display:flex;min-width:0;flex:1;flex-direction:column;gap:7rpx}.user-main text:first-child{color:#263a53;font-size:27rpx}.user-main text:last-child{color:#8a98aa;font-size:22rpx}.check{display:flex;width:38rpx;height:38rpx;align-items:center;justify-content:center;color:#fff;font-size:25rpx;border:2rpx solid #ccd5e0;border-radius:50%}.check.checked{background:#1769d8;border-color:#1769d8}.sheet-state{display:block;padding:30rpx;color:#8a98aa;font-size:24rpx;text-align:center}
.user-value{min-width:0}.user-value text:first-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mask{position:fixed;z-index:50;inset:0;display:flex;align-items:flex-end;background:rgba(21,35,52,.42)}.user-sheet{width:100%;height:76vh;overflow:hidden;background:#f5f7fa;border-radius:20rpx 20rpx 0 0}.sheet-head{display:grid;height:92rpx;grid-template-columns:120rpx 1fr 150rpx;align-items:center;padding:0 26rpx;color:#65768b;font-size:26rpx;background:#fff;border-bottom:1rpx solid #e9edf2}.sheet-title{color:#20334c;font-size:29rpx;font-weight:600;text-align:center}.confirm{color:var(--color-primary, #1769d8);text-align:right}.user-search{display:flex;align-items:center;height:76rpx;padding:0 20rpx;margin:18rpx 24rpx;background:#fff;border-radius:12rpx}.user-search input{min-width:0;flex:1;font-size:26rpx}.user-search text{padding-left:20rpx;color:var(--color-primary, #1769d8);font-size:25rpx}.user-list{height:calc(76vh - 204rpx);background:#fff}.user-row{display:flex;min-height:94rpx;align-items:center;padding:0 28rpx;border-bottom:1rpx solid #edf1f5}.user-main{display:flex;min-width:0;flex:1;flex-direction:column;gap:7rpx}.user-main text:first-child{color:#263a53;font-size:27rpx}.user-main text:last-child{color:#8a98aa;font-size:22rpx}.check{display:flex;width:38rpx;height:38rpx;align-items:center;justify-content:center;color:#fff;font-size:25rpx;border:2rpx solid #ccd5e0;border-radius:50%}.check.checked{background:var(--color-primary, #1769d8);border-color:var(--color-primary, #1769d8)}.sheet-state{display:block;padding:30rpx;color:#8a98aa;font-size:24rpx;text-align:center}
</style>
src/pages/bpm/process-expression/form.vue
@@ -10,4 +10,4 @@
  async function save(){ if(saving.value||!canSave.value)return; if(!state.accessToken)return; if(!form.name){toast("请填写表达式名称");return;} saving.value=true; try{ if(id.value)await updateProcessExpression(state.accessToken,form); else await createProcessExpression(state.accessToken,form); uni.showToast({title:"已保存",icon:"success"}); setTimeout(()=>uni.navigateBack(),500);}catch(e){toast(e instanceof Error?e.message:"保存失败");}finally{saving.value=false}}
</script>
<template><view class="page"><view class="card"><view class="field"><text>表达式名称 <text class="required">*</text></text><input v-model="form.name" :disabled="!canSave" placeholder="请输入表达式名称"/></view><view class="field"><text>状态</text><switch :checked="form.status!==1" :disabled="!canSave" @change="form.status=$event.detail.value?0:1"/></view><view class="field column"><text>表达式</text><textarea v-model="form.expression" :disabled="!canSave" placeholder="请输入表达式"/></view></view><button v-if="canSave" class="save" :loading="saving" @click="save">保存</button></view></template>
<style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;gap:20rpx;padding:0 24rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input{min-width:0;flex:1;color:#1e3049;font-size:27rpx;text-align:right}.required{color:#e23b3b}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:220rpx;box-sizing:border-box;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.save::after{border:0}</style>
<style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;gap:20rpx;padding:0 24rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input{min-width:0;flex:1;color:#1e3049;font-size:27rpx;text-align:right}.required{color:#e23b3b}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:220rpx;box-sizing:border-box;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.save::after{border:0}</style>
src/pages/bpm/process-expression/index.vue
@@ -12,4 +12,4 @@
  onShow(()=>load(true)); onPullDownRefresh(async()=>{await load(true);uni.stopPullDownRefresh()}); onReachBottom(()=>load());
</script>
<template><view class="page"><view class="search"><input v-model="keyword" placeholder="搜索表达式名称" confirm-type="search" @confirm="load(true)"/><text @click="load(true)">搜索</text></view><view v-if="error" class="state error" @click="load(true)">{{ error }}</view><view v-for="item in list" :key="item.id" class="card"><view class="head"><view><text class="name">{{ item.name }}</text><text>{{ fmt(item.expression) }}</text></view><text :class="['tag',statusClass(item.status)]">{{ statusText(item.status) }}</text></view><view class="grid"><text>创建时间:{{ fmt(item.createTime) }}</text></view><view class="actions"><button @click="go(item.id,'detail')">详情</button><button v-if="canUpdate" @click="go(item.id)">编辑</button><button v-if="canDelete" class="danger" @click="remove(item.id)">删除</button></view></view><view v-if="!list.length&&!loading" class="state">暂无流程表达式</view><view v-else class="more">{{ hasMore ? (loading?'加载中...':'上拉加载更多') : '没有更多了' }}</view><button v-if="canCreate" class="fab" @click="go()"><view /></button></view></template>
<style lang="scss" scoped>.page{min-height:100vh;padding:20rpx 30rpx 150rpx;box-sizing:border-box;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;padding:0 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.card{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view{min-width:0;display:flex;flex:1;flex-direction:column;gap:8rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:700;text-overflow:ellipsis;white-space:nowrap}.head text:last-child{color:#78879b;font-size:23rpx}.tag{flex:none;padding:6rpx 16rpx;font-size:22rpx;border-radius:999rpx}.tag-on{color:#0e9663;background:#e9fbf2;border:1rpx solid #b8eed4}.tag-off{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.state,.more{display:block;padding:45rpx 0;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c65050}.fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}.fab view{position:relative;width:38rpx;height:38rpx}.fab view::before,.fab view::after{position:absolute;content:"";background:#fff;border-radius:3rpx}.fab view::before{top:17rpx;left:0;width:38rpx;height:4rpx}.fab view::after{top:0;left:17rpx;width:4rpx;height:38rpx}</style>
<style lang="scss" scoped>.page{min-height:100vh;padding: 20rpx 30rpx 132rpx;box-sizing:border-box;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;padding:0 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.card{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view{min-width:0;display:flex;flex:1;flex-direction:column;gap:8rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:700;text-overflow:ellipsis;white-space:nowrap}.head text:last-child{color:#78879b;font-size:23rpx}.tag{flex:none;padding:6rpx 16rpx;font-size:22rpx;border-radius:999rpx}.tag-on{color:#0e9663;background:#e9fbf2;border:1rpx solid #b8eed4}.tag-off{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.state,.more{display:block;padding:45rpx 0;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c65050}.fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}.fab view{position:relative;width:38rpx;height:38rpx}.fab view::before,.fab view::after{position:absolute;content:"";background:#fff;border-radius:3rpx}.fab view::before{top:17rpx;left:0;width:38rpx;height:4rpx}.fab view::after{top:0;left:17rpx;width:4rpx;height:38rpx}</style>
src/pages/bpm/process-instance/create/form.vue
@@ -586,7 +586,7 @@
  .footer{position:fixed;z-index:20;right:0;bottom:0;left:0;display:flex;gap:20rpx;padding:16rpx 30rpx calc(20rpx + env(safe-area-inset-bottom));background:#fff;border-top:1rpx solid #e9eef5;box-shadow:0 -6rpx 20rpx rgba(43,69,107,.06)}
  .btn{flex:1;font-size:29rpx;border-radius:14rpx}
  .btn.ghost{color:#3d5069;background:#fff;border:1rpx solid #dbe4ef}
  .btn.primary{color:#fff;background:#1769d8}
  .btn.primary{color:#fff;background:var(--color-primary, #1769d8)}
  .state{flex:1;padding:60rpx 20rpx;color:#8795a8;font-size:25rpx;text-align:center}
  .state.error{color:#c65050}
</style>
src/pages/bpm/process-instance/create/index.vue
@@ -143,10 +143,10 @@
  .page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}
  .search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 12rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}
  .search input{flex:1;font-size:27rpx}
  .search text{color:#1769d8;font-size:24rpx}
  .search text{color:var(--color-primary, #1769d8);font-size:24rpx}
  .tabs{flex:none;margin-bottom:14rpx;white-space:nowrap}
  .tab{display:inline-block;padding:10rpx 24rpx;margin-right:14rpx;color:#3d5069;font-size:25rpx;background:#fff;border:1rpx solid #dbe4ef;border-radius:999rpx}
  .tab.active{color:#fff;background:#1769d8;border-color:#1769d8}
  .tab.active{color:#fff;background:var(--color-primary, #1769d8);border-color:var(--color-primary, #1769d8)}
  .content{height:0;flex:1;padding-bottom:40rpx;box-sizing:border-box}
  .group{padding:20rpx 22rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}
  .group-title{display:block;margin-bottom:14rpx;color:#20334c;font-size:27rpx;font-weight:600}
src/pages/bpm/process-instance/detail.vue
@@ -885,10 +885,10 @@
  .hero-main{display:flex;min-width:0;flex:1;flex-direction:column;gap:10rpx}
  .hero-name{color:#20334c;font-size:32rpx;font-weight:600}
  .hero-meta{color:#8795a8;font-size:23rpx}
  .hero-status{flex:none;padding:8rpx 18rpx;color:#1769d8;font-size:23rpx;background:#eef4fd;border:1rpx solid #cfe0f8;border-radius:999rpx}
  .hero-status{flex:none;padding:8rpx 18rpx;color:var(--color-primary, #1769d8);font-size:23rpx;background:#eef4fd;border:1rpx solid #cfe0f8;border-radius:999rpx}
  .tabs{display:flex;gap:14rpx;margin-bottom:16rpx}
  .tab{flex:1;padding:16rpx 0;color:#3d5069;font-size:26rpx;text-align:center;background:#fff;border-radius:14rpx}
  .tab.active{color:#fff;background:#1769d8}
  .tab.active{color:#fff;background:var(--color-primary, #1769d8)}
  .card{padding:24rpx 22rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}
  .card-title{display:block;margin-bottom:18rpx;color:#20334c;font-size:28rpx;font-weight:600}
  .empty-tip{display:block;padding:20rpx 0;color:#9aa8ba;font-size:24rpx}
@@ -911,8 +911,8 @@
  .record-status{flex:none;font-size:23rpx}
  .record-line{display:block;color:#66778c;font-size:23rpx;line-height:1.7}
  .footer{position:fixed;z-index:20;right:0;bottom:0;left:0;display:flex;flex-wrap:wrap;gap:14rpx;padding:18rpx 30rpx calc(20rpx + env(safe-area-inset-bottom));background:#fff;border-top:1rpx solid #e6ecf4;box-shadow:0 -6rpx 20rpx rgba(43,69,107,.06)}
  .op{flex:1;min-width:150rpx;padding:18rpx 0;color:#1769d8;font-size:26rpx;text-align:center;background:#eef4fd;border-radius:14rpx}
  .op.primary{color:#fff;background:#1769d8}
  .op{flex:1;min-width:150rpx;padding:18rpx 0;color:var(--color-primary, #1769d8);font-size:26rpx;text-align:center;background:#eef4fd;border-radius:14rpx}
  .op.primary{color:#fff;background:var(--color-primary, #1769d8)}
  .op.danger{color:#d9534f;background:#fdeeee}
  .mask{position:fixed;inset:0;z-index:100;display:flex;align-items:flex-end;background:rgba(20,32,48,.45)}
  .modal{width:100%;max-height:82vh;overflow-y:auto;padding:30rpx 30rpx 40rpx;background:#fff;border-radius:24rpx 24rpx 0 0;box-sizing:border-box}
@@ -926,15 +926,15 @@
  .modal-textarea{width:100%;min-height:170rpx;padding:20rpx 24rpx;font-size:27rpx;background:#f7f8fa;border-radius:12rpx;box-sizing:border-box}
  .sign-types{display:flex;gap:14rpx}
  .sign-type{flex:1;padding:16rpx 0;color:#3d5069;font-size:26rpx;text-align:center;background:#f7f8fa;border-radius:12rpx}
  .sign-type.active{color:#fff;background:#1769d8}
  .sign-type.active{color:#fff;background:var(--color-primary, #1769d8)}
  .attach-list{margin-bottom:12rpx}
  .attach-item{display:flex;align-items:center;justify-content:space-between;padding:12rpx 16rpx;margin-bottom:8rpx;background:#f7f8fa;border-radius:10rpx}
  .attach-name{color:#3d5069;font-size:25rpx}
  .attach-remove{color:#d9534f;font-size:24rpx}
  .attach-btn{font-size:26rpx;color:#1769d8;background:#eef4fd;border-radius:12rpx}
  .attach-btn{font-size:26rpx;color:var(--color-primary, #1769d8);background:#eef4fd;border-radius:12rpx}
  .modal-actions{display:flex;gap:20rpx;margin-top:30rpx}
  .modal-btn{flex:1;padding:22rpx 0;font-size:29rpx;text-align:center;border-radius:14rpx}
  .modal-btn.ghost{color:#3d5069;background:#f2f5f9}
  .modal-btn.primary{color:#fff;background:#1769d8}
  .modal-btn.primary{color:#fff;background:var(--color-primary, #1769d8)}
  .modal-btn.disabled{opacity:.6}
</style>
src/pages/bpm/process-instance/manager/index.vue
@@ -15,4 +15,4 @@
  onShow(()=>load(true)); onPullDownRefresh(async()=>{await load(true);uni.stopPullDownRefresh()}); onReachBottom(()=>{if(hasMore.value)load()});
</script>
<template><view class="page"><view class="search"><input v-model="keyword" placeholder="搜索流程名称" confirm-type="search" @confirm="load(true)"/><text @click="load(true)">搜索</text></view><view v-if="error" class="state error" @click="load(true)">{{ error }}</view><view v-for="row in list" :key="row.id" class="card"><view class="head"><view><text class="name">{{ row.name || '流程实例' }}</text><text>{{ row.processDefinition?.name || row.processDefinitionKey || '暂无流程定义' }}</text></view><text :class="['tag',statusClass(row)]">{{ statusText(row) }}</text></view><view class="summary">{{ summaryInline(row.summary) || '暂无摘要' }}</view><view class="grid"><text>发起人:{{ row.startUser?.nickname || '--' }}</text><text>分类:{{ row.categoryName || row.category || '--' }}</text><text>开始时间:{{ dateTimeText(row.startTime || row.createTime) }}</text><text>结束时间:{{ dateTimeText(row.endTime) }}</text></view><view class="actions"><button v-if="canDetail" @click="goDetail(row)">详情</button></view></view><view v-if="!list.length&&!loading" class="state">暂无流程实例</view><view v-else class="more">{{ hasMore ? (loading?'加载中...':'上拉加载更多') : '没有更多了' }}</view></view></template>
<style lang="scss" scoped>.page{min-height:100vh;padding:20rpx 30rpx 70rpx;box-sizing:border-box;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;padding:0 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.card{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view{min-width:0;display:flex;flex:1;flex-direction:column;gap:8rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:700;text-overflow:ellipsis;white-space:nowrap}.head text:last-child{color:#78879b;font-size:23rpx}.tag{flex:none;padding:6rpx 16rpx;font-size:22rpx;border-radius:999rpx}.tag-success,.tag-approved,.tag-finished{color:#0e9663;background:#e9fbf2;border:1rpx solid #b8eed4}.tag-draft,.tag-warning{color:#c78210;background:#fff8e8;border:1rpx solid #f2d396}.tag-danger,.tag-cancelled{color:#c65050;background:#fff0f0;border:1rpx solid #efb8b8}.tag-info,.tag-progress{color:#1769d8;background:#eef6ff;border:1rpx solid #cfe2ff}.summary{margin-top:14rpx;padding:14rpx 16rpx;color:#4e617b;font-size:24rpx;line-height:1.5;background:#f7faff;border-radius:12rpx}.grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;justify-content:flex-end;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions button::after{border:0}.state,.more{display:block;padding:45rpx 0;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c65050}</style>
<style lang="scss" scoped>.page{min-height:100vh;padding:20rpx 30rpx 70rpx;box-sizing:border-box;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;padding:0 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.card{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view{min-width:0;display:flex;flex:1;flex-direction:column;gap:8rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:700;text-overflow:ellipsis;white-space:nowrap}.head text:last-child{color:#78879b;font-size:23rpx}.tag{flex:none;padding:6rpx 16rpx;font-size:22rpx;border-radius:999rpx}.tag-success,.tag-approved,.tag-finished{color:#0e9663;background:#e9fbf2;border:1rpx solid #b8eed4}.tag-draft,.tag-warning{color:#c78210;background:#fff8e8;border:1rpx solid #f2d396}.tag-danger,.tag-cancelled{color:#c65050;background:#fff0f0;border:1rpx solid #efb8b8}.tag-info,.tag-progress{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #eef6ff);border:1rpx solid #cfe2ff}.summary{margin-top:14rpx;padding:14rpx 16rpx;color:#4e617b;font-size:24rpx;line-height:1.5;background:#f7faff;border-radius:12rpx}.grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;justify-content:flex-end;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions button::after{border:0}.state,.more{display:block;padding:45rpx 0;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c65050}</style>
src/pages/bpm/process-instance/my/index.vue
@@ -358,10 +358,10 @@
  .page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}
  .search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 12rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}
  .search input{flex:1;font-size:27rpx}
  .search text{color:#1769d8;font-size:24rpx}
  .search text{color:var(--color-primary, #1769d8);font-size:24rpx}
  .filters{display:flex;align-items:center;gap:12rpx;margin-bottom:16rpx;overflow:hidden}
  .filter{flex:none;max-width:210rpx;overflow:hidden;padding:10rpx 20rpx;color:#3d5069;font-size:24rpx;text-overflow:ellipsis;white-space:nowrap;background:#fff;border:1rpx solid #dbe4ef;border-radius:999rpx}
  .reset{flex:none;margin-left:auto;color:#1769d8;font-size:24rpx}
  .reset{flex:none;margin-left:auto;color:var(--color-primary, #1769d8);font-size:24rpx}
  .content{height:0;flex:1;padding-bottom:60rpx;box-sizing:border-box}
  .row{padding:24rpx 22rpx 18rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}
  .head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}
@@ -373,7 +373,7 @@
  .grid text{overflow:hidden;text-overflow:ellipsis}
  .grid .summary{white-space:normal;word-break:break-all}
  .actions{display:flex;justify-content:flex-end;gap:14rpx;padding-top:14rpx;border-top:1rpx solid #edf1f6}
  .action{padding:8rpx 22rpx;color:#1769d8;font-size:24rpx;background:#eef4fd;border-radius:999rpx}
  .action{padding:8rpx 22rpx;color:var(--color-primary, #1769d8);font-size:24rpx;background:#eef4fd;border-radius:999rpx}
  .action.danger{color:#d9534f;background:#fdeeee}
  .more{display:block;padding:16rpx 0 6rpx;color:#93a1b3;font-size:22rpx;text-align:center}
  .state{padding:60rpx 20rpx;color:#8795a8;font-size:25rpx;text-align:center}
src/pages/bpm/process-listener/form.vue
@@ -10,4 +10,4 @@
  async function save(){ if(saving.value||!canSave.value)return; if(!state.accessToken)return; if(!form.name){toast("请填写监听器名称");return;} saving.value=true; try{ if(id.value)await updateProcessListener(state.accessToken,form); else await createProcessListener(state.accessToken,form); uni.showToast({title:"已保存",icon:"success"}); setTimeout(()=>uni.navigateBack(),500);}catch(e){toast(e instanceof Error?e.message:"保存失败");}finally{saving.value=false}}
</script>
<template><view class="page"><view class="card"><view class="field"><text>监听器名称 <text class="required">*</text></text><input v-model="form.name" :disabled="!canSave" placeholder="请输入监听器名称"/></view><view class="field"><text>监听器类型</text><picker :disabled="!canSave" :range="['执行监听器','任务监听器']" :value="form.type===2?1:0" @change="form.type=Number($event.detail.value)===1?2:1"><view class="picker"><text>{{ form.type===2?'任务监听器':'执行监听器' }}</text><text>›</text></view></picker></view><view class="field"><text>事件</text><input v-model="form.event" :disabled="!canSave" placeholder="请输入事件"/></view><view class="field"><text>值类型</text><input :value="String(form.valueType||'')" :disabled="!canSave" type="number" @input="form.valueType=Number($event.detail.value||0)"/></view><view class="field"><text>状态</text><switch :checked="form.status!==1" :disabled="!canSave" @change="form.status=$event.detail.value?0:1"/></view><view class="field column"><text>监听值</text><textarea v-model="form.value" :disabled="!canSave" placeholder="请输入类名、表达式或脚本"/></view></view><button v-if="canSave" class="save" :loading="saving" @click="save">保存</button></view></template>
<style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;gap:20rpx;padding:0 24rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input{text-align:right}.picker{display:flex;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;color:#8092a7;font-size:36rpx}.required{color:#e23b3b}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:180rpx;box-sizing:border-box;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.save::after{border:0}</style>
<style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;gap:20rpx;padding:0 24rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input{text-align:right}.picker{display:flex;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;color:#8092a7;font-size:36rpx}.required{color:#e23b3b}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:180rpx;box-sizing:border-box;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.save::after{border:0}</style>
src/pages/bpm/process-listener/index.vue
@@ -13,4 +13,4 @@
  onShow(()=>load(true)); onPullDownRefresh(async()=>{await load(true);uni.stopPullDownRefresh()}); onReachBottom(()=>load());
</script>
<template><view class="page"><view class="search"><input v-model="keyword" placeholder="搜索监听器名称" confirm-type="search" @confirm="load(true)"/><text @click="load(true)">搜索</text></view><view v-if="error" class="state error" @click="load(true)">{{ error }}</view><view v-for="item in list" :key="item.id" class="card"><view class="head"><view><text class="name">{{ item.name }}</text><text>{{ typeText(item.type) }} Â· {{ fmt(item.event) }}</text></view><text :class="['tag',statusClass(item.status)]">{{ statusText(item.status) }}</text></view><view class="grid"><text>值类型:{{ fmt(item.valueType) }}</text><text>监听值:{{ fmt(item.value) }}</text><text>创建时间:{{ fmt(item.createTime) }}</text></view><view class="actions"><button @click="go(item.id,'detail')">详情</button><button v-if="canUpdate" @click="go(item.id)">编辑</button><button v-if="canDelete" class="danger" @click="remove(item.id)">删除</button></view></view><view v-if="!list.length&&!loading" class="state">暂无流程监听器</view><view v-else class="more">{{ hasMore ? (loading?'加载中...':'上拉加载更多') : '没有更多了' }}</view><button v-if="canCreate" class="fab" @click="go()"><view /></button></view></template>
<style lang="scss" scoped>.page{min-height:100vh;padding:20rpx 30rpx 150rpx;box-sizing:border-box;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;padding:0 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.card{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view{min-width:0;display:flex;flex:1;flex-direction:column;gap:8rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:700;text-overflow:ellipsis;white-space:nowrap}.head text:last-child{color:#78879b;font-size:23rpx}.tag{flex:none;padding:6rpx 16rpx;font-size:22rpx;border-radius:999rpx}.tag-on{color:#0e9663;background:#e9fbf2;border:1rpx solid #b8eed4}.tag-off{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.state,.more{display:block;padding:45rpx 0;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c65050}.fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}.fab view{position:relative;width:38rpx;height:38rpx}.fab view::before,.fab view::after{position:absolute;content:"";background:#fff;border-radius:3rpx}.fab view::before{top:17rpx;left:0;width:38rpx;height:4rpx}.fab view::after{top:0;left:17rpx;width:4rpx;height:38rpx}</style>
<style lang="scss" scoped>.page{min-height:100vh;padding: 20rpx 30rpx 132rpx;box-sizing:border-box;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;padding:0 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.card{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view{min-width:0;display:flex;flex:1;flex-direction:column;gap:8rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:700;text-overflow:ellipsis;white-space:nowrap}.head text:last-child{color:#78879b;font-size:23rpx}.tag{flex:none;padding:6rpx 16rpx;font-size:22rpx;border-radius:999rpx}.tag-on{color:#0e9663;background:#e9fbf2;border:1rpx solid #b8eed4}.tag-off{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.state,.more{display:block;padding:45rpx 0;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c65050}.fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}.fab view{position:relative;width:38rpx;height:38rpx}.fab view::before,.fab view::after{position:absolute;content:"";background:#fff;border-radius:3rpx}.fab view::before{top:17rpx;left:0;width:38rpx;height:4rpx}.fab view::after{top:0;left:17rpx;width:4rpx;height:38rpx}</style>
src/pages/bpm/task/copy/index.vue
@@ -117,7 +117,7 @@
  .page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}
  .search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}
  .search input{flex:1;font-size:27rpx}
  .search text{color:#1769d8;font-size:24rpx}
  .search text{color:var(--color-primary, #1769d8);font-size:24rpx}
  .content{height:0;flex:1;padding-bottom:60rpx;box-sizing:border-box}
  .row{padding:24rpx 22rpx 18rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}
  .head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}
@@ -128,7 +128,7 @@
  .grid text{overflow:hidden;text-overflow:ellipsis}
  .grid .summary{white-space:normal;word-break:break-all}
  .actions{display:flex;justify-content:flex-end;padding-top:14rpx;border-top:1rpx solid #edf1f6}
  .action{padding:8rpx 26rpx;color:#1769d8;font-size:24rpx;background:#eef4fd;border-radius:999rpx}
  .action{padding:8rpx 26rpx;color:var(--color-primary, #1769d8);font-size:24rpx;background:#eef4fd;border-radius:999rpx}
  .more{display:block;padding:16rpx 0 6rpx;color:#93a1b3;font-size:22rpx;text-align:center}
  .state{padding:60rpx 20rpx;color:#8795a8;font-size:25rpx;text-align:center}
  .state.error{color:#c65050}
src/pages/bpm/task/done/index.vue
@@ -309,10 +309,10 @@
  .page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}
  .search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 12rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}
  .search input{flex:1;font-size:27rpx}
  .search text{color:#1769d8;font-size:24rpx}
  .search text{color:var(--color-primary, #1769d8);font-size:24rpx}
  .filters{display:flex;align-items:center;gap:12rpx;margin-bottom:16rpx;overflow:hidden}
  .filter{flex:none;max-width:210rpx;overflow:hidden;padding:10rpx 20rpx;color:#3d5069;font-size:24rpx;text-overflow:ellipsis;white-space:nowrap;background:#fff;border:1rpx solid #dbe4ef;border-radius:999rpx}
  .reset{flex:none;margin-left:auto;color:#1769d8;font-size:24rpx}
  .reset{flex:none;margin-left:auto;color:var(--color-primary, #1769d8);font-size:24rpx}
  .content{height:0;flex:1;padding-bottom:60rpx;box-sizing:border-box}
  .row{padding:24rpx 22rpx 18rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}
  .head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}
@@ -324,7 +324,7 @@
  .grid text{overflow:hidden;text-overflow:ellipsis}
  .grid .summary{white-space:normal;word-break:break-all}
  .actions{display:flex;justify-content:flex-end;gap:14rpx;padding-top:14rpx;border-top:1rpx solid #edf1f6}
  .action{padding:8rpx 22rpx;color:#1769d8;font-size:24rpx;background:#eef4fd;border-radius:999rpx}
  .action{padding:8rpx 22rpx;color:var(--color-primary, #1769d8);font-size:24rpx;background:#eef4fd;border-radius:999rpx}
  .action.danger{color:#d9534f;background:#fdeeee}
  .more{display:block;padding:16rpx 0 6rpx;color:#93a1b3;font-size:22rpx;text-align:center}
  .state{padding:60rpx 20rpx;color:#8795a8;font-size:25rpx;text-align:center}
src/pages/bpm/task/manager/index.vue
@@ -2,4 +2,4 @@
import { computed,ref } from "vue";import { onPullDownRefresh,onReachBottom,onShow } from "@dcloudio/uni-app";import { getTaskManagerPage,type BpmTask } from "../../../../api/bpm";import { getSimpleDictDataList,type DictData } from "../../../../api/crm";import { useAuth } from "../../../../stores/auth";import { DICT,dateTimeText,dictLabel,durationText,taskStatusText } from "../../shared";import { statusToneClass } from "../../../../utils/status";
const {hasPermission,state}=useAuth(),keyword=ref(""),rows=ref<BpmTask[]>([]),dicts=ref<DictData[]>([]),pageNo=ref(1),total=ref(0),loading=ref(false),error=ref("");const canQuery=computed(()=>hasPermission("bpm:task:query")),hasMore=computed(()=>rows.value.length<total.value);function statusText(v?:number){return dictLabel(dicts.value,DICT.BPM_TASK_STATUS,v,taskStatusText(v))}async function load(reset=false){if(!state.accessToken||loading.value||!canQuery.value)return;if(reset){pageNo.value=1;rows.value=[]}loading.value=true;error.value="";try{if(!dicts.value.length)dicts.value=await getSimpleDictDataList(state.accessToken);const d=await getTaskManagerPage(state.accessToken,{pageNo:pageNo.value,pageSize:15,name:keyword.value.trim()||undefined});total.value=d.total||0;rows.value=reset?(d.list||[]):rows.value.concat(d.list||[]);pageNo.value+=1}catch(e){error.value=e instanceof Error?e.message:"流程任务加载失败"}finally{loading.value=false}}function history(row:BpmTask){const id=row.processInstance?.id||row.processInstanceId;if(id)uni.navigateTo({url:`/pages/bpm/process-instance/detail?id=${encodeURIComponent(id)}`})}onShow(()=>load(true));onPullDownRefresh(async()=>{await load(true);uni.stopPullDownRefresh()});onReachBottom(()=>hasMore.value&&load());
</script>
<template><view class="page"><view class="search"><input v-model="keyword" placeholder="搜索任务名称" confirm-type="search" @confirm="load(true)"/><text @click="load(true)">搜索</text></view><view v-if="!canQuery" class="state">暂无流程任务查看权限</view><view v-if="error" class="state error" @click="load(true)">{{error}}</view><view v-for="row in rows" :key="row.id" class="card"><view class="head"><view><text class="name">{{row.processInstance?.name||'流程任务'}}</text><text>{{row.name||'暂无当前任务'}}</text></view><text :class="['tag',statusToneClass(row.status,statusText(row.status))]">{{statusText(row.status)}}</text></view><view class="grid two"><text>发起人:{{row.processInstance?.startUser?.nickname||'--'}}</text><text>审批人:{{row.assigneeUser?.nickname||'--'}}</text><text>开始:{{dateTimeText(row.createTime||row.startTime)}}</text><text>结束:{{dateTimeText(row.endTime)}}</text><text>耗时:{{durationText(row.durationInMillis)}}</text><text>审批建议:{{row.reason||'--'}}</text><text>流程编号:{{row.processInstanceId||'--'}}</text><text>任务编号:{{row.id||'--'}}</text></view><view class="actions"><button @click="history(row)">历史</button></view></view><view v-if="canQuery&&!rows.length&&!loading" class="state">暂无流程任务</view><view v-else-if="rows.length" class="more">{{hasMore?(loading?'加载中...':'上拉加载更多'):'没有更多了'}}</view></view></template><style lang="scss" scoped>@import "../../../ai/list.scss";.tag-success,.tag-approved,.tag-finished{color:#0e9663;background:#e9fbf2}.tag-danger,.tag-cancelled{color:#c65050;background:#fff0f0}.tag-info,.tag-progress{color:#1769d8;background:#eef6ff}.tag-warning,.tag-draft{color:#c78210;background:#fff8e8}</style>
<template><view class="page"><view class="search"><input v-model="keyword" placeholder="搜索任务名称" confirm-type="search" @confirm="load(true)"/><text @click="load(true)">搜索</text></view><view v-if="!canQuery" class="state">暂无流程任务查看权限</view><view v-if="error" class="state error" @click="load(true)">{{error}}</view><view v-for="row in rows" :key="row.id" class="card"><view class="head"><view><text class="name">{{row.processInstance?.name||'流程任务'}}</text><text>{{row.name||'暂无当前任务'}}</text></view><text :class="['tag',statusToneClass(row.status,statusText(row.status))]">{{statusText(row.status)}}</text></view><view class="grid two"><text>发起人:{{row.processInstance?.startUser?.nickname||'--'}}</text><text>审批人:{{row.assigneeUser?.nickname||'--'}}</text><text>开始:{{dateTimeText(row.createTime||row.startTime)}}</text><text>结束:{{dateTimeText(row.endTime)}}</text><text>耗时:{{durationText(row.durationInMillis)}}</text><text>审批建议:{{row.reason||'--'}}</text><text>流程编号:{{row.processInstanceId||'--'}}</text><text>任务编号:{{row.id||'--'}}</text></view><view class="actions"><button @click="history(row)">历史</button></view></view><view v-if="canQuery&&!rows.length&&!loading" class="state">暂无流程任务</view><view v-else-if="rows.length" class="more">{{hasMore?(loading?'加载中...':'上拉加载更多'):'没有更多了'}}</view></view></template><style lang="scss" scoped>@import "../../../ai/list.scss";.tag-success,.tag-approved,.tag-finished{color:#0e9663;background:#e9fbf2}.tag-danger,.tag-cancelled{color:#c65050;background:#fff0f0}.tag-info,.tag-progress{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #eef6ff)}.tag-warning,.tag-draft{color:#c78210;background:#fff8e8}</style>
src/pages/bpm/task/todo/index.vue
@@ -252,22 +252,22 @@
  .page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}
  .search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 12rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}
  .search input{flex:1;font-size:27rpx}
  .search text{color:#1769d8;font-size:24rpx}
  .search text{color:var(--color-primary, #1769d8);font-size:24rpx}
  .filters{display:flex;align-items:center;gap:12rpx;margin-bottom:16rpx;overflow:hidden}
  .filter{flex:none;max-width:210rpx;overflow:hidden;padding:10rpx 20rpx;color:#3d5069;font-size:24rpx;text-overflow:ellipsis;white-space:nowrap;background:#fff;border:1rpx solid #dbe4ef;border-radius:999rpx}
  .reset{flex:none;margin-left:auto;color:#1769d8;font-size:24rpx}
  .reset{flex:none;margin-left:auto;color:var(--color-primary, #1769d8);font-size:24rpx}
  .content{height:0;flex:1;padding-bottom:60rpx;box-sizing:border-box}
  .row{padding:24rpx 22rpx 18rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}
  .head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}
  .head-main{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}
  .head-main .code{color:#78879b;font-size:23rpx}
  .name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}
  .status{flex:none;max-width:200rpx;overflow:hidden;padding:8rpx 16rpx;color:#1769d8;font-size:22rpx;text-overflow:ellipsis;white-space:nowrap;background:#eef4fd;border:1rpx solid #cfe0f8;border-radius:999rpx}
  .status{flex:none;max-width:200rpx;overflow:hidden;padding:8rpx 16rpx;color:var(--color-primary, #1769d8);font-size:22rpx;text-overflow:ellipsis;white-space:nowrap;background:#eef4fd;border:1rpx solid #cfe0f8;border-radius:999rpx}
  .grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6}
  .grid text{overflow:hidden;text-overflow:ellipsis}
  .grid .summary{white-space:normal;word-break:break-all}
  .actions{display:flex;justify-content:flex-end;padding-top:14rpx;border-top:1rpx solid #edf1f6}
  .action{padding:8rpx 26rpx;color:#fff;font-size:24rpx;background:#1769d8;border-radius:999rpx}
  .action{padding:8rpx 26rpx;color:#fff;font-size:24rpx;background:var(--color-primary, #1769d8);border-radius:999rpx}
  .more{display:block;padding:16rpx 0 6rpx;color:#93a1b3;font-size:22rpx;text-align:center}
  .state{padding:60rpx 20rpx;color:#8795a8;font-size:25rpx;text-align:center}
  .state.error{color:#c65050}
src/pages/crm/backlog/index.vue
@@ -342,5 +342,5 @@
</template>
<style lang="scss" scoped>
  .page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.menu-tabs{width:calc(100% + 60rpx);height:108rpx;margin:0 -30rpx;white-space:nowrap;background:#fff}.menu-wrap{display:flex;width:max-content;gap:14rpx;padding:22rpx 30rpx 14rpx;white-space:nowrap}.menu{position:relative;display:flex;flex:0 0 auto;align-items:center;justify-content:center;height:64rpx;padding:0 24rpx;color:#52647a;font-size:24rpx;background:#f3f6fb;border:1rpx solid #e6edf6;border-radius:12rpx;white-space:nowrap}.menu text:first-child{display:block;white-space:nowrap}.menu.active{color:#fff;font-weight:600;background:#1769d8;border-color:#1769d8}.menu .badge{position:absolute!important;top:-12rpx;right:-10rpx;display:block!important;width:auto!important;min-width:28rpx!important;height:28rpx!important;min-height:28rpx!important;padding:0 8rpx!important;color:#fff!important;font-size:18rpx!important;line-height:28rpx!important;text-align:center;background:#ef5b5b!important;border:3rpx solid #fff!important;border-radius:18rpx!important;white-space:nowrap}.filter-tabs{height:76rpx;padding-top:14rpx;box-sizing:border-box;white-space:nowrap}.filter-tabs text{display:inline-block;min-width:92rpx;margin-right:14rpx;padding:12rpx 20rpx;color:#718198;font-size:23rpx;text-align:center;background:#fff;border-radius:10rpx;white-space:nowrap}.filter-tabs .active{color:#1769d8;font-weight:600;background:#e7f0ff}.content{height:0;flex:1;padding-bottom:40rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head,.actions{display:flex;align-items:center;justify-content:space-between;gap:16rpx}.head>view{display:flex;flex:1;min-width:0;flex-direction:column;gap:8rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.sub{color:#8795a8;font-size:22rpx}.amount{flex:none;max-width:230rpx;overflow:hidden;color:#df5d36;font-size:28rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.grid{display:grid;grid-template-columns:1fr;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{flex-wrap:wrap;justify-content:flex-end;padding-top:16rpx}.actions button{min-height:48rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:46rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:10rpx;white-space:nowrap}.actions button::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}
  .page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.menu-tabs{width:calc(100% + 60rpx);height:108rpx;margin:0 -30rpx;white-space:nowrap;background:#fff}.menu-wrap{display:flex;width:max-content;gap:14rpx;padding:22rpx 30rpx 14rpx;white-space:nowrap}.menu{position:relative;display:flex;flex:0 0 auto;align-items:center;justify-content:center;height:64rpx;padding:0 24rpx;color:#52647a;font-size:24rpx;background:#f3f6fb;border:1rpx solid #e6edf6;border-radius:12rpx;white-space:nowrap}.menu text:first-child{display:block;white-space:nowrap}.menu.active{color:#fff;font-weight:600;background:var(--color-primary, #1769d8);border-color:var(--color-primary, #1769d8)}.menu .badge{position:absolute!important;top:-12rpx;right:-10rpx;display:block!important;width:auto!important;min-width:28rpx!important;height:28rpx!important;min-height:28rpx!important;padding:0 8rpx!important;color:#fff!important;font-size:18rpx!important;line-height:28rpx!important;text-align:center;background:#ef5b5b!important;border:3rpx solid #fff!important;border-radius:18rpx!important;white-space:nowrap}.filter-tabs{height:76rpx;padding-top:14rpx;box-sizing:border-box;white-space:nowrap}.filter-tabs text{display:inline-block;min-width:92rpx;margin-right:14rpx;padding:12rpx 20rpx;color:#718198;font-size:23rpx;text-align:center;background:#fff;border-radius:10rpx;white-space:nowrap}.filter-tabs .active{color:var(--color-primary, #1769d8);font-weight:600;background:#e7f0ff}.content{height:0;flex:1;padding-bottom:40rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head,.actions{display:flex;align-items:center;justify-content:space-between;gap:16rpx}.head>view{display:flex;flex:1;min-width:0;flex-direction:column;gap:8rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.sub{color:#8795a8;font-size:22rpx}.amount{flex:none;max-width:230rpx;overflow:hidden;color:#df5d36;font-size:28rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.grid{display:grid;grid-template-columns:1fr;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{flex-wrap:wrap;justify-content:flex-end;padding-top:16rpx}.actions button{min-height:48rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:46rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:10rpx;white-space:nowrap}.actions button::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}
</style>
src/pages/crm/business/detail.vue
@@ -596,16 +596,16 @@
  }
  .tag {
    padding: 5rpx 12rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 22rpx;
    background: #edf5ff;
    background: var(--color-primary-soft, #edf5ff);
    border-radius: 7rpx;
  }
  .small-tag {
    padding: 4rpx 10rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 21rpx;
    background: #edf5ff;
    background: var(--color-primary-soft, #edf5ff);
    border-radius: 7rpx;
  }
  .toolbar {
@@ -619,11 +619,11 @@
  .outline {
    margin: 0;
    padding: 0 22rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 24rpx;
    line-height: 58rpx;
    background: #f5f8ff;
    border: 1rpx solid #8ab3ee;
    background: var(--color-primary-soft, #f5f8ff);
    border: 1rpx solid var(--color-primary-border, #8ab3ee);
    border-radius: 10rpx;
  }
  .toolbar button::after,
@@ -634,8 +634,8 @@
  }
  .primary {
    color: #fff !important;
    background: #1769d8 !important;
    border-color: #1769d8 !important;
    background: var(--color-primary, #1769d8) !important;
    border-color: var(--color-primary, #1769d8) !important;
  }
  .tabs {
    flex: none;
@@ -649,9 +649,9 @@
    font-size: 26rpx;
  }
  .tabs .active {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-weight: 600;
    border-bottom: 4rpx solid #1769d8;
    border-bottom: 4rpx solid var(--color-primary, #1769d8);
  }
  .content {
    height: 0;
@@ -739,7 +739,7 @@
    font-size: 26rpx;
  }
  .upload-head text:last-child {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
  }
  .image-list {
    display: flex;
@@ -828,9 +828,9 @@
  .contact-card__tag {
    flex: none;
    padding: 4rpx 10rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 21rpx;
    background: #edf5ff;
    background: var(--color-primary-soft, #edf5ff);
    border-radius: 7rpx;
  }
  .contact-card__role,
@@ -877,7 +877,7 @@
    width: auto;
    padding: 0;
    margin: 0;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 23rpx;
    line-height: 1;
    background: transparent;
@@ -915,9 +915,9 @@
  }
  .member-name text:last-child {
    padding: 3rpx 10rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 21rpx;
    background: #edf5ff;
    background: var(--color-primary-soft, #edf5ff);
    border-radius: 7rpx;
  }
  .member-actions {
src/pages/crm/business/form.vue
@@ -298,7 +298,7 @@
  }
  .section {
    padding: 22rpx 24rpx 12rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 25rpx;
    font-weight: 600;
    background: #f8fbff;
@@ -345,7 +345,7 @@
    background: #fff;
  }
  .summary text:last-child {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-weight: 600;
  }
  .product {
@@ -372,16 +372,16 @@
  }
  .product-total {
    padding: 18rpx 16rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 25rpx;
    text-align: right;
  }
  .add {
    margin: 0 24rpx 20rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 26rpx;
    background: #f5f8ff;
    border: 1rpx solid #8ab3ee;
    background: var(--color-primary-soft, #f5f8ff);
    border: 1rpx solid var(--color-primary-border, #8ab3ee);
    border-radius: 10rpx;
  }
  .add::after,
@@ -404,7 +404,7 @@
  .save {
    margin-top: 32rpx;
    color: #fff;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 12rpx;
    font-size: 30rpx;
  }
src/pages/crm/business/index.vue
@@ -181,9 +181,9 @@
    font-size: 27rpx;
  }
  .scene-tabs .active {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-weight: 600;
    border-bottom: 4rpx solid #1769d8;
    border-bottom: 4rpx solid var(--color-primary, #1769d8);
  }
  .search {
    display: flex;
@@ -201,7 +201,7 @@
  }
  .search text {
    font-size: 24rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
  }
  .content-scroll {
    height: 0;
@@ -237,9 +237,9 @@
  .tag {
    flex: none;
    padding: 4rpx 10rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 21rpx;
    background: #edf5ff;
    background: var(--color-primary-soft, #edf5ff);
    border-radius: 7rpx;
  }
  .meta-grid {
@@ -270,11 +270,11 @@
    min-height: 48rpx;
    padding: 0 16rpx;
    margin: 0;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 22rpx;
    line-height: 46rpx;
    background: #f5f8ff;
    border: 1rpx solid #8ab3ee;
    background: var(--color-primary-soft, #f5f8ff);
    border: 1rpx solid var(--color-primary-border, #8ab3ee);
    border-radius: 10rpx;
  }
  .actions button::after,
@@ -301,7 +301,7 @@
    width: 220rpx;
    margin: 20rpx auto;
    color: #fff;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 12rpx;
  }
  .create-fab {
@@ -316,7 +316,7 @@
    color: #fff;
    font-size: 58rpx;
    line-height: 120rpx;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 50%;
    box-shadow: 0 12rpx 24rpx rgba(23, 105, 216, 0.3);
  }
src/pages/crm/business/status-config.vue
@@ -97,5 +97,5 @@
</template>
<style lang="scss" scoped>
  .page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;padding:0 20rpx;margin:24rpx 0 16rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.card,.row{margin-bottom:18rpx;overflow:hidden;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.05)}.section{padding:22rpx 24rpx 12rpx;color:#1769d8;font-size:25rpx;font-weight:600;background:#f8fbff}.field{display:flex;align-items:center;min-height:92rpx;gap:20rpx;padding:0 24rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:180rpx;flex:none;color:#33455d;font-size:26rpx}.field input{flex:1;min-width:0;text-align:right;font-size:26rpx}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text{width:auto!important}.checks{display:flex;flex-wrap:wrap;gap:12rpx}.checks text{padding:10rpx 16rpx;color:#66778c;font-size:23rpx;background:#f1f4f8;border-radius:10rpx}.checks .picked{color:#1769d8;background:#eaf3ff}.help{color:#98a5b4!important;font-size:22rpx!important}.stage{border-top:1rpx solid #edf1f6}.form-actions,.actions,.head{display:flex;align-items:center;justify-content:flex-end;gap:16rpx}.form-actions{padding:20rpx 24rpx}button{margin:0;font-size:24rpx;border-radius:10rpx}button::after,.fab::after{border:0}.primary,.fab{color:#fff;background:#1769d8}.head{justify-content:space-between;padding:24rpx 22rpx 12rpx}.head text:first-child{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.head text:last-child{flex:none;color:#718198;font-size:22rpx}.grid{display:grid;grid-template-columns:1fr;gap:10rpx;padding:12rpx 22rpx 18rpx;color:#66778c;font-size:23rpx}.actions{padding:0 22rpx 18rpx}.actions button{color:#1769d8;background:#f5f8ff;border:1rpx solid #8ab3ee}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));width:132rpx;height:132rpx;padding:0;font-size:58rpx;line-height:120rpx;border-radius:50%}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}
  .page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;padding:0 20rpx;margin:24rpx 0 16rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:0;flex:1;padding-bottom: 132rpx;box-sizing:border-box}.card,.row{margin-bottom:18rpx;overflow:hidden;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.05)}.section{padding:22rpx 24rpx 12rpx;color:var(--color-primary, #1769d8);font-size:25rpx;font-weight:600;background:#f8fbff}.field{display:flex;align-items:center;min-height:92rpx;gap:20rpx;padding:0 24rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:180rpx;flex:none;color:#33455d;font-size:26rpx}.field input{flex:1;min-width:0;text-align:right;font-size:26rpx}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text{width:auto!important}.checks{display:flex;flex-wrap:wrap;gap:12rpx}.checks text{padding:10rpx 16rpx;color:#66778c;font-size:23rpx;background:#f1f4f8;border-radius:10rpx}.checks .picked{color:var(--color-primary, #1769d8);background:#eaf3ff}.help{color:#98a5b4!important;font-size:22rpx!important}.stage{border-top:1rpx solid #edf1f6}.form-actions,.actions,.head{display:flex;align-items:center;justify-content:flex-end;gap:16rpx}.form-actions{padding:20rpx 24rpx}button{margin:0;font-size:24rpx;border-radius:10rpx}button::after,.fab::after{border:0}.primary,.fab{color:#fff;background:var(--color-primary, #1769d8)}.head{justify-content:space-between;padding:24rpx 22rpx 12rpx}.head text:first-child{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.head text:last-child{flex:none;color:#718198;font-size:22rpx}.grid{display:grid;grid-template-columns:1fr;gap:10rpx;padding:12rpx 22rpx 18rpx;color:#66778c;font-size:23rpx}.actions{padding:0 22rpx 18rpx}.actions button{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee)}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));width:132rpx;height:132rpx;padding:0;font-size:58rpx;line-height:120rpx;border-radius:50%}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}
</style>
src/pages/crm/clue/detail.vue
@@ -506,11 +506,11 @@
  .outline {
    margin: 0;
    padding: 0 22rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 24rpx;
    line-height: 58rpx;
    background: #f5f8ff;
    border: 1rpx solid #8ab3ee;
    background: var(--color-primary-soft, #f5f8ff);
    border: 1rpx solid var(--color-primary-border, #8ab3ee);
    border-radius: 10rpx;
  }
  .toolbar button::after,
@@ -522,8 +522,8 @@
  .toolbar .primary,
  .primary {
    color: #fff;
    background: #1769d8;
    border-color: #1769d8;
    background: var(--color-primary, #1769d8);
    border-color: var(--color-primary, #1769d8);
  }
  .tabs {
    flex: none;
@@ -537,9 +537,9 @@
    font-size: 26rpx;
  }
  .tabs .active {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-weight: 600;
    border-bottom: 4rpx solid #1769d8;
    border-bottom: 4rpx solid var(--color-primary, #1769d8);
  }
  .content {
    height: 0;
@@ -647,7 +647,7 @@
    width: auto;
    padding: 0;
    margin: 0;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 23rpx;
    line-height: 1;
    background: transparent;
@@ -684,9 +684,9 @@
  }
  .member-name text:last-child {
    padding: 3rpx 10rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 21rpx;
    background: #edf5ff;
    background: var(--color-primary-soft, #edf5ff);
    border-radius: 7rpx;
  }
  .member-actions {
@@ -713,7 +713,7 @@
    font-size: 26rpx;
  }
  .upload-head text:last-child {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
  }
  .image-list {
    display: flex;
src/pages/crm/clue/form.vue
@@ -204,7 +204,7 @@
  }
  .section {
    padding: 22rpx 24rpx 12rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 25rpx;
    font-weight: 600;
    background: #f8fbff;
@@ -258,7 +258,7 @@
  .save {
    margin-top: 32rpx;
    color: #fff;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 12rpx;
    font-size: 30rpx;
  }
src/pages/crm/clue/index.vue
@@ -209,9 +209,9 @@
    font-size: 27rpx;
  }
  .scene-tabs .active {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-weight: 600;
    border-bottom: 4rpx solid #1769d8;
    border-bottom: 4rpx solid var(--color-primary, #1769d8);
  }
  .search,
  .status-picker {
@@ -232,7 +232,7 @@
  }
  .search text {
    font-size: 24rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
  }
  .status-picker {
    height: 64rpx;
@@ -317,11 +317,11 @@
    min-height: 48rpx;
    padding: 0 16rpx;
    margin: 0;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 22rpx;
    line-height: 46rpx;
    background: #f5f8ff;
    border: 1rpx solid #8ab3ee;
    background: var(--color-primary-soft, #f5f8ff);
    border: 1rpx solid var(--color-primary-border, #8ab3ee);
    border-radius: 10rpx;
  }
  .actions button::after,
@@ -348,7 +348,7 @@
    width: 220rpx;
    margin: 20rpx auto;
    color: #fff;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 12rpx;
  }
  .create-fab {
@@ -363,7 +363,7 @@
    color: #fff;
    font-size: 58rpx;
    line-height: 120rpx;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 50%;
    box-shadow: 0 12rpx 24rpx rgba(23, 105, 216, 0.3);
  }
src/pages/crm/contact/detail.vue
@@ -419,9 +419,9 @@
  .tag,
  .small-tag {
    padding: 4rpx 10rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 21rpx;
    background: #edf5ff;
    background: var(--color-primary-soft, #edf5ff);
    border-radius: 7rpx;
  }
  .toolbar {
@@ -435,10 +435,10 @@
  .outline,
  .primary {
    margin: 0;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 24rpx;
    background: #f5f8ff;
    border: 1rpx solid #8ab3ee;
    background: var(--color-primary-soft, #f5f8ff);
    border: 1rpx solid var(--color-primary-border, #8ab3ee);
    border-radius: 10rpx;
  }
  .toolbar button {
@@ -458,9 +458,9 @@
    font-size: 26rpx;
  }
  .tabs .active {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-weight: 600;
    border-bottom: 4rpx solid #1769d8;
    border-bottom: 4rpx solid var(--color-primary, #1769d8);
  }
  .content {
    height: 0;
@@ -497,7 +497,7 @@
    word-break: break-all;
  }
  .link {
    color: #1769d8 !important;
    color: var(--color-primary, #1769d8) !important;
  }
  .remark {
    display: flex;
@@ -544,7 +544,7 @@
    width: 100%;
    margin-top: 24rpx;
    color: #fff;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border: 0;
  }
  .record > view,
@@ -581,7 +581,7 @@
  }
  .outline {
    min-height: 68rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    background: #fff;
  }
  .clickable {
@@ -592,7 +592,7 @@
    justify-content: space-between;
    align-items: center;
    margin-top: 10rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 23rpx;
  }
  .member-form radio-group,
src/pages/crm/contact/form.vue
@@ -152,7 +152,7 @@
  }
  .section {
    padding: 22rpx 24rpx 12rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 25rpx;
    font-weight: 600;
    background: #f8fbff;
@@ -205,7 +205,7 @@
  .save {
    margin-top: 32rpx;
    color: #fff;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 12rpx;
    font-size: 30rpx;
  }
src/pages/crm/contact/index.vue
@@ -186,9 +186,9 @@
    font-size: 27rpx;
  }
  .scene-tabs .active {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-weight: 600;
    border-bottom: 4rpx solid #1769d8;
    border-bottom: 4rpx solid var(--color-primary, #1769d8);
  }
  .search {
    display: flex;
@@ -205,7 +205,7 @@
    font-size: 27rpx;
  }
  .search text {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 24rpx;
  }
  .content-scroll {
@@ -242,9 +242,9 @@
  .tag {
    padding: 4rpx 10rpx;
    flex: none;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 21rpx;
    background: #edf5ff;
    background: var(--color-primary-soft, #edf5ff);
    border-radius: 7rpx;
  }
  .meta-grid {
@@ -275,11 +275,11 @@
    min-height: 48rpx;
    padding: 0 16rpx;
    margin: 0;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 22rpx;
    line-height: 46rpx;
    background: #f5f8ff;
    border: 1rpx solid #8ab3ee;
    background: var(--color-primary-soft, #f5f8ff);
    border: 1rpx solid var(--color-primary-border, #8ab3ee);
    border-radius: 10rpx;
  }
  .actions button::after,
@@ -307,7 +307,7 @@
    width: 220rpx;
    margin: 20rpx auto;
    color: #fff;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 12rpx;
  }
  .create-fab {
@@ -322,7 +322,7 @@
    color: #fff;
    font-size: 58rpx;
    line-height: 120rpx;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 50%;
    box-shadow: 0 12rpx 24rpx rgba(23, 105, 216, 0.3);
  }
src/pages/crm/contract/config.vue
@@ -47,5 +47,5 @@
</template>
<style lang="scss" scoped>
  .page{min-height:100vh;padding:24rpx 30rpx 90rpx;box-sizing:border-box;background:#f6f7f9}.card{overflow:hidden;background:#fff;border-radius:16rpx}.section{padding:22rpx 24rpx 12rpx;color:#1769d8;font-size:25rpx;font-weight:600;background:#f8fbff}.field{display:flex;align-items:center;min-height:96rpx;gap:18rpx;padding:0 24rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:220rpx;flex:none;color:#33455d;font-size:27rpx}.field input{flex:1;min-width:0;color:#1e3049;font-size:27rpx;text-align:right}radio-group{display:flex;flex:1;justify-content:flex-end;gap:24rpx;color:#1e3049;font-size:26rpx}.prefix,.unit{width:auto!important;color:#65758a!important;font-size:24rpx!important}.save{margin-top:32rpx;color:#fff;background:#1769d8;border-radius:12rpx;font-size:30rpx}.save::after{border:0}.state{padding:70rpx 30rpx;color:#8795a8;font-size:26rpx;text-align:center}
  .page{min-height:100vh;padding:24rpx 30rpx 90rpx;box-sizing:border-box;background:#f6f7f9}.card{overflow:hidden;background:#fff;border-radius:16rpx}.section{padding:22rpx 24rpx 12rpx;color:var(--color-primary, #1769d8);font-size:25rpx;font-weight:600;background:#f8fbff}.field{display:flex;align-items:center;min-height:96rpx;gap:18rpx;padding:0 24rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:220rpx;flex:none;color:#33455d;font-size:27rpx}.field input{flex:1;min-width:0;color:#1e3049;font-size:27rpx;text-align:right}radio-group{display:flex;flex:1;justify-content:flex-end;gap:24rpx;color:#1e3049;font-size:26rpx}.prefix,.unit{width:auto!important;color:#65758a!important;font-size:24rpx!important}.save{margin-top:32rpx;color:#fff;background:var(--color-primary, #1769d8);border-radius:12rpx;font-size:30rpx}.save::after{border:0}.state{padding:70rpx 30rpx;color:#8795a8;font-size:26rpx;text-align:center}
</style>
src/pages/crm/contract/detail.vue
@@ -686,9 +686,9 @@
  .tag,
  .small {
    padding: 5rpx 12rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 22rpx;
    background: #edf5ff;
    background: var(--color-primary-soft, #edf5ff);
    border-radius: 7rpx;
  }
  .toolbar {
@@ -703,11 +703,11 @@
    flex: none;
    padding: 0 18rpx;
    margin: 0;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 23rpx;
    line-height: 54rpx;
    background: #f5f8ff;
    border: 1rpx solid #8ab3ee;
    background: var(--color-primary-soft, #f5f8ff);
    border: 1rpx solid var(--color-primary-border, #8ab3ee);
    border-radius: 10rpx;
  }
  .toolbar button::after,
@@ -728,9 +728,9 @@
    font-size: 26rpx;
  }
  .tabs .active {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-weight: 600;
    border-bottom: 4rpx solid #1769d8;
    border-bottom: 4rpx solid var(--color-primary, #1769d8);
  }
  .content {
    height: 0;
@@ -832,7 +832,7 @@
  }
  .upload-head text:last-child,
  .file text:last-child {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
  }
  .images {
    display: flex;
@@ -873,7 +873,7 @@
  .primary {
    margin: 0;
    color: #fff;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 10rpx;
    font-size: 26rpx;
  }
@@ -886,7 +886,7 @@
    font-weight: 600;
  }
  .section-title text {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 24rpx;
    font-weight: 400;
  }
@@ -911,9 +911,9 @@
  }
  .member-name text:last-child {
    padding: 3rpx 10rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 21rpx;
    background: #edf5ff;
    background: var(--color-primary-soft, #edf5ff);
    border-radius: 7rpx;
  }
  .member-actions {
src/pages/crm/contract/form.vue
@@ -282,7 +282,7 @@
  }
  .section {
    padding: 22rpx 24rpx 12rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 25rpx;
    font-weight: 600;
    background: #f8fbff;
@@ -328,7 +328,7 @@
  }
  .summary text:last-child,
  .subtotal {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-weight: 600;
  }
  .product {
@@ -360,10 +360,10 @@
  }
  .add {
    margin: 0 24rpx 20rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 26rpx;
    background: #f5f8ff;
    border: 1rpx solid #8ab3ee;
    background: var(--color-primary-soft, #f5f8ff);
    border: 1rpx solid var(--color-primary-border, #8ab3ee);
    border-radius: 10rpx;
  }
  .add::after,
@@ -386,7 +386,7 @@
  .save {
    margin-top: 32rpx;
    color: #fff;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 12rpx;
    font-size: 30rpx;
  }
src/pages/crm/contract/index.vue
@@ -164,9 +164,9 @@
    font-size: 27rpx;
  }
  .scene-tabs .active {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-weight: 600;
    border-bottom: 4rpx solid #1769d8;
    border-bottom: 4rpx solid var(--color-primary, #1769d8);
  }
  .search {
    display: flex;
@@ -184,12 +184,12 @@
  }
  .search text {
    font-size: 24rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
  }
  .content {
    height: 0;
    flex: 1;
    padding-bottom: 150rpx;
    padding-bottom: 132rpx;
    box-sizing: border-box;
  }
  .row {
@@ -216,9 +216,9 @@
  }
  .tag {
    padding: 4rpx 10rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 21rpx;
    background: #edf5ff;
    background: var(--color-primary-soft, #edf5ff);
    border-radius: 7rpx;
  }
  .grid {
@@ -245,11 +245,11 @@
    min-height: 48rpx;
    padding: 0 16rpx;
    margin: 0;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 22rpx;
    line-height: 46rpx;
    background: #f5f8ff;
    border: 1rpx solid #8ab3ee;
    background: var(--color-primary-soft, #f5f8ff);
    border: 1rpx solid var(--color-primary-border, #8ab3ee);
    border-radius: 10rpx;
  }
  .actions button::after,
@@ -276,7 +276,7 @@
    width: 220rpx;
    margin: 20rpx auto;
    color: #fff;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 12rpx;
  }
  .fab {
@@ -291,7 +291,7 @@
    color: #fff;
    font-size: 58rpx;
    line-height: 120rpx;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 50%;
    box-shadow: 0 12rpx 24rpx rgba(23, 105, 216, 0.3);
  }
src/pages/crm/customer/detail.vue
@@ -832,9 +832,9 @@
  .tag,
  .small {
    padding: 5rpx 12rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 22rpx;
    background: #edf5ff;
    background: var(--color-primary-soft, #edf5ff);
    border-radius: 7rpx;
  }
  .tag.done {
@@ -853,11 +853,11 @@
    flex: none;
    padding: 0 18rpx;
    margin: 0;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 23rpx;
    line-height: 54rpx;
    background: #f5f8ff;
    border: 1rpx solid #8ab3ee;
    background: var(--color-primary-soft, #f5f8ff);
    border: 1rpx solid var(--color-primary-border, #8ab3ee);
    border-radius: 10rpx;
  }
  .toolbar button::after,
@@ -878,9 +878,9 @@
    font-size: 26rpx;
  }
  .tabs .active {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-weight: 600;
    border-bottom: 4rpx solid #1769d8;
    border-bottom: 4rpx solid var(--color-primary, #1769d8);
  }
  .content {
    height: 0;
@@ -960,9 +960,9 @@
  .contact-card__tag {
    flex: none;
    padding: 4rpx 10rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 21rpx;
    background: #edf5ff;
    background: var(--color-primary-soft, #edf5ff);
    border-radius: 7rpx;
  }
  .contact-card__role,
@@ -1045,7 +1045,7 @@
  }
  .upload-head text:last-child,
  .file text:last-child {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
  }
  .images {
    display: flex;
@@ -1086,7 +1086,7 @@
  .primary {
    margin: 0;
    color: #fff;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 10rpx;
    font-size: 26rpx;
  }
@@ -1099,7 +1099,7 @@
    font-weight: 600;
  }
  .section-title text {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 24rpx;
    font-weight: 400;
  }
@@ -1124,9 +1124,9 @@
  }
  .member-name text:last-child {
    padding: 3rpx 10rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 21rpx;
    background: #edf5ff;
    background: var(--color-primary-soft, #edf5ff);
    border-radius: 7rpx;
  }
  .member-actions {
@@ -1160,8 +1160,8 @@
    border-radius: 8rpx;
  }
  .checks .selected {
    color: #1769d8;
    background: #edf5ff;
    color: var(--color-primary, #1769d8);
    background: var(--color-primary-soft, #edf5ff);
  }
  .state {
    display: block;
@@ -1170,4 +1170,4 @@
    font-size: 26rpx;
    text-align: center;
  }
</style>
</style>
src/pages/crm/customer/form.vue
@@ -16,4 +16,4 @@
onLoad(async query => { id.value = query.id ? Number(query.id) : undefined; if (!state.accessToken) return; try { const [dictionaryData, userData, areaData] = await Promise.all([getSimpleDictDataList(state.accessToken), getCrmUserList(state.accessToken), getAreaTree(state.accessToken)]); dicts.value = dictionaryData; users.value = userData; areas.value = areaData; if (id.value) { const data = await getCustomer(state.accessToken, id.value); Object.assign(form, data, { contactNextTime: data.contactNextTime?.slice(0, 10) || '' }); } else if (state.user) { form.ownerUserId = state.user.id; form.ownerUserName = state.user.nickname; } } catch (error) { uni.showToast({ title: error instanceof Error ? error.message : '数据加载失败', icon: 'none' }); } });
</script>
<template><view class="page"><view class="form-card"><view class="section">基本信息</view><view class="field"><text>客户名称 <text class="required">*</text></text><input v-model="form.name" placeholder="请输入客户名称" /></view><view class="field"><text>客户来源 <text class="required">*</text></text><picker :range="sources" range-key="label" @change="form.source=Number(sources[$event.detail.value].value)"><view class="picker">{{dictLabel(sources,form.source)}}<text>›</text></view></picker></view><view class="field"><text>负责人 <text class="required">*</text></text><picker :disabled="Boolean(id)" :range="users" range-key="nickname" @change="form.ownerUserId=users[$event.detail.value].id;form.ownerUserName=userLabel(users[$event.detail.value])"><view class="picker">{{form.ownerUserName||userLabel(users.find(item=>item.id===form.ownerUserId))}}<text>›</text></view></picker></view><view class="section">联系方式</view><view v-for="field in [['手机','mobile','请输入手机号'],['电话','telephone','请输入电话'],['邮箱','email','请输入邮箱'],['微信','wechat','请输入微信'],['QQ','qq','请输入 QQ']]" :key="field[1]" class="field"><text>{{field[0]}}</text><input v-model="form[field[1] as keyof CrmCustomer]" :placeholder="field[2]" /></view><view class="section">客户信息</view><view class="field"><text>客户行业</text><picker :range="industries" range-key="label" @change="form.industryId=Number(industries[$event.detail.value].value)"><view class="picker">{{dictLabel(industries,form.industryId)}}<text>›</text></view></picker></view><view class="field"><text>客户级别</text><picker :range="levels" range-key="label" @change="form.level=Number(levels[$event.detail.value].value)"><view class="picker">{{dictLabel(levels,form.level)}}<text>›</text></view></picker></view><view class="field"><text>所在地区</text><picker :range="areaOptions" range-key="name" @change="form.areaId=areaOptions[$event.detail.value].id;form.areaName=areaOptions[$event.detail.value].name.replace(/ /g,'')"><view class="picker">{{form.areaName||'请选择地区'}}<text>›</text></view></picker></view><view class="field"><text>详细地址</text><input v-model="form.detailAddress" placeholder="请输入详细地址" /></view><view class="field"><text>下次联系</text><picker mode="date" :value="form.contactNextTime" @change="form.contactNextTime=$event.detail.value"><view class="picker">{{form.contactNextTime||'请选择日期'}}<text>›</text></view></picker></view><view class="field column"><text>备注</text><textarea v-model="form.remark" placeholder="请输入备注" ></textarea></view></view><button class="save" :loading="saving" :disabled="saving" @click="save">保存</button></view></template>
<style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.section{padding:22rpx 24rpx 12rpx;color:#1769d8;font-size:25rpx;font-weight:600;background:#f8fbff}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;border-bottom:1rpx solid #eef1f5;gap:20rpx}.field>text{width:180rpx;color:#33455d;font-size:27rpx}.required{color:#e34b4b}.field input,.field picker,.picker{flex:1;color:#1e3049;font-size:27rpx}.picker{display:flex;justify-content:space-between;color:#65758a}.picker text{margin-left:16rpx;color:#8092a7;font-size:36rpx}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text{width:auto}.column textarea{width:100%;height:130rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;background:#1769d8;border-radius:12rpx;font-size:30rpx}.save::after{border:0}</style>
<style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.section{padding:22rpx 24rpx 12rpx;color:var(--color-primary, #1769d8);font-size:25rpx;font-weight:600;background:#f8fbff}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;border-bottom:1rpx solid #eef1f5;gap:20rpx}.field>text{width:180rpx;color:#33455d;font-size:27rpx}.required{color:#e34b4b}.field input,.field picker,.picker{flex:1;color:#1e3049;font-size:27rpx}.picker{display:flex;justify-content:space-between;color:#65758a}.picker text{margin-left:16rpx;color:#8092a7;font-size:36rpx}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text{width:auto}.column textarea{width:100%;height:130rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;background:var(--color-primary, #1769d8);border-radius:12rpx;font-size:30rpx}.save::after{border:0}</style>
src/pages/crm/customer/index.vue
@@ -215,9 +215,9 @@
    font-size: 27rpx;
  }
  .scene-tabs .active {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-weight: 600;
    border-bottom: 4rpx solid #1769d8;
    border-bottom: 4rpx solid var(--color-primary, #1769d8);
  }
  .search {
    display: flex;
@@ -235,7 +235,7 @@
  }
  .search text {
    font-size: 24rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
  }
  .content-scroll {
    height: 0;
@@ -267,9 +267,9 @@
  }
  .tag {
    padding: 4rpx 10rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 21rpx;
    background: #edf5ff;
    background: var(--color-primary-soft, #edf5ff);
    border-radius: 7rpx;
  }
  .tag.done {
@@ -303,11 +303,11 @@
    min-height: 48rpx;
    padding: 0 16rpx;
    margin: 0;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 22rpx;
    line-height: 46rpx;
    background: #f5f8ff;
    border: 1rpx solid #8ab3ee;
    background: var(--color-primary-soft, #f5f8ff);
    border: 1rpx solid var(--color-primary-border, #8ab3ee);
    border-radius: 10rpx;
  }
  .actions button::after,
@@ -334,7 +334,7 @@
    width: 220rpx;
    margin: 20rpx auto;
    color: #fff;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 12rpx;
  }
  .create-fab {
@@ -349,7 +349,7 @@
    color: #fff;
    font-size: 58rpx;
    line-height: 120rpx;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 50%;
    box-shadow: 0 12rpx 24rpx rgba(23, 105, 216, 0.3);
  }
src/pages/crm/customer/limit-config.vue
@@ -94,5 +94,5 @@
</template>
<style lang="scss" scoped>
  .page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.tabs{display:flex;height:88rpx;align-items:flex-end;gap:22rpx}.tabs text{padding:0 6rpx 18rpx;color:#718198;font-size:27rpx}.tabs .active{color:#1769d8;font-weight:600;border-bottom:4rpx solid #1769d8}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.card,.row{margin-bottom:18rpx;overflow:hidden;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.05)}.section{padding:22rpx 24rpx 12rpx;color:#1769d8;font-size:25rpx;font-weight:600;background:#f8fbff}.field{display:flex;align-items:center;min-height:92rpx;gap:20rpx;padding:0 24rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:230rpx;flex:none;color:#33455d;font-size:26rpx}.field input{flex:1;min-width:0;text-align:right;font-size:26rpx}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text{width:auto!important}.checks{display:flex;flex-wrap:wrap;gap:12rpx}.checks text{padding:10rpx 16rpx;color:#66778c;font-size:23rpx;background:#f1f4f8;border-radius:10rpx}.checks .picked{color:#1769d8;background:#eaf3ff}radio-group{display:flex;flex:1;justify-content:flex-end;gap:24rpx;font-size:25rpx}.form-actions,.actions,.head{display:flex;align-items:center;justify-content:flex-end;gap:16rpx}.form-actions{padding:20rpx 24rpx}button{margin:0;font-size:24rpx;border-radius:10rpx}button::after,.fab::after{border:0}.primary,.fab{color:#fff;background:#1769d8}.head{justify-content:space-between;padding:24rpx 22rpx 12rpx}.head text:first-child{color:#20334c;font-size:30rpx;font-weight:600}.head text:last-child{color:#df5d36;font-size:30rpx;font-weight:600}.grid{display:grid;grid-template-columns:1fr;gap:10rpx;padding:12rpx 22rpx 18rpx;color:#66778c;font-size:23rpx}.actions{padding:0 22rpx 18rpx}.actions button{color:#1769d8;background:#f5f8ff;border:1rpx solid #8ab3ee}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));width:132rpx;height:132rpx;padding:0;font-size:58rpx;line-height:120rpx;border-radius:50%}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}
  .page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.tabs{display:flex;height:88rpx;align-items:flex-end;gap:22rpx}.tabs text{padding:0 6rpx 18rpx;color:#718198;font-size:27rpx}.tabs .active{color:var(--color-primary, #1769d8);font-weight:600;border-bottom:4rpx solid var(--color-primary, #1769d8)}.content{height:0;flex:1;padding-bottom: 132rpx;box-sizing:border-box}.card,.row{margin-bottom:18rpx;overflow:hidden;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.05)}.section{padding:22rpx 24rpx 12rpx;color:var(--color-primary, #1769d8);font-size:25rpx;font-weight:600;background:#f8fbff}.field{display:flex;align-items:center;min-height:92rpx;gap:20rpx;padding:0 24rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:230rpx;flex:none;color:#33455d;font-size:26rpx}.field input{flex:1;min-width:0;text-align:right;font-size:26rpx}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text{width:auto!important}.checks{display:flex;flex-wrap:wrap;gap:12rpx}.checks text{padding:10rpx 16rpx;color:#66778c;font-size:23rpx;background:#f1f4f8;border-radius:10rpx}.checks .picked{color:var(--color-primary, #1769d8);background:#eaf3ff}radio-group{display:flex;flex:1;justify-content:flex-end;gap:24rpx;font-size:25rpx}.form-actions,.actions,.head{display:flex;align-items:center;justify-content:flex-end;gap:16rpx}.form-actions{padding:20rpx 24rpx}button{margin:0;font-size:24rpx;border-radius:10rpx}button::after,.fab::after{border:0}.primary,.fab{color:#fff;background:var(--color-primary, #1769d8)}.head{justify-content:space-between;padding:24rpx 22rpx 12rpx}.head text:first-child{color:#20334c;font-size:30rpx;font-weight:600}.head text:last-child{color:#df5d36;font-size:30rpx;font-weight:600}.grid{display:grid;grid-template-columns:1fr;gap:10rpx;padding:12rpx 22rpx 18rpx;color:#66778c;font-size:23rpx}.actions{padding:0 22rpx 18rpx}.actions button{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee)}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));width:132rpx;height:132rpx;padding:0;font-size:58rpx;line-height:120rpx;border-radius:50%}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}
</style>
src/pages/crm/customer/pool-config.vue
@@ -62,5 +62,5 @@
</template>
<style lang="scss" scoped>
  .page{min-height:100vh;padding:24rpx 30rpx 90rpx;box-sizing:border-box;background:#f6f7f9}.card{overflow:hidden;background:#fff;border-radius:16rpx}.section{padding:22rpx 24rpx 12rpx;color:#1769d8;font-size:25rpx;font-weight:600;background:#f8fbff}.field{display:flex;align-items:center;min-height:96rpx;gap:18rpx;padding:0 24rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:220rpx;flex:none;color:#33455d;font-size:27rpx}.field input{flex:1;min-width:0;color:#1e3049;font-size:27rpx;text-align:right}radio-group{display:flex;flex:1;justify-content:flex-end;gap:24rpx;color:#1e3049;font-size:26rpx}.unit{width:auto!important;color:#65758a!important;font-size:24rpx!important}.save{margin-top:32rpx;color:#fff;background:#1769d8;border-radius:12rpx;font-size:30rpx}.save::after{border:0}.state{padding:70rpx 30rpx;color:#8795a8;font-size:26rpx;text-align:center}
  .page{min-height:100vh;padding:24rpx 30rpx 90rpx;box-sizing:border-box;background:#f6f7f9}.card{overflow:hidden;background:#fff;border-radius:16rpx}.section{padding:22rpx 24rpx 12rpx;color:var(--color-primary, #1769d8);font-size:25rpx;font-weight:600;background:#f8fbff}.field{display:flex;align-items:center;min-height:96rpx;gap:18rpx;padding:0 24rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:220rpx;flex:none;color:#33455d;font-size:27rpx}.field input{flex:1;min-width:0;color:#1e3049;font-size:27rpx;text-align:right}radio-group{display:flex;flex:1;justify-content:flex-end;gap:24rpx;color:#1e3049;font-size:26rpx}.unit{width:auto!important;color:#65758a!important;font-size:24rpx!important}.save{margin-top:32rpx;color:#fff;background:var(--color-primary, #1769d8);border-radius:12rpx;font-size:30rpx}.save::after{border:0}.state{padding:70rpx 30rpx;color:#8795a8;font-size:26rpx;text-align:center}
</style>
src/pages/crm/customer/pool.vue
@@ -202,7 +202,7 @@
  }
  .header > text {
    padding: 7rpx 13rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 21rpx;
    background: #e9f2ff;
    border-radius: 14rpx;
@@ -222,7 +222,7 @@
    font-size: 27rpx;
  }
  .search text {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 24rpx;
  }
  .contentScroll {
@@ -289,11 +289,11 @@
    min-height: 56rpx;
    padding: 0 20rpx;
    margin: 0;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 23rpx;
    line-height: 54rpx;
    background: #f5f8ff;
    border: 1rpx solid #8ab3ee;
    background: var(--color-primary-soft, #f5f8ff);
    border: 1rpx solid var(--color-primary-border, #8ab3ee);
    border-radius: 10rpx;
  }
  .actions button::after,
@@ -303,8 +303,8 @@
  .actions .primary,
  .dialogActions .confirm {
    color: #fff;
    background: #1769d8;
    border-color: #1769d8;
    background: var(--color-primary, #1769d8);
    border-color: var(--color-primary, #1769d8);
  }
  .more,
  .state {
@@ -322,7 +322,7 @@
    width: 220rpx;
    margin: 20rpx auto;
    color: #fff;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 12rpx;
  }
  .mask {
src/pages/crm/invoice/detail.vue
@@ -1,4 +1,4 @@
<script setup lang="ts">
import { computed, ref } from 'vue'; import { onLoad, onShow } from '@dcloudio/uni-app'; import { getInvoice, submitInvoice, type CrmInvoice } from '../../../api/crm'; import { useAuth } from '../../../stores/auth';
const {hasPermission,state}=useAuth();const id=ref(0),item=ref<CrmInvoice>(),loading=ref(false);const canUpdate=computed(()=>hasPermission('crm:invoice:update'));const money=(x?:number)=>x===undefined?'—':`Â¥${Number(x).toFixed(2)}`;const status=(x?:number)=>({0:'未提交',10:'审批中',20:'审批通过',30:'审批不通过',40:'已取消',50:'已作废'} as Record<number,string>)[x??0]||'未知状态';async function load(){if(!state.accessToken||!id.value)return;loading.value=true;try{item.value=await getInvoice(state.accessToken,id.value);}catch(error){uni.showToast({title:error instanceof Error?error.message:'详情加载失败',icon:'none'});}finally{loading.value=false;}}async function submit(){if(!state.accessToken)return;try{await submitInvoice(state.accessToken,id.value);uni.showToast({title:'已提交审核',icon:'success'});load();}catch(error){uni.showToast({title:error instanceof Error?error.message:'提交失败',icon:'none'});}}onLoad(q=>{id.value=Number(q.id);load();});onShow(load);
</script><template><view class="page"><view v-if="loading" class="state">加载中...</view><template v-else-if="item"><view class="summary"><view><text>{{item.no||'开票申请'}}</text><text>{{item.customerName||'—'}} Â· {{money(item.price)}}</text></view><text>{{status(item.auditStatus)}}</text></view><view class="toolbar"><button v-if="canUpdate" @click="uni.navigateTo({url:`/pages/crm/invoice/form?id=${id}`})">编辑</button><button v-if="canUpdate&&item.auditStatus===0" @click="submit">提交审核</button></view><view class="card"><view v-for="row in [['客户',item.customerName],['合同',item.contract?.no||item.contract?.name],['负责人',item.ownerUserName],['所属部门',item.ownerUserDeptName],['发票类型',item.invoiceType],['发票号码',item.invoiceNo],['发票抬头',item.invoiceTitle],['开票金额',money(item.price)],['开票日期',item.invoiceTime?.slice(0,10)],['剩余可回款金额',money(item.remainingInvoicePrice)],['创建人',item.creatorName],['创建时间',item.createTime?.replace('T',' ').slice(0,16)]]" :key="row[0]" class="row"><text>{{row[0]}}</text><text>{{row[1]??'—'}}</text></view><view class="remark"><text>备注</text><text>{{item.remark||'—'}}</text></view><view class="remark"><text>发票附件</text><text v-if="item.attachmentList?.length">{{item.attachmentList.map(x=>x.name||'附件').join('、')}}</text><text v-else>未上传</text></view></view></template><view v-else class="state">暂无开票申请数据</view></view></template><style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx;background:#f6f7f9}.summary{display:flex;align-items:center;justify-content:space-between;padding:26rpx;color:#fff;background:#1769d8;border-radius:16rpx}.summary text{display:block}.summary view text:first-child{font-size:32rpx;font-weight:600}.summary view text:last-child{margin-top:8rpx;font-size:24rpx;color:#dbeaff}.summary>text{padding:5rpx 10rpx;font-size:21rpx;background:rgba(255,255,255,.18);border-radius:8rpx}.toolbar{display:flex;justify-content:flex-end;gap:16rpx;padding:18rpx 0}.toolbar button{margin:0;color:#1769d8;font-size:24rpx;background:#f5f8ff;border:1rpx solid #8ab3ee}.toolbar button::after{border:0}.card{background:#fff;border-radius:16rpx}.row{display:flex;justify-content:space-between;gap:24rpx;min-height:88rpx;align-items:center;padding:0 24rpx;border-bottom:1rpx solid #eef1f5}.row text:first-child,.remark>text:first-child{color:#718198;font-size:26rpx}.row text:last-child{color:#263a54;font-size:26rpx;text-align:right}.remark{padding:20rpx 24rpx;border-bottom:1rpx solid #eef1f5}.remark text{display:block}.remark text:last-child{margin-top:12rpx;color:#263a54;font-size:26rpx;line-height:1.6}.state{padding:80rpx 20rpx;color:#8795a8;font-size:26rpx;text-align:center}</style>
</script><template><view class="page"><view v-if="loading" class="state">加载中...</view><template v-else-if="item"><view class="summary"><view><text>{{item.no||'开票申请'}}</text><text>{{item.customerName||'—'}} Â· {{money(item.price)}}</text></view><text>{{status(item.auditStatus)}}</text></view><view class="toolbar"><button v-if="canUpdate" @click="uni.navigateTo({url:`/pages/crm/invoice/form?id=${id}`})">编辑</button><button v-if="canUpdate&&item.auditStatus===0" @click="submit">提交审核</button></view><view class="card"><view v-for="row in [['客户',item.customerName],['合同',item.contract?.no||item.contract?.name],['负责人',item.ownerUserName],['所属部门',item.ownerUserDeptName],['发票类型',item.invoiceType],['发票号码',item.invoiceNo],['发票抬头',item.invoiceTitle],['开票金额',money(item.price)],['开票日期',item.invoiceTime?.slice(0,10)],['剩余可回款金额',money(item.remainingInvoicePrice)],['创建人',item.creatorName],['创建时间',item.createTime?.replace('T',' ').slice(0,16)]]" :key="row[0]" class="row"><text>{{row[0]}}</text><text>{{row[1]??'—'}}</text></view><view class="remark"><text>备注</text><text>{{item.remark||'—'}}</text></view><view class="remark"><text>发票附件</text><text v-if="item.attachmentList?.length">{{item.attachmentList.map(x=>x.name||'附件').join('、')}}</text><text v-else>未上传</text></view></view></template><view v-else class="state">暂无开票申请数据</view></view></template><style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx;background:#f6f7f9}.summary{display:flex;align-items:center;justify-content:space-between;padding:26rpx;color:#fff;background:var(--color-primary, #1769d8);border-radius:16rpx}.summary text{display:block}.summary view text:first-child{font-size:32rpx;font-weight:600}.summary view text:last-child{margin-top:8rpx;font-size:24rpx;color:#dbeaff}.summary>text{padding:5rpx 10rpx;font-size:21rpx;background:rgba(255,255,255,.18);border-radius:8rpx}.toolbar{display:flex;justify-content:flex-end;gap:16rpx;padding:18rpx 0}.toolbar button{margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee)}.toolbar button::after{border:0}.card{background:#fff;border-radius:16rpx}.row{display:flex;justify-content:space-between;gap:24rpx;min-height:88rpx;align-items:center;padding:0 24rpx;border-bottom:1rpx solid #eef1f5}.row text:first-child,.remark>text:first-child{color:#718198;font-size:26rpx}.row text:last-child{color:#263a54;font-size:26rpx;text-align:right}.remark{padding:20rpx 24rpx;border-bottom:1rpx solid #eef1f5}.remark text{display:block}.remark text:last-child{margin-top:12rpx;color:#263a54;font-size:26rpx;line-height:1.6}.state{padding:80rpx 20rpx;color:#8795a8;font-size:26rpx;text-align:center}</style>
src/pages/crm/invoice/form.vue
@@ -12,4 +12,4 @@
onLoad(async query=>{id.value=query.id?Number(query.id):undefined;if(!state.accessToken)return;try{const [customerData,contractData,userData,dictData]=await Promise.all([getCustomerSimpleList(state.accessToken),getContractPage(state.accessToken,{pageNo:1,pageSize:100}),getCrmUserList(state.accessToken),getSimpleDictDataList(state.accessToken)]);customers.value=customerData;contracts.value=contractData.list;users.value=userData;dicts.value=dictData;if(id.value){const data=await getInvoice(state.accessToken,id.value);Object.assign(form,data,{invoiceTime:data.invoiceTime?.slice(0,10)||'',blobIds:data.attachmentList?.map(x=>x.id)||data.blobIds||[]});attachments.value=data.attachmentList||[];}else{form.ownerUserId=state.user?.id;form.ownerUserName=state.user?.nickname;}}catch(error){uni.showToast({title:error instanceof Error?error.message:'数据加载失败',icon:'none'});}});
</script>
<template><view class="page"><view class="card"><view class="section">开票信息</view><view class="field"><text>客户 <text class="required">*</text></text><picker :range="customers" range-key="name" @change="selectCustomer(Number($event.detail.value))"><view class="picker">{{form.customerName||label(customers,form.customerId)}}<text>›</text></view></picker></view><view class="field"><text>合同 <text class="required">*</text></text><picker :range="contracts" range-key="name" @change="selectContract(Number($event.detail.value))"><view class="picker">{{form.contract?.name||form.contract?.no||label(contracts,form.contractId)}}<text>›</text></view></picker></view><view class="field"><text>负责人 <text class="required">*</text></text><picker :disabled="Boolean(id)" :range="users" range-key="nickname" @change="form.ownerUserId=users[Number($event.detail.value)].id;form.ownerUserName=users[Number($event.detail.value)].nickname"><view class="picker">{{form.ownerUserName||label(users,form.ownerUserId,'nickname')}}<text>›</text></view></picker></view><view class="field"><text>发票类型 <text class="required">*</text></text><picker :range="invoiceTypes" range-key="label" @change="form.invoiceType=Number(invoiceTypes[Number($event.detail.value)].value)"><view class="picker">{{invoiceTypes.find(x=>Number(x.value)===form.invoiceType)?.label||'请选择发票类型'}}<text>›</text></view></picker></view><view class="field"><text>发票号码</text><input v-model="form.invoiceNo" placeholder="请输入发票号码"/></view><view class="field"><text>发票抬头</text><input v-model="form.invoiceTitle" placeholder="请输入发票抬头"/></view><view class="field"><text>开票金额 <text class="required">*</text></text><input :value="form.price===undefined?'':String(form.price)" type="digit" placeholder="请输入开票金额" @input="form.price=Number($event.detail.value||0)"/></view><view class="field"><text>开票日期 <text class="required">*</text></text><picker mode="date" :value="form.invoiceTime" @change="form.invoiceTime=$event.detail.value"><view class="picker">{{form.invoiceTime||'请选择日期'}}<text>›</text></view></picker></view><view class="field column"><text>发票附件</text><button class="upload" :loading="uploading" @click="chooseFile">添加附件</button><text v-for="(file,index) in attachments" :key="file.id" class="file">{{file.name||`附件 ${index+1}`}} <text @click="form.blobIds?.splice(index,1);attachments.splice(index,1)">删除</text></text></view><view class="field column"><text>备注</text><textarea v-model="form.remark" placeholder="请输入备注"></textarea></view></view><button class="save" :loading="saving" :disabled="saving" @click="save">保存</button></view></template>
<style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.card{overflow:hidden;background:#fff;border-radius:16rpx}.section{padding:22rpx 24rpx 12rpx;color:#1769d8;font-size:25rpx;font-weight:600;background:#f8fbff}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;color:#33455d;font-size:27rpx}.required{color:#e34b4b}.field input,.field picker,.picker{flex:1;color:#1e3049;font-size:27rpx}.picker{display:flex;justify-content:space-between;color:#65758a}.picker text{color:#8092a7;font-size:36rpx}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:130rpx;font-size:27rpx}.upload{margin:0;color:#1769d8;font-size:24rpx;background:#f5f8ff;border:1rpx solid #8ab3ee}.file{width:100%;color:#65758a!important;font-size:24rpx!important}.file text{float:right;color:#c65050}.save{margin-top:32rpx;color:#fff;background:#1769d8;border-radius:12rpx;font-size:30rpx}.save::after,.upload::after{border:0}</style>
<style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.card{overflow:hidden;background:#fff;border-radius:16rpx}.section{padding:22rpx 24rpx 12rpx;color:var(--color-primary, #1769d8);font-size:25rpx;font-weight:600;background:#f8fbff}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;color:#33455d;font-size:27rpx}.required{color:#e34b4b}.field input,.field picker,.picker{flex:1;color:#1e3049;font-size:27rpx}.picker{display:flex;justify-content:space-between;color:#65758a}.picker text{color:#8092a7;font-size:36rpx}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:130rpx;font-size:27rpx}.upload{margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee)}.file{width:100%;color:#65758a!important;font-size:24rpx!important}.file text{float:right;color:#c65050}.save{margin-top:32rpx;color:#fff;background:var(--color-primary, #1769d8);border-radius:12rpx;font-size:30rpx}.save::after,.upload::after{border:0}</style>
src/pages/crm/invoice/index.vue
@@ -169,9 +169,9 @@
    font-size: 27rpx;
  }
  .tabs .active {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-weight: 600;
    border-bottom: 4rpx solid #1769d8;
    border-bottom: 4rpx solid var(--color-primary, #1769d8);
  }
  .search {
    display: flex;
@@ -188,12 +188,12 @@
  }
  .search text {
    font-size: 24rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
  }
  .content {
    height: 0;
    flex: 1;
    padding-bottom: 150rpx;
    padding-bottom: 132rpx;
    box-sizing: border-box;
  }
  .row {
@@ -220,9 +220,9 @@
  }
  .tag {
    padding: 4rpx 10rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 21rpx;
    background: #edf5ff;
    background: var(--color-primary-soft, #edf5ff);
    border-radius: 7rpx;
  }
  .grid {
@@ -252,11 +252,11 @@
    min-height: 48rpx;
    padding: 0 16rpx;
    margin: 0;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 22rpx;
    line-height: 46rpx;
    background: #f5f8ff;
    border: 1rpx solid #8ab3ee;
    background: var(--color-primary-soft, #f5f8ff);
    border: 1rpx solid var(--color-primary-border, #8ab3ee);
    border-radius: 10rpx;
  }
  .actions .danger {
@@ -283,7 +283,7 @@
    width: 220rpx;
    margin: 20rpx auto;
    color: #fff;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 12rpx;
  }
  .fab {
@@ -297,7 +297,7 @@
    color: #fff;
    font-size: 58rpx;
    line-height: 120rpx;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 50%;
  }
</style>
src/pages/crm/receivable-plan/detail.vue
@@ -224,5 +224,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;background:#f3f6fb}.summary{display:flex;justify-content:space-between;align-items:center;padding:28rpx 30rpx 22rpx;background:#fff}.summary view,.stack,.form,.log{display:flex;flex-direction:column}.summary view{gap:8rpx}.title{font-size:33rpx;font-weight:600;color:#20334c}.summary view text:last-child,.member>view>text,.logHead text:last-child,.logMeta,.noChange{color:#78879b;font-size:23rpx}.tag{padding:5rpx 12rpx;color:#1769d8;font-size:22rpx;background:#edf5ff;border-radius:7rpx}.toolbar{display:flex;gap:14rpx;padding:14rpx 30rpx;background:#fff}.toolbar button,.outline{padding:0 18rpx;margin:0;color:#1769d8;font-size:23rpx;line-height:54rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:10rpx}.toolbar button::after,.outline::after,.primary::after,.link::after,.changeToggle::after{border:0}.tabs{flex:none;white-space:nowrap;background:#fff}.tabs text{display:inline-block;padding:25rpx 22rpx 17rpx;color:#718198;font-size:26rpx}.tabs .active{color:#1769d8;font-weight:600;border-bottom:4rpx solid #1769d8}.content{height:0;flex:1;padding:20rpx 30rpx 60rpx;box-sizing:border-box}.card{padding:24rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.infoRow{display:flex;justify-content:space-between;gap:20rpx;padding:19rpx 0;font-size:26rpx;border-bottom:1rpx solid #eef1f5}.infoRow text:first-child,.remark text:first-child{color:#78879b}.infoRow text:last-child{text-align:right;color:#2b3d55}.remark{display:flex;flex-direction:column;gap:16rpx;padding-top:20rpx;font-size:26rpx}.outline{align-self:flex-end;margin-bottom:18rpx}.form{gap:18rpx}.required{color:#33455d;font-size:26rpx}.required::before{content:'*';margin-right:8rpx;color:#e34b4b}.select{display:flex;justify-content:space-between;min-height:74rpx;padding:0 18rpx;color:#65758a;font-size:26rpx;line-height:74rpx;background:#f6f8fb;border-radius:10rpx}.select text{font-size:34rpx}.form radio-group{display:flex;gap:30rpx;font-size:26rpx}.primary{margin:0;color:#fff;background:#1769d8;border-radius:10rpx}.member{display:flex;justify-content:space-between;align-items:flex-end;gap:16rpx}.member>view:first-child{display:flex;flex:1;flex-direction:column;gap:10rpx;min-width:0}.memberHead{display:flex;align-items:center;gap:14rpx}.memberHead text:first-child{font-size:28rpx;font-weight:600;color:#2b3d55}.memberHead text:last-child{padding:3rpx 10rpx;color:#1769d8;font-size:21rpx;background:#edf5ff;border-radius:7rpx}.memberActions{display:flex;align-items:center;gap:14rpx;color:#52708f;font-size:24rpx}.link{padding:0;margin:0;font-size:23rpx;line-height:1;background:transparent}.danger{color:#c65050!important}.log{gap:14rpx}.logHead{display:flex;align-items:center;justify-content:space-between;gap:16rpx}.logType{flex:none;padding:5rpx 13rpx;font-size:23rpx;border-radius:7rpx;color:#1769d8;background:#edf5ff}.logType.type1{color:#1f8a4c;background:#edf8f1}.logType.type2{color:#1769d8;background:#edf5ff}.logType.type3{color:#c65050;background:#fff0f0}.statusChange{display:flex;align-items:center;gap:10rpx;font-size:25rpx;color:#2b3d55}.statusChange text:first-child{color:#c65050}.statusChange text:last-child{color:#1f8a4c}.logContent{font-size:26rpx;color:#2b3d55;line-height:1.6;white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere}.logMeta{display:flex;flex-direction:column;gap:6rpx}.changeToggle{align-self:flex-start;padding:0 18rpx;margin:0;color:#1769d8;font-size:23rpx;line-height:50rpx;background:#f5f8ff;border-radius:10rpx}.changeList{display:flex;flex-direction:column;border-top:1rpx solid #eef1f5}.changeRow{display:flex;flex-direction:column;gap:8rpx;padding:16rpx 0;border-bottom:1rpx solid #eef1f5}.changeField{font-size:24rpx;color:#65758a}.changeValues{display:flex;align-items:flex-start;gap:10rpx;font-size:25rpx;line-height:1.5;word-break:break-word}.changeValues text{min-width:0}.old{flex:1;color:#c65050;text-decoration:line-through}.new{flex:1;color:#1f8a4c;font-weight:500}.state{padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}
.page{height:100vh;display:flex;flex-direction:column;background:#f3f6fb}.summary{display:flex;justify-content:space-between;align-items:center;padding:28rpx 30rpx 22rpx;background:#fff}.summary view,.stack,.form,.log{display:flex;flex-direction:column}.summary view{gap:8rpx}.title{font-size:33rpx;font-weight:600;color:#20334c}.summary view text:last-child,.member>view>text,.logHead text:last-child,.logMeta,.noChange{color:#78879b;font-size:23rpx}.tag{padding:5rpx 12rpx;color:var(--color-primary, #1769d8);font-size:22rpx;background:var(--color-primary-soft, #edf5ff);border-radius:7rpx}.toolbar{display:flex;gap:14rpx;padding:14rpx 30rpx;background:#fff}.toolbar button,.outline{padding:0 18rpx;margin:0;color:var(--color-primary, #1769d8);font-size:23rpx;line-height:54rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:10rpx}.toolbar button::after,.outline::after,.primary::after,.link::after,.changeToggle::after{border:0}.tabs{flex:none;white-space:nowrap;background:#fff}.tabs text{display:inline-block;padding:25rpx 22rpx 17rpx;color:#718198;font-size:26rpx}.tabs .active{color:var(--color-primary, #1769d8);font-weight:600;border-bottom:4rpx solid var(--color-primary, #1769d8)}.content{height:0;flex:1;padding:20rpx 30rpx 60rpx;box-sizing:border-box}.card{padding:24rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.infoRow{display:flex;justify-content:space-between;gap:20rpx;padding:19rpx 0;font-size:26rpx;border-bottom:1rpx solid #eef1f5}.infoRow text:first-child,.remark text:first-child{color:#78879b}.infoRow text:last-child{text-align:right;color:#2b3d55}.remark{display:flex;flex-direction:column;gap:16rpx;padding-top:20rpx;font-size:26rpx}.outline{align-self:flex-end;margin-bottom:18rpx}.form{gap:18rpx}.required{color:#33455d;font-size:26rpx}.required::before{content:'*';margin-right:8rpx;color:#e34b4b}.select{display:flex;justify-content:space-between;min-height:74rpx;padding:0 18rpx;color:#65758a;font-size:26rpx;line-height:74rpx;background:#f6f8fb;border-radius:10rpx}.select text{font-size:34rpx}.form radio-group{display:flex;gap:30rpx;font-size:26rpx}.primary{margin:0;color:#fff;background:var(--color-primary, #1769d8);border-radius:10rpx}.member{display:flex;justify-content:space-between;align-items:flex-end;gap:16rpx}.member>view:first-child{display:flex;flex:1;flex-direction:column;gap:10rpx;min-width:0}.memberHead{display:flex;align-items:center;gap:14rpx}.memberHead text:first-child{font-size:28rpx;font-weight:600;color:#2b3d55}.memberHead text:last-child{padding:3rpx 10rpx;color:var(--color-primary, #1769d8);font-size:21rpx;background:var(--color-primary-soft, #edf5ff);border-radius:7rpx}.memberActions{display:flex;align-items:center;gap:14rpx;color:#52708f;font-size:24rpx}.link{padding:0;margin:0;font-size:23rpx;line-height:1;background:transparent}.danger{color:#c65050!important}.log{gap:14rpx}.logHead{display:flex;align-items:center;justify-content:space-between;gap:16rpx}.logType{flex:none;padding:5rpx 13rpx;font-size:23rpx;border-radius:7rpx;color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #edf5ff)}.logType.type1{color:#1f8a4c;background:#edf8f1}.logType.type2{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #edf5ff)}.logType.type3{color:#c65050;background:#fff0f0}.statusChange{display:flex;align-items:center;gap:10rpx;font-size:25rpx;color:#2b3d55}.statusChange text:first-child{color:#c65050}.statusChange text:last-child{color:#1f8a4c}.logContent{font-size:26rpx;color:#2b3d55;line-height:1.6;white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere}.logMeta{display:flex;flex-direction:column;gap:6rpx}.changeToggle{align-self:flex-start;padding:0 18rpx;margin:0;color:var(--color-primary, #1769d8);font-size:23rpx;line-height:50rpx;background:var(--color-primary-soft, #f5f8ff);border-radius:10rpx}.changeList{display:flex;flex-direction:column;border-top:1rpx solid #eef1f5}.changeRow{display:flex;flex-direction:column;gap:8rpx;padding:16rpx 0;border-bottom:1rpx solid #eef1f5}.changeField{font-size:24rpx;color:#65758a}.changeValues{display:flex;align-items:flex-start;gap:10rpx;font-size:25rpx;line-height:1.5;word-break:break-word}.changeValues text{min-width:0}.old{flex:1;color:#c65050;text-decoration:line-through}.new{flex:1;color:#1f8a4c;font-weight:500}.state{padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}
</style>
src/pages/crm/receivable-plan/form.vue
@@ -26,4 +26,4 @@
onLoad(async query => { id.value = query.id ? Number(query.id) : undefined; const contractId = query.contractId ? Number(query.contractId) : undefined; const customerId = query.customerId ? Number(query.customerId) : undefined; if (!state.accessToken) return; try { const [customerData, contractData, userData, dictData] = await Promise.all([getCustomerSimpleList(state.accessToken), getContractPage(state.accessToken, { pageNo: 1, pageSize: 100 }), getCrmUserList(state.accessToken), getSimpleDictDataList(state.accessToken)]); customers.value = customerData; contracts.value = contractData.list; users.value = userData; dicts.value = dictData; if (id.value) { const data = await getReceivablePlan(state.accessToken, id.value); Object.assign(form, data, { returnTime: data.returnTime?.slice(0, 10) || "" }); } else { form.customerId = customerId; form.customerName = customers.value.find(item => item.id === customerId)?.name; form.ownerUserId = state.user?.id; form.ownerUserName = state.user?.nickname; if (contractId) { const contract = contracts.value.find(item => item.id === contractId) || await getContract(state.accessToken, contractId); if (!contracts.value.some(item => item.id === contract.id)) contracts.value.push(contract); form.contractId = contract.id; form.contractNo = contract.no || contract.name; form.customerId = contract.customerId; form.customerName = contract.customerName; form.price = Number(contract.totalPrice || 0) - Number(contract.totalReceivablePrice || 0); } } } catch (error) { uni.showToast({ title: error instanceof Error ? error.message : "数据加载失败", icon: "none" }); } });
</script>
<template><view class="page"><view class="form-card"><view class="section">回款计划</view><view class="field"><text>期次</text><view class="readonly">{{ id ? `第 ${form.period || '—'} æœŸ` : '保存时自动生成' }}</view></view><view class="field"><text>客户 <text class="required">*</text></text><picker :disabled="Boolean(id)" :range="customers" range-key="name" @change="selectCustomer(Number($event.detail.value))"><view class="picker">{{ customerLabel() }}<text>›</text></view></picker></view><view class="field"><text>合同 <text class="required">*</text></text><picker :disabled="Boolean(id)" :range="availableContracts" range-key="name" @change="selectContract(Number($event.detail.value))"><view class="picker">{{ contractLabel() }}<text>›</text></view></picker></view><view class="field"><text>负责人 <text class="required">*</text></text><picker :disabled="Boolean(id)" :range="users" range-key="nickname" @change="form.ownerUserId=users[Number($event.detail.value)].id;form.ownerUserName=users[Number($event.detail.value)].nickname||users[Number($event.detail.value)].username"><view class="picker">{{ userLabel() }}<text>›</text></view></picker></view><view class="field"><text>预计回款日 <text class="required">*</text></text><picker mode="date" :value="form.returnTime" @change="form.returnTime=$event.detail.value"><view class="picker">{{ form.returnTime || '请选择日期' }}<text>›</text></view></picker></view><view class="field"><text>回款方式 <text class="required">*</text></text><picker :range="returnTypes" range-key="label" @change="form.returnType=Number(returnTypes[Number($event.detail.value)].value)"><view class="picker">{{ returnTypeLabel() }}<text>›</text></view></picker></view><view class="field"><text>计划金额 <text class="required">*</text></text><input :value="form.price === undefined ? '' : String(form.price)" type="digit" placeholder="请输入计划金额" @input="form.price=Number($event.detail.value||0)" /></view><view class="field"><text>提前提醒</text><input :value="form.remindDays === undefined ? '' : String(form.remindDays)" type="number" placeholder="请输入提醒天数" @input="form.remindDays=$event.detail.value===''?undefined:Number($event.detail.value)" /><text class="unit">天</text></view><view class="field column"><text>备注</text><textarea v-model="form.remark" placeholder="请输入备注" ></textarea></view></view><button v-if="editable" class="save" :loading="saving" :disabled="saving" @click="save">保存</button><view v-else class="no-permission">暂无保存权限</view></view></template>
<style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.section{padding:22rpx 24rpx 12rpx;color:#1769d8;font-size:25rpx;font-weight:600;background:#f8fbff}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text{width:190rpx;color:#33455d;font-size:27rpx}.required{color:#e34b4b}.field input,.field picker,.picker,.readonly{flex:1;color:#1e3049;font-size:27rpx}.readonly,.picker{color:#65758a}.picker{display:flex;justify-content:space-between}.picker text{color:#8092a7;font-size:36rpx}.unit{width:auto!important;color:#65758a!important}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text{width:auto}.column textarea{width:100%;height:130rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;background:#1769d8;border-radius:12rpx;font-size:30rpx}.save::after{border:0}.no-permission{padding:36rpx;color:#8795a8;font-size:26rpx;text-align:center}</style>
<style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.section{padding:22rpx 24rpx 12rpx;color:var(--color-primary, #1769d8);font-size:25rpx;font-weight:600;background:#f8fbff}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text{width:190rpx;color:#33455d;font-size:27rpx}.required{color:#e34b4b}.field input,.field picker,.picker,.readonly{flex:1;color:#1e3049;font-size:27rpx}.readonly,.picker{color:#65758a}.picker{display:flex;justify-content:space-between}.picker text{color:#8092a7;font-size:36rpx}.unit{width:auto!important;color:#65758a!important}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text{width:auto}.column textarea{width:100%;height:130rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;background:var(--color-primary, #1769d8);border-radius:12rpx;font-size:30rpx}.save::after{border:0}.no-permission{padding:36rpx;color:#8795a8;font-size:26rpx;text-align:center}</style>
src/pages/crm/receivable-plan/index.vue
@@ -176,9 +176,9 @@
    font-size: 27rpx;
  }
  .tabs .active {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-weight: 600;
    border-bottom: 4rpx solid #1769d8;
    border-bottom: 4rpx solid var(--color-primary, #1769d8);
  }
  .search {
    display: flex;
@@ -195,13 +195,13 @@
    font-size: 27rpx;
  }
  .search text {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 24rpx;
  }
  .content {
    height: 0;
    flex: 1;
    padding-bottom: 150rpx;
    padding-bottom: 132rpx;
    box-sizing: border-box;
  }
  .row {
@@ -270,11 +270,11 @@
    min-height: 48rpx;
    padding: 0 16rpx;
    margin: 0;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 22rpx;
    line-height: 46rpx;
    background: #f5f8ff;
    border: 1rpx solid #8ab3ee;
    background: var(--color-primary-soft, #f5f8ff);
    border: 1rpx solid var(--color-primary-border, #8ab3ee);
    border-radius: 10rpx;
  }
  .actions button::after,
@@ -301,7 +301,7 @@
    width: 220rpx;
    margin: 20rpx auto;
    color: #fff;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 12rpx;
  }
  .fab {
@@ -316,7 +316,7 @@
    color: #fff;
    font-size: 58rpx;
    line-height: 120rpx;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 50%;
    box-shadow: 0 12rpx 24rpx rgba(23, 105, 216, 0.3);
  }
src/pages/crm/receivable/detail.vue
@@ -116,5 +116,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;background:#f3f6fb}.summary{display:flex;justify-content:space-between;align-items:center;padding:28rpx 30rpx 22rpx;background:#fff}.summary view,.stack,.form,.log{display:flex;flex-direction:column}.summary view{gap:8rpx}.title{font-size:33rpx;font-weight:600;color:#20334c}.summary view text:last-child,.member>view>text,.log text:last-child{color:#78879b;font-size:23rpx}.tag{padding:5rpx 12rpx;color:#1769d8;font-size:22rpx;background:#edf5ff;border-radius:7rpx}.toolbar{display:flex;gap:14rpx;padding:14rpx 30rpx;background:#fff}.toolbar button,.outline{padding:0 18rpx;margin:0;color:#1769d8;font-size:23rpx;line-height:54rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:10rpx}.toolbar button::after,.outline::after,.primary::after,.link::after{border:0}.tabs{flex:none;white-space:nowrap;background:#fff}.tabs text{display:inline-block;padding:25rpx 22rpx 17rpx;color:#718198;font-size:26rpx}.tabs .active{color:#1769d8;font-weight:600;border-bottom:4rpx solid #1769d8}.content{height:0;flex:1;padding:20rpx 30rpx 60rpx;box-sizing:border-box}.card{padding:24rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.infoRow{display:flex;justify-content:space-between;gap:20rpx;padding:19rpx 0;font-size:26rpx;border-bottom:1rpx solid #eef1f5}.infoRow text:first-child,.remark text:first-child{color:#78879b}.infoRow text:last-child{text-align:right;color:#2b3d55}.remark{display:flex;flex-direction:column;gap:16rpx;padding-top:20rpx;font-size:26rpx}.outline{align-self:flex-end;margin-bottom:18rpx}.form{gap:18rpx}.required{color:#33455d;font-size:26rpx}.required::before{content:'*';margin-right:8rpx;color:#e34b4b}.select{display:flex;justify-content:space-between;min-height:74rpx;padding:0 18rpx;color:#65758a;font-size:26rpx;line-height:74rpx;background:#f6f8fb;border-radius:10rpx}.select text{font-size:34rpx}.form radio-group{display:flex;gap:30rpx;font-size:26rpx}.primary{margin:0;color:#fff;background:#1769d8;border-radius:10rpx}.member{display:flex;justify-content:space-between;align-items:flex-end;gap:16rpx}.member>view:first-child{display:flex;flex:1;flex-direction:column;gap:10rpx;min-width:0}.memberHead{display:flex;align-items:center;gap:14rpx}.memberHead text:first-child{font-size:28rpx;font-weight:600;color:#2b3d55}.memberHead text:last-child{padding:3rpx 10rpx;color:#1769d8;font-size:21rpx;background:#edf5ff;border-radius:7rpx}.memberActions{display:flex;align-items:center;gap:14rpx;color:#52708f;font-size:24rpx}.link{padding:0;margin:0;font-size:23rpx;line-height:1;background:transparent}.danger{color:#c65050!important}.log{gap:12rpx}.log text:first-child{font-size:26rpx;color:#2b3d55}.state{padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}
.page{height:100vh;display:flex;flex-direction:column;background:#f3f6fb}.summary{display:flex;justify-content:space-between;align-items:center;padding:28rpx 30rpx 22rpx;background:#fff}.summary view,.stack,.form,.log{display:flex;flex-direction:column}.summary view{gap:8rpx}.title{font-size:33rpx;font-weight:600;color:#20334c}.summary view text:last-child,.member>view>text,.log text:last-child{color:#78879b;font-size:23rpx}.tag{padding:5rpx 12rpx;color:var(--color-primary, #1769d8);font-size:22rpx;background:var(--color-primary-soft, #edf5ff);border-radius:7rpx}.toolbar{display:flex;gap:14rpx;padding:14rpx 30rpx;background:#fff}.toolbar button,.outline{padding:0 18rpx;margin:0;color:var(--color-primary, #1769d8);font-size:23rpx;line-height:54rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:10rpx}.toolbar button::after,.outline::after,.primary::after,.link::after{border:0}.tabs{flex:none;white-space:nowrap;background:#fff}.tabs text{display:inline-block;padding:25rpx 22rpx 17rpx;color:#718198;font-size:26rpx}.tabs .active{color:var(--color-primary, #1769d8);font-weight:600;border-bottom:4rpx solid var(--color-primary, #1769d8)}.content{height:0;flex:1;padding:20rpx 30rpx 60rpx;box-sizing:border-box}.card{padding:24rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.infoRow{display:flex;justify-content:space-between;gap:20rpx;padding:19rpx 0;font-size:26rpx;border-bottom:1rpx solid #eef1f5}.infoRow text:first-child,.remark text:first-child{color:#78879b}.infoRow text:last-child{text-align:right;color:#2b3d55}.remark{display:flex;flex-direction:column;gap:16rpx;padding-top:20rpx;font-size:26rpx}.outline{align-self:flex-end;margin-bottom:18rpx}.form{gap:18rpx}.required{color:#33455d;font-size:26rpx}.required::before{content:'*';margin-right:8rpx;color:#e34b4b}.select{display:flex;justify-content:space-between;min-height:74rpx;padding:0 18rpx;color:#65758a;font-size:26rpx;line-height:74rpx;background:#f6f8fb;border-radius:10rpx}.select text{font-size:34rpx}.form radio-group{display:flex;gap:30rpx;font-size:26rpx}.primary{margin:0;color:#fff;background:var(--color-primary, #1769d8);border-radius:10rpx}.member{display:flex;justify-content:space-between;align-items:flex-end;gap:16rpx}.member>view:first-child{display:flex;flex:1;flex-direction:column;gap:10rpx;min-width:0}.memberHead{display:flex;align-items:center;gap:14rpx}.memberHead text:first-child{font-size:28rpx;font-weight:600;color:#2b3d55}.memberHead text:last-child{padding:3rpx 10rpx;color:var(--color-primary, #1769d8);font-size:21rpx;background:var(--color-primary-soft, #edf5ff);border-radius:7rpx}.memberActions{display:flex;align-items:center;gap:14rpx;color:#52708f;font-size:24rpx}.link{padding:0;margin:0;font-size:23rpx;line-height:1;background:transparent}.danger{color:#c65050!important}.log{gap:12rpx}.log text:first-child{font-size:26rpx;color:#2b3d55}.state{padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}
</style>
src/pages/crm/receivable/form.vue
@@ -33,4 +33,4 @@
onLoad(async query => { id.value = query.id ? Number(query.id) : undefined; const contractId = query.contractId ? Number(query.contractId) : undefined; const customerId = query.customerId ? Number(query.customerId) : undefined; const planId = query.planId ? Number(query.planId) : undefined; if (!state.accessToken) return; try { const [customerData, contractData, userData, dictData] = await Promise.all([getCustomerSimpleList(state.accessToken), getContractPage(state.accessToken, { pageNo: 1, pageSize: 100 }), getCrmUserList(state.accessToken), getSimpleDictDataList(state.accessToken)]); customers.value = customerData; contracts.value = contractData.list; users.value = userData; dicts.value = dictData; if (id.value) { const data = await getReceivable(state.accessToken, id.value); Object.assign(form, data, { returnTime: data.returnTime?.slice(0, 10) || "" }); await loadRelated(); } else { form.customerId = customerId; form.customerName = customers.value.find(item => item.id === customerId)?.name; form.ownerUserId = state.user?.id; form.ownerUserName = state.user?.nickname; if (contractId) { const contract = contracts.value.find(item => item.id === contractId) || await getContract(state.accessToken, contractId); if (!contracts.value.some(item => item.id === contract.id)) contracts.value.push(contract); form.contractId = contract.id; form.contractNo = contract.no || contract.name; form.customerId = contract.customerId; form.customerName = contract.customerName; await loadRelated(); } if (planId && form.customerId && form.contractId) { const plan = plans.value.find(item => item.id === planId); if (plan) selectPlan(plans.value.indexOf(plan)); } } } catch (error) { uni.showToast({ title: error instanceof Error ? error.message : "数据加载失败", icon: "none" }); } });
</script>
<template><view class="page"><view class="form-card"><view class="section">回款信息</view><view class="field"><text>客户 <text class="required">*</text></text><picker :disabled="Boolean(id)" :range="customers" range-key="name" @change="selectCustomer(Number($event.detail.value))"><view class="picker">{{ customerLabel() }}<text>›</text></view></picker></view><view class="field"><text>合同 <text class="required">*</text></text><picker :disabled="Boolean(id)" :range="availableContracts" range-key="name" @change="selectContract(Number($event.detail.value))"><view class="picker">{{ contractLabel() }}<text>›</text></view></picker></view><view class="field"><text>关联发票 <text class="required">*</text></text><picker :disabled="Boolean(id)" :range="invoices" range-key="invoiceNo" @change="form.invoiceId = invoices[Number($event.detail.value)].id"><view class="picker">{{ invoiceLabel() }}<text>›</text></view></picker></view><view class="field"><text>回款计划</text><picker :disabled="Boolean(id)" :range="plans" range-key="period" @change="selectPlan(Number($event.detail.value))"><view class="picker">{{ planLabel() }}<text>›</text></view></picker></view><view class="field"><text>负责人 <text class="required">*</text></text><picker :disabled="Boolean(id)" :range="users" range-key="nickname" @change="form.ownerUserId=users[Number($event.detail.value)].id;form.ownerUserName=users[Number($event.detail.value)].nickname||users[Number($event.detail.value)].username"><view class="picker">{{ userLabel() }}<text>›</text></view></picker></view><view class="field"><text>回款日期 <text class="required">*</text></text><picker mode="date" :value="form.returnTime" @change="form.returnTime=$event.detail.value"><view class="picker">{{ form.returnTime || '请选择日期' }}<text>›</text></view></picker></view><view class="field"><text>回款方式 <text class="required">*</text></text><picker :range="returnTypes" range-key="label" @change="form.returnType=Number(returnTypes[Number($event.detail.value)].value)"><view class="picker">{{ returnTypeLabel() }}<text>›</text></view></picker></view><view class="field"><text>回款金额 <text class="required">*</text></text><input :value="form.price === undefined ? '' : String(form.price)" type="digit" placeholder="请输入回款金额" @input="form.price=Number($event.detail.value||0)" /></view><view class="field column"><text>备注</text><textarea v-model="form.remark" placeholder="请输入备注" ></textarea></view></view><button v-if="editable" class="save" :loading="saving" :disabled="saving" @click="save">保存</button><view v-else class="no-permission">暂无保存权限</view></view></template>
<style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.section{padding:22rpx 24rpx 12rpx;color:#1769d8;font-size:25rpx;font-weight:600;background:#f8fbff}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text{width:190rpx;color:#33455d;font-size:27rpx}.required{color:#e34b4b}.field input,.field picker,.picker{flex:1;color:#1e3049;font-size:27rpx}.picker{display:flex;justify-content:space-between;color:#65758a}.picker text{color:#8092a7;font-size:36rpx}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text{width:auto}.column textarea{width:100%;height:130rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;background:#1769d8;border-radius:12rpx;font-size:30rpx}.save::after{border:0}.no-permission{padding:36rpx;color:#8795a8;font-size:26rpx;text-align:center}</style>
<style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.section{padding:22rpx 24rpx 12rpx;color:var(--color-primary, #1769d8);font-size:25rpx;font-weight:600;background:#f8fbff}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text{width:190rpx;color:#33455d;font-size:27rpx}.required{color:#e34b4b}.field input,.field picker,.picker{flex:1;color:#1e3049;font-size:27rpx}.picker{display:flex;justify-content:space-between;color:#65758a}.picker text{color:#8092a7;font-size:36rpx}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text{width:auto}.column textarea{width:100%;height:130rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;background:var(--color-primary, #1769d8);border-radius:12rpx;font-size:30rpx}.save::after{border:0}.no-permission{padding:36rpx;color:#8795a8;font-size:26rpx;text-align:center}</style>
src/pages/crm/receivable/index.vue
@@ -134,17 +134,17 @@
  .page { height: 100vh; display: flex; flex-direction: column; padding: 0 30rpx; box-sizing: border-box; overflow: hidden; background: #f3f6fb; }
  .sceneTabs { height: 88rpx; white-space: nowrap; }
  .sceneTabs text { display: inline-block; padding: 27rpx 20rpx 18rpx; color: #718198; font-size: 27rpx; }
  .sceneTabs .active { color: #1769d8; font-weight: 600; border-bottom: 4rpx solid #1769d8; }
  .sceneTabs .active { color: var(--color-primary, #1769d8); font-weight: 600; border-bottom: 4rpx solid var(--color-primary, #1769d8); }
  .search { display: flex; align-items: center; height: 80rpx; padding: 0 20rpx; margin: 8rpx 0 16rpx; background: #fff; border-radius: 16rpx; box-shadow: 0 8rpx 20rpx rgba(43, 69, 107, .06); }
  .search input { flex: 1; font-size: 27rpx; } .search text { color: #1769d8; font-size: 24rpx; }
  .content { height: 0; flex: 1; padding-bottom: 150rpx; box-sizing: border-box; }
  .search input { flex: 1; font-size: 27rpx; } .search text { color: var(--color-primary, #1769d8); font-size: 24rpx; }
  .content { height: 0; flex: 1; padding-bottom: 132rpx; box-sizing: border-box; }
  .row { padding: 24rpx 22rpx 20rpx; margin-bottom: 18rpx; background: #fff; border-radius: 16rpx; box-shadow: 0 10rpx 24rpx rgba(43, 69, 107, .08); }
  .head, .amount, .actions { display: flex; align-items: center; justify-content: space-between; gap: 16rpx; }
  .name { min-width: 0; overflow: hidden; color: #20334c; font-size: 30rpx; font-weight: 600; text-overflow: ellipsis; white-space: nowrap; }
  .tag { flex: none; padding: 4rpx 10rpx; color: #b86c16; font-size: 21rpx; background: #fff5e8; border-radius: 7rpx; } .tag.audited { color: #16835d; background: #eaf8f2; }
  .amount { padding: 17rpx 0; margin-top: 14rpx; color: #718198; font-size: 23rpx; border-top: 1rpx solid #edf1f6; } .amount text:last-child { color: #df5d36; font-size: 31rpx; font-weight: 600; }
  .grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10rpx 16rpx; padding: 16rpx 0; color: #66778c; font-size: 22rpx; border-top: 1rpx solid #edf1f6; border-bottom: 1rpx solid #edf1f6; } .grid text { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .actions { justify-content: flex-end; padding-top: 16rpx; } .actions button { min-height: 48rpx; padding: 0 16rpx; margin: 0; color: #1769d8; font-size: 22rpx; line-height: 46rpx; background: #f5f8ff; border: 1rpx solid #8ab3ee; border-radius: 10rpx; } .actions button::after, .fab::after { border: 0; } .actions .danger { color: #c65050; background: #fff7f7; border-color: #e3a0a0; }
  .more, .state { display: block; padding: 35rpx; color: #8795a8; font-size: 26rpx; text-align: center; } .error { color: #c3654d; } .state button { width: 220rpx; margin: 20rpx auto; color: #fff; background: #1769d8; border-radius: 12rpx; }
  .fab { position: fixed; right: 30rpx; bottom: calc(32rpx + env(safe-area-inset-bottom)); z-index: 10; width: 132rpx; height: 132rpx; padding: 0; margin: 0; color: #fff; font-size: 58rpx; line-height: 120rpx; background: #1769d8; border-radius: 50%; box-shadow: 0 12rpx 24rpx rgba(23, 105, 216, .3); }
  .actions { justify-content: flex-end; padding-top: 16rpx; } .actions button { min-height: 48rpx; padding: 0 16rpx; margin: 0; color: var(--color-primary, #1769d8); font-size: 22rpx; line-height: 46rpx; background: var(--color-primary-soft, #f5f8ff); border: 1rpx solid var(--color-primary-border, #8ab3ee); border-radius: 10rpx; } .actions button::after, .fab::after { border: 0; } .actions .danger { color: #c65050; background: #fff7f7; border-color: #e3a0a0; }
  .more, .state { display: block; padding: 35rpx; color: #8795a8; font-size: 26rpx; text-align: center; } .error { color: #c3654d; } .state button { width: 220rpx; margin: 20rpx auto; color: #fff; background: var(--color-primary, #1769d8); border-radius: 12rpx; }
  .fab { position: fixed; right: 30rpx; bottom: calc(32rpx + env(safe-area-inset-bottom)); z-index: 10; width: 132rpx; height: 132rpx; padding: 0; margin: 0; color: #fff; font-size: 58rpx; line-height: 120rpx; background: var(--color-primary, #1769d8); border-radius: 50%; box-shadow: 0 12rpx 24rpx rgba(23, 105, 216, .3); }
</style>
src/pages/crm/sale-quotation/detail.vue
@@ -98,7 +98,7 @@
    justify-content: space-between;
    padding: 26rpx;
    color: #fff;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 16rpx;
  }
  .summary text {
@@ -127,10 +127,10 @@
  }
  .toolbar button {
    margin: 0;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 24rpx;
    background: #f5f8ff;
    border: 1rpx solid #8ab3ee;
    background: var(--color-primary-soft, #f5f8ff);
    border: 1rpx solid var(--color-primary-border, #8ab3ee);
  }
  .toolbar button::after {
    border: 0;
@@ -160,11 +160,11 @@
    text-align: right;
  }
  .row .link {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
  }
  .section {
    padding: 22rpx 24rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 27rpx;
    font-weight: 600;
    background: #f8fbff;
@@ -206,4 +206,4 @@
    font-size: 26rpx;
    line-height: 1.6;
  }
</style>
</style>
src/pages/crm/sale-quotation/form.vue
@@ -1,4 +1,4 @@
<script setup lang="ts">
import { computed, reactive, ref } from 'vue'; import { onLoad } from '@dcloudio/uni-app'; import { createSaleQuotation,getBusinessPage,getContactPage,getCrmUserList,getCustomerSimpleList,getMaterialSimpleList,getSaleQuotation,updateSaleQuotation,type Business,type BusinessProduct,type CrmContact,type CrmCustomerSimple,type SaleQuotation,type SaleQuotationItem } from '../../../api/crm'; import type { UserSimple } from '../../../api/purchase'; import { useAuth } from '../../../stores/auth'; import { materialOptionText } from '../../../utils/material';
const {state}=useAuth();const id=ref<number>(),saving=ref(false),customers=ref<CrmCustomerSimple[]>([]),businesses=ref<Business[]>([]),contacts=ref<CrmContact[]>([]),users=ref<UserSimple[]>([]),materials=ref<BusinessProduct[]>([]);const form=reactive<SaleQuotation>({name:'',customerId:undefined,ownerUserId:undefined,quotationTime:'',validUntil:'',taxRate:undefined,discountPercent:0,totalProductPrice:0,totalPrice:0,remark:'',items:[]});const label=(items:any[],value?:number,key='name')=>items.find(x=>x.id===value)?.[key]||'请选择';const materialOptions=computed(()=>materials.value.map(x=>materialOptionText(x)));const productTotal=computed(()=>form.items?.reduce((sum,x)=>sum+Number(x.totalPrice||0),0)||0);function recalc(){form.totalProductPrice=productTotal.value;form.totalPrice=Number((productTotal.value*(100-Number(form.discountPercent||0))/100).toFixed(2));}function add(){form.items?.push({itemId:undefined,quotationPrice:0,count:1,totalPrice:0});}function productAmount(x:SaleQuotationItem){x.totalPrice=Number((Number(x.quotationPrice||0)*Number(x.count||0)).toFixed(2));recalc();}function productText(x:SaleQuotationItem){return materialOptionText({itemCode:x.itemCode,itemName:x.itemName,itemSpecification:x.itemSpecification,itemUnitName:x.itemUnitName});}function selectProduct(x:SaleQuotationItem,m:BusinessProduct){Object.assign(x,{itemId:m.itemId||m.id,itemName:m.itemName||m.name,itemCode:m.itemCode||m.code,itemSpecification:m.itemSpecification||m.specification,itemUnitName:m.itemUnitName||m.unitMeasureName,itemPrice:Number(m.itemPrice||m.salesPrice||0),quotationPrice:Number(m.itemPrice||m.salesPrice||0)});productAmount(x);}function selectCustomer(index:number){const x=customers.value[index];form.customerId=x.id;form.customerName=x.name;form.businessId=undefined;form.businessName=undefined;form.contactId=undefined;form.contactName=undefined;}async function save(){if(!state.accessToken||saving.value)return;if(!form.name.trim()||!form.customerId||!form.ownerUserId||!form.quotationTime)return uni.showToast({title:'请填写报价单名称、客户、负责人和报价日期',icon:'none'});if(!form.items?.length||form.items.some(x=>!x.itemId||!Number(x.count)||Number(x.quotationPrice)<0))return uni.showToast({title:'请完善报价产品、价格和数量',icon:'none'});saving.value=true;try{recalc();const data={...form,name:form.name.trim(),quotationTime:`${form.quotationTime} 00:00:00`,validUntil:form.validUntil?`${form.validUntil} 00:00:00`:undefined};if(id.value)await updateSaleQuotation(state.accessToken,{...data,id:id.value});else await createSaleQuotation(state.accessToken,data);uni.showToast({title:'保存成功',icon:'success'});setTimeout(()=>uni.navigateBack(),500);}catch(e){uni.showToast({title:e instanceof Error?e.message:'保存失败',icon:'none'});}finally{saving.value=false;}}onLoad(async q=>{id.value=q.id?Number(q.id):undefined;if(!state.accessToken)return;try{const [cs,bs,us,ms]=await Promise.all([getCustomerSimpleList(state.accessToken),getBusinessPage(state.accessToken,{pageNo:1,pageSize:100}),getCrmUserList(state.accessToken),getMaterialSimpleList(state.accessToken)]);customers.value=cs;businesses.value=bs.list;users.value=us;materials.value=ms;const contactsData=await getContactPage(state.accessToken,{pageNo:1,pageSize:100});contacts.value=contactsData.list;if(id.value){const data=await getSaleQuotation(state.accessToken,id.value);Object.assign(form,data,{quotationTime:data.quotationTime?.slice(0,10)||'',validUntil:data.validUntil?.slice(0,10)||'',items:data.items||[]});recalc();}else{form.ownerUserId=state.user?.id;form.ownerUserName=state.user?.nickname;}}catch(e){uni.showToast({title:e instanceof Error?e.message:'数据加载失败',icon:'none'});}});
</script><template><view class="page"><view class="card"><view class="section">基本信息</view><view class="field"><text>报价单名称 <text class="required">*</text></text><input v-model="form.name" placeholder="请输入报价单名称"/></view><view class="field"><text>报价单号</text><input :value="form.no" disabled placeholder="保存时自动生成"/></view><view class="field"><text>客户 <text class="required">*</text></text><picker :range="customers" range-key="name" @change="selectCustomer(Number($event.detail.value))"><view class="picker">{{form.customerName||label(customers,form.customerId)}}<text>›</text></view></picker></view><view class="field"><text>商机</text><picker :range="businesses.filter(x=>x.customerId===form.customerId)" range-key="name" @change="form.businessId=businesses.filter(x=>x.customerId===form.customerId)[Number($event.detail.value)].id;form.businessName=businesses.filter(x=>x.customerId===form.customerId)[Number($event.detail.value)].name"><view class="picker">{{form.businessName||'请选择商机'}}<text>›</text></view></picker></view><view class="field"><text>联系人</text><picker :range="contacts.filter(x=>x.customerId===form.customerId)" range-key="name" @change="form.contactId=contacts.filter(x=>x.customerId===form.customerId)[Number($event.detail.value)].id;form.contactName=contacts.filter(x=>x.customerId===form.customerId)[Number($event.detail.value)].name"><view class="picker">{{form.contactName||'请选择联系人'}}<text>›</text></view></picker></view><view class="field"><text>负责人 <text class="required">*</text></text><picker :range="users" range-key="nickname" @change="form.ownerUserId=users[Number($event.detail.value)].id;form.ownerUserName=users[Number($event.detail.value)].nickname"><view class="picker">{{form.ownerUserName||label(users,form.ownerUserId,'nickname')}}<text>›</text></view></picker></view><view class="field"><text>报价日期 <text class="required">*</text></text><picker mode="date" :value="form.quotationTime" @change="form.quotationTime=$event.detail.value"><view class="picker">{{form.quotationTime||'请选择日期'}}<text>›</text></view></picker></view><view class="field"><text>有效期至</text><picker mode="date" :value="form.validUntil" @change="form.validUntil=$event.detail.value"><view class="picker">{{form.validUntil||'请选择日期'}}<text>›</text></view></picker></view><view class="field"><text>税率(%)</text><input :value="form.taxRate===undefined?'':String(form.taxRate)" type="digit" @input="form.taxRate=Number($event.detail.value||0)"/></view><view class="section">产品清单</view><view class="summary">物料总金额:¥{{Number(form.totalProductPrice||0).toFixed(2)}} 报价金额:¥{{Number(form.totalPrice||0).toFixed(2)}}</view><view class="field"><text>整单折扣(%)</text><input :value="String(form.discountPercent||0)" type="digit" @input="form.discountPercent=Number($event.detail.value||0);recalc()"/></view><view v-for="(x,index) in form.items" :key="index" class="product"><view><text>产品 {{index+1}}</text><text @click="form.items?.splice(index,1);recalc()">删除</text></view><view class="field"><text>物料 <text class="required">*</text></text><picker :range="materialOptions" @change="selectProduct(x,materials[Number($event.detail.value)])"><view class="picker">{{productText(x)}}<text>›</text></view></picker></view><view class="field"><text>报价单价 <text class="required">*</text></text><input :value="String(x.quotationPrice||0)" type="digit" @input="x.quotationPrice=Number($event.detail.value||0);productAmount(x)"/></view><view class="field"><text>数量 <text class="required">*</text></text><input :value="String(x.count||0)" type="digit" @input="x.count=Number($event.detail.value||0);productAmount(x)"/></view><text class="subtotal">小计:¥{{Number(x.totalPrice||0).toFixed(2)}} {{x.itemUnitName||''}}</text></view><button class="add" @click="add">添加产品</button><view class="field column"><text>备注</text><textarea v-model="form.remark" placeholder="请输入备注"></textarea></view></view><button class="save" :loading="saving" @click="save">保存</button></view></template><style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.card{overflow:hidden;background:#fff;border-radius:16rpx}.section{padding:22rpx 24rpx 12rpx;color:#1769d8;font-size:25rpx;font-weight:600;background:#f8fbff}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text{width:190rpx;color:#33455d;font-size:27rpx}.required{color:#e34b4b}.field input,.field picker,.picker{flex:1;color:#1e3049;font-size:27rpx}.picker{display:flex;justify-content:space-between;color:#65758a}.picker text{color:#8092a7;font-size:36rpx}.summary{padding:20rpx 24rpx;color:#1769d8;font-size:25rpx}.product{margin:0 20rpx 20rpx;background:#f7f9fc;border-radius:12rpx;overflow:hidden}.product>view:first-child{display:flex;justify-content:space-between;padding:18rpx 16rpx;color:#33455d;font-size:26rpx}.product>view:first-child text:last-child{color:#c65050}.product .field{padding:0 16rpx}.subtotal{display:block;padding:18rpx 16rpx;color:#1769d8;font-size:25rpx;text-align:right}.add{margin:0 24rpx 20rpx;color:#1769d8;background:#f5f8ff;border:1rpx solid #8ab3ee}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text{width:auto}.column textarea{width:100%;height:130rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;background:#1769d8;border-radius:12rpx;font-size:30rpx}.save::after,.add::after{border:0}</style>
</script><template><view class="page"><view class="card"><view class="section">基本信息</view><view class="field"><text>报价单名称 <text class="required">*</text></text><input v-model="form.name" placeholder="请输入报价单名称"/></view><view class="field"><text>报价单号</text><input :value="form.no" disabled placeholder="保存时自动生成"/></view><view class="field"><text>客户 <text class="required">*</text></text><picker :range="customers" range-key="name" @change="selectCustomer(Number($event.detail.value))"><view class="picker">{{form.customerName||label(customers,form.customerId)}}<text>›</text></view></picker></view><view class="field"><text>商机</text><picker :range="businesses.filter(x=>x.customerId===form.customerId)" range-key="name" @change="form.businessId=businesses.filter(x=>x.customerId===form.customerId)[Number($event.detail.value)].id;form.businessName=businesses.filter(x=>x.customerId===form.customerId)[Number($event.detail.value)].name"><view class="picker">{{form.businessName||'请选择商机'}}<text>›</text></view></picker></view><view class="field"><text>联系人</text><picker :range="contacts.filter(x=>x.customerId===form.customerId)" range-key="name" @change="form.contactId=contacts.filter(x=>x.customerId===form.customerId)[Number($event.detail.value)].id;form.contactName=contacts.filter(x=>x.customerId===form.customerId)[Number($event.detail.value)].name"><view class="picker">{{form.contactName||'请选择联系人'}}<text>›</text></view></picker></view><view class="field"><text>负责人 <text class="required">*</text></text><picker :range="users" range-key="nickname" @change="form.ownerUserId=users[Number($event.detail.value)].id;form.ownerUserName=users[Number($event.detail.value)].nickname"><view class="picker">{{form.ownerUserName||label(users,form.ownerUserId,'nickname')}}<text>›</text></view></picker></view><view class="field"><text>报价日期 <text class="required">*</text></text><picker mode="date" :value="form.quotationTime" @change="form.quotationTime=$event.detail.value"><view class="picker">{{form.quotationTime||'请选择日期'}}<text>›</text></view></picker></view><view class="field"><text>有效期至</text><picker mode="date" :value="form.validUntil" @change="form.validUntil=$event.detail.value"><view class="picker">{{form.validUntil||'请选择日期'}}<text>›</text></view></picker></view><view class="field"><text>税率(%)</text><input :value="form.taxRate===undefined?'':String(form.taxRate)" type="digit" @input="form.taxRate=Number($event.detail.value||0)"/></view><view class="section">产品清单</view><view class="summary">物料总金额:¥{{Number(form.totalProductPrice||0).toFixed(2)}} 报价金额:¥{{Number(form.totalPrice||0).toFixed(2)}}</view><view class="field"><text>整单折扣(%)</text><input :value="String(form.discountPercent||0)" type="digit" @input="form.discountPercent=Number($event.detail.value||0);recalc()"/></view><view v-for="(x,index) in form.items" :key="index" class="product"><view><text>产品 {{index+1}}</text><text @click="form.items?.splice(index,1);recalc()">删除</text></view><view class="field"><text>物料 <text class="required">*</text></text><picker :range="materialOptions" @change="selectProduct(x,materials[Number($event.detail.value)])"><view class="picker">{{productText(x)}}<text>›</text></view></picker></view><view class="field"><text>报价单价 <text class="required">*</text></text><input :value="String(x.quotationPrice||0)" type="digit" @input="x.quotationPrice=Number($event.detail.value||0);productAmount(x)"/></view><view class="field"><text>数量 <text class="required">*</text></text><input :value="String(x.count||0)" type="digit" @input="x.count=Number($event.detail.value||0);productAmount(x)"/></view><text class="subtotal">小计:¥{{Number(x.totalPrice||0).toFixed(2)}} {{x.itemUnitName||''}}</text></view><button class="add" @click="add">添加产品</button><view class="field column"><text>备注</text><textarea v-model="form.remark" placeholder="请输入备注"></textarea></view></view><button class="save" :loading="saving" @click="save">保存</button></view></template><style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.card{overflow:hidden;background:#fff;border-radius:16rpx}.section{padding:22rpx 24rpx 12rpx;color:var(--color-primary, #1769d8);font-size:25rpx;font-weight:600;background:#f8fbff}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text{width:190rpx;color:#33455d;font-size:27rpx}.required{color:#e34b4b}.field input,.field picker,.picker{flex:1;color:#1e3049;font-size:27rpx}.picker{display:flex;justify-content:space-between;color:#65758a}.picker text{color:#8092a7;font-size:36rpx}.summary{padding:20rpx 24rpx;color:var(--color-primary, #1769d8);font-size:25rpx}.product{margin:0 20rpx 20rpx;background:#f7f9fc;border-radius:12rpx;overflow:hidden}.product>view:first-child{display:flex;justify-content:space-between;padding:18rpx 16rpx;color:#33455d;font-size:26rpx}.product>view:first-child text:last-child{color:#c65050}.product .field{padding:0 16rpx}.subtotal{display:block;padding:18rpx 16rpx;color:var(--color-primary, #1769d8);font-size:25rpx;text-align:right}.add{margin:0 24rpx 20rpx;color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee)}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text{width:auto}.column textarea{width:100%;height:130rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;background:var(--color-primary, #1769d8);border-radius:12rpx;font-size:30rpx}.save::after,.add::after{border:0}</style>
src/pages/crm/sale-quotation/index.vue
@@ -172,9 +172,9 @@
    font-size: 27rpx;
  }
  .tabs .active {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-weight: 600;
    border-bottom: 4rpx solid #1769d8;
    border-bottom: 4rpx solid var(--color-primary, #1769d8);
  }
  .search {
    display: flex;
@@ -191,7 +191,7 @@
  }
  .search text {
    font-size: 24rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
  }
  .status {
    padding-bottom: 14rpx;
@@ -205,12 +205,12 @@
  }
  .status .active {
    color: #fff;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
  }
  .content {
    height: 0;
    flex: 1;
    padding-bottom: 150rpx;
    padding-bottom: 132rpx;
    box-sizing: border-box;
  }
  .row {
@@ -237,9 +237,9 @@
  }
  .tag {
    padding: 4rpx 10rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 21rpx;
    background: #edf5ff;
    background: var(--color-primary-soft, #edf5ff);
    border-radius: 7rpx;
  }
  .grid {
@@ -262,7 +262,7 @@
    grid-column: 1 / -1;
  }
  .grid .link {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
  }
  .actions {
    justify-content: flex-end;
@@ -272,11 +272,11 @@
    min-height: 48rpx;
    padding: 0 16rpx;
    margin: 0;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 22rpx;
    line-height: 46rpx;
    background: #f5f8ff;
    border: 1rpx solid #8ab3ee;
    background: var(--color-primary-soft, #f5f8ff);
    border: 1rpx solid var(--color-primary-border, #8ab3ee);
    border-radius: 10rpx;
  }
  .actions .danger {
@@ -303,7 +303,7 @@
    width: 220rpx;
    margin: 20rpx auto;
    color: #fff;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 12rpx;
  }
  .fab {
@@ -317,7 +317,7 @@
    color: #fff;
    font-size: 58rpx;
    line-height: 120rpx;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 50%;
  }
</style>
src/pages/energy/alert/index.vue
@@ -652,7 +652,7 @@
    margin: 18rpx 22rpx;
    color: #fff;
    font-size: 25rpx;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 12rpx;
  }
  .check-card button::after,
@@ -676,7 +676,7 @@
    border-radius: 999rpx;
  }
  .tabs .active {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-weight: 600;
    background: #eaf2ff;
  }
@@ -699,13 +699,13 @@
  }
  .search text {
    flex: none;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 24rpx;
  }
  .content {
    height: 0;
    flex: 1;
    padding-bottom: 150rpx;
    padding-bottom: 132rpx;
    box-sizing: border-box;
  }
  .field {
@@ -764,14 +764,14 @@
  .filter-actions button {
    flex: 1;
    margin: 0;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 25rpx;
    background: #edf5ff;
    background: var(--color-primary-soft, #edf5ff);
    border-radius: 12rpx;
  }
  .filter-actions button:first-child {
    color: #fff;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
  }
  .row {
    padding: 24rpx 22rpx 20rpx;
@@ -865,11 +865,11 @@
    min-height: 50rpx;
    padding: 0 16rpx;
    margin: 0;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 22rpx;
    line-height: 48rpx;
    background: #f5f8ff;
    border: 1rpx solid #8ab3ee;
    background: var(--color-primary-soft, #f5f8ff);
    border: 1rpx solid var(--color-primary-border, #8ab3ee);
    border-radius: 8rpx;
  }
  .actions .danger {
@@ -892,9 +892,9 @@
    color: #e34b4b;
  }
  .tag-blue {
    color: #1769d8;
    background: #eef6ff;
    border: 1rpx solid #c9e1ff;
    color: var(--color-primary, #1769d8);
    background: var(--color-primary-soft, #eef6ff);
    border: 1rpx solid var(--color-primary-border, #c9e1ff);
  }
  .tag-orange {
    color: #b06a00;
@@ -923,12 +923,10 @@
    display: flex;
    align-items: center;
    justify-content: center;
    width: 132rpx;
    height: 132rpx;
    min-height: 132rpx;
    width: 104rpx; height: 104rpx; min-height: 104rpx;
    padding: 0;
    margin: 0;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 50%;
    box-shadow: 0 12rpx 24rpx rgba(23, 105, 216, 0.3);
  }
@@ -1014,7 +1012,7 @@
    border-radius: 999rpx;
  }
  .recipient-list .active {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    background: #eaf2ff;
    border-color: #b9d7ff;
  }
@@ -1034,6 +1032,6 @@
  }
  .modal-actions button:last-child {
    color: #fff;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
  }
</style>
src/pages/energy/analysis/index.vue
@@ -189,5 +189,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.filter-compact{display:flex;align-items:center;gap:18rpx;flex:none;margin:20rpx 0 16rpx;padding:18rpx 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.filter-compact>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.filter-compact text:first-child{overflow:hidden;color:#20334c;font-size:27rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.filter-compact text:last-child{overflow:hidden;color:#78879b;font-size:23rpx;text-overflow:ellipsis;white-space:nowrap}.filter-compact button{flex:none;width:132rpx;height:58rpx;margin:0;color:#1769d8;font-size:24rpx;line-height:58rpx;background:#edf5ff;border-radius:999rpx}.filter-compact button::after,.sheet-actions button::after{border:0}.filters{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:82rpx;padding:0 22rpx;gap:18rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:150rpx;flex:none;color:#33455d;font-size:25rpx}.field input,.field picker,.picker{min-width:0;flex:1;color:#1e3049;font-size:25rpx}.field input{text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:34rpx;text-align:right}.clear{flex:none!important;width:auto!important;color:#1769d8!important;font-size:22rpx!important}.filter-mask{position:fixed;inset:0;z-index:30;display:flex;align-items:flex-end;background:rgba(21,34,50,.42)}.filter-sheet{width:100%;max-height:82vh;display:flex;flex-direction:column;overflow:hidden;background:#f3f6fb;border-radius:24rpx 24rpx 0 0}.sheet-head{display:flex;align-items:center;justify-content:space-between;padding:28rpx 30rpx;color:#20334c;font-size:31rpx;font-weight:700;background:#fff}.sheet-head text:last-child{color:#7f8fa4;font-size:42rpx;font-weight:400}.sheet-body{max-height:58vh;padding:20rpx 30rpx;box-sizing:border-box}.sheet-actions{display:flex;gap:16rpx;padding:18rpx 30rpx calc(18rpx + env(safe-area-inset-bottom));background:#fff}.sheet-actions button{flex:1;margin:0;color:#1769d8;font-size:28rpx;background:#edf5ff;border-radius:12rpx}.sheet-actions button:last-child{color:#fff;background:#1769d8}.content{height:0;flex:1;padding-bottom:40rpx;box-sizing:border-box}.summary-card{display:grid;grid-template-columns:1fr 1fr;gap:16rpx;margin-bottom:18rpx}.summary-card>view{display:grid;gap:10rpx;padding:24rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.summary-card text:first-child{color:#66778c;font-size:23rpx}.summary-card text:last-child{color:#20334c;font-size:32rpx;font-weight:700}.section-title{margin:24rpx 4rpx 14rpx;color:#20334c;font-size:30rpx;font-weight:700}.card,.chart-card,.detail-row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status,.pill{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx;padding-top:16rpx;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tabs{width:calc(100% + 60rpx);margin:0 -30rpx 16rpx;white-space:nowrap}.tab-list{display:flex;gap:12rpx;padding:0 30rpx}.tab-list text{flex:none;padding:10rpx 22rpx;color:#53677f;font-size:24rpx;background:#fff;border-radius:999rpx}.tab-list .active{color:#1769d8;font-weight:600;background:#eaf2ff}.bar-row{display:grid;grid-template-columns:150rpx 1fr 170rpx;align-items:center;gap:14rpx;margin-bottom:18rpx;color:#66778c;font-size:22rpx}.bar-row>text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bar-row>text:last-child{text-align:right}.bar-row>view{height:18rpx;overflow:hidden;background:#eef3f8;border-radius:999rpx}.bar-row>view>view{height:100%;background:#1769d8;border-radius:999rpx}.bar-row.area>view>view{background:#27a3b8}.detail-row{display:grid;gap:8rpx;color:#66778c;font-size:23rpx}.detail-row>view{display:flex;align-items:center;justify-content:space-between;gap:12rpx;color:#20334c;font-size:27rpx;font-weight:600}.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:18rpx}.error{color:#c3654d}.tag-blue{color:#1769d8;background:#eef6ff;border:1rpx solid #c9e1ff}.tag-orange{color:#b06a00;background:#fff6df;border:1rpx solid #f0d390}.tag-green{color:#0e9663;background:#e9fbf2;border:1rpx solid #b8eed4}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.filter-compact{display:flex;align-items:center;gap:18rpx;flex:none;margin:20rpx 0 16rpx;padding:18rpx 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.filter-compact>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.filter-compact text:first-child{overflow:hidden;color:#20334c;font-size:27rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.filter-compact text:last-child{overflow:hidden;color:#78879b;font-size:23rpx;text-overflow:ellipsis;white-space:nowrap}.filter-compact button{flex:none;width:132rpx;height:58rpx;margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:58rpx;background:var(--color-primary-soft, #edf5ff);border-radius:999rpx}.filter-compact button::after,.sheet-actions button::after{border:0}.filters{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:82rpx;padding:0 22rpx;gap:18rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:150rpx;flex:none;color:#33455d;font-size:25rpx}.field input,.field picker,.picker{min-width:0;flex:1;color:#1e3049;font-size:25rpx}.field input{text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:34rpx;text-align:right}.clear{flex:none!important;width:auto!important;color:var(--color-primary, #1769d8)!important;font-size:22rpx!important}.filter-mask{position:fixed;inset:0;z-index:30;display:flex;align-items:flex-end;background:rgba(21,34,50,.42)}.filter-sheet{width:100%;max-height:82vh;display:flex;flex-direction:column;overflow:hidden;background:#f3f6fb;border-radius:24rpx 24rpx 0 0}.sheet-head{display:flex;align-items:center;justify-content:space-between;padding:28rpx 30rpx;color:#20334c;font-size:31rpx;font-weight:700;background:#fff}.sheet-head text:last-child{color:#7f8fa4;font-size:42rpx;font-weight:400}.sheet-body{max-height:58vh;padding:20rpx 30rpx;box-sizing:border-box}.sheet-actions{display:flex;gap:16rpx;padding:18rpx 30rpx calc(18rpx + env(safe-area-inset-bottom));background:#fff}.sheet-actions button{flex:1;margin:0;color:var(--color-primary, #1769d8);font-size:28rpx;background:var(--color-primary-soft, #edf5ff);border-radius:12rpx}.sheet-actions button:last-child{color:#fff;background:var(--color-primary, #1769d8)}.content{height:0;flex:1;padding-bottom:40rpx;box-sizing:border-box}.summary-card{display:grid;grid-template-columns:1fr 1fr;gap:16rpx;margin-bottom:18rpx}.summary-card>view{display:grid;gap:10rpx;padding:24rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.summary-card text:first-child{color:#66778c;font-size:23rpx}.summary-card text:last-child{color:#20334c;font-size:32rpx;font-weight:700}.section-title{margin:24rpx 4rpx 14rpx;color:#20334c;font-size:30rpx;font-weight:700}.card,.chart-card,.detail-row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status,.pill{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx;padding-top:16rpx;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tabs{width:calc(100% + 60rpx);margin:0 -30rpx 16rpx;white-space:nowrap}.tab-list{display:flex;gap:12rpx;padding:0 30rpx}.tab-list text{flex:none;padding:10rpx 22rpx;color:#53677f;font-size:24rpx;background:#fff;border-radius:999rpx}.tab-list .active{color:var(--color-primary, #1769d8);font-weight:600;background:#eaf2ff}.bar-row{display:grid;grid-template-columns:150rpx 1fr 170rpx;align-items:center;gap:14rpx;margin-bottom:18rpx;color:#66778c;font-size:22rpx}.bar-row>text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bar-row>text:last-child{text-align:right}.bar-row>view{height:18rpx;overflow:hidden;background:#eef3f8;border-radius:999rpx}.bar-row>view>view{height:100%;background:var(--color-primary, #1769d8);border-radius:999rpx}.bar-row.area>view>view{background:#27a3b8}.detail-row{display:grid;gap:8rpx;color:#66778c;font-size:23rpx}.detail-row>view{display:flex;align-items:center;justify-content:space-between;gap:12rpx;color:#20334c;font-size:27rpx;font-weight:600}.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:18rpx}.error{color:#c3654d}.tag-blue{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #eef6ff);border:1rpx solid var(--color-primary-border, #c9e1ff)}.tag-orange{color:#b06a00;background:#fff6df;border:1rpx solid #f0d390}.tag-green{color:#0e9663;background:#e9fbf2;border:1rpx solid #b8eed4}
</style>
src/pages/energy/record/form.vue
@@ -116,5 +116,5 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.section{padding:22rpx 24rpx 12rpx;color:#1769d8;font-size:25rpx;font-weight:600;background:#f8fbff}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:220rpx;flex:none;color:#33455d;font-size:27rpx}.required{color:#e34b4b}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:36rpx;text-align:right}.strong{color:#1769d8;font-weight:700}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:150rpx;box-sizing:border-box;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.save::after{border:0}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.section{padding:22rpx 24rpx 12rpx;color:var(--color-primary, #1769d8);font-size:25rpx;font-weight:600;background:#f8fbff}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:220rpx;flex:none;color:#33455d;font-size:27rpx}.required{color:#e34b4b}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:36rpx;text-align:right}.strong{color:var(--color-primary, #1769d8);font-weight:700}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:150rpx;box-sizing:border-box;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.save::after{border:0}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}
</style>
src/pages/energy/record/index.vue
@@ -103,5 +103,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.search text{flex:none;color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{overflow:hidden;color:#78879b;font-size:23rpx;text-overflow:ellipsis;white-space:nowrap}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx 18rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.tag-blue{color:#1769d8;background:#eef6ff;border:1rpx solid #c9e1ff}.tag-orange{color:#b06a00;background:#fff6df;border:1rpx solid #f0d390}.tag-green{color:#0e9663;background:#e9fbf2;border:1rpx solid #b8eed4}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.search text{flex:none;color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:0;flex:1;padding-bottom: 132rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{overflow:hidden;color:#78879b;font-size:23rpx;text-overflow:ellipsis;white-space:nowrap}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx 18rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.tag-blue{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #eef6ff);border:1rpx solid var(--color-primary-border, #c9e1ff)}.tag-orange{color:#b06a00;background:#fff6df;border:1rpx solid #f0d390}.tag-green{color:#0e9663;background:#e9fbf2;border:1rpx solid #b8eed4}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width: 104rpx; height: 104rpx; min-height: 104rpx;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/home/classic.vue
@@ -15,9 +15,11 @@
  import { APP_COMPANY } from "../../config/company";
  import { useAuth } from "../../stores/auth";
  import { useNotify } from "../../stores/notify";
  import { useAppTheme } from "../../stores/theme";
  const { state, isLoggedIn, restoreUser } = useAuth();
  const { state: notifyState, refreshUnreadCount } = useNotify();
  const { themeStyle } = useAppTheme();
  const summary = ref<HomeSummary | null>(null);
  const trend = ref<ProductionTrend[]>([]);
@@ -312,7 +314,7 @@
</script>
<template>
  <view class="page">
  <view class="page" :style="themeStyle">
    <view class="home-hero">
      <view class="topbar">
        <view class="welcome-copy">
@@ -490,10 +492,10 @@
    padding: calc(var(--status-bar-height) + 22rpx) 28rpx 156rpx;
    background: radial-gradient(
        circle at 86% 2%,
        rgba(67, 165, 255, 0.28),
        rgba(67, 165, 255, 0) 34%
        var(--color-primary-border, #bfdbff),
        transparent 34%
      ),
      linear-gradient(180deg, #dbeeff 0%, #edf6ff 34%, #f3f7fb 62%, #eef3f9 100%);
      linear-gradient(180deg, var(--color-primary-soft, #eef5ff) 0%, #f7f8fc 42%, #f3f7fb 68%, #eef3f9 100%);
  }
  .page,
  .page view,
@@ -535,7 +537,7 @@
  .brand-name {
    display: inline-block;
    margin-bottom: 10rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 23rpx;
    font-weight: 700;
  }
@@ -655,7 +657,7 @@
  }
  .main-kpi text:nth-child(2) {
    margin-top: 3rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 53rpx;
    font-weight: 700;
    line-height: 1.12;
@@ -851,7 +853,7 @@
  .bar-fill {
    width: 58%;
    min-height: 8rpx;
    background: linear-gradient(180deg, #76aeff, #1d73e7);
    background: linear-gradient(180deg, var(--color-primary-light, #4b8ee8), var(--color-primary, #1769d8));
    border-radius: 8rpx 8rpx 3rpx 3rpx;
  }
  .bar-item text:last-child {
@@ -890,7 +892,7 @@
  }
  .status-row > view > view {
    height: 100%;
    background: linear-gradient(90deg, #72adff, #1d73e7);
    background: linear-gradient(90deg, var(--color-primary-light, #4b8ee8), var(--color-primary, #1769d8));
    border-radius: 12rpx;
  }
  .status-row > text:last-child {
@@ -940,8 +942,8 @@
    background: currentColor;
  }
  .blue {
    color: #246fd5;
    background: #e4efff;
    color: var(--color-primary, #1769d8);
    background: var(--color-primary-soft, #eef5ff);
  }
  .violet {
    color: #695bd8;
@@ -1080,7 +1082,7 @@
    color: #fff;
    font-size: 27rpx;
    line-height: 84rpx;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 42rpx;
  }
</style>
src/pages/hrm/HrmAttachmentField.vue
@@ -62,5 +62,5 @@
</template>
<style lang="scss" scoped>
.attachment-field{width:100%;padding:20rpx 0;border-bottom:1rpx solid #edf0f4}.attachment-head{display:flex;align-items:center;justify-content:space-between;color:#30445f;font-size:27rpx}.attachment-head button{width:150rpx;height:56rpx;margin:0;color:#1769d8;font-size:23rpx;line-height:54rpx;background:#f3f7fd;border:1rpx solid #b9d1f2;border-radius:8rpx}.attachment-head button::after{border:0}.attachment-list{margin-top:12rpx}.attachment-item{display:flex;align-items:center;justify-content:space-between;gap:20rpx;padding:12rpx 0;color:#526780;font-size:24rpx}.attachment-item>text:first-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.remove{flex:none;color:#cf4d4d}.empty{display:block;margin-top:14rpx;color:#9aa7b8;font-size:24rpx}
.attachment-field{width:100%;padding:20rpx 0;border-bottom:1rpx solid #edf0f4}.attachment-head{display:flex;align-items:center;justify-content:space-between;color:#30445f;font-size:27rpx}.attachment-head button{width:150rpx;height:56rpx;margin:0;color:var(--color-primary, #1769d8);font-size:23rpx;line-height:54rpx;background:#f3f7fd;border:1rpx solid #b9d1f2;border-radius:8rpx}.attachment-head button::after{border:0}.attachment-list{margin-top:12rpx}.attachment-item{display:flex;align-items:center;justify-content:space-between;gap:20rpx;padding:12rpx 0;color:#526780;font-size:24rpx}.attachment-item>text:first-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.remove{flex:none;color:#cf4d4d}.empty{display:block;margin-top:14rpx;color:#9aa7b8;font-size:24rpx}
</style>
src/pages/hrm/attendance-exception/index.vue
@@ -1,7 +1,39 @@
<script setup lang="ts">
import{computed,ref}from"vue";import{onPullDownRefresh,onShow}from"@dcloudio/uni-app";import{getAttendanceExceptionPage,submitAttendanceException,getAttendanceExceptionProcesses,type AttendanceException,type ApproveProcess}from"../../../api/hrm";import{useAuth}from"../../../stores/auth";import PickerSheet from"../../mes/process-design/components/PickerSheet.vue";import{confirm,toast}from"../shared";
const{hasPermission,state}=useAuth();const rows=ref<AttendanceException[]>([]),processes=ref<ApproveProcess[]>([]),processVisible=ref(false),active=ref<AttendanceException>(),loading=ref(false);const canQuery=computed(()=>hasPermission("hrm:attendance-exception:query"));
async function load(){if(!state.accessToken||!canQuery.value)return;loading.value=true;try{const[d,p]=await Promise.all([getAttendanceExceptionPage(state.accessToken,{pageNo:1,pageSize:100}),getAttendanceExceptionProcesses(state.accessToken)]);rows.value=d.list||[];processes.value=p;}catch(e){toast(e instanceof Error?e.message:"加载失败");}finally{loading.value=false;uni.stopPullDownRefresh();}}
function submit(row:AttendanceException){active.value=row;if(processes.value.length===1)doSubmit(processes.value[0].key);else processVisible.value=true;}async function doSubmit(key:string|number){if(!state.accessToken||!active.value?.id||!await confirm("确认提交考勤异常审批?"))return;try{await submitAttendanceException(state.accessToken,active.value.id,String(key));toast("提交成功");processVisible.value=false;await load();}catch(e){toast(e instanceof Error?e.message:"提交失败");}}
onShow(load);onPullDownRefresh(load);
</script><template><view class="page"><template v-if="canQuery"><view v-for="row in rows" :key="row.id" class="card" @click="uni.navigateTo({url:`/pages/hrm/attendance-exception/form?id=${row.id}&detail=1`})"><view class="head"><view class="head-main"><text class="name">{{row.userName||'--'}}</text><text class="sub">{{row.deptName||'--'}} Â· {{row.date||'--'}}</text></view><text :class="['tag',row.status===20?'tag-green':row.status===10?'tag-blue':'tag-gray']">{{row.status===0?'草稿':row.status===10?'审批中':row.status===20?'已通过':'已结束'}}</text></view><view class="grid"><text>异常类型:{{row.exceptionTypeName||row.exceptionType||'--'}}</text><text>原因:{{row.reason||'--'}}</text><text>备注:{{row.remark||'--'}}</text></view><view class="actions" @click.stop><button @click="uni.navigateTo({url:`/pages/hrm/attendance-exception/form?id=${row.id}&detail=1`})">查看</button><button v-if="row.status===0&&hasPermission('hrm:attendance-exception:submit')" @click="submit(row)">提交</button></view></view><view v-if="!rows.length" class="state">{{loading?'加载中...':'暂无考勤异常申请'}}</view><button v-if="hasPermission('hrm:attendance-exception:create')" class="fab" @click="uni.navigateTo({url:'/pages/hrm/attendance-exception/form'})"><view/></button></template><view v-else class="state">暂无考勤异常查看权限</view><PickerSheet v-model:show="processVisible" title="选择审批流程" :items="processes.map(x=>({key:x.key,label:x.name}))" :selected-keys="[]" @confirm="k=>doSubmit(k[0])"/></view></template><style scoped lang="scss">@import "../list.scss";</style>
import { computed, ref } from "vue";
import { onPullDownRefresh, onReachBottom, onShow } from "@dcloudio/uni-app";
import { getAttendanceExceptionPage, submitAttendanceException, getAttendanceExceptionProcesses, type AttendanceException, type ApproveProcess } from "../../../api/hrm";
import { useAuth } from "../../../stores/auth";
import PickerSheet from "../../mes/process-design/components/PickerSheet.vue";
import { confirm, toast } from "../shared";
const { hasPermission, state } = useAuth();
const rows = ref<AttendanceException[]>([]), processes = ref<ApproveProcess[]>([]), processVisible = ref(false), active = ref<AttendanceException>(), loading = ref(false), pageNo = ref(1), total = ref(0);
const pageSize = 15;
const canQuery = computed(() => hasPermission("hrm:attendance-exception:query"));
const hasMore = computed(() => rows.value.length < total.value);
async function load(reset = true) {
  if (!state.accessToken || !canQuery.value || loading.value) return;
  if (reset) { pageNo.value = 1; total.value = 0; }
  loading.value = true;
  try {
    const data = await getAttendanceExceptionPage(state.accessToken, { pageNo: pageNo.value, pageSize });
    rows.value = reset ? (data.list || []) : [...rows.value, ...(data.list || [])];
    total.value = Number(data.total || 0);
    if (rows.value.length < total.value) pageNo.value += 1;
    if (reset) processes.value = await getAttendanceExceptionProcesses(state.accessToken);
  } catch (error) { toast(error instanceof Error ? error.message : "加载失败"); }
  finally { loading.value = false; uni.stopPullDownRefresh(); }
}
function submit(row: AttendanceException) {
  active.value = row;
  if (processes.value.length === 1) doSubmit(processes.value[0].key);
  else processVisible.value = true;
}
async function doSubmit(key: string | number) {
  if (!state.accessToken || !active.value?.id || !await confirm("确认提交考勤异常审批?")) return;
  try { await submitAttendanceException(state.accessToken, active.value.id, String(key)); toast("提交成功"); processVisible.value = false; await load(true); }
  catch (error) { toast(error instanceof Error ? error.message : "提交失败"); }
}
onShow(() => load(true));
onPullDownRefresh(() => load(true));
onReachBottom(() => { if (hasMore.value) load(false); });
</script><template><view class="page"><template v-if="canQuery"><view v-for="row in rows" :key="row.id" class="card" @click="uni.navigateTo({url:`/pages/hrm/attendance-exception/form?id=${row.id}&detail=1`})"><view class="head"><view class="head-main"><text class="name">{{row.userName||'--'}}</text><text class="sub">{{row.deptName||'--'}} Â· {{row.date||'--'}}</text></view><text :class="['tag',row.status===20?'tag-green':row.status===10?'tag-blue':'tag-gray']">{{row.status===0?'草稿':row.status===10?'审批中':row.status===20?'已通过':'已结束'}}</text></view><view class="grid"><text>异常类型:{{row.exceptionTypeName||row.exceptionType||'--'}}</text><text>原因:{{row.reason||'--'}}</text><text>备注:{{row.remark||'--'}}</text></view><view class="actions" @click.stop><button @click="uni.navigateTo({url:`/pages/hrm/attendance-exception/form?id=${row.id}&detail=1`})">查看</button><button v-if="row.status===0&&hasPermission('hrm:attendance-exception:submit')" @click="submit(row)">提交</button></view></view><view v-if="!rows.length" class="state">{{loading?'加载中...':'暂无考勤异常申请'}}</view><view v-else class="state more">{{loading ? "加载中..." : hasMore ? "上拉加载更多" : "没有更多了"}}</view><button v-if="hasPermission('hrm:attendance-exception:create')" class="fab" @click="uni.navigateTo({url:'/pages/hrm/attendance-exception/form'})"><view/></button></template><view v-else class="state">暂无考勤异常查看权限</view><PickerSheet v-model:show="processVisible" title="选择审批流程" :items="processes.map(x=>({key:x.key,label:x.name}))" :selected-keys="[]" @confirm="k=>doSubmit(k[0])"/></view></template><style scoped lang="scss">@import "../list.scss";</style>
src/pages/hrm/attendance-holiday/index.vue
@@ -1,5 +1,5 @@
<script setup lang="ts">
import HrmCrudPage, { type CrudConfig } from "../components/HrmCrudPage.vue";
import { createHoliday, deleteHoliday, getHolidayPage, updateHoliday } from "../../../api/hrm";
const config: CrudConfig = { title:"节假日", permission:"hrm:attendance-holiday", fields:[{key:"name",label:"节假日名称",required:true},{key:"startDate",label:"开始日期",required:true},{key:"endDate",label:"结束日期",required:true},{key:"type",label:"类型",type:"number"},{key:"isLegal",label:"法定节假日",type:"number"},{key:"remark",label:"备注"}], cardFields:[{key:"name",label:"名称"},{key:"startDate",label:"开始日期"},{key:"endDate",label:"结束日期"},{key:"typeName",label:"类型"},{key:"isLegal",label:"是否法定"}], load:(t,k)=>getHolidayPage(t,{pageNo:1,pageSize:100,name:k||undefined}), create:createHoliday, update:updateHoliday, remove:deleteHoliday };
const config: CrudConfig = { title:"节假日", permission:"hrm:attendance-holiday", fields:[{key:"name",label:"节假日名称",required:true},{key:"startDate",label:"开始日期",required:true},{key:"endDate",label:"结束日期",required:true},{key:"type",label:"类型",type:"number"},{key:"isLegal",label:"法定节假日",type:"number"},{key:"remark",label:"备注"}], cardFields:[{key:"name",label:"名称"},{key:"startDate",label:"开始日期"},{key:"endDate",label:"结束日期"},{key:"typeName",label:"类型"},{key:"isLegal",label:"是否法定"}], page:true, load:(t,k,p,s)=>getHolidayPage(t,{pageNo:p,pageSize:s,name:k||undefined}), create:createHoliday, update:updateHoliday, remove:deleteHoliday };
</script><template><HrmCrudPage :config="config" /></template>
src/pages/hrm/attendance-record/index.vue
@@ -1,7 +1,27 @@
<script setup lang="ts">
import { computed, ref } from "vue"; import { onPullDownRefresh, onShow } from "@dcloudio/uni-app";
import { getAttendanceRecordPage, type AttendanceRecord } from "../../../api/hrm"; import { useAuth } from "../../../stores/auth"; import { toast } from "../shared";
const {hasPermission,state}=useAuth(); const rows=ref<AttendanceRecord[]>([]), keyword=ref(""), loading=ref(false); const canQuery=computed(()=>hasPermission("hrm:attendance-record:query"));
async function load(){if(!state.accessToken||!canQuery.value||loading.value)return;loading.value=true;try{const d=await getAttendanceRecordPage(state.accessToken,{pageNo:1,pageSize:100,userName:keyword.value||undefined});rows.value=d.list||[];}catch(e){toast(e instanceof Error?e.message:"加载失败");}finally{loading.value=false;uni.stopPullDownRefresh();}}
onShow(load);onPullDownRefresh(load);
</script><template><view class="page"><template v-if="canQuery"><view class="search"><input v-model="keyword" placeholder="搜索员工姓名" @confirm="load"/><text @click="load">搜索</text></view><view v-for="row in rows" :key="row.id" class="card"><view class="head"><view class="head-main"><text class="name">{{row.userName||'--'}}</text><text class="sub">{{row.deptName||'--'}} Â· {{row.date||'--'}}</text></view><text class="tag tag-blue">{{row.dataSourceName||'考勤'}}</text></view><view class="grid"><text>上班:{{row.clockInTime||'--'}}</text><text>下班:{{row.clockOutTime||'--'}}</text><text>上班状态:{{row.clockInTypeName||'--'}}</text><text>下班状态:{{row.clockOutTypeName||'--'}}</text><text>工时:{{row.workHours??0}} å°æ—¶</text><text>加班:{{row.overtimeHours??0}} å°æ—¶</text><text>地点:{{row.location||'--'}}</text></view></view><view v-if="!rows.length" class="state">{{loading?'加载中...':'暂无考勤记录'}}</view></template><view v-else class="state">暂无考勤记录查看权限</view></view></template><style scoped lang="scss">@import "../list.scss";</style>
import { computed, ref } from "vue";
import { onPullDownRefresh, onReachBottom, onShow } from "@dcloudio/uni-app";
import { getAttendanceRecordPage, type AttendanceRecord } from "../../../api/hrm";
import { useAuth } from "../../../stores/auth";
import { toast } from "../shared";
const { hasPermission, state } = useAuth();
const rows = ref<AttendanceRecord[]>([]), keyword = ref(""), loading = ref(false), pageNo = ref(1), total = ref(0);
const pageSize = 15;
const canQuery = computed(() => hasPermission("hrm:attendance-record:query"));
const hasMore = computed(() => rows.value.length < total.value);
async function load(reset = true) {
  if (!state.accessToken || !canQuery.value || loading.value) return;
  if (reset) { pageNo.value = 1; total.value = 0; }
  loading.value = true;
  try {
    const data = await getAttendanceRecordPage(state.accessToken, { pageNo: pageNo.value, pageSize, userName: keyword.value || undefined });
    rows.value = reset ? (data.list || []) : [...rows.value, ...(data.list || [])];
    total.value = Number(data.total || 0);
    if (rows.value.length < total.value) pageNo.value += 1;
  } catch (error) { toast(error instanceof Error ? error.message : "加载失败"); }
  finally { loading.value = false; uni.stopPullDownRefresh(); }
}
onShow(() => load(true));
onPullDownRefresh(() => load(true));
onReachBottom(() => { if (hasMore.value) load(false); });
</script><template><view class="page"><template v-if="canQuery"><view class="search"><input v-model="keyword" placeholder="搜索员工姓名" @confirm="load"/><text @click="load">搜索</text></view><view v-for="row in rows" :key="row.id" class="card"><view class="head"><view class="head-main"><text class="name">{{row.userName||'--'}}</text><text class="sub">{{row.deptName||'--'}} Â· {{row.date||'--'}}</text></view><text class="tag tag-blue">{{row.dataSourceName||'考勤'}}</text></view><view class="grid"><text>上班:{{row.clockInTime||'--'}}</text><text>下班:{{row.clockOutTime||'--'}}</text><text>上班状态:{{row.clockInTypeName||'--'}}</text><text>下班状态:{{row.clockOutTypeName||'--'}}</text><text>工时:{{row.workHours??0}} å°æ—¶</text><text>加班:{{row.overtimeHours??0}} å°æ—¶</text><text>地点:{{row.location||'--'}}</text></view></view><view v-if="!rows.length" class="state">{{loading?'加载中...':'暂无考勤记录'}}</view><view v-else class="state more">{{loading ? "加载中..." : hasMore ? "上拉加载更多" : "没有更多了"}}</view></template><view v-else class="state">暂无考勤记录查看权限</view></view></template><style scoped lang="scss">@import "../list.scss";</style>
src/pages/hrm/attendance-rule/index.vue
@@ -1,5 +1,5 @@
<script setup lang="ts">
import HrmCrudPage, { type CrudConfig } from "../components/HrmCrudPage.vue";
import { createAttendanceRule, deleteAttendanceRule, getAttendanceRulePage, updateAttendanceRule } from "../../../api/hrm";
const config: CrudConfig = { title:"考勤规则", permission:"hrm:attendance-rule", fields:[{key:"name",label:"规则名称",required:true},{key:"deptId",label:"部门ID",type:"number"},{key:"workStartTime",label:"上班时间",required:true},{key:"workEndTime",label:"下班时间",required:true},{key:"lateAllowMinutes",label:"迟到宽限(分钟)",type:"number"},{key:"earlyAllowMinutes",label:"早退宽限(分钟)",type:"number"},{key:"overtimeThreshold",label:"加班起算(分钟)",type:"number"},{key:"locationName",label:"打卡地点"},{key:"locationAddress",label:"地点地址"},{key:"longitude",label:"经度",type:"number"},{key:"latitude",label:"纬度",type:"number"},{key:"radiusMeters",label:"有效范围(ç±³)",type:"number"},{key:"locationRequired",label:"必须在范围内",type:"switch"},{key:"remark",label:"备注"}], cardFields:[{key:"name",label:"名称"},{key:"deptName",label:"部门"},{key:"workStartTime",label:"上班"},{key:"workEndTime",label:"下班"},{key:"locationName",label:"打卡地点"},{key:"radiusMeters",label:"范围(ç±³)"}], load:(t,k)=>getAttendanceRulePage(t,{pageNo:1,pageSize:100,name:k||undefined}), create:createAttendanceRule, update:updateAttendanceRule, remove:deleteAttendanceRule };
const config: CrudConfig = { title:"考勤规则", permission:"hrm:attendance-rule", fields:[{key:"name",label:"规则名称",required:true},{key:"deptId",label:"部门ID",type:"number"},{key:"workStartTime",label:"上班时间",required:true},{key:"workEndTime",label:"下班时间",required:true},{key:"lateAllowMinutes",label:"迟到宽限(分钟)",type:"number"},{key:"earlyAllowMinutes",label:"早退宽限(分钟)",type:"number"},{key:"overtimeThreshold",label:"加班起算(分钟)",type:"number"},{key:"locationName",label:"打卡地点"},{key:"locationAddress",label:"地点地址"},{key:"longitude",label:"经度",type:"number"},{key:"latitude",label:"纬度",type:"number"},{key:"radiusMeters",label:"有效范围(ç±³)",type:"number"},{key:"locationRequired",label:"必须在范围内",type:"switch"},{key:"remark",label:"备注"}], cardFields:[{key:"name",label:"名称"},{key:"deptName",label:"部门"},{key:"workStartTime",label:"上班"},{key:"workEndTime",label:"下班"},{key:"locationName",label:"打卡地点"},{key:"radiusMeters",label:"范围(ç±³)"}], page:true, load:(t,k,p,s)=>getAttendanceRulePage(t,{pageNo:p,pageSize:s,name:k||undefined}), create:createAttendanceRule, update:updateAttendanceRule, remove:deleteAttendanceRule };
</script><template><HrmCrudPage :config="config" /></template>
src/pages/hrm/attendance-summary/index.vue
@@ -1,8 +1,32 @@
<script setup lang="ts">
import { computed, ref } from "vue"; import { onPullDownRefresh, onShow } from "@dcloudio/uni-app";
import { generateAttendanceSummary,getAttendanceSummaryPage,type AttendanceSummary } from "../../../api/hrm"; import { useAuth } from "../../../stores/auth"; import { confirm,toast } from "../shared";
const {hasPermission,state}=useAuth(); const rows=ref<AttendanceSummary[]>([]),period=ref(new Date().toISOString().slice(0,7)),loading=ref(false); const canQuery=computed(()=>hasPermission("hrm:attendance-summary:query"));
async function load(){if(!state.accessToken||!canQuery.value)return;loading.value=true;try{const d=await getAttendanceSummaryPage(state.accessToken,{pageNo:1,pageSize:100,yearMonth:period.value});rows.value=d.list||[];}catch(e){toast(e instanceof Error?e.message:"加载失败");}finally{loading.value=false;uni.stopPullDownRefresh();}}
async function generate(){if(!state.accessToken||!await confirm(`确认重新生成 ${period.value} è€ƒå‹¤æ±‡æ€»ï¼Ÿ`))return;try{await generateAttendanceSummary(state.accessToken,{yearMonth:period.value});toast("生成成功");await load();}catch(e){toast(e instanceof Error?e.message:"生成失败");}}
onShow(load);onPullDownRefresh(load);
</script><template><view class="page"><template v-if="canQuery"><view class="search"><input v-model="period" placeholder="统计月份 YYYY-MM" @confirm="load"/><text @click="load">查询</text></view><view v-if="hasPermission('hrm:attendance-summary:generate')" class="top-actions"><button @click="generate">生成月度汇总</button></view><view v-for="row in rows" :key="row.id" class="card"><view class="head"><view class="head-main"><text class="name">{{row.userName||'--'}}</text><text class="sub">{{row.deptName||'--'}} Â· {{row.yearMonth}}</text></view><text class="tag tag-green">{{row.actualDays??0}} / {{row.workDays??0}} å¤©</text></view><view class="grid"><text>迟到:{{row.lateCount??0}} æ¬¡</text><text>早退:{{row.earlyCount??0}} æ¬¡</text><text>缺勤:{{row.absentCount??0}} æ¬¡</text><text>加班:{{row.overtimeHours??0}} å°æ—¶</text><text>请假:{{row.leaveHours??0}} å°æ—¶</text></view></view><view v-if="!rows.length" class="state">{{loading?'加载中...':'暂无考勤汇总'}}</view></template><view v-else class="state">暂无考勤汇总查看权限</view></view></template><style scoped lang="scss">@import "../list.scss";.top-actions{display:flex;justify-content:flex-end;margin-bottom:18rpx}.top-actions button{margin:0;color:#1769d8;font-size:24rpx;background:#fff}</style>
import { computed, ref } from "vue";
import { onPullDownRefresh, onReachBottom, onShow } from "@dcloudio/uni-app";
import { generateAttendanceSummary, getAttendanceSummaryPage, type AttendanceSummary } from "../../../api/hrm";
import { useAuth } from "../../../stores/auth";
import { confirm, toast } from "../shared";
const { hasPermission, state } = useAuth();
const rows = ref<AttendanceSummary[]>([]), period = ref(new Date().toISOString().slice(0, 7)), loading = ref(false), pageNo = ref(1), total = ref(0);
const pageSize = 15;
const canQuery = computed(() => hasPermission("hrm:attendance-summary:query"));
const hasMore = computed(() => rows.value.length < total.value);
async function load(reset = true) {
  if (!state.accessToken || !canQuery.value || loading.value) return;
  if (reset) { pageNo.value = 1; total.value = 0; }
  loading.value = true;
  try {
    const data = await getAttendanceSummaryPage(state.accessToken, { pageNo: pageNo.value, pageSize, yearMonth: period.value });
    rows.value = reset ? (data.list || []) : [...rows.value, ...(data.list || [])];
    total.value = Number(data.total || 0);
    if (rows.value.length < total.value) pageNo.value += 1;
  } catch (error) { toast(error instanceof Error ? error.message : "加载失败"); }
  finally { loading.value = false; uni.stopPullDownRefresh(); }
}
async function generate() {
  if (!state.accessToken || !await confirm("确认重新生成 " + period.value + " è€ƒå‹¤æ±‡æ€»ï¼Ÿ")) return;
  try { await generateAttendanceSummary(state.accessToken, { yearMonth: period.value }); toast("生成成功"); await load(true); }
  catch (error) { toast(error instanceof Error ? error.message : "生成失败"); }
}
onShow(() => load(true));
onPullDownRefresh(() => load(true));
onReachBottom(() => { if (hasMore.value) load(false); });
</script><template><view class="page"><template v-if="canQuery"><view class="search"><input v-model="period" placeholder="统计月份 YYYY-MM" @confirm="load"/><text @click="load">查询</text></view><view v-if="hasPermission('hrm:attendance-summary:generate')" class="top-actions"><button @click="generate">生成月度汇总</button></view><view v-for="row in rows" :key="row.id" class="card"><view class="head"><view class="head-main"><text class="name">{{row.userName||'--'}}</text><text class="sub">{{row.deptName||'--'}} Â· {{row.yearMonth}}</text></view><text class="tag tag-green">{{row.actualDays??0}} / {{row.workDays??0}} å¤©</text></view><view class="grid"><text>迟到:{{row.lateCount??0}} æ¬¡</text><text>早退:{{row.earlyCount??0}} æ¬¡</text><text>缺勤:{{row.absentCount??0}} æ¬¡</text><text>加班:{{row.overtimeHours??0}} å°æ—¶</text><text>请假:{{row.leaveHours??0}} å°æ—¶</text></view></view><view v-if="!rows.length" class="state">{{loading?'加载中...':'暂无考勤汇总'}}</view><view v-else class="state more">{{loading ? "加载中..." : hasMore ? "上拉加载更多" : "没有更多了"}}</view></template><view v-else class="state">暂无考勤汇总查看权限</view></view></template><style scoped lang="scss">@import "../list.scss";.top-actions{display:flex;justify-content:flex-end;margin-bottom:18rpx}.top-actions button{margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;background:#fff}</style>
src/pages/hrm/components/HrmCrudPage.vue
@@ -1,6 +1,6 @@
<script setup lang="ts">
import { computed, ref } from "vue";
import { onPullDownRefresh, onShow } from "@dcloudio/uni-app";
import { onPullDownRefresh, onReachBottom, onShow } from "@dcloudio/uni-app";
import { useAuth } from "../../../stores/auth";
import { confirm, toast } from "../shared";
@@ -8,29 +8,39 @@
export interface CrudConfig {
  title: string; permission: string; fields: CrudField[]; cardFields: Array<{ key: string; label: string }>;
  defaultValue?: Record<string, unknown>; page?: boolean;
  load: (token: string, keyword: string) => Promise<unknown>;
  load: (token: string, keyword: string, pageNo: number, pageSize: number) => Promise<unknown>;
  create: (token: string, data: Record<string, unknown>) => Promise<unknown>;
  update: (token: string, data: Record<string, unknown>) => Promise<unknown>;
  remove: (token: string, id: number) => Promise<unknown>;
}
const props = defineProps<{ config: CrudConfig }>();
const { hasPermission, state } = useAuth();
const rows = ref<Record<string, unknown>[]>([]);
const keyword = ref(""); const loading = ref(false); const editing = ref(false); const submitting = ref(false);
const keyword = ref("");
const loading = ref(false);
const editing = ref(false);
const submitting = ref(false);
const pageNo = ref(1);
const total = ref(0);
const pageSize = 15;
const form = ref<Record<string, unknown>>({});
const canQuery = computed(() => hasPermission(`${props.config.permission}:query`));
const canCreate = computed(() => hasPermission(`${props.config.permission}:create`));
const canUpdate = computed(() => hasPermission(`${props.config.permission}:update`));
const canDelete = computed(() => hasPermission(`${props.config.permission}:delete`));
const hasMore = computed(() => props.config.page === true && rows.value.length < total.value);
function text(value: unknown) { if (value === true) return "是"; if (value === false) return "否"; return value === undefined || value === null || value === "" ? "--" : String(value); }
async function load() {
async function load(reset = true) {
  if (!state.accessToken || !canQuery.value || loading.value) return;
  if (reset) { pageNo.value = 1; total.value = 0; }
  loading.value = true;
  try {
    const result = await props.config.load(state.accessToken, keyword.value.trim());
    rows.value = Array.isArray(result) ? result : ((result as { list?: Record<string, unknown>[] })?.list || []);
    const result = await props.config.load(state.accessToken, keyword.value.trim(), pageNo.value, pageSize);
    const list = Array.isArray(result) ? result : ((result as { list?: Record<string, unknown>[] })?.list || []);
    rows.value = reset ? list : [...rows.value, ...list];
    total.value = Array.isArray(result) ? list.length : Number((result as { total?: number })?.total ?? rows.value.length);
    if (props.config.page === true && rows.value.length < total.value) pageNo.value += 1;
  } catch (error) { toast(error instanceof Error ? error.message : "加载失败"); }
  finally { loading.value = false; uni.stopPullDownRefresh(); }
}
@@ -42,28 +52,31 @@
  submitting.value = true;
  try {
    if (form.value.id) await props.config.update(state.accessToken, form.value); else await props.config.create(state.accessToken, form.value);
    toast("保存成功"); editing.value = false; await load();
    toast("保存成功"); editing.value = false; await load(true);
  } catch (error) { toast(error instanceof Error ? error.message : "保存失败"); }
  finally { submitting.value = false; }
}
async function remove(row: Record<string, unknown>) {
  if (!state.accessToken || !row.id || !await confirm(`确认删除该${props.config.title}记录?`)) return;
  try { await props.config.remove(state.accessToken, Number(row.id)); toast("删除成功"); await load(); }
  try { await props.config.remove(state.accessToken, Number(row.id)); toast("删除成功"); await load(true); }
  catch (error) { toast(error instanceof Error ? error.message : "删除失败"); }
}
onShow(load); onPullDownRefresh(load);
onShow(() => load(true));
onPullDownRefresh(() => load(true));
onReachBottom(() => { if (hasMore.value) load(false); });
</script>
<template>
  <view class="page">
    <template v-if="state.accessToken && canQuery">
      <view class="search"><input v-model="keyword" :placeholder="`搜索${config.title}`" confirm-type="search" @confirm="load" /><text @click="load">搜索</text></view>
      <view class="search"><input v-model="keyword" :placeholder="`搜索${config.title}`" confirm-type="search" @confirm="load(true)" /><text @click="load(true)">搜索</text></view>
      <view v-for="row in rows" :key="Number(row.id)" class="card">
        <view class="head"><view class="head-main"><text class="name">{{ text(row[config.cardFields[0]?.key]) }}</text><text class="sub">{{ config.title }}</text></view><text class="tag tag-blue">{{ row.status === 1 ? "停用" : "启用" }}</text></view>
        <view class="grid"><text v-for="item in config.cardFields.slice(1)" :key="item.key">{{ item.label }}:{{ text(row[item.key]) }}</text></view>
        <view class="actions"><button v-if="canUpdate" @click="open(row)">编辑</button><button v-if="canDelete" class="danger" @click="remove(row)">删除</button></view>
      </view>
      <view v-if="!rows.length" class="state">{{ loading ? "加载中..." : `暂无${config.title}数据` }}</view>
      <view v-else-if="config.page" class="state more">{{ loading ? "加载中..." : hasMore ? "上拉加载更多" : "没有更多了" }}</view>
      <button v-if="canCreate" class="fab" @click="open()"><view /></button>
    </template>
    <view v-else class="state">暂无{{ config.title }}查看权限</view>
src/pages/hrm/employee-social-security/index.vue
@@ -1,8 +1,51 @@
<script setup lang="ts">
import{computed,ref}from"vue";import{onPullDownRefresh,onShow}from"@dcloudio/uni-app";import{createEmployeeSocialSecurity,deleteEmployeeSocialSecurity,getEmployeeSimpleList,getEmployeeSocialSecurityHistory,getEmployeeSocialSecurityPage,getSocialSecuritySchemeList,updateEmployeeSocialSecurity,type EmployeeSimple,type EmployeeSocialSecurity,type SocialSecurityScheme}from"../../../api/hrm";import{useAuth}from"../../../stores/auth";import PickerSheet from"../../mes/process-design/components/PickerSheet.vue";import{confirm,money,toast}from"../shared";
const{hasPermission,state}=useAuth();const rows=ref<EmployeeSocialSecurity[]>([]),employees=ref<EmployeeSimple[]>([]),schemes=ref<SocialSecurityScheme[]>([]),form=ref<EmployeeSocialSecurity>({status:0}),editing=ref(false),employeeVisible=ref(false),schemeVisible=ref(false),history=ref<EmployeeSocialSecurity[]>([]),historyVisible=ref(false);const canQuery=computed(()=>hasPermission("hrm:employee-social-security:query"));
async function load(){if(!state.accessToken||!canQuery.value)return;try{const[d,e,s]=await Promise.all([getEmployeeSocialSecurityPage(state.accessToken,{pageNo:1,pageSize:100}),getEmployeeSimpleList(state.accessToken),getSocialSecuritySchemeList(state.accessToken)]);rows.value=d.list||[];employees.value=e;schemes.value=s;}catch(e){toast(e instanceof Error?e.message:"加载失败");}finally{uni.stopPullDownRefresh();}}
function open(row?:EmployeeSocialSecurity){form.value=row?{...row}:{status:0};editing.value=true;}async function save(){if(!state.accessToken||!form.value.userId||!form.value.socialSecuritySchemeId||!form.value.effectiveDate)return toast("请完整填写员工、方案和生效日期");try{form.value.id?await updateEmployeeSocialSecurity(state.accessToken,form.value):await createEmployeeSocialSecurity(state.accessToken,form.value);toast("保存成功");editing.value=false;await load();}catch(e){toast(e instanceof Error?e.message:"保存失败");}}
async function remove(row:EmployeeSocialSecurity){if(!state.accessToken||!row.id||!await confirm("确认删除该员工社保档案?"))return;try{await deleteEmployeeSocialSecurity(state.accessToken,row.id);toast("删除成功");await load();}catch(e){toast(e instanceof Error?e.message:"删除失败");}}
async function showHistory(row:EmployeeSocialSecurity){if(!state.accessToken||!row.userId)return;history.value=await getEmployeeSocialSecurityHistory(state.accessToken,row.userId);historyVisible.value=true;}onShow(load);onPullDownRefresh(load);
</script><template><view class="page"><template v-if="canQuery"><view v-for="row in rows" :key="row.id" class="card"><view class="head"><view class="head-main"><text class="name">{{row.userName||'--'}}</text><text class="sub">{{row.deptName||'--'}}</text></view><text :class="['tag',row.status===0?'tag-green':'tag-gray']">{{row.status===0?'生效':'停用'}}</text></view><view class="grid"><text>方案:{{row.schemeName||'--'}}</text><text>社保基数:{{money(row.socialSecurityBase)}}</text><text>公积金基数:{{money(row.housingFundBase)}}</text><text>生效日期:{{row.effectiveDate||'--'}}</text></view><view class="actions"><button @click="showHistory(row)">历史</button><button v-if="hasPermission('hrm:employee-social-security:update')" @click="open(row)">编辑</button><button v-if="hasPermission('hrm:employee-social-security:delete')" class="danger" @click="remove(row)">删除</button></view></view><button v-if="hasPermission('hrm:employee-social-security:create')" class="fab" @click="open()"><view/></button></template><view v-else class="state">暂无员工社保档案查看权限</view><view v-if="editing" class="panel"><view class="form-card"><view class="field"><text>员工</text><view class="picker" @click="employeeVisible=true"><text>{{employees.find(x=>x.id===form.userId)?.name||form.userName||'请选择'}}</text><text>›</text></view></view><view class="field"><text>社保方案</text><view class="picker" @click="schemeVisible=true"><text>{{schemes.find(x=>x.id===form.socialSecuritySchemeId)?.name||form.schemeName||'请选择'}}</text><text>›</text></view></view><view class="field"><text>社保基数</text><input v-model.number="form.socialSecurityBase" type="digit"/></view><view class="field"><text>公积金基数</text><input v-model.number="form.housingFundBase" type="digit"/></view><view class="field"><text>生效日期</text><input v-model="form.effectiveDate" placeholder="YYYY-MM-DD"/></view><view class="toolbar"><button @click="editing=false">取消</button><button @click="save">保存</button></view></view></view><view v-if="historyVisible" class="panel"><view class="form-card"><view class="section-title">社保档案历史</view><view v-for="item in history" :key="item.id" class="detail-row"><text>{{item.effectiveDate}}</text><text>{{item.schemeName}} / {{money(item.socialSecurityBase)}}</text></view><view class="toolbar"><button @click="historyVisible=false">关闭</button></view></view></view><PickerSheet v-model:show="employeeVisible" title="选择员工" :items="employees.map(x=>({key:x.id,label:x.name,sub:x.employeeNo}))" :selected-keys="form.userId?[form.userId]:[]" @confirm="k=>form.userId=Number(k[0])"/><PickerSheet v-model:show="schemeVisible" title="选择方案" :items="schemes.map(x=>({key:x.id||0,label:x.name||'--'}))" :selected-keys="form.socialSecuritySchemeId?[form.socialSecuritySchemeId]:[]" @confirm="k=>form.socialSecuritySchemeId=Number(k[0])"/></view></template><style scoped lang="scss">@import "../list.scss";@import "../form.scss";.panel{position:fixed;z-index:20;inset:0;padding:15vh 30rpx;background:rgba(20,30,45,.48)}.panel .form-card{max-height:70vh;overflow:auto}.field input{text-align:right}</style>
import { computed, ref } from "vue";
import { onPullDownRefresh, onReachBottom, onShow } from "@dcloudio/uni-app";
import { createEmployeeSocialSecurity, deleteEmployeeSocialSecurity, getEmployeeSimpleList, getEmployeeSocialSecurityHistory, getEmployeeSocialSecurityPage, getSocialSecuritySchemeList, updateEmployeeSocialSecurity, type EmployeeSimple, type EmployeeSocialSecurity, type SocialSecurityScheme } from "../../../api/hrm";
import { useAuth } from "../../../stores/auth";
import PickerSheet from "../../mes/process-design/components/PickerSheet.vue";
import { confirm, money, toast } from "../shared";
const { hasPermission, state } = useAuth();
const rows = ref<EmployeeSocialSecurity[]>([]), employees = ref<EmployeeSimple[]>([]), schemes = ref<SocialSecurityScheme[]>([]);
const form = ref<EmployeeSocialSecurity>({ status: 0 }), editing = ref(false), employeeVisible = ref(false), schemeVisible = ref(false);
const history = ref<EmployeeSocialSecurity[]>([]), historyVisible = ref(false), loading = ref(false), pageNo = ref(1), total = ref(0);
const pageSize = 15;
const canQuery = computed(() => hasPermission("hrm:employee-social-security:query"));
const hasMore = computed(() => rows.value.length < total.value);
async function load(reset = true) {
  if (!state.accessToken || !canQuery.value || loading.value) return;
  if (reset) { pageNo.value = 1; total.value = 0; }
  loading.value = true;
  try {
    const data = await getEmployeeSocialSecurityPage(state.accessToken, { pageNo: pageNo.value, pageSize });
    rows.value = reset ? (data.list || []) : [...rows.value, ...(data.list || [])];
    total.value = Number(data.total || 0);
    if (rows.value.length < total.value) pageNo.value += 1;
    if (reset) {
      [employees.value, schemes.value] = await Promise.all([getEmployeeSimpleList(state.accessToken), getSocialSecuritySchemeList(state.accessToken)]);
    }
  } catch (error) { toast(error instanceof Error ? error.message : "加载失败"); }
  finally { loading.value = false; uni.stopPullDownRefresh(); }
}
function open(row?: EmployeeSocialSecurity) { form.value = row ? { ...row } : { status: 0 }; editing.value = true; }
async function save() {
  if (!state.accessToken || !form.value.userId || !form.value.socialSecuritySchemeId || !form.value.effectiveDate) return toast("请完整填写员工、方案和生效日期");
  try {
    form.value.id ? await updateEmployeeSocialSecurity(state.accessToken, form.value) : await createEmployeeSocialSecurity(state.accessToken, form.value);
    toast("保存成功"); editing.value = false; await load(true);
  } catch (error) { toast(error instanceof Error ? error.message : "保存失败"); }
}
async function remove(row: EmployeeSocialSecurity) {
  if (!state.accessToken || !row.id || !await confirm("确认删除该员工社保档案?")) return;
  try { await deleteEmployeeSocialSecurity(state.accessToken, row.id); toast("删除成功"); await load(true); }
  catch (error) { toast(error instanceof Error ? error.message : "删除失败"); }
}
async function showHistory(row: EmployeeSocialSecurity) {
  if (!state.accessToken || !row.userId) return;
  history.value = await getEmployeeSocialSecurityHistory(state.accessToken, row.userId);
  historyVisible.value = true;
}
onShow(() => load(true));
onPullDownRefresh(() => load(true));
onReachBottom(() => { if (hasMore.value) load(false); });
</script><template><view class="page"><template v-if="canQuery"><view v-for="row in rows" :key="row.id" class="card"><view class="head"><view class="head-main"><text class="name">{{row.userName||'--'}}</text><text class="sub">{{row.deptName||'--'}}</text></view><text :class="['tag',row.status===0?'tag-green':'tag-gray']">{{row.status===0?'生效':'停用'}}</text></view><view class="grid"><text>方案:{{row.schemeName||'--'}}</text><text>社保基数:{{money(row.socialSecurityBase)}}</text><text>公积金基数:{{money(row.housingFundBase)}}</text><text>生效日期:{{row.effectiveDate||'--'}}</text></view><view class="actions"><button @click="showHistory(row)">历史</button><button v-if="hasPermission('hrm:employee-social-security:update')" @click="open(row)">编辑</button><button v-if="hasPermission('hrm:employee-social-security:delete')" class="danger" @click="remove(row)">删除</button></view></view><view v-if="!rows.length" class="state">{{loading?"加载中...":"暂无员工社保档案"}}</view><view v-else class="state more">{{loading?"加载中...":hasMore?"上拉加载更多":"没有更多了"}}</view><button v-if="hasPermission('hrm:employee-social-security:create')" class="fab" @click="open()"><view/></button></template><view v-else class="state">暂无员工社保档案查看权限</view><view v-if="editing" class="panel"><view class="form-card"><view class="field"><text>员工</text><view class="picker" @click="employeeVisible=true"><text>{{employees.find(x=>x.id===form.userId)?.name||form.userName||'请选择'}}</text><text>›</text></view></view><view class="field"><text>社保方案</text><view class="picker" @click="schemeVisible=true"><text>{{schemes.find(x=>x.id===form.socialSecuritySchemeId)?.name||form.schemeName||'请选择'}}</text><text>›</text></view></view><view class="field"><text>社保基数</text><input v-model.number="form.socialSecurityBase" type="digit"/></view><view class="field"><text>公积金基数</text><input v-model.number="form.housingFundBase" type="digit"/></view><view class="field"><text>生效日期</text><input v-model="form.effectiveDate" placeholder="YYYY-MM-DD"/></view><view class="toolbar"><button @click="editing=false">取消</button><button @click="save">保存</button></view></view></view><view v-if="historyVisible" class="panel"><view class="form-card"><view class="section-title">社保档案历史</view><view v-for="item in history" :key="item.id" class="detail-row"><text>{{item.effectiveDate}}</text><text>{{item.schemeName}} / {{money(item.socialSecurityBase)}}</text></view><view class="toolbar"><button @click="historyVisible=false">关闭</button></view></view></view><PickerSheet v-model:show="employeeVisible" title="选择员工" :items="employees.map(x=>({key:x.id,label:x.name,sub:x.employeeNo}))" :selected-keys="form.userId?[form.userId]:[]" @confirm="k=>form.userId=Number(k[0])"/><PickerSheet v-model:show="schemeVisible" title="选择方案" :items="schemes.map(x=>({key:x.id||0,label:x.name||'--'}))" :selected-keys="form.socialSecuritySchemeId?[form.socialSecuritySchemeId]:[]" @confirm="k=>form.socialSecuritySchemeId=Number(k[0])"/></view></template><style scoped lang="scss">@import "../list.scss";@import "../form.scss";.panel{position:fixed;z-index:20;inset:0;padding:15vh 30rpx;background:rgba(20,30,45,.48)}.panel .form-card{max-height:70vh;overflow:auto}.field input{text-align:right}</style>
src/pages/hrm/employee/form.vue
@@ -4,9 +4,11 @@
import { createEmployee, getEmployee, getHrmDeptList, getHrmDicts, getHrmPostList, getHrmRoleList, getSalaryStructureList, updateEmployee, type Employee, type SimpleOption } from "../../../api/hrm";
import type { DeptSimple, DictData } from "../../../api/crm";
import { useAuth } from "../../../stores/auth";
import { useAppTheme } from "../../../stores/theme";
import { HRM_DICT, label, options } from "../shared";
const { hasPermission, state } = useAuth();
const { primaryColor } = useAppTheme();
const id = ref<number>();
const mode = ref("edit");
const saving = ref(false);
@@ -63,7 +65,7 @@
      <view class="field"><text>手机号 <text class="required">*</text></text><input v-model="form.phone" :disabled="readonly" type="number" maxlength="11" placeholder="同时作为登录账号" /></view>
      <view class="field"><text>归属部门 <text class="required">*</text></text><picker v-if="!readonly" :range="depts" range-key="name" @change="form.deptId=depts[$event.detail.value].id"><view class="picker"><text>{{ deptText }}</text><text>›</text></view></picker><text v-else class="value">{{ deptText }}</text></view>
      <view class="field"><text>岗位 <text class="required">*</text></text><picker v-if="!readonly" :range="posts" range-key="name" @change="form.postId=posts[$event.detail.value].id"><view class="picker"><text>{{ postText }}</text><text>›</text></view></picker><text v-else class="value">{{ postText }}</text></view>
      <view class="field column"><text>用户角色 <text class="required">*</text></text><checkbox-group v-if="!readonly" class="checks" @change="changeRoles"><label v-for="role in roles" :key="role.id"><checkbox :value="String(role.id)" :checked="form.roleIds?.includes(role.id)" color="#1769d8" />{{ role.name }}</label></checkbox-group><text v-else class="role-value">{{ roleText }}</text></view>
      <view class="field column"><text>用户角色 <text class="required">*</text></text><checkbox-group v-if="!readonly" class="checks" @change="changeRoles"><label v-for="role in roles" :key="role.id"><checkbox :value="String(role.id)" :checked="form.roleIds?.includes(role.id)" :color="primaryColor" />{{ role.name }}</label></checkbox-group><text v-else class="role-value">{{ roleText }}</text></view>
      <view class="field"><text>入职日期 <text class="required">*</text></text><picker v-if="!readonly" mode="date" :value="form.hireDate" @change="form.hireDate=$event.detail.value"><view class="picker"><text>{{ form.hireDate || "请选择入职日期" }}</text><text>›</text></view></picker><text v-else class="value">{{ form.hireDate || "--" }}</text></view>
      <view class="field"><text>转正日期</text><picker v-if="!readonly" mode="date" :value="form.regularDate" @change="form.regularDate=$event.detail.value"><view class="picker"><text>{{ form.regularDate || "请选择转正日期" }}</text><text>›</text></view></picker><text v-else class="value">{{ form.regularDate || "--" }}</text></view>
      <view class="field"><text>员工状态 <text class="required">*</text></text><picker v-if="!readonly" :range="statusOptions" range-key="label" @change="form.employeeStatus=Number(statusOptions[$event.detail.value].value)"><view class="picker"><text>{{ label(dicts, HRM_DICT.employeeStatus, form.employeeStatus, "请选择状态") }}</text><text>›</text></view></picker><text v-else class="value">{{ label(dicts, HRM_DICT.employeeStatus, form.employeeStatus) }}</text></view>
src/pages/hrm/form.scss
@@ -1 +1 @@
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.section-title{padding:18rpx 6rpx 12rpx;color:#728197;font-size:23rpx}.form-card{overflow:hidden;background:#fff;border-radius:14rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:18rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:205rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:flex-end;gap:10rpx}.picker text:first-child{min-width:0;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{color:#8092a7;font-size:36rpx}.datetime{display:flex;min-width:0;flex:1;justify-content:flex-end;gap:16rpx}.datetime picker{flex:none}.datetime text{color:#1e3049;font-size:25rpx}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:150rpx;font-size:27rpx}.required{color:#e23b3b}.save{margin-top:32rpx;color:#fff;background:#1769d8;border-radius:10rpx}.save::after{border:0}.state{padding:38rpx;color:#8795a8;text-align:center}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.section-title{padding:18rpx 6rpx 12rpx;color:#728197;font-size:23rpx}.form-card{overflow:hidden;background:#fff;border-radius:14rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:18rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:205rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:flex-end;gap:10rpx}.picker text:first-child{min-width:0;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{color:#8092a7;font-size:36rpx}.datetime{display:flex;min-width:0;flex:1;justify-content:flex-end;gap:16rpx}.datetime picker{flex:none}.datetime text{color:#1e3049;font-size:25rpx}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:150rpx;font-size:27rpx}.required{color:#e23b3b}.save{margin-top:32rpx;color:#fff;background:var(--color-primary, #1769d8);border-radius:10rpx}.save::after{border:0}.state{padding:38rpx;color:#8795a8;text-align:center}
src/pages/hrm/list.scss
@@ -1 +1 @@
.page{min-height:100vh;padding:20rpx 30rpx 150rpx;box-sizing:border-box;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;padding:0 20rpx;margin-bottom:18rpx;background:#fff;border-radius:12rpx}.search input{min-width:0;flex:1;font-size:27rpx}.search text{padding-left:18rpx;color:#1769d8;font-size:24rpx}.card{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:14rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.07)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:700;text-overflow:ellipsis;white-space:nowrap}.sub{color:#78879b;font-size:23rpx}.tag{flex:none;padding:6rpx 15rpx;font-size:22rpx;border-radius:999rpx}.tag-on{color:#0e9663;background:#e9fbf2}.tag-off{color:#66778c;background:#f0f3f7}.tag-blue{color:#1769d8;background:#eef6ff}.tag-danger{color:#c65050;background:#fff0f0}.grid{display:grid;grid-template-columns:1fr 1fr;gap:11rpx;padding:16rpx 0;margin-top:15rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.state,.more{display:block;padding:45rpx 0;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c65050}.fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}.fab view{position:relative;width:38rpx;height:38rpx}.fab view::before,.fab view::after{position:absolute;content:"";background:#fff}.fab view::before{top:17rpx;width:38rpx;height:4rpx}.fab view::after{left:17rpx;width:4rpx;height:38rpx}
.page{min-height:100vh;padding: 20rpx 30rpx 132rpx;box-sizing:border-box;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;padding:0 20rpx;margin-bottom:18rpx;background:#fff;border-radius:12rpx}.search input{min-width:0;flex:1;font-size:27rpx}.search text{padding-left:18rpx;color:var(--color-primary, #1769d8);font-size:24rpx}.card{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:14rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.07)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:700;text-overflow:ellipsis;white-space:nowrap}.sub{color:#78879b;font-size:23rpx}.tag{flex:none;padding:6rpx 15rpx;font-size:22rpx;border-radius:999rpx}.tag-on{color:#0e9663;background:#e9fbf2}.tag-off{color:#66778c;background:#f0f3f7}.tag-blue{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #eef6ff)}.tag-danger{color:#c65050;background:#fff0f0}.grid{display:grid;grid-template-columns:1fr 1fr;gap:11rpx;padding:16rpx 0;margin-top:15rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.state,.more{display:block;padding:45rpx 0;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c65050}.fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}.fab view{position:relative;width:38rpx;height:38rpx}.fab view::before,.fab view::after{position:absolute;content:"";background:#fff}.fab view::before{top:17rpx;width:38rpx;height:4rpx}.fab view::after{left:17rpx;width:4rpx;height:38rpx}
src/pages/hrm/overtime/form.vue
@@ -3,8 +3,10 @@
import { onLoad } from "@dcloudio/uni-app";
import { createOvertime, getCurrentOvertimeApplicant, getOvertime, updateOvertime, type Overtime } from "../../../api/hrm";
import { useAuth } from "../../../stores/auth";
import { useAppTheme } from "../../../stores/theme";
const { hasPermission, state } = useAuth();
const { primaryColor } = useAppTheme();
const id = ref<number>(); const mode = ref("edit"); const saving = ref(false);
const form = reactive<Overtime>({ overtimeDate: "", startTime: "18:00:00", endTime: "20:00:00", duration: 2, overtimeType: 1, crossDay: false, mealDeduction: false, mealDeductionHours: 1, reason: "", workContent: "" });
const readonly = computed(() => mode.value === "detail");
@@ -58,7 +60,7 @@
  <view class="field"><text>开始时间 <text class="required">*</text></text><picker v-if="!readonly" mode="time" :value="form.startTime?.slice(0,5)" @change="form.startTime=$event.detail.value+':00'"><view class="picker"><text>{{ form.startTime?.slice(0,5) || "请选择" }}</text><text>›</text></view></picker><text v-else class="value">{{ form.startTime?.slice(0,5) || "--" }}</text></view>
  <view class="field"><text>结束时间 <text class="required">*</text></text><picker v-if="!readonly" mode="time" :value="form.endTime?.slice(0,5)" @change="form.endTime=$event.detail.value+':00'"><view class="picker"><text>{{ form.endTime?.slice(0,5) || "请选择" }}</text><text>›</text></view></picker><text v-else class="value">{{ form.endTime?.slice(0,5) || "--" }}</text></view>
  <view class="field"><text>跨天</text><text class="value">{{ form.crossDay ? "是" : "否" }}</text></view>
  <view class="field"><text>扣除用餐时间</text><switch v-if="!readonly" :checked="form.mealDeduction" color="#1769d8" @change="form.mealDeduction=$event.detail.value" /><text v-else class="value">{{ form.mealDeduction ? "是" : "否" }}</text></view>
  <view class="field"><text>扣除用餐时间</text><switch v-if="!readonly" :checked="form.mealDeduction" :color="primaryColor" @change="form.mealDeduction=$event.detail.value" /><text v-else class="value">{{ form.mealDeduction ? "是" : "否" }}</text></view>
  <view v-if="form.mealDeduction" class="field"><text>扣除时长</text><input v-model.number="form.mealDeductionHours" :disabled="readonly" type="digit" placeholder="单位:小时" /></view>
  <view class="field"><text>加班时长</text><text class="value">{{ form.duration ?? 0 }} å°æ—¶</text></view>
  <view class="field column"><text>加班原因 <text class="required">*</text></text><textarea v-model="form.reason" :disabled="readonly" maxlength="500" placeholder="请输入加班原因" /></view>
src/pages/hrm/salary-calculation/index.vue
@@ -1,9 +1,42 @@
<script setup lang="ts">
import { computed,ref } from "vue"; import { onPullDownRefresh,onShow } from "@dcloudio/uni-app";
import { calculateSalary,confirmSalary,deleteSalaryCalculation,getSalaryCalculationPage,revokeSalary,type SalaryCalculation } from "../../../api/hrm"; import { useAuth } from "../../../stores/auth"; import { confirm,money,toast } from "../shared";
const {hasPermission,state}=useAuth(); const rows=ref<SalaryCalculation[]>([]),period=ref(new Date().toISOString().slice(0,7)),loading=ref(false);const canQuery=computed(()=>hasPermission("hrm:salary-calculation:query"));
async function load(){if(!state.accessToken||!canQuery.value)return;loading.value=true;try{const d=await getSalaryCalculationPage(state.accessToken,{pageNo:1,pageSize:100,period:period.value});rows.value=d.list||[];}catch(e){toast(e instanceof Error?e.message:"加载失败");}finally{loading.value=false;uni.stopPullDownRefresh();}}
async function calc(){if(!state.accessToken||!await confirm(`确认核算 ${period.value} è–ªé…¬ï¼Ÿ`))return;try{await calculateSalary(state.accessToken,{period:period.value});toast("核算完成");await load();}catch(e){toast(e instanceof Error?e.message:"核算失败");}}
async function action(row:SalaryCalculation,type:"confirm"|"revoke"|"delete"){if(!state.accessToken||!row.id||!await confirm(`确认${type==='confirm'?'确认':type==='revoke'?'撤销确认':'删除'}该薪酬记录?`))return;try{if(type==='confirm')await confirmSalary(state.accessToken,[row.id]);else if(type==='revoke')await revokeSalary(state.accessToken,[row.id]);else await deleteSalaryCalculation(state.accessToken,row.id);toast("操作成功");await load();}catch(e){toast(e instanceof Error?e.message:"操作失败");}}
onShow(load);onPullDownRefresh(load);
</script><template><view class="page"><template v-if="canQuery"><view class="search"><input v-model="period" placeholder="薪酬周期 YYYY-MM" @confirm="load"/><text @click="load">查询</text></view><view v-if="hasPermission('hrm:salary-calculation:calculate')" class="top-actions"><button @click="calc">执行薪酬核算</button></view><view v-for="row in rows" :key="row.id" class="card"><view class="head"><view class="head-main"><text class="name">{{row.userName||'--'}}</text><text class="sub">{{row.no||'--'}} Â· {{row.deptName||'--'}}</text></view><text :class="['tag',row.status===1?'tag-green':'tag-blue']">{{row.statusName|| (row.status===1?'已确认':'待确认')}}</text></view><view class="grid"><text>基本工资:{{money(row.baseSalary)}}</text><text>绩效工资:{{money(row.performanceSalary)}}</text><text>加班工资:{{money(row.overtimePay)}}</text><text>社保扣款:{{money(row.socialSecurityDeduction)}}</text><text>公积金扣款:{{money(row.housingFundDeduction)}}</text><text>个税:{{money(row.taxDeduction)}}</text><text>实发工资:{{money(row.actualSalary)}}</text><text>出勤:{{row.workDays??0}} å¤©</text></view><view class="actions"><button v-if="row.status===0&&hasPermission('hrm:salary-calculation:confirm')" @click="action(row,'confirm')">确认</button><button v-if="row.status===1&&hasPermission('hrm:salary-calculation:confirm')" @click="action(row,'revoke')">撤销确认</button><button v-if="row.status===0&&hasPermission('hrm:salary-calculation:delete')" class="danger" @click="action(row,'delete')">删除</button></view></view><view v-if="!rows.length" class="state">{{loading?'加载中...':'暂无薪酬核算记录'}}</view></template><view v-else class="state">暂无薪酬核算查看权限</view></view></template><style scoped lang="scss">@import "../list.scss";.top-actions{display:flex;justify-content:flex-end;margin-bottom:18rpx}.top-actions button{margin:0;color:#1769d8;font-size:24rpx;background:#fff}</style>
import { computed, ref } from "vue";
import { onPullDownRefresh, onReachBottom, onShow } from "@dcloudio/uni-app";
import { calculateSalary, confirmSalary, deleteSalaryCalculation, getSalaryCalculationPage, revokeSalary, type SalaryCalculation } from "../../../api/hrm";
import { useAuth } from "../../../stores/auth";
import { confirm, money, toast } from "../shared";
const { hasPermission, state } = useAuth();
const rows = ref<SalaryCalculation[]>([]), period = ref(new Date().toISOString().slice(0, 7)), loading = ref(false), pageNo = ref(1), total = ref(0);
const pageSize = 15;
const canQuery = computed(() => hasPermission("hrm:salary-calculation:query"));
const hasMore = computed(() => rows.value.length < total.value);
async function load(reset = true) {
  if (!state.accessToken || !canQuery.value || loading.value) return;
  if (reset) { pageNo.value = 1; total.value = 0; }
  loading.value = true;
  try {
    const data = await getSalaryCalculationPage(state.accessToken, { pageNo: pageNo.value, pageSize, period: period.value });
    rows.value = reset ? (data.list || []) : [...rows.value, ...(data.list || [])];
    total.value = Number(data.total || 0);
    if (rows.value.length < total.value) pageNo.value += 1;
  } catch (error) { toast(error instanceof Error ? error.message : "加载失败"); }
  finally { loading.value = false; uni.stopPullDownRefresh(); }
}
async function calc() {
  if (!state.accessToken || !await confirm("确认核算 " + period.value + " è–ªé…¬ï¼Ÿ")) return;
  try { await calculateSalary(state.accessToken, { period: period.value }); toast("核算完成"); await load(true); }
  catch (error) { toast(error instanceof Error ? error.message : "核算失败"); }
}
async function action(row: SalaryCalculation, type: "confirm" | "revoke" | "delete") {
  const label = type === "confirm" ? "确认" : type === "revoke" ? "撤销确认" : "删除";
  if (!state.accessToken || !row.id || !await confirm("确认" + label + "该薪酬记录?")) return;
  try {
    if (type === "confirm") await confirmSalary(state.accessToken, [row.id]);
    else if (type === "revoke") await revokeSalary(state.accessToken, [row.id]);
    else await deleteSalaryCalculation(state.accessToken, row.id);
    toast("操作成功"); await load(true);
  } catch (error) { toast(error instanceof Error ? error.message : "操作失败"); }
}
onShow(() => load(true));
onPullDownRefresh(() => load(true));
onReachBottom(() => { if (hasMore.value) load(false); });
</script><template><view class="page"><template v-if="canQuery"><view class="search"><input v-model="period" placeholder="薪酬周期 YYYY-MM" @confirm="load"/><text @click="load">查询</text></view><view v-if="hasPermission('hrm:salary-calculation:calculate')" class="top-actions"><button @click="calc">执行薪酬核算</button></view><view v-for="row in rows" :key="row.id" class="card"><view class="head"><view class="head-main"><text class="name">{{row.userName||'--'}}</text><text class="sub">{{row.no||'--'}} Â· {{row.deptName||'--'}}</text></view><text :class="['tag',row.status===1?'tag-green':'tag-blue']">{{row.statusName|| (row.status===1?'已确认':'待确认')}}</text></view><view class="grid"><text>基本工资:{{money(row.baseSalary)}}</text><text>绩效工资:{{money(row.performanceSalary)}}</text><text>加班工资:{{money(row.overtimePay)}}</text><text>社保扣款:{{money(row.socialSecurityDeduction)}}</text><text>公积金扣款:{{money(row.housingFundDeduction)}}</text><text>个税:{{money(row.taxDeduction)}}</text><text>实发工资:{{money(row.actualSalary)}}</text><text>出勤:{{row.workDays??0}} å¤©</text></view><view class="actions"><button v-if="row.status===0&&hasPermission('hrm:salary-calculation:confirm')" @click="action(row,'confirm')">确认</button><button v-if="row.status===1&&hasPermission('hrm:salary-calculation:confirm')" @click="action(row,'revoke')">撤销确认</button><button v-if="row.status===0&&hasPermission('hrm:salary-calculation:delete')" class="danger" @click="action(row,'delete')">删除</button></view></view><view v-if="!rows.length" class="state">{{loading?'加载中...':'暂无薪酬核算记录'}}</view><view v-else class="state more">{{loading ? "加载中..." : hasMore ? "上拉加载更多" : "没有更多了"}}</view></template><view v-else class="state">暂无薪酬核算查看权限</view></view></template><style scoped lang="scss">@import "../list.scss";.top-actions{display:flex;justify-content:flex-end;margin-bottom:18rpx}.top-actions button{margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;background:#fff}</style>
src/pages/hrm/salary-payment/index.vue
@@ -1,12 +1,39 @@
<script setup lang="ts">
import { computed, ref } from "vue"; import { onPullDownRefresh, onShow } from "@dcloudio/uni-app";
import { computed, ref } from "vue";
import { onPullDownRefresh, onReachBottom, onShow } from "@dcloudio/uni-app";
import { generateSalaryPayment, getSalaryPaymentPage, paySalary, type SalaryPayment } from "../../../api/hrm";
import { useAuth } from "../../../stores/auth"; import { confirm, dateTime, money, toast } from "../shared";
const { hasPermission, state } = useAuth(); const rows = ref<SalaryPayment[]>([]); const period = ref(new Date().toISOString().slice(0, 7)); const loading = ref(false); const canQuery = computed(() => hasPermission("hrm:salary-payment:query"));
async function load() { if (!state.accessToken || !canQuery.value) return; loading.value = true; try { const data = await getSalaryPaymentPage(state.accessToken, { pageNo: 1, pageSize: 100, period: period.value }); rows.value = data.list || []; } catch (error) { toast(error instanceof Error ? error.message : "加载失败"); } finally { loading.value = false; uni.stopPullDownRefresh(); } }
async function generate() { if (!state.accessToken || !await confirm(`确认生成 ${period.value} è–ªèµ„发放台账?`)) return; try { await generateSalaryPayment(state.accessToken, period.value); toast("生成成功"); await load(); } catch (error) { toast(error instanceof Error ? error.message : "生成失败"); } }
async function pay(row: SalaryPayment) { if (!state.accessToken || !row.id || !await confirm("确认发放该周期的薪资?")) return; try { await paySalary(state.accessToken, row.id); toast("发放成功"); await load(); } catch (error) { toast(error instanceof Error ? error.message : "发放失败"); } }
onShow(load); onPullDownRefresh(load);
import { useAuth } from "../../../stores/auth";
import { confirm, dateTime, money, toast } from "../shared";
const { hasPermission, state } = useAuth();
const rows = ref<SalaryPayment[]>([]), period = ref(new Date().toISOString().slice(0, 7)), loading = ref(false), pageNo = ref(1), total = ref(0);
const pageSize = 15;
const canQuery = computed(() => hasPermission("hrm:salary-payment:query"));
const hasMore = computed(() => rows.value.length < total.value);
async function load(reset = true) {
  if (!state.accessToken || !canQuery.value || loading.value) return;
  if (reset) { pageNo.value = 1; total.value = 0; }
  loading.value = true;
  try {
    const data = await getSalaryPaymentPage(state.accessToken, { pageNo: pageNo.value, pageSize, period: period.value });
    rows.value = reset ? (data.list || []) : [...rows.value, ...(data.list || [])];
    total.value = Number(data.total || 0);
    if (rows.value.length < total.value) pageNo.value += 1;
  } catch (error) { toast(error instanceof Error ? error.message : "加载失败"); }
  finally { loading.value = false; uni.stopPullDownRefresh(); }
}
async function generate() {
  if (!state.accessToken || !await confirm("确认生成 " + period.value + " è–ªèµ„发放台账?")) return;
  try { await generateSalaryPayment(state.accessToken, period.value); toast("生成成功"); await load(true); }
  catch (error) { toast(error instanceof Error ? error.message : "生成失败"); }
}
async function pay(row: SalaryPayment) {
  if (!state.accessToken || !row.id || !await confirm("确认发放该周期的薪资?")) return;
  try { await paySalary(state.accessToken, row.id); toast("发放成功"); await load(true); }
  catch (error) { toast(error instanceof Error ? error.message : "发放失败"); }
}
onShow(() => load(true));
onPullDownRefresh(() => load(true));
onReachBottom(() => { if (hasMore.value) load(false); });
</script>
<template><view class="page"><template v-if="canQuery"><view class="search"><input v-model="period" placeholder="发放周期 YYYY-MM" @confirm="load" /><text @click="load">查询</text></view><view v-if="hasPermission('hrm:salary-payment:generate')" class="top-actions"><button @click="generate">生成发放台账</button></view><view v-for="row in rows" :key="row.id" class="card" @click="uni.navigateTo({ url: `/pages/hrm/salary-payment/detail?id=${row.id}` })"><view class="head"><view class="head-main"><text class="name">{{ row.no || "暂无单号" }}</text><text class="sub">{{ row.period || "--" }}</text></view><text :class="['tag', row.status === 1 ? 'tag-green' : 'tag-orange']">{{ row.status === 1 ? "已发放" : "待发放" }}</text></view><view class="grid"><text>总人数:{{ row.totalCount ?? 0 }}</text><text>总金额:{{ money(row.totalAmount) }}</text><text>发放时间:{{ dateTime(row.paymentTime) }}</text><text>备注:{{ row.remark || "--" }}</text></view><view class="actions" @click.stop><button @click="uni.navigateTo({ url: `/pages/hrm/salary-payment/detail?id=${row.id}` })">查看明细</button><button v-if="row.status === 0 && hasPermission('hrm:salary-payment:pay')" @click="pay(row)">发放</button></view></view><view v-if="!rows.length" class="state">{{ loading ? "加载中..." : "暂无发放台账" }}</view></template><view v-else class="state">暂无薪资发放查看权限</view></view></template>
<style scoped lang="scss">@import "../list.scss";.top-actions{display:flex;justify-content:flex-end;margin-bottom:18rpx}.top-actions button{margin:0;color:#1769d8;font-size:24rpx;background:#fff}</style>
<template><view class="page"><template v-if="canQuery"><view class="search"><input v-model="period" placeholder="发放周期 YYYY-MM" @confirm="load" /><text @click="load">查询</text></view><view v-if="hasPermission('hrm:salary-payment:generate')" class="top-actions"><button @click="generate">生成发放台账</button></view><view v-for="row in rows" :key="row.id" class="card" @click="uni.navigateTo({ url: `/pages/hrm/salary-payment/detail?id=${row.id}` })"><view class="head"><view class="head-main"><text class="name">{{ row.no || "暂无单号" }}</text><text class="sub">{{ row.period || "--" }}</text></view><text :class="['tag', row.status === 1 ? 'tag-green' : 'tag-orange']">{{ row.status === 1 ? "已发放" : "待发放" }}</text></view><view class="grid"><text>总人数:{{ row.totalCount ?? 0 }}</text><text>总金额:{{ money(row.totalAmount) }}</text><text>发放时间:{{ dateTime(row.paymentTime) }}</text><text>备注:{{ row.remark || "--" }}</text></view><view class="actions" @click.stop><button @click="uni.navigateTo({ url: `/pages/hrm/salary-payment/detail?id=${row.id}` })">查看明细</button><button v-if="row.status === 0 && hasPermission('hrm:salary-payment:pay')" @click="pay(row)">发放</button></view></view><view v-if="!rows.length" class="state">{{ loading ? "加载中..." : "暂无发放台账" }}</view><view v-else class="state more">{{loading ? "加载中..." : hasMore ? "上拉加载更多" : "没有更多了"}}</view></template><view v-else class="state">暂无薪资发放查看权限</view></view></template>
<style scoped lang="scss">@import "../list.scss";.top-actions{display:flex;justify-content:flex-end;margin-bottom:18rpx}.top-actions button{margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;background:#fff}</style>
src/pages/hrm/shift/index.vue
@@ -1,6 +1,6 @@
<script setup lang="ts">
import HrmCrudPage, { type CrudConfig } from "../components/HrmCrudPage.vue";
import { createShift, deleteShift, getShiftPage, updateShift } from "../../../api/hrm";
const config: CrudConfig = { title:"班次", permission:"hrm:shift", fields:[{key:"name",label:"班次名称",required:true},{key:"startTime",label:"上班时间",required:true},{key:"endTime",label:"下班时间",required:true},{key:"workHours",label:"标准工时",type:"number",required:true},{key:"crossDay",label:"是否跨天",type:"switch"},{key:"color",label:"标签颜色"},{key:"remark",label:"备注"}], cardFields:[{key:"name",label:"名称"},{key:"startTime",label:"上班时间"},{key:"endTime",label:"下班时间"},{key:"workHours",label:"标准工时"},{key:"crossDay",label:"跨天"}], load:(t,k)=>getShiftPage(t,{pageNo:1,pageSize:100,name:k||undefined}), create:createShift, update:updateShift, remove:deleteShift };
const config: CrudConfig = { title:"班次", permission:"hrm:shift", fields:[{key:"name",label:"班次名称",required:true},{key:"startTime",label:"上班时间",required:true},{key:"endTime",label:"下班时间",required:true},{key:"workHours",label:"标准工时",type:"number",required:true},{key:"crossDay",label:"是否跨天",type:"switch"},{key:"color",label:"标签颜色"},{key:"remark",label:"备注"}], cardFields:[{key:"name",label:"名称"},{key:"startTime",label:"上班时间"},{key:"endTime",label:"下班时间"},{key:"workHours",label:"标准工时"},{key:"crossDay",label:"跨天"}], page:true, load:(t,k,p,s)=>getShiftPage(t,{pageNo:p,pageSize:s,name:k||undefined}), create:createShift, update:updateShift, remove:deleteShift };
</script><template><HrmCrudPage :config="config" /></template>
src/pages/login/index.vue
@@ -120,7 +120,7 @@
  .page {
    min-height: 100vh;
    padding: 112rpx 48rpx 48rpx;
    background: linear-gradient(180deg, #edf5ff 0, #f5f7fb 46%, #f5f7fb 100%);
    background: linear-gradient(180deg, var(--color-primary-soft, #edf5ff) 0, #f5f7fb 46%, #f5f7fb 100%);
  }
  .brand {
    text-align: center;
src/pages/mes/cal/calendar/index.vue
@@ -129,5 +129,5 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:20rpx 20rpx 60rpx;box-sizing:border-box;background:#f3f6fb}.toolbar{display:flex;align-items:center;gap:12rpx;padding:16rpx 0}.toolbar text{flex:1;color:#20334c;font-size:30rpx;font-weight:600;text-align:center}.toolbar button{height:58rpx;min-width:92rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:24rpx;line-height:56rpx;background:#fff;border:0;border-radius:10rpx}.tabs{display:flex;gap:12rpx;padding:0 0 14rpx}.tabs text{padding:10rpx 22rpx;color:#53677f;font-size:25rpx;background:#fff;border-radius:999rpx}.tabs .active{color:#1769d8;font-weight:600;background:#eaf2ff}.selector{height:76rpx;margin-bottom:14rpx;padding:0 20rpx;background:#fff;border-radius:14rpx}.selector picker{height:100%}.picker{display:flex;height:100%;align-items:center;justify-content:space-between;color:#1e3049;font-size:26rpx}.picker text:first-child{min-width:0;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;color:#8092a7;font-size:36rpx}.week,.calendar{display:grid;grid-template-columns:repeat(7,1fr);gap:8rpx}.week text{height:52rpx;color:#66778c;font-size:24rpx;line-height:52rpx;text-align:center}.day{min-height:132rpx;padding:8rpx;box-sizing:border-box;background:#fff;border:1rpx solid #e8eef6;border-radius:12rpx}.day.muted{opacity:.38}.day.weekend .day-head>text:first-child{color:#c65050}.day-head{display:flex;align-items:center;justify-content:space-between}.day-head>text:first-child{color:#20334c;font-size:25rpx;font-weight:600}.badge{display:inline-flex;align-items:center;justify-content:center;width:32rpx;height:32rpx;font-size:19rpx;border-radius:50%}.badge.work{color:#1769d8;background:#edf5ff}.badge.holiday{color:#17865a;background:#eafaf2}.shift-list{display:flex;flex-direction:column;gap:4rpx;margin-top:8rpx}.shift{display:block;overflow:hidden;padding:3rpx 5rpx;color:#fff;font-size:18rpx;line-height:1.2;text-overflow:ellipsis;white-space:nowrap;border-radius:5rpx}.shift-day{background:#95d475}.shift-mid{background:#f0a020}.shift-night{background:#909399}.shift-info{background:#1769d8}.legend{display:flex;flex-wrap:wrap;gap:12rpx 22rpx;margin:24rpx 0 4rpx;padding:18rpx 20rpx;color:#66778c;font-size:23rpx;background:#fff;border-radius:14rpx}.legend-title{color:#33455d;font-weight:600}.legend-item{display:flex;align-items:center;gap:8rpx}.legend-dot{width:20rpx;height:20rpx;border-radius:4rpx}.day-dot{background:#95d475}.mid-dot{background:#f0a020}.night-dot{background:#909399}.weekend-dot{background:#f56c6c;opacity:.6}.legend-rest{display:inline-flex;align-items:center;justify-content:center;width:36rpx;height:30rpx;color:#17865a;font-size:20rpx;background:#eafaf2;border-radius:6rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}
.page{min-height:100vh;padding:20rpx 20rpx 60rpx;box-sizing:border-box;background:#f3f6fb}.toolbar{display:flex;align-items:center;gap:12rpx;padding:16rpx 0}.toolbar text{flex:1;color:#20334c;font-size:30rpx;font-weight:600;text-align:center}.toolbar button{height:58rpx;min-width:92rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:56rpx;background:#fff;border:0;border-radius:10rpx}.tabs{display:flex;gap:12rpx;padding:0 0 14rpx}.tabs text{padding:10rpx 22rpx;color:#53677f;font-size:25rpx;background:#fff;border-radius:999rpx}.tabs .active{color:var(--color-primary, #1769d8);font-weight:600;background:#eaf2ff}.selector{height:76rpx;margin-bottom:14rpx;padding:0 20rpx;background:#fff;border-radius:14rpx}.selector picker{height:100%}.picker{display:flex;height:100%;align-items:center;justify-content:space-between;color:#1e3049;font-size:26rpx}.picker text:first-child{min-width:0;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;color:#8092a7;font-size:36rpx}.week,.calendar{display:grid;grid-template-columns:repeat(7,1fr);gap:8rpx}.week text{height:52rpx;color:#66778c;font-size:24rpx;line-height:52rpx;text-align:center}.day{min-height:132rpx;padding:8rpx;box-sizing:border-box;background:#fff;border:1rpx solid #e8eef6;border-radius:12rpx}.day.muted{opacity:.38}.day.weekend .day-head>text:first-child{color:#c65050}.day-head{display:flex;align-items:center;justify-content:space-between}.day-head>text:first-child{color:#20334c;font-size:25rpx;font-weight:600}.badge{display:inline-flex;align-items:center;justify-content:center;width:32rpx;height:32rpx;font-size:19rpx;border-radius:50%}.badge.work{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #edf5ff)}.badge.holiday{color:#17865a;background:#eafaf2}.shift-list{display:flex;flex-direction:column;gap:4rpx;margin-top:8rpx}.shift{display:block;overflow:hidden;padding:3rpx 5rpx;color:#fff;font-size:18rpx;line-height:1.2;text-overflow:ellipsis;white-space:nowrap;border-radius:5rpx}.shift-day{background:#95d475}.shift-mid{background:#f0a020}.shift-night{background:#909399}.shift-info{background:var(--color-primary, #1769d8)}.legend{display:flex;flex-wrap:wrap;gap:12rpx 22rpx;margin:24rpx 0 4rpx;padding:18rpx 20rpx;color:#66778c;font-size:23rpx;background:#fff;border-radius:14rpx}.legend-title{color:#33455d;font-weight:600}.legend-item{display:flex;align-items:center;gap:8rpx}.legend-dot{width:20rpx;height:20rpx;border-radius:4rpx}.day-dot{background:#95d475}.mid-dot{background:#f0a020}.night-dot{background:#909399}.weekend-dot{background:#f56c6c;opacity:.6}.legend-rest{display:inline-flex;align-items:center;justify-content:center;width:36rpx;height:30rpx;color:#17865a;font-size:20rpx;background:#eafaf2;border-radius:6rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}
</style>
src/pages/mes/cal/holiday/index.vue
@@ -102,5 +102,5 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:20rpx 20rpx 60rpx;box-sizing:border-box;background:#f3f6fb}.toolbar{display:flex;align-items:center;gap:12rpx;padding:16rpx 0}.toolbar text{flex:1;color:#20334c;font-size:30rpx;font-weight:600;text-align:center}.toolbar button{height:58rpx;min-width:92rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:24rpx;line-height:56rpx;background:#fff;border-radius:10rpx}.week,.calendar{display:grid;grid-template-columns:repeat(7,1fr);gap:8rpx}.week text{height:52rpx;color:#66778c;font-size:24rpx;line-height:52rpx;text-align:center}.day{min-height:110rpx;padding:10rpx 8rpx;box-sizing:border-box;background:#fff;border:1rpx solid #e8eef6;border-radius:12rpx}.day.muted{opacity:.38}.day.weekend .day-head>text:first-child{color:#c65050}.day-head{display:flex;align-items:center;justify-content:space-between}.day-head>text:first-child{color:#20334c;font-size:27rpx;font-weight:600}.badge{display:inline-flex;align-items:center;justify-content:center;width:34rpx;height:34rpx;font-size:20rpx;border-radius:50%}.badge.work{color:#1769d8;background:#edf5ff}.badge.holiday{color:#17865a;background:#eafaf2}.day-type{display:block;margin-top:14rpx;color:#8795a8;font-size:20rpx;text-align:center}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:50;display:flex;align-items:flex-end;background:rgba(0,0,0,.35)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:24rpx;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:88rpx;line-height:88rpx;color:#1d2f46;font-size:30rpx;font-weight:600;text-align:center;border-bottom:1rpx solid #eef1f5}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:180rpx;flex:none;color:#33455d;font-size:27rpx}.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx;text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:36rpx;text-align:right}.required{color:#e23b3b}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.modal-actions{display:flex;gap:18rpx;padding:24rpx}.modal-actions button,.toolbar button{border:0}.modal-actions button{flex:1;margin:0;color:#1769d8;background:#edf5ff;border-radius:12rpx}.modal-actions .primary{color:#fff;background:#1769d8}
.page{min-height:100vh;padding:20rpx 20rpx 60rpx;box-sizing:border-box;background:#f3f6fb}.toolbar{display:flex;align-items:center;gap:12rpx;padding:16rpx 0}.toolbar text{flex:1;color:#20334c;font-size:30rpx;font-weight:600;text-align:center}.toolbar button{height:58rpx;min-width:92rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:56rpx;background:#fff;border-radius:10rpx}.week,.calendar{display:grid;grid-template-columns:repeat(7,1fr);gap:8rpx}.week text{height:52rpx;color:#66778c;font-size:24rpx;line-height:52rpx;text-align:center}.day{min-height:110rpx;padding:10rpx 8rpx;box-sizing:border-box;background:#fff;border:1rpx solid #e8eef6;border-radius:12rpx}.day.muted{opacity:.38}.day.weekend .day-head>text:first-child{color:#c65050}.day-head{display:flex;align-items:center;justify-content:space-between}.day-head>text:first-child{color:#20334c;font-size:27rpx;font-weight:600}.badge{display:inline-flex;align-items:center;justify-content:center;width:34rpx;height:34rpx;font-size:20rpx;border-radius:50%}.badge.work{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #edf5ff)}.badge.holiday{color:#17865a;background:#eafaf2}.day-type{display:block;margin-top:14rpx;color:#8795a8;font-size:20rpx;text-align:center}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:50;display:flex;align-items:flex-end;background:rgba(0,0,0,.35)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:24rpx;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:88rpx;line-height:88rpx;color:#1d2f46;font-size:30rpx;font-weight:600;text-align:center;border-bottom:1rpx solid #eef1f5}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:180rpx;flex:none;color:#33455d;font-size:27rpx}.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx;text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:36rpx;text-align:right}.required{color:#e23b3b}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.modal-actions{display:flex;gap:18rpx;padding:24rpx}.modal-actions button,.toolbar button{border:0}.modal-actions button{flex:1;margin:0;color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #edf5ff);border-radius:12rpx}.modal-actions .primary{color:#fff;background:var(--color-primary, #1769d8)}
</style>
src/pages/mes/cal/plan/form.vue
@@ -207,6 +207,6 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.tabs{display:flex;gap:12rpx;padding:18rpx 22rpx;border-bottom:1rpx solid #eef1f5}.tabs text{padding:10rpx 20rpx;color:#53677f;font-size:25rpx;background:#f3f6fb;border-radius:999rpx}.tabs .active{color:#1769d8;font-weight:600;background:#eaf2ff}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:200rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:36rpx;text-align:right}.required{color:#e23b3b}.code-field button,.section-head button,.sub-row button{flex:none;min-width:100rpx;padding:0 14rpx;margin:0;color:#1769d8;font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.code-field button::after,.save::after,.modal-actions button::after,.section-head button::after,.sub-row button::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:28rpx}.section-head{display:flex;align-items:center;justify-content:space-between;padding:22rpx 24rpx;border-bottom:1rpx solid #eef1f5}.section-head>text{color:#1e3049;font-size:30rpx;font-weight:600}.sub-list{padding:18rpx}.sub-row{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx;padding:18rpx;margin-bottom:14rpx;background:#f8fbff;border:1rpx solid #e4edf8;border-radius:12rpx}.sub-row.selected{border-color:#1769d8;background:#eef5ff}.sub-row>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:7rpx;color:#66778c;font-size:23rpx}.sub-title{color:#20334c;font-size:27rpx;font-weight:600}.sub-actions{display:flex;gap:10rpx;flex:none}.sub-row .danger{color:#c65050;border-color:#e3a0a0}.member-box{margin:0 18rpx 18rpx;padding:18rpx;background:#f8fbff;border:1rpx solid #e4edf8;border-radius:12rpx}.member-title{color:#20334c;font-size:27rpx;font-weight:600}.member-list{display:flex;flex-direction:column;gap:8rpx;padding-top:14rpx;color:#66778c;font-size:24rpx}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:50;display:flex;align-items:flex-end;background:rgba(0,0,0,.35)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:24rpx;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:88rpx;line-height:88rpx;color:#1d2f46;font-size:30rpx;font-weight:600;text-align:center;border-bottom:1rpx solid #eef1f5}.modal-actions{display:flex;gap:18rpx;padding:24rpx}.modal-actions button{flex:1;margin:0;color:#1769d8;background:#edf5ff;border-radius:12rpx}.modal-actions .primary{color:#fff;background:#1769d8}
.confirm{margin-top:24rpx;color:#fff;font-size:30rpx;background:#18a058;border-radius:12rpx}.confirm::after{border:0}.section-head button.disabled{color:#8a99ad;background:#f4f6f9;border-color:#d9e0ea}.limit-tip{margin:16rpx 18rpx 0;padding:14rpx 18rpx;color:#8a5a00;font-size:23rpx;line-height:1.5;background:#fff7e6;border:1rpx solid #f2d7a0;border-radius:10rpx}.select-list{padding:18rpx}.select-row{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx;padding:18rpx;margin-bottom:14rpx;background:#f8fbff;border:1rpx solid #e4edf8;border-radius:12rpx}.select-row.checked{border-color:#1769d8;background:#eef5ff}.select-row.disabled{opacity:.58}.select-row>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:7rpx;color:#66778c;font-size:23rpx}.check{flex:none;color:#1769d8;font-size:24rpx}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.tabs{display:flex;gap:12rpx;padding:18rpx 22rpx;border-bottom:1rpx solid #eef1f5}.tabs text{padding:10rpx 20rpx;color:#53677f;font-size:25rpx;background:#f3f6fb;border-radius:999rpx}.tabs .active{color:var(--color-primary, #1769d8);font-weight:600;background:#eaf2ff}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:200rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:36rpx;text-align:right}.required{color:#e23b3b}.code-field button,.section-head button,.sub-row button{flex:none;min-width:100rpx;padding:0 14rpx;margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid var(--color-primary, #1769d8);border-radius:8rpx}.code-field button::after,.save::after,.modal-actions button::after,.section-head button::after,.sub-row button::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:28rpx}.section-head{display:flex;align-items:center;justify-content:space-between;padding:22rpx 24rpx;border-bottom:1rpx solid #eef1f5}.section-head>text{color:#1e3049;font-size:30rpx;font-weight:600}.sub-list{padding:18rpx}.sub-row{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx;padding:18rpx;margin-bottom:14rpx;background:#f8fbff;border:1rpx solid #e4edf8;border-radius:12rpx}.sub-row.selected{border-color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #eef5ff)}.sub-row>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:7rpx;color:#66778c;font-size:23rpx}.sub-title{color:#20334c;font-size:27rpx;font-weight:600}.sub-actions{display:flex;gap:10rpx;flex:none}.sub-row .danger{color:#c65050;border-color:#e3a0a0}.member-box{margin:0 18rpx 18rpx;padding:18rpx;background:#f8fbff;border:1rpx solid #e4edf8;border-radius:12rpx}.member-title{color:#20334c;font-size:27rpx;font-weight:600}.member-list{display:flex;flex-direction:column;gap:8rpx;padding-top:14rpx;color:#66778c;font-size:24rpx}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:50;display:flex;align-items:flex-end;background:rgba(0,0,0,.35)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:24rpx;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:88rpx;line-height:88rpx;color:#1d2f46;font-size:30rpx;font-weight:600;text-align:center;border-bottom:1rpx solid #eef1f5}.modal-actions{display:flex;gap:18rpx;padding:24rpx}.modal-actions button{flex:1;margin:0;color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #edf5ff);border-radius:12rpx}.modal-actions .primary{color:#fff;background:var(--color-primary, #1769d8)}
.confirm{margin-top:24rpx;color:#fff;font-size:30rpx;background:#18a058;border-radius:12rpx}.confirm::after{border:0}.section-head button.disabled{color:#8a99ad;background:#f4f6f9;border-color:#d9e0ea}.limit-tip{margin:16rpx 18rpx 0;padding:14rpx 18rpx;color:#8a5a00;font-size:23rpx;line-height:1.5;background:#fff7e6;border:1rpx solid #f2d7a0;border-radius:10rpx}.select-list{padding:18rpx}.select-row{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx;padding:18rpx;margin-bottom:14rpx;background:#f8fbff;border:1rpx solid #e4edf8;border-radius:12rpx}.select-row.checked{border-color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #eef5ff)}.select-row.disabled{opacity:.58}.select-row>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:7rpx;color:#66778c;font-size:23rpx}.check{flex:none;color:var(--color-primary, #1769d8);font-size:24rpx}
</style>
src/pages/mes/cal/plan/index.vue
@@ -87,5 +87,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;color:#1769d8;font-size:22rpx;background:#edf5ff;border:1rpx solid #bfdbff;border-radius:999rpx}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:0;flex:1;padding-bottom: 132rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;color:var(--color-primary, #1769d8);font-size:22rpx;background:var(--color-primary-soft, #edf5ff);border:1rpx solid var(--color-primary-border, #bfdbff);border-radius:999rpx}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width: 104rpx; height: 104rpx; min-height: 104rpx;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/cal/team/form.vue
@@ -124,5 +124,5 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.tabs{display:flex;gap:12rpx;padding:18rpx 22rpx;border-bottom:1rpx solid #eef1f5}.tabs text{padding:10rpx 20rpx;color:#53677f;font-size:25rpx;background:#f3f6fb;border-radius:999rpx}.tabs .active{color:#1769d8;font-weight:600;background:#eaf2ff}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:200rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:36rpx;text-align:right}.required{color:#e23b3b}.code-field button,.section-head button,.sub-row button{flex:none;min-width:100rpx;padding:0 14rpx;margin:0;color:#1769d8;font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.code-field button::after,.save::after,.modal-actions button::after,.section-head button::after,.sub-row button::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:28rpx}.section-head{display:flex;align-items:center;justify-content:space-between;padding:22rpx 24rpx;border-bottom:1rpx solid #eef1f5}.section-head>text{color:#1e3049;font-size:30rpx;font-weight:600}.sub-list{padding:18rpx}.sub-row{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx;padding:18rpx;margin-bottom:14rpx;background:#f8fbff;border:1rpx solid #e4edf8;border-radius:12rpx}.sub-row>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:7rpx;color:#66778c;font-size:23rpx}.sub-title{color:#20334c;font-size:27rpx;font-weight:600}.sub-row .danger{color:#c65050;border-color:#e3a0a0}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:50;display:flex;align-items:flex-end;background:rgba(0,0,0,.35)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:24rpx;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:88rpx;line-height:88rpx;color:#1d2f46;font-size:30rpx;font-weight:600;text-align:center;border-bottom:1rpx solid #eef1f5}.modal-actions{display:flex;gap:18rpx;padding:24rpx}.modal-actions button{flex:1;margin:0;color:#1769d8;background:#edf5ff;border-radius:12rpx}.modal-actions .primary{color:#fff;background:#1769d8}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.tabs{display:flex;gap:12rpx;padding:18rpx 22rpx;border-bottom:1rpx solid #eef1f5}.tabs text{padding:10rpx 20rpx;color:#53677f;font-size:25rpx;background:#f3f6fb;border-radius:999rpx}.tabs .active{color:var(--color-primary, #1769d8);font-weight:600;background:#eaf2ff}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:200rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:36rpx;text-align:right}.required{color:#e23b3b}.code-field button,.section-head button,.sub-row button{flex:none;min-width:100rpx;padding:0 14rpx;margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid var(--color-primary, #1769d8);border-radius:8rpx}.code-field button::after,.save::after,.modal-actions button::after,.section-head button::after,.sub-row button::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:28rpx}.section-head{display:flex;align-items:center;justify-content:space-between;padding:22rpx 24rpx;border-bottom:1rpx solid #eef1f5}.section-head>text{color:#1e3049;font-size:30rpx;font-weight:600}.sub-list{padding:18rpx}.sub-row{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx;padding:18rpx;margin-bottom:14rpx;background:#f8fbff;border:1rpx solid #e4edf8;border-radius:12rpx}.sub-row>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:7rpx;color:#66778c;font-size:23rpx}.sub-title{color:#20334c;font-size:27rpx;font-weight:600}.sub-row .danger{color:#c65050;border-color:#e3a0a0}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:50;display:flex;align-items:flex-end;background:rgba(0,0,0,.35)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:24rpx;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:88rpx;line-height:88rpx;color:#1d2f46;font-size:30rpx;font-weight:600;text-align:center;border-bottom:1rpx solid #eef1f5}.modal-actions{display:flex;gap:18rpx;padding:24rpx}.modal-actions button{flex:1;margin:0;color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #edf5ff);border-radius:12rpx}.modal-actions .primary{color:#fff;background:var(--color-primary, #1769d8)}
</style>
src/pages/mes/cal/team/index.vue
@@ -82,5 +82,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tag-approved{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:0;flex:1;padding-bottom: 132rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tag-approved{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #edf5ff);border:1rpx solid var(--color-primary-border, #bfdbff)}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width: 104rpx; height: 104rpx; min-height: 104rpx;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/dv/checkplan/form.vue
@@ -62,5 +62,5 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.form-card,.section-card{overflow:hidden;background:#fff;border-radius:16rpx}.section-card{margin-top:24rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.code-field button,.section-head button,.line button{flex:none;min-width:128rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:24rpx;line-height:54rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.code-field button::after,.section-head button::after,.line button::after,.save::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:130rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.section-head{display:flex;align-items:center;justify-content:space-between;height:86rpx;padding:0 24rpx;border-bottom:1rpx solid #edf1f6}.section-head>text{color:#20334c;font-size:29rpx;font-weight:600}.line{display:flex;flex-direction:column;gap:8rpx;padding:20rpx 24rpx;border-bottom:1rpx solid #edf1f6}.line view{display:flex;justify-content:space-between;gap:16rpx}.line view text:first-child{font-size:27rpx;font-weight:600;color:#20334c}.line view text:last-child,.line>text{color:#78879b;font-size:23rpx}.line button{align-self:flex-end;color:#c65050;border-color:#e3a0a0}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:24rpx}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.form-card,.section-card{overflow:hidden;background:#fff;border-radius:16rpx}.section-card{margin-top:24rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.code-field button,.section-head button,.line button{flex:none;min-width:128rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:54rpx;background:#fff;border:1rpx solid var(--color-primary, #1769d8);border-radius:8rpx}.code-field button::after,.section-head button::after,.line button::after,.save::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:130rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.section-head{display:flex;align-items:center;justify-content:space-between;height:86rpx;padding:0 24rpx;border-bottom:1rpx solid #edf1f6}.section-head>text{color:#20334c;font-size:29rpx;font-weight:600}.line{display:flex;flex-direction:column;gap:8rpx;padding:20rpx 24rpx;border-bottom:1rpx solid #edf1f6}.line view{display:flex;justify-content:space-between;gap:16rpx}.line view text:first-child{font-size:27rpx;font-weight:600;color:#20334c}.line view text:last-child,.line>text{color:#78879b;font-size:23rpx}.line button{align-self:flex-end;color:#c65050;border-color:#e3a0a0}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:24rpx}
</style>
src/pages/mes/dv/checkplan/index.vue
@@ -60,5 +60,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;justify-content:space-between;gap:16rpx}.head>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex!important;align-items:center!important;justify-content:center!important;flex:none!important;width:auto!important;min-width:0!important;min-height:36rpx!important;height:36rpx!important;padding:4rpx 14rpx!important;color:#1769d8;background:#eef5ff;border-radius:999rpx!important;line-height:1.2!important;white-space:nowrap}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:0;flex:1;padding-bottom: 132rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;justify-content:space-between;gap:16rpx}.head>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex!important;align-items:center!important;justify-content:center!important;flex:none!important;width:auto!important;min-width:0!important;min-height:36rpx!important;height:36rpx!important;padding:4rpx 14rpx!important;color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #eef5ff);border-radius:999rpx!important;line-height:1.2!important;white-space:nowrap}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width: 104rpx; height: 104rpx; min-height: 104rpx;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/dv/checkrecord/form.vue
@@ -22,5 +22,5 @@
</script>
<template><view class="page"><view class="form-card"><MachineryScanPicker :model-value="form.machineryId" :machineries="machineries" :current="{id:form.machineryId,code:form.machineryCode,name:form.machineryName,brand:form.machineryBrand,specification:form.machinerySpecification}" :disabled="readonly" @select="selectMachinery" /><view class="field"><text>点检计划</text><picker v-if="!readonly" :range="plans" range-key="name" @change="form.planId=plans[$event.detail.value].id"><view class="picker">{{planName()}}<text>›</text></view></picker><text v-else class="value">{{form.planName||'--'}}</text></view><view class="field"><text>点检人</text><picker v-if="!readonly" :range="users" range-key="nickname" @change="form.userId=users[$event.detail.value].id"><view class="picker">{{selectedUserName()}}<text>›</text></view></picker><text v-else class="value">{{form.nickname||'--'}}</text></view><view class="field"><text>点检时间 <text class="required">*</text></text><picker v-if="!readonly" mode="date" :value="form.checkTime?.slice(0,10)" @change="form.checkTime=$event.detail.value+' 00:00:00'"><view class="picker">{{dateText(form.checkTime).replace('--','请选择点检时间')}}<text>›</text></view></picker><text v-else class="value">{{dateText(form.checkTime)}}</text></view><view v-if="id" class="field"><text>状态</text><text class="value">{{dictLabel(dicts,'mes_dv_check_record_status',form.status)}}</text></view><view class="field column"><text>备注</text><textarea v-model="form.remark" :disabled="readonly" placeholder="请输入备注" ></textarea></view></view><button v-if="canSave" class="save" :loading="saving" :disabled="saving" @click="save">保存</button><view v-if="id" class="section-card"><view class="section-head"><text>明细列表</text><button v-if="!readonly" @click="openLine()">添加明细</button></view><view v-for="item in lines" :key="item.id" class="line"><view><text>{{item.subjectName||'项目'}}</text><text>{{dictLabel(dicts,'mes_dv_check_result',item.checkStatus)}}</text></view><text>项目内容:{{item.subjectContent||'--'}}</text><text>检查标准:{{item.subjectStandard||'--'}}</text><text>异常描述:{{item.checkResult||'--'}}</text><view v-if="!readonly" class="line-actions"><button @click="openLine(item)">编辑</button><button @click="removeLine(item)">删除</button></view></view><view v-if="!lines.length" class="state compact">暂无明细</view></view><button v-if="readonly&&form.status===10&&hasPermission('mes:dv-check-record:update')" class="save" @click="mode='edit'">编辑</button><view v-if="lineOpen" class="mask" @click="lineOpen=false"><view class="selector" @click.stop><view class="selector-head"><text>{{lineEditing?'修改明细':'添加明细'}}</text><text @click="lineOpen=false">关闭</text></view><view class="field"><text>项目 <text class="required">*</text></text><picker :range="subjects" range-key="name" @change="line.subjectId=subjects[$event.detail.value].id"><view class="picker">{{subjectName(line.subjectId)}}<text>›</text></view></picker></view><view class="field"><text>结果 <text class="required">*</text></text><picker :range="checkResults" range-key="label" @change="line.checkStatus=Number(checkResults[$event.detail.value].value)"><view class="picker">{{dictLabel(dicts,'mes_dv_check_result',line.checkStatus,'请选择结果')}}<text>›</text></view></picker></view><view class="field column"><text>异常描述</text><textarea v-model="line.checkResult" placeholder="请输入异常描述" ></textarea></view><view class="field column"><text>备注</text><textarea v-model="line.remark" placeholder="请输入备注" ></textarea></view><button class="save in-mask" @click="saveLine">保存明细</button></view></view></view></template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.form-card,.section-card{overflow:hidden;background:#fff;border-radius:16rpx}.section-card{margin-top:24rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:120rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.save::after,.section-head button::after,.line button::after{border:0}.section-head{display:flex;align-items:center;justify-content:space-between;height:86rpx;padding:0 24rpx;border-bottom:1rpx solid #edf1f6}.section-head>text{font-size:29rpx;font-weight:600;color:#20334c}.section-head button,.line button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:23rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.line{display:flex;flex-direction:column;gap:8rpx;padding:20rpx 24rpx;border-bottom:1rpx solid #edf1f6}.line view{display:flex;justify-content:space-between;gap:16rpx}.line text{font-size:23rpx;color:#78879b}.line view text:first-child{font-size:27rpx;font-weight:600;color:#20334c}.line-actions{justify-content:flex-end!important}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:24rpx}.mask{position:fixed;z-index:99;top:0;right:0;bottom:0;left:0;display:flex;align-items:flex-end;background:rgba(18,29,43,.42)}.selector{width:100%;max-height:78vh;overflow:auto;background:#fff;border-radius:24rpx 24rpx 0 0}.selector-head{display:flex;align-items:center;justify-content:space-between;height:92rpx;padding:0 30rpx;border-bottom:1rpx solid #edf1f6}.selector-head text:first-child{font-size:30rpx;font-weight:600;color:#20334c}.selector-head text:last-child{color:#1769d8;font-size:25rpx}.in-mask{margin:24rpx 30rpx 40rpx}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.form-card,.section-card{overflow:hidden;background:#fff;border-radius:16rpx}.section-card{margin-top:24rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:120rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.save::after,.section-head button::after,.line button::after{border:0}.section-head{display:flex;align-items:center;justify-content:space-between;height:86rpx;padding:0 24rpx;border-bottom:1rpx solid #edf1f6}.section-head>text{font-size:29rpx;font-weight:600;color:#20334c}.section-head button,.line button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:23rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.line{display:flex;flex-direction:column;gap:8rpx;padding:20rpx 24rpx;border-bottom:1rpx solid #edf1f6}.line view{display:flex;justify-content:space-between;gap:16rpx}.line text{font-size:23rpx;color:#78879b}.line view text:first-child{font-size:27rpx;font-weight:600;color:#20334c}.line-actions{justify-content:flex-end!important}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:24rpx}.mask{position:fixed;z-index:99;top:0;right:0;bottom:0;left:0;display:flex;align-items:flex-end;background:rgba(18,29,43,.42)}.selector{width:100%;max-height:78vh;overflow:auto;background:#fff;border-radius:24rpx 24rpx 0 0}.selector-head{display:flex;align-items:center;justify-content:space-between;height:92rpx;padding:0 30rpx;border-bottom:1rpx solid #edf1f6}.selector-head text:first-child{font-size:30rpx;font-weight:600;color:#20334c}.selector-head text:last-child{color:var(--color-primary, #1769d8);font-size:25rpx}.in-mask{margin:24rpx 30rpx 40rpx}
</style>
src/pages/mes/dv/checkrecord/index.vue
@@ -155,13 +155,13 @@
    font-size: 27rpx;
  }
  .search text {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 24rpx;
  }
  .content {
    height: 0;
    flex: 1;
    padding-bottom: 150rpx;
    padding-bottom: 132rpx;
    box-sizing: border-box;
  }
  .row {
@@ -205,8 +205,8 @@
    min-height: 36rpx !important;
    height: auto !important;
    padding: 4rpx 14rpx !important;
    color: #1769d8;
    background: #eef5ff;
    color: var(--color-primary, #1769d8);
    background: var(--color-primary-soft, #eef5ff);
    border-radius: 999rpx !important;
    line-height: 1.2 !important;
    white-space: nowrap;
@@ -237,11 +237,11 @@
    min-height: 50rpx;
    padding: 0 16rpx;
    margin: 0;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 22rpx;
    line-height: 48rpx;
    background: #f5f8ff;
    border: 1rpx solid #8ab3ee;
    background: var(--color-primary-soft, #f5f8ff);
    border: 1rpx solid var(--color-primary-border, #8ab3ee);
    border-radius: 8rpx;
  }
  .actions .danger {
@@ -271,12 +271,10 @@
    display: flex;
    align-items: center;
    justify-content: center;
    width: 132rpx;
    height: 132rpx;
    min-height: 132rpx;
    width: 104rpx; height: 104rpx; min-height: 104rpx;
    padding: 0;
    margin: 0;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 50%;
    box-shadow: 0 12rpx 24rpx rgba(23, 105, 216, 0.3);
  }
src/pages/mes/dv/components/MachineryScanPicker.vue
@@ -69,5 +69,5 @@
</template>
<style lang="scss" scoped>
  .field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:16rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.required{color:#df4c4c}.device-picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:12rpx;color:#8092a7;font-size:36rpx}.scan-button{width:88rpx;min-height:52rpx;padding:0;margin:0;color:#1769d8;font-size:23rpx;line-height:50rpx;background:#eef5ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.scan-button::after{border:0}.device-info{display:grid;grid-template-columns:1fr 1fr;gap:10rpx 18rpx;padding:16rpx 24rpx 20rpx;margin:0;color:#718198;font-size:22rpx;background:#f8faff;border-bottom:1rpx solid #eef1f5}.device-info text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:16rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.required{color:#df4c4c}.device-picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:12rpx;color:#8092a7;font-size:36rpx}.scan-button{width:88rpx;min-height:52rpx;padding:0;margin:0;color:var(--color-primary, #1769d8);font-size:23rpx;line-height:50rpx;background:var(--color-primary-soft, #eef5ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.scan-button::after{border:0}.device-info{display:grid;grid-template-columns:1fr 1fr;gap:10rpx 18rpx;padding:16rpx 24rpx 20rpx;margin:0;color:#718198;font-size:22rpx;background:#f8faff;border-bottom:1rpx solid #eef1f5}.device-info text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
</style>
src/pages/mes/dv/machinery/form.vue
@@ -300,5 +300,5 @@
</template>
<style lang="scss" scoped>
  .page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.form-card,.record-card{overflow:hidden;background:#fff;border-radius:16rpx}.record-card{margin-top:24rpx;padding-bottom:12rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input:disabled,.field textarea:disabled{color:#596a7e}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.code-field input{min-width:0}.code-field button{flex:none;min-width:136rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.code-field button::after,.save::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:28rpx}.tabs{display:flex;height:84rpx;align-items:flex-end;gap:22rpx;padding:0 24rpx;border-bottom:1rpx solid #edf1f6}.tabs text{padding:0 6rpx 18rpx;color:#718198;font-size:26rpx}.tabs .active{color:#1769d8;font-weight:600;border-bottom:4rpx solid #1769d8}.record{display:flex;flex-direction:column;gap:8rpx;padding:20rpx 24rpx;border-bottom:1rpx solid #edf1f6}.record:last-child{border-bottom:0}.record view{display:flex;align-items:center;justify-content:space-between;gap:16rpx}.record view text:first-child{min-width:0;overflow:hidden;color:#20334c;font-size:27rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.record view text:last-child{flex:none;padding:4rpx 10rpx;color:#1769d8;font-size:21rpx;background:#edf5ff;border-radius:7rpx}.record>text{overflow:hidden;color:#78879b;font-size:23rpx;text-overflow:ellipsis;white-space:nowrap}.mask{position:fixed;z-index:99;top:0;right:0;bottom:0;left:0;display:flex;align-items:flex-end;background:rgba(18,29,43,.42)}.selector{width:100%;max-height:72vh;overflow:hidden;background:#fff;border-radius:24rpx 24rpx 0 0}.selector-head{display:flex;align-items:center;justify-content:space-between;height:92rpx;padding:0 30rpx;border-bottom:1rpx solid #edf1f6}.selector-head text:first-child{color:#20334c;font-size:30rpx;font-weight:600}.selector-head text:last-child{color:#1769d8;font-size:25rpx}.selector-body{height:58vh}.tree-row{position:relative;display:flex;align-items:center;gap:8rpx;min-height:84rpx;padding:14rpx 28rpx 14rpx 24rpx;box-sizing:border-box;color:#52647a;font-size:27rpx;border-bottom:1rpx solid #edf1f6}.tree-row text{min-width:0;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tree-row.active{color:#1769d8;font-weight:600;background:#eef5ff}.tree-row.active::before{position:absolute;top:18rpx;bottom:18rpx;left:0;width:6rpx;background:#1769d8;border-radius:0 6rpx 6rpx 0;content:""}.tree-arrow{width:34rpx;height:38rpx;flex:none;opacity:0}.tree-arrow.show{position:relative;opacity:1}.tree-arrow.show::after{position:absolute;top:12rpx;left:8rpx;width:14rpx;height:14rpx;box-sizing:border-box;border-right:3rpx solid #7a8a9d;border-bottom:3rpx solid #7a8a9d;content:"";transform:rotate(-45deg)}.tree-arrow.open::after{transform:rotate(45deg)}
  .page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.form-card,.record-card{overflow:hidden;background:#fff;border-radius:16rpx}.record-card{margin-top:24rpx;padding-bottom:12rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input:disabled,.field textarea:disabled{color:#596a7e}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.code-field input{min-width:0}.code-field button{flex:none;min-width:136rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid var(--color-primary, #1769d8);border-radius:8rpx}.code-field button::after,.save::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:28rpx}.tabs{display:flex;height:84rpx;align-items:flex-end;gap:22rpx;padding:0 24rpx;border-bottom:1rpx solid #edf1f6}.tabs text{padding:0 6rpx 18rpx;color:#718198;font-size:26rpx}.tabs .active{color:var(--color-primary, #1769d8);font-weight:600;border-bottom:4rpx solid var(--color-primary, #1769d8)}.record{display:flex;flex-direction:column;gap:8rpx;padding:20rpx 24rpx;border-bottom:1rpx solid #edf1f6}.record:last-child{border-bottom:0}.record view{display:flex;align-items:center;justify-content:space-between;gap:16rpx}.record view text:first-child{min-width:0;overflow:hidden;color:#20334c;font-size:27rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.record view text:last-child{flex:none;padding:4rpx 10rpx;color:var(--color-primary, #1769d8);font-size:21rpx;background:var(--color-primary-soft, #edf5ff);border-radius:7rpx}.record>text{overflow:hidden;color:#78879b;font-size:23rpx;text-overflow:ellipsis;white-space:nowrap}.mask{position:fixed;z-index:99;top:0;right:0;bottom:0;left:0;display:flex;align-items:flex-end;background:rgba(18,29,43,.42)}.selector{width:100%;max-height:72vh;overflow:hidden;background:#fff;border-radius:24rpx 24rpx 0 0}.selector-head{display:flex;align-items:center;justify-content:space-between;height:92rpx;padding:0 30rpx;border-bottom:1rpx solid #edf1f6}.selector-head text:first-child{color:#20334c;font-size:30rpx;font-weight:600}.selector-head text:last-child{color:var(--color-primary, #1769d8);font-size:25rpx}.selector-body{height:58vh}.tree-row{position:relative;display:flex;align-items:center;gap:8rpx;min-height:84rpx;padding:14rpx 28rpx 14rpx 24rpx;box-sizing:border-box;color:#52647a;font-size:27rpx;border-bottom:1rpx solid #edf1f6}.tree-row text{min-width:0;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tree-row.active{color:var(--color-primary, #1769d8);font-weight:600;background:var(--color-primary-soft, #eef5ff)}.tree-row.active::before{position:absolute;top:18rpx;bottom:18rpx;left:0;width:6rpx;background:var(--color-primary, #1769d8);border-radius:0 6rpx 6rpx 0;content:""}.tree-arrow{width:34rpx;height:38rpx;flex:none;opacity:0}.tree-arrow.show{position:relative;opacity:1}.tree-arrow.show::after{position:absolute;top:12rpx;left:8rpx;width:14rpx;height:14rpx;box-sizing:border-box;border-right:3rpx solid #7a8a9d;border-bottom:3rpx solid #7a8a9d;content:"";transform:rotate(-45deg)}.tree-arrow.open::after{transform:rotate(45deg)}
</style>
src/pages/mes/dv/machinery/index.vue
@@ -185,5 +185,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 24rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;flex:none;align-items:center;height:80rpx;margin:20rpx 0 14rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.main-layout{height:0;min-height:0;flex:1;display:flex;gap:16rpx;padding-bottom:150rpx;box-sizing:border-box}.type-nav{width:188rpx;height:100%;flex:none;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.05)}.type-item{position:relative;display:flex;align-items:center;gap:4rpx;min-height:78rpx;padding:14rpx 12rpx 14rpx 16rpx;box-sizing:border-box;color:#617287;font-size:23rpx;border-bottom:1rpx solid #edf1f6}.type-item:last-child{border-bottom:0}.tree-arrow{width:24rpx;height:34rpx;flex:none;opacity:0}.tree-arrow.show{position:relative;opacity:1}.tree-arrow.show::after{position:absolute;top:11rpx;left:5rpx;width:12rpx;height:12rpx;box-sizing:border-box;border-right:3rpx solid #7a8a9d;border-bottom:3rpx solid #7a8a9d;content:"";transform:rotate(-45deg)}.tree-arrow.open::after{transform:rotate(45deg)}.type-item text{display:-webkit-box;min-width:0;overflow:hidden;line-height:1.25;text-overflow:ellipsis;-webkit-line-clamp:2;-webkit-box-orient:vertical}.type-item.active{color:#1769d8;font-weight:600;background:#eef5ff}.type-item.active::before{position:absolute;top:18rpx;bottom:18rpx;left:0;width:6rpx;background:#1769d8;border-radius:0 6rpx 6rpx 0;content:""}.type-item.active .tree-arrow.show::after{border-color:#1769d8}.content{height:100%;min-width:0;flex:1;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:center;justify-content:space-between;gap:16rpx}.head>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view text:last-child{overflow:hidden;color:#78879b;font-size:23rpx;text-overflow:ellipsis;white-space:nowrap}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex!important;align-items:center!important;justify-content:center!important;flex:none!important;width:auto!important;min-width:0!important;min-height:36rpx!important;height:36rpx!important;padding:4rpx 14rpx!important;font-size:22rpx!important;border-radius:999rpx!important;line-height:1.2!important;white-space:nowrap}.running{color:#1c9b68;background:#e8f8f0}.maintain{color:#d78321;background:#fff3df}.stopped{color:#8d9bad;background:#f0f3f6}.grid{display:grid;grid-template-columns:1fr;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));z-index:10;display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;color:#fff;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
.page{height:100vh;display:flex;flex-direction:column;padding:0 24rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;flex:none;align-items:center;height:80rpx;margin:20rpx 0 14rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.main-layout{height:0;min-height:0;flex:1;display:flex;gap:16rpx;padding-bottom: 132rpx;box-sizing:border-box}.type-nav{width:188rpx;height:100%;flex:none;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.05)}.type-item{position:relative;display:flex;align-items:center;gap:4rpx;min-height:78rpx;padding:14rpx 12rpx 14rpx 16rpx;box-sizing:border-box;color:#617287;font-size:23rpx;border-bottom:1rpx solid #edf1f6}.type-item:last-child{border-bottom:0}.tree-arrow{width:24rpx;height:34rpx;flex:none;opacity:0}.tree-arrow.show{position:relative;opacity:1}.tree-arrow.show::after{position:absolute;top:11rpx;left:5rpx;width:12rpx;height:12rpx;box-sizing:border-box;border-right:3rpx solid #7a8a9d;border-bottom:3rpx solid #7a8a9d;content:"";transform:rotate(-45deg)}.tree-arrow.open::after{transform:rotate(45deg)}.type-item text{display:-webkit-box;min-width:0;overflow:hidden;line-height:1.25;text-overflow:ellipsis;-webkit-line-clamp:2;-webkit-box-orient:vertical}.type-item.active{color:var(--color-primary, #1769d8);font-weight:600;background:var(--color-primary-soft, #eef5ff)}.type-item.active::before{position:absolute;top:18rpx;bottom:18rpx;left:0;width:6rpx;background:var(--color-primary, #1769d8);border-radius:0 6rpx 6rpx 0;content:""}.type-item.active .tree-arrow.show::after{border-color:var(--color-primary, #1769d8)}.content{height:100%;min-width:0;flex:1;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:center;justify-content:space-between;gap:16rpx}.head>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view text:last-child{overflow:hidden;color:#78879b;font-size:23rpx;text-overflow:ellipsis;white-space:nowrap}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex!important;align-items:center!important;justify-content:center!important;flex:none!important;width:auto!important;min-width:0!important;min-height:36rpx!important;height:36rpx!important;padding:4rpx 14rpx!important;font-size:22rpx!important;border-radius:999rpx!important;line-height:1.2!important;white-space:nowrap}.running{color:#1c9b68;background:#e8f8f0}.maintain{color:#d78321;background:#fff3df}.stopped{color:#8d9bad;background:#f0f3f6}.grid{display:grid;grid-template-columns:1fr;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));z-index:10;display:flex;align-items:center;justify-content:center;width: 104rpx; height: 104rpx; min-height: 104rpx;padding:0;margin:0;color:#fff;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/dv/machinery/type/form.vue
@@ -155,5 +155,5 @@
</template>
<style lang="scss" scoped>
  .page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.code-field input{min-width:0}.code-field button{flex:none;min-width:136rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.code-field button::after,.save::after{border:0}.field radio-group{display:flex;flex:1;gap:30rpx;font-size:26rpx}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text{width:auto}.column textarea{width:100%;height:130rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.mask{position:fixed;z-index:99;top:0;right:0;bottom:0;left:0;display:flex;align-items:flex-end;background:rgba(18,29,43,.42)}.selector{width:100%;max-height:72vh;overflow:hidden;background:#fff;border-radius:24rpx 24rpx 0 0}.selector-head{display:flex;align-items:center;justify-content:space-between;height:92rpx;padding:0 30rpx;border-bottom:1rpx solid #edf1f6}.selector-head text:first-child{color:#20334c;font-size:30rpx;font-weight:600}.selector-head text:last-child{color:#1769d8;font-size:25rpx}.selector-body{height:58vh}.tree-row{position:relative;display:flex;align-items:center;gap:8rpx;min-height:84rpx;padding:14rpx 28rpx 14rpx 24rpx;box-sizing:border-box;color:#52647a;font-size:27rpx;border-bottom:1rpx solid #edf1f6}.tree-row text{min-width:0;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tree-row.active{color:#1769d8;font-weight:600;background:#eef5ff}.tree-row.active::before{position:absolute;top:18rpx;bottom:18rpx;left:0;width:6rpx;background:#1769d8;border-radius:0 6rpx 6rpx 0;content:""}.tree-arrow{width:34rpx;height:38rpx;flex:none;opacity:0}.tree-arrow.show{position:relative;opacity:1}.tree-arrow.show::after{position:absolute;top:12rpx;left:8rpx;width:14rpx;height:14rpx;box-sizing:border-box;border-right:3rpx solid #7a8a9d;border-bottom:3rpx solid #7a8a9d;content:"";transform:rotate(-45deg)}.tree-arrow.open::after{transform:rotate(45deg)}
  .page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.code-field input{min-width:0}.code-field button{flex:none;min-width:136rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid var(--color-primary, #1769d8);border-radius:8rpx}.code-field button::after,.save::after{border:0}.field radio-group{display:flex;flex:1;gap:30rpx;font-size:26rpx}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text{width:auto}.column textarea{width:100%;height:130rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.mask{position:fixed;z-index:99;top:0;right:0;bottom:0;left:0;display:flex;align-items:flex-end;background:rgba(18,29,43,.42)}.selector{width:100%;max-height:72vh;overflow:hidden;background:#fff;border-radius:24rpx 24rpx 0 0}.selector-head{display:flex;align-items:center;justify-content:space-between;height:92rpx;padding:0 30rpx;border-bottom:1rpx solid #edf1f6}.selector-head text:first-child{color:#20334c;font-size:30rpx;font-weight:600}.selector-head text:last-child{color:var(--color-primary, #1769d8);font-size:25rpx}.selector-body{height:58vh}.tree-row{position:relative;display:flex;align-items:center;gap:8rpx;min-height:84rpx;padding:14rpx 28rpx 14rpx 24rpx;box-sizing:border-box;color:#52647a;font-size:27rpx;border-bottom:1rpx solid #edf1f6}.tree-row text{min-width:0;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tree-row.active{color:var(--color-primary, #1769d8);font-weight:600;background:var(--color-primary-soft, #eef5ff)}.tree-row.active::before{position:absolute;top:18rpx;bottom:18rpx;left:0;width:6rpx;background:var(--color-primary, #1769d8);border-radius:0 6rpx 6rpx 0;content:""}.tree-arrow{width:34rpx;height:38rpx;flex:none;opacity:0}.tree-arrow.show{position:relative;opacity:1}.tree-arrow.show::after{position:absolute;top:12rpx;left:8rpx;width:14rpx;height:14rpx;box-sizing:border-box;border-right:3rpx solid #7a8a9d;border-bottom:3rpx solid #7a8a9d;content:"";transform:rotate(-45deg)}.tree-arrow.open::after{transform:rotate(45deg)}
</style>
src/pages/mes/dv/machinery/type/index.vue
@@ -129,5 +129,5 @@
</template>
<style lang="scss" scoped>
  .page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.tree{overflow:hidden;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.row{display:flex;align-items:center;gap:12rpx;min-height:94rpx;padding:14rpx 18rpx 14rpx 22rpx;box-sizing:border-box;border-bottom:1rpx solid #edf1f7}.row:last-child{border-bottom:0}.main{display:flex;align-items:center;min-width:0;flex:1;gap:12rpx}.arrow{width:18rpx;height:18rpx;flex:none;opacity:0;border-right:4rpx solid #637891;border-bottom:4rpx solid #637891;transform:rotate(-45deg)}.arrow.show{opacity:1}.arrow.open{transform:rotate(45deg)}.info{display:flex;min-width:0;flex:1;flex-direction:column;gap:6rpx}.title-line{display:flex;align-items:center;gap:10rpx;min-width:0}.name{overflow:hidden;color:#20334c;font-size:29rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.title-line .name{flex:1}.info>text{overflow:hidden;color:#78879b;font-size:22rpx;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex!important;align-items:center!important;justify-content:center!important;flex:none!important;width:auto!important;min-width:0!important;min-height:36rpx!important;height:36rpx!important;padding:4rpx 14rpx!important;font-size:22rpx!important;border-radius:999rpx!important;line-height:1.2!important;white-space:nowrap}.actions{display:flex;flex:none;flex-wrap:wrap;justify-content:flex-end;gap:8rpx}.actions button{min-height:50rpx;padding:0 14rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.state{display:block;padding:70rpx 20rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));z-index:10;display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;color:#fff;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
  .page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:0;flex:1;padding-bottom: 132rpx;box-sizing:border-box}.tree{overflow:hidden;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.row{display:flex;align-items:center;gap:12rpx;min-height:94rpx;padding:14rpx 18rpx 14rpx 22rpx;box-sizing:border-box;border-bottom:1rpx solid #edf1f7}.row:last-child{border-bottom:0}.main{display:flex;align-items:center;min-width:0;flex:1;gap:12rpx}.arrow{width:18rpx;height:18rpx;flex:none;opacity:0;border-right:4rpx solid #637891;border-bottom:4rpx solid #637891;transform:rotate(-45deg)}.arrow.show{opacity:1}.arrow.open{transform:rotate(45deg)}.info{display:flex;min-width:0;flex:1;flex-direction:column;gap:6rpx}.title-line{display:flex;align-items:center;gap:10rpx;min-width:0}.name{overflow:hidden;color:#20334c;font-size:29rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.title-line .name{flex:1}.info>text{overflow:hidden;color:#78879b;font-size:22rpx;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex!important;align-items:center!important;justify-content:center!important;flex:none!important;width:auto!important;min-width:0!important;min-height:36rpx!important;height:36rpx!important;padding:4rpx 14rpx!important;font-size:22rpx!important;border-radius:999rpx!important;line-height:1.2!important;white-space:nowrap}.actions{display:flex;flex:none;flex-wrap:wrap;justify-content:flex-end;gap:8rpx}.actions button{min-height:50rpx;padding:0 14rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.state{display:block;padding:70rpx 20rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));z-index:10;display:flex;align-items:center;justify-content:center;width: 104rpx; height: 104rpx; min-height: 104rpx;padding:0;margin:0;color:#fff;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/dv/maintenrecord/form.vue
@@ -22,5 +22,5 @@
</script>
<template><view class="page"><view class="form-card"><MachineryScanPicker :model-value="form.machineryId" :machineries="machineries" :current="{id:form.machineryId,code:form.machineryCode,name:form.machineryName,brand:form.machineryBrand,specification:form.machinerySpecification}" :disabled="readonly" @select="selectMachinery" /><view class="field"><text>保养计划</text><picker v-if="!readonly" :range="plans" range-key="name" @change="form.planId=plans[$event.detail.value].id"><view class="picker">{{planName()}}<text>›</text></view></picker><text v-else class="value">{{form.planName||'--'}}</text></view><view class="field"><text>保养人</text><picker v-if="!readonly" :range="users" range-key="nickname" @change="form.userId=users[$event.detail.value].id"><view class="picker">{{selectedUserName()}}<text>›</text></view></picker><text v-else class="value">{{form.nickname||'--'}}</text></view><view class="field"><text>保养时间 <text class="required">*</text></text><picker v-if="!readonly" mode="date" :value="form.maintenTime?.slice(0,10)" @change="form.maintenTime=$event.detail.value+' 00:00:00'"><view class="picker">{{dateText(form.maintenTime).replace('--','请选择保养时间')}}<text>›</text></view></picker><text v-else class="value">{{dateText(form.maintenTime)}}</text></view><view v-if="id" class="field"><text>状态</text><text class="value">{{dictLabel(dicts,'mes_mainten_record_status',form.status)}}</text></view><view class="field column"><text>备注</text><textarea v-model="form.remark" :disabled="readonly" placeholder="请输入备注" ></textarea></view></view><button v-if="canSave" class="save" :loading="saving" :disabled="saving" @click="save">保存</button><view v-if="id" class="section-card"><view class="section-head"><text>明细列表</text><button v-if="!readonly" @click="openLine()">添加明细</button></view><view v-for="item in lines" :key="item.id" class="line"><view><text>{{item.subjectName||'项目'}}</text><text>{{dictLabel(dicts,'mes_mainten_status',item.status)}}</text></view><text>项目内容:{{item.subjectContent||'--'}}</text><text>项目标准:{{item.subjectStandard||'--'}}</text><text>异常描述:{{item.result||'--'}}</text><view v-if="!readonly" class="line-actions"><button @click="openLine(item)">编辑</button><button @click="removeLine(item)">删除</button></view></view><view v-if="!lines.length" class="state compact">暂无明细</view></view><button v-if="readonly&&form.status===10&&hasPermission('mes:dv-mainten-record:update')" class="save" @click="mode='edit'">编辑</button><view v-if="lineOpen" class="mask" @click="lineOpen=false"><view class="selector" @click.stop><view class="selector-head"><text>{{lineEditing?'修改明细':'添加明细'}}</text><text @click="lineOpen=false">关闭</text></view><view class="field"><text>项目 <text class="required">*</text></text><picker :range="subjects" range-key="name" @change="line.subjectId=subjects[$event.detail.value].id"><view class="picker">{{subjectName(line.subjectId)}}<text>›</text></view></picker></view><view class="field"><text>结果 <text class="required">*</text></text><picker :range="results" range-key="label" @change="line.status=Number(results[$event.detail.value].value)"><view class="picker">{{dictLabel(dicts,'mes_mainten_status',line.status,'请选择结果')}}<text>›</text></view></picker></view><view class="field column"><text>异常描述</text><textarea v-model="line.result" placeholder="请输入异常描述" ></textarea></view><view class="field column"><text>备注</text><textarea v-model="line.remark" placeholder="请输入备注" ></textarea></view><button class="save in-mask" @click="saveLine">保存明细</button></view></view></view></template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.form-card,.section-card{overflow:hidden;background:#fff;border-radius:16rpx}.section-card{margin-top:24rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:120rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.save::after,.section-head button::after,.line button::after{border:0}.section-head{display:flex;align-items:center;justify-content:space-between;height:86rpx;padding:0 24rpx;border-bottom:1rpx solid #edf1f6}.section-head>text{font-size:29rpx;font-weight:600;color:#20334c}.section-head button,.line button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:23rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.line{display:flex;flex-direction:column;gap:8rpx;padding:20rpx 24rpx;border-bottom:1rpx solid #edf1f6}.line view{display:flex;justify-content:space-between;gap:16rpx}.line text{font-size:23rpx;color:#78879b}.line view text:first-child{font-size:27rpx;font-weight:600;color:#20334c}.line-actions{justify-content:flex-end!important}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:24rpx}.mask{position:fixed;z-index:99;top:0;right:0;bottom:0;left:0;display:flex;align-items:flex-end;background:rgba(18,29,43,.42)}.selector{width:100%;max-height:78vh;overflow:auto;background:#fff;border-radius:24rpx 24rpx 0 0}.selector-head{display:flex;align-items:center;justify-content:space-between;height:92rpx;padding:0 30rpx;border-bottom:1rpx solid #edf1f6}.selector-head text:first-child{font-size:30rpx;font-weight:600;color:#20334c}.selector-head text:last-child{color:#1769d8;font-size:25rpx}.in-mask{margin:24rpx 30rpx 40rpx}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.form-card,.section-card{overflow:hidden;background:#fff;border-radius:16rpx}.section-card{margin-top:24rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:120rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.save::after,.section-head button::after,.line button::after{border:0}.section-head{display:flex;align-items:center;justify-content:space-between;height:86rpx;padding:0 24rpx;border-bottom:1rpx solid #edf1f6}.section-head>text{font-size:29rpx;font-weight:600;color:#20334c}.section-head button,.line button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:23rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.line{display:flex;flex-direction:column;gap:8rpx;padding:20rpx 24rpx;border-bottom:1rpx solid #edf1f6}.line view{display:flex;justify-content:space-between;gap:16rpx}.line text{font-size:23rpx;color:#78879b}.line view text:first-child{font-size:27rpx;font-weight:600;color:#20334c}.line-actions{justify-content:flex-end!important}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:24rpx}.mask{position:fixed;z-index:99;top:0;right:0;bottom:0;left:0;display:flex;align-items:flex-end;background:rgba(18,29,43,.42)}.selector{width:100%;max-height:78vh;overflow:auto;background:#fff;border-radius:24rpx 24rpx 0 0}.selector-head{display:flex;align-items:center;justify-content:space-between;height:92rpx;padding:0 30rpx;border-bottom:1rpx solid #edf1f6}.selector-head text:first-child{font-size:30rpx;font-weight:600;color:#20334c}.selector-head text:last-child{color:var(--color-primary, #1769d8);font-size:25rpx}.in-mask{margin:24rpx 30rpx 40rpx}
</style>
src/pages/mes/dv/maintenrecord/index.vue
@@ -14,5 +14,5 @@
</script>
<template><view class="page"><template v-if="isLoggedIn"><view v-if="canQuery" class="search"><input v-model="keyword" placeholder="搜索设备名称" confirm-type="search" @confirm="load(true)" /><text v-if="keyword" @click="keyword='';load(true)">清除</text></view><scroll-view v-if="canQuery" class="content" scroll-y lower-threshold="80" @scrolltolower="hasMore&&load()"><view v-if="loadError" class="state error" @click="load(true)">{{loadError}},点击重试</view><view v-else-if="rows.length"><view v-for="item in rows" :key="item.id" class="row" @click="go(item.id,'detail')"><view class="head"><view><text class="name">{{item.machineryName||'未命名设备'}}</text><text>{{item.machineryCode||'暂无编码'}}</text></view><view class="status-wrap"><text :class="['status', item.status === 20 ? 'enabled' : 'disabled']">{{dictLabel(dicts,'mes_mainten_record_status',item.status)}}</text></view></view><view class="grid"><text>计划名称:{{item.planName||'--'}}</text><text>保养时间:{{dateText(item.maintenTime)}}</text><text>保养人:{{item.nickname||'--'}}</text><text>创建时间:{{dateText(item.createTime)}}</text></view><view class="actions"><button v-if="canQuery" @click.stop="go(item.id,'detail')">详情</button><button v-if="canUpdate&&item.status===10" @click.stop="go(item.id)">编辑</button><button v-if="canUpdate&&item.status===10" @click.stop="action(item,'submit')">提交</button><button v-if="canDelete&&item.status===10" class="danger" @click.stop="action(item,'delete')">删除</button></view></view><text class="more">{{loading?'加载中...':hasMore?'上拉加载更多':'没有更多了'}}</text></view><view v-else class="state">{{loading?'加载中...':keyword?'没有匹配的记录':'暂无保养记录'}}</view></scroll-view><view v-else class="state">暂无保养记录查看权限</view></template><view v-else class="state">登录后查看保养记录</view><button v-if="canCreate" class="fab" @click="go()"><view /></button></view></template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;justify-content:space-between;gap:16rpx}.head>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex!important;align-items:center!important;justify-content:center!important;flex:none!important;width:auto!important;min-width:0!important;min-height:36rpx!important;height:36rpx!important;padding:4rpx 14rpx!important;color:#1769d8;background:#eef5ff;border-radius:999rpx!important;line-height:1.2!important;white-space:nowrap}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:0;flex:1;padding-bottom: 132rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;justify-content:space-between;gap:16rpx}.head>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex!important;align-items:center!important;justify-content:center!important;flex:none!important;width:auto!important;min-width:0!important;min-height:36rpx!important;height:36rpx!important;padding:4rpx 14rpx!important;color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #eef5ff);border-radius:999rpx!important;line-height:1.2!important;white-space:nowrap}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width: 104rpx; height: 104rpx; min-height: 104rpx;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/dv/metering/form.vue
@@ -16,5 +16,5 @@
</script>
<template><view class="page"><view class="form-card"><view class="field"><text>器具编码 <text class="required">*</text></text><input v-model="form.code" :disabled="!!id||readonly" placeholder="请输入器具编码" /></view><view class="field"><text>器具名称 <text class="required">*</text></text><input v-model="form.name" :disabled="readonly" placeholder="请输入器具名称" /></view><view class="field"><text>器具类别 <text class="required">*</text></text><picker v-if="!readonly" :range="categories" range-key="label" @change="form.category=Number(categories[$event.detail.value].value)"><view class="picker">{{dictLabel(dicts,'mes_dv_metering_category',form.category,'请选择器具类别')}}<text>›</text></view></picker><text v-else class="value">{{dictLabel(dicts,'mes_dv_metering_category',form.category)}}</text></view><view class="field"><text>规格型号</text><input v-model="form.specification" :disabled="readonly" placeholder="请输入规格型号" /></view><view class="field"><text>品牌/生产厂家</text><input v-model="form.brand" :disabled="readonly" placeholder="请输入品牌/生产厂家" /></view><view class="field"><text>精度</text><input v-model="form.precision" :disabled="readonly" placeholder="请输入精度" /></view><view class="field"><text>量程</text><input v-model="form.range" :disabled="readonly" placeholder="请输入量程" /></view><view class="field"><text>使用部门</text><picker v-if="!readonly" :range="deptOptions" range-key="name" @change="form.deptId=deptOptions[$event.detail.value].id"><view class="picker">{{deptName()}}<text>›</text></view></picker><text v-else class="value">{{form.deptName||'--'}}</text></view><view class="field"><text>责任人</text><picker v-if="!readonly" :range="users" range-key="nickname" @change="form.chargeUserId=users[$event.detail.value].id"><view class="picker">{{chargeName()}}<text>›</text></view></picker><text v-else class="value">{{form.chargeUserNickname||'--'}}</text></view><view class="field"><text>校准周期 <text class="required">*</text></text><input v-model="form.checkCycleCount" :disabled="readonly" type="number" placeholder="请输入校准周期(月)" /></view><view class="field"><text>投入使用日期</text><picker v-if="!readonly" mode="date" :value="form.useDate" @change="form.useDate=$event.detail.value"><view class="picker">{{dayText(form.useDate).replace('--','请选择投入使用日期')}}<text>›</text></view></picker><text v-else class="value">{{dayText(form.useDate)}}</text></view><view v-if="readonly" class="field"><text>上次检测日期</text><text class="value">{{dayText(form.lastCheckDate)}}</text></view><view v-if="readonly" class="field"><text>下次检测日期</text><text class="value">{{dayText(form.nextCheckDate)}}</text></view><view class="field"><text>器具状态</text><picker v-if="!readonly" :range="statuses" range-key="label" @change="form.status=Number(statuses[$event.detail.value].value)"><view class="picker">{{dictLabel(dicts,'mes_dv_metering_status',form.status,'请选择器具状态')}}<text>›</text></view></picker><text v-else class="value">{{dictLabel(dicts,'mes_dv_metering_status',form.status)}}</text></view><view v-if="readonly" class="field"><text>到期状态</text><text class="value">{{dictLabel(dicts,'mes_dv_metering_expire_status',form.expireStatus)}}</text></view><view class="field column"><text>备注</text><textarea v-model="form.remark" :disabled="readonly" placeholder="请输入备注" ></textarea></view></view><button v-if="canSave" class="save" :loading="saving" :disabled="saving" @click="save">保存</button><button v-else-if="readonly&&hasPermission('mes:dv-metering:update')" class="save" @click="mode='edit'">编辑</button><view v-else class="state">暂无保存权限</view></view></template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:210rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:130rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.save::after{border:0}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:210rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:130rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.save::after{border:0}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}
</style>
src/pages/mes/dv/metering/index.vue
@@ -14,5 +14,5 @@
</script>
<template><view class="page"><template v-if="isLoggedIn"><view v-if="canQuery" class="search"><input v-model="keyword" placeholder="搜索器具名称" confirm-type="search" @confirm="load(true)" /><text v-if="keyword" @click="keyword='';load(true)">清除</text></view><scroll-view v-if="canQuery" class="content" scroll-y lower-threshold="80" @scrolltolower="hasMore&&load()"><view v-if="loadError" class="state error" @click="load(true)">{{loadError}},点击重试</view><view v-else-if="rows.length"><view v-for="item in rows" :key="item.id" class="row" @click="go(item.id,'detail')"><view class="head"><view><text class="name">{{item.name||'未命名器具'}}</text><text>{{item.code||'暂无编码'}}</text></view><view class="status-wrap"><text :class="['status', item.expireStatus === 0 ? 'enabled' : item.expireStatus === 1 ? 'warning' : 'danger']">{{dictLabel(dicts,'mes_dv_metering_expire_status',item.expireStatus)}}</text></view></view><view class="tags"><text>{{dictLabel(dicts,'mes_dv_metering_category',item.category)}}</text><text :class="item.status === 0 ? 'enabled' : 'disabled'">{{dictLabel(dicts,'mes_dv_metering_status',item.status)}}</text></view><view class="grid"><text>规格型号:{{item.specification||'--'}}</text><text>品牌/生产厂家:{{item.brand||'--'}}</text><text>使用部门:{{item.deptName||'--'}}</text><text>责任人:{{item.chargeUserNickname||'--'}}</text><text>下次检测日期:{{dayText(item.nextCheckDate)}}</text><text>创建时间:{{dateText(item.createTime)}}</text></view><view class="actions"><button v-if="canQuery" @click.stop="go(item.id,'detail')">详情</button><button v-if="canUpdate" @click.stop="go(item.id)">编辑</button><button v-if="canDelete" class="danger" @click.stop="remove(item)">删除</button></view></view><text class="more">{{loading?'加载中...':hasMore?'上拉加载更多':'没有更多了'}}</text></view><view v-else class="state">{{loading?'加载中...':keyword?'没有匹配的器具':'暂无计量器具'}}</view></scroll-view><view v-else class="state">暂无计量器具查看权限</view></template><view v-else class="state">登录后查看计量器具</view><button v-if="canCreate" class="fab" @click="go()"><view /></button></view></template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;justify-content:space-between;gap:16rpx}.head>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex!important;align-items:center!important;justify-content:center!important;flex:none!important;width:auto!important;min-width:0!important;min-height:36rpx!important;height:36rpx!important;padding:4rpx 14rpx!important;color:#1769d8;background:#eef5ff;border-radius:999rpx!important;line-height:1.2!important;white-space:nowrap}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:0;flex:1;padding-bottom: 132rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;justify-content:space-between;gap:16rpx}.head>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex!important;align-items:center!important;justify-content:center!important;flex:none!important;width:auto!important;min-width:0!important;min-height:36rpx!important;height:36rpx!important;padding:4rpx 14rpx!important;color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #eef5ff);border-radius:999rpx!important;line-height:1.2!important;white-space:nowrap}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width: 104rpx; height: 104rpx; min-height: 104rpx;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/dv/meteringcheck/form.vue
@@ -15,5 +15,5 @@
</script>
<template><view class="page"><view class="form-card"><view class="field"><text>计量器具 <text class="required">*</text></text><picker v-if="!readonly" :range="meterings" range-key="name" @change="form.meteringId=meterings[$event.detail.value].id"><view class="picker">{{meteringName()}}<text>›</text></view></picker><text v-else class="value">{{form.meteringName||'--'}}</text></view><view class="field"><text>检测编号 <text class="required">*</text></text><input v-model="form.checkCode" :disabled="readonly" placeholder="请输入检测编号" /></view><view class="field"><text>检测日期 <text class="required">*</text></text><picker v-if="!readonly" mode="date" :value="form.checkDate" @change="form.checkDate=$event.detail.value"><view class="picker">{{dayText(form.checkDate).replace('--','请选择检测日期')}}<text>›</text></view></picker><text v-else class="value">{{dayText(form.checkDate)}}</text></view><view class="field"><text>检测机构</text><input v-model="form.checkOrg" :disabled="readonly" placeholder="请输入检测机构" /></view><view class="field"><text>检测结论 <text class="required">*</text></text><picker v-if="!readonly" :range="results" range-key="label" @change="form.checkResult=Number(results[$event.detail.value].value)"><view class="picker">{{dictLabel(dicts,'mes_dv_metering_check_result',form.checkResult,'请选择检测结论')}}<text>›</text></view></picker><text v-else class="value">{{dictLabel(dicts,'mes_dv_metering_check_result',form.checkResult)}}</text></view><view class="field"><text>证书编号</text><input v-model="form.certNo" :disabled="readonly" placeholder="请输入证书编号" /></view><view class="field"><text>检测人</text><picker v-if="!readonly" :range="users" range-key="nickname" @change="form.checkUserId=users[$event.detail.value].id"><view class="picker">{{checkUserName()}}<text>›</text></view></picker><text v-else class="value">{{form.checkUserNickname||'--'}}</text></view><view class="field"><text>下次检测日期</text><picker v-if="!readonly" mode="date" :value="form.nextCheckDate" @change="form.nextCheckDate=$event.detail.value"><view class="picker">{{dayText(form.nextCheckDate).replace('--','请选择下次检测日期')}}<text>›</text></view></picker><text v-else class="value">{{dayText(form.nextCheckDate)}}</text></view><view class="field column"><text>备注</text><textarea v-model="form.remark" :disabled="readonly" placeholder="请输入备注" ></textarea></view></view><button v-if="canSave" class="save" :loading="saving" :disabled="saving" @click="save">保存</button><button v-else-if="readonly&&hasPermission('mes:dv-metering-check:update')" class="save" @click="mode='edit'">编辑</button><view v-else class="state">暂无保存权限</view></view></template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:210rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:130rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.save::after{border:0}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:210rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:130rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.save::after{border:0}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}
</style>
src/pages/mes/dv/meteringcheck/index.vue
@@ -14,5 +14,5 @@
</script>
<template><view class="page"><template v-if="isLoggedIn"><view v-if="canQuery" class="search"><input v-model="keyword" placeholder="搜索检测编号" confirm-type="search" @confirm="load(true)" /><text v-if="keyword" @click="keyword='';load(true)">清除</text></view><scroll-view v-if="canQuery" class="content" scroll-y lower-threshold="80" @scrolltolower="hasMore&&load()"><view v-if="loadError" class="state error" @click="load(true)">{{loadError}},点击重试</view><view v-else-if="rows.length"><view v-for="item in rows" :key="item.id" class="row" @click="go(item.id,'detail')"><view class="head"><view><text class="name">{{item.checkCode||'检测记录'}}</text><text>{{item.meteringName||item.meteringCode||'计量器具'}}</text></view><view class="status-wrap"><text :class="['status', item.checkResult === 1 ? 'enabled' : 'danger']">{{dictLabel(dicts,'mes_dv_metering_check_result',item.checkResult)}}</text></view></view><view class="grid"><text>器具编码:{{item.meteringCode||'--'}}</text><text>检测日期:{{dayText(item.checkDate)}}</text><text>检测机构:{{item.checkOrg||'--'}}</text><text>证书编号:{{item.certNo||'--'}}</text><text>检测人:{{item.checkUserNickname||'--'}}</text><text>下次检测日期:{{dayText(item.nextCheckDate)}}</text><text>创建时间:{{dateText(item.createTime)}}</text></view><view class="actions"><button v-if="canQuery" @click.stop="go(item.id,'detail')">详情</button><button v-if="canUpdate" @click.stop="go(item.id)">编辑</button><button v-if="canDelete" class="danger" @click.stop="remove(item)">删除</button></view></view><text class="more">{{loading?'加载中...':hasMore?'上拉加载更多':'没有更多了'}}</text></view><view v-else class="state">{{loading?'加载中...':keyword?'没有匹配的记录':'暂无计量检测记录'}}</view></scroll-view><view v-else class="state">暂无计量检测记录查看权限</view></template><view v-else class="state">登录后查看计量检测记录</view><button v-if="canCreate" class="fab" @click="go()"><view /></button></view></template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;justify-content:space-between;gap:16rpx}.head>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex!important;align-items:center!important;justify-content:center!important;flex:none!important;width:auto!important;min-width:0!important;min-height:36rpx!important;height:36rpx!important;padding:4rpx 14rpx!important;color:#1769d8;background:#eef5ff;border-radius:999rpx!important;line-height:1.2!important;white-space:nowrap}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:0;flex:1;padding-bottom: 132rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;justify-content:space-between;gap:16rpx}.head>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex!important;align-items:center!important;justify-content:center!important;flex:none!important;width:auto!important;min-width:0!important;min-height:36rpx!important;height:36rpx!important;padding:4rpx 14rpx!important;color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #eef5ff);border-radius:999rpx!important;line-height:1.2!important;white-space:nowrap}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width: 104rpx; height: 104rpx; min-height: 104rpx;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/dv/repair/form.vue
@@ -23,5 +23,5 @@
</script>
<template><view class="page"><view class="form-card"><view class="field code-field"><text>维修单编码 <text class="required">*</text></text><input v-model="form.code" :disabled="!!id||readonly||confirmMode" placeholder="请输入维修单编码" /><button v-if="!id&&!readonly&&!confirmMode" :loading="generating" :disabled="generating" @click="generateCode">{{generating?'生成中':'自动生成'}}</button></view><view class="field"><text>维修单名称 <text class="required">*</text></text><input v-model="form.name" :disabled="readonly||confirmMode" placeholder="请输入维修单名称" /></view><MachineryScanPicker :model-value="form.machineryId" :machineries="machineries" :current="{id:form.machineryId,code:form.machineryCode,name:form.machineryName,brand:form.machineryBrand,specification:form.machinerySpecification}" :disabled="readonly||confirmMode" @select="selectMachinery" /><view class="field"><text>报修日期 <text class="required">*</text></text><picker v-if="!readonly&&!confirmMode" mode="date" :value="form.requireDate?.slice(0,10)" @change="form.requireDate=$event.detail.value+' 00:00:00'"><view class="picker">{{dateText(form.requireDate).replace('--','请选择报修日期')}}<text>›</text></view></picker><text v-else class="value">{{dateText(form.requireDate)}}</text></view><view v-if="form.status&&form.status>=20" class="field"><text>维修完成日期</text><picker v-if="confirmMode" mode="date" :value="form.finishDate?.slice(0,10)" @change="form.finishDate=$event.detail.value+' 00:00:00'"><view class="picker">{{dateText(form.finishDate).replace('--','请选择完成日期')}}<text>›</text></view></picker><text v-else class="value">{{dateText(form.finishDate)}}</text></view><view v-if="id" class="field"><text>维修人</text><text class="value">{{form.acceptedUserNickname||'--'}}</text></view><view v-if="form.status&&form.status>=40" class="field"><text>验收人</text><text class="value">{{form.confirmUserNickname||'--'}}</text></view><view v-if="form.status&&form.status>=40" class="field"><text>验收日期</text><text class="value">{{dateText(form.confirmDate)}}</text></view><view v-if="form.status&&form.status>=40" class="field"><text>维修结果</text><text class="value">{{dictLabel(dicts,'mes_dv_repair_result',form.result)}}</text></view><view v-if="id" class="field"><text>状态</text><text class="value">{{dictLabel(dicts,'mes_dv_repair_status',form.status)}}</text></view><view class="field column"><text>备注</text><textarea v-model="form.remark" :disabled="readonly||confirmMode" placeholder="请输入备注" ></textarea></view></view><button v-if="canSave&&(confirmMode||(!readonly&&mode!=='finish'))" class="save" :loading="saving" :disabled="saving" @click="save">{{confirmMode?'确认完成':'保存'}}</button><view v-if="id" class="section-card"><view class="section-head"><text>维修项目明细</text><button v-if="!readonly&&!confirmMode" @click="openLine()">添加维修项目</button></view><view v-for="item in lines" :key="item.id" class="line"><view><text>{{item.subjectName||'项目'}}</text><text>{{item.subjectContent||'--'}}</text></view><text>项目标准:{{item.subjectStandard||'--'}}</text><text>故障描述:{{item.malfunction||'--'}}</text><text>故障图片:{{item.malfunctionUrl||'--'}}</text><text>维修描述:{{item.description||'--'}}</text><view v-if="!readonly&&!confirmMode" class="line-actions"><button @click="openLine(item)">编辑</button><button @click="removeLine(item)">删除</button></view></view><view v-if="!lines.length" class="state compact">暂无维修项目</view></view><view v-if="lineOpen" class="mask" @click="lineOpen=false"><view class="selector" @click.stop><view class="selector-head"><text>{{lineEditing?'修改维修项目':'添加维修项目'}}</text><text @click="lineOpen=false">关闭</text></view><view class="field"><text>项目 <text class="required">*</text></text><picker :range="subjects" range-key="name" @change="line.subjectId=subjects[$event.detail.value].id"><view class="picker">{{subjectName(line.subjectId)}}<text>›</text></view></picker></view><view class="field column"><text>故障描述 <text class="required">*</text></text><textarea v-model="line.malfunction" placeholder="请输入故障描述" ></textarea></view><view class="field"><text>故障图片</text><input v-model="line.malfunctionUrl" placeholder="请输入故障图片 URL" /></view><view class="field column"><text>维修描述</text><textarea v-model="line.description" placeholder="请输入维修描述" ></textarea></view><view class="field column"><text>备注</text><textarea v-model="line.remark" placeholder="请输入备注" ></textarea></view><button class="save in-mask" @click="saveLine">保存明细</button></view></view></view></template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.form-card,.section-card{overflow:hidden;background:#fff;border-radius:16rpx}.section-card{margin-top:24rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.code-field button,.section-head button,.line button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:23rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.code-field button::after,.section-head button::after,.line button::after,.save::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:120rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.section-head{display:flex;align-items:center;justify-content:space-between;height:86rpx;padding:0 24rpx;border-bottom:1rpx solid #edf1f6}.section-head>text{font-size:29rpx;font-weight:600;color:#20334c}.line{display:flex;flex-direction:column;gap:8rpx;padding:20rpx 24rpx;border-bottom:1rpx solid #edf1f6}.line view{display:flex;justify-content:space-between;gap:16rpx}.line text{font-size:23rpx;color:#78879b}.line view text:first-child{font-size:27rpx;font-weight:600;color:#20334c}.line-actions{justify-content:flex-end!important}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:24rpx}.mask{position:fixed;z-index:99;top:0;right:0;bottom:0;left:0;display:flex;align-items:flex-end;background:rgba(18,29,43,.42)}.selector{width:100%;max-height:78vh;overflow:auto;background:#fff;border-radius:24rpx 24rpx 0 0}.selector-head{display:flex;align-items:center;justify-content:space-between;height:92rpx;padding:0 30rpx;border-bottom:1rpx solid #edf1f6}.selector-head text:first-child{font-size:30rpx;font-weight:600;color:#20334c}.selector-head text:last-child{color:#1769d8;font-size:25rpx}.in-mask{margin:24rpx 30rpx 40rpx}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.form-card,.section-card{overflow:hidden;background:#fff;border-radius:16rpx}.section-card{margin-top:24rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.code-field button,.section-head button,.line button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:23rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.code-field button::after,.section-head button::after,.line button::after,.save::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:120rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.section-head{display:flex;align-items:center;justify-content:space-between;height:86rpx;padding:0 24rpx;border-bottom:1rpx solid #edf1f6}.section-head>text{font-size:29rpx;font-weight:600;color:#20334c}.line{display:flex;flex-direction:column;gap:8rpx;padding:20rpx 24rpx;border-bottom:1rpx solid #edf1f6}.line view{display:flex;justify-content:space-between;gap:16rpx}.line text{font-size:23rpx;color:#78879b}.line view text:first-child{font-size:27rpx;font-weight:600;color:#20334c}.line-actions{justify-content:flex-end!important}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:24rpx}.mask{position:fixed;z-index:99;top:0;right:0;bottom:0;left:0;display:flex;align-items:flex-end;background:rgba(18,29,43,.42)}.selector{width:100%;max-height:78vh;overflow:auto;background:#fff;border-radius:24rpx 24rpx 0 0}.selector-head{display:flex;align-items:center;justify-content:space-between;height:92rpx;padding:0 30rpx;border-bottom:1rpx solid #edf1f6}.selector-head text:first-child{font-size:30rpx;font-weight:600;color:#20334c}.selector-head text:last-child{color:var(--color-primary, #1769d8);font-size:25rpx}.in-mask{margin:24rpx 30rpx 40rpx}
</style>
src/pages/mes/dv/repair/index.vue
@@ -14,5 +14,5 @@
</script>
<template><view class="page"><template v-if="isLoggedIn"><view v-if="canQuery" class="search"><input v-model="keyword" placeholder="搜索维修单名称" confirm-type="search" @confirm="load(true)" /><text v-if="keyword" @click="keyword='';load(true)">清除</text></view><scroll-view v-if="canQuery" class="content" scroll-y lower-threshold="80" @scrolltolower="hasMore&&load()"><view v-if="loadError" class="state error" @click="load(true)">{{loadError}},点击重试</view><view v-else-if="rows.length"><view v-for="item in rows" :key="item.id" class="row" @click="go(item.id,'detail')"><view class="head"><view><text class="name">{{item.name||'未命名维修单'}}</text><text>{{item.code||'暂无编码'}}</text></view><view class="status-wrap"><text :class="['status', item.status === 10 ? 'disabled' : item.status === 40 ? 'enabled' : 'warning']">{{dictLabel(dicts,'mes_dv_repair_status',item.status)}}</text></view></view><view v-if="item.result" class="tags"><text :class="item.result === 1 ? 'enabled' : 'danger'">{{dictLabel(dicts,'mes_dv_repair_result',item.result)}}</text></view><view class="grid"><text>设备名称:{{item.machineryName||'--'}}</text><text>报修日期:{{dateText(item.requireDate)}}</text><text>完成日期:{{dateText(item.finishDate)}}</text><text>创建时间:{{dateText(item.createTime)}}</text></view><view class="actions"><button v-if="canQuery" @click.stop="go(item.id,'detail')">详情</button><button v-if="canUpdate&&item.status===10" @click.stop="go(item.id)">编辑</button><button v-if="canUpdate&&item.status===10" @click.stop="action(item,'submit')">提交</button><button v-if="canUpdate&&item.status===20" @click.stop="go(item.id,'confirm')">确认完成</button><button v-if="canUpdate&&item.status===30" @click.stop="action(item,'finishPass')">验收通过</button><button v-if="canUpdate&&item.status===30" @click.stop="action(item,'finishFail')">验收不通过</button><button v-if="canDelete&&item.status===10" class="danger" @click.stop="action(item,'delete')">删除</button></view></view><text class="more">{{loading?'加载中...':hasMore?'上拉加载更多':'没有更多了'}}</text></view><view v-else class="state">{{loading?'加载中...':keyword?'没有匹配的维修单':'暂无维修单'}}</view></scroll-view><view v-else class="state">暂无维修单查看权限</view></template><view v-else class="state">登录后查看维修单</view><button v-if="canCreate" class="fab" @click="go()"><view /></button></view></template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;justify-content:space-between;gap:16rpx}.head>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex!important;align-items:center!important;justify-content:center!important;flex:none!important;width:auto!important;min-width:0!important;min-height:36rpx!important;height:36rpx!important;padding:4rpx 14rpx!important;color:#1769d8;background:#eef5ff;border-radius:999rpx!important;line-height:1.2!important;white-space:nowrap}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:0;flex:1;padding-bottom: 132rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;justify-content:space-between;gap:16rpx}.head>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex!important;align-items:center!important;justify-content:center!important;flex:none!important;width:auto!important;min-width:0!important;min-height:36rpx!important;height:36rpx!important;padding:4rpx 14rpx!important;color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #eef5ff);border-radius:999rpx!important;line-height:1.2!important;white-space:nowrap}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width: 104rpx; height: 104rpx; min-height: 104rpx;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/dv/spare-record/index.vue
@@ -4,42 +4,50 @@
import { getSpareMovementPage, returnSpare, type SpareMovement } from "../../../../api/mes-operations";
import { useAuth } from "../../../../stores/auth";
const { hasPermission, isLoggedIn, state } = useAuth();
const sparePartId = ref<number>(), repairCode = ref(""), type = ref<number>(), rows = ref<SpareMovement[]>([]), loading = ref(false);
const sparePartId = ref<number>(), repairCode = ref(""), type = ref<number>(), rows = ref<SpareMovement[]>([]), loading = ref(false), pageNo = ref(1), total = ref(0);
const pageSize = 15;
const selected = ref<SpareMovement>(), returnOpen = ref(false), form = reactive({ quantity: 1, remark: "" });
const labels: Record<number,string> = { 1:"初始库存", 2:"入库", 3:"维修领用", 4:"退回" };
const tones: Record<number,string> = { 1:"tag-info", 2:"tag-ok", 3:"tag-warning", 4:"tag-purple" };
const labels: Record<number, string> = { 1: "初始库存", 2: "入库", 3: "维修领用", 4: "退回" };
const tones: Record<number, string> = { 1: "tag-info", 2: "tag-ok", 3: "tag-warning", 4: "tag-purple" };
const canQuery = computed(() => hasPermission("mes:dv-spare:record"));
const canReturn = computed(() => hasPermission("mes:dv-spare:return"));
async function load() {
const hasMore = computed(() => rows.value.length < total.value);
async function load(reset = true) {
  if (!state.accessToken || !canQuery.value || loading.value) return;
  if (reset) { pageNo.value = 1; total.value = 0; }
  loading.value = true;
  try {
    rows.value = (await getSpareMovementPage(state.accessToken, { pageNo:1, pageSize:100, sparePartId:sparePartId.value, repairCode:repairCode.value.trim() || undefined, type:type.value })).list;
  } catch (error) {
    uni.showToast({ title:error instanceof Error ? error.message : "记录加载失败", icon:"none" });
  } finally { loading.value = false; uni.stopPullDownRefresh(); }
    const data = await getSpareMovementPage(state.accessToken, { pageNo: pageNo.value, pageSize, sparePartId: sparePartId.value, repairCode: repairCode.value.trim() || undefined, type: type.value });
    rows.value = reset ? (data.list || []) : [...rows.value, ...(data.list || [])];
    total.value = Number(data.total || 0);
    if (rows.value.length < total.value) pageNo.value += 1;
  } catch (error) { uni.showToast({ title: error instanceof Error ? error.message : "记录加载失败", icon: "none" }); }
  finally { loading.value = false; uni.stopPullDownRefresh(); }
}
function startReturn(row: SpareMovement) { selected.value=row; form.quantity=Number(row.returnableQuantity||1); form.remark=""; returnOpen.value=true; }
function loadMore() { if (hasMore.value) load(false); }
function changeType(value: string | number) { type.value = Number(value) || undefined; load(true); }
function startReturn(row: SpareMovement) { selected.value = row; form.quantity = Number(row.returnableQuantity || 1); form.remark = ""; returnOpen.value = true; }
async function submitReturn() {
  if (!state.accessToken || !selected.value?.id || form.quantity<=0 || form.quantity>Number(selected.value.returnableQuantity) || !form.remark.trim()) return uni.showToast({title:"请填写正确数量和退回原因",icon:"none"});
  if (!state.accessToken || !selected.value?.id || form.quantity <= 0 || form.quantity > Number(selected.value.returnableQuantity) || !form.remark.trim()) return uni.showToast({ title: "请填写正确数量和退回原因", icon: "none" });
  try {
    await returnSpare(state.accessToken,{requestKey:Date.now()+"-"+Math.random(),originalId:selected.value.id,quantity:Number(form.quantity),remark:form.remark});
    returnOpen.value=false; uni.showToast({title:"退回成功",icon:"success"}); await load();
  } catch(error) { uni.showToast({title:error instanceof Error?error.message:"退回失败",icon:"none"}); }
    await returnSpare(state.accessToken, { requestKey: Date.now() + "-" + Math.random(), originalId: selected.value.id, quantity: Number(form.quantity), remark: form.remark });
    returnOpen.value = false; uni.showToast({ title: "退回成功", icon: "success" }); await load(true);
  } catch (error) { uni.showToast({ title: error instanceof Error ? error.message : "退回失败", icon: "none" }); }
}
onLoad(query => { sparePartId.value=query.sparePartId?Number(query.sparePartId):undefined; });
onShow(load); onPullDownRefresh(load);
onLoad(query => { sparePartId.value = query.sparePartId ? Number(query.sparePartId) : undefined; });
onShow(() => load(true));
onPullDownRefresh(() => load(true));
</script>
<template><view class="page">
  <template v-if="isLoggedIn">
    <view v-if="canQuery" class="search"><input v-model="repairCode" placeholder="搜索维修单号" confirm-type="search" @confirm="load" /><picker :range="['全部','初始库存','入库','维修领用','退回']" @change="type=$event.detail.value?Number($event.detail.value):undefined;load()"><view class="type-picker">{{type?labels[type]:'全部类型'}}<text>▾</text></view></picker></view>
    <scroll-view v-if="canQuery" class="content" scroll-y>
    <view v-if="canQuery" class="search"><input v-model="repairCode" placeholder="搜索维修单号" confirm-type="search" @confirm="load(true)" /><picker :range="['全部','初始库存','入库','维修领用','退回']" @change="changeType($event.detail.value)"><view class="type-picker">{{type?labels[type]:'全部类型'}}<text>▾</text></view></picker></view>
    <scroll-view v-if="canQuery" class="content" scroll-y @scrolltolower="loadMore">
      <view v-for="row in rows" :key="row.id" class="row">
        <view class="head"><view><text class="name">{{row.sparePartName||'备件'}}</text><text>{{row.sparePartCode||'暂无编码'}}</text></view><view class="status-wrap"><text :class="['status',tones[Number(row.type)]]">{{labels[Number(row.type)]||'库存变动'}}</text></view></view>
        <view class="grid"><text>数量:{{row.quantity??0}} {{row.unit||''}}</text><text>库存:{{row.beforeQuantity??'--'}} â†’ {{row.afterQuantity??'--'}}</text><text>维修单:{{row.repairCode||'--'}}</text><text>设备:{{row.machineryName||'--'}}</text><text>领用人:{{row.receiverName||'--'}}</text><text>时间:{{row.createTime||'--'}}</text><text class="full">备注:{{row.remark||'--'}}</text></view>
        <view v-if="canReturn&&row.type===3&&Number(row.returnableQuantity)>0" class="actions"><button @click="startReturn(row)">退回(可退 {{row.returnableQuantity}})</button></view>
      </view>
      <view v-if="!rows.length" class="state">{{loading?'加载中...':'暂无领用记录'}}</view>
      <view v-if="!rows.length" class="state">{{loading?'加载中...':'暂无领用记录'}}</view><view v-else class="state more">{{loading?'加载中...':hasMore?'上拉加载更多':'没有更多了'}}</view>
    </scroll-view>
    <view v-else class="state">暂无领用记录查看权限</view>
  </template>
@@ -48,10 +56,10 @@
</view></template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}
.search{display:flex;flex:none;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.search picker{flex:none}.type-picker{display:flex;align-items:center;gap:8rpx;color:#1769d8;font-size:24rpx}.type-picker text{font-size:18rpx}
.search{display:flex;flex:none;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.search picker{flex:none}.type-picker{display:flex;align-items:center;gap:8rpx;color:var(--color-primary, #1769d8);font-size:24rpx}.type-picker text{font-size:18rpx}
.content{height:0;flex:1;padding-bottom:60rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}
.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}
.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;line-height:36rpx;border-radius:999rpx;white-space:nowrap}.tag-info{color:#1769d8;background:#eef6ff;border:1rpx solid #c9e1ff}.tag-ok{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-warning{color:#b06a00;background:#fff6df;border:1rpx solid #f0d390}.tag-purple{color:#7a52c6;background:#f3edff;border:1rpx solid #d4c0ff}
.grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx 18rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.grid .full{grid-column:1/3}.actions{display:flex;justify-content:flex-end;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions button::after,.save::after{border:0}.state{display:block;padding:45rpx;color:#8795a8;font-size:26rpx;text-align:center}
.mask{position:fixed;inset:0;z-index:30;display:flex;align-items:flex-end;background:rgba(18,29,43,.42)}.sheet{width:100%;padding-bottom:40rpx;background:#fff;border-radius:24rpx 24rpx 0 0}.sheet-head{display:flex;align-items:center;justify-content:space-between;height:92rpx;padding:0 30rpx;border-bottom:1rpx solid #edf1f6}.sheet-head text:first-child{color:#20334c;font-size:30rpx;font-weight:600}.sheet-head text:last-child{color:#1769d8;font-size:25rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 30rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text{width:180rpx;color:#33455d}.field input{flex:1;text-align:right}.column{align-items:flex-start;flex-direction:column;padding-top:20rpx}.column textarea{width:100%;height:120rpx}.save{margin:24rpx 30rpx 0;color:#fff;background:#1769d8;border-radius:12rpx}
.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;line-height:36rpx;border-radius:999rpx;white-space:nowrap}.tag-info{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #eef6ff);border:1rpx solid var(--color-primary-border, #c9e1ff)}.tag-ok{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-warning{color:#b06a00;background:#fff6df;border:1rpx solid #f0d390}.tag-purple{color:#7a52c6;background:#f3edff;border:1rpx solid #d4c0ff}
.grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx 18rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.grid .full{grid-column:1/3}.actions{display:flex;justify-content:flex-end;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions button::after,.save::after{border:0}.state{display:block;padding:45rpx;color:#8795a8;font-size:26rpx;text-align:center}
.mask{position:fixed;inset:0;z-index:30;display:flex;align-items:flex-end;background:rgba(18,29,43,.42)}.sheet{width:100%;padding-bottom:40rpx;background:#fff;border-radius:24rpx 24rpx 0 0}.sheet-head{display:flex;align-items:center;justify-content:space-between;height:92rpx;padding:0 30rpx;border-bottom:1rpx solid #edf1f6}.sheet-head text:first-child{color:#20334c;font-size:30rpx;font-weight:600}.sheet-head text:last-child{color:var(--color-primary, #1769d8);font-size:25rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 30rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text{width:180rpx;color:#33455d}.field input{flex:1;text-align:right}.column{align-items:flex-start;flex-direction:column;padding-top:20rpx}.column textarea{width:100%;height:120rpx}.save{margin:24rpx 30rpx 0;color:#fff;background:var(--color-primary, #1769d8);border-radius:12rpx}
</style>
src/pages/mes/dv/spare/action.vue
@@ -1,3 +1,3 @@
<script setup lang="ts">
import{reactive,ref}from"vue";import{onLoad}from"@dcloudio/uni-app";import{getSpare,issueSpare,receiveSpare,type SpareAction,type SparePart}from"../../../../api/mes-operations";import{getRepairPage,type Repair}from"../../../../api/equipment";import{getHrmUserList,type UserOption}from"../../../../api/hrm";import{useAuth}from"../../../../stores/auth";const{state}=useAuth(),type=ref("receive"),spare=ref<SparePart>({}),repairs=ref<Repair[]>([]),users=ref<UserOption[]>([]),form=reactive<SpareAction>({requestKey:"",quantity:1,remark:""});async function save(){if(!state.accessToken||Number(form.quantity)<=0||!form.remark||(type.value==="issue"&&(!form.repairId||!form.receiverUserId)))return uni.showToast({title:"请完整填写必填项",icon:"none"});if(type.value==="issue"&&Number(form.quantity)>Number(spare.value.stockQuantity))return uni.showToast({title:"数量不能超过库存",icon:"none"});form.requestKey=Date.now()+"-"+Math.random();try{type.value==="receive"?await receiveSpare(state.accessToken,form):await issueSpare(state.accessToken,form);uni.showToast({title:"操作成功",icon:"success"});setTimeout(()=>uni.navigateBack(),400)}catch(e){uni.showToast({title:e instanceof Error?e.message:"操作失败",icon:"none"})}}onLoad(async q=>{type.value=q.type==="issue"?"issue":"receive";form.sparePartId=Number(q.sparePartId);if(!state.accessToken)return;spare.value=await getSpare(state.accessToken,form.sparePartId);if(type.value==="issue"){repairs.value=(await getRepairPage(state.accessToken,{pageNo:1,pageSize:100})).list;users.value=await getHrmUserList(state.accessToken)}});
</script><template><view class="page"><view class="card"><view class="field"><text>备件</text><text class="value">{{spare.name}}(库存 {{spare.stockQuantity??0}})</text></view><view v-if="type==='issue'" class="field"><text>维修单 *</text><picker :range="repairs" range-key="code" @change="form.repairId=repairs[$event.detail.value].id"><view class="value">{{repairs.find(x=>x.id===form.repairId)?.code||'请选择'}} â€º</view></picker></view><view v-if="type==='issue'" class="field"><text>领用人 *</text><picker :range="users" range-key="nickname" @change="form.receiverUserId=users[$event.detail.value].id"><view class="value">{{users.find(x=>x.id===form.receiverUserId)?.nickname||'请选择'}} â€º</view></picker></view><view class="field"><text>数量 *</text><input v-model.number="form.quantity" type="digit"/></view><view class="field col"><text>原因/备注 *</text><textarea v-model="form.remark"/></view></view><button class="save" @click="save">确认{{type==='receive'?'入库':'领用'}}</button></view></template><style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx;background:#f6f7f9}.card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eee}.field>text:first-child{width:180rpx}.field input,.field picker,.value{flex:1;text-align:right}.col{align-items:flex-start;flex-direction:column;padding-block:20rpx}.col textarea{width:100%;height:130rpx}.save{margin-top:30rpx;color:#fff;background:#1769d8}.save::after{border:0}</style>
</script><template><view class="page"><view class="card"><view class="field"><text>备件</text><text class="value">{{spare.name}}(库存 {{spare.stockQuantity??0}})</text></view><view v-if="type==='issue'" class="field"><text>维修单 *</text><picker :range="repairs" range-key="code" @change="form.repairId=repairs[$event.detail.value].id"><view class="value">{{repairs.find(x=>x.id===form.repairId)?.code||'请选择'}} â€º</view></picker></view><view v-if="type==='issue'" class="field"><text>领用人 *</text><picker :range="users" range-key="nickname" @change="form.receiverUserId=users[$event.detail.value].id"><view class="value">{{users.find(x=>x.id===form.receiverUserId)?.nickname||'请选择'}} â€º</view></picker></view><view class="field"><text>数量 *</text><input v-model.number="form.quantity" type="digit"/></view><view class="field col"><text>原因/备注 *</text><textarea v-model="form.remark"/></view></view><button class="save" @click="save">确认{{type==='receive'?'入库':'领用'}}</button></view></template><style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx;background:#f6f7f9}.card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eee}.field>text:first-child{width:180rpx}.field input,.field picker,.value{flex:1;text-align:right}.col{align-items:flex-start;flex-direction:column;padding-block:20rpx}.col textarea{width:100%;height:130rpx}.save{margin-top:30rpx;color:#fff;background:var(--color-primary, #1769d8)}.save::after{border:0}</style>
src/pages/mes/dv/spare/form.vue
@@ -1,3 +1,3 @@
<script setup lang="ts">
import{computed,reactive,ref}from"vue";import{onLoad}from"@dcloudio/uni-app";import{createSpare,getSpare,updateSpare,type SpareSave}from"../../../../api/mes-operations";import{useAuth}from"../../../../stores/auth";const{hasPermission,state}=useAuth(),id=ref<number>(),mode=ref("edit"),saving=ref(false),form=reactive<SpareSave>({code:"",name:"",unit:"",specification:"",location:"",safetyQuantity:0,initialQuantity:0,status:1,remark:""});const readonly=computed(()=>mode.value==="detail"),canSave=computed(()=>id.value?hasPermission("mes:dv-spare:update"):hasPermission("mes:dv-spare:create"));async function save(){if(!state.accessToken||!canSave.value)return;if(!form.code||!form.name||!form.unit)return uni.showToast({title:"请填写编码、名称和单位",icon:"none"});saving.value=true;try{const d={...form,id:id.value,safetyQuantity:Number(form.safetyQuantity||0),initialQuantity:Number(form.initialQuantity||0)};id.value?await updateSpare(state.accessToken,d):id.value=await createSpare(state.accessToken,d);uni.showToast({title:"保存成功",icon:"success"});setTimeout(()=>uni.navigateBack(),400)}catch(e){uni.showToast({title:e instanceof Error?e.message:"保存失败",icon:"none"})}finally{saving.value=false}}onLoad(async q=>{id.value=q.id?Number(q.id):undefined;mode.value=q.mode||"edit";if(state.accessToken&&id.value)Object.assign(form,await getSpare(state.accessToken,id.value))});
</script><template><view class="page"><view class="card"><view class="field"><text>备件编码 *</text><input v-model="form.code" :disabled="readonly||!!id"/></view><view class="field"><text>备件名称 *</text><input v-model="form.name" :disabled="readonly"/></view><view class="field"><text>规格型号</text><input v-model="form.specification" :disabled="readonly"/></view><view class="field"><text>单位 *</text><input v-model="form.unit" :disabled="readonly"/></view><view class="field"><text>库位</text><input v-model="form.location" :disabled="readonly"/></view><view class="field"><text>安全库存 *</text><input v-model.number="form.safetyQuantity" :disabled="readonly" type="number"/></view><view v-if="!id" class="field"><text>初始库存</text><input v-model.number="form.initialQuantity" type="number"/></view><view v-else class="field"><text>当前库存</text><text class="value">{{form.stockQuantity??0}}</text></view><view class="field"><text>状态</text><switch :checked="form.status===1" :disabled="readonly" @change="form.status=$event.detail.value?1:0"/></view><view class="field col"><text>备注</text><textarea v-model="form.remark" :disabled="readonly"/></view></view><button v-if="!readonly&&canSave" class="save" :loading="saving" @click="save">保存</button></view></template><style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx;background:#f6f7f9}.card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eee}.field>text:first-child{width:190rpx}.field input,.value{flex:1;text-align:right}.col{align-items:flex-start;flex-direction:column;padding-block:20rpx}.col textarea{width:100%;height:130rpx}.save{margin-top:30rpx;color:#fff;background:#1769d8}.save::after{border:0}</style>
</script><template><view class="page"><view class="card"><view class="field"><text>备件编码 *</text><input v-model="form.code" :disabled="readonly||!!id"/></view><view class="field"><text>备件名称 *</text><input v-model="form.name" :disabled="readonly"/></view><view class="field"><text>规格型号</text><input v-model="form.specification" :disabled="readonly"/></view><view class="field"><text>单位 *</text><input v-model="form.unit" :disabled="readonly"/></view><view class="field"><text>库位</text><input v-model="form.location" :disabled="readonly"/></view><view class="field"><text>安全库存 *</text><input v-model.number="form.safetyQuantity" :disabled="readonly" type="number"/></view><view v-if="!id" class="field"><text>初始库存</text><input v-model.number="form.initialQuantity" type="number"/></view><view v-else class="field"><text>当前库存</text><text class="value">{{form.stockQuantity??0}}</text></view><view class="field"><text>状态</text><switch :checked="form.status===1" :disabled="readonly" @change="form.status=$event.detail.value?1:0"/></view><view class="field col"><text>备注</text><textarea v-model="form.remark" :disabled="readonly"/></view></view><button v-if="!readonly&&canSave" class="save" :loading="saving" @click="save">保存</button></view></template><style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx;background:#f6f7f9}.card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eee}.field>text:first-child{width:190rpx}.field input,.value{flex:1;text-align:right}.col{align-items:flex-start;flex-direction:column;padding-block:20rpx}.col textarea{width:100%;height:130rpx}.save{margin-top:30rpx;color:#fff;background:var(--color-primary, #1769d8)}.save::after{border:0}</style>
src/pages/mes/dv/spare/index.vue
@@ -1,14 +1,44 @@
<script setup lang="ts">
import{computed,ref}from"vue";import{onShow,onPullDownRefresh}from"@dcloudio/uni-app";import{deleteSpare,getSparePage,type SparePart}from"../../../../api/mes-operations";import{useAuth}from"../../../../stores/auth";
const{hasPermission,isLoggedIn,state}=useAuth(),keyword=ref(""),shortage=ref(false),rows=ref<SparePart[]>([]),loading=ref(false);const p=(x:string)=>hasPermission("mes:dv-spare:"+x),canQuery=computed(()=>p("query")),canCreate=computed(()=>p("create"));
async function load(){if(!state.accessToken||!canQuery.value||loading.value)return;loading.value=true;try{rows.value=(await getSparePage(state.accessToken,{pageNo:1,pageSize:100,name:keyword.value||undefined,shortageOnly:shortage.value||undefined})).list}catch(e){uni.showToast({title:e instanceof Error?e.message:"加载失败",icon:"none"})}finally{loading.value=false;uni.stopPullDownRefresh()}}function go(id?:number,mode="edit"){uni.navigateTo({url:"/pages/mes/dv/spare/form"+(id?"?id="+id+"&mode="+mode:"")})}function action(t:string,x:SparePart){uni.navigateTo({url:"/pages/mes/dv/spare/action?type="+t+"&sparePartId="+x.id})}async function remove(x:SparePart){if(!state.accessToken||!x.id)return;const ok=await new Promise<boolean>(r=>uni.showModal({title:"确认删除",content:"确定删除该备件吗?",success:v=>r(v.confirm)}));if(ok){await deleteSpare(state.accessToken,x.id);load()}}onShow(load);onPullDownRefresh(load);
</script><template><view class="page"><template v-if="isLoggedIn"><view v-if="canQuery" class="search"><input v-model="keyword" placeholder="搜索备件名称" @confirm="load"/><text @click="shortage=!shortage;load()">{{shortage?'全部库存':'仅看库存不足'}}</text></view><scroll-view v-if="canQuery" class="list" scroll-y><view v-for="x in rows" :key="x.id" class="row" @click="go(x.id,'detail')"><view class="head"><view><b>{{x.name||'未命名备件'}}</b><text>{{x.code||'暂无编码'}}</text></view><view class="status-wrap"><text :class="['status',x.status===1?'tag-ok':'tag-stop']">{{x.status===1?'启用':'停用'}}</text></view></view><view class="stock"><span>当前库存<b :class="{low:Number(x.stockQuantity)<Number(x.safetyQuantity)}">{{x.stockQuantity??0}}</b></span><span>安全库存<b>{{x.safetyQuantity??0}}</b></span><span>单位<b>{{x.unit||'--'}}</b></span></view><view class="meta">规格:{{x.specification||'--'}} 库位:{{x.location||'--'}}</view><view class="actions" @click.stop><button @click="go(x.id,'detail')">详情</button><button v-if="p('update')" @click="go(x.id)">编辑</button><button v-if="p('receive')" @click="action('receive',x)">入库</button><button v-if="p('issue')&&Number(x.stockQuantity)>0" @click="action('issue',x)">领用</button><button v-if="p('record')" @click="uni.navigateTo({url:'/pages/mes/dv/spare-record/index?sparePartId='+x.id})">记录</button><button v-if="p('delete')" class="danger" @click="remove(x)">删除</button></view></view><view v-if="!rows.length" class="state">{{loading?'加载中...':'暂无备件'}}</view></scroll-view><view v-else class="state">暂无备件查看权限</view></template><view v-else class="state">登录后查看备件</view><button v-if="canCreate" class="fab" @click="go()"><view/></button></view></template><style lang="scss" scoped>
import { computed, ref } from "vue";
import { onPullDownRefresh, onShow } from "@dcloudio/uni-app";
import { deleteSpare, getSparePage, type SparePart } from "../../../../api/mes-operations";
import { useAuth } from "../../../../stores/auth";
const { hasPermission, isLoggedIn, state } = useAuth();
const keyword = ref(""), shortage = ref(false), rows = ref<SparePart[]>([]), loading = ref(false), pageNo = ref(1), total = ref(0);
const pageSize = 15;
const p = (action: string) => hasPermission("mes:dv-spare:" + action);
const canQuery = computed(() => p("query")), canCreate = computed(() => p("create"));
const hasMore = computed(() => rows.value.length < total.value);
async function load(reset = true) {
  if (!state.accessToken || !canQuery.value || loading.value) return;
  if (reset) { pageNo.value = 1; total.value = 0; }
  loading.value = true;
  try {
    const data = await getSparePage(state.accessToken, { pageNo: pageNo.value, pageSize, name: keyword.value || undefined, shortageOnly: shortage.value || undefined });
    rows.value = reset ? (data.list || []) : [...rows.value, ...(data.list || [])];
    total.value = Number(data.total || 0);
    if (rows.value.length < total.value) pageNo.value += 1;
  } catch (error) { uni.showToast({ title: error instanceof Error ? error.message : "加载失败", icon: "none" }); }
  finally { loading.value = false; uni.stopPullDownRefresh(); }
}
function loadMore() { if (hasMore.value) load(false); }
function toggleShortage() { shortage.value = !shortage.value; load(true); }
function go(id?: number, mode = "edit") { uni.navigateTo({ url: "/pages/mes/dv/spare/form" + (id ? "?id=" + id + "&mode=" + mode : "") }); }
function action(type: string, item: SparePart) { uni.navigateTo({ url: "/pages/mes/dv/spare/action?type=" + type + "&sparePartId=" + item.id }); }
async function remove(item: SparePart) {
  if (!state.accessToken || !item.id) return;
  const ok = await new Promise<boolean>(resolve => uni.showModal({ title: "确认删除", content: "确定删除该备件吗?", success: result => resolve(result.confirm) }));
  if (ok) { await deleteSpare(state.accessToken, item.id); load(true); }
}
onShow(() => load(true));
onPullDownRefresh(() => load(true));
</script><template><view class="page"><template v-if="isLoggedIn"><view v-if="canQuery" class="search"><input v-model="keyword" placeholder="搜索备件名称" @confirm="load(true)"/><text @click="toggleShortage">{{shortage?'全部库存':'仅看库存不足'}}</text></view><scroll-view v-if="canQuery" class="list" scroll-y @scrolltolower="loadMore"><view v-for="x in rows" :key="x.id" class="row" @click="go(x.id,'detail')"><view class="head"><view><b>{{x.name||'未命名备件'}}</b><text>{{x.code||'暂无编码'}}</text></view><view class="status-wrap"><text :class="['status',x.status===1?'tag-ok':'tag-stop']">{{x.status===1?'启用':'停用'}}</text></view></view><view class="stock"><span>当前库存<b :class="{low:Number(x.stockQuantity)<Number(x.safetyQuantity)}">{{x.stockQuantity??0}}</b></span><span>安全库存<b>{{x.safetyQuantity??0}}</b></span><span>单位<b>{{x.unit||'--'}}</b></span></view><view class="meta">规格:{{x.specification||'--'}} 库位:{{x.location||'--'}}</view><view class="actions" @click.stop><button @click="go(x.id,'detail')">详情</button><button v-if="p('update')" @click="go(x.id)">编辑</button><button v-if="p('receive')" @click="action('receive',x)">入库</button><button v-if="p('issue')&&Number(x.stockQuantity)>0" @click="action('issue',x)">领用</button><button v-if="p('record')" @click="uni.navigateTo({url:'/pages/mes/dv/spare-record/index?sparePartId='+x.id})">记录</button><button v-if="p('delete')" class="danger" @click="remove(x)">删除</button></view></view><view v-if="!rows.length" class="state">{{loading?'加载中...':'暂无备件'}}</view><view v-else class="state more">{{loading?'加载中...':hasMore?'上拉加载更多':'没有更多了'}}</view></scroll-view><view v-else class="state">暂无备件查看权限</view></template><view v-else class="state">登录后查看备件</view><button v-if="canCreate" class="fab" @click="go()"><view/></button></view></template><style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}
.search{display:flex;flex:none;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.search text{flex:none;color:#1769d8;font-size:24rpx}
.list{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}
.search{display:flex;flex:none;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.search text{flex:none;color:var(--color-primary, #1769d8);font-size:24rpx}
.list{height:0;flex:1;padding-bottom: 132rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}
.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head b{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.head>view:first-child text{color:#78879b;font-size:23rpx}
.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;line-height:36rpx;border-radius:999rpx;white-space:nowrap}.tag-ok{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-stop{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}
.stock{display:grid;grid-template-columns:repeat(3,1fr);gap:12rpx;margin-top:16rpx;padding:16rpx 0;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.stock span{display:flex;align-items:center;flex-direction:column;gap:6rpx;color:#8795a8;font-size:21rpx}.stock b{color:#20334c;font-size:29rpx}.stock .low{color:#d45b50}.meta{padding-top:14rpx;color:#66778c;font-size:23rpx}
.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}
.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));z-index:10;display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}
.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));z-index:10;display:flex;align-items:center;justify-content:center;width: 104rpx; height: 104rpx; min-height: 104rpx;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/dv/subject/form.vue
@@ -62,5 +62,5 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.code-field button{flex:none;min-width:136rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.code-field button::after,.save::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:130rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.code-field button{flex:none;min-width:136rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid var(--color-primary, #1769d8);border-radius:8rpx}.code-field button::after,.save::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:130rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}
</style>
src/pages/mes/dv/subject/index.vue
@@ -74,5 +74,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex!important;align-items:center!important;justify-content:center!important;flex:none!important;width:auto!important;min-width:0!important;min-height:36rpx!important;height:36rpx!important;padding:4rpx 14rpx!important;font-size:22rpx!important;border-radius:999rpx!important;line-height:1.2!important;white-space:nowrap}.status.enabled{color:#1769d8;background:#edf5ff}.status.disabled{color:#8d9bad;background:#f0f3f6}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:16rpx}.tags text{max-width:100%;padding:6rpx 14rpx;overflow:hidden;color:#1769d8;font-size:22rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap;background:#eef5ff;border:1rpx solid #bfdbff;border-radius:999rpx}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:14rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:0;flex:1;padding-bottom: 132rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex!important;align-items:center!important;justify-content:center!important;flex:none!important;width:auto!important;min-width:0!important;min-height:36rpx!important;height:36rpx!important;padding:4rpx 14rpx!important;font-size:22rpx!important;border-radius:999rpx!important;line-height:1.2!important;white-space:nowrap}.status.enabled{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #edf5ff)}.status.disabled{color:#8d9bad;background:#f0f3f6}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:16rpx}.tags text{max-width:100%;padding:6rpx 14rpx;overflow:hidden;color:var(--color-primary, #1769d8);font-size:22rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap;background:var(--color-primary-soft, #eef5ff);border:1rpx solid var(--color-primary-border, #bfdbff);border-radius:999rpx}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:14rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width: 104rpx; height: 104rpx; min-height: 104rpx;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/md/item/form.vue
@@ -308,5 +308,5 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card,.tab-card{overflow:hidden;background:#fff;border-radius:16rpx}.tab-card{margin-top:20rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.required{color:#e23b3b}.switch{justify-content:space-between}.switch>text:first-child{width:auto}.code-field button,.section-head button,.selector-search button,.upload-head button{flex:none;min-width:100rpx;padding:0 14rpx;margin:0;color:#1769d8;font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.code-field button::after,.save::after,.section-head button::after,.line-actions button::after,.modal-actions button::after,.selector-search button::after,.upload-head button::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:38rpx 0}.tabs{display:flex;height:84rpx;padding:0 20rpx;gap:14rpx;align-items:center;background:#f8fbff;overflow-x:auto}.tabs text{height:54rpx;padding:0 22rpx;flex:none;color:#5d7088;font-size:25rpx;line-height:54rpx;background:#eef3f9;border-radius:999rpx}.tabs text.active{color:#fff;font-weight:700;background:#1769d8}.section-head{display:flex;align-items:center;justify-content:space-between;padding:18rpx 24rpx;color:#10233f;font-size:28rpx;font-weight:700}.line{margin:0 20rpx 18rpx;padding:18rpx;border:1rpx solid #edf1f6;border-radius:12rpx}.line>view:first-child{display:flex;justify-content:space-between;gap:12rpx;margin-bottom:12rpx;color:#78879b;font-size:23rpx}.line-title{color:#10233f;font-size:28rpx;font-weight:700}.line>text{display:block;margin-top:8rpx;color:#66778c;font-size:23rpx}.media-img{display:block;width:160rpx;height:120rpx;margin:10rpx 0;border-radius:10rpx;background:#f4f6f9}.line-actions{display:flex;justify-content:flex-end;gap:12rpx;margin-top:14rpx}.line-actions button{min-height:50rpx;padding:0 18rpx;margin:0;color:#1769d8;font-size:23rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.line-actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.checks{display:grid;grid-template-columns:repeat(2,1fr);gap:18rpx;padding:20rpx 24rpx 30rpx}.checks label{font-size:26rpx;color:#33455d}.mask{position:fixed;inset:0;z-index:900;display:flex;align-items:center;justify-content:center;padding:0 28rpx;background:rgba(16,35,63,.45)}.modal{width:100%;max-height:88vh;overflow-y:auto;background:#fff;border-radius:20rpx}.modal-title{padding:26rpx 28rpx;color:#10233f;font-size:30rpx;font-weight:700}.selector-search{display:flex;gap:12rpx;padding:0 24rpx 18rpx}.selector-search input{height:64rpx;flex:1;padding:0 18rpx;font-size:25rpx;background:#f5f7fb;border-radius:10rpx}.selector-layout{display:flex;height:430rpx;border-top:1rpx solid #eef1f5;border-bottom:1rpx solid #eef1f5}.selector-tree{width:190rpx;background:#f8fbff}.cat{min-height:64rpx;padding:0 14rpx;color:#5e7088;font-size:23rpx;line-height:64rpx;border-bottom:1rpx solid #edf1f6}.cat.active{color:#1769d8;font-weight:700;background:#eaf3ff}.selector-list{flex:1;padding:14rpx}.material{padding:16rpx;border-bottom:1rpx solid #eef1f5}.material.selected{background:#edf5ff;border-radius:10rpx}.material text{display:block}.material text:first-child{color:#10233f;font-size:26rpx;font-weight:700}.material text:last-child{margin-top:8rpx;color:#66778c;font-size:22rpx}.upload-head{display:flex;align-items:center;justify-content:space-between;width:100%;color:#33455d;font-size:27rpx}.upload-image{position:relative;width:160rpx;height:120rpx;margin-top:14rpx}.upload-image image{width:160rpx;height:120rpx;border-radius:10rpx;background:#f4f6f9}.upload-image text{position:absolute;right:0;top:0;padding:4rpx 12rpx;color:#fff;font-size:22rpx;background:rgba(0,0,0,.52);border-radius:0 10rpx 0 10rpx}.upload-empty{margin-top:14rpx;color:#8a99ac;font-size:24rpx}.modal-actions{display:flex;justify-content:flex-end;gap:16rpx;padding:20rpx 24rpx 28rpx}.modal-actions button{height:72rpx;min-height:72rpx;padding:0 34rpx;margin:0;font-size:26rpx;line-height:70rpx;border-radius:36rpx}.ghost{color:#1769d8;background:#f2f6fc;border:1rpx solid #cfe0f7}.primary{color:#fff;background:#1769d8}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card,.tab-card{overflow:hidden;background:#fff;border-radius:16rpx}.tab-card{margin-top:20rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.required{color:#e23b3b}.switch{justify-content:space-between}.switch>text:first-child{width:auto}.code-field button,.section-head button,.selector-search button,.upload-head button{flex:none;min-width:100rpx;padding:0 14rpx;margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid var(--color-primary, #1769d8);border-radius:8rpx}.code-field button::after,.save::after,.section-head button::after,.line-actions button::after,.modal-actions button::after,.selector-search button::after,.upload-head button::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:38rpx 0}.tabs{display:flex;height:84rpx;padding:0 20rpx;gap:14rpx;align-items:center;background:#f8fbff;overflow-x:auto}.tabs text{height:54rpx;padding:0 22rpx;flex:none;color:#5d7088;font-size:25rpx;line-height:54rpx;background:#eef3f9;border-radius:999rpx}.tabs text.active{color:#fff;font-weight:700;background:var(--color-primary, #1769d8)}.section-head{display:flex;align-items:center;justify-content:space-between;padding:18rpx 24rpx;color:#10233f;font-size:28rpx;font-weight:700}.line{margin:0 20rpx 18rpx;padding:18rpx;border:1rpx solid #edf1f6;border-radius:12rpx}.line>view:first-child{display:flex;justify-content:space-between;gap:12rpx;margin-bottom:12rpx;color:#78879b;font-size:23rpx}.line-title{color:#10233f;font-size:28rpx;font-weight:700}.line>text{display:block;margin-top:8rpx;color:#66778c;font-size:23rpx}.media-img{display:block;width:160rpx;height:120rpx;margin:10rpx 0;border-radius:10rpx;background:#f4f6f9}.line-actions{display:flex;justify-content:flex-end;gap:12rpx;margin-top:14rpx}.line-actions button{min-height:50rpx;padding:0 18rpx;margin:0;color:var(--color-primary, #1769d8);font-size:23rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.line-actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.checks{display:grid;grid-template-columns:repeat(2,1fr);gap:18rpx;padding:20rpx 24rpx 30rpx}.checks label{font-size:26rpx;color:#33455d}.mask{position:fixed;inset:0;z-index:900;display:flex;align-items:center;justify-content:center;padding:0 28rpx;background:rgba(16,35,63,.45)}.modal{width:100%;max-height:88vh;overflow-y:auto;background:#fff;border-radius:20rpx}.modal-title{padding:26rpx 28rpx;color:#10233f;font-size:30rpx;font-weight:700}.selector-search{display:flex;gap:12rpx;padding:0 24rpx 18rpx}.selector-search input{height:64rpx;flex:1;padding:0 18rpx;font-size:25rpx;background:#f5f7fb;border-radius:10rpx}.selector-layout{display:flex;height:430rpx;border-top:1rpx solid #eef1f5;border-bottom:1rpx solid #eef1f5}.selector-tree{width:190rpx;background:#f8fbff}.cat{min-height:64rpx;padding:0 14rpx;color:#5e7088;font-size:23rpx;line-height:64rpx;border-bottom:1rpx solid #edf1f6}.cat.active{color:var(--color-primary, #1769d8);font-weight:700;background:#eaf3ff}.selector-list{flex:1;padding:14rpx}.material{padding:16rpx;border-bottom:1rpx solid #eef1f5}.material.selected{background:var(--color-primary-soft, #edf5ff);border-radius:10rpx}.material text{display:block}.material text:first-child{color:#10233f;font-size:26rpx;font-weight:700}.material text:last-child{margin-top:8rpx;color:#66778c;font-size:22rpx}.upload-head{display:flex;align-items:center;justify-content:space-between;width:100%;color:#33455d;font-size:27rpx}.upload-image{position:relative;width:160rpx;height:120rpx;margin-top:14rpx}.upload-image image{width:160rpx;height:120rpx;border-radius:10rpx;background:#f4f6f9}.upload-image text{position:absolute;right:0;top:0;padding:4rpx 12rpx;color:#fff;font-size:22rpx;background:rgba(0,0,0,.52);border-radius:0 10rpx 0 10rpx}.upload-empty{margin-top:14rpx;color:#8a99ac;font-size:24rpx}.modal-actions{display:flex;justify-content:flex-end;gap:16rpx;padding:20rpx 24rpx 28rpx}.modal-actions button{height:72rpx;min-height:72rpx;padding:0 34rpx;margin:0;font-size:26rpx;line-height:70rpx;border-radius:36rpx}.ghost{color:var(--color-primary, #1769d8);background:#f2f6fc;border:1rpx solid #cfe0f7}.primary{color:#fff;background:var(--color-primary, #1769d8)}
</style>
src/pages/mes/md/item/index.vue
@@ -141,5 +141,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 20rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.body{display:flex;min-height:0;flex:1;gap:16rpx}.category-tree{width:180rpx;height:100%;flex:none;padding-bottom:150rpx;box-sizing:border-box}.cat{min-height:66rpx;padding-right:12rpx;color:#5e7088;font-size:23rpx;line-height:66rpx;background:#fff;border-bottom:1rpx solid #edf1f6}.cat.active{color:#1769d8;font-weight:700;background:#eaf3ff}.content{height:100%;min-width:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-enabled{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-disabled{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.tag-line{display:flex;gap:12rpx;margin-top:14rpx}.tag-line text{display:inline-flex;height:36rpx;align-items:center;padding:0 14rpx;color:#1769d8;font-size:21rpx;font-weight:600;background:#edf5ff;border:1rpx solid #cfe1fb;border-radius:999rpx}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions button::after{border:0}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.more{display:block;padding:16rpx 0 6rpx;color:#93a1b3;font-size:22rpx;text-align:center}.state{padding:60rpx 20rpx;color:#8795a8;font-size:25rpx;text-align:center}.state.error{color:#c65050}
.page{height:100vh;display:flex;flex-direction:column;padding:0 20rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.body{display:flex;min-height:0;flex:1;gap:16rpx}.category-tree{width:180rpx;height:100%;flex:none;padding-bottom:150rpx;box-sizing:border-box}.cat{min-height:66rpx;padding-right:12rpx;color:#5e7088;font-size:23rpx;line-height:66rpx;background:#fff;border-bottom:1rpx solid #edf1f6}.cat.active{color:var(--color-primary, #1769d8);font-weight:700;background:#eaf3ff}.content{height:100%;min-width:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-enabled{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-disabled{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.tag-line{display:flex;gap:12rpx;margin-top:14rpx}.tag-line text{display:inline-flex;height:36rpx;align-items:center;padding:0 14rpx;color:var(--color-primary, #1769d8);font-size:21rpx;font-weight:600;background:var(--color-primary-soft, #edf5ff);border:1rpx solid #cfe1fb;border-radius:999rpx}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions button::after{border:0}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.more{display:block;padding:16rpx 0 6rpx;color:#93a1b3;font-size:22rpx;text-align:center}.state{padding:60rpx 20rpx;color:#8795a8;font-size:25rpx;text-align:center}.state.error{color:#c65050}
</style>
src/pages/mes/md/workstation/form.vue
@@ -301,5 +301,5 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card,.tab-card{overflow:hidden;background:#fff;border-radius:16rpx}.tab-card{margin-top:20rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.required{color:#e23b3b}.code-field button,.section-head button{flex:none;min-width:100rpx;padding:0 14rpx;margin:0;color:#1769d8;font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.code-field button::after,.save::after,.section-head button::after,.line-actions button::after,.modal-actions button::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:38rpx 0}.tabs{display:flex;height:84rpx;padding:0 20rpx;gap:14rpx;align-items:center;background:#f8fbff}.tabs text{height:54rpx;padding:0 22rpx;color:#5d7088;font-size:25rpx;line-height:54rpx;background:#eef3f9;border-radius:999rpx}.tabs text.active{color:#fff;font-weight:700;background:#1769d8}.section-head{display:flex;align-items:center;justify-content:space-between;padding:18rpx 24rpx;color:#10233f;font-size:28rpx;font-weight:700}.line{margin:0 20rpx 18rpx;padding:18rpx;border:1rpx solid #edf1f6;border-radius:12rpx}.line>view:first-child{display:flex;justify-content:space-between;gap:12rpx;margin-bottom:12rpx;color:#78879b;font-size:23rpx}.line-title{color:#10233f;font-size:28rpx;font-weight:700}.line>text{display:block;margin-top:8rpx;color:#66778c;font-size:23rpx}.line-actions{display:flex;justify-content:flex-end;gap:12rpx;margin-top:14rpx}.line-actions button{min-height:50rpx;padding:0 18rpx;margin:0;color:#1769d8;font-size:23rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.line-actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.mask{position:fixed;inset:0;z-index:900;display:flex;align-items:center;justify-content:center;padding:0 34rpx;background:rgba(16,35,63,.45)}.modal{width:100%;max-height:84vh;overflow-y:auto;background:#fff;border-radius:20rpx}.modal-title{padding:26rpx 28rpx;color:#10233f;font-size:30rpx;font-weight:700}.modal-actions{display:flex;justify-content:flex-end;gap:16rpx;padding:20rpx 24rpx 28rpx}.modal-actions button{height:72rpx;min-height:72rpx;padding:0 34rpx;margin:0;font-size:26rpx;line-height:70rpx;border-radius:36rpx}.ghost{color:#1769d8;background:#f2f6fc;border:1rpx solid #cfe0f7}.primary{color:#fff;background:#1769d8}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card,.tab-card{overflow:hidden;background:#fff;border-radius:16rpx}.tab-card{margin-top:20rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.required{color:#e23b3b}.code-field button,.section-head button{flex:none;min-width:100rpx;padding:0 14rpx;margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid var(--color-primary, #1769d8);border-radius:8rpx}.code-field button::after,.save::after,.section-head button::after,.line-actions button::after,.modal-actions button::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:38rpx 0}.tabs{display:flex;height:84rpx;padding:0 20rpx;gap:14rpx;align-items:center;background:#f8fbff}.tabs text{height:54rpx;padding:0 22rpx;color:#5d7088;font-size:25rpx;line-height:54rpx;background:#eef3f9;border-radius:999rpx}.tabs text.active{color:#fff;font-weight:700;background:var(--color-primary, #1769d8)}.section-head{display:flex;align-items:center;justify-content:space-between;padding:18rpx 24rpx;color:#10233f;font-size:28rpx;font-weight:700}.line{margin:0 20rpx 18rpx;padding:18rpx;border:1rpx solid #edf1f6;border-radius:12rpx}.line>view:first-child{display:flex;justify-content:space-between;gap:12rpx;margin-bottom:12rpx;color:#78879b;font-size:23rpx}.line-title{color:#10233f;font-size:28rpx;font-weight:700}.line>text{display:block;margin-top:8rpx;color:#66778c;font-size:23rpx}.line-actions{display:flex;justify-content:flex-end;gap:12rpx;margin-top:14rpx}.line-actions button{min-height:50rpx;padding:0 18rpx;margin:0;color:var(--color-primary, #1769d8);font-size:23rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.line-actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.mask{position:fixed;inset:0;z-index:900;display:flex;align-items:center;justify-content:center;padding:0 34rpx;background:rgba(16,35,63,.45)}.modal{width:100%;max-height:84vh;overflow-y:auto;background:#fff;border-radius:20rpx}.modal-title{padding:26rpx 28rpx;color:#10233f;font-size:30rpx;font-weight:700}.modal-actions{display:flex;justify-content:flex-end;gap:16rpx;padding:20rpx 24rpx 28rpx}.modal-actions button{height:72rpx;min-height:72rpx;padding:0 34rpx;margin:0;font-size:26rpx;line-height:70rpx;border-radius:36rpx}.ghost{color:var(--color-primary, #1769d8);background:#f2f6fc;border:1rpx solid #cfe0f7}.primary{color:#fff;background:var(--color-primary, #1769d8)}
</style>
src/pages/mes/md/workstation/index.vue
@@ -91,5 +91,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-enabled{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-disabled{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions button::after,.fab::after{border:0}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.more{display:block;padding:16rpx 0 6rpx;color:#93a1b3;font-size:22rpx;text-align:center}.state{padding:60rpx 20rpx;color:#8795a8;font-size:25rpx;text-align:center}.state.error{color:#c65050}.fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}.fab view{position:relative;width:38rpx;height:38rpx}.fab view::before,.fab view::after{position:absolute;content:"";background:#fff;border-radius:3rpx}.fab view::before{top:17rpx;left:0;width:38rpx;height:4rpx}.fab view::after{top:0;left:17rpx;width:4rpx;height:38rpx}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:0;flex:1;padding-bottom: 132rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-enabled{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-disabled{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions button::after,.fab::after{border:0}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.more{display:block;padding:16rpx 0 6rpx;color:#93a1b3;font-size:22rpx;text-align:center}.state{padding:60rpx 20rpx;color:#8795a8;font-size:25rpx;text-align:center}.state.error{color:#c65050}.fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}.fab view{position:relative;width:38rpx;height:38rpx}.fab view::before,.fab view::after{position:absolute;content:"";background:#fff;border-radius:3rpx}.fab view::before{top:17rpx;left:0;width:38rpx;height:4rpx}.fab view::after{top:0;left:17rpx;width:4rpx;height:38rpx}
</style>
src/pages/mes/md/workstation/workshop/form.vue
@@ -96,5 +96,5 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.required{color:#e23b3b}.code-field button{flex:none;min-width:100rpx;padding:0 14rpx;margin:0;color:#1769d8;font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.code-field button::after,.save::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.required{color:#e23b3b}.code-field button{flex:none;min-width:100rpx;padding:0 14rpx;margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid var(--color-primary, #1769d8);border-radius:8rpx}.code-field button::after,.save::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}
</style>
src/pages/mes/md/workstation/workshop/index.vue
@@ -91,5 +91,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-enabled{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-disabled{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions button::after,.fab::after{border:0}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.more{display:block;padding:16rpx 0 6rpx;color:#93a1b3;font-size:22rpx;text-align:center}.state{padding:60rpx 20rpx;color:#8795a8;font-size:25rpx;text-align:center}.state.error{color:#c65050}.fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}.fab view{position:relative;width:38rpx;height:38rpx}.fab view::before,.fab view::after{position:absolute;content:"";background:#fff;border-radius:3rpx}.fab view::before{top:17rpx;left:0;width:38rpx;height:4rpx}.fab view::after{top:0;left:17rpx;width:4rpx;height:38rpx}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:0;flex:1;padding-bottom: 132rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-enabled{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-disabled{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions button::after,.fab::after{border:0}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.more{display:block;padding:16rpx 0 6rpx;color:#93a1b3;font-size:22rpx;text-align:center}.state{padding:60rpx 20rpx;color:#8795a8;font-size:25rpx;text-align:center}.state.error{color:#c65050}.fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}.fab view{position:relative;width:38rpx;height:38rpx}.fab view::before,.fab view::after{position:absolute;content:"";background:#fff;border-radius:3rpx}.fab view::before{top:17rpx;left:0;width:38rpx;height:4rpx}.fab view::after{top:0;left:17rpx;width:4rpx;height:38rpx}
</style>
src/pages/mes/pd/archive/detail.vue
@@ -192,7 +192,7 @@
  .tabs-scroll{width:100%;white-space:nowrap;margin-bottom:16rpx}
  .tabs{display:inline-flex;gap:12rpx}
  .tab{padding:14rpx 26rpx;color:#617287;font-size:25rpx;background:#fff;border-radius:14rpx}
  .tab.on{color:#fff;background:#1769d8}
  .tab.on{color:#fff;background:var(--color-primary, #1769d8)}
  .card{padding:24rpx 22rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}
  .card-title{padding-bottom:14rpx;color:#20334c;font-size:28rpx;font-weight:600;border-bottom:1rpx solid #edf1f6}
  .grid{display:grid;gap:10rpx;padding-top:16rpx;color:#66778c;font-size:23rpx}
@@ -202,11 +202,11 @@
  .sub-item:last-child{border-bottom:0}
  .sub-head{display:flex;align-items:center;justify-content:space-between;gap:14rpx}
  .sub-name{min-width:0;flex:1;overflow:hidden;color:#20334c;font-size:26rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}
  .sub-tag{flex:none;padding:5rpx 14rpx;color:#1769d8;font-size:22rpx;background:#f2f6fc;border:1rpx solid #d5e4f7;border-radius:8rpx}
  .sub-tag{flex:none;padding:5rpx 14rpx;color:var(--color-primary, #1769d8);font-size:22rpx;background:#f2f6fc;border:1rpx solid #d5e4f7;border-radius:8rpx}
  .sub-grid{display:grid;gap:8rpx;padding-top:12rpx;color:#66778c;font-size:23rpx}
  .sub-grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .sub-actions{display:flex;justify-content:flex-end;padding-top:12rpx}
  .sub-actions button{min-height:50rpx;padding:0 18rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}
  .sub-actions button{min-height:50rpx;padding:0 18rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}
  .sub-actions button::after{border:0}
  .sub-empty{padding:30rpx 0;color:#9aa8ba;font-size:24rpx;text-align:center}
  .state{padding:60rpx 20rpx;color:#8795a8;font-size:25rpx;text-align:center}
src/pages/mes/pd/archive/index.vue
@@ -116,7 +116,7 @@
  .page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}
  .search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}
  .search input{flex:1;font-size:27rpx}
  .search text{color:#1769d8;font-size:24rpx}
  .search text{color:var(--color-primary, #1769d8);font-size:24rpx}
  .content{height:0;flex:1;padding-bottom:60rpx;box-sizing:border-box}
  .row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}
  .head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}
src/pages/mes/pd/project/bom.vue
@@ -255,23 +255,23 @@
<style lang="scss" scoped>
  .page{display:flex;height:100vh;flex-direction:column;overflow:hidden;background:#f3f6fb}
  .content{height:0;flex:1;padding:20rpx 30rpx 150rpx;box-sizing:border-box}
  .content{height:0;flex:1;padding: 20rpx 30rpx 132rpx;box-sizing:border-box}
  .item{padding:22rpx;margin-bottom:16rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}
  .item-head{display:flex;align-items:center;justify-content:space-between;gap:14rpx}
  .head-main{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}
  .head-main .item-code{color:#78879b;font-size:23rpx}
  .item-name{overflow:hidden;color:#20334c;font-size:28rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}
  .item-tag{flex:none;padding:5rpx 14rpx;color:#1769d8;font-size:23rpx;font-weight:600;background:#f2f6fc;border:1rpx solid #d5e4f7;border-radius:8rpx}
  .item-tag{flex:none;padding:5rpx 14rpx;color:var(--color-primary, #1769d8);font-size:23rpx;font-weight:600;background:#f2f6fc;border:1rpx solid #d5e4f7;border-radius:8rpx}
  .item-grid{display:grid;gap:8rpx;padding:14rpx 0;margin-top:14rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6}
  .item-grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:12rpx;border-top:1rpx solid #edf1f6}
  .actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}
  .actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}
  .actions button::after{border:0}
  .actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}
  .more{display:block;padding:16rpx 0 6rpx;color:#93a1b3;font-size:22rpx;text-align:center}
  .state{padding:60rpx 20rpx;color:#8795a8;font-size:25rpx;text-align:center}
  .state.error{color:#c65050}
  .fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}
  .fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}
  .fab::after{border:0}
  .fab view{position:relative;width:38rpx;height:38rpx}
  .fab view::before,.fab view::after{position:absolute;content:"";background:#fff;border-radius:3rpx}
@@ -281,13 +281,13 @@
  .modal{display:flex;width:100%;max-height:84vh;flex-direction:column;background:#fff;border-radius:24rpx 24rpx 0 0}
  .modal-head{display:flex;align-items:center;justify-content:space-between;height:96rpx;padding:0 28rpx;border-bottom:1rpx solid #edf1f6}
  .modal-head text:first-child{color:#10233f;font-size:30rpx;font-weight:600}
  .modal-close{color:#1769d8;font-size:25rpx}
  .modal-close{color:var(--color-primary, #1769d8);font-size:25rpx}
  .modal-body{flex:1;padding:0 28rpx;box-sizing:border-box}
  .modal-foot{display:flex;gap:16rpx;padding:18rpx 28rpx 34rpx;border-top:1rpx solid #edf1f6}
  .modal-foot button{flex:1;height:80rpx;margin:0;font-size:28rpx;line-height:80rpx;border-radius:40rpx}
  .modal-foot button::after{border:0}
  .modal-foot .primary{color:#fff;background:#1769d8}
  .modal-foot .ghost{color:#1769d8;background:#f2f6fc;border:1rpx solid #cfe0f7}
  .modal-foot .primary{color:#fff;background:var(--color-primary, #1769d8)}
  .modal-foot .ghost{color:var(--color-primary, #1769d8);background:#f2f6fc;border:1rpx solid #cfe0f7}
  .field{display:flex;align-items:center;min-height:96rpx;gap:20rpx;border-bottom:1rpx solid #f2f5f9}
  .field.column{align-items:flex-start;flex-direction:column;padding:20rpx 0;gap:12rpx}
  .label{width:180rpx;flex:none;color:#44586f;font-size:26rpx}
src/pages/mes/pd/project/detail.vue
@@ -725,40 +725,40 @@
  .card{padding:24rpx 22rpx;margin:20rpx 30rpx 0;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}
  .title-row{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}
  .title{min-width:0;flex:1;color:#20334c;font-size:32rpx;font-weight:600}
  .status{flex:none;padding:6rpx 18rpx;color:#1769d8;font-size:23rpx;background:#edf5ff;border:1rpx solid #bfdbff;border-radius:999rpx}
  .status{flex:none;padding:6rpx 18rpx;color:var(--color-primary, #1769d8);font-size:23rpx;background:var(--color-primary-soft, #edf5ff);border:1rpx solid var(--color-primary-border, #bfdbff);border-radius:999rpx}
  .grid{display:grid;gap:10rpx;padding-top:16rpx;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6}
  .grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .remark{padding-top:14rpx;margin-top:14rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6}
  .banner{padding:18rpx 22rpx;margin:16rpx 30rpx 0;color:#c2570d;font-size:24rpx;background:#fff8ee;border:1rpx solid #f5d9b0;border-radius:14rpx}
  .tabs{display:flex;gap:12rpx;padding:16rpx 30rpx 0}
  .tab{padding:14rpx 28rpx;color:#617287;font-size:26rpx;background:#fff;border-radius:14rpx}
  .tab.on{color:#fff;background:#1769d8}
  .tab.on{color:#fff;background:var(--color-primary, #1769d8)}
  .content{height:0;flex:1}
  .panel{padding:16rpx 30rpx 40rpx}
  .panel-head{display:flex;align-items:center;justify-content:space-between;padding:8rpx 4rpx 16rpx}
  .panel-title{color:#20334c;font-size:27rpx;font-weight:600}
  .panel-btn{color:#1769d8;font-size:25rpx}
  .panel-btn{color:var(--color-primary, #1769d8);font-size:25rpx}
  .panel-readonly{color:#9aa8ba;font-size:24rpx}
  .tip{padding:16rpx 20rpx;margin-bottom:16rpx;color:#c2570d;font-size:24rpx;background:#fff8ee;border-radius:14rpx}
  .steps{padding:20rpx 8rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}
  .step{display:flex;align-items:flex-start;gap:18rpx}
  .step-dot-wrap{display:flex;width:36rpx;flex:none;flex-direction:column;align-items:center}
  .step-dot{width:22rpx;height:22rpx;background:#e2e8f1;border:2rpx solid #cfd9e6;border-radius:50%}
  .step-dot.done{background:#1769d8;border-color:#1769d8}
  .step-dot.current{width:28rpx;height:28rpx;background:#fff;border:6rpx solid #1769d8}
  .step-dot.done{background:var(--color-primary, #1769d8);border-color:var(--color-primary, #1769d8)}
  .step-dot.current{width:28rpx;height:28rpx;background:#fff;border:6rpx solid var(--color-primary, #1769d8)}
  .step-line{width:2rpx;height:54rpx;background:#e2e8f1}
  .step-line.done{background:#1769d8}
  .step-line.done{background:var(--color-primary, #1769d8)}
  .step-text{padding-top:2rpx;color:#9aa8ba;font-size:25rpx}
  .step-text.done{color:#20334c}
  .archived-tip{padding:20rpx;margin-top:16rpx;color:#3d5069;font-size:24rpx;text-align:center;background:#eef2f7;border-radius:14rpx}
  .item{padding:22rpx;margin-bottom:16rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}
  .item-head{display:flex;align-items:center;justify-content:space-between;gap:14rpx}
  .item-name{min-width:0;flex:1;overflow:hidden;color:#20334c;font-size:28rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}
  .item-tag{flex:none;padding:5rpx 14rpx;color:#1769d8;font-size:22rpx;background:#f2f6fc;border:1rpx solid #d5e4f7;border-radius:8rpx}
  .item-tag{flex:none;padding:5rpx 14rpx;color:var(--color-primary, #1769d8);font-size:22rpx;background:#f2f6fc;border:1rpx solid #d5e4f7;border-radius:8rpx}
  .item-grid{display:grid;gap:8rpx;padding:14rpx 0;margin-top:14rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6}
  .item-grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:12rpx;border-top:1rpx solid #edf1f6}
  .actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}
  .actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}
  .actions button::after{border:0}
  .actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}
  .more{display:block;padding:16rpx 0 6rpx;color:#93a1b3;font-size:22rpx;text-align:center}
@@ -767,20 +767,20 @@
  .foot{display:flex;flex-wrap:wrap;gap:16rpx;padding:16rpx 30rpx 40rpx;background:#f3f6fb}
  .foot button{min-width:180rpx;flex:1;height:84rpx;margin:0;font-size:28rpx;line-height:84rpx;border-radius:42rpx}
  .foot button::after{border:0}
  .foot .primary{color:#fff;background:#1769d8}
  .foot .ghost{color:#1769d8;background:#f2f6fc;border:1rpx solid #cfe0f7}
  .foot .primary{color:#fff;background:var(--color-primary, #1769d8)}
  .foot .ghost{color:var(--color-primary, #1769d8);background:#f2f6fc;border:1rpx solid #cfe0f7}
  .foot-text{color:#9aa8ba;font-size:25rpx;text-align:center;flex:1;line-height:84rpx}
  .mask{position:fixed;top:0;right:0;bottom:0;left:0;z-index:900;display:flex;align-items:flex-end;background:rgba(16,35,63,.45)}
  .modal{display:flex;width:100%;max-height:84vh;flex-direction:column;background:#fff;border-radius:24rpx 24rpx 0 0}
  .modal-head{display:flex;align-items:center;justify-content:space-between;height:96rpx;padding:0 28rpx;border-bottom:1rpx solid #edf1f6}
  .modal-head text:first-child{color:#10233f;font-size:30rpx;font-weight:600}
  .modal-close{color:#1769d8;font-size:25rpx}
  .modal-close{color:var(--color-primary, #1769d8);font-size:25rpx}
  .modal-body{flex:1;padding:0 28rpx;box-sizing:border-box}
  .modal-foot{display:flex;gap:16rpx;padding:18rpx 28rpx 34rpx;border-top:1rpx solid #edf1f6}
  .modal-foot button{flex:1;height:80rpx;margin:0;font-size:28rpx;line-height:80rpx;border-radius:40rpx}
  .modal-foot button::after{border:0}
  .modal-foot .primary{color:#fff;background:#1769d8}
  .modal-foot .ghost{color:#1769d8;background:#f2f6fc;border:1rpx solid #cfe0f7}
  .modal-foot .primary{color:#fff;background:var(--color-primary, #1769d8)}
  .modal-foot .ghost{color:var(--color-primary, #1769d8);background:#f2f6fc;border:1rpx solid #cfe0f7}
  .field{display:flex;align-items:center;min-height:96rpx;gap:20rpx;border-bottom:1rpx solid #f2f5f9}
  .field.column{align-items:flex-start;flex-direction:column;padding:20rpx 0;gap:12rpx}
  .label{width:180rpx;flex:none;color:#44586f;font-size:26rpx}
@@ -798,6 +798,6 @@
  .file-name{min-width:0;flex:1;overflow:hidden;color:#20334c;font-size:24rpx;text-overflow:ellipsis;white-space:nowrap}
  .file-del{flex:none;margin-left:16rpx;color:#c65050;font-size:23rpx}
  .file-empty{color:#9aa8ba;font-size:24rpx}
  .upload{align-self:flex-start;height:68rpx;padding:0 30rpx;margin:12rpx 0 0;color:#1769d8;font-size:25rpx;line-height:66rpx;background:#f2f6fc;border:1rpx solid #cfe0f7;border-radius:34rpx}
  .upload{align-self:flex-start;height:68rpx;padding:0 30rpx;margin:12rpx 0 0;color:var(--color-primary, #1769d8);font-size:25rpx;line-height:66rpx;background:#f2f6fc;border:1rpx solid #cfe0f7;border-radius:34rpx}
  .upload::after{border:0}
</style>
src/pages/mes/pd/project/form.vue
@@ -363,9 +363,9 @@
  .arrow{flex:none;color:#b5c0cd;font-size:32rpx}
  .control-inline{display:flex;min-width:0;flex:1;align-items:center;gap:16rpx}
  .control-inline input{min-width:0;flex:1;font-size:27rpx;text-align:right}
  .inline-btn{flex:none;padding:8rpx 20rpx;color:#1769d8;font-size:24rpx;background:#f2f6fc;border:1rpx solid #cfe0f7;border-radius:8rpx}
  .inline-btn{flex:none;padding:8rpx 20rpx;color:var(--color-primary, #1769d8);font-size:24rpx;background:#f2f6fc;border:1rpx solid #cfe0f7;border-radius:8rpx}
  .foot{padding:16rpx 30rpx 40rpx;background:#f3f6fb}
  .save{height:88rpx;color:#fff;font-size:30rpx;line-height:88rpx;background:#1769d8;border-radius:44rpx}
  .save{height:88rpx;color:#fff;font-size:30rpx;line-height:88rpx;background:var(--color-primary, #1769d8);border-radius:44rpx}
  .save::after{border:0}
  .save[disabled]{opacity:.6}
</style>
src/pages/mes/pd/project/index.vue
@@ -335,14 +335,14 @@
  .page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}
  .search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 12rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}
  .search input{flex:1;font-size:27rpx}
  .search text{color:#1769d8;font-size:24rpx}
  .search text{color:var(--color-primary, #1769d8);font-size:24rpx}
  .filters{display:flex;align-items:center;gap:16rpx;margin-bottom:16rpx}
  .filter{display:flex;flex:1;align-items:center;justify-content:space-between;height:72rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}
  .filter-label{color:#66778c;font-size:24rpx}
  .filter-value{color:#20334c;font-size:25rpx}
  .filter-value.empty{color:#9aa8ba}
  .filter-reset{flex:none;color:#1769d8;font-size:24rpx}
  .content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}
  .filter-reset{flex:none;color:var(--color-primary, #1769d8);font-size:24rpx}
  .content{height:0;flex:1;padding-bottom: 132rpx;box-sizing:border-box}
  .row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}
  .head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}
  .head-main{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}
@@ -350,7 +350,7 @@
  .name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}
  .status{display:inline-flex;flex:none;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}
  .tag-draft{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}
  .tag-upload{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}
  .tag-upload{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #edf5ff);border:1rpx solid var(--color-primary-border, #bfdbff)}
  .tag-audit{color:#c2570d;background:#fff4e7;border:1rpx solid #f5cfa4}
  .tag-approving{color:#7a4ddb;background:#f4f0ff;border:1rpx solid #d6c8f7}
  .tag-archive{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}
@@ -358,13 +358,13 @@
  .grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}
  .grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}
  .actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}
  .actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}
  .actions button::after{border:0}
  .actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}
  .more{display:block;padding:16rpx 0 6rpx;color:#93a1b3;font-size:22rpx;text-align:center}
  .state{padding:60rpx 20rpx;color:#8795a8;font-size:25rpx;text-align:center}
  .state.error{color:#c65050}
  .fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}
  .fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}
  .fab::after{border:0}
  .fab view{position:relative;width:38rpx;height:38rpx}
  .fab view::before,.fab view::after{position:absolute;content:"";background:#fff;border-radius:3rpx}
src/pages/mes/pd/project/review.vue
@@ -208,11 +208,11 @@
  .head-main{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}
  .head-main .item-code{color:#78879b;font-size:23rpx}
  .item-name{overflow:hidden;color:#20334c;font-size:28rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}
  .item-tag{flex:none;padding:5rpx 14rpx;color:#1769d8;font-size:22rpx;background:#f2f6fc;border:1rpx solid #d5e4f7;border-radius:8rpx}
  .item-tag{flex:none;padding:5rpx 14rpx;color:var(--color-primary, #1769d8);font-size:22rpx;background:#f2f6fc;border:1rpx solid #d5e4f7;border-radius:8rpx}
  .item-grid{display:grid;gap:8rpx;padding:14rpx 0;margin-top:14rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6}
  .item-grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:12rpx;border-top:1rpx solid #edf1f6}
  .actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}
  .actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}
  .actions button::after{border:0}
  .more{display:block;padding:16rpx 0 6rpx;color:#93a1b3;font-size:22rpx;text-align:center}
  .state{padding:60rpx 20rpx;color:#8795a8;font-size:25rpx;text-align:center}
@@ -221,13 +221,13 @@
  .modal{display:flex;width:100%;max-height:84vh;flex-direction:column;background:#fff;border-radius:24rpx 24rpx 0 0}
  .modal-head{display:flex;align-items:center;justify-content:space-between;height:96rpx;padding:0 28rpx;border-bottom:1rpx solid #edf1f6}
  .modal-head text:first-child{color:#10233f;font-size:30rpx;font-weight:600}
  .modal-close{color:#1769d8;font-size:25rpx}
  .modal-close{color:var(--color-primary, #1769d8);font-size:25rpx}
  .modal-body{flex:1;padding:0 28rpx;box-sizing:border-box}
  .modal-foot{display:flex;gap:16rpx;padding:18rpx 28rpx 34rpx;border-top:1rpx solid #edf1f6}
  .modal-foot button{flex:1;height:80rpx;margin:0;font-size:28rpx;line-height:80rpx;border-radius:40rpx}
  .modal-foot button::after{border:0}
  .modal-foot .primary{color:#fff;background:#1769d8}
  .modal-foot .ghost{color:#1769d8;background:#f2f6fc;border:1rpx solid #cfe0f7}
  .modal-foot .primary{color:#fff;background:var(--color-primary, #1769d8)}
  .modal-foot .ghost{color:var(--color-primary, #1769d8);background:#f2f6fc;border:1rpx solid #cfe0f7}
  .field{display:flex;align-items:center;min-height:96rpx;gap:20rpx;border-bottom:1rpx solid #f2f5f9}
  .field.column{align-items:flex-start;flex-direction:column;padding:20rpx 0;gap:12rpx}
  .label{width:180rpx;flex:none;color:#44586f;font-size:26rpx}
@@ -239,6 +239,6 @@
  .radios{display:flex;gap:28rpx}
  .radio{display:flex;align-items:center;gap:12rpx;color:#44586f;font-size:26rpx}
  .radio-dot{width:32rpx;height:32rpx;background:#fff;border:2rpx solid #cfd9e6;border-radius:50%}
  .radio.on{color:#1769d8}
  .radio.on .radio-dot{background:#1769d8;border-color:#1769d8;box-shadow:inset 0 0 0 6rpx #fff}
  .radio.on{color:var(--color-primary, #1769d8)}
  .radio.on .radio-dot{background:var(--color-primary, #1769d8);border-color:var(--color-primary, #1769d8);box-shadow:inset 0 0 0 6rpx #fff}
</style>
src/pages/mes/pd/project/task.vue
@@ -371,23 +371,23 @@
<style lang="scss" scoped>
  .page{display:flex;height:100vh;flex-direction:column;overflow:hidden;background:#f3f6fb}
  .content{height:0;flex:1;padding:20rpx 30rpx 150rpx;box-sizing:border-box}
  .content{height:0;flex:1;padding: 20rpx 30rpx 132rpx;box-sizing:border-box}
  .item{padding:22rpx;margin-bottom:16rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}
  .item-head{display:flex;align-items:center;justify-content:space-between;gap:14rpx}
  .head-main{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}
  .head-main .item-code{color:#78879b;font-size:23rpx}
  .item-name{overflow:hidden;color:#20334c;font-size:28rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}
  .item-tag{flex:none;padding:5rpx 14rpx;color:#1769d8;font-size:22rpx;background:#f2f6fc;border:1rpx solid #d5e4f7;border-radius:8rpx}
  .item-tag{flex:none;padding:5rpx 14rpx;color:var(--color-primary, #1769d8);font-size:22rpx;background:#f2f6fc;border:1rpx solid #d5e4f7;border-radius:8rpx}
  .item-grid{display:grid;gap:8rpx;padding:14rpx 0;margin-top:14rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6}
  .item-grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:12rpx;border-top:1rpx solid #edf1f6}
  .actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}
  .actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}
  .actions button::after{border:0}
  .actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}
  .more{display:block;padding:16rpx 0 6rpx;color:#93a1b3;font-size:22rpx;text-align:center}
  .state{padding:60rpx 20rpx;color:#8795a8;font-size:25rpx;text-align:center}
  .state.error{color:#c65050}
  .fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}
  .fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}
  .fab::after{border:0}
  .fab view{position:relative;width:38rpx;height:38rpx}
  .fab view::before,.fab view::after{position:absolute;content:"";background:#fff;border-radius:3rpx}
@@ -397,13 +397,13 @@
  .modal{display:flex;width:100%;max-height:84vh;flex-direction:column;background:#fff;border-radius:24rpx 24rpx 0 0}
  .modal-head{display:flex;align-items:center;justify-content:space-between;height:96rpx;padding:0 28rpx;border-bottom:1rpx solid #edf1f6}
  .modal-head text:first-child{color:#10233f;font-size:30rpx;font-weight:600}
  .modal-close{color:#1769d8;font-size:25rpx}
  .modal-close{color:var(--color-primary, #1769d8);font-size:25rpx}
  .modal-body{flex:1;padding:0 28rpx;box-sizing:border-box}
  .modal-foot{display:flex;gap:16rpx;padding:18rpx 28rpx 34rpx;border-top:1rpx solid #edf1f6}
  .modal-foot button{flex:1;height:80rpx;margin:0;font-size:28rpx;line-height:80rpx;border-radius:40rpx}
  .modal-foot button::after{border:0}
  .modal-foot .primary{color:#fff;background:#1769d8}
  .modal-foot .ghost{color:#1769d8;background:#f2f6fc;border:1rpx solid #cfe0f7}
  .modal-foot .primary{color:#fff;background:var(--color-primary, #1769d8)}
  .modal-foot .ghost{color:var(--color-primary, #1769d8);background:#f2f6fc;border:1rpx solid #cfe0f7}
  .field{display:flex;align-items:center;min-height:96rpx;gap:20rpx;border-bottom:1rpx solid #f2f5f9}
  .field.column{align-items:flex-start;flex-direction:column;padding:20rpx 0;gap:12rpx}
  .label{width:180rpx;flex:none;color:#44586f;font-size:26rpx}
@@ -418,5 +418,5 @@
  .arrow{flex:none;color:#b5c0cd;font-size:32rpx}
  .control-inline{display:flex;min-width:0;flex:1;align-items:center;gap:16rpx}
  .control-inline input{min-width:0;flex:1;font-size:27rpx;text-align:right}
  .inline-btn{flex:none;padding:8rpx 20rpx;color:#1769d8;font-size:24rpx;background:#f2f6fc;border:1rpx solid #cfe0f7;border-radius:8rpx}
  .inline-btn{flex:none;padding:8rpx 20rpx;color:var(--color-primary, #1769d8);font-size:24rpx;background:#f2f6fc;border:1rpx solid #cfe0f7;border-radius:8rpx}
</style>
src/pages/mes/pd/project/version.vue
@@ -308,23 +308,23 @@
<style lang="scss" scoped>
  .page{display:flex;height:100vh;flex-direction:column;overflow:hidden;background:#f3f6fb}
  .content{height:0;flex:1;padding:20rpx 30rpx 150rpx;box-sizing:border-box}
  .content{height:0;flex:1;padding: 20rpx 30rpx 132rpx;box-sizing:border-box}
  .item{padding:22rpx;margin-bottom:16rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}
  .item-head{display:flex;align-items:center;justify-content:space-between;gap:14rpx}
  .head-main{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}
  .head-main .item-code{color:#78879b;font-size:23rpx}
  .item-name{overflow:hidden;color:#20334c;font-size:28rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}
  .item-tag{flex:none;padding:5rpx 14rpx;color:#1769d8;font-size:22rpx;background:#f2f6fc;border:1rpx solid #d5e4f7;border-radius:8rpx}
  .item-tag{flex:none;padding:5rpx 14rpx;color:var(--color-primary, #1769d8);font-size:22rpx;background:#f2f6fc;border:1rpx solid #d5e4f7;border-radius:8rpx}
  .item-grid{display:grid;gap:8rpx;padding:14rpx 0;margin-top:14rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6}
  .item-grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:12rpx;border-top:1rpx solid #edf1f6}
  .actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}
  .actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}
  .actions button::after{border:0}
  .actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}
  .more{display:block;padding:16rpx 0 6rpx;color:#93a1b3;font-size:22rpx;text-align:center}
  .state{padding:60rpx 20rpx;color:#8795a8;font-size:25rpx;text-align:center}
  .state.error{color:#c65050}
  .fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}
  .fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}
  .fab::after{border:0}
  .fab view{position:relative;width:38rpx;height:38rpx}
  .fab view::before,.fab view::after{position:absolute;content:"";background:#fff;border-radius:3rpx}
@@ -334,13 +334,13 @@
  .modal{display:flex;width:100%;max-height:84vh;flex-direction:column;background:#fff;border-radius:24rpx 24rpx 0 0}
  .modal-head{display:flex;align-items:center;justify-content:space-between;height:96rpx;padding:0 28rpx;border-bottom:1rpx solid #edf1f6}
  .modal-head text:first-child{color:#10233f;font-size:30rpx;font-weight:600}
  .modal-close{color:#1769d8;font-size:25rpx}
  .modal-close{color:var(--color-primary, #1769d8);font-size:25rpx}
  .modal-body{flex:1;padding:0 28rpx;box-sizing:border-box}
  .modal-foot{display:flex;gap:16rpx;padding:18rpx 28rpx 34rpx;border-top:1rpx solid #edf1f6}
  .modal-foot button{flex:1;height:80rpx;margin:0;font-size:28rpx;line-height:80rpx;border-radius:40rpx}
  .modal-foot button::after{border:0}
  .modal-foot .primary{color:#fff;background:#1769d8}
  .modal-foot .ghost{color:#1769d8;background:#f2f6fc;border:1rpx solid #cfe0f7}
  .modal-foot .primary{color:#fff;background:var(--color-primary, #1769d8)}
  .modal-foot .ghost{color:var(--color-primary, #1769d8);background:#f2f6fc;border:1rpx solid #cfe0f7}
  .field{display:flex;align-items:center;min-height:96rpx;gap:20rpx;border-bottom:1rpx solid #f2f5f9}
  .field.column{align-items:flex-start;flex-direction:column;padding:20rpx 0;gap:12rpx}
  .label{width:180rpx;flex:none;color:#44586f;font-size:26rpx}
@@ -356,5 +356,5 @@
  .arrow{flex:none;color:#b5c0cd;font-size:32rpx}
  .control-inline{display:flex;min-width:0;flex:1;align-items:center;gap:16rpx}
  .control-inline input{min-width:0;flex:1;font-size:27rpx;text-align:right}
  .inline-btn{flex:none;padding:8rpx 20rpx;color:#1769d8;font-size:24rpx;background:#f2f6fc;border:1rpx solid #cfe0f7;border-radius:8rpx}
  .inline-btn{flex:none;padding:8rpx 20rpx;color:var(--color-primary, #1769d8);font-size:24rpx;background:#f2f6fc;border:1rpx solid #cfe0f7;border-radius:8rpx}
</style>
src/pages/mes/pro/card/form.vue
@@ -1,3 +1,3 @@
<script setup lang="ts">
import{computed,reactive,ref}from"vue";import{onLoad}from"@dcloudio/uni-app";import{createCard,createCardProcess,deleteCardProcess,getCard,getCardProcessPage,updateCard,updateCardProcess,type TransferCard,type TransferProcess}from"../../../../api/mes-operations";import{getWorkOrderPage,type WorkOrder}from"../../../../api/production";import{generateAutoCode,getMesItemPage,getProcessSimpleList,getWorkstationPage,type MesMdItem,type MesWorkstation,type ProProcess}from"../../../../api/process-design";import{getHrmUserList,type UserOption}from"../../../../api/hrm";import{useAuth}from"../../../../stores/auth";const{hasPermission,state}=useAuth(),id=ref<number>(),mode=ref("edit"),orders=ref<WorkOrder[]>([]),items=ref<MesMdItem[]>([]),processes=ref<ProProcess[]>([]),stations=ref<MesWorkstation[]>([]),users=ref<UserOption[]>([]),lines=ref<TransferProcess[]>([]),open=ref(false),editing=ref<TransferProcess>(),form=reactive<TransferCard>({code:"",status:0,transferedQuantity:0}),line=reactive<TransferProcess>({sort:1,inputQuantity:0,outputQuantity:0,unqualifiedQuantity:0});const readonly=computed(()=>mode.value==="detail"||form.status!==0),canSave=computed(()=>id.value?hasPermission("mes:pro-card:update"):hasPermission("mes:pro-card:create"));function selectOrder(i:number){const x=orders.value[i];Object.assign(form,{workOrderId:x.id,workOrderCode:x.code,workOrderName:x.name,itemId:x.productId,itemCode:x.productCode,itemName:x.productName,specification:x.productSpecification,unitMeasureName:x.unitMeasureName})}function selectItem(i:number){const x=items.value[i];Object.assign(form,{itemId:x.id,itemCode:x.code,itemName:x.name,specification:x.specification,unitMeasureName:x.unitMeasureName})}async function save(){if(!state.accessToken||!canSave.value||!form.code||!form.workOrderId||!form.itemId)return uni.showToast({title:"请完整填写必填项",icon:"none"});id.value?await updateCard(state.accessToken,{...form,id:id.value}):id.value=await createCard(state.accessToken,form);uni.showToast({title:"保存成功",icon:"success"});loadLines()}async function loadLines(){if(state.accessToken&&id.value)lines.value=(await getCardProcessPage(state.accessToken,{pageNo:1,pageSize:100,cardId:id.value})).list}function editLine(x?:TransferProcess){editing.value=x;Object.assign(line,x||{id:undefined,sort:lines.value.length+1,processId:undefined,workstationId:undefined,userId:undefined,inputTime:"",outputTime:"",inputQuantity:0,outputQuantity:0,unqualifiedQuantity:0,remark:""});open.value=true}async function saveLine(){if(!state.accessToken||!id.value||!line.processId)return uni.showToast({title:"请选择工序",icon:"none"});const d={...line,cardId:id.value};editing.value?.id?await updateCardProcess(state.accessToken,{...d,id:editing.value.id}):await createCardProcess(state.accessToken,d);open.value=false;loadLines()}async function removeLine(x:TransferProcess){if(state.accessToken&&x.id){await deleteCardProcess(state.accessToken,x.id);loadLines()}}onLoad(async q=>{id.value=q.id?Number(q.id):undefined;mode.value=q.mode||"edit";if(!state.accessToken)return;const[o,m,p,w,u]=await Promise.all([getWorkOrderPage(state.accessToken,{pageNo:1,pageSize:100}),getMesItemPage(state.accessToken,{pageNo:1,pageSize:100,status:0}),getProcessSimpleList(state.accessToken),getWorkstationPage(state.accessToken,{pageNo:1,pageSize:100,status:0}),getHrmUserList(state.accessToken)]);orders.value=o.list;items.value=m.list;processes.value=p;stations.value=w.list;users.value=u;if(id.value){Object.assign(form,await getCard(state.accessToken,id.value));loadLines()}else form.code=await generateAutoCode(state.accessToken,"PRO_CARD_CODE")});
</script><template><view class="page"><view class="card"><view class="field"><text>流转卡编号 *</text><input v-model="form.code" :disabled="readonly||!!id"/></view><view class="field"><text>生产订单 *</text><picker v-if="!readonly" :range="orders" range-key="code" @change="selectOrder($event.detail.value)"><view class="value">{{form.workOrderCode||'请选择'}} â€º</view></picker><text v-else class="value">{{form.workOrderCode}}</text></view><view class="field"><text>产品 *</text><picker v-if="!readonly" :range="items" range-key="name" @change="selectItem($event.detail.value)"><view class="value">{{form.itemName||'请选择'}} â€º</view></picker><text v-else class="value">{{form.itemName}}</text></view><view class="field"><text>批次号</text><input v-model="form.batchCode" :disabled="readonly"/></view><view class="field"><text>流转数量 *</text><input v-model.number="form.transferedQuantity" :disabled="readonly" type="digit"/></view><view class="field col"><text>备注</text><textarea v-model="form.remark" :disabled="readonly"/></view></view><button v-if="!readonly&&canSave" class="save" @click="save">保存</button><view v-if="id" class="section"><view class="section-head"><b>工序明细</b><button v-if="!readonly" @click="editLine()">添加工序</button></view><view v-for="x in lines" :key="x.id" class="line"><b>{{x.sort}}. {{x.processName||x.processCode}}</b><text>工位:{{x.workstationName||'--'}} 操作人:{{x.nickname||'--'}}</text><text>投入 {{x.inputQuantity??0}} / äº§å‡º {{x.outputQuantity??0}} / ä¸åˆæ ¼ {{x.unqualifiedQuantity??0}}</text><text>{{x.inputTime||'--'}} è‡³ {{x.outputTime||'--'}}</text><view v-if="!readonly"><button @click="editLine(x)">编辑</button><button @click="removeLine(x)">删除</button></view></view><view v-if="!lines.length" class="state">暂无工序明细</view></view><view v-if="open" class="mask" @click="open=false"><scroll-view class="sheet" scroll-y @click.stop><h3>{{editing?'编辑工序':'添加工序'}}</h3><view class="field"><text>顺序</text><input v-model.number="line.sort" type="number"/></view><view class="field"><text>工序 *</text><picker :range="processes" range-key="name" @change="line.processId=processes[$event.detail.value].id"><view class="value">{{processes.find(x=>x.id===line.processId)?.name||line.processName||'请选择'}} â€º</view></picker></view><view class="field"><text>工位</text><picker :range="stations" range-key="name" @change="line.workstationId=stations[$event.detail.value].id"><view class="value">{{stations.find(x=>x.id===line.workstationId)?.name||line.workstationName||'请选择'}} â€º</view></picker></view><view class="field"><text>操作人</text><picker :range="users" range-key="nickname" @change="line.userId=users[$event.detail.value].id"><view class="value">{{users.find(x=>x.id===line.userId)?.nickname||line.nickname||'请选择'}} â€º</view></picker></view><view class="field"><text>投入时间</text><input v-model="line.inputTime" placeholder="YYYY-MM-DD HH:mm:ss"/></view><view class="field"><text>产出时间</text><input v-model="line.outputTime" placeholder="YYYY-MM-DD HH:mm:ss"/></view><view class="field"><text>投入数量</text><input v-model.number="line.inputQuantity" type="digit"/></view><view class="field"><text>产出数量</text><input v-model.number="line.outputQuantity" type="digit"/></view><view class="field"><text>不合格数量</text><input v-model.number="line.unqualifiedQuantity" type="digit"/></view><view class="field col"><text>备注</text><textarea v-model="line.remark"/></view><button class="save inner" @click="saveLine">保存工序</button></scroll-view></view></view></template><style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx;background:#f6f7f9}.card,.section{overflow:hidden;background:#fff;border-radius:16rpx}.section{margin-top:24rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eee}.field>text:first-child{width:190rpx}.field input,.field picker,.value{flex:1;text-align:right}.col{align-items:flex-start;flex-direction:column;padding-block:20rpx}.col textarea{width:100%;height:120rpx}.save{margin-top:28rpx;color:#fff;background:#1769d8}.section-head{display:flex;justify-content:space-between;padding:22rpx}.section-head button,.line button{min-height:48rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:46rpx}.line{display:flex;flex-direction:column;gap:8rpx;padding:20rpx;border-top:1rpx solid #eee;color:#66778c;font-size:23rpx}.line>view{display:flex;justify-content:flex-end;gap:10rpx}.state{padding:30rpx;text-align:center}.mask{position:fixed;inset:0;display:flex;align-items:flex-end;background:#0006}.sheet{max-height:85vh;background:#fff}.sheet h3{padding:25rpx}.inner{margin:25rpx 30rpx 50rpx}</style>
</script><template><view class="page"><view class="card"><view class="field"><text>流转卡编号 *</text><input v-model="form.code" :disabled="readonly||!!id"/></view><view class="field"><text>生产订单 *</text><picker v-if="!readonly" :range="orders" range-key="code" @change="selectOrder($event.detail.value)"><view class="value">{{form.workOrderCode||'请选择'}} â€º</view></picker><text v-else class="value">{{form.workOrderCode}}</text></view><view class="field"><text>产品 *</text><picker v-if="!readonly" :range="items" range-key="name" @change="selectItem($event.detail.value)"><view class="value">{{form.itemName||'请选择'}} â€º</view></picker><text v-else class="value">{{form.itemName}}</text></view><view class="field"><text>批次号</text><input v-model="form.batchCode" :disabled="readonly"/></view><view class="field"><text>流转数量 *</text><input v-model.number="form.transferedQuantity" :disabled="readonly" type="digit"/></view><view class="field col"><text>备注</text><textarea v-model="form.remark" :disabled="readonly"/></view></view><button v-if="!readonly&&canSave" class="save" @click="save">保存</button><view v-if="id" class="section"><view class="section-head"><b>工序明细</b><button v-if="!readonly" @click="editLine()">添加工序</button></view><view v-for="x in lines" :key="x.id" class="line"><b>{{x.sort}}. {{x.processName||x.processCode}}</b><text>工位:{{x.workstationName||'--'}} 操作人:{{x.nickname||'--'}}</text><text>投入 {{x.inputQuantity??0}} / äº§å‡º {{x.outputQuantity??0}} / ä¸åˆæ ¼ {{x.unqualifiedQuantity??0}}</text><text>{{x.inputTime||'--'}} è‡³ {{x.outputTime||'--'}}</text><view v-if="!readonly"><button @click="editLine(x)">编辑</button><button @click="removeLine(x)">删除</button></view></view><view v-if="!lines.length" class="state">暂无工序明细</view></view><view v-if="open" class="mask" @click="open=false"><scroll-view class="sheet" scroll-y @click.stop><h3>{{editing?'编辑工序':'添加工序'}}</h3><view class="field"><text>顺序</text><input v-model.number="line.sort" type="number"/></view><view class="field"><text>工序 *</text><picker :range="processes" range-key="name" @change="line.processId=processes[$event.detail.value].id"><view class="value">{{processes.find(x=>x.id===line.processId)?.name||line.processName||'请选择'}} â€º</view></picker></view><view class="field"><text>工位</text><picker :range="stations" range-key="name" @change="line.workstationId=stations[$event.detail.value].id"><view class="value">{{stations.find(x=>x.id===line.workstationId)?.name||line.workstationName||'请选择'}} â€º</view></picker></view><view class="field"><text>操作人</text><picker :range="users" range-key="nickname" @change="line.userId=users[$event.detail.value].id"><view class="value">{{users.find(x=>x.id===line.userId)?.nickname||line.nickname||'请选择'}} â€º</view></picker></view><view class="field"><text>投入时间</text><input v-model="line.inputTime" placeholder="YYYY-MM-DD HH:mm:ss"/></view><view class="field"><text>产出时间</text><input v-model="line.outputTime" placeholder="YYYY-MM-DD HH:mm:ss"/></view><view class="field"><text>投入数量</text><input v-model.number="line.inputQuantity" type="digit"/></view><view class="field"><text>产出数量</text><input v-model.number="line.outputQuantity" type="digit"/></view><view class="field"><text>不合格数量</text><input v-model.number="line.unqualifiedQuantity" type="digit"/></view><view class="field col"><text>备注</text><textarea v-model="line.remark"/></view><button class="save inner" @click="saveLine">保存工序</button></scroll-view></view></view></template><style lang="scss" scoped>.page{min-height:100vh;padding:24rpx 30rpx;background:#f6f7f9}.card,.section{overflow:hidden;background:#fff;border-radius:16rpx}.section{margin-top:24rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eee}.field>text:first-child{width:190rpx}.field input,.field picker,.value{flex:1;text-align:right}.col{align-items:flex-start;flex-direction:column;padding-block:20rpx}.col textarea{width:100%;height:120rpx}.save{margin-top:28rpx;color:#fff;background:var(--color-primary, #1769d8)}.section-head{display:flex;justify-content:space-between;padding:22rpx}.section-head button,.line button{min-height:48rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:46rpx}.line{display:flex;flex-direction:column;gap:8rpx;padding:20rpx;border-top:1rpx solid #eee;color:#66778c;font-size:23rpx}.line>view{display:flex;justify-content:flex-end;gap:10rpx}.state{padding:30rpx;text-align:center}.mask{position:fixed;inset:0;display:flex;align-items:flex-end;background:#0006}.sheet{max-height:85vh;background:#fff}.sheet h3{padding:25rpx}.inner{margin:25rpx 30rpx 50rpx}</style>
src/pages/mes/pro/card/index.vue
@@ -1,12 +1,49 @@
<script setup lang="ts">
import{computed,ref}from"vue";import{onShow,onPullDownRefresh}from"@dcloudio/uni-app";import{cancelCard,deleteCard,finishCard,getCardPage,submitCard,type TransferCard}from"../../../../api/mes-operations";import{useAuth}from"../../../../stores/auth";const{hasPermission,isLoggedIn,state}=useAuth(),keyword=ref(""),rows=ref<TransferCard[]>([]),loading=ref(false),p=(x:string)=>hasPermission("mes:pro-card:"+x),canQuery=computed(()=>p("query")),canCreate=computed(()=>p("create")),labels:Record<number,string>={0:"草稿",1:"已确认",2:"已完工",3:"已取消"};async function load(){if(!state.accessToken||!canQuery.value)return;loading.value=true;try{rows.value=(await getCardPage(state.accessToken,{pageNo:1,pageSize:100,code:keyword.value||undefined})).list}finally{loading.value=false;uni.stopPullDownRefresh()}}function go(id?:number,mode="edit"){uni.navigateTo({url:"/pages/mes/pro/card/form"+(id?"?id="+id+"&mode="+mode:"")})}async function run(x:TransferCard,t:string){if(!state.accessToken||!x.id)return;const ok=await new Promise<boolean>(r=>uni.showModal({title:"确认操作",content:"确定执行该操作吗?",success:v=>r(v.confirm)}));if(!ok)return;if(t==="delete")await deleteCard(state.accessToken,x.id);else if(t==="submit")await submitCard(state.accessToken,x.id);else if(t==="finish")await finishCard(state.accessToken,x.id);else await cancelCard(state.accessToken,x.id);load()}onShow(load);onPullDownRefresh(load);
</script><template><view class="page"><template v-if="isLoggedIn"><view v-if="canQuery" class="search"><input v-model="keyword" placeholder="搜索流转卡编号" @confirm="load"/><text @click="keyword='';load()">清除</text></view><scroll-view v-if="canQuery" class="list" scroll-y><view v-for="x in rows" :key="x.id" class="row" @click="go(x.id,'detail')"><view class="head"><view><b>{{x.code||'暂无编号'}}</b><text>{{x.workOrderCode||'暂无生产订单'}}</text></view><view class="status-wrap"><text :class="['status','s'+x.status]">{{labels[Number(x.status)]||'未知'}}</text></view></view><view class="grid"><text>产品:{{x.itemCode||'--'}} {{x.itemName||''}}</text><text>规格:{{x.specification||'--'}}</text><text>批次:{{x.batchCode||'--'}}</text><text>流转数量:{{x.transferedQuantity??0}} {{x.unitMeasureName||''}}</text></view><view class="actions" @click.stop><button @click="go(x.id,'detail')">详情</button><button v-if="p('update')&&x.status===0" @click="go(x.id)">编辑</button><button v-if="p('update')&&x.status===0" @click="run(x,'submit')">提交</button><button v-if="p('finish')&&x.status===1" @click="run(x,'finish')">完工</button><button v-if="p('update')&&x.status===1" @click="run(x,'cancel')">取消</button><button v-if="p('delete')&&x.status===0" @click="run(x,'delete')">删除</button></view></view><view v-if="!rows.length" class="state">{{loading?'加载中...':'暂无工序流转卡'}}</view></scroll-view><view v-else class="state">暂无工序流转查看权限</view></template><view v-else class="state">登录后查看工序流转</view><button v-if="canCreate" class="fab" @click="go()"><view/></button></view></template><style lang="scss" scoped>
import { computed, ref } from "vue";
import { onPullDownRefresh, onShow } from "@dcloudio/uni-app";
import { cancelCard, deleteCard, finishCard, getCardPage, submitCard, type TransferCard } from "../../../../api/mes-operations";
import { useAuth } from "../../../../stores/auth";
const { hasPermission, isLoggedIn, state } = useAuth();
const keyword = ref(""), rows = ref<TransferCard[]>([]), loading = ref(false), pageNo = ref(1), total = ref(0);
const pageSize = 15;
const p = (action: string) => hasPermission("mes:pro-card:" + action);
const canQuery = computed(() => p("query")), canCreate = computed(() => p("create"));
const hasMore = computed(() => rows.value.length < total.value);
const labels: Record<number, string> = { 0: "草稿", 1: "已确认", 2: "已完工", 3: "已取消" };
async function load(reset = true) {
  if (!state.accessToken || !canQuery.value || loading.value) return;
  if (reset) { pageNo.value = 1; total.value = 0; }
  loading.value = true;
  try {
    const data = await getCardPage(state.accessToken, { pageNo: pageNo.value, pageSize, code: keyword.value || undefined });
    rows.value = reset ? (data.list || []) : [...rows.value, ...(data.list || [])];
    total.value = Number(data.total || 0);
    if (rows.value.length < total.value) pageNo.value += 1;
  } catch (error) { uni.showToast({ title: error instanceof Error ? error.message : "加载失败", icon: "none" }); }
  finally { loading.value = false; uni.stopPullDownRefresh(); }
}
function loadMore() { if (hasMore.value) load(false); }
function clearSearch() { keyword.value = ""; load(true); }
function go(id?: number, mode = "edit") { uni.navigateTo({ url: "/pages/mes/pro/card/form" + (id ? "?id=" + id + "&mode=" + mode : "") }); }
async function run(item: TransferCard, type: string) {
  if (!state.accessToken || !item.id) return;
  const ok = await new Promise<boolean>(resolve => uni.showModal({ title: "确认操作", content: "确定执行该操作吗?", success: result => resolve(result.confirm) }));
  if (!ok) return;
  if (type === "delete") await deleteCard(state.accessToken, item.id);
  else if (type === "submit") await submitCard(state.accessToken, item.id);
  else if (type === "finish") await finishCard(state.accessToken, item.id);
  else await cancelCard(state.accessToken, item.id);
  load(true);
}
onShow(() => load(true));
onPullDownRefresh(() => load(true));
</script><template><view class="page"><template v-if="isLoggedIn"><view v-if="canQuery" class="search"><input v-model="keyword" placeholder="搜索流转卡编号" @confirm="load(true)"/><text @click="clearSearch">清除</text></view><scroll-view v-if="canQuery" class="list" scroll-y @scrolltolower="loadMore"><view v-for="x in rows" :key="x.id" class="row" @click="go(x.id,'detail')"><view class="head"><view><b>{{x.code||'暂无编号'}}</b><text>{{x.workOrderCode||'暂无生产订单'}}</text></view><view class="status-wrap"><text :class="['status','s'+x.status]">{{labels[Number(x.status)]||'未知'}}</text></view></view><view class="grid"><text>产品:{{x.itemCode||'--'}} {{x.itemName||''}}</text><text>规格:{{x.specification||'--'}}</text><text>批次:{{x.batchCode||'--'}}</text><text>流转数量:{{x.transferedQuantity??0}} {{x.unitMeasureName||''}}</text></view><view class="actions" @click.stop><button @click="go(x.id,'detail')">详情</button><button v-if="p('update')&&x.status===0" @click="go(x.id)">编辑</button><button v-if="p('update')&&x.status===0" @click="run(x,'submit')">提交</button><button v-if="p('finish')&&x.status===1" @click="run(x,'finish')">完工</button><button v-if="p('update')&&x.status===1" @click="run(x,'cancel')">取消</button><button v-if="p('delete')&&x.status===0" @click="run(x,'delete')">删除</button></view></view><view v-if="!rows.length" class="state">{{loading?'加载中...':'暂无工序流转卡'}}</view><view v-else class="state more">{{loading?'加载中...':hasMore?'上拉加载更多':'没有更多了'}}</view></scroll-view><view v-else class="state">暂无工序流转查看权限</view></template><view v-else class="state">登录后查看工序流转</view><button v-if="canCreate" class="fab" @click="go()"><view/></button></view></template><style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}
.search{display:flex;flex:none;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.search text{flex:none;color:#1769d8;font-size:24rpx}
.search{display:flex;flex:none;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.search text{flex:none;color:var(--color-primary, #1769d8);font-size:24rpx}
.list{height:0;flex:1;padding-bottom:100rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}
.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head b{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.head>view:first-child text{color:#78879b;font-size:23rpx}
.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;line-height:36rpx;border-radius:999rpx;white-space:nowrap}.s0{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.s1{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.s2{color:#7a52c6;background:#f3edff;border:1rpx solid #d4c0ff}.s3{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}
.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;line-height:36rpx;border-radius:999rpx;white-space:nowrap}.s0{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #edf5ff);border:1rpx solid var(--color-primary-border, #bfdbff)}.s1{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.s2{color:#7a52c6;background:#f3edff;border:1rpx solid #d4c0ff}.s3{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}
.grid{display:grid;gap:9rpx;padding:14rpx 0;margin-top:14rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions button::after,.fab::after{border:0}.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}
.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));z-index:10;display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions button::after,.fab::after{border:0}.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}
.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));z-index:10;display:flex;align-items:center;justify-content:center;width: 104rpx; height: 104rpx; min-height: 104rpx;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/pro/feedback/form.vue
@@ -313,5 +313,5 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.batch-card{margin-top:22rpx}.section-title{padding:24rpx;color:#172b45;font-size:31rpx;font-weight:600;border-bottom:1rpx solid #eef1f5}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:210rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.required{color:#e23b3b}.code-field button{flex:none;min-width:92rpx;padding:0 12rpx;margin:0;color:#1769d8;font-size:23rpx;line-height:56rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.code-field button::after,.save::after,.confirm::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:150rpx;font-size:27rpx;box-sizing:border-box}.save,.confirm{margin-top:30rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.confirm{background:#16a36a}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.batch-card{margin-top:22rpx}.section-title{padding:24rpx;color:#172b45;font-size:31rpx;font-weight:600;border-bottom:1rpx solid #eef1f5}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:210rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.required{color:#e23b3b}.code-field button{flex:none;min-width:92rpx;padding:0 12rpx;margin:0;color:var(--color-primary, #1769d8);font-size:23rpx;line-height:56rpx;background:#fff;border:1rpx solid var(--color-primary, #1769d8);border-radius:8rpx}.code-field button::after,.save::after,.confirm::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:150rpx;font-size:27rpx;box-sizing:border-box}.save,.confirm{margin-top:30rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.confirm{background:#16a36a}
</style>
src/pages/mes/pro/feedback/index.vue
@@ -133,5 +133,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 24rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;flex:none;align-items:center;height:80rpx;margin:20rpx 0 14rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.list{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tag-draft{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.tag-wait{color:#b58100;background:#fff7e6;border:1rpx solid #ffd591}.tag-ok{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-stop{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tag-info{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;color:#1769d8;font-size:22rpx;background:#edf5ff;border:1rpx solid #bfdbff;border-radius:999rpx}.grid{display:grid;gap:9rpx;padding:14rpx 0;margin-top:14rpx;color:#66778c;font-size:22rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));z-index:10;display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
.page{height:100vh;display:flex;flex-direction:column;padding:0 24rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;flex:none;align-items:center;height:80rpx;margin:20rpx 0 14rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.list{height:0;flex:1;padding-bottom: 132rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tag-draft{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #edf5ff);border:1rpx solid var(--color-primary-border, #bfdbff)}.tag-wait{color:#b58100;background:#fff7e6;border:1rpx solid #ffd591}.tag-ok{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-stop{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tag-info{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;color:var(--color-primary, #1769d8);font-size:22rpx;background:var(--color-primary-soft, #edf5ff);border:1rpx solid var(--color-primary-border, #bfdbff);border-radius:999rpx}.grid{display:grid;gap:9rpx;padding:14rpx 0;margin-top:14rpx;color:#66778c;font-size:22rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));z-index:10;display:flex;align-items:center;justify-content:center;width: 104rpx; height: 104rpx; min-height: 104rpx;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/pro/mps/form.vue
@@ -122,5 +122,5 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:210rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.required{color:#e23b3b}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:150rpx;font-size:27rpx;box-sizing:border-box}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.save::after{border:0}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:210rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.required{color:#e23b3b}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:150rpx;font-size:27rpx;box-sizing:border-box}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.save::after{border:0}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}
</style>
src/pages/mes/pro/mps/index.vue
@@ -147,5 +147,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 24rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;flex:none;align-items:center;height:80rpx;margin:20rpx 0 14rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text,.merge{color:#1769d8;font-size:24rpx}.merge{align-self:flex-end;padding:10rpx 18rpx;margin-bottom:14rpx;background:#eef5ff;border:1rpx solid #9bc1f5;border-radius:999rpx}.list{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;gap:14rpx}.select{width:42rpx;flex:none}.title{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.title text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tag-draft{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.tag-ok{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-finish{color:#7a52c6;background:#f3edff;border:1rpx solid #d4c0ff}.tag-stop{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tag-info{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;color:#1769d8;font-size:22rpx;background:#edf5ff;border:1rpx solid #bfdbff;border-radius:999rpx}.grid{display:grid;gap:9rpx;padding:14rpx 0;margin-top:14rpx;color:#66778c;font-size:22rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));z-index:10;display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
.page{height:100vh;display:flex;flex-direction:column;padding:0 24rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;flex:none;align-items:center;height:80rpx;margin:20rpx 0 14rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text,.merge{color:var(--color-primary, #1769d8);font-size:24rpx}.merge{align-self:flex-end;padding:10rpx 18rpx;margin-bottom:14rpx;background:var(--color-primary-soft, #eef5ff);border:1rpx solid #9bc1f5;border-radius:999rpx}.list{height:0;flex:1;padding-bottom: 132rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;gap:14rpx}.select{width:42rpx;flex:none}.title{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.title text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tag-draft{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #edf5ff);border:1rpx solid var(--color-primary-border, #bfdbff)}.tag-ok{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-finish{color:#7a52c6;background:#f3edff;border:1rpx solid #d4c0ff}.tag-stop{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tag-info{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;color:var(--color-primary, #1769d8);font-size:22rpx;background:var(--color-primary-soft, #edf5ff);border:1rpx solid var(--color-primary-border, #bfdbff);border-radius:999rpx}.grid{display:grid;gap:9rpx;padding:14rpx 0;margin-top:14rpx;color:#66778c;font-size:22rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));z-index:10;display:flex;align-items:center;justify-content:center;width: 104rpx; height: 104rpx; min-height: 104rpx;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/pro/task/form.vue
@@ -291,5 +291,5 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card,.tab-card{overflow:hidden;background:#fff;border-radius:16rpx}.tab-card{margin-top:22rpx;padding-bottom:20rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:210rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker.disabled{color:#9aa8b8}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.required{color:#e23b3b}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:150rpx;font-size:27rpx;box-sizing:border-box}.section{display:flex;align-items:center;justify-content:space-between;padding:20rpx 24rpx;border-bottom:1rpx solid #eef1f5}.section>text{color:#172b45;font-size:31rpx;font-weight:600}.section button,.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:23rpx;line-height:48rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.section button::after,.actions button::after,.dialog-actions button::after,.save::after{border:0}.process-tabs{display:flex;gap:12rpx;overflow-x:auto;padding:18rpx 24rpx;border-bottom:1rpx solid #eef1f5}.process-tabs text{flex:none;height:52rpx;padding:0 22rpx;color:#66778c;font-size:24rpx;line-height:52rpx;background:#f3f6fb;border-radius:999rpx}.process-tabs .active{color:#1769d8;font-weight:600;background:#eaf3ff}.sub-row{display:grid;gap:14rpx;padding:22rpx 22rpx;margin:18rpx 10rpx;color:#51657e;font-size:24rpx;background:#fff;border:1rpx solid #e2eaf5;border-radius:16rpx;box-shadow:0 12rpx 28rpx rgba(43,69,107,.08)}.sub-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12rpx}.sub-title{min-width:0;color:#102846;font-size:29rpx;font-weight:700}.status-wrap{display:flex;align-items:center;flex:none;height:40rpx}.task-tag{display:inline-flex;align-items:center;min-width:70rpx;height:34rpx;justify-content:center;padding:0 14rpx;color:#17865a;font-size:22rpx;background:#eafaf2;border:1rpx solid #b8efd5;border-radius:999rpx;white-space:nowrap}.sub-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));column-gap:18rpx;row-gap:10rpx;padding-top:12rpx;border-top:1rpx solid #edf1f6}.sub-grid text{min-width:0;line-height:1.5;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.progress{display:flex;align-items:center;gap:12rpx;color:#66778c;font-size:22rpx}.progress>view{height:12rpx;flex:1;overflow:hidden;background:#eef3f8;border-radius:999rpx}.progress>view>view{height:100%;background:#1769d8;border-radius:999rpx}.actions{display:flex;justify-content:flex-end;gap:10rpx}.actions .danger{color:#c65050;border-color:#e3a0a0}.empty{padding:36rpx;color:#8795a8;font-size:26rpx;text-align:center}.save{margin-top:30rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.mask{position:fixed;inset:0;z-index:50;display:flex;align-items:flex-end;background:rgba(0,0,0,.42)}.dialog{width:100%;max-height:88vh;overflow:auto;background:#fff;border-radius:24rpx 24rpx 0 0}.dialog-title{padding:26rpx 30rpx;color:#172b45;font-size:31rpx;font-weight:600;text-align:center;border-bottom:1rpx solid #eef1f5}.checks{display:flex;flex-wrap:wrap;gap:12rpx;width:100%}.checks text{padding:8rpx 16rpx;color:#66778c;font-size:24rpx;background:#f4f7fb;border:1rpx solid #dce4ee;border-radius:999rpx}.checks .active{color:#1769d8;background:#edf5ff;border-color:#8ab3ee}.checks .hint{width:100%;box-sizing:border-box;color:#8795a8;text-align:center;background:#f7f9fc;border-color:#e6edf5}.dialog-actions{display:flex;gap:18rpx;padding:22rpx 30rpx calc(22rpx + env(safe-area-inset-bottom))}.dialog-actions button{flex:1;margin:0;color:#33455d;background:#f3f6fb;border-radius:12rpx}.dialog-actions .primary{color:#fff;background:#1769d8}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card,.tab-card{overflow:hidden;background:#fff;border-radius:16rpx}.tab-card{margin-top:22rpx;padding-bottom:20rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:210rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker.disabled{color:#9aa8b8}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.required{color:#e23b3b}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:150rpx;font-size:27rpx;box-sizing:border-box}.section{display:flex;align-items:center;justify-content:space-between;padding:20rpx 24rpx;border-bottom:1rpx solid #eef1f5}.section>text{color:#172b45;font-size:31rpx;font-weight:600}.section button,.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:23rpx;line-height:48rpx;background:#fff;border:1rpx solid var(--color-primary, #1769d8);border-radius:8rpx}.section button::after,.actions button::after,.dialog-actions button::after,.save::after{border:0}.process-tabs{display:flex;gap:12rpx;overflow-x:auto;padding:18rpx 24rpx;border-bottom:1rpx solid #eef1f5}.process-tabs text{flex:none;height:52rpx;padding:0 22rpx;color:#66778c;font-size:24rpx;line-height:52rpx;background:#f3f6fb;border-radius:999rpx}.process-tabs .active{color:var(--color-primary, #1769d8);font-weight:600;background:#eaf3ff}.sub-row{display:grid;gap:14rpx;padding:22rpx 22rpx;margin:18rpx 10rpx;color:#51657e;font-size:24rpx;background:#fff;border:1rpx solid #e2eaf5;border-radius:16rpx;box-shadow:0 12rpx 28rpx rgba(43,69,107,.08)}.sub-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12rpx}.sub-title{min-width:0;color:#102846;font-size:29rpx;font-weight:700}.status-wrap{display:flex;align-items:center;flex:none;height:40rpx}.task-tag{display:inline-flex;align-items:center;min-width:70rpx;height:34rpx;justify-content:center;padding:0 14rpx;color:#17865a;font-size:22rpx;background:#eafaf2;border:1rpx solid #b8efd5;border-radius:999rpx;white-space:nowrap}.sub-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));column-gap:18rpx;row-gap:10rpx;padding-top:12rpx;border-top:1rpx solid #edf1f6}.sub-grid text{min-width:0;line-height:1.5;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.progress{display:flex;align-items:center;gap:12rpx;color:#66778c;font-size:22rpx}.progress>view{height:12rpx;flex:1;overflow:hidden;background:#eef3f8;border-radius:999rpx}.progress>view>view{height:100%;background:var(--color-primary, #1769d8);border-radius:999rpx}.actions{display:flex;justify-content:flex-end;gap:10rpx}.actions .danger{color:#c65050;border-color:#e3a0a0}.empty{padding:36rpx;color:#8795a8;font-size:26rpx;text-align:center}.save{margin-top:30rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.mask{position:fixed;inset:0;z-index:50;display:flex;align-items:flex-end;background:rgba(0,0,0,.42)}.dialog{width:100%;max-height:88vh;overflow:auto;background:#fff;border-radius:24rpx 24rpx 0 0}.dialog-title{padding:26rpx 30rpx;color:#172b45;font-size:31rpx;font-weight:600;text-align:center;border-bottom:1rpx solid #eef1f5}.checks{display:flex;flex-wrap:wrap;gap:12rpx;width:100%}.checks text{padding:8rpx 16rpx;color:#66778c;font-size:24rpx;background:#f4f7fb;border:1rpx solid #dce4ee;border-radius:999rpx}.checks .active{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #edf5ff);border-color:var(--color-primary-border, #8ab3ee)}.checks .hint{width:100%;box-sizing:border-box;color:#8795a8;text-align:center;background:#f7f9fc;border-color:#e6edf5}.dialog-actions{display:flex;gap:18rpx;padding:22rpx 30rpx calc(22rpx + env(safe-area-inset-bottom))}.dialog-actions button{flex:1;margin:0;color:#33455d;background:#f3f6fb;border-radius:12rpx}.dialog-actions .primary{color:#fff;background:var(--color-primary, #1769d8)}
</style>
src/pages/mes/pro/task/index.vue
@@ -166,5 +166,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 24rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;flex:none;align-items:center;height:80rpx;margin:20rpx 0 12rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.tabs{display:flex;gap:14rpx;margin-bottom:14rpx}.tabs text{height:54rpx;padding:0 24rpx;color:#66778c;font-size:24rpx;line-height:54rpx;background:#fff;border-radius:999rpx}.tabs .active{color:#1769d8;font-weight:600;background:#eaf3ff}.list{height:0;flex:1;padding-bottom:90rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;color:#17865a;font-size:22rpx;background:#eafaf2;border:1rpx solid #b8efd5;border-radius:999rpx;white-space:nowrap}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;color:#1769d8;font-size:22rpx;background:#edf5ff;border:1rpx solid #bfdbff;border-radius:999rpx}.grid{display:grid;gap:9rpx;padding:14rpx 0;margin-top:14rpx;color:#66778c;font-size:22rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.progress{display:flex;align-items:center;gap:12rpx;margin-top:14rpx;color:#66778c;font-size:22rpx}.progress>view{height:12rpx;flex:1;overflow:hidden;background:#eef3f8;border-radius:999rpx}.progress>view>view{height:100%;background:#1769d8;border-radius:999rpx}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions button::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}
.page{height:100vh;display:flex;flex-direction:column;padding:0 24rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;flex:none;align-items:center;height:80rpx;margin:20rpx 0 12rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.tabs{display:flex;gap:14rpx;margin-bottom:14rpx}.tabs text{height:54rpx;padding:0 24rpx;color:#66778c;font-size:24rpx;line-height:54rpx;background:#fff;border-radius:999rpx}.tabs .active{color:var(--color-primary, #1769d8);font-weight:600;background:#eaf3ff}.list{height:0;flex:1;padding-bottom:90rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;color:#17865a;font-size:22rpx;background:#eafaf2;border:1rpx solid #b8efd5;border-radius:999rpx;white-space:nowrap}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;color:var(--color-primary, #1769d8);font-size:22rpx;background:var(--color-primary-soft, #edf5ff);border:1rpx solid var(--color-primary-border, #bfdbff);border-radius:999rpx}.grid{display:grid;gap:9rpx;padding:14rpx 0;margin-top:14rpx;color:#66778c;font-size:22rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.progress{display:flex;align-items:center;gap:12rpx;margin-top:14rpx;color:#66778c;font-size:22rpx}.progress>view{height:12rpx;flex:1;overflow:hidden;background:#eef3f8;border-radius:999rpx}.progress>view>view{height:100%;background:var(--color-primary, #1769d8);border-radius:999rpx}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions button::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}
</style>
src/pages/mes/pro/workorder/form.vue
@@ -412,5 +412,5 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card,.tab-card{overflow:hidden;background:#fff;border-radius:16rpx}.tab-card{margin-top:22rpx;padding-bottom:20rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:210rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.required{color:#e23b3b}.code-field button,.tab-tools button,.sub-actions button{flex:none;min-width:100rpx;padding:0 14rpx;margin:0;color:#1769d8;font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.code-field button::after,.tab-tools button::after,.sub-actions button::after,.save::after,.confirm::after,.dialog-actions button::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:150rpx;font-size:27rpx;box-sizing:border-box}.tabs{display:flex;padding:18rpx 24rpx;border-bottom:1rpx solid #eef1f5}.tabs text{height:56rpx;padding:0 24rpx;margin-right:16rpx;color:#637287;font-size:25rpx;line-height:56rpx;background:#f3f6fb;border-radius:999rpx}.tabs .active{color:#1769d8;font-weight:600;background:#eaf3ff}.tab-tools{display:flex;justify-content:flex-end;padding:18rpx 24rpx 0}.sub-list{display:grid;gap:18rpx;padding:18rpx 10rpx;background:#f6f8fb}.sub-row{display:grid;gap:14rpx;padding:22rpx 22rpx;color:#51657e;font-size:24rpx;background:#fff;border:1rpx solid #e2eaf5;border-radius:16rpx;box-shadow:0 12rpx 28rpx rgba(43,69,107,.08)}.sub-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12rpx}.sub-title{color:#102846;font-size:29rpx;font-weight:700}.sub-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));column-gap:18rpx;row-gap:10rpx;padding-top:12rpx;border-top:1rpx solid #edf1f6}.sub-grid text{min-width:0;line-height:1.5;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sub-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:8rpx}.sub-actions button{min-width:auto;line-height:46rpx;font-size:22rpx}.sub-actions .danger{color:#c65050;border-color:#e3a0a0}.materials{display:flex;flex-wrap:wrap;gap:10rpx;padding-top:8rpx}.materials>text{padding:5rpx 12rpx;color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff;border-radius:999rpx}.materials>text>text{margin-left:10rpx;color:#c65050}.empty{padding:36rpx;color:#8795a8;font-size:26rpx;text-align:center}.save,.confirm{margin-top:30rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.confirm{background:#16a36a}.mask{position:fixed;inset:0;z-index:50;display:flex;align-items:flex-end;background:rgba(0,0,0,.42)}.dialog{width:100%;max-height:88vh;overflow:auto;background:#fff;border-radius:24rpx 24rpx 0 0}.dialog-title{padding:26rpx 30rpx;color:#172b45;font-size:31rpx;font-weight:600;text-align:center;border-bottom:1rpx solid #eef1f5}.dialog-actions{display:flex;gap:18rpx;padding:22rpx 30rpx calc(22rpx + env(safe-area-inset-bottom))}.dialog-actions button{flex:1;margin:0;color:#33455d;background:#f3f6fb;border-radius:12rpx}.dialog-actions .primary{color:#fff;background:#1769d8}.search{display:flex;align-items:center;height:76rpx;margin:20rpx 24rpx;padding:0 20rpx;background:#f6f8fb;border-radius:14rpx}.search input{flex:1;font-size:26rpx}.material-list{max-height:55vh;padding:0 24rpx 20rpx;box-sizing:border-box}.material-item{display:flex;flex-direction:column;gap:8rpx;padding:18rpx 0;border-bottom:1rpx solid #eef1f5}.material-item text:first-child{color:#20334c;font-size:27rpx;font-weight:600}.material-item text:last-child{color:#66778c;font-size:23rpx}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card,.tab-card{overflow:hidden;background:#fff;border-radius:16rpx}.tab-card{margin-top:22rpx;padding-bottom:20rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:210rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.required{color:#e23b3b}.code-field button,.tab-tools button,.sub-actions button{flex:none;min-width:100rpx;padding:0 14rpx;margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid var(--color-primary, #1769d8);border-radius:8rpx}.code-field button::after,.tab-tools button::after,.sub-actions button::after,.save::after,.confirm::after,.dialog-actions button::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:150rpx;font-size:27rpx;box-sizing:border-box}.tabs{display:flex;padding:18rpx 24rpx;border-bottom:1rpx solid #eef1f5}.tabs text{height:56rpx;padding:0 24rpx;margin-right:16rpx;color:#637287;font-size:25rpx;line-height:56rpx;background:#f3f6fb;border-radius:999rpx}.tabs .active{color:var(--color-primary, #1769d8);font-weight:600;background:#eaf3ff}.tab-tools{display:flex;justify-content:flex-end;padding:18rpx 24rpx 0}.sub-list{display:grid;gap:18rpx;padding:18rpx 10rpx;background:#f6f8fb}.sub-row{display:grid;gap:14rpx;padding:22rpx 22rpx;color:#51657e;font-size:24rpx;background:#fff;border:1rpx solid #e2eaf5;border-radius:16rpx;box-shadow:0 12rpx 28rpx rgba(43,69,107,.08)}.sub-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12rpx}.sub-title{color:#102846;font-size:29rpx;font-weight:700}.sub-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));column-gap:18rpx;row-gap:10rpx;padding-top:12rpx;border-top:1rpx solid #edf1f6}.sub-grid text{min-width:0;line-height:1.5;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sub-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:8rpx}.sub-actions button{min-width:auto;line-height:46rpx;font-size:22rpx}.sub-actions .danger{color:#c65050;border-color:#e3a0a0}.materials{display:flex;flex-wrap:wrap;gap:10rpx;padding-top:8rpx}.materials>text{padding:5rpx 12rpx;color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #edf5ff);border:1rpx solid var(--color-primary-border, #bfdbff);border-radius:999rpx}.materials>text>text{margin-left:10rpx;color:#c65050}.empty{padding:36rpx;color:#8795a8;font-size:26rpx;text-align:center}.save,.confirm{margin-top:30rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.confirm{background:#16a36a}.mask{position:fixed;inset:0;z-index:50;display:flex;align-items:flex-end;background:rgba(0,0,0,.42)}.dialog{width:100%;max-height:88vh;overflow:auto;background:#fff;border-radius:24rpx 24rpx 0 0}.dialog-title{padding:26rpx 30rpx;color:#172b45;font-size:31rpx;font-weight:600;text-align:center;border-bottom:1rpx solid #eef1f5}.dialog-actions{display:flex;gap:18rpx;padding:22rpx 30rpx calc(22rpx + env(safe-area-inset-bottom))}.dialog-actions button{flex:1;margin:0;color:#33455d;background:#f3f6fb;border-radius:12rpx}.dialog-actions .primary{color:#fff;background:var(--color-primary, #1769d8)}.search{display:flex;align-items:center;height:76rpx;margin:20rpx 24rpx;padding:0 20rpx;background:#f6f8fb;border-radius:14rpx}.search input{flex:1;font-size:26rpx}.material-list{max-height:55vh;padding:0 24rpx 20rpx;box-sizing:border-box}.material-item{display:flex;flex-direction:column;gap:8rpx;padding:18rpx 0;border-bottom:1rpx solid #eef1f5}.material-item text:first-child{color:#20334c;font-size:27rpx;font-weight:600}.material-item text:last-child{color:#66778c;font-size:23rpx}
</style>
src/pages/mes/pro/workorder/index.vue
@@ -144,5 +144,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 24rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;flex:none;align-items:center;height:80rpx;margin:20rpx 0 14rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.list{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.title{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.title text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tag-draft{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.tag-ok{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-finish{color:#7a52c6;background:#f3edff;border:1rpx solid #d4c0ff}.tag-stop{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tag-info{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;color:#1769d8;font-size:22rpx;background:#edf5ff;border:1rpx solid #bfdbff;border-radius:999rpx}.grid{display:grid;gap:9rpx;padding:14rpx 0;margin-top:14rpx;color:#66778c;font-size:22rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.progress{display:flex;align-items:center;gap:12rpx;margin-top:14rpx;color:#66778c;font-size:22rpx}.progress>view{height:12rpx;flex:1;overflow:hidden;background:#eef3f8;border-radius:999rpx}.progress>view>view{height:100%;background:#1769d8;border-radius:999rpx}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));z-index:10;display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
.page{height:100vh;display:flex;flex-direction:column;padding:0 24rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;flex:none;align-items:center;height:80rpx;margin:20rpx 0 14rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.list{height:0;flex:1;padding-bottom: 132rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.title{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.title text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tag-draft{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #edf5ff);border:1rpx solid var(--color-primary-border, #bfdbff)}.tag-ok{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-finish{color:#7a52c6;background:#f3edff;border:1rpx solid #d4c0ff}.tag-stop{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tag-info{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;color:var(--color-primary, #1769d8);font-size:22rpx;background:var(--color-primary-soft, #edf5ff);border:1rpx solid var(--color-primary-border, #bfdbff);border-radius:999rpx}.grid{display:grid;gap:9rpx;padding:14rpx 0;margin-top:14rpx;color:#66778c;font-size:22rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.progress{display:flex;align-items:center;gap:12rpx;margin-top:14rpx;color:#66778c;font-size:22rpx}.progress>view{height:12rpx;flex:1;overflow:hidden;background:#eef3f8;border-radius:999rpx}.progress>view>view{height:100%;background:var(--color-primary, #1769d8);border-radius:999rpx}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));z-index:10;display:flex;align-items:center;justify-content:center;width: 104rpx; height: 104rpx; min-height: 104rpx;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/pro/workrecord/index.vue
@@ -128,5 +128,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 24rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.status-card{display:flex;align-items:center;justify-content:space-between;gap:20rpx;padding:24rpx 22rpx;margin:20rpx 0 14rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.status-card>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:6rpx;color:#66778c;font-size:23rpx}.status-card .status-title{color:#20334c;font-size:30rpx;font-weight:600}.status-card button{min-width:112rpx;margin:0;color:#fff;font-size:26rpx;background:#1769d8;border-radius:10rpx}.status-card .danger{background:#c65050}.status-card button::after{border:0}.search{display:flex;flex:none;align-items:center;height:80rpx;margin:0 0 14rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.list{height:0;flex:1;padding-bottom:90rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tag-ok{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-stop{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.grid{display:grid;gap:9rpx;padding:14rpx 0 0;margin-top:14rpx;color:#66778c;font-size:22rpx;border-top:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}
.page{height:100vh;display:flex;flex-direction:column;padding:0 24rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.status-card{display:flex;align-items:center;justify-content:space-between;gap:20rpx;padding:24rpx 22rpx;margin:20rpx 0 14rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.status-card>view{display:flex;min-width:0;flex:1;flex-direction:column;gap:6rpx;color:#66778c;font-size:23rpx}.status-card .status-title{color:#20334c;font-size:30rpx;font-weight:600}.status-card button{min-width:112rpx;margin:0;color:#fff;font-size:26rpx;background:var(--color-primary, #1769d8);border-radius:10rpx}.status-card .danger{background:#c65050}.status-card button::after{border:0}.search{display:flex;flex:none;align-items:center;height:80rpx;margin:0 0 14rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.list{height:0;flex:1;padding-bottom:90rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tag-ok{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-stop{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.grid{display:grid;gap:9rpx;padding:14rpx 0 0;margin-top:14rpx;color:#66778c;font-size:22rpx;border-top:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}
</style>
src/pages/mes/process-design/components/PickerSheet.vue
@@ -146,10 +146,10 @@
  .sheet{display:flex;flex-direction:column;width:100%;max-height:80vh;background:#fff;border-radius:24rpx 24rpx 0 0}
  .sheet-head{display:flex;align-items:center;justify-content:space-between;height:96rpx;padding:0 28rpx;border-bottom:1rpx solid #edf1f6}
  .sheet-head text:first-child{color:#10233f;font-size:30rpx;font-weight:600}
  .sheet-close{color:#1769d8;font-size:25rpx}
  .sheet-close{color:var(--color-primary, #1769d8);font-size:25rpx}
  .sheet-search{display:flex;align-items:center;height:76rpx;gap:16rpx;margin:18rpx 28rpx 6rpx;padding:0 20rpx;background:#f4f7fb;border-radius:14rpx}
  .sheet-search input{min-width:0;flex:1;font-size:26rpx}
  .sheet-search text{flex:none;color:#1769d8;font-size:24rpx}
  .sheet-search text{flex:none;color:var(--color-primary, #1769d8);font-size:24rpx}
  .sheet-body{height:620rpx;flex:none;padding:8rpx 28rpx 0;box-sizing:border-box}
  .sheet-row{display:flex;align-items:center;gap:16rpx;padding:22rpx 0;border-bottom:1rpx solid #f2f5f9}
  .sheet-row-main{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}
@@ -157,7 +157,7 @@
  .sheet-row-sub{overflow:hidden;color:#8494a8;font-size:22rpx;text-overflow:ellipsis;white-space:nowrap}
  .sheet-row-extra{flex:none;color:#617287;font-size:23rpx}
  .sheet-check{display:flex;width:40rpx;height:40rpx;flex:none;align-items:center;justify-content:center;color:#fff;font-size:24rpx;background:#fff;border:2rpx solid #cfd9e6;border-radius:50%}
  .sheet-check.on{background:#1769d8;border-color:#1769d8}
  .sheet-check.on{background:var(--color-primary, #1769d8);border-color:var(--color-primary, #1769d8)}
  .sheet-state{padding:60rpx 0;color:#8795a8;font-size:25rpx;text-align:center}
  .sheet-state.more{padding:26rpx 0 34rpx;font-size:24rpx}
  .sheet-foot{display:flex;align-items:center;justify-content:space-between;padding:18rpx 28rpx 34rpx;border-top:1rpx solid #edf1f6}
@@ -165,6 +165,6 @@
  .sheet-foot>view{display:flex;gap:16rpx}
  .sheet-foot button{height:72rpx;min-height:72rpx;padding:0 34rpx;margin:0;font-size:26rpx;line-height:70rpx;border-radius:36rpx}
  .sheet-foot button::after{border:0}
  .ghost{color:#1769d8;background:#f2f6fc;border:1rpx solid #cfe0f7}
  .primary{color:#fff;background:#1769d8}
  .ghost{color:var(--color-primary, #1769d8);background:#f2f6fc;border:1rpx solid #cfe0f7}
  .primary{color:#fff;background:var(--color-primary, #1769d8)}
</style>
src/pages/mes/process-design/parameter/form.vue
@@ -113,5 +113,5 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input{flex:1}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.value.muted{color:#8494a8}.required{color:#e23b3b}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.save::after{border:0}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input{flex:1}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.value.muted{color:#8494a8}.required{color:#e23b3b}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.save::after{border:0}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}
</style>
src/pages/mes/process-design/parameter/index.vue
@@ -164,5 +164,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-required{color:#c2570d;background:#fff4e7;border:1rpx solid #f5cfa4}.tag-optional{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions button::after{border:0}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.more{display:block;padding:16rpx 0 6rpx;color:#93a1b3;font-size:22rpx;text-align:center}.state{padding:60rpx 20rpx;color:#8795a8;font-size:25rpx;text-align:center}.state.error{color:#c65050}.fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}.fab::after{border:0}.fab view{position:relative;width:38rpx;height:38rpx}.fab view::before,.fab view::after{position:absolute;content:"";background:#fff;border-radius:3rpx}.fab view::before{top:17rpx;left:0;width:38rpx;height:4rpx}.fab view::after{top:0;left:17rpx;width:4rpx;height:38rpx}.mask{position:fixed;top:0;right:0;bottom:0;left:0;z-index:900;display:flex;align-items:flex-end;background:rgba(16,35,63,.45)}.sheet{width:100%;max-height:76vh;background:#fff;border-radius:24rpx 24rpx 0 0}.sheet-head{display:flex;align-items:center;justify-content:space-between;height:96rpx;padding:0 28rpx;border-bottom:1rpx solid #edf1f6}.sheet-head text:first-child{color:#10233f;font-size:30rpx;font-weight:600}.sheet-head text:last-child{color:#1769d8;font-size:25rpx}.sheet-body{height:600rpx;padding:0 28rpx;box-sizing:border-box}.link-row{display:flex;flex-direction:column;gap:10rpx;padding:22rpx 0;border-bottom:1rpx solid #f2f5f9}.link-row>view{display:flex;align-items:baseline;gap:14rpx}.link-name{color:#1e3049;font-size:27rpx;font-weight:600}.link-code{color:#8494a8;font-size:23rpx}.link-attention{color:#66778c;font-size:23rpx}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:0;flex:1;padding-bottom: 132rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-required{color:#c2570d;background:#fff4e7;border:1rpx solid #f5cfa4}.tag-optional{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions button::after{border:0}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.more{display:block;padding:16rpx 0 6rpx;color:#93a1b3;font-size:22rpx;text-align:center}.state{padding:60rpx 20rpx;color:#8795a8;font-size:25rpx;text-align:center}.state.error{color:#c65050}.fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}.fab::after{border:0}.fab view{position:relative;width:38rpx;height:38rpx}.fab view::before,.fab view::after{position:absolute;content:"";background:#fff;border-radius:3rpx}.fab view::before{top:17rpx;left:0;width:38rpx;height:4rpx}.fab view::after{top:0;left:17rpx;width:4rpx;height:38rpx}.mask{position:fixed;top:0;right:0;bottom:0;left:0;z-index:900;display:flex;align-items:flex-end;background:rgba(16,35,63,.45)}.sheet{width:100%;max-height:76vh;background:#fff;border-radius:24rpx 24rpx 0 0}.sheet-head{display:flex;align-items:center;justify-content:space-between;height:96rpx;padding:0 28rpx;border-bottom:1rpx solid #edf1f6}.sheet-head text:first-child{color:#10233f;font-size:30rpx;font-weight:600}.sheet-head text:last-child{color:var(--color-primary, #1769d8);font-size:25rpx}.sheet-body{height:600rpx;padding:0 28rpx;box-sizing:border-box}.link-row{display:flex;flex-direction:column;gap:10rpx;padding:22rpx 0;border-bottom:1rpx solid #f2f5f9}.link-row>view{display:flex;align-items:baseline;gap:14rpx}.link-name{color:#1e3049;font-size:27rpx;font-weight:600}.link-code{color:#8494a8;font-size:23rpx}.link-attention{color:#66778c;font-size:23rpx}
</style>
src/pages/mes/process-design/process/form.vue
@@ -246,5 +246,5 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card{margin-bottom:18rpx;overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.required{color:#e23b3b}.code-field input{min-width:0}.code-field button{flex:none;min-width:136rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.code-field button::after,.save::after,.step-actions button::after,.modal-actions button::after,.section button::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.section{display:flex;align-items:center;justify-content:space-between;height:88rpx;padding:0 24rpx;color:#10233f;font-size:29rpx;font-weight:600}.section button{height:56rpx;min-height:56rpx;padding:0 20rpx;margin:0;color:#1769d8;font-size:24rpx;line-height:54rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.step{margin:0 20rpx 18rpx;border:1rpx solid #edf1f6;border-radius:12rpx;overflow:hidden}.step-head{padding:18rpx 20rpx;background:#f9fbff}.step-head>view{display:flex;min-width:0;flex-direction:column;gap:8rpx}.step-sort{color:#1769d8;font-size:22rpx;font-weight:600}.step-content{overflow:hidden;color:#10233f;font-size:27rpx;text-overflow:ellipsis;white-space:nowrap}.grid{display:grid;gap:10rpx;padding:16rpx 20rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.step-actions{display:flex;justify-content:flex-end;gap:12rpx;padding:12rpx 20rpx;border-top:1rpx solid #f2f5f9}.step-actions button{height:50rpx;min-height:50rpx;padding:0 18rpx;margin:0;color:#1769d8;font-size:23rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.danger{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.save{margin-top:20rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:44rpx 0}.mask{position:fixed;top:0;right:0;bottom:0;left:0;z-index:900;display:flex;align-items:center;justify-content:center;padding:0 40rpx;background:rgba(16,35,63,.45)}.modal{width:100%;max-height:84vh;padding-bottom:20rpx;overflow-y:auto;background:#fff;border-radius:20rpx}.modal-title{padding:28rpx 28rpx 12rpx;color:#10233f;font-size:30rpx;font-weight:600}.modal-actions{display:flex;justify-content:flex-end;gap:16rpx;padding:20rpx 24rpx 0}.modal-actions button{height:72rpx;min-height:72rpx;padding:0 34rpx;margin:0;font-size:26rpx;line-height:70rpx;border-radius:36rpx}.ghost{color:#1769d8;background:#f2f6fc;border:1rpx solid #cfe0f7}.primary{color:#fff;background:#1769d8}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card{margin-bottom:18rpx;overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.required{color:#e23b3b}.code-field input{min-width:0}.code-field button{flex:none;min-width:136rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid var(--color-primary, #1769d8);border-radius:8rpx}.code-field button::after,.save::after,.step-actions button::after,.modal-actions button::after,.section button::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.section{display:flex;align-items:center;justify-content:space-between;height:88rpx;padding:0 24rpx;color:#10233f;font-size:29rpx;font-weight:600}.section button{height:56rpx;min-height:56rpx;padding:0 20rpx;margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:54rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.step{margin:0 20rpx 18rpx;border:1rpx solid #edf1f6;border-radius:12rpx;overflow:hidden}.step-head{padding:18rpx 20rpx;background:#f9fbff}.step-head>view{display:flex;min-width:0;flex-direction:column;gap:8rpx}.step-sort{color:var(--color-primary, #1769d8);font-size:22rpx;font-weight:600}.step-content{overflow:hidden;color:#10233f;font-size:27rpx;text-overflow:ellipsis;white-space:nowrap}.grid{display:grid;gap:10rpx;padding:16rpx 20rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.step-actions{display:flex;justify-content:flex-end;gap:12rpx;padding:12rpx 20rpx;border-top:1rpx solid #f2f5f9}.step-actions button{height:50rpx;min-height:50rpx;padding:0 18rpx;margin:0;color:var(--color-primary, #1769d8);font-size:23rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.danger{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.save{margin-top:20rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:44rpx 0}.mask{position:fixed;top:0;right:0;bottom:0;left:0;z-index:900;display:flex;align-items:center;justify-content:center;padding:0 40rpx;background:rgba(16,35,63,.45)}.modal{width:100%;max-height:84vh;padding-bottom:20rpx;overflow-y:auto;background:#fff;border-radius:20rpx}.modal-title{padding:28rpx 28rpx 12rpx;color:#10233f;font-size:30rpx;font-weight:600}.modal-actions{display:flex;justify-content:flex-end;gap:16rpx;padding:20rpx 24rpx 0}.modal-actions button{height:72rpx;min-height:72rpx;padding:0 34rpx;margin:0;font-size:26rpx;line-height:70rpx;border-radius:36rpx}.ghost{color:var(--color-primary, #1769d8);background:#f2f6fc;border:1rpx solid #cfe0f7}.primary{color:#fff;background:var(--color-primary, #1769d8)}
</style>
src/pages/mes/process-design/process/index.vue
@@ -134,5 +134,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-enabled{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-disabled{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions button::after{border:0}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.more{display:block;padding:16rpx 0 6rpx;color:#93a1b3;font-size:22rpx;text-align:center}.state{padding:60rpx 20rpx;color:#8795a8;font-size:25rpx;text-align:center}.state.error{color:#c65050}.fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}.fab::after{border:0}.fab view{position:relative;width:38rpx;height:38rpx}.fab view::before,.fab view::after{position:absolute;content:"";background:#fff;border-radius:3rpx}.fab view::before{top:17rpx;left:0;width:38rpx;height:4rpx}.fab view::after{top:0;left:17rpx;width:4rpx;height:38rpx}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:0;flex:1;padding-bottom: 132rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-enabled{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-disabled{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions button::after{border:0}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.more{display:block;padding:16rpx 0 6rpx;color:#93a1b3;font-size:22rpx;text-align:center}.state{padding:60rpx 20rpx;color:#8795a8;font-size:25rpx;text-align:center}.state.error{color:#c65050}.fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}.fab::after{border:0}.fab view{position:relative;width:38rpx;height:38rpx}.fab view::before,.fab view::after{position:absolute;content:"";background:#fff;border-radius:3rpx}.fab view::before{top:17rpx;left:0;width:38rpx;height:4rpx}.fab view::after{top:0;left:17rpx;width:4rpx;height:38rpx}
</style>
src/pages/mes/process-design/process/param.vue
@@ -196,5 +196,5 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.hero{display:flex;flex-direction:column;gap:8rpx;margin-bottom:18rpx;padding:26rpx 24rpx;color:#fff;background:#1769d8;border-radius:16rpx;box-shadow:0 14rpx 26rpx rgba(23,105,216,.2)}.hero text:first-child{font-size:31rpx;font-weight:700}.hero text:last-child{color:#d7e8ff;font-size:23rpx}.card{overflow:hidden;background:#fff;border-radius:16rpx}.section{display:flex;align-items:center;justify-content:space-between;height:92rpx;padding:0 24rpx;color:#10233f;font-size:29rpx;font-weight:600;border-bottom:1rpx solid #eef1f5}.section button{height:56rpx;min-height:56rpx;padding:0 20rpx;margin:0;color:#1769d8;font-size:24rpx;line-height:54rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.section button::after,.bind-actions button::after,.save::after{border:0}.bind{margin:18rpx 20rpx;border:1rpx solid #edf1f6;border-radius:12rpx;overflow:hidden}.bind-head{display:flex;align-items:center;justify-content:space-between;gap:14rpx;padding:18rpx 20rpx;background:#f9fbff}.bind-head>view{display:flex;min-width:0;flex-direction:column;gap:8rpx}.bind-name{overflow:hidden;color:#10233f;font-size:27rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.bind-code{color:#8494a8;font-size:22rpx}.bind-type{flex:none;padding:6rpx 14rpx;color:#1769d8;font-size:22rpx;background:#edf5ff;border:1rpx solid #bfdbff;border-radius:999rpx}.bind-row{display:flex;align-items:center;gap:16rpx;min-height:78rpx;padding:0 20rpx;border-top:1rpx solid #f2f5f9}.bind-row>text:first-child{width:150rpx;flex:none;color:#617287;font-size:25rpx}.bind-row input{min-width:0;flex:1;color:#1e3049;font-size:26rpx;text-align:right}.bind-value{min-width:0;flex:1;color:#1e3049;font-size:26rpx;text-align:right}.bind-actions{display:flex;justify-content:flex-end;padding:12rpx 20rpx;border-top:1rpx solid #f2f5f9}.bind-actions button{height:50rpx;min-height:50rpx;padding:0 18rpx;margin:0;font-size:23rpx;line-height:48rpx;border-radius:8rpx}.danger{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.save{margin-top:28rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:44rpx 0}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.hero{display:flex;flex-direction:column;gap:8rpx;margin-bottom:18rpx;padding:26rpx 24rpx;color:#fff;background:var(--color-primary, #1769d8);border-radius:16rpx;box-shadow:0 14rpx 26rpx rgba(23,105,216,.2)}.hero text:first-child{font-size:31rpx;font-weight:700}.hero text:last-child{color:#d7e8ff;font-size:23rpx}.card{overflow:hidden;background:#fff;border-radius:16rpx}.section{display:flex;align-items:center;justify-content:space-between;height:92rpx;padding:0 24rpx;color:#10233f;font-size:29rpx;font-weight:600;border-bottom:1rpx solid #eef1f5}.section button{height:56rpx;min-height:56rpx;padding:0 20rpx;margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:54rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.section button::after,.bind-actions button::after,.save::after{border:0}.bind{margin:18rpx 20rpx;border:1rpx solid #edf1f6;border-radius:12rpx;overflow:hidden}.bind-head{display:flex;align-items:center;justify-content:space-between;gap:14rpx;padding:18rpx 20rpx;background:#f9fbff}.bind-head>view{display:flex;min-width:0;flex-direction:column;gap:8rpx}.bind-name{overflow:hidden;color:#10233f;font-size:27rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.bind-code{color:#8494a8;font-size:22rpx}.bind-type{flex:none;padding:6rpx 14rpx;color:var(--color-primary, #1769d8);font-size:22rpx;background:var(--color-primary-soft, #edf5ff);border:1rpx solid var(--color-primary-border, #bfdbff);border-radius:999rpx}.bind-row{display:flex;align-items:center;gap:16rpx;min-height:78rpx;padding:0 20rpx;border-top:1rpx solid #f2f5f9}.bind-row>text:first-child{width:150rpx;flex:none;color:#617287;font-size:25rpx}.bind-row input{min-width:0;flex:1;color:#1e3049;font-size:26rpx;text-align:right}.bind-value{min-width:0;flex:1;color:#1e3049;font-size:26rpx;text-align:right}.bind-actions{display:flex;justify-content:flex-end;padding:12rpx 20rpx;border-top:1rpx solid #f2f5f9}.bind-actions button{height:50rpx;min-height:50rpx;padding:0 18rpx;margin:0;font-size:23rpx;line-height:48rpx;border-radius:8rpx}.danger{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.save{margin-top:28rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:44rpx 0}
</style>
src/pages/mes/process-design/route/form.vue
@@ -897,5 +897,5 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card{margin-bottom:18rpx;overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:210rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.required{color:#e23b3b}.code-field button{flex:none;min-width:136rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.code-field button::after,.save::after,.button-row button::after,.section button::after,.bom-actions button::after,.modal-actions button::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.section{display:flex;align-items:center;justify-content:space-between;height:88rpx;padding:0 24rpx;color:#10233f;font-size:29rpx;font-weight:600;border-bottom:1rpx solid #f2f5f9}.section button{height:56rpx;min-height:56rpx;padding:0 20rpx;margin:0;color:#1769d8;font-size:24rpx;line-height:54rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.section-hint{color:#8494a8;font-size:23rpx;font-weight:400}.button-row{display:flex;flex-wrap:wrap;gap:14rpx;padding:18rpx 24rpx;border-bottom:1rpx solid #eef1f5}.button-row button{flex:1;min-width:190rpx;height:64rpx;min-height:64rpx;padding:0 12rpx;margin:0;color:#1769d8;font-size:24rpx;line-height:62rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:10rpx}.button-row button[disabled]{color:#aab6c6;background:#fafbfd;border-color:#e2e8f0}.button-row .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.process-list{padding:8rpx 0}.process-item{display:flex;align-items:center;gap:14rpx;padding:22rpx 24rpx;border-bottom:1rpx solid #f2f5f9}.process-item:last-child{border-bottom:0}.process-item.active{background:#eef5ff}.process-sort{width:38rpx;flex:none;color:#8494a8;font-size:23rpx;text-align:center}.process-dot{width:20rpx;height:20rpx;flex:none;background:#d5dde8;border-radius:50%}.process-name{min-width:0;flex:1;overflow:hidden;color:#1e3049;font-size:27rpx;text-overflow:ellipsis;white-space:nowrap}.process-item.active .process-name{color:#1769d8;font-weight:600}.flag{font-size:22rpx}.flag.key{color:#df8919}.flag.check{color:#17865a}.flag.back{color:#268ca7}.process-remove{flex:none;padding:4rpx 12rpx;color:#c65050;font-size:22rpx}.process-head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx;padding:20rpx 24rpx 0}.process-head>view:first-child{display:flex;min-width:0;flex-direction:column;gap:8rpx}.process-title{color:#10233f;font-size:29rpx;font-weight:600}.process-code{color:#8494a8;font-size:23rpx}.flags{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:10rpx}.grid{display:grid;gap:10rpx;padding:16rpx 24rpx;color:#66778c;font-size:23rpx}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bom{margin:16rpx 20rpx;border:1rpx solid #edf1f6;border-radius:12rpx;overflow:hidden}.bom-head{display:flex;align-items:center;justify-content:space-between;gap:14rpx;padding:16rpx 20rpx;background:#f9fbff}.bom-head>view{display:flex;min-width:0;flex-direction:column;gap:6rpx}.bom-name{overflow:hidden;color:#10233f;font-size:26rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.bom-code{color:#8494a8;font-size:22rpx}.bom-unit{flex:none;color:#617287;font-size:23rpx}.bom-row{display:flex;align-items:center;gap:16rpx;min-height:76rpx;padding:0 20rpx;border-top:1rpx solid #f2f5f9}.bom-row>text:first-child{width:110rpx;flex:none;color:#617287;font-size:25rpx}.bom-row input{min-width:0;flex:1;color:#1e3049;font-size:26rpx;text-align:right}.bom-actions{display:flex;justify-content:flex-end;padding:12rpx 20rpx;border-top:1rpx solid #f2f5f9}.bom-actions button{height:50rpx;min-height:50rpx;padding:0 18rpx;margin:0;font-size:23rpx;line-height:48rpx;border-radius:8rpx}.danger{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.save{margin-top:20rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.state{padding:38rpx 24rpx;color:#8795a8;font-size:25rpx;text-align:center}.compact{padding:30rpx 24rpx}.hint{color:#df8919;text-align:left}.mask{position:fixed;top:0;right:0;bottom:0;left:0;z-index:900;display:flex;align-items:center;justify-content:center;padding:0 32rpx;background:rgba(16,35,63,.45)}.modal{width:100%;max-height:86vh;padding-bottom:20rpx;overflow-y:auto;background:#fff;border-radius:20rpx}.modal-title{padding:28rpx 28rpx 12rpx;color:#10233f;font-size:30rpx;font-weight:600}.modal-actions{display:flex;justify-content:flex-end;gap:16rpx;padding:20rpx 24rpx 0}.modal-actions button{height:72rpx;min-height:72rpx;padding:0 34rpx;margin:0;font-size:26rpx;line-height:70rpx;border-radius:36rpx}.ghost{color:#1769d8;background:#f2f6fc;border:1rpx solid #cfe0f7}.primary{color:#fff;background:#1769d8}.color-row{display:flex;flex-wrap:wrap;align-items:center;gap:18rpx;width:100%}.color-dot{width:52rpx;height:52rpx;border:3rpx solid #fff;border-radius:10rpx;box-shadow:0 0 0 1rpx #dce4ee}.color-dot.on{box-shadow:0 0 0 3rpx #1769d8}.color-text{color:#8494a8;font-size:23rpx}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card{margin-bottom:18rpx;overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:210rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.required{color:#e23b3b}.code-field button{flex:none;min-width:136rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid var(--color-primary, #1769d8);border-radius:8rpx}.code-field button::after,.save::after,.button-row button::after,.section button::after,.bom-actions button::after,.modal-actions button::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.section{display:flex;align-items:center;justify-content:space-between;height:88rpx;padding:0 24rpx;color:#10233f;font-size:29rpx;font-weight:600;border-bottom:1rpx solid #f2f5f9}.section button{height:56rpx;min-height:56rpx;padding:0 20rpx;margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:54rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.section-hint{color:#8494a8;font-size:23rpx;font-weight:400}.button-row{display:flex;flex-wrap:wrap;gap:14rpx;padding:18rpx 24rpx;border-bottom:1rpx solid #eef1f5}.button-row button{flex:1;min-width:190rpx;height:64rpx;min-height:64rpx;padding:0 12rpx;margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:62rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:10rpx}.button-row button[disabled]{color:#aab6c6;background:#fafbfd;border-color:#e2e8f0}.button-row .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.process-list{padding:8rpx 0}.process-item{display:flex;align-items:center;gap:14rpx;padding:22rpx 24rpx;border-bottom:1rpx solid #f2f5f9}.process-item:last-child{border-bottom:0}.process-item.active{background:var(--color-primary-soft, #eef5ff)}.process-sort{width:38rpx;flex:none;color:#8494a8;font-size:23rpx;text-align:center}.process-dot{width:20rpx;height:20rpx;flex:none;background:#d5dde8;border-radius:50%}.process-name{min-width:0;flex:1;overflow:hidden;color:#1e3049;font-size:27rpx;text-overflow:ellipsis;white-space:nowrap}.process-item.active .process-name{color:var(--color-primary, #1769d8);font-weight:600}.flag{font-size:22rpx}.flag.key{color:#df8919}.flag.check{color:#17865a}.flag.back{color:#268ca7}.process-remove{flex:none;padding:4rpx 12rpx;color:#c65050;font-size:22rpx}.process-head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx;padding:20rpx 24rpx 0}.process-head>view:first-child{display:flex;min-width:0;flex-direction:column;gap:8rpx}.process-title{color:#10233f;font-size:29rpx;font-weight:600}.process-code{color:#8494a8;font-size:23rpx}.flags{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:10rpx}.grid{display:grid;gap:10rpx;padding:16rpx 24rpx;color:#66778c;font-size:23rpx}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bom{margin:16rpx 20rpx;border:1rpx solid #edf1f6;border-radius:12rpx;overflow:hidden}.bom-head{display:flex;align-items:center;justify-content:space-between;gap:14rpx;padding:16rpx 20rpx;background:#f9fbff}.bom-head>view{display:flex;min-width:0;flex-direction:column;gap:6rpx}.bom-name{overflow:hidden;color:#10233f;font-size:26rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.bom-code{color:#8494a8;font-size:22rpx}.bom-unit{flex:none;color:#617287;font-size:23rpx}.bom-row{display:flex;align-items:center;gap:16rpx;min-height:76rpx;padding:0 20rpx;border-top:1rpx solid #f2f5f9}.bom-row>text:first-child{width:110rpx;flex:none;color:#617287;font-size:25rpx}.bom-row input{min-width:0;flex:1;color:#1e3049;font-size:26rpx;text-align:right}.bom-actions{display:flex;justify-content:flex-end;padding:12rpx 20rpx;border-top:1rpx solid #f2f5f9}.bom-actions button{height:50rpx;min-height:50rpx;padding:0 18rpx;margin:0;font-size:23rpx;line-height:48rpx;border-radius:8rpx}.danger{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.save{margin-top:20rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.state{padding:38rpx 24rpx;color:#8795a8;font-size:25rpx;text-align:center}.compact{padding:30rpx 24rpx}.hint{color:#df8919;text-align:left}.mask{position:fixed;top:0;right:0;bottom:0;left:0;z-index:900;display:flex;align-items:center;justify-content:center;padding:0 32rpx;background:rgba(16,35,63,.45)}.modal{width:100%;max-height:86vh;padding-bottom:20rpx;overflow-y:auto;background:#fff;border-radius:20rpx}.modal-title{padding:28rpx 28rpx 12rpx;color:#10233f;font-size:30rpx;font-weight:600}.modal-actions{display:flex;justify-content:flex-end;gap:16rpx;padding:20rpx 24rpx 0}.modal-actions button{height:72rpx;min-height:72rpx;padding:0 34rpx;margin:0;font-size:26rpx;line-height:70rpx;border-radius:36rpx}.ghost{color:var(--color-primary, #1769d8);background:#f2f6fc;border:1rpx solid #cfe0f7}.primary{color:#fff;background:var(--color-primary, #1769d8)}.color-row{display:flex;flex-wrap:wrap;align-items:center;gap:18rpx;width:100%}.color-dot{width:52rpx;height:52rpx;border:3rpx solid #fff;border-radius:10rpx;box-shadow:0 0 0 1rpx #dce4ee}.color-dot.on{box-shadow:0 0 0 3rpx var(--color-primary, #1769d8)}.color-text{color:#8494a8;font-size:23rpx}
</style>
src/pages/mes/process-design/route/index.vue
@@ -151,5 +151,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-enabled{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-disabled{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions button::after{border:0}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.more{display:block;padding:16rpx 0 6rpx;color:#93a1b3;font-size:22rpx;text-align:center}.state{padding:60rpx 20rpx;color:#8795a8;font-size:25rpx;text-align:center}.state.error{color:#c65050}.fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}.fab::after{border:0}.fab view{position:relative;width:38rpx;height:38rpx}.fab view::before,.fab view::after{position:absolute;content:"";background:#fff;border-radius:3rpx}.fab view::before{top:17rpx;left:0;width:38rpx;height:4rpx}.fab view::after{top:0;left:17rpx;width:4rpx;height:38rpx}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:0;flex:1;padding-bottom: 132rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-enabled{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-disabled{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions button::after{border:0}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.more{display:block;padding:16rpx 0 6rpx;color:#93a1b3;font-size:22rpx;text-align:center}.state{padding:60rpx 20rpx;color:#8795a8;font-size:25rpx;text-align:center}.state.error{color:#c65050}.fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}.fab::after{border:0}.fab view{position:relative;width:38rpx;height:38rpx}.fab view::before,.fab view::after{position:absolute;content:"";background:#fff;border-radius:3rpx}.fab view::before{top:17rpx;left:0;width:38rpx;height:4rpx}.fab view::after{top:0;left:17rpx;width:4rpx;height:38rpx}
</style>
src/pages/mes/process-design/template/form.vue
@@ -216,5 +216,5 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card{margin-bottom:18rpx;overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.value.muted{color:#8494a8}.required{color:#e23b3b}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.section{display:flex;align-items:center;justify-content:space-between;height:88rpx;padding:0 24rpx;color:#10233f;font-size:29rpx;font-weight:600}.section button{height:56rpx;min-height:56rpx;padding:0 20rpx;margin:0;color:#1769d8;font-size:24rpx;line-height:54rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.section button::after{border:0}.detail{margin:0 20rpx 18rpx;border:1rpx solid #edf1f6;border-radius:12rpx;overflow:hidden}.detail-head{display:flex;align-items:center;justify-content:space-between;gap:14rpx;padding:18rpx 20rpx;background:#f9fbff}.detail-head>view{display:flex;min-width:0;flex-direction:column;gap:8rpx}.detail-name{overflow:hidden;color:#10233f;font-size:27rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.detail-code{color:#8494a8;font-size:22rpx}.detail-type{flex:none;padding:6rpx 14rpx;color:#1769d8;font-size:22rpx;background:#edf5ff;border:1rpx solid #bfdbff;border-radius:999rpx}.detail-row{display:flex;align-items:center;gap:16rpx;min-height:78rpx;padding:0 20rpx;border-top:1rpx solid #f2f5f9}.detail-row>text:first-child{width:150rpx;flex:none;color:#617287;font-size:25rpx}.detail-row input{min-width:0;flex:1;color:#1e3049;font-size:26rpx;text-align:right}.detail-value{min-width:0;flex:1;color:#1e3049;font-size:26rpx;text-align:right}.detail-actions{display:flex;justify-content:flex-end;padding:12rpx 20rpx;border-top:1rpx solid #f2f5f9}.detail-actions button{height:50rpx;min-height:50rpx;padding:0 18rpx;margin:0;font-size:23rpx;line-height:48rpx;border-radius:8rpx}.detail-actions button::after{border:0}.danger{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.save{margin-top:20rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.save::after{border:0}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:44rpx 0}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card{margin-bottom:18rpx;overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.value.muted{color:#8494a8}.required{color:#e23b3b}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.section{display:flex;align-items:center;justify-content:space-between;height:88rpx;padding:0 24rpx;color:#10233f;font-size:29rpx;font-weight:600}.section button{height:56rpx;min-height:56rpx;padding:0 20rpx;margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:54rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.section button::after{border:0}.detail{margin:0 20rpx 18rpx;border:1rpx solid #edf1f6;border-radius:12rpx;overflow:hidden}.detail-head{display:flex;align-items:center;justify-content:space-between;gap:14rpx;padding:18rpx 20rpx;background:#f9fbff}.detail-head>view{display:flex;min-width:0;flex-direction:column;gap:8rpx}.detail-name{overflow:hidden;color:#10233f;font-size:27rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.detail-code{color:#8494a8;font-size:22rpx}.detail-type{flex:none;padding:6rpx 14rpx;color:var(--color-primary, #1769d8);font-size:22rpx;background:var(--color-primary-soft, #edf5ff);border:1rpx solid var(--color-primary-border, #bfdbff);border-radius:999rpx}.detail-row{display:flex;align-items:center;gap:16rpx;min-height:78rpx;padding:0 20rpx;border-top:1rpx solid #f2f5f9}.detail-row>text:first-child{width:150rpx;flex:none;color:#617287;font-size:25rpx}.detail-row input{min-width:0;flex:1;color:#1e3049;font-size:26rpx;text-align:right}.detail-value{min-width:0;flex:1;color:#1e3049;font-size:26rpx;text-align:right}.detail-actions{display:flex;justify-content:flex-end;padding:12rpx 20rpx;border-top:1rpx solid #f2f5f9}.detail-actions button{height:50rpx;min-height:50rpx;padding:0 18rpx;margin:0;font-size:23rpx;line-height:48rpx;border-radius:8rpx}.detail-actions button::after{border:0}.danger{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.save{margin-top:20rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.save::after{border:0}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:44rpx 0}
</style>
src/pages/mes/process-design/template/index.vue
@@ -120,5 +120,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-type{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions button::after{border:0}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.more{display:block;padding:16rpx 0 6rpx;color:#93a1b3;font-size:22rpx;text-align:center}.state{padding:60rpx 20rpx;color:#8795a8;font-size:25rpx;text-align:center}.state.error{color:#c65050}.fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}.fab::after{border:0}.fab view{position:relative;width:38rpx;height:38rpx}.fab view::before,.fab view::after{position:absolute;content:"";background:#fff;border-radius:3rpx}.fab view::before{top:17rpx;left:0;width:38rpx;height:4rpx}.fab view::after{top:0;left:17rpx;width:4rpx;height:38rpx}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:0;flex:1;padding-bottom: 132rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-type{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #edf5ff);border:1rpx solid var(--color-primary-border, #bfdbff)}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions button::after{border:0}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.more{display:block;padding:16rpx 0 6rpx;color:#93a1b3;font-size:22rpx;text-align:center}.state{padding:60rpx 20rpx;color:#8795a8;font-size:25rpx;text-align:center}.state.error{color:#c65050}.fab{position:fixed;right:32rpx;bottom:56rpx;display:flex;width:100rpx;height:100rpx;align-items:center;justify-content:center;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 14rpx 28rpx rgba(23,105,216,.32)}.fab::after{border:0}.fab view{position:relative;width:38rpx;height:38rpx}.fab view::before,.fab view::after{position:absolute;content:"";background:#fff;border-radius:3rpx}.fab view::before{top:17rpx;left:0;width:38rpx;height:4rpx}.fab view::after{top:0;left:17rpx;width:4rpx;height:38rpx}
</style>
src/pages/mes/qc/batchtrace/index.vue
@@ -125,5 +125,5 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;background:#f3f6fb}.search{display:flex;align-items:center;height:76rpx;margin:18rpx 20rpx 0;padding:0 20rpx;gap:16rpx;background:#fff;border-radius:14rpx}.search.sub{margin-top:12rpx}.search input{min-width:0;flex:1;font-size:26rpx;color:#1e3049}.search text{flex:none;color:#1769d8;font-size:24rpx}.content{height:calc(100vh - 188rpx);padding:18rpx 20rpx 32rpx;box-sizing:border-box}.card{margin-bottom:18rpx;padding:22rpx 22rpx 18rpx;background:#fff;border-radius:14rpx;box-shadow:0 8rpx 20rpx rgba(33,54,86,.05)}.head{display:flex;justify-content:space-between;gap:16rpx;border-bottom:1rpx solid #edf1f6;padding-bottom:16rpx}.head>view:first-child{display:grid;gap:6rpx;min-width:0;color:#63758c;font-size:24rpx}.name{color:#10253f;font-size:31rpx;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;justify-content:flex-end;flex:none;min-width:92rpx}.status{display:inline-flex;align-items:center;justify-content:center;min-height:40rpx;padding:0 18rpx;border-radius:999rpx;font-size:22rpx;border:1rpx solid #bdd8ff;color:#1769d8;background:#eef6ff}.tag-green{color:#159166;background:#e9fbf2;border-color:#bcebd4}.tag-blue{color:#1769d8;background:#eef6ff;border-color:#bdd8ff}.tag-orange{color:#b36b00;background:#fff7e8;border-color:#f3d49b}.tag-red{color:#d64b4b;background:#fff1f0;border-color:#efb0b0}.grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx 18rpx;margin-top:16rpx;color:#40536c;font-size:25rpx}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;justify-content:flex-end;gap:12rpx;margin-top:16rpx;border-top:1rpx solid #edf1f6;padding-top:16rpx}.actions button,.detail-head button{min-width:96rpx;margin:0;padding:0 16rpx;color:#1769d8;font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.actions button::after,.detail-head button::after{border:0}.detail-head{display:flex;align-items:center;gap:18rpx}.detail-head text{min-width:0;flex:1;color:#10253f;font-size:31rpx;font-weight:700}.tabs{display:flex;gap:12rpx;overflow-x:auto;padding:0 20rpx 16rpx}.tabs text{flex:none;padding:12rpx 22rpx;color:#55677f;background:#fff;border-radius:999rpx;font-size:25rpx}.tabs .on{color:#1769d8;background:#eaf3ff;font-weight:700}.state,.more{display:block;padding:42rpx 0;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#d64b4b}
.page{min-height:100vh;background:#f3f6fb}.search{display:flex;align-items:center;height:76rpx;margin:18rpx 20rpx 0;padding:0 20rpx;gap:16rpx;background:#fff;border-radius:14rpx}.search.sub{margin-top:12rpx}.search input{min-width:0;flex:1;font-size:26rpx;color:#1e3049}.search text{flex:none;color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:calc(100vh - 188rpx);padding:18rpx 20rpx 32rpx;box-sizing:border-box}.card{margin-bottom:18rpx;padding:22rpx 22rpx 18rpx;background:#fff;border-radius:14rpx;box-shadow:0 8rpx 20rpx rgba(33,54,86,.05)}.head{display:flex;justify-content:space-between;gap:16rpx;border-bottom:1rpx solid #edf1f6;padding-bottom:16rpx}.head>view:first-child{display:grid;gap:6rpx;min-width:0;color:#63758c;font-size:24rpx}.name{color:#10253f;font-size:31rpx;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;justify-content:flex-end;flex:none;min-width:92rpx}.status{display:inline-flex;align-items:center;justify-content:center;min-height:40rpx;padding:0 18rpx;border-radius:999rpx;font-size:22rpx;border:1rpx solid #bdd8ff;color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #eef6ff)}.tag-green{color:#159166;background:#e9fbf2;border-color:#bcebd4}.tag-blue{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #eef6ff);border-color:#bdd8ff}.tag-orange{color:#b36b00;background:#fff7e8;border-color:#f3d49b}.tag-red{color:#d64b4b;background:#fff1f0;border-color:#efb0b0}.grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx 18rpx;margin-top:16rpx;color:#40536c;font-size:25rpx}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;justify-content:flex-end;gap:12rpx;margin-top:16rpx;border-top:1rpx solid #edf1f6;padding-top:16rpx}.actions button,.detail-head button{min-width:96rpx;margin:0;padding:0 16rpx;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid var(--color-primary, #1769d8);border-radius:8rpx}.actions button::after,.detail-head button::after{border:0}.detail-head{display:flex;align-items:center;gap:18rpx}.detail-head text{min-width:0;flex:1;color:#10253f;font-size:31rpx;font-weight:700}.tabs{display:flex;gap:12rpx;overflow-x:auto;padding:0 20rpx 16rpx}.tabs text{flex:none;padding:12rpx 22rpx;color:#55677f;background:#fff;border-radius:999rpx;font-size:25rpx}.tabs .on{color:var(--color-primary, #1769d8);background:#eaf3ff;font-weight:700}.state,.more{display:block;padding:42rpx 0;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#d64b4b}
</style>
src/pages/mes/qc/defect/form.vue
@@ -64,5 +64,5 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:210rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:36rpx;text-align:right}.required{color:#e23b3b}.code-field button{flex:none;min-width:100rpx;padding:0 14rpx;margin:0;color:#1769d8;font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.code-field button::after,.save::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:150rpx;box-sizing:border-box;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:210rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:36rpx;text-align:right}.required{color:#e23b3b}.code-field button{flex:none;min-width:100rpx;padding:0 14rpx;margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid var(--color-primary, #1769d8);border-radius:8rpx}.code-field button::after,.save::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:150rpx;box-sizing:border-box;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}
</style>
src/pages/mes/qc/defect/index.vue
@@ -65,5 +65,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;font-size:22rpx;border-radius:999rpx}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.enabled{color:#0e9663;background:#e9fbf2;border:1rpx solid #b8eed4}.warning{color:#b06a00;background:#fff6df;border:1rpx solid #f0d390}.danger{color:#c65050;background:#fff2f2;border:1rpx solid #efb8b8}.info,.tag-info{color:#1769d8;background:#eef6ff;border:1rpx solid #c9e1ff}.tag-approved{color:#1769d8;background:#eef6ff}.tag-progress{color:#8a5a00;background:#fff6df}.tag-success{color:#0e9663;background:#e9fbf2}.tag-finish{color:#6b55c8;background:#f1efff}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:0;flex:1;padding-bottom: 132rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;font-size:22rpx;border-radius:999rpx}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.enabled{color:#0e9663;background:#e9fbf2;border:1rpx solid #b8eed4}.warning{color:#b06a00;background:#fff6df;border:1rpx solid #f0d390}.danger{color:#c65050;background:#fff2f2;border:1rpx solid #efb8b8}.info,.tag-info{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #eef6ff);border:1rpx solid var(--color-primary-border, #c9e1ff)}.tag-approved{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #eef6ff)}.tag-progress{color:#8a5a00;background:#fff6df}.tag-success{color:#0e9663;background:#e9fbf2}.tag-finish{color:#6b55c8;background:#f1efff}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width: 104rpx; height: 104rpx; min-height: 104rpx;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/qc/indicator/form.vue
@@ -112,5 +112,5 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:210rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:36rpx;text-align:right}.required{color:#e23b3b}.code-field button{flex:none;min-width:100rpx;padding:0 14rpx;margin:0;color:#1769d8;font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.code-field button::after,.save::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:210rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:36rpx;text-align:right}.required{color:#e23b3b}.code-field button{flex:none;min-width:100rpx;padding:0 14rpx;margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid var(--color-primary, #1769d8);border-radius:8rpx}.code-field button::after,.save::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}
</style>
src/pages/mes/qc/indicator/index.vue
@@ -84,5 +84,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;font-size:22rpx;border-radius:999rpx}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:0;flex:1;padding-bottom: 132rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;font-size:22rpx;border-radius:999rpx}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width: 104rpx; height: 104rpx; min-height: 104rpx;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/qc/ipqc/form.vue
@@ -399,5 +399,5 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card,.section-card{overflow:hidden;margin-bottom:22rpx;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:220rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker.disabled{color:#a8b3c1}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:36rpx;text-align:right}.required{color:#e23b3b}.code-field button,.section-tools button,.sub-actions button{flex:none;min-width:100rpx;padding:0 14rpx;margin:0;color:#1769d8;font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.danger{color:#d64b4b!important;border-color:#efb0b0!important}.code-field button::after,.save::after,.submit::after,.section-tools button::after,.sub-actions button::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.save,.submit{margin-top:24rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.submit{background:#12a06a}.tabs{display:flex;gap:14rpx;padding:18rpx 20rpx 0;border-bottom:1rpx solid #eef1f5}.tabs text{margin-bottom:18rpx;padding:12rpx 26rpx;color:#55677f;background:#f2f5f9;border-radius:999rpx;font-size:25rpx}.tabs .on{color:#1769d8;background:#eaf3ff;font-weight:700}.section-tools{display:flex;justify-content:flex-end;padding:18rpx 20rpx 0}.sub-card{margin:20rpx;padding:20rpx;border:1rpx solid #edf1f6;border-radius:14rpx}.sub-title{display:block;margin-bottom:14rpx;color:#0f2744;font-size:29rpx;font-weight:700}.sub-grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx 18rpx;color:#40536c;font-size:25rpx}.sub-grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sub-grid .span{grid-column:1/3}.sub-actions{display:flex;justify-content:flex-end;gap:12rpx;margin-top:16rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:24rpx}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:20;display:flex;align-items:flex-end;background:rgba(20,32,48,.45)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:30rpx;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:96rpx;line-height:96rpx;text-align:center;color:#122033;font-size:30rpx;font-weight:700;border-bottom:1rpx solid #eef1f5}.in-modal{margin:24rpx}.result-item{margin:20rpx;border:1rpx solid #edf1f6;border-radius:14rpx;overflow:hidden}.result-title{display:block;padding:18rpx 24rpx;color:#0f2744;font-size:27rpx;font-weight:700;background:#f8fafc}.inner{padding-left:20rpx;padding-right:20rpx}.load-more{margin:0 20rpx 20rpx;padding:18rpx 0;color:#1769d8;font-size:25rpx;text-align:center;background:#f5f8ff;border:1rpx dashed #bcd3f2;border-radius:12rpx}.field.hint-field{border-bottom:0}.field-hint{padding:0 24rpx 20rpx 264rpx;color:#8a94a6;font-size:22rpx;line-height:1.45;border-bottom:1rpx solid #eef1f5}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card,.section-card{overflow:hidden;margin-bottom:22rpx;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:220rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker.disabled{color:#a8b3c1}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:36rpx;text-align:right}.required{color:#e23b3b}.code-field button,.section-tools button,.sub-actions button{flex:none;min-width:100rpx;padding:0 14rpx;margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid var(--color-primary, #1769d8);border-radius:8rpx}.danger{color:#d64b4b!important;border-color:#efb0b0!important}.code-field button::after,.save::after,.submit::after,.section-tools button::after,.sub-actions button::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.save,.submit{margin-top:24rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.submit{background:#12a06a}.tabs{display:flex;gap:14rpx;padding:18rpx 20rpx 0;border-bottom:1rpx solid #eef1f5}.tabs text{margin-bottom:18rpx;padding:12rpx 26rpx;color:#55677f;background:#f2f5f9;border-radius:999rpx;font-size:25rpx}.tabs .on{color:var(--color-primary, #1769d8);background:#eaf3ff;font-weight:700}.section-tools{display:flex;justify-content:flex-end;padding:18rpx 20rpx 0}.sub-card{margin:20rpx;padding:20rpx;border:1rpx solid #edf1f6;border-radius:14rpx}.sub-title{display:block;margin-bottom:14rpx;color:#0f2744;font-size:29rpx;font-weight:700}.sub-grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx 18rpx;color:#40536c;font-size:25rpx}.sub-grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sub-grid .span{grid-column:1/3}.sub-actions{display:flex;justify-content:flex-end;gap:12rpx;margin-top:16rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:24rpx}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:20;display:flex;align-items:flex-end;background:rgba(20,32,48,.45)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:30rpx;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:96rpx;line-height:96rpx;text-align:center;color:#122033;font-size:30rpx;font-weight:700;border-bottom:1rpx solid #eef1f5}.in-modal{margin:24rpx}.result-item{margin:20rpx;border:1rpx solid #edf1f6;border-radius:14rpx;overflow:hidden}.result-title{display:block;padding:18rpx 24rpx;color:#0f2744;font-size:27rpx;font-weight:700;background:#f8fafc}.inner{padding-left:20rpx;padding-right:20rpx}.load-more{margin:0 20rpx 20rpx;padding:18rpx 0;color:var(--color-primary, #1769d8);font-size:25rpx;text-align:center;background:var(--color-primary-soft, #f5f8ff);border:1rpx dashed #bcd3f2;border-radius:12rpx}.field.hint-field{border-bottom:0}.field-hint{padding:0 24rpx 20rpx 264rpx;color:#8a94a6;font-size:22rpx;line-height:1.45;border-bottom:1rpx solid #eef1f5}
</style>
src/pages/mes/qc/ipqc/index.vue
@@ -75,5 +75,5 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;background:#f3f6fb}.search{display:flex;align-items:center;height:76rpx;margin:18rpx 20rpx 0;padding:0 20rpx;gap:16rpx;background:#fff;border-radius:14rpx}.search input{min-width:0;flex:1;font-size:26rpx;color:#1e3049}.search text{flex:none;color:#1769d8;font-size:24rpx}.content{height:calc(100vh - 100rpx);padding:18rpx 20rpx 32rpx;box-sizing:border-box}.card{margin-bottom:18rpx;padding:22rpx 22rpx 18rpx;background:#fff;border-radius:14rpx;box-shadow:0 8rpx 20rpx rgba(33,54,86,.05)}.head{display:flex;justify-content:space-between;gap:16rpx;border-bottom:1rpx solid #edf1f6;padding-bottom:16rpx}.head>view:first-child{display:grid;gap:6rpx;min-width:0;color:#63758c;font-size:24rpx}.name{color:#10253f;font-size:31rpx;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;justify-content:flex-end;flex:none;min-width:92rpx}.status,.tags text{display:inline-flex;align-items:center;justify-content:center;min-height:40rpx;padding:0 18rpx;border-radius:999rpx;font-size:22rpx;border:1rpx solid #bdd8ff;color:#1769d8;background:#eef6ff}.tag-green{color:#159166;background:#e9fbf2;border-color:#bcebd4}.tag-blue{color:#1769d8;background:#eef6ff;border-color:#bdd8ff}.tag-orange{color:#b36b00;background:#fff7e8;border-color:#f3d49b}.tag-red{color:#d64b4b;background:#fff1f0;border-color:#efb0b0}.tags{display:flex;gap:10rpx;flex-wrap:wrap;margin-top:14rpx}.grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx 18rpx;margin-top:16rpx;color:#40536c;font-size:25rpx}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.grid text.full{grid-column:1/-1;white-space:normal}.actions{display:flex;justify-content:flex-end;gap:12rpx;margin-top:16rpx;border-top:1rpx solid #edf1f6;padding-top:16rpx}.actions button{min-width:96rpx;margin:0;padding:0 16rpx;color:#1769d8;font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.actions .danger{color:#d64b4b;border-color:#efb0b0}.actions button::after{border:0}.state,.more{display:block;padding:42rpx 0;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#d64b4b}.fab{position:fixed;right:28rpx;bottom:44rpx;width:104rpx;height:104rpx;border-radius:50%;background:#1769d8;box-shadow:0 12rpx 26rpx rgba(23,105,216,.35)}.fab::after{border:0}.fab view,.fab view::after{position:absolute;left:50%;top:50%;content:"";background:#fff;border-radius:4rpx;transform:translate(-50%,-50%)}.fab view{width:42rpx;height:8rpx}.fab view::after{width:8rpx;height:42rpx}
.page{min-height:100vh;background:#f3f6fb}.search{display:flex;align-items:center;height:76rpx;margin:18rpx 20rpx 0;padding:0 20rpx;gap:16rpx;background:#fff;border-radius:14rpx}.search input{min-width:0;flex:1;font-size:26rpx;color:#1e3049}.search text{flex:none;color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:calc(100vh - 100rpx);padding:18rpx 20rpx 32rpx;box-sizing:border-box}.card{margin-bottom:18rpx;padding:22rpx 22rpx 18rpx;background:#fff;border-radius:14rpx;box-shadow:0 8rpx 20rpx rgba(33,54,86,.05)}.head{display:flex;justify-content:space-between;gap:16rpx;border-bottom:1rpx solid #edf1f6;padding-bottom:16rpx}.head>view:first-child{display:grid;gap:6rpx;min-width:0;color:#63758c;font-size:24rpx}.name{color:#10253f;font-size:31rpx;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;justify-content:flex-end;flex:none;min-width:92rpx}.status,.tags text{display:inline-flex;align-items:center;justify-content:center;min-height:40rpx;padding:0 18rpx;border-radius:999rpx;font-size:22rpx;border:1rpx solid #bdd8ff;color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #eef6ff)}.tag-green{color:#159166;background:#e9fbf2;border-color:#bcebd4}.tag-blue{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #eef6ff);border-color:#bdd8ff}.tag-orange{color:#b36b00;background:#fff7e8;border-color:#f3d49b}.tag-red{color:#d64b4b;background:#fff1f0;border-color:#efb0b0}.tags{display:flex;gap:10rpx;flex-wrap:wrap;margin-top:14rpx}.grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx 18rpx;margin-top:16rpx;color:#40536c;font-size:25rpx}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.grid text.full{grid-column:1/-1;white-space:normal}.actions{display:flex;justify-content:flex-end;gap:12rpx;margin-top:16rpx;border-top:1rpx solid #edf1f6;padding-top:16rpx}.actions button{min-width:96rpx;margin:0;padding:0 16rpx;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid var(--color-primary, #1769d8);border-radius:8rpx}.actions .danger{color:#d64b4b;border-color:#efb0b0}.actions button::after{border:0}.state,.more{display:block;padding:42rpx 0;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#d64b4b}.fab{position:fixed;right:28rpx;bottom:44rpx;width:104rpx;height:104rpx;border-radius:50%;background:var(--color-primary, #1769d8);box-shadow:0 12rpx 26rpx rgba(23,105,216,.35)}.fab::after{border:0}.fab view,.fab view::after{position:absolute;left:50%;top:50%;content:"";background:#fff;border-radius:4rpx;transform:translate(-50%,-50%)}.fab view{width:42rpx;height:8rpx}.fab view::after{width:8rpx;height:42rpx}
</style>
src/pages/mes/qc/iqc/form.vue
@@ -375,5 +375,5 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card,.section-card{overflow:hidden;margin-bottom:22rpx;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:220rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:36rpx;text-align:right}.required{color:#e23b3b}.code-field button,.section-tools button,.sub-actions button{flex:none;min-width:100rpx;padding:0 14rpx;margin:0;color:#1769d8;font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.danger{color:#d64b4b!important;border-color:#efb0b0!important}.code-field button::after,.save::after,.submit::after,.section-tools button::after,.sub-actions button::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.save,.submit{margin-top:24rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.submit{background:#12a06a}.tabs{display:flex;gap:14rpx;padding:18rpx 20rpx 0;border-bottom:1rpx solid #eef1f5}.tabs text{margin-bottom:18rpx;padding:12rpx 26rpx;color:#55677f;background:#f2f5f9;border-radius:999rpx;font-size:25rpx}.tabs .on{color:#1769d8;background:#eaf3ff;font-weight:700}.section-tools{display:flex;justify-content:flex-end;padding:18rpx 20rpx 0}.sub-card{margin:20rpx;padding:20rpx;border:1rpx solid #edf1f6;border-radius:14rpx}.sub-title{display:block;margin-bottom:14rpx;color:#0f2744;font-size:29rpx;font-weight:700}.sub-grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx 18rpx;color:#40536c;font-size:25rpx}.sub-grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sub-grid .span{grid-column:1/3}.sub-actions{display:flex;justify-content:flex-end;gap:12rpx;margin-top:16rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:24rpx}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:20;display:flex;align-items:flex-end;background:rgba(20,32,48,.45)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:30rpx;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:96rpx;line-height:96rpx;text-align:center;color:#122033;font-size:30rpx;font-weight:700;border-bottom:1rpx solid #eef1f5}.in-modal{margin:24rpx}.result-item{margin:20rpx;border:1rpx solid #edf1f6;border-radius:14rpx;overflow:hidden}.result-title{display:block;padding:18rpx 24rpx;color:#0f2744;font-size:27rpx;font-weight:700;background:#f8fafc}.inner{padding-left:20rpx;padding-right:20rpx}.load-more{margin:0 20rpx 20rpx;padding:18rpx 0;color:#1769d8;font-size:25rpx;text-align:center;background:#f5f8ff;border:1rpx dashed #bcd3f2;border-radius:12rpx}.field.hint-field{border-bottom:0}.field-hint{padding:0 24rpx 20rpx 264rpx;color:#8a94a6;font-size:22rpx;line-height:1.45;border-bottom:1rpx solid #eef1f5}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card,.section-card{overflow:hidden;margin-bottom:22rpx;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:220rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:36rpx;text-align:right}.required{color:#e23b3b}.code-field button,.section-tools button,.sub-actions button{flex:none;min-width:100rpx;padding:0 14rpx;margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid var(--color-primary, #1769d8);border-radius:8rpx}.danger{color:#d64b4b!important;border-color:#efb0b0!important}.code-field button::after,.save::after,.submit::after,.section-tools button::after,.sub-actions button::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.save,.submit{margin-top:24rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.submit{background:#12a06a}.tabs{display:flex;gap:14rpx;padding:18rpx 20rpx 0;border-bottom:1rpx solid #eef1f5}.tabs text{margin-bottom:18rpx;padding:12rpx 26rpx;color:#55677f;background:#f2f5f9;border-radius:999rpx;font-size:25rpx}.tabs .on{color:var(--color-primary, #1769d8);background:#eaf3ff;font-weight:700}.section-tools{display:flex;justify-content:flex-end;padding:18rpx 20rpx 0}.sub-card{margin:20rpx;padding:20rpx;border:1rpx solid #edf1f6;border-radius:14rpx}.sub-title{display:block;margin-bottom:14rpx;color:#0f2744;font-size:29rpx;font-weight:700}.sub-grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx 18rpx;color:#40536c;font-size:25rpx}.sub-grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sub-grid .span{grid-column:1/3}.sub-actions{display:flex;justify-content:flex-end;gap:12rpx;margin-top:16rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:24rpx}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:20;display:flex;align-items:flex-end;background:rgba(20,32,48,.45)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:30rpx;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:96rpx;line-height:96rpx;text-align:center;color:#122033;font-size:30rpx;font-weight:700;border-bottom:1rpx solid #eef1f5}.in-modal{margin:24rpx}.result-item{margin:20rpx;border:1rpx solid #edf1f6;border-radius:14rpx;overflow:hidden}.result-title{display:block;padding:18rpx 24rpx;color:#0f2744;font-size:27rpx;font-weight:700;background:#f8fafc}.inner{padding-left:20rpx;padding-right:20rpx}.load-more{margin:0 20rpx 20rpx;padding:18rpx 0;color:var(--color-primary, #1769d8);font-size:25rpx;text-align:center;background:var(--color-primary-soft, #f5f8ff);border:1rpx dashed #bcd3f2;border-radius:12rpx}.field.hint-field{border-bottom:0}.field-hint{padding:0 24rpx 20rpx 264rpx;color:#8a94a6;font-size:22rpx;line-height:1.45;border-bottom:1rpx solid #eef1f5}
</style>
src/pages/mes/qc/iqc/index.vue
@@ -75,5 +75,5 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;background:#f3f6fb}.search{display:flex;align-items:center;height:76rpx;margin:18rpx 20rpx 0;padding:0 20rpx;gap:16rpx;background:#fff;border-radius:14rpx}.search input{min-width:0;flex:1;font-size:26rpx;color:#1e3049}.search text{flex:none;color:#1769d8;font-size:24rpx}.content{height:calc(100vh - 100rpx);padding:18rpx 20rpx 32rpx;box-sizing:border-box}.card{margin-bottom:18rpx;padding:22rpx 22rpx 18rpx;background:#fff;border-radius:14rpx;box-shadow:0 8rpx 20rpx rgba(33,54,86,.05)}.head{display:flex;justify-content:space-between;gap:16rpx;border-bottom:1rpx solid #edf1f6;padding-bottom:16rpx}.head>view:first-child{display:grid;gap:6rpx;min-width:0;color:#63758c;font-size:24rpx}.name{color:#10253f;font-size:31rpx;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;justify-content:flex-end;flex:none;min-width:92rpx}.status,.tags text{display:inline-flex;align-items:center;justify-content:center;min-height:40rpx;padding:0 18rpx;border-radius:999rpx;font-size:22rpx;border:1rpx solid #bdd8ff;color:#1769d8;background:#eef6ff}.tag-green{color:#159166;background:#e9fbf2;border-color:#bcebd4}.tag-blue{color:#1769d8;background:#eef6ff;border-color:#bdd8ff}.tag-orange{color:#b36b00;background:#fff7e8;border-color:#f3d49b}.tag-red{color:#d64b4b;background:#fff1f0;border-color:#efb0b0}.tags{display:flex;gap:10rpx;flex-wrap:wrap;margin-top:14rpx}.grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx 18rpx;margin-top:16rpx;color:#40536c;font-size:25rpx}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.grid text.full{grid-column:1/-1;white-space:normal}.actions{display:flex;justify-content:flex-end;gap:12rpx;margin-top:16rpx;border-top:1rpx solid #edf1f6;padding-top:16rpx}.actions button{min-width:96rpx;margin:0;padding:0 16rpx;color:#1769d8;font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.actions .danger{color:#d64b4b;border-color:#efb0b0}.actions button::after{border:0}.state,.more{display:block;padding:42rpx 0;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#d64b4b}.fab{position:fixed;right:28rpx;bottom:44rpx;width:104rpx;height:104rpx;border-radius:50%;background:#1769d8;box-shadow:0 12rpx 26rpx rgba(23,105,216,.35)}.fab::after{border:0}.fab view,.fab view::after{position:absolute;left:50%;top:50%;content:"";background:#fff;border-radius:4rpx;transform:translate(-50%,-50%)}.fab view{width:42rpx;height:8rpx}.fab view::after{width:8rpx;height:42rpx}
.page{min-height:100vh;background:#f3f6fb}.search{display:flex;align-items:center;height:76rpx;margin:18rpx 20rpx 0;padding:0 20rpx;gap:16rpx;background:#fff;border-radius:14rpx}.search input{min-width:0;flex:1;font-size:26rpx;color:#1e3049}.search text{flex:none;color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:calc(100vh - 100rpx);padding:18rpx 20rpx 32rpx;box-sizing:border-box}.card{margin-bottom:18rpx;padding:22rpx 22rpx 18rpx;background:#fff;border-radius:14rpx;box-shadow:0 8rpx 20rpx rgba(33,54,86,.05)}.head{display:flex;justify-content:space-between;gap:16rpx;border-bottom:1rpx solid #edf1f6;padding-bottom:16rpx}.head>view:first-child{display:grid;gap:6rpx;min-width:0;color:#63758c;font-size:24rpx}.name{color:#10253f;font-size:31rpx;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;justify-content:flex-end;flex:none;min-width:92rpx}.status,.tags text{display:inline-flex;align-items:center;justify-content:center;min-height:40rpx;padding:0 18rpx;border-radius:999rpx;font-size:22rpx;border:1rpx solid #bdd8ff;color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #eef6ff)}.tag-green{color:#159166;background:#e9fbf2;border-color:#bcebd4}.tag-blue{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #eef6ff);border-color:#bdd8ff}.tag-orange{color:#b36b00;background:#fff7e8;border-color:#f3d49b}.tag-red{color:#d64b4b;background:#fff1f0;border-color:#efb0b0}.tags{display:flex;gap:10rpx;flex-wrap:wrap;margin-top:14rpx}.grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx 18rpx;margin-top:16rpx;color:#40536c;font-size:25rpx}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.grid text.full{grid-column:1/-1;white-space:normal}.actions{display:flex;justify-content:flex-end;gap:12rpx;margin-top:16rpx;border-top:1rpx solid #edf1f6;padding-top:16rpx}.actions button{min-width:96rpx;margin:0;padding:0 16rpx;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid var(--color-primary, #1769d8);border-radius:8rpx}.actions .danger{color:#d64b4b;border-color:#efb0b0}.actions button::after{border:0}.state,.more{display:block;padding:42rpx 0;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#d64b4b}.fab{position:fixed;right:28rpx;bottom:44rpx;width:104rpx;height:104rpx;border-radius:50%;background:var(--color-primary, #1769d8);box-shadow:0 12rpx 26rpx rgba(23,105,216,.35)}.fab::after{border:0}.fab view,.fab view::after{position:absolute;left:50%;top:50%;content:"";background:#fff;border-radius:4rpx;transform:translate(-50%,-50%)}.fab view{width:42rpx;height:8rpx}.fab view::after{width:8rpx;height:42rpx}
</style>
src/pages/mes/qc/ledger/index.vue
@@ -106,5 +106,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.search text{flex:none;color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:40rpx;box-sizing:border-box}.card{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx;padding-bottom:16rpx;border-bottom:1rpx solid #edf1f6}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{overflow:hidden;color:#78879b;font-size:23rpx;text-overflow:ellipsis;white-space:nowrap}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status,.tags text{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx 18rpx;padding:16rpx 0;margin-top:14rpx;color:#40536c;font-size:24rpx;border-top:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.remark{display:grid;gap:8rpx;padding-top:14rpx;color:#6a7c91;font-size:24rpx;border-top:1rpx solid #edf1f6}.remark text{line-height:1.45}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.tag-green{color:#0e9663;background:#e9fbf2;border:1rpx solid #b8eed4}.tag-blue{color:#1769d8;background:#eef6ff;border:1rpx solid #c9e1ff}.tag-orange{color:#b06a00;background:#fff6df;border:1rpx solid #f0d390}.tag-red{color:#c65050;background:#fff2f2;border:1rpx solid #efb8b8}.tag-gray{color:#637083;background:#eef2f6;border:1rpx solid #d7e0eb}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.search text{flex:none;color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:0;flex:1;padding-bottom:40rpx;box-sizing:border-box}.card{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx;padding-bottom:16rpx;border-bottom:1rpx solid #edf1f6}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{overflow:hidden;color:#78879b;font-size:23rpx;text-overflow:ellipsis;white-space:nowrap}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status,.tags text{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx 18rpx;padding:16rpx 0;margin-top:14rpx;color:#40536c;font-size:24rpx;border-top:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.remark{display:grid;gap:8rpx;padding-top:14rpx;color:#6a7c91;font-size:24rpx;border-top:1rpx solid #edf1f6}.remark text{line-height:1.45}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.tag-green{color:#0e9663;background:#e9fbf2;border:1rpx solid #b8eed4}.tag-blue{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #eef6ff);border:1rpx solid var(--color-primary-border, #c9e1ff)}.tag-orange{color:#b06a00;background:#fff6df;border:1rpx solid #f0d390}.tag-red{color:#c65050;background:#fff2f2;border:1rpx solid #efb8b8}.tag-gray{color:#637083;background:#eef2f6;border:1rpx solid #d7e0eb}
</style>
src/pages/mes/qc/ncr/form.vue
@@ -105,5 +105,5 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:210rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:36rpx;text-align:right}.required{color:#e23b3b}.code-field button{flex:none;min-width:120rpx;padding:0 14rpx;margin:0;color:#1769d8;font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.code-field button::after,.save::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;box-sizing:border-box;font-size:27rpx}.detail-text{width:100%;color:#1e3049;font-size:27rpx;line-height:1.6}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:210rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:36rpx;text-align:right}.required{color:#e23b3b}.code-field button{flex:none;min-width:120rpx;padding:0 14rpx;margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid var(--color-primary, #1769d8);border-radius:8rpx}.code-field button::after,.save::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;box-sizing:border-box;font-size:27rpx}.detail-text{width:100%;color:#1e3049;font-size:27rpx;line-height:1.6}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}
</style>
src/pages/mes/qc/ncr/index.vue
@@ -115,5 +115,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;font-size:22rpx;border-radius:999rpx}.grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.grid .full{grid-column:1/3}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button,.modal-actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after,.modal-actions button::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.enabled{color:#0e9663;background:#e9fbf2;border:1rpx solid #b8eed4}.warning{color:#b06a00;background:#fff6df;border:1rpx solid #f0d390}.danger{color:#c65050;background:#fff2f2;border:1rpx solid #efb8b8}.info,.tag-info{color:#1769d8;background:#eef6ff;border:1rpx solid #c9e1ff}.tag-approved{color:#1769d8;background:#eef6ff}.tag-progress{color:#6b55c8;background:#f1efff}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}.mask{position:fixed;inset:0;z-index:20;display:flex;align-items:flex-end;background:rgba(20,31,48,.42)}.modal{width:100%;max-height:78vh;padding:24rpx 30rpx 34rpx;overflow:auto;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{padding:8rpx 0 22rpx;color:#20334c;font-size:31rpx;font-weight:700}.field{display:flex;align-items:center;min-height:92rpx;gap:20rpx;padding:0 6rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:26rpx}.picker{display:flex;min-width:0;flex:1;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a;font-size:26rpx}.picker text:first-child{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:36rpx;text-align:right}.column{align-items:flex-start;flex-direction:column;padding:18rpx 6rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;box-sizing:border-box;font-size:26rpx}.required{color:#e23b3b}.modal-actions{display:flex;justify-content:flex-end;gap:16rpx;padding-top:24rpx}.modal-actions .primary{color:#fff;background:#1769d8}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:0;flex:1;padding-bottom: 132rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;font-size:22rpx;border-radius:999rpx}.grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.grid .full{grid-column:1/3}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button,.modal-actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after,.modal-actions button::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.enabled{color:#0e9663;background:#e9fbf2;border:1rpx solid #b8eed4}.warning{color:#b06a00;background:#fff6df;border:1rpx solid #f0d390}.danger{color:#c65050;background:#fff2f2;border:1rpx solid #efb8b8}.info,.tag-info{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #eef6ff);border:1rpx solid var(--color-primary-border, #c9e1ff)}.tag-approved{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #eef6ff)}.tag-progress{color:#6b55c8;background:#f1efff}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width: 104rpx; height: 104rpx; min-height: 104rpx;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}.mask{position:fixed;inset:0;z-index:20;display:flex;align-items:flex-end;background:rgba(20,31,48,.42)}.modal{width:100%;max-height:78vh;padding:24rpx 30rpx 34rpx;overflow:auto;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{padding:8rpx 0 22rpx;color:#20334c;font-size:31rpx;font-weight:700}.field{display:flex;align-items:center;min-height:92rpx;gap:20rpx;padding:0 6rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:26rpx}.picker{display:flex;min-width:0;flex:1;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a;font-size:26rpx}.picker text:first-child{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:36rpx;text-align:right}.column{align-items:flex-start;flex-direction:column;padding:18rpx 6rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;box-sizing:border-box;font-size:26rpx}.required{color:#e23b3b}.modal-actions{display:flex;justify-content:flex-end;gap:16rpx;padding-top:24rpx}.modal-actions .primary{color:#fff;background:var(--color-primary, #1769d8)}
</style>
src/pages/mes/qc/oqc/form.vue
@@ -392,5 +392,5 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card,.section-card{overflow:hidden;margin-bottom:22rpx;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:220rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:36rpx;text-align:right}.required{color:#e23b3b}.code-field button,.section-tools button,.sub-actions button{flex:none;min-width:100rpx;padding:0 14rpx;margin:0;color:#1769d8;font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.danger{color:#d64b4b!important;border-color:#efb0b0!important}.code-field button::after,.save::after,.submit::after,.section-tools button::after,.sub-actions button::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.save,.submit{margin-top:24rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.submit{background:#12a06a}.tabs{display:flex;gap:14rpx;padding:18rpx 20rpx 0;border-bottom:1rpx solid #eef1f5}.tabs text{margin-bottom:18rpx;padding:12rpx 26rpx;color:#55677f;background:#f2f5f9;border-radius:999rpx;font-size:25rpx}.tabs .on{color:#1769d8;background:#eaf3ff;font-weight:700}.section-tools{display:flex;justify-content:flex-end;padding:18rpx 20rpx 0}.sub-card{margin:20rpx;padding:20rpx;border:1rpx solid #edf1f6;border-radius:14rpx}.sub-title{display:block;margin-bottom:14rpx;color:#0f2744;font-size:29rpx;font-weight:700}.sub-grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx 18rpx;color:#40536c;font-size:25rpx}.sub-grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sub-grid .span{grid-column:1/3}.sub-actions{display:flex;justify-content:flex-end;gap:12rpx;margin-top:16rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:24rpx}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:20;display:flex;align-items:flex-end;background:rgba(20,32,48,.45)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:30rpx;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:96rpx;line-height:96rpx;text-align:center;color:#122033;font-size:30rpx;font-weight:700;border-bottom:1rpx solid #eef1f5}.in-modal{margin:24rpx}.result-item{margin:20rpx;border:1rpx solid #edf1f6;border-radius:14rpx;overflow:hidden}.result-title{display:block;padding:18rpx 24rpx;color:#0f2744;font-size:27rpx;font-weight:700;background:#f8fafc}.inner{padding-left:20rpx;padding-right:20rpx}.load-more{margin:0 20rpx 20rpx;padding:18rpx 0;color:#1769d8;font-size:25rpx;text-align:center;background:#f5f8ff;border:1rpx dashed #bcd3f2;border-radius:12rpx}.field.hint-field{border-bottom:0}.field-hint{padding:0 24rpx 20rpx 264rpx;color:#8a94a6;font-size:22rpx;line-height:1.45;border-bottom:1rpx solid #eef1f5}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card,.section-card{overflow:hidden;margin-bottom:22rpx;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:220rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:36rpx;text-align:right}.required{color:#e23b3b}.code-field button,.section-tools button,.sub-actions button{flex:none;min-width:100rpx;padding:0 14rpx;margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid var(--color-primary, #1769d8);border-radius:8rpx}.danger{color:#d64b4b!important;border-color:#efb0b0!important}.code-field button::after,.save::after,.submit::after,.section-tools button::after,.sub-actions button::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.save,.submit{margin-top:24rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.submit{background:#12a06a}.tabs{display:flex;gap:14rpx;padding:18rpx 20rpx 0;border-bottom:1rpx solid #eef1f5}.tabs text{margin-bottom:18rpx;padding:12rpx 26rpx;color:#55677f;background:#f2f5f9;border-radius:999rpx;font-size:25rpx}.tabs .on{color:var(--color-primary, #1769d8);background:#eaf3ff;font-weight:700}.section-tools{display:flex;justify-content:flex-end;padding:18rpx 20rpx 0}.sub-card{margin:20rpx;padding:20rpx;border:1rpx solid #edf1f6;border-radius:14rpx}.sub-title{display:block;margin-bottom:14rpx;color:#0f2744;font-size:29rpx;font-weight:700}.sub-grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx 18rpx;color:#40536c;font-size:25rpx}.sub-grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sub-grid .span{grid-column:1/3}.sub-actions{display:flex;justify-content:flex-end;gap:12rpx;margin-top:16rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:24rpx}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:20;display:flex;align-items:flex-end;background:rgba(20,32,48,.45)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:30rpx;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:96rpx;line-height:96rpx;text-align:center;color:#122033;font-size:30rpx;font-weight:700;border-bottom:1rpx solid #eef1f5}.in-modal{margin:24rpx}.result-item{margin:20rpx;border:1rpx solid #edf1f6;border-radius:14rpx;overflow:hidden}.result-title{display:block;padding:18rpx 24rpx;color:#0f2744;font-size:27rpx;font-weight:700;background:#f8fafc}.inner{padding-left:20rpx;padding-right:20rpx}.load-more{margin:0 20rpx 20rpx;padding:18rpx 0;color:var(--color-primary, #1769d8);font-size:25rpx;text-align:center;background:var(--color-primary-soft, #f5f8ff);border:1rpx dashed #bcd3f2;border-radius:12rpx}.field.hint-field{border-bottom:0}.field-hint{padding:0 24rpx 20rpx 264rpx;color:#8a94a6;font-size:22rpx;line-height:1.45;border-bottom:1rpx solid #eef1f5}
</style>
src/pages/mes/qc/oqc/index.vue
@@ -75,5 +75,5 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;background:#f3f6fb}.search{display:flex;align-items:center;height:76rpx;margin:18rpx 20rpx 0;padding:0 20rpx;gap:16rpx;background:#fff;border-radius:14rpx}.search input{min-width:0;flex:1;font-size:26rpx;color:#1e3049}.search text{flex:none;color:#1769d8;font-size:24rpx}.content{height:calc(100vh - 100rpx);padding:18rpx 20rpx 32rpx;box-sizing:border-box}.card{margin-bottom:18rpx;padding:22rpx 22rpx 18rpx;background:#fff;border-radius:14rpx;box-shadow:0 8rpx 20rpx rgba(33,54,86,.05)}.head{display:flex;justify-content:space-between;gap:16rpx;border-bottom:1rpx solid #edf1f6;padding-bottom:16rpx}.head>view:first-child{display:grid;gap:6rpx;min-width:0;color:#63758c;font-size:24rpx}.name{color:#10253f;font-size:31rpx;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;justify-content:flex-end;flex:none;min-width:92rpx}.status,.tags text{display:inline-flex;align-items:center;justify-content:center;min-height:40rpx;padding:0 18rpx;border-radius:999rpx;font-size:22rpx;border:1rpx solid #bdd8ff;color:#1769d8;background:#eef6ff}.tag-green{color:#159166;background:#e9fbf2;border-color:#bcebd4}.tag-blue{color:#1769d8;background:#eef6ff;border-color:#bdd8ff}.tag-orange{color:#b36b00;background:#fff7e8;border-color:#f3d49b}.tag-red{color:#d64b4b;background:#fff1f0;border-color:#efb0b0}.tags{display:flex;gap:10rpx;flex-wrap:wrap;margin-top:14rpx}.grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx 18rpx;margin-top:16rpx;color:#40536c;font-size:25rpx}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.grid text.full{grid-column:1/-1;white-space:normal}.actions{display:flex;justify-content:flex-end;gap:12rpx;margin-top:16rpx;border-top:1rpx solid #edf1f6;padding-top:16rpx}.actions button{min-width:96rpx;margin:0;padding:0 16rpx;color:#1769d8;font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.actions .danger{color:#d64b4b;border-color:#efb0b0}.actions button::after{border:0}.state,.more{display:block;padding:42rpx 0;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#d64b4b}.fab{position:fixed;right:28rpx;bottom:44rpx;width:104rpx;height:104rpx;border-radius:50%;background:#1769d8;box-shadow:0 12rpx 26rpx rgba(23,105,216,.35)}.fab::after{border:0}.fab view,.fab view::after{position:absolute;left:50%;top:50%;content:"";background:#fff;border-radius:4rpx;transform:translate(-50%,-50%)}.fab view{width:42rpx;height:8rpx}.fab view::after{width:8rpx;height:42rpx}
.page{min-height:100vh;background:#f3f6fb}.search{display:flex;align-items:center;height:76rpx;margin:18rpx 20rpx 0;padding:0 20rpx;gap:16rpx;background:#fff;border-radius:14rpx}.search input{min-width:0;flex:1;font-size:26rpx;color:#1e3049}.search text{flex:none;color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:calc(100vh - 100rpx);padding:18rpx 20rpx 32rpx;box-sizing:border-box}.card{margin-bottom:18rpx;padding:22rpx 22rpx 18rpx;background:#fff;border-radius:14rpx;box-shadow:0 8rpx 20rpx rgba(33,54,86,.05)}.head{display:flex;justify-content:space-between;gap:16rpx;border-bottom:1rpx solid #edf1f6;padding-bottom:16rpx}.head>view:first-child{display:grid;gap:6rpx;min-width:0;color:#63758c;font-size:24rpx}.name{color:#10253f;font-size:31rpx;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;justify-content:flex-end;flex:none;min-width:92rpx}.status,.tags text{display:inline-flex;align-items:center;justify-content:center;min-height:40rpx;padding:0 18rpx;border-radius:999rpx;font-size:22rpx;border:1rpx solid #bdd8ff;color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #eef6ff)}.tag-green{color:#159166;background:#e9fbf2;border-color:#bcebd4}.tag-blue{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #eef6ff);border-color:#bdd8ff}.tag-orange{color:#b36b00;background:#fff7e8;border-color:#f3d49b}.tag-red{color:#d64b4b;background:#fff1f0;border-color:#efb0b0}.tags{display:flex;gap:10rpx;flex-wrap:wrap;margin-top:14rpx}.grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx 18rpx;margin-top:16rpx;color:#40536c;font-size:25rpx}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.grid text.full{grid-column:1/-1;white-space:normal}.actions{display:flex;justify-content:flex-end;gap:12rpx;margin-top:16rpx;border-top:1rpx solid #edf1f6;padding-top:16rpx}.actions button{min-width:96rpx;margin:0;padding:0 16rpx;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid var(--color-primary, #1769d8);border-radius:8rpx}.actions .danger{color:#d64b4b;border-color:#efb0b0}.actions button::after{border:0}.state,.more{display:block;padding:42rpx 0;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#d64b4b}.fab{position:fixed;right:28rpx;bottom:44rpx;width:104rpx;height:104rpx;border-radius:50%;background:var(--color-primary, #1769d8);box-shadow:0 12rpx 26rpx rgba(23,105,216,.35)}.fab::after{border:0}.fab view,.fab view::after{position:absolute;left:50%;top:50%;content:"";background:#fff;border-radius:4rpx;transform:translate(-50%,-50%)}.fab view{width:42rpx;height:8rpx}.fab view::after{width:8rpx;height:42rpx}
</style>
src/pages/mes/qc/pendinginspect/index.vue
@@ -75,5 +75,5 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;background:#f3f6fb}.search{display:flex;align-items:center;height:76rpx;margin:18rpx 20rpx 0;padding:0 20rpx;gap:16rpx;background:#fff;border-radius:14rpx}.search input{min-width:0;flex:1;font-size:26rpx;color:#1e3049}.search text{flex:none;color:#1769d8;font-size:24rpx}.content{height:calc(100vh - 100rpx);padding:18rpx 20rpx 32rpx;box-sizing:border-box}.card{position:relative;margin-bottom:18rpx;padding:22rpx 22rpx 18rpx;background:#fff;border-radius:14rpx;box-shadow:0 8rpx 20rpx rgba(33,54,86,.05)}.head{display:flex;justify-content:space-between;gap:16rpx;border-bottom:1rpx solid #edf1f6;padding-bottom:16rpx}.head>view:first-child{display:grid;gap:6rpx;min-width:0;color:#63758c;font-size:24rpx}.name{color:#10253f;font-size:31rpx;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;justify-content:flex-end;flex:none;min-width:92rpx}.status,.tags text{display:inline-flex;align-items:center;justify-content:center;min-height:40rpx;padding:0 18rpx;border-radius:999rpx;font-size:22rpx;border:1rpx solid #bdd8ff;color:#1769d8;background:#eef6ff}.tag-green{color:#159166;background:#e9fbf2;border-color:#bcebd4}.tag-blue{color:#1769d8;background:#eef6ff;border-color:#bdd8ff}.tag-orange{color:#b36b00;background:#fff7e8;border-color:#f3d49b}.tag-red{color:#d64b4b;background:#fff1f0;border-color:#efb0b0}.tags{display:flex;gap:10rpx;flex-wrap:wrap;margin-top:14rpx}.grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx 18rpx;margin-top:16rpx;color:#40536c;font-size:25rpx}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;justify-content:flex-end;margin-top:16rpx}.actions button{min-width:128rpx;margin:0;padding:0 18rpx;color:#1769d8;font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.actions button::after{border:0}.state,.more{display:block;padding:42rpx 0;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#d64b4b}
.page{min-height:100vh;background:#f3f6fb}.search{display:flex;align-items:center;height:76rpx;margin:18rpx 20rpx 0;padding:0 20rpx;gap:16rpx;background:#fff;border-radius:14rpx}.search input{min-width:0;flex:1;font-size:26rpx;color:#1e3049}.search text{flex:none;color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:calc(100vh - 100rpx);padding:18rpx 20rpx 32rpx;box-sizing:border-box}.card{position:relative;margin-bottom:18rpx;padding:22rpx 22rpx 18rpx;background:#fff;border-radius:14rpx;box-shadow:0 8rpx 20rpx rgba(33,54,86,.05)}.head{display:flex;justify-content:space-between;gap:16rpx;border-bottom:1rpx solid #edf1f6;padding-bottom:16rpx}.head>view:first-child{display:grid;gap:6rpx;min-width:0;color:#63758c;font-size:24rpx}.name{color:#10253f;font-size:31rpx;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;justify-content:flex-end;flex:none;min-width:92rpx}.status,.tags text{display:inline-flex;align-items:center;justify-content:center;min-height:40rpx;padding:0 18rpx;border-radius:999rpx;font-size:22rpx;border:1rpx solid #bdd8ff;color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #eef6ff)}.tag-green{color:#159166;background:#e9fbf2;border-color:#bcebd4}.tag-blue{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #eef6ff);border-color:#bdd8ff}.tag-orange{color:#b36b00;background:#fff7e8;border-color:#f3d49b}.tag-red{color:#d64b4b;background:#fff1f0;border-color:#efb0b0}.tags{display:flex;gap:10rpx;flex-wrap:wrap;margin-top:14rpx}.grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx 18rpx;margin-top:16rpx;color:#40536c;font-size:25rpx}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;justify-content:flex-end;margin-top:16rpx}.actions button{min-width:128rpx;margin:0;padding:0 18rpx;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid var(--color-primary, #1769d8);border-radius:8rpx}.actions button::after{border:0}.state,.more{display:block;padding:42rpx 0;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#d64b4b}
</style>
src/pages/mes/qc/report/instance/detail.vue
@@ -50,5 +50,5 @@
</template><view v-else class="state">暂无报告详情</view></view></template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.card{overflow:hidden;margin-bottom:20rpx;background:#fff;border-radius:16rpx}.row{display:flex;align-items:center;justify-content:space-between;gap:22rpx;min-height:88rpx;padding:0 24rpx;border-bottom:1rpx solid #eef1f5}.row text:first-child{flex:none;color:#718198;font-size:26rpx}.row text:last-child{min-width:0;color:#263a54;font-size:26rpx;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tabs{display:flex;gap:12rpx;padding:14rpx 0}.tabs text{padding:10rpx 24rpx;color:#66778c;font-size:25rpx;background:#fff;border-radius:999rpx}.tabs .on{color:#1769d8;background:#eaf3ff;font-weight:600}.preview,.snapshot{padding:24rpx;box-sizing:border-box}.snapshot text{white-space:pre-wrap;color:#263a54;font-size:23rpx;line-height:1.6}.state{padding:80rpx 20rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:40rpx 20rpx}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.card{overflow:hidden;margin-bottom:20rpx;background:#fff;border-radius:16rpx}.row{display:flex;align-items:center;justify-content:space-between;gap:22rpx;min-height:88rpx;padding:0 24rpx;border-bottom:1rpx solid #eef1f5}.row text:first-child{flex:none;color:#718198;font-size:26rpx}.row text:last-child{min-width:0;color:#263a54;font-size:26rpx;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tabs{display:flex;gap:12rpx;padding:14rpx 0}.tabs text{padding:10rpx 24rpx;color:#66778c;font-size:25rpx;background:#fff;border-radius:999rpx}.tabs .on{color:var(--color-primary, #1769d8);background:#eaf3ff;font-weight:600}.preview,.snapshot{padding:24rpx;box-sizing:border-box}.snapshot text{white-space:pre-wrap;color:#263a54;font-size:23rpx;line-height:1.6}.state{padding:80rpx 20rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:40rpx 20rpx}
</style>
src/pages/mes/qc/report/instance/index.vue
@@ -72,5 +72,5 @@
</template><view v-else class="state">登录后查看报告实例</view></view></template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:80rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;font-size:22rpx;border-radius:999rpx;color:#1769d8;background:#eef6ff}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.enabled,.tag-success{color:#0e9663!important;background:#e9fbf2!important;border:1rpx solid #b8eed4}.warning{color:#b06a00;background:#fff6df;border:1rpx solid #f0d390}.danger{color:#c65050;background:#fff2f2;border:1rpx solid #efb8b8}.info{color:#1769d8;background:#eef6ff;border:1rpx solid #c9e1ff}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:0;flex:1;padding-bottom:80rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;font-size:22rpx;border-radius:999rpx;color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #eef6ff)}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.enabled,.tag-success{color:#0e9663!important;background:#e9fbf2!important;border:1rpx solid #b8eed4}.warning{color:#b06a00;background:#fff6df;border:1rpx solid #f0d390}.danger{color:#c65050;background:#fff2f2;border:1rpx solid #efb8b8}.info{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #eef6ff);border:1rpx solid var(--color-primary-border, #c9e1ff)}
</style>
src/pages/mes/qc/report/template/form.vue
@@ -52,5 +52,5 @@
</view><button v-if="canSave" class="save" :loading="saving" :disabled="saving" @click="save">保存</button><button v-else-if="readonly && hasPermission('qc-report:template:update')" class="save" @click="mode='edit'">编辑</button><view v-else class="state">暂无保存权限</view></view></template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:210rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:36rpx;text-align:right}.required{color:#e23b3b}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:150rpx;box-sizing:border-box;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.save::after{border:0}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:210rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:36rpx;text-align:right}.required{color:#e23b3b}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:150rpx;box-sizing:border-box;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.save::after{border:0}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}
</style>
src/pages/mes/qc/report/template/index.vue
@@ -64,5 +64,5 @@
</template><view v-else class="state">登录后查看报告模板</view><button v-if="canCreate" class="fab" @click="go()"><view /></button></view></template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;font-size:22rpx;border-radius:999rpx;color:#1769d8;background:#eef6ff}.grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.grid .full{grid-column:1/3}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.enabled,.tag-success{color:#0e9663!important;background:#e9fbf2!important;border:1rpx solid #b8eed4}.warning{color:#b06a00;background:#fff6df;border:1rpx solid #f0d390}.danger{color:#c65050;background:#fff2f2;border:1rpx solid #efb8b8}.info,.tag-info{color:#1769d8!important;background:#eef6ff!important;border:1rpx solid #c9e1ff}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:0;flex:1;padding-bottom: 132rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;font-size:22rpx;border-radius:999rpx;color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #eef6ff)}.grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.grid .full{grid-column:1/3}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.enabled,.tag-success{color:#0e9663!important;background:#e9fbf2!important;border:1rpx solid #b8eed4}.warning{color:#b06a00;background:#fff6df;border:1rpx solid #f0d390}.danger{color:#c65050;background:#fff2f2;border:1rpx solid #efb8b8}.info,.tag-info{color:var(--color-primary, #1769d8)!important;background:var(--color-primary-soft, #eef6ff)!important;border:1rpx solid var(--color-primary-border, #c9e1ff)}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width: 104rpx; height: 104rpx; min-height: 104rpx;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/qc/rqc/form.vue
@@ -372,5 +372,5 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card,.section-card{overflow:hidden;margin-bottom:22rpx;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:220rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:36rpx;text-align:right}.required{color:#e23b3b}.code-field button,.section-tools button,.sub-actions button{flex:none;min-width:100rpx;padding:0 14rpx;margin:0;color:#1769d8;font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.danger{color:#d64b4b!important;border-color:#efb0b0!important}.code-field button::after,.save::after,.submit::after,.section-tools button::after,.sub-actions button::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.save,.submit{margin-top:24rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.submit{background:#12a06a}.tabs{display:flex;gap:14rpx;padding:18rpx 20rpx 0;border-bottom:1rpx solid #eef1f5}.tabs text{margin-bottom:18rpx;padding:12rpx 26rpx;color:#55677f;background:#f2f5f9;border-radius:999rpx;font-size:25rpx}.tabs .on{color:#1769d8;background:#eaf3ff;font-weight:700}.section-tools{display:flex;justify-content:flex-end;padding:18rpx 20rpx 0}.sub-card{margin:20rpx;padding:20rpx;border:1rpx solid #edf1f6;border-radius:14rpx}.sub-title{display:block;margin-bottom:14rpx;color:#0f2744;font-size:29rpx;font-weight:700}.sub-grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx 18rpx;color:#40536c;font-size:25rpx}.sub-grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sub-grid .span{grid-column:1/3}.sub-actions{display:flex;justify-content:flex-end;gap:12rpx;margin-top:16rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:24rpx}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:20;display:flex;align-items:flex-end;background:rgba(20,32,48,.45)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:30rpx;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:96rpx;line-height:96rpx;text-align:center;color:#122033;font-size:30rpx;font-weight:700;border-bottom:1rpx solid #eef1f5}.in-modal{margin:24rpx}.result-item{margin:20rpx;border:1rpx solid #edf1f6;border-radius:14rpx;overflow:hidden}.result-title{display:block;padding:18rpx 24rpx;color:#0f2744;font-size:27rpx;font-weight:700;background:#f8fafc}.inner{padding-left:20rpx;padding-right:20rpx}.load-more{margin:0 20rpx 20rpx;padding:18rpx 0;color:#1769d8;font-size:25rpx;text-align:center;background:#f5f8ff;border:1rpx dashed #bcd3f2;border-radius:12rpx}.field.hint-field{border-bottom:0}.field-hint{padding:0 24rpx 20rpx 264rpx;color:#8a94a6;font-size:22rpx;line-height:1.45;border-bottom:1rpx solid #eef1f5}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card,.section-card{overflow:hidden;margin-bottom:22rpx;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:220rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:36rpx;text-align:right}.required{color:#e23b3b}.code-field button,.section-tools button,.sub-actions button{flex:none;min-width:100rpx;padding:0 14rpx;margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid var(--color-primary, #1769d8);border-radius:8rpx}.danger{color:#d64b4b!important;border-color:#efb0b0!important}.code-field button::after,.save::after,.submit::after,.section-tools button::after,.sub-actions button::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.save,.submit{margin-top:24rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.submit{background:#12a06a}.tabs{display:flex;gap:14rpx;padding:18rpx 20rpx 0;border-bottom:1rpx solid #eef1f5}.tabs text{margin-bottom:18rpx;padding:12rpx 26rpx;color:#55677f;background:#f2f5f9;border-radius:999rpx;font-size:25rpx}.tabs .on{color:var(--color-primary, #1769d8);background:#eaf3ff;font-weight:700}.section-tools{display:flex;justify-content:flex-end;padding:18rpx 20rpx 0}.sub-card{margin:20rpx;padding:20rpx;border:1rpx solid #edf1f6;border-radius:14rpx}.sub-title{display:block;margin-bottom:14rpx;color:#0f2744;font-size:29rpx;font-weight:700}.sub-grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx 18rpx;color:#40536c;font-size:25rpx}.sub-grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sub-grid .span{grid-column:1/3}.sub-actions{display:flex;justify-content:flex-end;gap:12rpx;margin-top:16rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:24rpx}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:20;display:flex;align-items:flex-end;background:rgba(20,32,48,.45)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:30rpx;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:96rpx;line-height:96rpx;text-align:center;color:#122033;font-size:30rpx;font-weight:700;border-bottom:1rpx solid #eef1f5}.in-modal{margin:24rpx}.result-item{margin:20rpx;border:1rpx solid #edf1f6;border-radius:14rpx;overflow:hidden}.result-title{display:block;padding:18rpx 24rpx;color:#0f2744;font-size:27rpx;font-weight:700;background:#f8fafc}.inner{padding-left:20rpx;padding-right:20rpx}.load-more{margin:0 20rpx 20rpx;padding:18rpx 0;color:var(--color-primary, #1769d8);font-size:25rpx;text-align:center;background:var(--color-primary-soft, #f5f8ff);border:1rpx dashed #bcd3f2;border-radius:12rpx}.field.hint-field{border-bottom:0}.field-hint{padding:0 24rpx 20rpx 264rpx;color:#8a94a6;font-size:22rpx;line-height:1.45;border-bottom:1rpx solid #eef1f5}
</style>
src/pages/mes/qc/rqc/index.vue
@@ -75,5 +75,5 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;background:#f3f6fb}.search{display:flex;align-items:center;height:76rpx;margin:18rpx 20rpx 0;padding:0 20rpx;gap:16rpx;background:#fff;border-radius:14rpx}.search input{min-width:0;flex:1;font-size:26rpx;color:#1e3049}.search text{flex:none;color:#1769d8;font-size:24rpx}.content{height:calc(100vh - 100rpx);padding:18rpx 20rpx 32rpx;box-sizing:border-box}.card{margin-bottom:18rpx;padding:22rpx 22rpx 18rpx;background:#fff;border-radius:14rpx;box-shadow:0 8rpx 20rpx rgba(33,54,86,.05)}.head{display:flex;justify-content:space-between;gap:16rpx;border-bottom:1rpx solid #edf1f6;padding-bottom:16rpx}.head>view:first-child{display:grid;gap:6rpx;min-width:0;color:#63758c;font-size:24rpx}.name{color:#10253f;font-size:31rpx;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;justify-content:flex-end;flex:none;min-width:92rpx}.status,.tags text{display:inline-flex;align-items:center;justify-content:center;min-height:40rpx;padding:0 18rpx;border-radius:999rpx;font-size:22rpx;border:1rpx solid #bdd8ff;color:#1769d8;background:#eef6ff}.tag-green{color:#159166;background:#e9fbf2;border-color:#bcebd4}.tag-blue{color:#1769d8;background:#eef6ff;border-color:#bdd8ff}.tag-orange{color:#b36b00;background:#fff7e8;border-color:#f3d49b}.tag-red{color:#d64b4b;background:#fff1f0;border-color:#efb0b0}.tags{display:flex;gap:10rpx;flex-wrap:wrap;margin-top:14rpx}.grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx 18rpx;margin-top:16rpx;color:#40536c;font-size:25rpx}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.grid text.full{grid-column:1/-1;white-space:normal}.actions{display:flex;justify-content:flex-end;gap:12rpx;margin-top:16rpx;border-top:1rpx solid #edf1f6;padding-top:16rpx}.actions button{min-width:96rpx;margin:0;padding:0 16rpx;color:#1769d8;font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.actions .danger{color:#d64b4b;border-color:#efb0b0}.actions button::after{border:0}.state,.more{display:block;padding:42rpx 0;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#d64b4b}.fab{position:fixed;right:28rpx;bottom:44rpx;width:104rpx;height:104rpx;border-radius:50%;background:#1769d8;box-shadow:0 12rpx 26rpx rgba(23,105,216,.35)}.fab::after{border:0}.fab view,.fab view::after{position:absolute;left:50%;top:50%;content:"";background:#fff;border-radius:4rpx;transform:translate(-50%,-50%)}.fab view{width:42rpx;height:8rpx}.fab view::after{width:8rpx;height:42rpx}
.page{min-height:100vh;background:#f3f6fb}.search{display:flex;align-items:center;height:76rpx;margin:18rpx 20rpx 0;padding:0 20rpx;gap:16rpx;background:#fff;border-radius:14rpx}.search input{min-width:0;flex:1;font-size:26rpx;color:#1e3049}.search text{flex:none;color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:calc(100vh - 100rpx);padding:18rpx 20rpx 32rpx;box-sizing:border-box}.card{margin-bottom:18rpx;padding:22rpx 22rpx 18rpx;background:#fff;border-radius:14rpx;box-shadow:0 8rpx 20rpx rgba(33,54,86,.05)}.head{display:flex;justify-content:space-between;gap:16rpx;border-bottom:1rpx solid #edf1f6;padding-bottom:16rpx}.head>view:first-child{display:grid;gap:6rpx;min-width:0;color:#63758c;font-size:24rpx}.name{color:#10253f;font-size:31rpx;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;justify-content:flex-end;flex:none;min-width:92rpx}.status,.tags text{display:inline-flex;align-items:center;justify-content:center;min-height:40rpx;padding:0 18rpx;border-radius:999rpx;font-size:22rpx;border:1rpx solid #bdd8ff;color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #eef6ff)}.tag-green{color:#159166;background:#e9fbf2;border-color:#bcebd4}.tag-blue{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #eef6ff);border-color:#bdd8ff}.tag-orange{color:#b36b00;background:#fff7e8;border-color:#f3d49b}.tag-red{color:#d64b4b;background:#fff1f0;border-color:#efb0b0}.tags{display:flex;gap:10rpx;flex-wrap:wrap;margin-top:14rpx}.grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx 18rpx;margin-top:16rpx;color:#40536c;font-size:25rpx}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.grid text.full{grid-column:1/-1;white-space:normal}.actions{display:flex;justify-content:flex-end;gap:12rpx;margin-top:16rpx;border-top:1rpx solid #edf1f6;padding-top:16rpx}.actions button{min-width:96rpx;margin:0;padding:0 16rpx;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid var(--color-primary, #1769d8);border-radius:8rpx}.actions .danger{color:#d64b4b;border-color:#efb0b0}.actions button::after{border:0}.state,.more{display:block;padding:42rpx 0;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#d64b4b}.fab{position:fixed;right:28rpx;bottom:44rpx;width:104rpx;height:104rpx;border-radius:50%;background:var(--color-primary, #1769d8);box-shadow:0 12rpx 26rpx rgba(23,105,216,.35)}.fab::after{border:0}.fab view,.fab view::after{position:absolute;left:50%;top:50%;content:"";background:#fff;border-radius:4rpx;transform:translate(-50%,-50%)}.fab view{width:42rpx;height:8rpx}.fab view::after{width:8rpx;height:42rpx}
</style>
src/pages/mes/qc/template/form.vue
@@ -297,5 +297,5 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card,.section-card{overflow:hidden;margin-bottom:22rpx;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:220rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.value.full{width:100%;text-align:left}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:36rpx;text-align:right}.required{color:#e23b3b}.code-field button,.section-head button,.actions button{flex:none;min-width:100rpx;padding:0 14rpx;margin:0;color:#1769d8;font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.danger{color:#d64b4b!important;border-color:#efb0b0!important}.code-field button::after,.save::after,.section-head button::after,.actions button::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.check-row{display:flex;flex-wrap:wrap;gap:14rpx 22rpx;color:#1e3049;font-size:26rpx}.check-row label{display:flex;align-items:center;gap:6rpx}.save{margin-top:24rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.tabs{display:flex;gap:14rpx;padding:18rpx 20rpx 0}.tabs text{padding:12rpx 26rpx;color:#55677f;background:#f2f5f9;border-radius:999rpx;font-size:25rpx}.tabs .on{color:#1769d8;background:#eaf3ff;font-weight:700}.section-head{display:flex;align-items:center;justify-content:space-between;min-height:82rpx;padding:0 24rpx;color:#1d2f46;font-size:28rpx;font-weight:600;border-bottom:1rpx solid #eef1f5}.sub-card{margin:20rpx;padding:20rpx;border:1rpx solid #edf1f6;border-radius:14rpx}.sub-title{display:block;margin-bottom:14rpx;color:#0f2744;font-size:29rpx;font-weight:700}.sub-grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx 18rpx;color:#40536c;font-size:25rpx}.sub-grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sub-grid .span{grid-column:1/3}.actions{display:flex;justify-content:flex-end;gap:12rpx;margin-top:16rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:24rpx}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:20;display:flex;align-items:flex-end;background:rgba(20,32,48,.45)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:30rpx;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:96rpx;line-height:96rpx;text-align:center;color:#122033;font-size:30rpx;font-weight:700;border-bottom:1rpx solid #eef1f5}.in-modal{margin:24rpx}.load-more{margin:0 20rpx 20rpx;padding:18rpx 0;color:#1769d8;font-size:25rpx;text-align:center;background:#f5f8ff;border:1rpx dashed #bcd3f2;border-radius:12rpx}.load-more.end{color:#8795a8;background:transparent;border:0}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card,.section-card{overflow:hidden;margin-bottom:22rpx;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:220rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.value.full{width:100%;text-align:left}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:36rpx;text-align:right}.required{color:#e23b3b}.code-field button,.section-head button,.actions button{flex:none;min-width:100rpx;padding:0 14rpx;margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid var(--color-primary, #1769d8);border-radius:8rpx}.danger{color:#d64b4b!important;border-color:#efb0b0!important}.code-field button::after,.save::after,.section-head button::after,.actions button::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.check-row{display:flex;flex-wrap:wrap;gap:14rpx 22rpx;color:#1e3049;font-size:26rpx}.check-row label{display:flex;align-items:center;gap:6rpx}.save{margin-top:24rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.tabs{display:flex;gap:14rpx;padding:18rpx 20rpx 0}.tabs text{padding:12rpx 26rpx;color:#55677f;background:#f2f5f9;border-radius:999rpx;font-size:25rpx}.tabs .on{color:var(--color-primary, #1769d8);background:#eaf3ff;font-weight:700}.section-head{display:flex;align-items:center;justify-content:space-between;min-height:82rpx;padding:0 24rpx;color:#1d2f46;font-size:28rpx;font-weight:600;border-bottom:1rpx solid #eef1f5}.sub-card{margin:20rpx;padding:20rpx;border:1rpx solid #edf1f6;border-radius:14rpx}.sub-title{display:block;margin-bottom:14rpx;color:#0f2744;font-size:29rpx;font-weight:700}.sub-grid{display:grid;grid-template-columns:1fr 1fr;gap:10rpx 18rpx;color:#40536c;font-size:25rpx}.sub-grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sub-grid .span{grid-column:1/3}.actions{display:flex;justify-content:flex-end;gap:12rpx;margin-top:16rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}.compact{padding:24rpx}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:20;display:flex;align-items:flex-end;background:rgba(20,32,48,.45)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:30rpx;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:96rpx;line-height:96rpx;text-align:center;color:#122033;font-size:30rpx;font-weight:700;border-bottom:1rpx solid #eef1f5}.in-modal{margin:24rpx}.load-more{margin:0 20rpx 20rpx;padding:18rpx 0;color:var(--color-primary, #1769d8);font-size:25rpx;text-align:center;background:var(--color-primary-soft, #f5f8ff);border:1rpx dashed #bcd3f2;border-radius:12rpx}.load-more.end{color:#8795a8;background:transparent;border:0}
</style>
src/pages/mes/qc/template/index.vue
@@ -70,5 +70,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;font-size:22rpx;border-radius:999rpx}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:0;flex:1;padding-bottom: 132rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tags{display:flex;flex-wrap:wrap;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;font-size:22rpx;border-radius:999rpx}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width: 104rpx; height: 104rpx; min-height: 104rpx;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/tm/tool/form.vue
@@ -93,5 +93,5 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:200rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.required{color:#e23b3b}.code-field button{flex:none;min-width:100rpx;padding:0 14rpx;margin:0;color:#1769d8;font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.code-field button::after,.save::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:200rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.required{color:#e23b3b}.code-field button{flex:none;min-width:100rpx;padding:0 14rpx;margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid var(--color-primary, #1769d8);border-radius:8rpx}.code-field button::after,.save::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}
</style>
src/pages/mes/tm/tool/index.vue
@@ -112,5 +112,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 24rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;flex:none;align-items:center;height:80rpx;margin:20rpx 0 14rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.main-layout{height:0;min-height:0;flex:1;display:flex;gap:16rpx;padding-bottom:150rpx;box-sizing:border-box}.type-nav{width:188rpx;height:100%;flex:none;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.05)}.type-item{position:relative;display:flex;align-items:center;min-height:78rpx;padding:14rpx 12rpx 14rpx 18rpx;box-sizing:border-box;color:#617287;font-size:23rpx;border-bottom:1rpx solid #edf1f6}.type-item text{display:-webkit-box;min-width:0;overflow:hidden;line-height:1.25;text-overflow:ellipsis;-webkit-line-clamp:2;-webkit-box-orient:vertical}.type-item.active{color:#1769d8;font-weight:600;background:#eef5ff}.type-item.active::before{position:absolute;top:18rpx;bottom:18rpx;left:0;width:6rpx;background:#1769d8;border-radius:0 6rpx 6rpx 0;content:""}.content{height:100%;min-width:0;flex:1;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tag-store{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-issue{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.tag-repair{color:#b57800;background:#fff7dd;border:1rpx solid #f3dc98}.tag-scrap{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tag-info{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.tags{display:flex;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;color:#1769d8;font-size:22rpx;background:#edf5ff;border:1rpx solid #bfdbff;border-radius:999rpx}.grid{display:grid;gap:9rpx;padding:14rpx 0;margin-top:14rpx;color:#66778c;font-size:22rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));z-index:10;display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
.page{height:100vh;display:flex;flex-direction:column;padding:0 24rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;flex:none;align-items:center;height:80rpx;margin:20rpx 0 14rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.main-layout{height:0;min-height:0;flex:1;display:flex;gap:16rpx;padding-bottom: 132rpx;box-sizing:border-box}.type-nav{width:188rpx;height:100%;flex:none;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.05)}.type-item{position:relative;display:flex;align-items:center;min-height:78rpx;padding:14rpx 12rpx 14rpx 18rpx;box-sizing:border-box;color:#617287;font-size:23rpx;border-bottom:1rpx solid #edf1f6}.type-item text{display:-webkit-box;min-width:0;overflow:hidden;line-height:1.25;text-overflow:ellipsis;-webkit-line-clamp:2;-webkit-box-orient:vertical}.type-item.active{color:var(--color-primary, #1769d8);font-weight:600;background:var(--color-primary-soft, #eef5ff)}.type-item.active::before{position:absolute;top:18rpx;bottom:18rpx;left:0;width:6rpx;background:var(--color-primary, #1769d8);border-radius:0 6rpx 6rpx 0;content:""}.content{height:100%;min-width:0;flex:1;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.tag-store{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-issue{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #edf5ff);border:1rpx solid var(--color-primary-border, #bfdbff)}.tag-repair{color:#b57800;background:#fff7dd;border:1rpx solid #f3dc98}.tag-scrap{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tag-info{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.tags{display:flex;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;color:var(--color-primary, #1769d8);font-size:22rpx;background:var(--color-primary-soft, #edf5ff);border:1rpx solid var(--color-primary-border, #bfdbff);border-radius:999rpx}.grid{display:grid;gap:9rpx;padding:14rpx 0;margin-top:14rpx;color:#66778c;font-size:22rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));z-index:10;display:flex;align-items:center;justify-content:center;width: 104rpx; height: 104rpx; min-height: 104rpx;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/mes/tm/tool/type/form.vue
@@ -69,5 +69,5 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:200rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.required{color:#e23b3b}.switch{justify-content:space-between}.switch>text:first-child{width:auto}.code-field button{flex:none;min-width:100rpx;padding:0 14rpx;margin:0;color:#1769d8;font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.code-field button::after,.save::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:200rpx;flex:none;color:#33455d;font-size:27rpx}.field input,.field picker,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx}.field input,.value{text-align:right}.picker{display:flex;align-items:center;justify-content:space-between;color:#65758a}.picker text:first-child,.value{overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{margin-left:16rpx;color:#8092a7;font-size:36rpx}.required{color:#e23b3b}.switch{justify-content:space-between}.switch>text:first-child{width:auto}.code-field button{flex:none;min-width:100rpx;padding:0 14rpx;margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid var(--color-primary, #1769d8);border-radius:8rpx}.code-field button::after,.save::after{border:0}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:140rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.state{padding:38rpx;color:#8795a8;font-size:26rpx;text-align:center}
</style>
src/pages/mes/tm/tool/type/index.vue
@@ -92,5 +92,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.enabled{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.disabled{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:0;flex:1;padding-bottom: 132rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;flex:none;height:48rpx}.status{display:inline-flex;align-items:center;height:36rpx;padding:0 16rpx;font-size:22rpx;border-radius:999rpx;white-space:nowrap}.enabled{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.disabled{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width: 104rpx; height: 104rpx; min-height: 104rpx;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/message/index.vue
@@ -210,7 +210,7 @@
    border-radius: 17rpx;
  }
  .read-all {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 25rpx;
  }
  .read-all.disabled {
@@ -234,7 +234,7 @@
    line-height: 73rpx;
  }
  .filter-bar .active {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-weight: 600;
  }
  .filter-bar .active::after {
@@ -244,7 +244,7 @@
    left: 4rpx;
    height: 5rpx;
    content: "";
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 5rpx;
  }
  .message-list {
@@ -270,7 +270,7 @@
    height: 64rpx;
    align-items: center;
    justify-content: center;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    background: #e8f1ff;
    border-radius: 18rpx;
  }
@@ -402,7 +402,7 @@
    color: #fff;
    font-size: 26rpx;
    line-height: 76rpx;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 14rpx;
  }
  .login-state button::after {
src/pages/profile/center.vue
@@ -73,7 +73,7 @@
    color: #fff;
    font-size: 42rpx;
    font-weight: 700;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
  }
  .profile-card text:nth-of-type(1) {
    margin-top: 22rpx;
src/pages/profile/index.vue
@@ -146,7 +146,7 @@
    color: #fff;
    font-size: 34rpx;
    font-weight: 600;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
  }
  .user-info {
    flex: 1;
@@ -169,7 +169,7 @@
  }
  .role {
    padding: 3rpx 11rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 19rpx;
    background: #e8f1ff;
    border-radius: 10rpx;
@@ -253,7 +253,7 @@
  }
  .login {
    color: #fff;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
  }
  .logout {
    color: #e05258;
src/pages/profile/settings.vue
@@ -2,14 +2,30 @@
  import { reactive } from "vue";
  import { onShow } from "@dcloudio/uni-app";
  import type { ThemeKey } from "../../stores/theme";
  import { useAppTheme } from "../../stores/theme";
  const PROFILE_SETTINGS_KEY = "mom_profile_settings";
  const settings = reactive({
    messageNotify: true,
    compactDisplay: false,
    keepLastModule: true,
  });
  const {
    themes,
    theme,
    themeKey,
    themeStyle,
    primaryColor,
    setTheme,
    resetTheme,
    restoreTheme,
  } = useAppTheme();
  onShow(() => loadSettings());
  onShow(() => {
    loadSettings();
    restoreTheme();
  });
  function loadSettings() {
    try {
@@ -29,44 +45,80 @@
    saveSettings();
  }
  function selectTheme(key: ThemeKey) {
    if (key === themeKey.value) return;
    setTheme(key);
    uni.showToast({ title: "主题已切换", icon: "success" });
  }
  async function clearLocalPreference() {
    const { confirm } = await uni.showModal({
      title: "恢复默认设置",
      content: "仅恢复本机显示偏好,不会退出登录。",
      content: "将恢复默认显示偏好和商务蓝主题,不会退出登录。",
    });
    if (!confirm) return;
    settings.messageNotify = true;
    settings.compactDisplay = false;
    settings.keepLastModule = true;
    uni.removeStorageSync(PROFILE_SETTINGS_KEY);
    resetTheme();
    uni.showToast({ title: "已恢复默认设置", icon: "success" });
  }
</script>
<template>
  <view class="page">
  <view class="page" :style="themeStyle">
    <view class="section-title">主题颜色</view>
    <view class="theme-card">
      <view
        v-for="item in themes"
        :key="item.key"
        class="theme-option"
        :class="{ active: themeKey === item.key }"
        @click="selectTheme(item.key)"
      >
        <view class="theme-swatch" :style="{ background: item.primary }">
          <text v-if="themeKey === item.key">✓</text>
        </view>
        <view class="theme-copy">
          <text>{{ item.name }}</text>
          <text>{{ item.description }}</text>
        </view>
        <text class="theme-check">{{ themeKey === item.key ? "已使用" : "" }}</text>
      </view>
    </view>
    <view class="section-title">显示偏好</view>
    <view class="card">
      <view class="setting-row">
        <view><text>消息提醒</text><text>保留消息页红点与提醒显示</text></view>
        <switch :checked="settings.messageNotify"
                color="#1769d8"
                :color="primaryColor"
                @change="updateSetting('messageNotify', $event.detail.value)" />
      </view>
      <view class="setting-row">
        <view><text>紧凑显示</text><text>记录列表偏好,后续页面可读取使用</text></view>
        <switch :checked="settings.compactDisplay"
                color="#1769d8"
                :color="primaryColor"
                @change="updateSetting('compactDisplay', $event.detail.value)" />
      </view>
      <view class="setting-row">
        <view><text>记住上次模块</text><text>保留最近使用模块的本地偏好</text></view>
        <switch :checked="settings.keepLastModule"
                color="#1769d8"
                :color="primaryColor"
                @change="updateSetting('keepLastModule', $event.detail.value)" />
      </view>
    </view>
    <button class="plain-button"
            @click="clearLocalPreference">恢复默认设置</button>
    <view class="theme-preview">
      <view>
        <text>当前主题</text>
        <text>{{ theme.name }}</text>
      </view>
      <view class="preview-button">主要操作</view>
    </view>
    <button class="plain-button" @click="clearLocalPreference">恢复默认设置</button>
  </view>
</template>
@@ -74,12 +126,71 @@
  .page {
    min-height: 100vh;
    padding: 24rpx;
    background: #f6f7f9;
    background: var(--color-bg-page, #f6f7f9);
  }
  .section-title {
    margin: 8rpx 4rpx 14rpx;
    color: var(--color-text-secondary, #65758b);
    font-size: 24rpx;
    font-weight: 600;
  }
  .theme-card,
  .card {
    overflow: hidden;
    background: #fff;
    margin-bottom: 28rpx;
    background: var(--color-bg-card, #fff);
    border-radius: 20rpx;
  }
  .theme-option {
    display: flex;
    min-height: 112rpx;
    align-items: center;
    gap: 20rpx;
    padding: 18rpx 28rpx;
    border-bottom: 1rpx solid var(--color-border, #edf0f4);
  }
  .theme-option:last-child,
  .setting-row:last-child {
    border-bottom: 0;
  }
  .theme-option.active {
    background: var(--color-primary-soft, #eef5ff);
  }
  .theme-swatch {
    display: flex;
    flex: none;
    width: 54rpx;
    height: 54rpx;
    align-items: center;
    justify-content: center;
    color: #fff;
    font-size: 28rpx;
    font-weight: 700;
    border: 6rpx solid rgba(255, 255, 255, 0.78);
    border-radius: 50%;
    box-shadow: 0 0 0 2rpx rgba(32, 49, 72, 0.12);
  }
  .theme-copy {
    flex: 1;
    min-width: 0;
  }
  .theme-copy text {
    display: block;
  }
  .theme-copy text:first-child {
    color: var(--color-text-primary, #24344e);
    font-size: 28rpx;
    font-weight: 700;
  }
  .theme-copy text:last-child {
    margin-top: 5rpx;
    color: var(--color-text-muted, #8a96a8);
    font-size: 22rpx;
  }
  .theme-check {
    flex: none;
    color: var(--color-primary, #1769d8);
    font-size: 23rpx;
  }
  .setting-row {
    display: flex;
@@ -88,10 +199,7 @@
    justify-content: space-between;
    gap: 20rpx;
    padding: 20rpx 28rpx;
    border-bottom: 1rpx solid #edf0f4;
  }
  .setting-row:last-child {
    border-bottom: 0;
    border-bottom: 1rpx solid var(--color-border, #edf0f4);
  }
  .setting-row > view {
    flex: 1;
@@ -101,23 +209,54 @@
    display: block;
  }
  .setting-row text:first-child {
    color: #24344e;
    color: var(--color-text-primary, #24344e);
    font-size: 28rpx;
    font-weight: 700;
  }
  .setting-row text:last-child {
    margin-top: 8rpx;
    color: #8a96a8;
    color: var(--color-text-muted, #8a96a8);
    font-size: 23rpx;
    line-height: 1.4;
  }
  .theme-preview {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 24rpx;
    padding: 24rpx 28rpx;
    background: var(--color-bg-card, #fff);
    border: 1rpx solid var(--color-primary-border, #bfdbff);
    border-radius: 18rpx;
  }
  .theme-preview text {
    display: block;
  }
  .theme-preview text:first-child {
    color: var(--color-text-muted, #8a96a8);
    font-size: 22rpx;
  }
  .theme-preview text:last-child {
    margin-top: 4rpx;
    color: var(--color-text-primary, #24344e);
    font-size: 28rpx;
    font-weight: 700;
  }
  .preview-button {
    flex: none;
    padding: 14rpx 26rpx;
    color: #fff;
    font-size: 24rpx;
    background: var(--color-primary, #1769d8);
    border-radius: 10rpx;
  }
  .plain-button {
    height: 84rpx;
    margin-top: 32rpx;
    color: #1769d8;
    margin-top: 28rpx;
    color: var(--color-primary, #1769d8);
    font-size: 28rpx;
    line-height: 84rpx;
    background: #fff;
    background: var(--color-bg-card, #fff);
    border-radius: 16rpx;
  }
  .plain-button::after {
src/pages/purchase/components/PurchaseDetail.vue
@@ -166,7 +166,7 @@
    display: block;
    padding: 18rpx 0;
    border-top: 1rpx solid #f2f3f5;
    color: #165dff;
    color: var(--color-primary, #165dff);
    font-size: 25rpx;
  }
  .empty,
src/pages/purchase/components/PurchaseForm.vue
@@ -738,7 +738,7 @@
    color: #4e5969;
  }
  .emphasis {
    color: #165dff;
    color: var(--color-primary, #165dff);
    font-weight: 600;
  }
  .full-field,
@@ -787,7 +787,7 @@
  .check {
    min-height: 64rpx;
    padding: 0 16rpx;
    color: #165dff;
    color: var(--color-primary, #165dff);
    font-size: 26rpx;
    line-height: 64rpx;
    background: #edf4ff;
@@ -816,7 +816,7 @@
    display: flex;
    flex-direction: column;
    align-items: flex-end;
    color: #165dff;
    color: var(--color-primary, #165dff);
    font-size: 24rpx;
    font-weight: 400;
    line-height: 38rpx;
@@ -825,7 +825,7 @@
  .item button {
    margin: 0;
    padding: 0 16rpx;
    color: #165dff;
    color: var(--color-primary, #165dff);
    font-size: 23rpx;
    line-height: 52rpx;
    background: #edf4ff;
@@ -841,7 +841,7 @@
    display: flex;
    justify-content: space-between;
    padding: 18rpx 24rpx;
    color: #165dff;
    color: var(--color-primary, #165dff);
    font-size: 25rpx;
    border-bottom: 1rpx solid #f2f3f5;
  }
@@ -867,7 +867,7 @@
    color: #fff;
    font-size: 30rpx;
    line-height: 84rpx;
    background: #165dff;
    background: var(--color-primary, #165dff);
    border-radius: 14rpx;
  }
  .save::after,
src/pages/purchase/invoice/index.vue
@@ -156,13 +156,13 @@
    flex: 1;
  }
  .search text {
    color: #165dff;
    color: var(--color-primary, #165dff);
  }
  .content {
    min-height: 0;
    height: 0;
    flex: 1;
    padding-bottom: 150rpx;
    padding-bottom: 132rpx;
    box-sizing: border-box;
  }
  .card {
@@ -266,7 +266,7 @@
  }
  .actions button {
    margin: 0;
    color: #165dff;
    color: var(--color-primary, #165dff);
    font-size: 23rpx;
    background: #f2f6ff;
  }
@@ -290,12 +290,10 @@
    display: flex;
    align-items: center;
    justify-content: center;
    width: 132rpx;
    height: 132rpx;
    min-height: 132rpx;
    width: 104rpx; height: 104rpx; min-height: 104rpx;
    padding: 0;
    color: #fff;
    background: #165dff;
    background: var(--color-primary, #165dff);
    border-radius: 50%;
  }
  .fab-plus,
src/pages/purchase/order/index.vue
@@ -198,7 +198,7 @@
    flex: 1;
  }
  .search text {
    color: #165dff;
    color: var(--color-primary, #165dff);
  }
  .content {
    height: 0;
@@ -222,7 +222,7 @@
  }
  .tag {
    padding: 5rpx 12rpx;
    color: #165dff;
    color: var(--color-primary, #165dff);
    background: #edf4ff;
    border-radius: 8rpx;
    font-size: 22rpx;
@@ -243,7 +243,7 @@
  .actions button {
    margin: 0;
    padding: 0 16rpx;
    color: #165dff;
    color: var(--color-primary, #165dff);
    font-size: 23rpx;
    background: #f2f6ff;
    border-radius: 8rpx;
@@ -271,12 +271,10 @@
    display: flex;
    align-items: center;
    justify-content: center;
    width: 132rpx;
    height: 132rpx;
    min-height: 132rpx;
    width: 104rpx; height: 104rpx; min-height: 104rpx;
    padding: 0;
    color: #fff;
    background: #165dff;
    background: var(--color-primary, #165dff);
    border-radius: 50%;
  }
  .fab-plus,
src/pages/purchase/payment/index.vue
@@ -179,13 +179,13 @@
    flex: 1;
  }
  .search text {
    color: #165dff;
    color: var(--color-primary, #165dff);
  }
  .content {
    min-height: 0;
    height: 0;
    flex: 1;
    padding-bottom: 150rpx;
    padding-bottom: 132rpx;
    box-sizing: border-box;
  }
  .card {
@@ -260,7 +260,7 @@
  }
  .tag {
    padding: 5rpx 12rpx;
    color: #165dff;
    color: var(--color-primary, #165dff);
    background: #edf4ff;
    border-radius: 8rpx;
    font-size: 22rpx;
@@ -272,7 +272,7 @@
  }
  .actions button {
    margin: 0;
    color: #165dff;
    color: var(--color-primary, #165dff);
    font-size: 23rpx;
    background: #f2f6ff;
  }
@@ -296,12 +296,10 @@
    display: flex;
    align-items: center;
    justify-content: center;
    width: 132rpx;
    height: 132rpx;
    min-height: 132rpx;
    width: 104rpx; height: 104rpx; min-height: 104rpx;
    padding: 0;
    color: #fff;
    background: #165dff;
    background: var(--color-primary, #165dff);
    border-radius: 50%;
  }
  .fab-plus,
src/pages/purchase/request/index.vue
@@ -265,13 +265,13 @@
    flex: 1;
  }
  .search text {
    color: #165dff;
    color: var(--color-primary, #165dff);
  }
  .content {
    min-height: 0;
    height: 0;
    flex: 1;
    padding-bottom: 150rpx;
    padding-bottom: 132rpx;
    box-sizing: border-box;
  }
  .card {
@@ -292,7 +292,7 @@
  }
  .tag {
    padding: 5rpx 12rpx;
    color: #165dff;
    color: var(--color-primary, #165dff);
    background: #edf4ff;
    border-radius: 8rpx;
    font-size: 22rpx;
@@ -316,7 +316,7 @@
  .actions button {
    margin: 0;
    padding: 0 16rpx;
    color: #165dff;
    color: var(--color-primary, #165dff);
    font-size: 23rpx;
    background: #f2f6ff;
    border-radius: 8rpx;
@@ -344,12 +344,10 @@
    display: flex;
    align-items: center;
    justify-content: center;
    width: 132rpx;
    height: 132rpx;
    min-height: 132rpx;
    width: 104rpx; height: 104rpx; min-height: 104rpx;
    padding: 0;
    color: #fff;
    background: #165dff;
    background: var(--color-primary, #165dff);
    border-radius: 50%;
  }
  .fab-plus,
@@ -431,7 +429,7 @@
  }
  .process-actions .primary {
    color: #fff;
    background: #165dff;
    background: var(--color-primary, #165dff);
  }
  .process-actions button::after {
    border: 0;
src/pages/report/jmreport/index.vue
@@ -39,5 +39,5 @@
</template>
<style lang="scss" scoped>
  .page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f3f6fb}.hero{padding:32rpx 28rpx;color:#fff;background:linear-gradient(135deg,#1769d8,#27a2ef);border-radius:18rpx;box-shadow:0 14rpx 28rpx rgba(23,105,216,.18)}.hero text{display:block}.hero text:first-child{font-size:38rpx;font-weight:700}.hero text:last-child{margin-top:12rpx;color:#dcecff;font-size:24rpx;line-height:1.55}.card,.tips{margin-top:22rpx;padding:24rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(37,57,89,.06)}.tags{display:flex;flex-wrap:wrap;gap:12rpx;margin-bottom:18rpx}.tags text{padding:8rpx 16rpx;color:#1769d8;font-size:23rpx;background:#eef6ff;border:1rpx solid #cfe2ff;border-radius:999rpx}.row{display:flex;align-items:center;justify-content:space-between;gap:20rpx;min-height:78rpx;border-bottom:1rpx solid #edf1f6}.row text:first-child{flex:none;color:#718198;font-size:25rpx}.row text:last-child{min-width:0;color:#20334c;font-size:26rpx;text-align:right}.card button{margin-top:28rpx;color:#fff;font-size:29rpx;background:#1769d8;border-radius:12rpx}.card button::after{border:0}.tips text{display:block}.tips text:first-child{color:#20334c;font-size:29rpx;font-weight:700}.tips text:last-child{margin-top:12rpx;color:#66778c;font-size:25rpx;line-height:1.7}
  .page{min-height:100vh;padding:24rpx 30rpx 70rpx;box-sizing:border-box;background:#f3f6fb}.hero{padding:32rpx 28rpx;color:#fff;background:linear-gradient(135deg,var(--color-primary, #1769d8),#27a2ef);border-radius:18rpx;box-shadow:0 14rpx 28rpx rgba(23,105,216,.18)}.hero text{display:block}.hero text:first-child{font-size:38rpx;font-weight:700}.hero text:last-child{margin-top:12rpx;color:#dcecff;font-size:24rpx;line-height:1.55}.card,.tips{margin-top:22rpx;padding:24rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(37,57,89,.06)}.tags{display:flex;flex-wrap:wrap;gap:12rpx;margin-bottom:18rpx}.tags text{padding:8rpx 16rpx;color:var(--color-primary, #1769d8);font-size:23rpx;background:var(--color-primary-soft, #eef6ff);border:1rpx solid #cfe2ff;border-radius:999rpx}.row{display:flex;align-items:center;justify-content:space-between;gap:20rpx;min-height:78rpx;border-bottom:1rpx solid #edf1f6}.row text:first-child{flex:none;color:#718198;font-size:25rpx}.row text:last-child{min-width:0;color:#20334c;font-size:26rpx;text-align:right}.card button{margin-top:28rpx;color:#fff;font-size:29rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.card button::after{border:0}.tips text{display:block}.tips text:first-child{color:#20334c;font-size:29rpx;font-weight:700}.tips text:last-child{margin-top:12rpx;color:#66778c;font-size:25rpx;line-height:1.7}
</style>
src/pages/report/jmreport/webview.vue
@@ -51,5 +51,5 @@
</template>
<style lang="scss" scoped>
  .state-panel{min-height:70vh;padding:180rpx 48rpx 60rpx;box-sizing:border-box;text-align:center;background:#f4f7fb}.state-title,.state-text{display:block}.state-title{color:#172b4d;font-size:34rpx;font-weight:700}.state-text{margin-top:18rpx;color:#718198;font-size:25rpx;line-height:1.6}.state-panel button{width:240rpx;margin-top:36rpx;color:#fff;font-size:27rpx;background:#1769d8;border-radius:12rpx}.state-panel button::after{border:0}
  .state-panel{min-height:70vh;padding:180rpx 48rpx 60rpx;box-sizing:border-box;text-align:center;background:#f4f7fb}.state-title,.state-text{display:block}.state-title{color:#172b4d;font-size:34rpx;font-weight:700}.state-text{margin-top:18rpx;color:#718198;font-size:25rpx;line-height:1.6}.state-panel button{width:240rpx;margin-top:36rpx;color:#fff;font-size:27rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.state-panel button::after{border:0}
</style>
src/pages/sale/order/detail.vue
@@ -198,10 +198,10 @@
  .summary { display: flex; justify-content: space-between; align-items: center; gap: 16rpx; padding: 24rpx; }
  .summary view { display: flex; flex: 1; min-width: 0; flex-direction: column; gap: 8rpx; color: #718198; font-size: 24rpx; }
  .title { overflow: hidden; color: #20334c; font-size: 31rpx; font-weight: 600; text-overflow: ellipsis; white-space: nowrap; }
  .tag { flex: none; padding: 5rpx 12rpx; color: #165dff; background: #edf4ff; border-radius: 8rpx; font-size: 22rpx; }
  .tag { flex: none; padding: 5rpx 12rpx; color: var(--color-primary, #165dff); background: #edf4ff; border-radius: 8rpx; font-size: 22rpx; }
  .tag.invalid { color: #f53f3f; background: #fff1f0; }
  .toolbar { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 12rpx; margin-bottom: 20rpx; }
  .toolbar button { margin: 0; padding: 0 22rpx; color: #165dff; font-size: 24rpx; background: #f2f6ff; border-radius: 8rpx; }
  .toolbar button { margin: 0; padding: 0 22rpx; color: var(--color-primary, #165dff); font-size: 24rpx; background: #f2f6ff; border-radius: 8rpx; }
  .toolbar .danger { color: #f53f3f; background: #fff1f0; }
  .toolbar button::after { border: 0; }
  .card { padding: 0 24rpx; }
@@ -212,7 +212,7 @@
  .item { display: block; color: #66778c; }
  .item text { display: block; margin: 8rpx 0; }
  .item text:first-child { color: #20334c; font-weight: 600; }
  .attachment { display: block; padding: 18rpx 0; border-top: 1rpx solid #f2f3f5; color: #165dff; font-size: 25rpx; }
  .attachment { display: block; padding: 18rpx 0; border-top: 1rpx solid #f2f3f5; color: var(--color-primary, #165dff); font-size: 25rpx; }
  .empty, .state { display: block; padding: 42rpx 0; color: #86909c; text-align: center; }
  .error { color: #f53f3f; }
</style>
src/pages/sale/order/form.vue
@@ -359,14 +359,14 @@
  .area, .column { align-items: flex-start; padding: 22rpx 0; }
  .area textarea { height: 130rpx; text-align: left; }
  .attachments { display: flex; flex-direction: column; align-items: flex-end; gap: 12rpx; }
  .attachments button { margin: 0; padding: 0 18rpx; color: #165dff; font-size: 23rpx; background: #f2f6ff; border-radius: 8rpx; }
  .attachments text { color: #165dff; font-size: 24rpx; }
  .attachments button { margin: 0; padding: 0 18rpx; color: var(--color-primary, #165dff); font-size: 23rpx; background: #f2f6ff; border-radius: 8rpx; }
  .attachments text { color: var(--color-primary, #165dff); font-size: 24rpx; }
  .sectionHead { display: flex; justify-content: space-between; align-items: center; padding: 22rpx 0; font-weight: 600; }
  .sectionHead button { margin: 0; padding: 0 18rpx; color: #165dff; font-size: 23rpx; background: #f2f6ff; border-radius: 8rpx; }
  .sectionHead button { margin: 0; padding: 0 18rpx; color: var(--color-primary, #165dff); font-size: 23rpx; background: #f2f6ff; border-radius: 8rpx; }
  .sectionHead button::after, .attachments button::after, .remove::after, .save::after { border: 0; }
  .product { padding-bottom: 18rpx; border-top: 1rpx solid #edf1f6; }
  .remove { margin: 8rpx 0 0 auto; padding: 0 18rpx; color: #f53f3f; font-size: 23rpx; background: #fff1f0; border-radius: 8rpx; }
  .summaryLine { padding: 20rpx 0 24rpx; color: #66778c; font-size: 24rpx; text-align: right; }
  .save { position: fixed; right: 30rpx; bottom: calc(30rpx + env(safe-area-inset-bottom)); left: 30rpx; color: #fff; background: #165dff; border-radius: 12rpx; }
  .save { position: fixed; right: 30rpx; bottom: calc(30rpx + env(safe-area-inset-bottom)); left: 30rpx; color: #fff; background: var(--color-primary, #165dff); border-radius: 12rpx; }
  .no-permission { padding: 34rpx 0; color: #8795a8; font-size: 26rpx; text-align: center; }
</style>
src/pages/sale/order/index.vue
@@ -230,25 +230,25 @@
  .page { position: fixed; top: var(--window-top); right: 0; bottom: var(--window-bottom); left: 0; min-height: 0; display: flex; flex-direction: column; padding: 0 30rpx; overflow: hidden; background: #f5f6f7; }
  .search { display: flex; align-items: center; flex: none; height: 80rpx; margin: 20rpx 0 12rpx; padding: 0 22rpx; background: #fff; border-radius: 16rpx; }
  .search input { flex: 1; }
  .search text { color: #165dff; }
  .search text { color: var(--color-primary, #165dff); }
  .content { height: 0; flex: 1; }
  .card { padding: 24rpx; margin-bottom: 18rpx; background: #fff; border-radius: 16rpx; }
  .head, .meta, .actions { display: flex; justify-content: space-between; align-items: center; }
  .head text:first-child { overflow: hidden; font-weight: 600; text-overflow: ellipsis; white-space: nowrap; }
  .voidNo { color: #f53f3f; }
  .customer { display: block; margin-top: 12rpx; color: #20334c; font-size: 26rpx; }
  .tag { flex: none; padding: 5rpx 12rpx; color: #165dff; background: #edf4ff; border-radius: 8rpx; font-size: 22rpx; }
  .tag { flex: none; padding: 5rpx 12rpx; color: var(--color-primary, #165dff); background: #edf4ff; border-radius: 8rpx; font-size: 22rpx; }
  .grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10rpx 16rpx; padding: 14rpx 0; margin-top: 14rpx; color: #66778c; font-size: 22rpx; border-top: 1rpx solid #f2f3f5; border-bottom: 1rpx solid #f2f3f5; }
  .grid text { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .meta { margin-top: 14rpx; color: #86909c; font-size: 24rpx; }
  .meta text:last-child { color: #ff7d00; }
  .actions { flex-wrap: wrap; justify-content: flex-end; gap: 12rpx; margin-top: 18rpx; }
  .actions button { margin: 0; padding: 0 16rpx; color: #165dff; font-size: 23rpx; background: #f2f6ff; border-radius: 8rpx; }
  .actions button { margin: 0; padding: 0 16rpx; color: var(--color-primary, #165dff); font-size: 23rpx; background: #f2f6ff; border-radius: 8rpx; }
  .actions .danger { color: #f53f3f; background: #fff1f0; }
  .actions button::after, .fab::after { border: 0; }
  .state { padding: 48rpx 0; color: #86909c; text-align: center; }
  .error { color: #f53f3f; }
  .fab { position: fixed; right: 30rpx; bottom: calc(32rpx + env(safe-area-inset-bottom)); z-index: 5; display: flex; align-items: center; justify-content: center; width: 96rpx; height: 96rpx; border-radius: 50%; background: #165dff; box-shadow: 0 12rpx 24rpx rgba(22, 93, 255, 0.28); }
  .fab { position: fixed; right: 30rpx; bottom: calc(32rpx + env(safe-area-inset-bottom)); z-index: 5; display: flex; align-items: center; justify-content: center; width: 96rpx; height: 96rpx; border-radius: 50%; background: var(--color-primary, #165dff); box-shadow: 0 12rpx 24rpx rgba(22, 93, 255, 0.28); }
  .fab-plus { position: relative; width: 34rpx; height: 34rpx; }
  .fab-plus::before, .fab-plus::after { position: absolute; top: 50%; left: 50%; content: ""; background: #fff; border-radius: 2rpx; transform: translate(-50%, -50%); }
  .fab-plus::before { width: 34rpx; height: 4rpx; }
src/pages/sale/sales-target/detail.vue
@@ -118,10 +118,10 @@
  .summary { display: flex; align-items: center; justify-content: space-between; gap: 16rpx; padding: 24rpx; }
  .summary view { display: flex; flex: 1; min-width: 0; flex-direction: column; gap: 8rpx; color: #718198; font-size: 24rpx; }
  .title { overflow: hidden; color: #20334c; font-size: 31rpx; font-weight: 600; text-overflow: ellipsis; white-space: nowrap; }
  .tag { flex: none; padding: 5rpx 12rpx; color: #1769d8; font-size: 22rpx; background: #edf5ff; border-radius: 8rpx; }
  .tag { flex: none; padding: 5rpx 12rpx; color: var(--color-primary, #1769d8); font-size: 22rpx; background: var(--color-primary-soft, #edf5ff); border-radius: 8rpx; }
  .tag.invalid { color: #e54949; background: #fff1f0; }
  .toolbar { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 12rpx; margin-bottom: 20rpx; }
  .toolbar button { margin: 0; padding: 0 24rpx; color: #1769d8; font-size: 24rpx; background: #edf4ff; border-radius: 8rpx; }
  .toolbar button { margin: 0; padding: 0 24rpx; color: var(--color-primary, #1769d8); font-size: 24rpx; background: #edf4ff; border-radius: 8rpx; }
  .toolbar .danger { color: #e54949; background: #fff1f0; }
  .toolbar button::after { border: 0; }
  .card { padding: 0 24rpx; }
src/pages/sale/sales-target/form.vue
@@ -276,7 +276,7 @@
  .picker text { margin-left: 16rpx; color: #8092a7; font-size: 36rpx; }
  .area { align-items: flex-start; padding: 22rpx 0; }
  .area textarea { height: 150rpx; text-align: left; }
  .save { position: fixed; right: 30rpx; bottom: calc(30rpx + env(safe-area-inset-bottom)); left: 30rpx; color: #fff; background: #1769d8; border-radius: 12rpx; }
  .save { position: fixed; right: 30rpx; bottom: calc(30rpx + env(safe-area-inset-bottom)); left: 30rpx; color: #fff; background: var(--color-primary, #1769d8); border-radius: 12rpx; }
  .save::after { border: 0; }
  .no-permission { padding: 34rpx 0; color: #8795a8; font-size: 26rpx; text-align: center; }
</style>
src/pages/sale/sales-target/index.vue
@@ -172,22 +172,22 @@
  .page { height: 100vh; display: flex; flex-direction: column; padding: 0 30rpx; box-sizing: border-box; overflow: hidden; background: #f3f6fb; }
  .search { display: flex; align-items: center; flex: none; height: 80rpx; padding: 0 20rpx; margin: 20rpx 0 12rpx; background: #fff; border-radius: 16rpx; box-shadow: 0 8rpx 20rpx rgba(43, 69, 107, 0.06); }
  .search input { flex: 1; font-size: 27rpx; }
  .search text { color: #1769d8; font-size: 24rpx; }
  .content { height: 0; flex: 1; padding-bottom: 150rpx; box-sizing: border-box; }
  .search text { color: var(--color-primary, #1769d8); font-size: 24rpx; }
  .content { height: 0; flex: 1; padding-bottom: 132rpx; box-sizing: border-box; }
  .row { padding: 24rpx 22rpx 20rpx; margin-bottom: 18rpx; background: #fff; border-radius: 16rpx; box-shadow: 0 10rpx 24rpx rgba(43, 69, 107, 0.08); }
  .head, .actions { display: flex; align-items: center; justify-content: space-between; gap: 16rpx; }
  .head > view { display: flex; flex: 1; min-width: 0; flex-direction: column; gap: 8rpx; }
  .name { overflow: hidden; color: #20334c; font-size: 30rpx; font-weight: 600; text-overflow: ellipsis; white-space: nowrap; }
  .sub { overflow: hidden; color: #718198; font-size: 22rpx; text-overflow: ellipsis; white-space: nowrap; }
  .tag { flex: none; padding: 4rpx 10rpx; color: #1769d8; font-size: 21rpx; background: #edf5ff; border-radius: 7rpx; }
  .tag { flex: none; padding: 4rpx 10rpx; color: var(--color-primary, #1769d8); font-size: 21rpx; background: var(--color-primary-soft, #edf5ff); border-radius: 7rpx; }
  .tag.invalid { color: #e54949; background: #fff1f0; }
  .grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10rpx 16rpx; padding: 16rpx 0; margin-top: 14rpx; color: #66778c; font-size: 22rpx; border-top: 1rpx solid #edf1f6; border-bottom: 1rpx solid #edf1f6; }
  .grid text { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .actions { flex-wrap: wrap; justify-content: flex-end; margin-top: 18rpx; }
  .actions button { margin: 0; padding: 0 18rpx; color: #1769d8; font-size: 23rpx; background: #edf4ff; border-radius: 8rpx; }
  .actions button { margin: 0; padding: 0 18rpx; color: var(--color-primary, #1769d8); font-size: 23rpx; background: #edf4ff; border-radius: 8rpx; }
  .actions .danger { color: #e54949; background: #fff1f0; }
  .actions button::after, .fab::after { border: 0; }
  .state, .more { display: block; padding: 42rpx 0; color: #86909c; text-align: center; }
  .error { color: #e54949; }
  .fab { position: fixed; right: 30rpx; bottom: calc(32rpx + env(safe-area-inset-bottom)); width: 96rpx; height: 96rpx; color: #fff; font-size: 48rpx; line-height: 96rpx; background: #1769d8; border-radius: 50%; box-shadow: 0 12rpx 28rpx rgba(23, 105, 216, 0.28); }
  .fab { position: fixed; right: 30rpx; bottom: calc(32rpx + env(safe-area-inset-bottom)); width: 96rpx; height: 96rpx; color: #fff; font-size: 48rpx; line-height: 96rpx; background: var(--color-primary, #1769d8); border-radius: 50%; box-shadow: 0 12rpx 28rpx rgba(23, 105, 216, 0.28); }
</style>
src/pages/srm/statistics/index.vue
@@ -105,7 +105,7 @@
    box-shadow: 0 8rpx 20rpx rgba(43, 69, 107, 0.06);
  }
  .filter picker {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
  }
  .year-picker {
    display: flex;
@@ -121,14 +121,14 @@
    width: 14rpx;
    height: 14rpx;
    margin-top: -3rpx;
    border-right: 3rpx solid #1769d8;
    border-bottom: 3rpx solid #1769d8;
    border-right: 3rpx solid var(--color-primary, #1769d8);
    border-bottom: 3rpx solid var(--color-primary, #1769d8);
    transform: rotate(45deg);
  }
  .summary {
    padding: 30rpx;
    color: #fff;
    background: linear-gradient(135deg, #1769d8, #2d82e9);
    background: linear-gradient(135deg, var(--color-primary, #1769d8), #2d82e9);
    border-radius: 20rpx;
    box-shadow: 0 14rpx 28rpx rgba(23, 105, 216, 0.2);
  }
@@ -201,7 +201,7 @@
    display: block;
  }
  .metrics text:first-child {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 38rpx;
    font-weight: 700;
  }
@@ -216,7 +216,7 @@
    color: #6d7c90;
    font-size: 24rpx;
    line-height: 1.7;
    background: #eef5ff;
    background: var(--color-primary-soft, #eef5ff);
    border-radius: 14rpx;
  }
  .state {
@@ -232,7 +232,7 @@
    width: 220rpx;
    margin: 20rpx auto;
    color: #fff;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 12rpx;
  }
</style>
src/pages/srm/tender/detail.vue
@@ -834,7 +834,7 @@
    justify-content: space-between;
    gap: 16rpx;
    padding: 30rpx;
    background: linear-gradient(135deg, #1769d8, #3184e8);
    background: linear-gradient(135deg, var(--color-primary, #1769d8), #3184e8);
    border-radius: 20rpx;
    color: #fff;
  }
@@ -897,9 +897,9 @@
    font-size: 26rpx;
  }
  .tab.active {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-weight: 700;
    border-bottom: 4rpx solid #1769d8;
    border-bottom: 4rpx solid var(--color-primary, #1769d8);
  }
  .card {
    padding: 24rpx;
@@ -949,7 +949,7 @@
    text-align: right;
  }
  .right b {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
  }
  .mini {
    display: flex;
@@ -1080,11 +1080,11 @@
    min-height: 58rpx;
    padding: 0 18rpx;
    margin: 0;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 23rpx;
    line-height: 56rpx;
    background: #f4f8ff;
    border: 1rpx solid #8ab3ee;
    border: 1rpx solid var(--color-primary-border, #8ab3ee);
    border-radius: 10rpx;
  }
  button::after {
@@ -1257,7 +1257,7 @@
  }
  .create-action,
  .edit-action {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    background: #f2f6ff;
    border-color: #a9c7fa;
  }
@@ -1276,8 +1276,8 @@
  }
  .evaluate-action,
  .award-action {
    color: #1769d8;
    background: #edf5ff;
    color: var(--color-primary, #1769d8);
    background: var(--color-primary-soft, #edf5ff);
    border-color: #a9c7fa;
  }
  .approve-action,
@@ -1294,8 +1294,8 @@
  }
  .primary {
    color: #fff;
    background: #1769d8;
    border-color: #1769d8;
    background: var(--color-primary, #1769d8);
    border-color: var(--color-primary, #1769d8);
  }
  .danger {
    color: #c65050;
src/pages/srm/tender/form.vue
@@ -273,7 +273,7 @@
  .type-1,
  .type-2,
  .mode-full {
    color: #165dff;
    color: var(--color-primary, #165dff);
    background: #e8f1ff;
  }
  .type-3,
@@ -318,7 +318,7 @@
  }
  .attachmentHead text:last-child,
  .attachment text:first-child {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
  }
  .attachment {
    padding: 16rpx 0;
@@ -332,7 +332,7 @@
    margin-top: 32rpx;
    color: #fff;
    font-size: 30rpx;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 12rpx;
  }
  .save::after {
src/pages/srm/tender/index.vue
@@ -359,7 +359,7 @@
    font-size: 27rpx;
  }
  .search text {
    color: #165dff;
    color: var(--color-primary, #165dff);
    font-size: 24rpx;
  }
  .status-picker {
@@ -407,7 +407,7 @@
  }
  .status {
    padding: 5rpx 12rpx;
    color: #165dff;
    color: var(--color-primary, #165dff);
    background: #edf4ff;
    border-radius: 8rpx;
    font-size: 22rpx;
@@ -488,11 +488,11 @@
  }
  .type-1,
  .mode-full {
    color: #165dff;
    color: var(--color-primary, #165dff);
    background: #e8f1ff;
  }
  .type-2 {
    color: #165dff;
    color: var(--color-primary, #165dff);
    background: #eef4ff;
  }
  .type-3,
@@ -516,7 +516,7 @@
    padding: 0 16rpx;
    min-height: 54rpx;
    line-height: 52rpx;
    color: #165dff;
    color: var(--color-primary, #165dff);
    background: #f2f6ff;
    border: 0;
    border-radius: 8rpx;
@@ -547,7 +547,7 @@
  .state button {
    margin-top: 24rpx;
    color: #fff;
    background: #165dff;
    background: var(--color-primary, #165dff);
    font-size: 25rpx;
  }
  .mask {
@@ -653,15 +653,13 @@
    display: flex;
    align-items: center;
    justify-content: center;
    width: 132rpx;
    height: 132rpx;
    min-height: 132rpx;
    width: 104rpx; height: 104rpx; min-height: 104rpx;
    padding: 0;
    color: #fff;
    background: #165dff;
    background: var(--color-primary, #165dff);
    border: 0;
    border-radius: 50%;
    box-shadow: 0 12rpx 24rpx #165dff55;
    box-shadow: 0 12rpx 24rpx var(--color-primary, #165dff)55;
  }
  .fab-plus {
    position: relative;
src/pages/supplier/access/index.vue
@@ -383,13 +383,13 @@
    font-size: 27rpx;
  }
  .search text {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 24rpx;
  }
  .content {
    height: 0;
    flex: 1;
    padding-bottom: 150rpx;
    padding-bottom: 132rpx;
  }
  .card {
    padding: 24rpx;
@@ -408,8 +408,8 @@
  }
  .tag {
    padding: 4rpx 10rpx;
    color: #1769d8;
    background: #eef5ff;
    color: var(--color-primary, #1769d8);
    background: var(--color-primary-soft, #eef5ff);
    border-radius: 8rpx;
    font-size: 21rpx;
  }
@@ -433,7 +433,7 @@
    padding: 0 18rpx;
    min-height: 54rpx;
    line-height: 52rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    background: #f4f8ff;
    border: 1rpx solid #9fbee9;
    border-radius: 10rpx;
@@ -464,7 +464,7 @@
    color: #fff;
    line-height: 32rpx;
    font-size: 24rpx;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 50%;
  }
  .fab:after,
@@ -497,7 +497,7 @@
  .editorHead text:last-child {
    font-size: 25rpx;
    font-weight: 400;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
  }
  .field {
    min-height: 92rpx;
@@ -574,7 +574,7 @@
  }
  .attachmentHead text:last-child,
  .attachment text:first-child {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
  }
  .attachment {
    padding: 16rpx 0;
@@ -587,7 +587,7 @@
  .save {
    margin: 30rpx 0;
    color: #fff;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 14rpx;
  }
  .dialog {
@@ -619,8 +619,8 @@
  }
  .dialogActions .confirm {
    color: #fff;
    background: #1769d8;
    border-color: #1769d8;
    background: var(--color-primary, #1769d8);
    border-color: var(--color-primary, #1769d8);
  }
  .fab-plus {
    position: relative;
src/pages/supplier/archive/index.vue
@@ -254,13 +254,13 @@
    font-size: 27rpx;
  }
  .search text {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 24rpx;
  }
  .content {
    height: 0;
    flex: 1;
    padding-bottom: 150rpx;
    padding-bottom: 132rpx;
  }
  .card {
    padding: 24rpx;
@@ -286,7 +286,7 @@
    border-radius: 8rpx;
  }
  .type-1 {
    color: #165dff;
    color: var(--color-primary, #165dff);
    background: #e8f1ff;
  }
  .type-2 {
@@ -343,7 +343,7 @@
    padding: 0 20rpx;
    min-height: 54rpx;
    line-height: 52rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    background: #f4f8ff;
    border: 1rpx solid #9fbee9;
    border-radius: 10rpx;
@@ -374,9 +374,9 @@
    color: #fff;
    line-height: 32rpx;
    font-size: 24rpx;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 50%;
    box-shadow: 0 12rpx 24rpx #1769d855;
    box-shadow: 0 12rpx 24rpx var(--color-primary, #1769d8)55;
  }
  .fab:after,
  .save:after {
@@ -408,7 +408,7 @@
  .editorHead text:last-child {
    font-size: 25rpx;
    font-weight: 400;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
  }
  .field {
    min-height: 92rpx;
@@ -470,7 +470,7 @@
  .save {
    margin: 30rpx 0;
    color: #fff;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 14rpx;
  }
  .fab-plus {
src/pages/supplier/certificate/index.vue
@@ -344,7 +344,7 @@
  }
  .search text {
    margin-left: 16rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 23rpx;
  }
  .search .remind {
@@ -353,7 +353,7 @@
  .content {
    height: 0;
    flex: 1;
    padding-bottom: 150rpx;
    padding-bottom: 132rpx;
  }
  .card {
    padding: 24rpx;
@@ -396,7 +396,7 @@
    border-radius: 8rpx;
  }
  .type-1 {
    color: #165dff;
    color: var(--color-primary, #165dff);
    background: #e8f1ff;
  }
  .type-2 {
@@ -424,7 +424,7 @@
  .attachmentLinks text {
    max-width: 260rpx;
    overflow: hidden;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    text-overflow: ellipsis;
    white-space: nowrap;
  }
@@ -440,7 +440,7 @@
    padding: 0 20rpx;
    min-height: 54rpx;
    line-height: 52rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    background: #f4f8ff;
    border: 1rpx solid #9fbee9;
    border-radius: 10rpx;
@@ -471,7 +471,7 @@
    color: #fff;
    line-height: 32rpx;
    font-size: 24rpx;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 50%;
  }
  .fab:after,
@@ -504,7 +504,7 @@
  .editorHead text:last-child {
    font-size: 25rpx;
    font-weight: 400;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
  }
  .field {
    min-height: 92rpx;
@@ -577,7 +577,7 @@
  }
  .attachmentHead > text:last-child,
  .attachment > text:last-child {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
  }
  .attachment {
    margin-top: 18rpx;
@@ -593,7 +593,7 @@
  .save {
    margin: 30rpx 0;
    color: #fff;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 14rpx;
  }
  .fab-plus {
src/pages/supplier/performance/index.vue
@@ -274,13 +274,13 @@
    font-size: 26rpx;
  }
  .search text {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 24rpx;
  }
  .content {
    height: 0;
    flex: 1;
    padding-bottom: 150rpx;
    padding-bottom: 132rpx;
  }
  .card {
    padding: 24rpx;
@@ -299,8 +299,8 @@
  }
  .grade {
    padding: 4rpx 12rpx;
    color: #1769d8;
    background: #eef5ff;
    color: var(--color-primary, #1769d8);
    background: var(--color-primary-soft, #eef5ff);
    border-radius: 8rpx;
    font-size: 22rpx;
  }
@@ -333,7 +333,7 @@
    padding: 0 20rpx;
    min-height: 54rpx;
    line-height: 52rpx;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    background: #f4f8ff;
    border: 1rpx solid #9fbee9;
    border-radius: 10rpx;
@@ -364,7 +364,7 @@
    color: #fff;
    line-height: 32rpx;
    font-size: 24rpx;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 50%;
  }
  .fab:after,
@@ -415,7 +415,7 @@
  .editorHead text:last-child {
    font-size: 25rpx;
    font-weight: 400;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
  }
  .field {
    min-height: 92rpx;
@@ -477,7 +477,7 @@
  .save {
    margin: 30rpx 0;
    color: #fff;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 14rpx;
  }
</style>
src/pages/wls/barcode/config.vue
@@ -108,5 +108,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.enabled{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.disabled{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.danger{color:#c65050!important;background:#fff7f7!important;border-color:#e3a0a0!important}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:60;display:flex;align-items:flex-end;background:rgba(0,0,0,.35)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:28rpx;box-sizing:border-box;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:88rpx;line-height:88rpx;color:#10233f;font-size:30rpx;font-weight:600;text-align:center}.field{display:flex;align-items:center;min-height:86rpx;padding:0 22rpx;border-bottom:1rpx solid #edf1f6;box-sizing:border-box}.field>text:first-child{flex:none;width:190rpx;color:#10233f;font-size:26rpx}.field>picker{display:block;flex:1;min-width:0}.field input,.field textarea,.value,.picker{flex:1;min-width:0;color:#10233f;font-size:26rpx;text-align:right}.field textarea{height:120rpx;padding:22rpx 0}.field.column{align-items:flex-start;flex-direction:column;padding:22rpx}.field.column>text:first-child{width:auto;margin-bottom:12rpx}.field.column textarea{text-align:left;width:100%;height:120rpx;padding:0}.required{color:#e23b3b}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:10rpx}.picker text:first-child{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;text-align:right}.modal-actions{display:flex;gap:18rpx;padding:24rpx}.modal-actions button{flex:1;height:72rpx;line-height:72rpx;font-size:27rpx;border-radius:10rpx}.modal-actions .primary{color:#fff;background:#1769d8}.actions button::after,.fab::after,.modal-actions button::after{border:0}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:0;flex:1;padding-bottom: 132rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.enabled{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.disabled{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.danger{color:#c65050!important;background:#fff7f7!important;border-color:#e3a0a0!important}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width: 104rpx; height: 104rpx; min-height: 104rpx;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:60;display:flex;align-items:flex-end;background:rgba(0,0,0,.35)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:28rpx;box-sizing:border-box;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:88rpx;line-height:88rpx;color:#10233f;font-size:30rpx;font-weight:600;text-align:center}.field{display:flex;align-items:center;min-height:86rpx;padding:0 22rpx;border-bottom:1rpx solid #edf1f6;box-sizing:border-box}.field>text:first-child{flex:none;width:190rpx;color:#10233f;font-size:26rpx}.field>picker{display:block;flex:1;min-width:0}.field input,.field textarea,.value,.picker{flex:1;min-width:0;color:#10233f;font-size:26rpx;text-align:right}.field textarea{height:120rpx;padding:22rpx 0}.field.column{align-items:flex-start;flex-direction:column;padding:22rpx}.field.column>text:first-child{width:auto;margin-bottom:12rpx}.field.column textarea{text-align:left;width:100%;height:120rpx;padding:0}.required{color:#e23b3b}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:10rpx}.picker text:first-child{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;text-align:right}.modal-actions{display:flex;gap:18rpx;padding:24rpx}.modal-actions button{flex:1;height:72rpx;line-height:72rpx;font-size:27rpx;border-radius:10rpx}.modal-actions .primary{color:#fff;background:var(--color-primary, #1769d8)}.actions button::after,.fab::after,.modal-actions button::after{border:0}
</style>
src/pages/wls/barcode/index.vue
@@ -252,5 +252,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.enabled{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.disabled{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:12rpx;padding-top:16rpx}.actions button,.close{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.danger{color:#c65050!important;background:#fff7f7!important;border-color:#e3a0a0!important}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.config-fab{position:fixed;right:42rpx;bottom:calc(194rpx + env(safe-area-inset-bottom));display:flex;flex-direction:column;align-items:center;justify-content:center;width:112rpx;height:112rpx;min-height:112rpx;padding:0;margin:0;color:#1769d8;font-size:22rpx;line-height:1.25;background:#fff;border:1rpx solid #8ab3ee;border-radius:50%;box-shadow:0 10rpx 24rpx rgba(43,69,107,.16)}.config-fab text{display:block;color:#1769d8;font-size:22rpx;line-height:1.25;text-align:center}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:60;display:flex;align-items:flex-end;background:rgba(0,0,0,.35)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:28rpx;box-sizing:border-box;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:88rpx;line-height:88rpx;color:#10233f;font-size:30rpx;font-weight:600;text-align:center}.field{display:flex;align-items:center;min-height:86rpx;padding:0 22rpx;border-bottom:1rpx solid #edf1f6;box-sizing:border-box}.field>text:first-child{flex:none;width:190rpx;color:#10233f;font-size:26rpx}.field>picker{display:block;flex:1;min-width:0}.field input,.field textarea,.value,.picker{flex:1;min-width:0;color:#10233f;font-size:26rpx;text-align:right}.field textarea{height:120rpx;padding:22rpx 0}.field.column{align-items:flex-start;flex-direction:column;padding:22rpx}.field.column>text:first-child{width:auto;margin-bottom:12rpx}.field.column textarea{text-align:left;width:100%;height:120rpx;padding:0}.required{color:#e23b3b}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:10rpx}.picker text:first-child{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;text-align:right}.code-field input{text-align:left}.code-field button{height:52rpx;min-height:52rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:23rpx;line-height:50rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.modal-actions{display:flex;gap:18rpx;padding:24rpx}.modal-actions button{flex:1;height:72rpx;line-height:72rpx;font-size:27rpx;border-radius:10rpx}.modal-actions .primary{color:#fff;background:#1769d8}.actions button::after,.fab::after,.config-fab::after,.modal-actions button::after,.close::after,.code-field button::after{border:0}.close{width:calc(100% - 48rpx);height:72rpx;margin:24rpx}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:0;flex:1;padding-bottom: 132rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.enabled{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.disabled{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:12rpx;padding-top:16rpx}.actions button,.close{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.danger{color:#c65050!important;background:#fff7f7!important;border-color:#e3a0a0!important}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width: 104rpx; height: 104rpx; min-height: 104rpx;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.config-fab{position:fixed;right:42rpx;bottom:calc(194rpx + env(safe-area-inset-bottom));display:flex;flex-direction:column;align-items:center;justify-content:center;width:112rpx;height:112rpx;min-height:112rpx;padding:0;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:1.25;background:#fff;border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:50%;box-shadow:0 10rpx 24rpx rgba(43,69,107,.16)}.config-fab text{display:block;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:1.25;text-align:center}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:60;display:flex;align-items:flex-end;background:rgba(0,0,0,.35)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:28rpx;box-sizing:border-box;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:88rpx;line-height:88rpx;color:#10233f;font-size:30rpx;font-weight:600;text-align:center}.field{display:flex;align-items:center;min-height:86rpx;padding:0 22rpx;border-bottom:1rpx solid #edf1f6;box-sizing:border-box}.field>text:first-child{flex:none;width:190rpx;color:#10233f;font-size:26rpx}.field>picker{display:block;flex:1;min-width:0}.field input,.field textarea,.value,.picker{flex:1;min-width:0;color:#10233f;font-size:26rpx;text-align:right}.field textarea{height:120rpx;padding:22rpx 0}.field.column{align-items:flex-start;flex-direction:column;padding:22rpx}.field.column>text:first-child{width:auto;margin-bottom:12rpx}.field.column textarea{text-align:left;width:100%;height:120rpx;padding:0}.required{color:#e23b3b}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:10rpx}.picker text:first-child{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;text-align:right}.code-field input{text-align:left}.code-field button{height:52rpx;min-height:52rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:23rpx;line-height:50rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.modal-actions{display:flex;gap:18rpx;padding:24rpx}.modal-actions button{flex:1;height:72rpx;line-height:72rpx;font-size:27rpx;border-radius:10rpx}.modal-actions .primary{color:#fff;background:var(--color-primary, #1769d8)}.actions button::after,.fab::after,.config-fab::after,.modal-actions button::after,.close::after,.code-field button::after{border:0}.close{width:calc(100% - 48rpx);height:72rpx;margin:24rpx}
</style>
src/pages/wls/components/WlsComplexForm.vue
@@ -400,5 +400,5 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:20rpx 24rpx 60rpx;box-sizing:border-box;background:#f3f6fb}.form-card{margin-bottom:18rpx;background:#fff;border-radius:16rpx;overflow:hidden}.field{display:flex;align-items:center;min-height:86rpx;padding:0 22rpx;border-bottom:1rpx solid #edf1f6;box-sizing:border-box}.field>text:first-child{flex:none;width:190rpx;color:#10233f;font-size:26rpx}.field>picker{display:block;flex:1;min-width:0}.field input,.field textarea,.value,.picker{flex:1;min-width:0;color:#10233f;font-size:26rpx;text-align:right}.field textarea{height:120rpx;padding:22rpx 0}.field.column{align-items:flex-start;flex-direction:column;padding:22rpx}.field.column>text:first-child{width:auto;margin-bottom:12rpx}.field.column textarea{text-align:left;width:100%;height:120rpx;padding:0}.required{color:#e23b3b}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:10rpx}.picker text:first-child{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;text-align:right}.code-field input{text-align:left}.code-field button,.section button,.line-head button,.detail-actions button,.line-bottom button{height:52rpx;min-height:52rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:23rpx;line-height:50rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.section{display:flex;align-items:center;justify-content:space-between;height:82rpx;padding:0 22rpx;color:#10233f;font-size:30rpx;font-weight:600}.line{margin:0 18rpx 18rpx;border:1rpx solid #edf1f6;border-radius:12rpx;overflow:hidden}.line-head{display:flex;align-items:center;justify-content:space-between;padding:16rpx 18rpx;color:#10233f;font-size:27rpx;font-weight:600;background:#f9fbff}.line-head>view{display:flex;gap:10rpx}.grid{display:grid;gap:10rpx;padding:16rpx 18rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.danger{color:#c65050!important;background:#fff7f7!important;border-color:#e3a0a0!important}.details{padding:10rpx 18rpx 16rpx;border-top:1rpx solid #edf1f6}.stock-title{color:#10233f;font-size:26rpx;font-weight:600}.detail-row{display:flex;align-items:flex-start;justify-content:space-between;gap:14rpx;padding:14rpx 0;color:#66778c;font-size:23rpx;border-bottom:1rpx solid #f2f4f8}.detail-row>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.detail-actions{display:flex;flex:none;align-items:center;justify-content:flex-end;gap:10rpx}.line-bottom{display:flex;justify-content:flex-end;padding:0 18rpx 18rpx}.empty{padding:34rpx;color:#8795a8;font-size:25rpx;text-align:center}.empty.small{padding:18rpx}.save,.submit{width:100%;height:78rpx;margin:18rpx 0 0;color:#fff;font-size:28rpx;line-height:78rpx;background:#1769d8;border-radius:10rpx}.submit{background:#16a36f}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:60;display:flex;align-items:flex-end;background:rgba(0,0,0,.35)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:28rpx;box-sizing:border-box;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:88rpx;line-height:88rpx;color:#10233f;font-size:30rpx;font-weight:600;text-align:center}.modal-actions{display:flex;gap:18rpx;padding:24rpx}.modal-actions button{flex:1;height:72rpx;line-height:72rpx;font-size:27rpx;border-radius:10rpx}.modal-actions .primary{color:#fff;background:#1769d8}.code-field button::after,.section button::after,.line-head button::after,.detail-actions button::after,.save::after,.submit::after,.modal-actions button::after,.line-bottom button::after{border:0}
.page{min-height:100vh;padding:20rpx 24rpx 60rpx;box-sizing:border-box;background:#f3f6fb}.form-card{margin-bottom:18rpx;background:#fff;border-radius:16rpx;overflow:hidden}.field{display:flex;align-items:center;min-height:86rpx;padding:0 22rpx;border-bottom:1rpx solid #edf1f6;box-sizing:border-box}.field>text:first-child{flex:none;width:190rpx;color:#10233f;font-size:26rpx}.field>picker{display:block;flex:1;min-width:0}.field input,.field textarea,.value,.picker{flex:1;min-width:0;color:#10233f;font-size:26rpx;text-align:right}.field textarea{height:120rpx;padding:22rpx 0}.field.column{align-items:flex-start;flex-direction:column;padding:22rpx}.field.column>text:first-child{width:auto;margin-bottom:12rpx}.field.column textarea{text-align:left;width:100%;height:120rpx;padding:0}.required{color:#e23b3b}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:10rpx}.picker text:first-child{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;text-align:right}.code-field input{text-align:left}.code-field button,.section button,.line-head button,.detail-actions button,.line-bottom button{height:52rpx;min-height:52rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:23rpx;line-height:50rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.section{display:flex;align-items:center;justify-content:space-between;height:82rpx;padding:0 22rpx;color:#10233f;font-size:30rpx;font-weight:600}.line{margin:0 18rpx 18rpx;border:1rpx solid #edf1f6;border-radius:12rpx;overflow:hidden}.line-head{display:flex;align-items:center;justify-content:space-between;padding:16rpx 18rpx;color:#10233f;font-size:27rpx;font-weight:600;background:#f9fbff}.line-head>view{display:flex;gap:10rpx}.grid{display:grid;gap:10rpx;padding:16rpx 18rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.danger{color:#c65050!important;background:#fff7f7!important;border-color:#e3a0a0!important}.details{padding:10rpx 18rpx 16rpx;border-top:1rpx solid #edf1f6}.stock-title{color:#10233f;font-size:26rpx;font-weight:600}.detail-row{display:flex;align-items:flex-start;justify-content:space-between;gap:14rpx;padding:14rpx 0;color:#66778c;font-size:23rpx;border-bottom:1rpx solid #f2f4f8}.detail-row>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.detail-actions{display:flex;flex:none;align-items:center;justify-content:flex-end;gap:10rpx}.line-bottom{display:flex;justify-content:flex-end;padding:0 18rpx 18rpx}.empty{padding:34rpx;color:#8795a8;font-size:25rpx;text-align:center}.empty.small{padding:18rpx}.save,.submit{width:100%;height:78rpx;margin:18rpx 0 0;color:#fff;font-size:28rpx;line-height:78rpx;background:var(--color-primary, #1769d8);border-radius:10rpx}.submit{background:#16a36f}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:60;display:flex;align-items:flex-end;background:rgba(0,0,0,.35)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:28rpx;box-sizing:border-box;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:88rpx;line-height:88rpx;color:#10233f;font-size:30rpx;font-weight:600;text-align:center}.modal-actions{display:flex;gap:18rpx;padding:24rpx}.modal-actions button{flex:1;height:72rpx;line-height:72rpx;font-size:27rpx;border-radius:10rpx}.modal-actions .primary{color:#fff;background:var(--color-primary, #1769d8)}.code-field button::after,.section button::after,.line-head button::after,.detail-actions button::after,.save::after,.submit::after,.modal-actions button::after,.line-bottom button::after{border:0}
</style>
src/pages/wls/components/WlsComplexList.vue
@@ -152,5 +152,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-draft{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.tag-progress{color:#b57800;background:#fff7dd;border:1rpx solid #f3dc98}.tag-approved{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.tag-finished{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-cancelled{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tag-info{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:0;flex:1;padding-bottom: 132rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-draft{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #edf5ff);border:1rpx solid var(--color-primary-border, #bfdbff)}.tag-progress{color:#b57800;background:#fff7dd;border:1rpx solid #f3dc98}.tag-approved{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #edf5ff);border:1rpx solid var(--color-primary-border, #bfdbff)}.tag-finished{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-cancelled{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tag-info{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width: 104rpx; height: 104rpx; min-height: 104rpx;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/wls/components/WlsDocForm.vue
@@ -670,5 +670,5 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.form-card{overflow:hidden;margin-bottom:20rpx;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field>picker{display:block;flex:1;min-width:0}.field input,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx;text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:36rpx;text-align:right}.code-field button,.section button,.line-head button,.stock-actions button{flex:none;min-width:112rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:130rpx;font-size:27rpx}.section,.line-head{display:flex;align-items:center;justify-content:space-between;min-height:82rpx;padding:0 24rpx;color:#1d2f46;font-size:28rpx;font-weight:600;border-bottom:1rpx solid #eef1f5}.line{margin:20rpx;border:1rpx solid #eef1f5;border-radius:14rpx;overflow:hidden}.danger{color:#c65050!important;border-color:#e3a0a0!important}.empty{padding:32rpx;color:#8795a8;font-size:25rpx;text-align:center}.empty.small{padding:20rpx}.save,.submit{margin-top:24rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.submit{background:#12a06a}.stock-details{padding:18rpx 24rpx 22rpx;background:#fbfcff;border-top:1rpx solid #eef1f5}.stock-title{display:flex;align-items:center;justify-content:space-between;margin-bottom:14rpx;color:#1d2f46;font-size:27rpx;font-weight:600}.stock-row{padding:16rpx 0;border-top:1rpx solid #edf1f6}.stock-row:first-of-type{border-top:0}.stock-info{display:grid;grid-template-columns:1fr 1fr;gap:10rpx 18rpx;color:#40536c;font-size:25rpx}.stock-info text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.stock-actions{display:flex;justify-content:flex-end;gap:12rpx;margin-top:14rpx}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:20;display:flex;align-items:flex-end;background:rgba(20,32,48,.45)}.stock-select-mask{z-index:30}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:30rpx;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:96rpx;line-height:96rpx;text-align:center;color:#122033;font-size:30rpx;font-weight:700;border-bottom:1rpx solid #eef1f5}.select-search{display:flex;align-items:center;height:76rpx;margin:18rpx 24rpx 0;padding:0 18rpx;gap:18rpx;background:#f6f8fb;border-radius:14rpx}.select-search input{min-width:0;flex:1;color:#1e3049;font-size:26rpx}.select-search text{flex:none;color:#1769d8;font-size:24rpx}.modal-list{max-height:60vh;padding:20rpx 24rpx;box-sizing:border-box;background:#f3f6fb}.select-row{display:grid;gap:9rpx;padding:22rpx;margin-bottom:16rpx;color:#66778c;font-size:23rpx;background:#fff;border-radius:14rpx}.select-title{color:#20334c;font-size:29rpx;font-weight:600}.modal-actions{display:flex;gap:18rpx;padding:24rpx}.modal-actions button{flex:1;margin:0;color:#1769d8;background:#fff;border:1rpx solid #1769d8;border-radius:12rpx}.modal-actions .primary{color:#fff;background:#1769d8}.save::after,.submit::after,button::after{border:0}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.form-card{overflow:hidden;margin-bottom:20rpx;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field>picker{display:block;flex:1;min-width:0}.field input,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx;text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:36rpx;text-align:right}.code-field button,.section button,.line-head button,.stock-actions button{flex:none;min-width:112rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid var(--color-primary, #1769d8);border-radius:8rpx}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:130rpx;font-size:27rpx}.section,.line-head{display:flex;align-items:center;justify-content:space-between;min-height:82rpx;padding:0 24rpx;color:#1d2f46;font-size:28rpx;font-weight:600;border-bottom:1rpx solid #eef1f5}.line{margin:20rpx;border:1rpx solid #eef1f5;border-radius:14rpx;overflow:hidden}.danger{color:#c65050!important;border-color:#e3a0a0!important}.empty{padding:32rpx;color:#8795a8;font-size:25rpx;text-align:center}.empty.small{padding:20rpx}.save,.submit{margin-top:24rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.submit{background:#12a06a}.stock-details{padding:18rpx 24rpx 22rpx;background:#fbfcff;border-top:1rpx solid #eef1f5}.stock-title{display:flex;align-items:center;justify-content:space-between;margin-bottom:14rpx;color:#1d2f46;font-size:27rpx;font-weight:600}.stock-row{padding:16rpx 0;border-top:1rpx solid #edf1f6}.stock-row:first-of-type{border-top:0}.stock-info{display:grid;grid-template-columns:1fr 1fr;gap:10rpx 18rpx;color:#40536c;font-size:25rpx}.stock-info text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.stock-actions{display:flex;justify-content:flex-end;gap:12rpx;margin-top:14rpx}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:20;display:flex;align-items:flex-end;background:rgba(20,32,48,.45)}.stock-select-mask{z-index:30}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:30rpx;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:96rpx;line-height:96rpx;text-align:center;color:#122033;font-size:30rpx;font-weight:700;border-bottom:1rpx solid #eef1f5}.select-search{display:flex;align-items:center;height:76rpx;margin:18rpx 24rpx 0;padding:0 18rpx;gap:18rpx;background:#f6f8fb;border-radius:14rpx}.select-search input{min-width:0;flex:1;color:#1e3049;font-size:26rpx}.select-search text{flex:none;color:var(--color-primary, #1769d8);font-size:24rpx}.modal-list{max-height:60vh;padding:20rpx 24rpx;box-sizing:border-box;background:#f3f6fb}.select-row{display:grid;gap:9rpx;padding:22rpx;margin-bottom:16rpx;color:#66778c;font-size:23rpx;background:#fff;border-radius:14rpx}.select-title{color:#20334c;font-size:29rpx;font-weight:600}.modal-actions{display:flex;gap:18rpx;padding:24rpx}.modal-actions button{flex:1;margin:0;color:var(--color-primary, #1769d8);background:#fff;border:1rpx solid var(--color-primary, #1769d8);border-radius:12rpx}.modal-actions .primary{color:#fff;background:var(--color-primary, #1769d8)}.save::after,.submit::after,button::after{border:0}
</style>
src/pages/wls/components/WlsDocList.vue
@@ -216,5 +216,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.toolbar{display:flex;justify-content:flex-end;padding-bottom:16rpx}.toolbar button{height:62rpx;padding:0 22rpx;margin:0;color:#1769d8;font-size:24rpx;line-height:62rpx;background:#fff;border:1rpx solid #8ab3ee;border-radius:12rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-draft{color:#6f7e92;background:#f3f6fa;border:1rpx solid #dce4ee}.tag-progress{color:#b57800;background:#fff7dd;border:1rpx solid #f3dc98}.tag-approved{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.tag-finished{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-cancelled{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tag-info{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after,.modal-close::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:50;display:flex;align-items:flex-end;background:rgba(0,0,0,.35)}.modal{width:100%;max-height:82vh;padding-bottom:24rpx;background:#f3f6fb;border-radius:24rpx 24rpx 0 0}.modal-title{height:88rpx;line-height:88rpx;color:#1d2f46;font-size:30rpx;font-weight:600;text-align:center;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-list{max-height:60vh;padding:20rpx 24rpx;box-sizing:border-box}.select-row{display:grid;gap:9rpx;padding:22rpx;margin-bottom:16rpx;color:#66778c;font-size:23rpx;background:#fff;border-radius:14rpx}.select-title{color:#20334c;font-size:29rpx;font-weight:600}.modal-close{margin:0 24rpx;color:#1769d8;background:#fff;border-radius:12rpx}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.toolbar{display:flex;justify-content:flex-end;padding-bottom:16rpx}.toolbar button{height:62rpx;padding:0 22rpx;margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:62rpx;background:#fff;border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:12rpx}.content{height:0;flex:1;padding-bottom: 132rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-draft{color:#6f7e92;background:#f3f6fa;border:1rpx solid #dce4ee}.tag-progress{color:#b57800;background:#fff7dd;border:1rpx solid #f3dc98}.tag-approved{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #edf5ff);border:1rpx solid var(--color-primary-border, #bfdbff)}.tag-finished{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-cancelled{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tag-info{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after,.modal-close::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width: 104rpx; height: 104rpx; min-height: 104rpx;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:50;display:flex;align-items:flex-end;background:rgba(0,0,0,.35)}.modal{width:100%;max-height:82vh;padding-bottom:24rpx;background:#f3f6fb;border-radius:24rpx 24rpx 0 0}.modal-title{height:88rpx;line-height:88rpx;color:#1d2f46;font-size:30rpx;font-weight:600;text-align:center;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-list{max-height:60vh;padding:20rpx 24rpx;box-sizing:border-box}.select-row{display:grid;gap:9rpx;padding:22rpx;margin-bottom:16rpx;color:#66778c;font-size:23rpx;background:#fff;border-radius:14rpx}.select-title{color:#20334c;font-size:29rpx;font-weight:600}.modal-close{margin:0 24rpx;color:var(--color-primary, #1769d8);background:#fff;border-radius:12rpx}
</style>
src/pages/wls/components/WlsExtraDocForm.vue
@@ -1092,11 +1092,11 @@
    min-height: 52rpx;
    padding: 0 16rpx;
    margin: 0;
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 23rpx;
    line-height: 50rpx;
    background: #f5f8ff;
    border: 1rpx solid #8ab3ee;
    background: var(--color-primary-soft, #f5f8ff);
    border: 1rpx solid var(--color-primary-border, #8ab3ee);
    border-radius: 8rpx;
  }
  .code-field button::after,
@@ -1194,7 +1194,7 @@
    color: #fff;
    font-size: 28rpx;
    line-height: 78rpx;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 10rpx;
  }
  .submit {
@@ -1241,6 +1241,6 @@
  }
  .modal-actions .primary {
    color: #fff;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
  }
</style>
src/pages/wls/components/WlsExtraDocList.vue
@@ -162,5 +162,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;justify-content:center;flex:none;height:44rpx}.status{display:inline-flex;align-items:center;justify-content:center;height:44rpx;padding:0 18rpx;font-size:23rpx;line-height:44rpx;border-radius:999rpx;white-space:nowrap}.tag-draft{color:#6f7e92;background:#f3f6fa;border:1rpx solid #dce4ee}.tag-progress{color:#b57800;background:#fff7dd;border:1rpx solid #f3dc98}.tag-approved{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.tag-finished{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-cancelled{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tag-info{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:0;flex:1;padding-bottom: 132rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:center;justify-content:center;flex:none;height:44rpx}.status{display:inline-flex;align-items:center;justify-content:center;height:44rpx;padding:0 18rpx;font-size:23rpx;line-height:44rpx;border-radius:999rpx;white-space:nowrap}.tag-draft{color:#6f7e92;background:#f3f6fa;border:1rpx solid #dce4ee}.tag-progress{color:#b57800;background:#fff7dd;border:1rpx solid #f3dc98}.tag-approved{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #edf5ff);border:1rpx solid var(--color-primary-border, #bfdbff)}.tag-finished{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-cancelled{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tag-info{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width: 104rpx; height: 104rpx; min-height: 104rpx;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/wls/components/WlsFlowDocForm.vue
@@ -538,5 +538,5 @@
</template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:20rpx 24rpx 60rpx;box-sizing:border-box;background:#f3f6fb}.form-card{margin-bottom:18rpx;background:#fff;border-radius:16rpx;overflow:hidden}.field{display:flex;align-items:center;min-height:86rpx;padding:0 22rpx;border-bottom:1rpx solid #edf1f6;box-sizing:border-box}.field>text:first-child{flex:none;width:180rpx;color:#10233f;font-size:26rpx}.field>picker{display:block;flex:1;min-width:0}.field input,.field textarea,.value,.picker{flex:1;min-width:0;color:#10233f;font-size:26rpx;text-align:right}.field textarea{height:120rpx;padding:22rpx 0}.field.column{align-items:flex-start;flex-direction:column;padding:22rpx}.field.column>text:first-child{width:auto;margin-bottom:12rpx}.field.column textarea{text-align:left;width:100%;height:120rpx;padding:0}.required{color:#e23b3b}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:10rpx}.picker text:first-child{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;text-align:right}.code-field input{text-align:left}.code-field button,.section button,.line-head button,.detail-actions button{height:52rpx;min-height:52rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:23rpx;line-height:50rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.code-field button::after,.section button::after,.line-head button::after,.detail-actions button::after,.save::after,.submit::after,.modal-actions button::after{border:0}.section{display:flex;align-items:center;justify-content:space-between;height:82rpx;padding:0 22rpx;color:#10233f;font-size:30rpx;font-weight:600}.line-card{margin:0 18rpx 18rpx;border:1rpx solid #edf1f6;border-radius:12rpx;overflow:hidden}.line-head{display:flex;align-items:center;justify-content:space-between;padding:16rpx 18rpx;color:#10233f;font-size:27rpx;font-weight:600;background:#f9fbff}.line-head>view{display:flex;gap:10rpx}.danger{color:#c65050!important;background:#fff7f7!important;border-color:#e3a0a0!important}.detail-list{padding:10rpx 18rpx 16rpx;border-top:1rpx solid #edf1f6}.detail-row{display:flex;align-items:flex-start;justify-content:space-between;gap:14rpx;padding:14rpx 0;color:#66778c;font-size:23rpx;border-bottom:1rpx solid #f2f4f8}.detail-info{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.detail-info text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.detail-actions{display:flex;flex:none;align-items:center;justify-content:flex-end;gap:10rpx}.detail-actions button{width:84rpx;padding:0}.empty{padding:34rpx;color:#8795a8;font-size:25rpx;text-align:center}.save,.submit{width:100%;height:78rpx;margin:18rpx 0 0;color:#fff;font-size:28rpx;line-height:78rpx;background:#1769d8;border-radius:10rpx}.submit{background:#16a36f}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:60;display:flex;align-items:flex-end;background:rgba(0,0,0,.35)}.modal{width:100%;max-height:86vh;padding:0 24rpx 28rpx;box-sizing:border-box;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:88rpx;line-height:88rpx;color:#10233f;font-size:30rpx;font-weight:600;text-align:center}.modal-actions{display:flex;gap:18rpx;padding-top:24rpx}.modal-actions button{flex:1;height:72rpx;line-height:72rpx;font-size:27rpx;border-radius:10rpx}.modal-actions .primary{color:#fff;background:#1769d8}
.page{min-height:100vh;padding:20rpx 24rpx 60rpx;box-sizing:border-box;background:#f3f6fb}.form-card{margin-bottom:18rpx;background:#fff;border-radius:16rpx;overflow:hidden}.field{display:flex;align-items:center;min-height:86rpx;padding:0 22rpx;border-bottom:1rpx solid #edf1f6;box-sizing:border-box}.field>text:first-child{flex:none;width:180rpx;color:#10233f;font-size:26rpx}.field>picker{display:block;flex:1;min-width:0}.field input,.field textarea,.value,.picker{flex:1;min-width:0;color:#10233f;font-size:26rpx;text-align:right}.field textarea{height:120rpx;padding:22rpx 0}.field.column{align-items:flex-start;flex-direction:column;padding:22rpx}.field.column>text:first-child{width:auto;margin-bottom:12rpx}.field.column textarea{text-align:left;width:100%;height:120rpx;padding:0}.required{color:#e23b3b}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:10rpx}.picker text:first-child{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;text-align:right}.code-field input{text-align:left}.code-field button,.section button,.line-head button,.detail-actions button{height:52rpx;min-height:52rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:23rpx;line-height:50rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.code-field button::after,.section button::after,.line-head button::after,.detail-actions button::after,.save::after,.submit::after,.modal-actions button::after{border:0}.section{display:flex;align-items:center;justify-content:space-between;height:82rpx;padding:0 22rpx;color:#10233f;font-size:30rpx;font-weight:600}.line-card{margin:0 18rpx 18rpx;border:1rpx solid #edf1f6;border-radius:12rpx;overflow:hidden}.line-head{display:flex;align-items:center;justify-content:space-between;padding:16rpx 18rpx;color:#10233f;font-size:27rpx;font-weight:600;background:#f9fbff}.line-head>view{display:flex;gap:10rpx}.danger{color:#c65050!important;background:#fff7f7!important;border-color:#e3a0a0!important}.detail-list{padding:10rpx 18rpx 16rpx;border-top:1rpx solid #edf1f6}.detail-row{display:flex;align-items:flex-start;justify-content:space-between;gap:14rpx;padding:14rpx 0;color:#66778c;font-size:23rpx;border-bottom:1rpx solid #f2f4f8}.detail-info{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.detail-info text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.detail-actions{display:flex;flex:none;align-items:center;justify-content:flex-end;gap:10rpx}.detail-actions button{width:84rpx;padding:0}.empty{padding:34rpx;color:#8795a8;font-size:25rpx;text-align:center}.save,.submit{width:100%;height:78rpx;margin:18rpx 0 0;color:#fff;font-size:28rpx;line-height:78rpx;background:var(--color-primary, #1769d8);border-radius:10rpx}.submit{background:#16a36f}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:60;display:flex;align-items:flex-end;background:rgba(0,0,0,.35)}.modal{width:100%;max-height:86vh;padding:0 24rpx 28rpx;box-sizing:border-box;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:88rpx;line-height:88rpx;color:#10233f;font-size:30rpx;font-weight:600;text-align:center}.modal-actions{display:flex;gap:18rpx;padding-top:24rpx}.modal-actions button{flex:1;height:72rpx;line-height:72rpx;font-size:27rpx;border-radius:10rpx}.modal-actions .primary{color:#fff;background:var(--color-primary, #1769d8)}
</style>
src/pages/wls/components/WlsFlowDocList.vue
@@ -222,5 +222,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;justify-content:center;flex:none;min-height:44rpx}.status{display:inline-flex;align-items:center;justify-content:center;height:44rpx;padding:0 18rpx;font-size:23rpx;line-height:44rpx;border-radius:999rpx;white-space:nowrap}.tag-draft{color:#6f7e92;background:#f3f6fa;border:1rpx solid #dce4ee}.tag-progress{color:#b57800;background:#fff7dd;border:1rpx solid #f3dc98}.tag-approved{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.tag-finished{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-cancelled{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tag-info{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:0;flex:1;padding-bottom: 132rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;justify-content:center;flex:none;min-height:44rpx}.status{display:inline-flex;align-items:center;justify-content:center;height:44rpx;padding:0 18rpx;font-size:23rpx;line-height:44rpx;border-radius:999rpx;white-space:nowrap}.tag-draft{color:#6f7e92;background:#f3f6fa;border:1rpx solid #dce4ee}.tag-progress{color:#b57800;background:#fff7dd;border:1rpx solid #f3dc98}.tag-approved{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #edf5ff);border:1rpx solid var(--color-primary-border, #bfdbff)}.tag-finished{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-cancelled{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tag-info{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width: 104rpx; height: 104rpx; min-height: 104rpx;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/wls/material-stock/index.vue
@@ -45,5 +45,5 @@
  <view v-if="showAdjust" class="mask"><view class="modal"><view class="modal-title">库存调整</view><view class="field"><text>调整类型 <text class="required">*</text></text><picker :range="['自定义入库','自定义出库']" @change="adjustForm.type=Number($event.detail.value)===0?'in':'out'"><view class="picker"><text>{{adjustForm.type==='in'?'自定义入库':'自定义出库'}}</text><text>›</text></view></picker></view><view class="field"><text>物料 <text class="required">*</text></text><picker :range="materialOptions" @change="pickMaterial"><view class="picker"><text>{{materialName(materials.find(i=>i.id===adjustForm.itemId))}}</text><text>›</text></view></picker></view><view v-if="batchManaged()" class="field"><text>手动填写批次号</text><switch :checked="adjustForm.manualBatchEntry" @change="adjustForm.manualBatchEntry=$event.detail.value" /></view><view v-if="batchManaged()&&adjustForm.manualBatchEntry" class="field"><text>批次号</text><input v-model="adjustForm.batchCode" placeholder="请输入批次号" /></view><view v-if="showBatchField('produceDateFlag')" class="field"><text>生产日期 <text class="required">*</text></text><picker mode="date" :value="adjustForm.produceDate" @change="adjustForm.produceDate=$event.detail.value"><view class="picker"><text>{{adjustForm.produceDate||'请选择生产日期'}}</text><text>›</text></view></picker></view><view v-if="showBatchField('expireDateFlag')" class="field"><text>有效期至 <text class="required">*</text></text><picker mode="date" :value="adjustForm.expireDate" @change="adjustForm.expireDate=$event.detail.value"><view class="picker"><text>{{adjustForm.expireDate||'请选择有效期'}}</text><text>›</text></view></picker></view><view v-if="showBatchField('receiptDateFlag')" class="field"><text>入库日期 <text class="required">*</text></text><picker mode="date" :value="adjustForm.receiptDate" @change="adjustForm.receiptDate=$event.detail.value"><view class="picker"><text>{{adjustForm.receiptDate||'请选择入库日期'}}</text><text>›</text></view></picker></view><view v-if="adjustForm.type==='out'||!batchManaged()||!!selectedMaterial?.vendorFlag" class="field"><text>供应商</text><picker :range="supplierOptions" @change="pickSupplier"><view class="picker"><text>{{supplierOptions[suppliers.findIndex(i=>i.id===adjustForm.vendorId)]||'请选择供应商'}}</text><text>›</text></view></picker></view><view v-if="showBatchField('purchaseOrderCodeFlag')" class="field"><text>采购订单号 <text class="required">*</text></text><input v-model="adjustForm.purchaseOrderCode" placeholder="请输入采购订单号" /></view><view v-if="showBatchField('lotNumberFlag')" class="field"><text>生产批号 <text class="required">*</text></text><input v-model="adjustForm.lotNumber" placeholder="请输入生产批号" /></view><view v-if="showBatchField('qualityStatusFlag')" class="field"><text>质量状态 <text class="required">*</text></text><picker :range="['合格','不合格','待检']" @change="adjustForm.qualityStatus=['QUALIFIED','UNQUALIFIED','PENDING'][Number($event.detail.value)]"><view class="picker"><text>{{adjustForm.qualityStatus==='QUALIFIED'?'合格':adjustForm.qualityStatus==='UNQUALIFIED'?'不合格':adjustForm.qualityStatus==='PENDING'?'待检':'请选择质量状态'}}</text><text>›</text></view></picker></view><view class="field"><text>仓库 <text class="required">*</text></text><picker :range="warehouseOptions" @change="pickWarehouse($event,'adjust')"><view class="picker"><text>{{warehouseOptions[warehouses.findIndex(i=>i.id===adjustForm.warehouseId)]||'请选择仓库'}}</text><text>›</text></view></picker></view><view class="field"><text>库区 <text class="required">*</text></text><picker :range="locationOptions" @change="pickLocation($event,'adjust')"><view class="picker"><text>{{locationOptions[locations.findIndex(i=>i.id===adjustForm.locationId)]||'请选择库区'}}</text><text>›</text></view></picker></view><view class="field"><text>库位 <text class="required">*</text></text><picker :range="areaOptions" @change="pickArea($event,'adjust')"><view class="picker"><text>{{areaOptions[areas.findIndex(i=>i.id===adjustForm.areaId)]||'请选择库位'}}</text><text>›</text></view></picker></view><view v-if="adjustForm.type==='out'&&!batchManaged()" class="field"><text>批次号</text><input v-model="adjustForm.batchCode" placeholder="请输入批次号" /></view><view class="field"><text>数量 <text class="required">*</text></text><input :value="String(adjustForm.quantity||'')" type="digit" placeholder="请输入数量" @input="adjustForm.quantity=Number($event.detail.value)||0" /></view><view class="field column"><text>原因</text><textarea v-model="adjustForm.reason" placeholder="请输入原因" ></textarea></view><view class="modal-actions"><button @click="showAdjust=false">取消</button><button class="primary" :loading="adjusting" @click="submitAdjust">确认</button></view></view></view>
</view></template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 20rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.body{height:0;flex:1;display:flex;gap:16rpx;min-height:0}.side{width:174rpx;flex:none;height:100%;background:#fff;border-radius:16rpx}.cat{min-height:72rpx;padding:0 16rpx;display:flex;align-items:center;color:#53677f;font-size:24rpx;border-bottom:1rpx solid #f1f4f8}.cat.active{color:#1769d8;font-weight:600;background:#edf5ff}.content{height:100%;flex:1;padding-bottom:90rpx;box-sizing:border-box}.tool{padding-bottom:14rpx}.tool button{height:62rpx;line-height:62rpx;margin:0;color:#1769d8;font-size:24rpx;background:#fff;border-radius:12rpx}.row{padding:22rpx 20rpx 18rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:12rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-success{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-danger{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tags{display:flex;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;color:#1769d8;font-size:22rpx;background:#edf5ff;border:1rpx solid #bfdbff;border-radius:999rpx}.grid{display:grid;gap:9rpx;padding:14rpx 0;margin-top:14rpx;color:#66778c;font-size:22rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;justify-content:flex-end;gap:12rpx;padding-top:14rpx}.actions button{min-height:48rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:46rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:50;display:flex;align-items:flex-end;background:rgba(0,0,0,.35)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:24rpx;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:88rpx;line-height:88rpx;text-align:center;color:#1d2f46;font-size:30rpx;font-weight:600;border-bottom:1rpx solid #eef1f5}.field{display:flex;align-items:center;min-height:92rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:180rpx;flex:none;color:#33455d;font-size:26rpx}.field>picker{display:block;flex:1;min-width:0}.field input,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:26rpx;text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:34rpx;text-align:right}.column{align-items:flex-start;flex-direction:column;padding:18rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:118rpx;font-size:26rpx}.modal-actions{display:flex;gap:18rpx;padding:24rpx}.modal-actions button{flex:1;margin:0;color:#1769d8;background:#edf5ff;border-radius:12rpx}.modal-actions .primary{color:#fff;background:#1769d8}button::after{border:0}
.page{height:100vh;display:flex;flex-direction:column;padding:0 20rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.body{height:0;flex:1;display:flex;gap:16rpx;min-height:0}.side{width:174rpx;flex:none;height:100%;background:#fff;border-radius:16rpx}.cat{min-height:72rpx;padding:0 16rpx;display:flex;align-items:center;color:#53677f;font-size:24rpx;border-bottom:1rpx solid #f1f4f8}.cat.active{color:var(--color-primary, #1769d8);font-weight:600;background:var(--color-primary-soft, #edf5ff)}.content{height:100%;flex:1;padding-bottom:90rpx;box-sizing:border-box}.tool{padding-bottom:14rpx}.tool button{height:62rpx;line-height:62rpx;margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;background:#fff;border-radius:12rpx}.row{padding:22rpx 20rpx 18rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:12rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-success{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-danger{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tags{display:flex;gap:10rpx;margin-top:14rpx}.tags text{padding:4rpx 12rpx;color:var(--color-primary, #1769d8);font-size:22rpx;background:var(--color-primary-soft, #edf5ff);border:1rpx solid var(--color-primary-border, #bfdbff);border-radius:999rpx}.grid{display:grid;gap:9rpx;padding:14rpx 0;margin-top:14rpx;color:#66778c;font-size:22rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;justify-content:flex-end;gap:12rpx;padding-top:14rpx}.actions button{min-height:48rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:46rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:50;display:flex;align-items:flex-end;background:rgba(0,0,0,.35)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:24rpx;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:88rpx;line-height:88rpx;text-align:center;color:#1d2f46;font-size:30rpx;font-weight:600;border-bottom:1rpx solid #eef1f5}.field{display:flex;align-items:center;min-height:92rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:180rpx;flex:none;color:#33455d;font-size:26rpx}.field>picker{display:block;flex:1;min-width:0}.field input,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:26rpx;text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:34rpx;text-align:right}.column{align-items:flex-start;flex-direction:column;padding:18rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:118rpx;font-size:26rpx}.modal-actions{display:flex;gap:18rpx;padding:24rpx}.modal-actions button{flex:1;margin:0;color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #edf5ff);border-radius:12rpx}.modal-actions .primary{color:#fff;background:var(--color-primary, #1769d8)}button::after{border:0}
</style>
src/pages/wls/sn/index.vue
@@ -86,5 +86,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-approved{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:50;display:flex;align-items:flex-end;background:rgba(0,0,0,.35)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:24rpx;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:88rpx;line-height:88rpx;color:#1d2f46;font-size:30rpx;font-weight:600;text-align:center;border-bottom:1rpx solid #eef1f5}.field{display:flex;align-items:center;min-height:92rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:26rpx}.field>picker{display:block;flex:1;min-width:0}.required{color:#e64340}.field input,.picker{min-width:0;flex:1;color:#1e3049;font-size:26rpx;text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx}.picker text:first-child{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:34rpx;text-align:right}.modal-actions{display:flex;gap:18rpx;padding:24rpx}.modal-actions button{flex:1;margin:0;color:#1769d8;background:#edf5ff;border-radius:12rpx}.modal-actions .primary{color:#fff;background:#1769d8}.modal-list{max-height:60vh;padding:20rpx 24rpx;box-sizing:border-box;background:#f3f6fb}.select-row{display:grid;gap:9rpx;padding:22rpx;margin-bottom:16rpx;color:#66778c;font-size:23rpx;background:#fff;border-radius:14rpx}.select-title{color:#20334c;font-size:29rpx;font-weight:600}button::after{border:0}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:0;flex:1;padding-bottom: 132rpx}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-approved{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #edf5ff);border:1rpx solid var(--color-primary-border, #bfdbff)}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width: 104rpx; height: 104rpx; min-height: 104rpx;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:50;display:flex;align-items:flex-end;background:rgba(0,0,0,.35)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:24rpx;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:88rpx;line-height:88rpx;color:#1d2f46;font-size:30rpx;font-weight:600;text-align:center;border-bottom:1rpx solid #eef1f5}.field{display:flex;align-items:center;min-height:92rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:26rpx}.field>picker{display:block;flex:1;min-width:0}.required{color:#e64340}.field input,.picker{min-width:0;flex:1;color:#1e3049;font-size:26rpx;text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx}.picker text:first-child{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:34rpx;text-align:right}.modal-actions{display:flex;gap:18rpx;padding:24rpx}.modal-actions button{flex:1;margin:0;color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #edf5ff);border-radius:12rpx}.modal-actions .primary{color:#fff;background:var(--color-primary, #1769d8)}.modal-list{max-height:60vh;padding:20rpx 24rpx;box-sizing:border-box;background:#f3f6fb}.select-row{display:grid;gap:9rpx;padding:22rpx;margin-bottom:16rpx;color:#66778c;font-size:23rpx;background:#fff;border-radius:14rpx}.select-title{color:#20334c;font-size:29rpx;font-weight:600}button::after{border:0}
</style>
src/pages/wls/transaction/index.vue
@@ -53,5 +53,5 @@
  </template><view v-else class="state">登录后查看库存事务流水</view></view>
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:80rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-success{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-danger{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.qty-pos{color:#17865a;font-weight:600}.qty-neg{color:#c65050;font-weight:600}.grid{display:grid;gap:10rpx;padding-top:16rpx;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:0;flex:1;padding-bottom:80rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-success{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-danger{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.qty-pos{color:#17865a;font-weight:600}.qty-neg{color:#c65050;font-weight:600}.grid{display:grid;gap:10rpx;padding-top:16rpx;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}
</style>
src/pages/wls/warehouse/area.vue
@@ -138,5 +138,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.tip{margin:18rpx 0 0;color:#53677f;font-size:24rpx}.search{display:flex;align-items:center;height:80rpx;margin:16rpx 0;padding:0 20rpx;background:#fff;border-radius:16rpx}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:120rpx}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-success,.tag-draft{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-danger,.tag-cancelled{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tag-progress{color:#b57800;background:#fff7dd;border:1rpx solid #f3dc98}.tag-approved{color:#1769d8;background:#edf5ff;border:1rpx solid #bfdbff}.tag-finished{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-info{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:50;display:flex;align-items:flex-end;background:rgba(0,0,0,.35)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:24rpx;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:88rpx;line-height:88rpx;color:#1d2f46;font-size:30rpx;font-weight:600;text-align:center;border-bottom:1rpx solid #eef1f5}.field{display:flex;align-items:center;min-height:92rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:26rpx}.required{color:#e64340}.field>picker{display:block;flex:1;min-width:0}.field input,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:26rpx;text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:34rpx;text-align:right}.code-field input{flex:1}.code-field button{flex:none;min-width:132rpx;padding:0 14rpx;margin:0;color:#1769d8;font-size:23rpx;line-height:54rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.column{align-items:flex-start;flex-direction:column;padding:18rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:118rpx;font-size:26rpx}.modal-actions{display:flex;gap:18rpx;padding:24rpx}.modal-actions button{flex:1;margin:0;color:#1769d8;background:#edf5ff;border-radius:12rpx}.modal-actions .primary{color:#fff;background:#1769d8}button::after{border:0}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.tip{margin:18rpx 0 0;color:#53677f;font-size:24rpx}.search{display:flex;align-items:center;height:80rpx;margin:16rpx 0;padding:0 20rpx;background:#fff;border-radius:16rpx}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:0;flex:1;padding-bottom:120rpx}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-success,.tag-draft{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-danger,.tag-cancelled{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.tag-progress{color:#b57800;background:#fff7dd;border:1rpx solid #f3dc98}.tag-approved{color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #edf5ff);border:1rpx solid var(--color-primary-border, #bfdbff)}.tag-finished{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-info{color:#66778c;background:#f6f8fb;border:1rpx solid #dce4ee}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width: 104rpx; height: 104rpx; min-height: 104rpx;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:50;display:flex;align-items:flex-end;background:rgba(0,0,0,.35)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:24rpx;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:88rpx;line-height:88rpx;color:#1d2f46;font-size:30rpx;font-weight:600;text-align:center;border-bottom:1rpx solid #eef1f5}.field{display:flex;align-items:center;min-height:92rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:26rpx}.required{color:#e64340}.field>picker{display:block;flex:1;min-width:0}.field input,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:26rpx;text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:34rpx;text-align:right}.code-field input{flex:1}.code-field button{flex:none;min-width:132rpx;padding:0 14rpx;margin:0;color:var(--color-primary, #1769d8);font-size:23rpx;line-height:54rpx;background:#fff;border:1rpx solid var(--color-primary, #1769d8);border-radius:8rpx}.column{align-items:flex-start;flex-direction:column;padding:18rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:118rpx;font-size:26rpx}.modal-actions{display:flex;gap:18rpx;padding:24rpx}.modal-actions button{flex:1;margin:0;color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #edf5ff);border-radius:12rpx}.modal-actions .primary{color:#fff;background:var(--color-primary, #1769d8)}button::after{border:0}
</style>
src/pages/wls/warehouse/form.vue
@@ -18,5 +18,5 @@
</script>
<template><view class="page"><view class="form-card"><view class="field code-field"><text>仓库编码 <text class="required">*</text></text><input v-model="form.code" :disabled="readonly" placeholder="请输入仓库编码" /><button v-if="!readonly" :loading="generating" :disabled="generating" @click="generateCode">自动生成</button></view><view class="field"><text>仓库名称 <text class="required">*</text></text><input v-model="form.name" :disabled="readonly" placeholder="请输入仓库名称" /></view><view class="field"><text>负责人</text><picker v-if="!readonly" :range="users" range-key="nickname" @change="selectUser"><view class="picker"><text>{{form.chargeUserName||'请选择负责人'}}</text><text>›</text></view></picker><text v-else class="value">{{form.chargeUserName||form.chargeUserId||'--'}}</text></view><view class="field"><text>仓库地址</text><input v-model="form.address" :disabled="readonly" placeholder="请输入仓库地址" /></view><view class="field"><text>面积(㎡)</text><input :value="String(form.area||'')" :disabled="readonly" type="digit" placeholder="请输入面积" @input="form.area=num($event.detail.value)" /></view><view class="field"><text>是否冻结</text><switch :checked="form.frozen" :disabled="readonly" @change="form.frozen=$event.detail.value" /></view><view v-if="readonly" class="field"><text>创建时间</text><text class="value">{{dateText(form.createTime)}}</text></view><view class="field column"><text>备注</text><textarea v-model="form.remark" :disabled="readonly" placeholder="请输入备注" ></textarea></view></view><button v-if="canSave" class="save" :loading="saving" :disabled="saving" @click="save">保存</button><button v-else-if="readonly&&hasPermission('mes:wm-warehouse:update')" class="save" @click="mode='edit'">编辑</button></view></template>
<style lang="scss" scoped>
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field>picker{display:block;flex:1;min-width:0}.field input,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx;text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:36rpx;text-align:right}.code-field button{flex:none;min-width:136rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:130rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:#1769d8;border-radius:12rpx}.save::after,button::after{border:0}
.page{min-height:100vh;padding:24rpx 30rpx 70rpx;background:#f6f7f9}.form-card{overflow:hidden;background:#fff;border-radius:16rpx}.field{display:flex;align-items:center;min-height:96rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:190rpx;flex:none;color:#33455d;font-size:27rpx}.field>picker{display:block;flex:1;min-width:0}.field input,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:27rpx;text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:36rpx;text-align:right}.code-field button{flex:none;min-width:136rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:24rpx;line-height:56rpx;background:#fff;border:1rpx solid var(--color-primary, #1769d8);border-radius:8rpx}.column{align-items:flex-start;flex-direction:column;padding:20rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:130rpx;font-size:27rpx}.save{margin-top:32rpx;color:#fff;font-size:30rpx;background:var(--color-primary, #1769d8);border-radius:12rpx}.save::after,button::after{border:0}
</style>
src/pages/wls/warehouse/index.vue
@@ -79,5 +79,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:150rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-success{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-danger{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.search{display:flex;align-items:center;height:80rpx;margin:20rpx 0 16rpx;padding:0 20rpx;background:#fff;border-radius:16rpx;box-shadow:0 8rpx 20rpx rgba(43,69,107,.06)}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:0;flex:1;padding-bottom: 132rpx;box-sizing:border-box}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-success{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-danger{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.actions button::after,.fab::after{border:0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width: 104rpx; height: 104rpx; min-height: 104rpx;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}
</style>
src/pages/wls/warehouse/location.vue
@@ -121,5 +121,5 @@
</template>
<style lang="scss" scoped>
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.tip{margin:18rpx 0 0;color:#53677f;font-size:24rpx}.search{display:flex;align-items:center;height:80rpx;margin:16rpx 0;padding:0 20rpx;background:#fff;border-radius:16rpx}.search input{flex:1;font-size:27rpx}.search text{color:#1769d8;font-size:24rpx}.content{height:0;flex:1;padding-bottom:120rpx}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-success{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-danger{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:#1769d8;font-size:22rpx;line-height:48rpx;background:#f5f8ff;border:1rpx solid #8ab3ee;border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width:132rpx;height:132rpx;min-height:132rpx;padding:0;margin:0;background:#1769d8;border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:50;display:flex;align-items:flex-end;background:rgba(0,0,0,.35)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:24rpx;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:88rpx;line-height:88rpx;color:#1d2f46;font-size:30rpx;font-weight:600;text-align:center;border-bottom:1rpx solid #eef1f5}.field{display:flex;align-items:center;min-height:92rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:180rpx;flex:none;color:#33455d;font-size:26rpx}.required{color:#e64340}.field>picker{display:block;flex:1;min-width:0}.field input,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:26rpx;text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:34rpx;text-align:right}.code-field input{flex:1}.code-field button{flex:none;min-width:132rpx;padding:0 14rpx;margin:0;color:#1769d8;font-size:23rpx;line-height:54rpx;background:#fff;border:1rpx solid #1769d8;border-radius:8rpx}.column{align-items:flex-start;flex-direction:column;padding:18rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:118rpx;font-size:26rpx}.modal-actions{display:flex;gap:18rpx;padding:24rpx}.modal-actions button{flex:1;margin:0;color:#1769d8;background:#edf5ff;border-radius:12rpx}.modal-actions .primary{color:#fff;background:#1769d8}button::after{border:0}
.page{height:100vh;display:flex;flex-direction:column;padding:0 30rpx;box-sizing:border-box;overflow:hidden;background:#f3f6fb}.tip{margin:18rpx 0 0;color:#53677f;font-size:24rpx}.search{display:flex;align-items:center;height:80rpx;margin:16rpx 0;padding:0 20rpx;background:#fff;border-radius:16rpx}.search input{flex:1;font-size:27rpx}.search text{color:var(--color-primary, #1769d8);font-size:24rpx}.content{height:0;flex:1;padding-bottom:120rpx}.row{padding:24rpx 22rpx 20rpx;margin-bottom:18rpx;background:#fff;border-radius:16rpx;box-shadow:0 10rpx 24rpx rgba(43,69,107,.08)}.head{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.head>view:first-child{display:flex;min-width:0;flex:1;flex-direction:column;gap:8rpx}.head>view:first-child text:last-child{color:#78879b;font-size:23rpx}.name{overflow:hidden;color:#20334c;font-size:30rpx;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.status-wrap{display:flex;align-items:flex-start;flex:none}.status{display:inline-flex;align-items:center;height:44rpx;padding:0 18rpx;font-size:23rpx;border-radius:999rpx}.tag-success{color:#17865a;background:#eafaf2;border:1rpx solid #b8efd5}.tag-danger{color:#c65050;background:#fff7f7;border:1rpx solid #e3a0a0}.grid{display:grid;gap:10rpx;padding:16rpx 0;margin-top:16rpx;color:#66778c;font-size:23rpx;border-top:1rpx solid #edf1f6;border-bottom:1rpx solid #edf1f6}.grid text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:12rpx;padding-top:16rpx}.actions button{min-height:50rpx;padding:0 16rpx;margin:0;color:var(--color-primary, #1769d8);font-size:22rpx;line-height:48rpx;background:var(--color-primary-soft, #f5f8ff);border:1rpx solid var(--color-primary-border, #8ab3ee);border-radius:8rpx}.actions .danger{color:#c65050;background:#fff7f7;border-color:#e3a0a0}.more,.state{display:block;padding:35rpx;color:#8795a8;font-size:26rpx;text-align:center}.error{color:#c3654d}.fab{position:fixed;right:30rpx;bottom:calc(32rpx + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;width: 104rpx; height: 104rpx; min-height: 104rpx;padding:0;margin:0;background:var(--color-primary, #1769d8);border-radius:50%;box-shadow:0 12rpx 24rpx rgba(23,105,216,.3)}.fab view{width:38rpx;height:38rpx;background:linear-gradient(#fff,#fff) center/38rpx 8rpx no-repeat,linear-gradient(#fff,#fff) center/8rpx 38rpx no-repeat}.fab view::before,.fab view::after{display:none;content:none}.mask{position:fixed;left:0;right:0;top:0;bottom:0;z-index:50;display:flex;align-items:flex-end;background:rgba(0,0,0,.35)}.modal{width:100%;max-height:86vh;overflow:auto;padding-bottom:24rpx;background:#fff;border-radius:24rpx 24rpx 0 0}.modal-title{height:88rpx;line-height:88rpx;color:#1d2f46;font-size:30rpx;font-weight:600;text-align:center;border-bottom:1rpx solid #eef1f5}.field{display:flex;align-items:center;min-height:92rpx;padding:0 24rpx;gap:20rpx;border-bottom:1rpx solid #eef1f5}.field>text:first-child{width:180rpx;flex:none;color:#33455d;font-size:26rpx}.required{color:#e64340}.field>picker{display:block;flex:1;min-width:0}.field input,.picker,.value{min-width:0;flex:1;color:#1e3049;font-size:26rpx;text-align:right}.picker{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12rpx;color:#65758a}.picker text:first-child,.value{min-width:0;flex:1;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap}.picker text:last-child{flex:none;width:24rpx;color:#8092a7;font-size:34rpx;text-align:right}.code-field input{flex:1}.code-field button{flex:none;min-width:132rpx;padding:0 14rpx;margin:0;color:var(--color-primary, #1769d8);font-size:23rpx;line-height:54rpx;background:#fff;border:1rpx solid var(--color-primary, #1769d8);border-radius:8rpx}.column{align-items:flex-start;flex-direction:column;padding:18rpx 24rpx}.column>text:first-child{width:auto}.column textarea{width:100%;height:118rpx;font-size:26rpx}.modal-actions{display:flex;gap:18rpx;padding:24rpx}.modal-actions button{flex:1;margin:0;color:var(--color-primary, #1769d8);background:var(--color-primary-soft, #edf5ff);border-radius:12rpx}.modal-actions .primary{color:#fff;background:var(--color-primary, #1769d8)}button::after{border:0}
</style>
src/pages/workbench/index.vue
@@ -392,7 +392,7 @@
    background: linear-gradient(
      180deg,
      #dcecff 0,
      #edf5ff 250rpx,
      var(--color-primary-soft, #edf5ff) 250rpx,
      #f4f7fb 455rpx
    );
  }
@@ -409,7 +409,7 @@
    min-height: 152rpx;
    padding: 27rpx 28rpx;
    color: #fff;
    background: linear-gradient(135deg, #1769d8, #2b88ef);
    background: linear-gradient(135deg, var(--color-primary, #1769d8), #2b88ef);
    border: 1rpx solid rgba(255, 255, 255, 0.46);
    border-radius: 24rpx;
    box-shadow: 0 18rpx 32rpx rgba(23, 105, 216, 0.18);
@@ -504,7 +504,7 @@
    font-size: 25rpx;
  }
  .search-box > text {
    color: #1769d8;
    color: var(--color-primary, #1769d8);
    font-size: 21rpx;
  }
  .group-tabs {
@@ -527,7 +527,7 @@
  .group-tab-list text.active {
    color: #fff;
    font-weight: 600;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    box-shadow: 0 7rpx 14rpx rgba(23, 105, 216, 0.2);
  }
  .app-content {
@@ -552,7 +552,7 @@
    left: 0;
    width: 5rpx;
    content: "";
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 5rpx;
  }
  .section-heading > view text:first-child {
@@ -1020,7 +1020,7 @@
    width: 28rpx;
    height: 28rpx;
    border: 3rpx solid #b7cae7;
    border-top-color: #1769d8;
    border-top-color: var(--color-primary, #1769d8);
    border-radius: 50%;
    animation: spin 0.8s linear infinite;
  }
@@ -1096,7 +1096,7 @@
    color: #fff;
    font-size: 27rpx;
    line-height: 84rpx;
    background: #1769d8;
    background: var(--color-primary, #1769d8);
    border-radius: 42rpx;
  }
  @keyframes spin {
src/stores/theme.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,144 @@
import { computed, readonly, ref } from "vue";
export type ThemeKey = "blue" | "green" | "purple";
export interface AppTheme {
  key: ThemeKey;
  name: string;
  description: string;
  primary: string;
  primaryDark: string;
  primaryLight: string;
  primarySoft: string;
  primaryBorder: string;
  pageBackground: string;
  cardBackground: string;
}
export const THEME_STORAGE_KEY = "mom_app_theme";
export const appThemes: AppTheme[] = [
  {
    key: "blue",
    name: "商务蓝",
    description: "清晰稳重,适合日常办公",
    primary: "#1769d8",
    primaryDark: "#0f54b8",
    primaryLight: "#4b8ee8",
    primarySoft: "#eef5ff",
    primaryBorder: "#bfdbff",
    pageBackground: "#f6f7f9",
    cardBackground: "#ffffff",
  },
  {
    key: "green",
    name: "生产绿",
    description: "沉稳自然,突出生产状态",
    primary: "#16835d",
    primaryDark: "#0f6949",
    primaryLight: "#42a782",
    primarySoft: "#eaf8f2",
    primaryBorder: "#bdebd7",
    pageBackground: "#f5f8f7",
    cardBackground: "#ffffff",
  },
  {
    key: "purple",
    name: "科技紫",
    description: "层次鲜明,适合数据场景",
    primary: "#7156c7",
    primaryDark: "#5940ad",
    primaryLight: "#927de0",
    primarySoft: "#f3efff",
    primaryBorder: "#d8ccff",
    pageBackground: "#f7f6fa",
    cardBackground: "#ffffff",
  },
];
const defaultTheme = appThemes[0];
const currentTheme = ref<AppTheme>(defaultTheme);
function findTheme(key?: string) {
  return appThemes.find((item) => item.key === key) || defaultTheme;
}
function syncPlatformChrome(theme: AppTheme) {
  uni.setNavigationBarColor({
    frontColor: "#000000",
    backgroundColor: theme.cardBackground,
    animation: { duration: 180, timingFunc: "easeIn" },
    fail: () => undefined,
  });
  uni.setTabBarStyle({
    color: "#7a8494",
    selectedColor: theme.primary,
    backgroundColor: theme.cardBackground,
    borderStyle: "white",
    fail: () => undefined,
  });
}
function syncCssVariables(theme: AppTheme) {
  // #ifdef H5
  if (typeof document !== "undefined") {
    const root = document.documentElement;
    root.style.setProperty("--color-primary", theme.primary);
    root.style.setProperty("--color-primary-dark", theme.primaryDark);
    root.style.setProperty("--color-primary-light", theme.primaryLight);
    root.style.setProperty("--color-primary-soft", theme.primarySoft);
    root.style.setProperty("--color-primary-border", theme.primaryBorder);
    root.style.setProperty("--color-bg-page", theme.pageBackground);
    root.style.setProperty("--color-bg-card", theme.cardBackground);
  }
  // #endif
}
export function applyTheme(theme: AppTheme) {
  currentTheme.value = theme;
  syncCssVariables(theme);
  syncPlatformChrome(theme);
  uni.$emit("app-theme-change", theme);
}
export function restoreTheme() {
  let savedKey: string | undefined;
  try {
    savedKey = uni.getStorageSync(THEME_STORAGE_KEY) || undefined;
  } catch {
    savedKey = undefined;
  }
  applyTheme(findTheme(savedKey));
}
export function setTheme(key: ThemeKey) {
  const theme = findTheme(key);
  uni.setStorageSync(THEME_STORAGE_KEY, theme.key);
  applyTheme(theme);
}
export function resetTheme() {
  uni.removeStorageSync(THEME_STORAGE_KEY);
  applyTheme(defaultTheme);
}
export function useAppTheme() {
  return {
    themes: appThemes,
    theme: readonly(currentTheme),
    themeKey: computed(() => currentTheme.value.key),
    primaryColor: computed(() => currentTheme.value.primary),
    themeStyle: computed(() => ({
      "--color-primary": currentTheme.value.primary,
      "--color-primary-dark": currentTheme.value.primaryDark,
      "--color-primary-light": currentTheme.value.primaryLight,
      "--color-primary-soft": currentTheme.value.primarySoft,
      "--color-primary-border": currentTheme.value.primaryBorder,
      "--color-bg-page": currentTheme.value.pageBackground,
      "--color-bg-card": currentTheme.value.cardBackground,
    })),
    setTheme,
    resetTheme,
    restoreTheme,
  };
}
src/styles/theme.scss
@@ -3,15 +3,17 @@
// ============================================
// å“ç‰Œä¸»é¢˜è‰²ï¼šæ ¹æ®äº§å“å“ç‰Œå®šä½ä¿®æ”¹
$color-primary: #165dff;
$color-primary-light: #4080ff;
$color-primary-dark: #0e42d2;
$color-primary: #1769d8;
$color-primary-light: #4b8ee8;
$color-primary-dark: #0f54b8;
$color-primary-soft: #eef5ff;
$color-primary-border: #bfdbff;
// åŠŸèƒ½è‰²
$color-success: #00b42a;
$color-warning: #ff7d00;
$color-error: #f53f3f;
$color-info: #165dff;
$color-info: #1769d8;
// èƒŒæ™¯è‰²
$color-bg-page: #f5f6f7;