@appthen/cli 1.2.10 → 1.2.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/.gitignore +1 -0
  2. package/bin/main.js +92 -0
  3. package/dist/index.js +7014 -14988
  4. package/package.json +8 -1
  5. package/tests/test-app/.appthen/shadow-space-100001-test-app-e99876b1.json +1862 -0
  6. package/tests/test-app/.appthen/space-config.json +8 -0
  7. package/tests/test-app/docs/AI-Workflow.flow +112 -0
  8. package/tests/test-app/docs/Logic-1.flow +16 -0
  9. package/tests/test-app/docs/Logic.flow +16 -0
  10. package/tests/test-app/docs/Project-Blueprint-1.flow +119 -0
  11. package/tests/test-app/docs/Project-Blueprint.flow +119 -0
  12. package/tests/test-app/docs/README.md +3 -0
  13. package/tests/test-app/docs/claude.md +194 -0
  14. package/tests/test-app/docs/page_requirement_analysis.md +149 -0
  15. package/tests/test-app/docs//345/267/245/345/215/225/347/256/241/347/220/206/347/263/273/347/273/237/350/257/246/347/273/206/350/256/276/350/256/241.md +377 -0
  16. package/tests/test-app/src/apis/AddTodoPost.api.ts +42 -0
  17. package/tests/test-app/src/apis/DeleteTodoPost.api.ts +32 -0
  18. package/tests/test-app/src/apis/GetListPost.api.ts +38 -0
  19. package/tests/test-app/src/apis/TicketAttachmentUploadPost.api.ts +42 -0
  20. package/tests/test-app/src/apis/UpdateTodoPost.api.ts +46 -0
  21. package/tests/test-app/src/app.css +15 -0
  22. package/tests/test-app/src/cloud_functions/ticket|attachment|upload.node.ts +86 -0
  23. package/tests/test-app/src/cloud_functions/ticket|comment|add.node.ts +65 -0
  24. package/tests/test-app/src/cloud_functions/types|entity|Ticket.node.ts +88 -0
  25. package/tests/test-app/src/cloud_functions/types|entity|TicketAttachment.node.ts +70 -0
  26. package/tests/test-app/src/cloud_functions/types|entity|TicketCategory.node.ts +56 -0
  27. package/tests/test-app/src/cloud_functions/types|entity|TicketComment.node.ts +62 -0
  28. package/tests/test-app/src/cloud_functions/types|entity|TicketHistory.node.ts +74 -0
  29. package/tests/test-app/src/cloud_functions/types|entity|TicketPriority.node.ts +68 -0
  30. package/tests/test-app/src/cloud_functions/types|entity|TicketStatus.node.ts +63 -0
  31. package/tests/test-app/src/cloud_functions/types|models|CreateTicketParams.node.ts +20 -0
  32. package/tests/test-app/src/cloud_functions/types|models|TicketListParams.node.ts +30 -0
  33. package/tests/test-app/src/cloud_functions/types|models|UpdateTicketParams.node.ts +22 -0
  34. package/tests/test-app/src/components/Button.js +11 -0
  35. package/tests/test-app/src/components/MessageCenter.tsx +506 -0
  36. package/tests/test-app/src/components/MouduleDemoNzp.tsx +40 -0
  37. package/tests/test-app/src/components/Timeline.tsx +145 -0
  38. package/tests/test-app/src/index.ts +2 -0
  39. package/tests/test-app/src/modules/work_order_module/apis/TicketCommentAddPost.api.ts +48 -0
  40. package/tests/test-app/src/modules/work_order_module/apis/TicketCreatePost.api.ts +52 -0
  41. package/tests/test-app/src/modules/work_order_module/apis/TicketDeleteDelete.api.ts +39 -0
  42. package/tests/test-app/src/modules/work_order_module/apis/TicketDetailGet.api.ts +39 -0
  43. package/tests/test-app/src/modules/work_order_module/apis/TicketListGet.api.ts +61 -0
  44. package/tests/test-app/src/modules/work_order_module/apis/TicketUpdatePut.api.ts +57 -0
  45. package/tests/test-app/src/modules/work_order_module/apis/TrainDoorFaultListGet.ts +76 -0
  46. package/tests/test-app/src/modules/work_order_module/apis/TrainDoorListGet.ts +76 -0
  47. package/tests/test-app/src/modules/work_order_module/apis/TrainDoorOperationRecordsGet.ts +284 -0
  48. package/tests/test-app/src/modules/work_order_module/apis/TrainDoorStatisticsGet.ts +96 -0
  49. package/tests/test-app/src/modules/work_order_module/cloud_function/category|list.node.ts +40 -0
  50. package/tests/test-app/src/modules/work_order_module/cloud_function/priority|list.node.ts +26 -0
  51. package/tests/test-app/src/modules/work_order_module/cloud_function/status|list.node.ts +26 -0
  52. package/tests/test-app/src/modules/work_order_module/cloud_function/ticket|create.node.ts +54 -0
  53. package/tests/test-app/src/modules/work_order_module/cloud_function/ticket|delete.node.ts +55 -0
  54. package/tests/test-app/src/modules/work_order_module/cloud_function/ticket|detail.node.ts +65 -0
  55. package/tests/test-app/src/modules/work_order_module/cloud_function/ticket|list.node.ts +85 -0
  56. package/tests/test-app/src/modules/work_order_module/cloud_function/ticket|update.node.ts +73 -0
  57. package/tests/test-app/src/modules/work_order_module/data_model/Ticket.m.ts +85 -0
  58. package/tests/test-app/src/modules/work_order_module/data_model/TicketCategory.m.ts +53 -0
  59. package/tests/test-app/src/modules/work_order_module/data_model/TicketStatus.m.ts +60 -0
  60. package/tests/test-app/src/modules/work_order_module//345/267/245/345/215/225/347/263/273/347/273/237/344/272/247/345/223/201/350/256/276/350/256/241/346/226/207/346/241/243.md +301 -0
  61. package/tests/test-app/src/modules/work_order_module//345/267/245/345/215/225/347/263/273/347/273/237/345/274/200/345/217/221/344/273/273/345/212/241/345/210/206/345/267/245/346/226/207/346/241/243.md +345 -0
  62. package/tests/test-app/src/pages/CustomerManagement.tsx +535 -0
  63. package/tests/test-app/src/pages/CyberpunkDashboard.tsx +348 -0
  64. package/tests/test-app/src/pages/CyberpunkProductManagement.tsx +637 -0
  65. package/tests/test-app/src/pages/CyberpunkUserList.tsx +316 -0
  66. package/tests/test-app/src/pages/DashboardV2.tsx +334 -0
  67. package/tests/test-app/src/pages/DataReport.tsx +298 -0
  68. package/tests/test-app/src/pages/DataStatistics.tsx +317 -0
  69. package/tests/test-app/src/pages/DepartmentManagement.tsx +503 -0
  70. package/tests/test-app/src/pages/FileExplorer.tsx +441 -0
  71. package/tests/test-app/src/pages/OrderDetail.tsx +393 -0
  72. package/tests/test-app/src/pages/ProductManagement.tsx +521 -0
  73. package/tests/test-app/src/pages/ProjectTimeline.tsx +395 -0
  74. package/tests/test-app/src/pages/RoleManagement.tsx +523 -0
  75. package/tests/test-app/src/pages/SLAManagement.tsx +668 -0
  76. package/tests/test-app/src/pages/StaticCyberpunkDashboard.tsx +462 -0
  77. package/tests/test-app/src/pages/StaticCyberpunkUserList.tsx +567 -0
  78. package/tests/test-app/src/pages/StudentWeaknessList.tsx +547 -0
  79. package/tests/test-app/src/pages/SystemSettings.tsx +422 -0
  80. package/tests/test-app/src/pages/TaskManagement.tsx +467 -0
  81. package/tests/test-app/src/pages/TicketCreate.tsx +27 -0
  82. package/tests/test-app/src/pages/TicketDetail.tsx +27 -0
  83. package/tests/test-app/src/pages/TicketList.tsx +27 -0
  84. package/tests/test-app/src/pages/TicketManagement.tsx +402 -0
  85. package/tests/test-app/src/pages/TicketManagementPage.tsx +1238 -0
  86. package/tests/test-app/src/pages/UserProfile.tsx +404 -0
  87. package/tests/test-app/src/pages/VisualAIIDEUpgrade.tsx +245 -0
  88. package/tests/test-app/src/pages/WorkflowDesigner.tsx +434 -0
  89. package/tests/test-app/src/pages/admin/dashboard.tsx +591 -0
  90. package/tests/test-app/src/pages/appthen_guide/ComponentTreeUnderstanding.tsx +26 -0
  91. package/tests/test-app/src/pages/appthen_guide/DataBindingLearning.tsx +26 -0
  92. package/tests/test-app/src/pages/article-list.tsx +222 -0
  93. package/tests/test-app/src/pages/babyProductRecommendationPage.tsx +168 -0
  94. package/tests/test-app/src/pages/back-end/adminRootLayout.tsx +155 -0
  95. package/tests/test-app/src/pages/back-end/adminRootLayout10.tsx +157 -0
  96. package/tests/test-app/src/pages/back-end/adminRootLayout2.tsx +156 -0
  97. package/tests/test-app/src/pages/back-end/adminRootLayout3.tsx +156 -0
  98. package/tests/test-app/src/pages/back-end/adminRootLayout4.tsx +157 -0
  99. package/tests/test-app/src/pages/back-end/adminRootLayout5.tsx +157 -0
  100. package/tests/test-app/src/pages/back-end/adminRootLayout6.tsx +157 -0
  101. package/tests/test-app/src/pages/back-end/adminRootLayout7.tsx +157 -0
  102. package/tests/test-app/src/pages/back-end/adminRootLayout8.tsx +157 -0
  103. package/tests/test-app/src/pages/back-end/adminRootLayout9.tsx +157 -0
  104. package/tests/test-app/src/pages/back-end/backgroundManagementSystem.css +5 -0
  105. package/tests/test-app/src/pages/back-end/backgroundManagementSystem.tsx +1745 -0
  106. package/tests/test-app/src/pages/category-list.tsx +179 -0
  107. package/tests/test-app/src/pages/comment-list.tsx +194 -0
  108. package/tests/test-app/src/pages/component/WorkOrderCard.tsx +140 -0
  109. package/tests/test-app/src/pages/cover.tsx +42 -0
  110. package/tests/test-app/src/pages/cyberpunk/cyberpunkCRMPage.tsx +1299 -0
  111. package/tests/test-app/src/pages/data-analytics.tsx +1872 -0
  112. package/tests/test-app/src/pages/data-overview.tsx +600 -0
  113. package/tests/test-app/src/pages/data_dashboard/blueBrightGreenTechnologyWind.css +181 -0
  114. package/tests/test-app/src/pages/data_dashboard/blueBrightGreenTechnologyWind.tsx +225 -0
  115. package/tests/test-app/src/pages/data_dashboard/blueLargeScreen.css +181 -0
  116. package/tests/test-app/src/pages/data_dashboard/blueLargeScreen.tsx +138 -0
  117. package/tests/test-app/src/pages/data_dashboard/component_library/BlueBrightGreenBorder.tsx +47 -0
  118. package/tests/test-app/src/pages/data_dashboard/component_library/FullScreenContainer.tsx +133 -0
  119. package/tests/test-app/src/pages/demo-error-page.tsx +119 -0
  120. package/tests/test-app/src/pages/department-list.tsx +183 -0
  121. package/tests/test-app/src/pages/description_of_mock_interface.md +32 -0
  122. package/tests/test-app/src/pages/digitalLargeScreen.css +181 -0
  123. package/tests/test-app/src/pages/digitalLargeScreen.tsx +1417 -0
  124. package/tests/test-app/src/pages/goods-list.tsx +233 -0
  125. package/tests/test-app/src/pages/housekeeping/adminDashboardPage.tsx +880 -0
  126. package/tests/test-app/src/pages/mobile_terminal/PersonalCenter.css +3 -0
  127. package/tests/test-app/src/pages/mobile_terminal/PersonalCenter.tsx +362 -0
  128. package/tests/test-app/src/pages/mobile_terminal/WorkOrderHomepage.tsx +337 -0
  129. package/tests/test-app/src/pages/mobile_terminal/newWorkOrder.tsx +224 -0
  130. package/tests/test-app/src/pages/mobile_terminal/tabbar.tsx +67 -0
  131. package/tests/test-app/src/pages/mobile_terminal/uiHandsOnPractice.tsx +638 -0
  132. package/tests/test-app/src/pages/mobile_terminal/workOrderDetails.tsx +346 -0
  133. package/tests/test-app/src/pages/mobile_terminal/workOrderPage.tsx +345 -0
  134. package/tests/test-app/src/pages/notice-list.tsx +217 -0
  135. package/tests/test-app/src/pages/order-detail.tsx +330 -0
  136. package/tests/test-app/src/pages/order-list.tsx +195 -0
  137. package/tests/test-app/src/pages/order-management.tsx +563 -0
  138. package/tests/test-app/src/pages/page/OrderList.tsx +230 -0
  139. package/tests/test-app/src/pages/role-list.tsx +184 -0
  140. package/tests/test-app/src/pages/simple/simplePage.tsx +92 -0
  141. package/tests/test-app/src/pages/simple-page.tsx +43 -0
  142. package/tests/test-app/src/pages/test-destructure.tsx +44 -0
  143. package/tests/test-app/src/pages/test-error-page.tsx +75 -0
  144. package/tests/test-app/src/pages/test-page-with-errors.tsx +51 -0
  145. package/tests/test-app/src/pages/test-page.tsx +101 -0
  146. package/tests/test-app/src/pages/test-render.tsx +52 -0
  147. package/tests/test-app/src/pages/test-return-type.tsx +41 -0
  148. package/tests/test-app/src/pages/test-type-assertion.tsx +37 -0
  149. package/tests/test-app/src/pages/testPage.css +3 -0
  150. package/tests/test-app/src/pages/testPage.tsx +158 -0
  151. package/tests/test-app/src/pages/ui/styleSelectorPage.tsx +1554 -0
  152. package/tests/test-app/src/pages/user-list.tsx +212 -0
  153. package/tests/test-app/src/pages/web_version/website.css +205 -0
  154. package/tests/test-app/src/pages/web_version/website.tsx +1066 -0
  155. package/tests/test-app/src/pages/wrong-page.tsx +50 -0
  156. package/tests/test-app/src/pages//345/276/205/345/212/236.apidoc.json +336 -0
  157. package/tests/test-app/src/project.json +1120 -0
  158. package/tests/test-app/src/store/global.store.ts +10 -0
  159. package/tests/test-app/src/types/CreateTicketParams.m.ts +20 -0
  160. package/tests/test-app/src/types/SLAPolicy.ts +50 -0
  161. package/tests/test-app/src/types/Ticket.ts +68 -0
  162. package/tests/test-app/src/types/TicketAttachment.m.ts +67 -0
  163. package/tests/test-app/src/types/TicketComment.m.ts +59 -0
  164. package/tests/test-app/src/types/TicketEvaluation.ts +44 -0
  165. package/tests/test-app/src/types/TicketHistory.m.ts +71 -0
  166. package/tests/test-app/src/types/TicketListParams.m.ts +30 -0
  167. package/tests/test-app/src/types/TicketPriority.m.ts +65 -0
  168. package/tests/test-app/src/types/TicketRecord.ts +47 -0
  169. package/tests/test-app/src/types/TrainDoor.ts +284 -0
  170. package/tests/test-app/src/types/UpdateTicketParams.m.ts +22 -0
  171. package/tests/test-app/src/utils/__afterRequest.util.ts +3 -0
  172. package/tests/test-app/src/utils/__beforeRequest.util.ts +10 -0
  173. package/tests/test-app/src/utils/testGlobalAction.util.ts +7 -0
@@ -0,0 +1,85 @@
1
+ /**
2
+ * 获取工单列表
3
+ * 支持分页、筛选、排序等功能
4
+ *
5
+ * @methods GET, POST
6
+ */
7
+ import cloud from '@lafjs/cloud';
8
+ import { DataSource, Like } from 'typeorm';
9
+ import { Response } from '@/utils/func';
10
+ import { Ticket } from '@/types/entity/Ticket';
11
+ import { TicketListParams } from '@/types/models/TicketListParams';
12
+
13
+ export default async function (ctx: FunctionContext) {
14
+ const { query, body } = ctx;
15
+ const params: TicketListParams = { ...query, ...body };
16
+
17
+ try {
18
+ const dataSource: DataSource = cloud.datasource.default;
19
+ const ticketRepository = dataSource.getRepository(Ticket);
20
+
21
+ // 构建查询条件
22
+ const whereConditions: any = {};
23
+
24
+ if (params.statusId) {
25
+ whereConditions.statusId = params.statusId;
26
+ }
27
+
28
+ if (params.priorityId) {
29
+ whereConditions.priorityId = params.priorityId;
30
+ }
31
+
32
+ if (params.categoryId) {
33
+ whereConditions.categoryId = params.categoryId;
34
+ }
35
+
36
+ if (params.creatorId) {
37
+ whereConditions.creatorId = params.creatorId;
38
+ }
39
+
40
+ if (params.assigneeId) {
41
+ whereConditions.assigneeId = params.assigneeId;
42
+ }
43
+
44
+ if (params.keyword) {
45
+ whereConditions.title = Like(`%${params.keyword}%`);
46
+ }
47
+
48
+ if (params.startDate && params.endDate) {
49
+ whereConditions.createdAt = {
50
+ $gte: new Date(params.startDate),
51
+ $lte: new Date(params.endDate)
52
+ };
53
+ }
54
+
55
+ // 分页参数
56
+ const page = Math.max(1, params.page || 1);
57
+ const pageSize = Math.max(1, Math.min(100, params.pageSize || 10));
58
+ const skip = (page - 1) * pageSize;
59
+
60
+ // 排序
61
+ const order = {
62
+ [params.sortBy || 'createdAt']: params.sortOrder || 'DESC'
63
+ };
64
+
65
+ // 查询数据
66
+ const [tickets, total] = await ticketRepository.findAndCount({
67
+ where: whereConditions,
68
+ order,
69
+ skip,
70
+ take: pageSize,
71
+ relations: ['category', 'status', 'priority', 'comments', 'attachments']
72
+ });
73
+
74
+ return Response.ok({
75
+ list: tickets,
76
+ total,
77
+ page,
78
+ pageSize,
79
+ totalPages: Math.ceil(total / pageSize)
80
+ });
81
+ } catch (error) {
82
+ console.error('查询工单列表失败:', error);
83
+ return Response.failed('查询失败,请稍后重试');
84
+ }
85
+ }
@@ -0,0 +1,73 @@
1
+ /**
2
+ * 更新工单
3
+ * 支持部分字段更新和状态变更
4
+ *
5
+ * @methods PUT
6
+ */
7
+ import cloud from '@lafjs/cloud';
8
+ import { DataSource } from 'typeorm';
9
+ import { Response } from '@/utils/func';
10
+ import { Ticket } from '@/types/entity/Ticket';
11
+ import { UpdateTicketParams } from '@/types/models/UpdateTicketParams';
12
+ import { TicketHistory } from '@/types/entity/TicketHistory';
13
+
14
+ export default async function (ctx: FunctionContext) {
15
+ const { id } = ctx.query;
16
+ const params: UpdateTicketParams = ctx.body;
17
+
18
+ if (!id) {
19
+ return Response.failed('工单ID不能为空');
20
+ }
21
+
22
+ try {
23
+ const dataSource: DataSource = cloud.datasource.default;
24
+ const ticketRepository = dataSource.getRepository(Ticket);
25
+ const historyRepository = dataSource.getRepository(TicketHistory);
26
+
27
+ // 查询原工单
28
+ const ticket = await ticketRepository.findOne({
29
+ where: { id: parseInt(id) }
30
+ });
31
+
32
+ if (!ticket) {
33
+ return Response.failed('工单不存在');
34
+ }
35
+
36
+ // 记录变更历史
37
+ const changes: any = {};
38
+ Object.keys(params).forEach(key => {
39
+ if (params[key as keyof UpdateTicketParams] !== undefined) {
40
+ changes[key] = {
41
+ old: ticket[key as keyof Ticket],
42
+ new: params[key as keyof UpdateTicketParams]
43
+ };
44
+ }
45
+ });
46
+
47
+ // 更新工单
48
+ const updatedTicket = await ticketRepository.save({
49
+ ...ticket,
50
+ ...params,
51
+ updatedAt: new Date()
52
+ });
53
+
54
+ // 记录历史
55
+ if (Object.keys(changes).length > 0) {
56
+ const history = historyRepository.create({
57
+ ticketId: parseInt(id),
58
+ userId: ctx.user?._id || 'system',
59
+ action: 'UPDATE',
60
+ description: '更新工单信息',
61
+ oldValue: changes,
62
+ newValue: params,
63
+ createdAt: new Date()
64
+ });
65
+ await historyRepository.save(history);
66
+ }
67
+
68
+ return Response.ok(updatedTicket);
69
+ } catch (error) {
70
+ console.error('更新工单失败:', error);
71
+ return Response.failed('更新失败,请稍后重试');
72
+ }
73
+ }
@@ -0,0 +1,85 @@
1
+ import { Entity, Column } from 'typeorm';
2
+ /**
3
+ * 工单实体
4
+ * 用于存储工单的基本信息和状态
5
+ */
6
+ @Entity({
7
+ name: "tickets"
8
+ })
9
+ export class Ticket {
10
+ id?: number;
11
+ /* 工单标题 */
12
+ @Column({
13
+ type: "varchar",
14
+ length: 200,
15
+ nullable: false
16
+ })
17
+ title?: string = "";
18
+ /* 工单描述 */
19
+ @Column({
20
+ type: "text",
21
+ nullable: true
22
+ })
23
+ description: string = "";
24
+ /* 工单编号 */
25
+ @Column({
26
+ type: "varchar",
27
+ length: 50,
28
+ nullable: false
29
+ })
30
+ ticketNumber?: string = "";
31
+ /* 创建人ID */
32
+ @Column({
33
+ type: "varchar",
34
+ length: 50,
35
+ nullable: false
36
+ })
37
+ creatorId?: string = "";
38
+ /* 处理人ID */
39
+ @Column({
40
+ type: "varchar",
41
+ length: 50,
42
+ nullable: true
43
+ })
44
+ assigneeId: string = "";
45
+ /* 分类ID */
46
+ @Column({
47
+ type: "int",
48
+ nullable: false
49
+ })
50
+ categoryId?: number;
51
+ /* 优先级ID */
52
+ @Column({
53
+ type: "int",
54
+ nullable: false
55
+ })
56
+ priorityId?: number;
57
+ /* 状态ID */
58
+ @Column({
59
+ type: "int",
60
+ nullable: false
61
+ })
62
+ statusId?: number;
63
+ /* 截止日期 */
64
+ @Column({
65
+ type: "timestamp",
66
+ nullable: true
67
+ })
68
+ dueDate: Date = new Date();
69
+ /* 标签 */
70
+ @Column({
71
+ type: "simple-array",
72
+ nullable: true
73
+ })
74
+ tags: string[] = [];
75
+ /* 创建时间 */
76
+ createdAt?: Date = new Date();
77
+ /* 更新时间 */
78
+ updatedAt?: Date = new Date();
79
+ /* 删除时间 */
80
+ @Column({
81
+ type: "timestamp",
82
+ nullable: true
83
+ })
84
+ deletedAt: Date = new Date();
85
+ }
@@ -0,0 +1,53 @@
1
+ import { Entity, Column } from 'typeorm';
2
+ /**
3
+ * 工单分类实体
4
+ * 用于管理工单的分类信息
5
+ */
6
+ @Entity({
7
+ name: "ticket_categories"
8
+ })
9
+ export class TicketCategory {
10
+ id?: number;
11
+ /* 分类名称 */
12
+ @Column({
13
+ type: "varchar",
14
+ length: 100,
15
+ nullable: false
16
+ })
17
+ name?: string = "";
18
+ /* 分类描述 */
19
+ @Column({
20
+ type: "text",
21
+ nullable: true
22
+ })
23
+ description: string = "";
24
+ /* 父分类ID */
25
+ @Column({
26
+ type: "int",
27
+ nullable: true
28
+ })
29
+ parentId: number = 0;
30
+ /* 排序 */
31
+ @Column({
32
+ type: "int",
33
+ default: 0
34
+ })
35
+ sortOrder?: number;
36
+ /* 是否启用 */
37
+ @Column({
38
+ type: "boolean",
39
+ default: true
40
+ })
41
+ isActive?: boolean = true;
42
+ /* 图标 */
43
+ @Column({
44
+ type: "varchar",
45
+ length: 100,
46
+ nullable: true
47
+ })
48
+ icon: string = "";
49
+ /* 创建时间 */
50
+ createdAt?: Date = new Date();
51
+ /* 更新时间 */
52
+ updatedAt?: Date = new Date();
53
+ }
@@ -0,0 +1,60 @@
1
+ import { Entity, Column } from 'typeorm';
2
+ /**
3
+ * 工单状态实体
4
+ * 用于管理工单的各种状态
5
+ */
6
+ @Entity({
7
+ name: "ticket_statuses"
8
+ })
9
+ export class TicketStatus {
10
+ id?: number;
11
+ /* 状态名称 */
12
+ @Column({
13
+ type: "varchar",
14
+ length: 50,
15
+ nullable: false
16
+ })
17
+ name?: string = "";
18
+ /* 状态描述 */
19
+ @Column({
20
+ type: "text",
21
+ nullable: true
22
+ })
23
+ description: string = "";
24
+ /* 状态颜色 */
25
+ @Column({
26
+ type: "varchar",
27
+ length: 20,
28
+ nullable: false
29
+ })
30
+ color?: string = "";
31
+ /* 状态类型 */
32
+ @Column({
33
+ type: "varchar",
34
+ length: 20,
35
+ nullable: false
36
+ })
37
+ type?: string = "";
38
+ /* 排序 */
39
+ @Column({
40
+ type: "int",
41
+ default: 0
42
+ })
43
+ sortOrder?: number;
44
+ /* 是否启用 */
45
+ @Column({
46
+ type: "boolean",
47
+ default: true
48
+ })
49
+ isActive?: boolean = true;
50
+ /* 是否为默认状态 */
51
+ @Column({
52
+ type: "boolean",
53
+ default: false
54
+ })
55
+ isDefault?: boolean;
56
+ /* 创建时间 */
57
+ createdAt?: Date = new Date();
58
+ /* 更新时间 */
59
+ updatedAt?: Date = new Date();
60
+ }
@@ -0,0 +1,301 @@
1
+ # 工单系统产品设计文档
2
+
3
+ ## 1. 产品概述
4
+
5
+ ### 1.1 产品定位
6
+ 工单系统是一个面向企业内部和客户服务场景的综合问题跟踪与解决平台,旨在帮助企业高效管理客户问题、内部任务和项目需求。
7
+
8
+ ### 1.2 核心价值
9
+ - **提升效率**:标准化问题处理流程,减少沟通成本
10
+ - **透明管理**:全程可追溯的问题处理记录
11
+ - **数据驱动**:基于数据分析优化服务质量和流程
12
+ - **协作优化**:多角色协同工作,提升团队效率
13
+
14
+ ## 2. 用户角色与权限
15
+
16
+ ### 2.1 角色定义
17
+ | 角色 | 描述 | 核心权限 |
18
+ |---|---|---|
19
+ | 普通用户 | 创建工单、查看进度 | 创建、查看、评论 |
20
+ | 客服人员 | 处理工单、分配任务 | 处理、分配、回复 |
21
+ | 技术工程师 | 解决技术问题 | 处理、技术回复、状态更新 |
22
+ | 管理员 | 系统管理、数据分析 | 全权限、配置管理 |
23
+ | 超级管理员 | 系统配置、用户管理 | 系统级权限 |
24
+
25
+ ### 2.2 权限矩阵
26
+ - **创建工单**:所有用户
27
+ - **查看工单**:创建人、处理人、管理员
28
+ - **编辑工单**:创建人(限定期内)、处理人、管理员
29
+ - **删除工单**:管理员
30
+ - **分配工单**:客服、管理员
31
+ - **状态变更**:处理人、管理员
32
+
33
+ ## 3. 功能模块设计
34
+
35
+ ### 3.1 工单管理
36
+ #### 3.1.1 工单创建
37
+ - **快速创建**:标题、描述、分类、优先级
38
+ - **高级创建**:支持附件上传、标签设置、截止日期
39
+ - **模板创建**:预设模板快速创建相似工单
40
+
41
+ #### 3.1.2 工单处理
42
+ - **状态流转**:新建 → 处理中 → 已解决 → 已关闭
43
+ - **优先级调整**:根据紧急程度动态调整
44
+ - **分配机制**:自动分配、手动分配、抢单模式
45
+
46
+ #### 3.1.3 工单查询
47
+ - **多维度筛选**:状态、优先级、分类、时间、处理人
48
+ - **全文搜索**:标题、描述、评论内容
49
+ - **高级搜索**:组合条件、自定义视图
50
+
51
+ ### 3.2 分类管理
52
+ #### 3.2.1 多级分类
53
+ ```
54
+ 技术问题
55
+ ├── 前端问题
56
+ │ ├── 页面显示异常
57
+ │ └── 交互问题
58
+ ├── 后端问题
59
+ │ ├── 接口异常
60
+ │ └── 性能问题
61
+ └── 数据问题
62
+ ```
63
+
64
+ #### 3.2.2 分类属性
65
+ - **基本信息**:名称、描述、图标
66
+ - **处理规则**:默认处理人、SLA时间
67
+ - **权限设置**:可见范围、创建权限
68
+
69
+ ### 3.3 优先级管理
70
+ | 优先级 | 响应时间 | 解决时间 | 颜色标识 |
71
+ |---|---|---|---|
72
+ | 紧急 | 15分钟 | 2小时 | 红色 |
73
+ | 高 | 1小时 | 8小时 | 橙色 |
74
+ | 中 | 4小时 | 24小时 | 黄色 |
75
+ | 低 | 24小时 | 72小时 | 蓝色 |
76
+
77
+ ### 3.4 通知机制
78
+ #### 3.4.1 通知场景
79
+ - **工单创建**:通知相关处理人
80
+ - **状态变更**:通知创建人和关注人
81
+ - **评论回复**:通知相关人员
82
+ - **即将超时**:预警通知
83
+
84
+ #### 3.4.2 通知渠道
85
+ - **站内消息**:系统内消息中心
86
+ - **邮件通知**:邮件推送
87
+ - **企业微信**:群消息推送
88
+ - **短信通知**:紧急情况短信
89
+
90
+ ## 4. 业务流程设计
91
+
92
+ ### 4.1 工单生命周期
93
+ ```mermaid
94
+ graph TD
95
+ A[新建] --> B[待分配]
96
+ B --> C[处理中]
97
+ C --> D[待确认]
98
+ D --> E[已解决]
99
+ E --> F[已关闭]
100
+ C --> G[已拒绝]
101
+ C --> H[已挂起]
102
+ ```
103
+
104
+ ### 4.2 处理流程
105
+ 1. **创建阶段**
106
+ - 用户提交工单
107
+ - 系统验证必填项
108
+ - 自动分类和优先级评估
109
+
110
+ 2. **分配阶段**
111
+ - 根据分类自动分配
112
+ - 负载均衡考虑
113
+ - 特殊规则处理
114
+
115
+ 3. **处理阶段**
116
+ - 处理人接收通知
117
+ - 问题分析和解决
118
+ - 进度更新和沟通
119
+
120
+ 4. **验证阶段**
121
+ - 用户确认解决
122
+ - 满意度评价
123
+ - 工单关闭或重开
124
+
125
+ ## 5. 界面设计
126
+
127
+ ### 5.1 工作台
128
+ #### 5.1.1 概览面板
129
+ - **待处理工单**:我的待处理、团队待处理
130
+ - **统计信息**:今日新增、处理中、已解决
131
+ - **快捷操作**:创建工单、批量处理
132
+
133
+ #### 5.1.2 工单列表
134
+ - **列表视图**:表格展示,支持排序和筛选
135
+ - **卡片视图**:看板模式,拖拽状态变更
136
+ - **时间轴视图**:按时间顺序展示
137
+
138
+ ### 5.2 工单详情页
139
+ #### 5.2.1 基本信息
140
+ - 工单标题、编号、状态
141
+ - 创建人、处理人、时间信息
142
+ - 分类、优先级、标签
143
+
144
+ #### 5.2.2 内容区域
145
+ - 问题描述(支持富文本)
146
+ - 附件预览和下载
147
+ - 评论和回复(支持@提及)
148
+
149
+ #### 5.2.3 操作区域
150
+ - 状态变更按钮
151
+ - 分配处理人
152
+ - 添加关注人
153
+
154
+ ### 5.3 管理后台
155
+ #### 5.3.1 分类管理
156
+ - 分类树形结构管理
157
+ - 分类属性配置
158
+ - 批量导入导出
159
+
160
+ #### 5.3.2 用户管理
161
+ - 用户角色分配
162
+ - 权限配置
163
+ - 工作量统计
164
+
165
+ #### 5.3.3 系统配置
166
+ - SLA规则设置
167
+ - 通知模板配置
168
+ - 自定义字段管理
169
+
170
+ ## 6. 技术架构
171
+
172
+ ### 6.1 前端架构
173
+ - **框架**:React + TypeScript
174
+ - **UI库**:Ant Design Pro
175
+ - **状态管理**:内置状态管理
176
+ - **构建工具**:Vite
177
+
178
+ ### 6.2 后端架构
179
+ - **运行环境**:Node.js + TypeScript
180
+ - **数据库**:MongoDB
181
+ - **ORM框架**:TypeORM
182
+ - **认证授权**:JWT Token
183
+
184
+ ### 6.3 部署架构
185
+ - **容器化**:Docker容器部署
186
+ - **负载均衡**:Nginx反向代理
187
+ - **数据备份**:定时自动备份
188
+ - **监控告警**:系统健康监控
189
+
190
+ ## 7. 数据模型设计
191
+
192
+ ### 7.1 核心实体关系
193
+ ```
194
+ Ticket (工单)
195
+ ├── TicketCategory (分类)
196
+ ├── TicketStatus (状态)
197
+ ├── TicketPriority (优先级)
198
+ ├── TicketComment (评论)
199
+ ├── TicketAttachment (附件)
200
+ └── TicketHistory (历史记录)
201
+ ```
202
+
203
+ ### 7.2 关键字段设计
204
+ - **工单编号**:自动生成,格式:TK-YYYYMMDD-000001
205
+ - **状态流转**:支持自定义状态机
206
+ - **时间记录**:创建、更新、解决、关闭时间
207
+ - **用户关联**:创建人、处理人、关注人
208
+
209
+ ## 8. 性能优化
210
+
211
+ ### 8.1 查询优化
212
+ - **索引设计**:关键字段建立索引
213
+ - **分页查询**:大数据量分页加载
214
+ - **缓存策略**:热点数据缓存
215
+
216
+ ### 8.2 用户体验
217
+ - **懒加载**:图片和附件懒加载
218
+ - **批量操作**:支持批量处理工单
219
+ - **实时更新**:WebSocket实时推送
220
+
221
+ ## 9. 安全设计
222
+
223
+ ### 9.1 数据安全
224
+ - **权限控制**:基于角色的访问控制
225
+ - **数据脱敏**:敏感信息脱敏处理
226
+ - **操作日志**:完整的操作审计日志
227
+
228
+ ### 9.2 系统安全
229
+ - **输入验证**:防止SQL注入和XSS攻击
230
+ - **文件安全**:附件类型和大小限制
231
+ - **接口安全**:API限流和防刷机制
232
+
233
+ ## 10. 扩展功能
234
+
235
+ ### 10.1 高级功能
236
+ - **工单模板**:预设模板快速创建
237
+ - **自动化规则**:基于条件的自动处理
238
+ - **知识库集成**:关联知识库文章
239
+ - **满意度调查**:自动发送满意度问卷
240
+
241
+ ### 10.2 集成能力
242
+ - **第三方登录**:企业微信、钉钉登录
243
+ - **消息推送**:企业微信、钉钉群机器人
244
+ - **API接口**:开放API供第三方集成
245
+ - **Webhook**:支持事件回调
246
+
247
+ ## 11. 数据分析
248
+
249
+ ### 11.1 核心指标
250
+ - **处理效率**:平均处理时间、首次响应时间
251
+ - **质量指标**:解决率、重开率、满意度
252
+ - **工作量**:个人工作量、团队工作量
253
+ - **趋势分析**:问题类型趋势、处理效率趋势
254
+
255
+ ### 11.2 报表功能
256
+ - **实时报表**:当前状态概览
257
+ - **周期报表**:日报、周报、月报
258
+ - **自定义报表**:灵活配置查询条件
259
+ - **导出功能**:支持Excel、PDF导出
260
+
261
+ ## 12. 实施计划
262
+
263
+ ### 12.1 阶段划分
264
+ - **第一阶段**(1-2周):基础功能开发
265
+ - 工单创建、处理、查询
266
+ - 用户权限管理
267
+ - 基础界面开发
268
+
269
+ - **第二阶段**(2-3周):高级功能
270
+ - 分类管理、优先级管理
271
+ - 通知机制、报表功能
272
+ - 界面优化
273
+
274
+ - **第三阶段**(1-2周):测试优化
275
+ - 功能测试、性能测试
276
+ - 用户体验优化
277
+ - 部署上线
278
+
279
+ ### 12.2 风险管控
280
+ - **技术风险**:关键技术预研和验证
281
+ - **进度风险**:里程碑节点检查
282
+ - **质量风险**:代码审查和测试覆盖
283
+ - **需求风险**:需求变更管理流程
284
+
285
+ ## 13. 运维支持
286
+
287
+ ### 13.1 监控指标
288
+ - **系统性能**:响应时间、并发量
289
+ - **业务指标**:工单量、处理效率
290
+ - **错误监控**:异常率、错误日志
291
+
292
+ ### 13.2 维护计划
293
+ - **日常维护**:数据备份、日志清理
294
+ - **定期优化**:性能调优、数据归档
295
+ - **版本升级**:功能迭代、安全更新
296
+
297
+ ## 14. 总结
298
+
299
+ 本工单系统采用模块化设计,支持灵活配置和扩展,能够满足不同规模企业的工单管理需求。通过标准化的流程和数据驱动的优化,显著提升问题处理效率和客户满意度。
300
+
301
+ 系统设计充分考虑了用户体验、性能优化和安全保障,为企业提供了一个可靠、高效的工单管理平台。