张延森 4 лет назад
Родитель
Сommit
4981f1a692
2 измененных файлов: 125 добавлений и 0 удалений
  1. 6
    0
      config/routes.js
  2. 119
    0
      src/pages/property/ticket/Detail.jsx

+ 6
- 0
config/routes.js Просмотреть файл

@@ -641,6 +641,12 @@ export default [
641 641
                 name: '工单管理',
642 642
                 component: './property/ticket',
643 643
               },
644
+              {
645
+                path: 'bill/ticket/detail',
646
+                name: '工单详情',
647
+                component: './property/ticket/Detail',
648
+                hideInMenu: true,
649
+              },
644 650
             ]
645 651
           },
646 652
           // {

+ 119
- 0
src/pages/property/ticket/Detail.jsx Просмотреть файл

@@ -0,0 +1,119 @@
1
+import React, { useEffect, useState } from 'react'
2
+import { PageHeader, Descriptions, List, Steps, Row, Col, Rate  } from 'antd'
3
+import { fetch, fetchList, apis } from '@/utils/request'
4
+
5
+const TicketTypeDict = {
6
+  '0': '投诉',
7
+  '1': '报修',
8
+  '2': '联系物业',
9
+}
10
+
11
+const RepairTypeDict = {
12
+  '0': '公共区域',
13
+  '1': '房屋质量',
14
+  '2': '户内设施',
15
+}
16
+
17
+const imgGrid = {
18
+  gutter: 16,
19
+  xs: 1,
20
+  sm: 2,
21
+  md: 6,
22
+  lg: 6,
23
+  xl: 6,
24
+  xxl: 10,
25
+}
26
+
27
+const getTicketDetail = fetch(apis.ticket.ticketEdit)
28
+
29
+export default props => {
30
+  const [loading, setLoading] = useState(false)
31
+  const [ticketData, setTicketData] = useState({})
32
+  const [approvalProcessList, setApprovalProcessList] = useState([])
33
+
34
+  const ticketType = [
35
+    TicketTypeDict[ticketData.type] || '',
36
+    ticketData.type === '2' ? (RepairTypeDict[ticketData.repairType] || '') : ''
37
+  ].join('-')
38
+
39
+  const { id } = props.location.query
40
+
41
+  useEffect(() => {
42
+    getTicketDetail({data: {id}}).then(res => {
43
+      const { recordList } = res || {}
44
+      setTicketData(res)
45
+      setApprovalProcessList(res)
46
+    })
47
+  }, [])
48
+
49
+  return (
50
+    <div>
51
+      <PageHeader
52
+        title={ticketData.ticketTitle}
53
+        subTitle="工单详情"
54
+        backIcon={false}
55
+        style={{ borderBottom: '1px solid rgb(235, 237, 240)' }}
56
+      >
57
+        <Descriptions column={3}>
58
+          <Descriptions.Item label="工单号">{ticketData.id}</Descriptions.Item>
59
+          <Descriptions.Item label="工单类型">{ticketType}</Descriptions.Item>
60
+          <Descriptions.Item label="发起时间">{ticketData.createDate}</Descriptions.Item>
61
+          <Descriptions.Item label="发起人">{ticketData.createUserNmae}</Descriptions.Item>
62
+          <Descriptions.Item label="联系方式">{ticketData.loginName}</Descriptions.Item>
63
+          <Descriptions.Item label="负责人">{ticketData.tpUserNmae || '暂无'}</Descriptions.Item>
64
+          <Descriptions.Item label="工单内容">{ticketData.ticketContent}</Descriptions.Item>
65
+        </Descriptions>
66
+        {
67
+          ticketData.contentImageUrl && ticketData.contentImageUrl.length && (
68
+            <List dataSource={ticketData.contentImageUrl} grid={imgGrid} renderItem={it => {
69
+              <img src={it} alt="" style="width: 100%" />
70
+            }} />
71
+          )
72
+        }
73
+      </PageHeader>
74
+
75
+      <div>
76
+        <h4 style={{marginTop: '24px'}}>沟通记录</h4>
77
+        <Steps progressDot direction="vertical" current={1}>
78
+        {
79
+          (approvalProcessList || {}).map(item => {
80
+            return (
81
+              <Steps.Step key={item.id} title={item.statusName} subTitle={item.createDate} description={(
82
+                <div>
83
+                  {
84
+                    item.status - 0 === 5 && (
85
+                      <Descriptions column={2}>
86
+                        <Descriptions.Item label="评分"><Rate value={item.score}/></Descriptions.Item>
87
+                        <Descriptions.Item label="时间"><Rate value={item.createDate}/></Descriptions.Item>
88
+                        <Descriptions.Item label="评语">{item.comment}</Descriptions.Item>
89
+                      </Descriptions>
90
+                    )
91
+                  }
92
+                  {
93
+                    item.statusContent && item.statusContent.length && (
94
+                      item.statusContent.map(ctt => {
95
+                        return (
96
+                          <div>
97
+                            <div>{ `${ctt.userName} : ${ctt.content}` }</div>
98
+                            {
99
+                              ctt.imgURL && ctt.imgURL.length && (
100
+                                <List dataSource={ctt.imgURL} grid={imgGrid} renderItem={it => {
101
+                                  <img src={it.imageUrl} alt="" style="width: 100%" />
102
+                                }} />
103
+                              )
104
+                            }
105
+                          </div>
106
+                        )
107
+                      })
108
+                    )
109
+                  }
110
+                </div>
111
+              )}/>
112
+            )
113
+          })
114
+        }
115
+        </Steps>
116
+      </div>
117
+    </div>
118
+  )
119
+}