Compare commits
5 Commits
15a9f80b7f
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
92b77886e4
|
|||
|
45fb34710a
|
|||
|
eaf58e85a8
|
|||
|
d99c91533c
|
|||
|
c4b005adb8
|
@@ -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 |
@@ -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 (
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|
||||||
|
|||||||
@@ -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 && (
|
||||||
|
|||||||
@@ -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: '其他',
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user