Compare commits

...

5 Commits

Author SHA1 Message Date
Frudrax Cheng 92b77886e4 Update background.webp 2026-06-06 17:03:12 +08:00
Frudrax Cheng 45fb34710a Update background.webp 2026-06-06 16:53:25 +08:00
Frudrax Cheng eaf58e85a8 feat: update login background 2026-06-06 14:13:00 +08:00
Frudrax Cheng d99c91533c chore: rename dashboard 2026-06-06 14:04:00 +08:00
Frudrax Cheng c4b005adb8 feat: update project order types 2026-06-06 13:58:53 +08:00
8 changed files with 40 additions and 24 deletions
+2 -2
View File
@@ -101,7 +101,7 @@ VITE_API_BASE_URL=/api
### 管理后台 ### 管理后台
- 控制台(工单统计) - 企安工单中台(工单统计)
- 权限管理 - 权限管理
- 创建员工时录入姓名、电话、工号、岗位、角色 - 创建员工时录入姓名、电话、工号、岗位、角色
- 角色仅可选择:软件工程师、硬件工程师、商务经理、项目经理 - 角色仅可选择:软件工程师、硬件工程师、商务经理、项目经理
@@ -122,7 +122,7 @@ VITE_API_BASE_URL=/api
- 管理员可进行工单分配(重新分配工单负责人)或强制关闭工单 - 管理员可进行工单分配(重新分配工单负责人)或强制关闭工单
- 工单状态机:待处理 → 待客户确认 → 已完成 / 已退回 - 工单状态机:待处理 → 待客户确认 → 已完成 / 已退回
- 项目工单 - 项目工单
- 用于现场勘查、现场实施等项目任务 - 用于项目勘察、工程实施、定期维保、商务合作等项目任务
- 现场图片最多 18 张,工程师签名后提交完成 - 现场图片最多 18 张,工程师签名后提交完成
- 无客户签字环节,完成后形成项目完成电子表单 - 无客户签字环节,完成后形成项目完成电子表单
- 用户资料管理 - 用户资料管理
Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

+3 -3
View File
@@ -40,7 +40,7 @@ function AdminLayout() {
{ {
key: 'dashboard', key: 'dashboard',
icon: <DashboardOutlined />, icon: <DashboardOutlined />,
label: '控制台', label: '企安工单中台',
onClick: () => navigate('/admin/dashboard'), onClick: () => navigate('/admin/dashboard'),
}, },
{ {
@@ -135,13 +135,13 @@ function AdminLayout() {
const getTitle = () => { const getTitle = () => {
const path = location.pathname; const path = location.pathname;
if (path.includes('/dashboard')) return '控制台'; if (path.includes('/dashboard')) return '企安工单中台';
if (path.includes('/employee-serials')) return '权限管理'; if (path.includes('/employee-serials')) return '权限管理';
if (path.includes('/product-traces')) return '产品溯源'; if (path.includes('/product-traces')) return '产品溯源';
if (path.includes('/project-orders')) return '项目工单'; if (path.includes('/project-orders')) return '项目工单';
if (path.includes('/aftersales')) return '售后工单'; if (path.includes('/aftersales')) return '售后工单';
if (path.includes('/profile')) return '用户资料'; if (path.includes('/profile')) return '用户资料';
return '控制台'; return '企安工单中台';
}; };
return ( return (
+5 -4
View File
@@ -16,9 +16,10 @@ import './styles/PublicQuery.css';
import './styles/AftersalesConfirm.css'; import './styles/AftersalesConfirm.css';
const PROJECT_TYPE_LABEL: Record<ProjectType, string> = { const PROJECT_TYPE_LABEL: Record<ProjectType, string> = {
survey: '现场勘查', survey: '项目勘察',
implementation: '现场实施', implementation: '工程实施',
maintenance: '项目维保', maintenance: '定期维保',
business: '商务合作',
other: '其他', other: '其他',
}; };
@@ -304,7 +305,7 @@ function ProjectOrderCompletePage() {
rows={4} rows={4}
value={completionNote} value={completionNote}
onChange={(e) => setCompletionNote(e.target.value)} onChange={(e) => setCompletionNote(e.target.value)}
placeholder="请描述现场勘查、实施过程和最终完成情况" placeholder="请描述项目勘察、工程实施或现场完成情况"
/> />
</div> </div>
+5 -4
View File
@@ -38,9 +38,10 @@ import type {
import './styles/AftersalesDetail.css'; import './styles/AftersalesDetail.css';
const PROJECT_TYPE_LABEL: Record<ProjectType, string> = { const PROJECT_TYPE_LABEL: Record<ProjectType, string> = {
survey: '现场勘查', survey: '项目勘察',
implementation: '现场实施', implementation: '工程实施',
maintenance: '项目维保', maintenance: '定期维保',
business: '商务合作',
other: '其他', other: '其他',
}; };
@@ -483,7 +484,7 @@ function ProjectOrderDetailPage() {
label="完成说明" label="完成说明"
tooltip="现场完成后填写,扫码页和电子表单会展示此内容" tooltip="现场完成后填写,扫码页和电子表单会展示此内容"
> >
<Input.TextArea rows={4} placeholder="请描述现场勘查、实施过程和最终完成情况" /> <Input.TextArea rows={4} placeholder="请描述项目勘察、工程实施或现场完成情况" />
</Form.Item> </Form.Item>
{canEdit && ( {canEdit && (
+4 -3
View File
@@ -40,9 +40,10 @@ const WORK_ORDER_STATUS_COLOR: Record<ProjectOrderStatus, string> = {
}; };
const PROJECT_TYPE_LABEL: Record<ProjectType, string> = { const PROJECT_TYPE_LABEL: Record<ProjectType, string> = {
survey: '现场勘查', survey: '项目勘察',
implementation: '现场实施', implementation: '工程实施',
maintenance: '项目维保', maintenance: '定期维保',
business: '商务合作',
other: '其他', other: '其他',
}; };
+20 -7
View File
@@ -2,10 +2,13 @@
height: 100vh; height: 100vh;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: flex-start;
justify-content: center; justify-content: center;
padding: 20px; padding: 48px 20px 48px clamp(32px, 8vw, 120px);
background: linear-gradient(135deg, #dbeafe 0%, #e0e7ff 100%); background-image: linear-gradient(90deg, rgba(255, 255, 255, 0.82) 0%, rgba(255, 255, 255, 0.6) 36%, rgba(255, 255, 255, 0.12) 66%), url('@/assets/img/background.webp');
background-size: cover;
background-position: center;
background-repeat: no-repeat;
overflow: hidden; overflow: hidden;
} }
@@ -13,9 +16,9 @@
width: 100%; width: 100%;
max-width: 480px; max-width: 480px;
padding: 24px; padding: 24px;
backdrop-filter: blur(10px); backdrop-filter: blur(14px);
background: rgba(255, 255, 255, 0.9); background: rgba(255, 255, 255, 0.92);
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); box-shadow: 0 24px 60px -20px rgba(15, 23, 42, 0.36);
border-radius: 24px; border-radius: 24px;
animation: slideIn 0.5s ease-out; animation: slideIn 0.5s ease-out;
} }
@@ -63,6 +66,8 @@
.copyright { .copyright {
margin-top: 32px; margin-top: 32px;
width: 100%;
max-width: 480px;
text-align: center; text-align: center;
color: #6B7280; color: #6B7280;
font-size: 14px; font-size: 14px;
@@ -86,4 +91,12 @@
height: 16px; height: 16px;
vertical-align: middle; vertical-align: middle;
margin-right: 4px; margin-right: 4px;
} }
@media (max-width: 768px) {
.login-container {
align-items: center;
padding: 20px;
background-image: linear-gradient(180deg, rgba(255, 255, 255, 0.78) 0%, rgba(255, 255, 255, 0.9) 100%), url('@/assets/img/background.webp');
}
}
+1 -1
View File
@@ -270,7 +270,7 @@ export interface CustomerConfirmRequest {
rejectReason?: string; rejectReason?: string;
} }
export type ProjectType = 'survey' | 'implementation' | 'maintenance' | 'other'; export type ProjectType = 'survey' | 'implementation' | 'maintenance' | 'business' | 'other';
export type ProjectOrderStatus = 'created' | 'pending_completion' | 'closed'; export type ProjectOrderStatus = 'created' | 'pending_completion' | 'closed';
export interface ProjectOrder { export interface ProjectOrder {