vue2-client 1.2.93 → 1.2.96

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 (44) hide show
  1. package/.env +15 -15
  2. package/.eslintrc.js +82 -82
  3. package/CHANGELOG.md +7 -0
  4. package/package.json +1 -1
  5. package/src/base-client/all.js +66 -64
  6. package/src/base-client/components/common/AmapMarker/AmapPointRendering.vue +113 -113
  7. package/src/base-client/components/common/CitySelect/CitySelect.vue +244 -244
  8. package/src/base-client/components/common/CitySelect/index.js +3 -3
  9. package/src/base-client/components/common/CitySelect/index.md +109 -109
  10. package/src/base-client/components/common/CreateQuery/CreateQuery.vue +547 -539
  11. package/src/base-client/components/common/CreateQuery/CreateQueryItem.vue +778 -773
  12. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQuery.vue +310 -310
  13. package/src/base-client/components/common/PersonSetting/PersonSetting.vue +221 -0
  14. package/src/base-client/components/common/PersonSetting/index.js +3 -0
  15. package/src/base-client/components/common/Upload/Upload.vue +152 -151
  16. package/src/base-client/components/common/Upload/index.js +3 -3
  17. package/src/base-client/components/common/XAddForm/XAddForm.vue +345 -345
  18. package/src/base-client/components/common/XAddNativeForm/XAddNativeForm.vue +322 -322
  19. package/src/base-client/components/common/XCard/XCard.vue +64 -64
  20. package/src/base-client/components/common/XForm/XForm.vue +268 -268
  21. package/src/base-client/components/common/XForm/XFormItem.vue +369 -358
  22. package/src/base-client/components/common/XFormTable/XFormTable.vue +507 -489
  23. package/src/base-client/components/iot/DeviceDetailsView/DeviceDetailsView.vue +232 -232
  24. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsCount.vue +678 -678
  25. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsException.vue +57 -57
  26. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsRead.vue +131 -131
  27. package/src/base-client/components/iot/DeviceTypeDetailsView/DeviceTypeDetailsView.vue +300 -300
  28. package/src/base-client/components/iot/WebmeterAnalysisView/WebmeterAnalysisView.vue +960 -960
  29. package/src/base-client/components/ticket/TicketSubmitSuccessView/TicketSubmitSuccessView.vue +532 -532
  30. package/src/base-client/plugins/compatible/LoginServiceOA.js +20 -20
  31. package/src/config/CreateQueryConfig.js +307 -301
  32. package/src/pages/resourceManage/orgListManage.vue +98 -98
  33. package/src/router/async/config.async.js +26 -26
  34. package/src/router/async/router.map.js +60 -60
  35. package/src/router/index.js +27 -27
  36. package/src/services/api/WebmeterAnalysisViewApi.js +24 -24
  37. package/src/services/api/common.js +58 -56
  38. package/src/services/api/index.js +39 -39
  39. package/src/services/api/iot/DeviceDetailsView/DeviceDetailsCountApi.js +18 -18
  40. package/src/services/api/manage.js +16 -16
  41. package/src/services/api/restTools.js +24 -24
  42. package/src/theme/default/style.less +47 -47
  43. package/src/utils/util.js +230 -230
  44. package/vue.config.js +163 -158
@@ -0,0 +1,221 @@
1
+ <template>
2
+ <div>
3
+ <a-input
4
+ @click="inputClick"
5
+ :value="valueView"
6
+ style="cursor:pointer"
7
+ readOnly/>
8
+ <a-modal
9
+ v-if="visible"
10
+ v-model="visible"
11
+ :title="placeholder"
12
+ :z-index="1031"
13
+ :bodyStyle="{ maxHeight: '68vh', overflowY: 'auto' }"
14
+ @ok="handleOk"
15
+ @close="visible=false"
16
+ >
17
+ <!-- 搜索框 -->
18
+ <a-input-search :value="searchValue" style="margin-bottom: 8px" placeholder="搜索" @change="handleSearch"/>
19
+ <!-- 树形图 -->
20
+ <a-tree
21
+ v-model="checkedKeys"
22
+ :expanded-keys="expandedKeys"
23
+ :selectable="false"
24
+ checkable
25
+ @expand="onExpand"
26
+ >
27
+ <!-- department -->
28
+ <a-tree-node
29
+ v-for="department in treeData"
30
+ v-show="!department.hidden"
31
+ :key="department.key"
32
+ :title="department.title">
33
+ <!-- person -->
34
+ <a-tree-node v-for="person in department.children" v-show="!person.hidden" :key="person.key">
35
+ <!-- 搜索关键词红色 -->
36
+ <template slot="title">
37
+ <span v-if="person.title.indexOf(searchValue) > -1">
38
+ {{ person.title.substr(0, person.title.indexOf(searchValue)) }}
39
+ <span style="color: #f50">{{ searchValue }}</span>
40
+ {{ person.title.substr(person.title.indexOf(searchValue) + searchValue.length) }}
41
+ </span>
42
+ <span v-else>{{ person.title }}</span>
43
+ </template>
44
+ </a-tree-node>
45
+ </a-tree-node>
46
+ </a-tree>
47
+ </a-modal>
48
+ </div>
49
+ </template>
50
+
51
+ <script>
52
+ import { commonApi, post } from '@vue2-client/services/api'
53
+
54
+ const departments = ['运维部', '项目部', '项目一部', '项目二部', '开发部', '售后部', '办公室', '管理员', '软件工程部', 'IC卡部', '销售部']
55
+
56
+ export default {
57
+ name: 'PersonSetting',
58
+ data () {
59
+ return {
60
+ searchValue: '',
61
+ treeData: [],
62
+ checkedKeys: [],
63
+ expandedKeys: [],
64
+ sourceTreeData: [],
65
+ visible: false,
66
+ valueView: this.placeholder
67
+ }
68
+ },
69
+ props: {
70
+ buttonText: {
71
+ type: String,
72
+ default: '选择人员'
73
+ },
74
+ placeholder: {
75
+ type: String,
76
+ default: '请选择人员'
77
+ },
78
+ value: {
79
+ type: Array,
80
+ default: () => []
81
+ },
82
+ // 默认选中key
83
+ defaultCheckedNames: {
84
+ type: Array,
85
+ default: () => []
86
+ },
87
+ defaultCheckedIds: {
88
+ type: Array,
89
+ default: () => []
90
+ },
91
+ // // 返回数据类型 String,Array 发现返回类型只能有一个
92
+ // type: {
93
+ // type: String,
94
+ // default: 'Array'
95
+ // },
96
+ // 返回数据字段 name , id
97
+ field: {
98
+ type: String,
99
+ default: 'name'
100
+ },
101
+ },
102
+ model: {
103
+ prop: 'value',
104
+ event: 'onOk'
105
+ },
106
+ watch: {},
107
+ components: {},
108
+ created () {
109
+ post(commonApi.getEmpTree, {}).then(res => {
110
+ this.sourceTreeData = res
111
+ })
112
+ },
113
+ methods: {
114
+ inputClick () {
115
+ this.visible = true
116
+ this.searchValue = ''
117
+ this.treeData = this.sourceTreeData
118
+ if (this.defaultCheckedIds.length > 0) {
119
+ this.checkedKeys = this.getCheckedKeys(this.defaultCheckedIds)
120
+ } else if (this.defaultCheckedNames.length > 0) {
121
+ this.checkedKeys = this.getCheckedKeys(this.defaultCheckedNames)
122
+ }
123
+ this.expandedKeys = []
124
+ },
125
+ // 获取选择得key
126
+ getCheckedKeys (arr) {
127
+ const brr = []
128
+ this.treeData.forEach(item => {
129
+ adaptToChildrenList(item)
130
+ })
131
+ function adaptToChildrenList (o) {
132
+ if (arr.some(item => o.key.indexOf(item) > -1)) {
133
+ brr.push(o.key)
134
+ }
135
+ if (o.children) {
136
+ for (const c of o.children) {
137
+ adaptToChildrenList(c)
138
+ }
139
+ }
140
+ }
141
+ return brr
142
+ },
143
+ handleOk () {
144
+ this.$emit('onOk', this.allPerson())
145
+ this.visible = false
146
+ },
147
+ onExpand (expandedKeys) {
148
+ this.expandedKeys = expandedKeys
149
+ },
150
+ // 搜索处理
151
+ handleSearch (e) {
152
+ const value = e.target.value.trim()
153
+ if (!value) {
154
+ this.treeData = this.sourceTreeData
155
+ this.expandedKeys = []
156
+ this.searchValue = ''
157
+ return
158
+ }
159
+ const expandedKeys = []
160
+ const treeData = JSON.parse(JSON.stringify(this.sourceTreeData))
161
+ // 过滤结果
162
+ for (const department of treeData) {
163
+ if (department.key.includes(value)) {
164
+ continue
165
+ }
166
+ let hasChildren = false
167
+ if (department.children) {
168
+ for (const person of department.children) {
169
+ if (!person.key.includes(value)) {
170
+ person.hidden = true
171
+ } else {
172
+ hasChildren = true
173
+ }
174
+ }
175
+ }
176
+ if (!hasChildren) {
177
+ department.hidden = true
178
+ } else {
179
+ expandedKeys.push(department.key)
180
+ }
181
+ }
182
+ this.treeData = treeData
183
+ this.expandedKeys = expandedKeys
184
+ this.searchValue = value
185
+ },
186
+ allPerson () {
187
+ const index = this.type === 'id' ? 1 : 0
188
+ const _allPerson = this.checkedKeys.filter(value => !departments.includes(value)).map(item => item.split('_')[index])
189
+ this.valueView = this.checkedKeys.filter(value => !departments.includes(value)).map(item => item.split('_')[0]).join(',')
190
+ return _allPerson
191
+ }
192
+ },
193
+ }
194
+ </script>
195
+ <style lang="less" scoped>
196
+ .ant-tree-title {
197
+ width: 100%;
198
+ }
199
+
200
+ .title {
201
+ float: left;
202
+ }
203
+
204
+ .ant-card-body {
205
+ :global {
206
+ .ant-tree {
207
+ line-height: 3;
208
+
209
+ li {
210
+ position: relative;
211
+ }
212
+ }
213
+ }
214
+ }
215
+
216
+ .ant-card-body .but_type {
217
+ float: right;
218
+ position: absolute;
219
+ right: 40px;
220
+ }
221
+ </style>
@@ -0,0 +1,3 @@
1
+ import PersonSetting from './PersonSetting'
2
+
3
+ export default PersonSetting
@@ -1,151 +1,152 @@
1
- <template>
2
- <div>
3
- <a-upload-dragger
4
- v-if="model.type === 'file'"
5
- name="file"
6
- :multiple="true"
7
- :accept="model.accept.join('')"
8
- :remove="deleteFileItem"
9
- :customRequest="uploadFiles"
10
- :file-list="uploadedFileList">
11
- <p class="ant-upload-drag-icon">
12
- <a-icon type="inbox"/>
13
- </p>
14
- <p class="ant-upload-text">
15
- 点击或拖动文件到该区域上传
16
- </p>
17
- <p class="ant-upload-hint">
18
- 支持单个或多个文件
19
- </p>
20
- </a-upload-dragger>
21
- <a-upload
22
- v-if=" model.type === 'image'"
23
- list-type="picture-card"
24
- :accept="model.accept.join('')"
25
- :customRequest="uploadFiles"
26
- :remove="deleteFileItem"
27
- :file-list="uploadedFileList">
28
- <a-icon type="plus"/>
29
- <div class="ant-upload-text">
30
- Upload
31
- </div>
32
- </a-upload>
33
- </div>
34
- </template>
35
-
36
- <script>
37
-
38
- import { post } from '@vue2-client/services/api'
39
- import { mapState } from 'vuex'
40
-
41
- export default {
42
- name: 'uploads',
43
- data () {
44
- return {
45
- uploadedFileList: [],
46
- }
47
- },
48
- props: {
49
- // 表单属性
50
- model: {
51
- type: Object,
52
- default: () => {
53
- return {}
54
- }
55
- },
56
- files: {
57
- type: Array,
58
- default: () => {
59
- return []
60
- }
61
- },
62
- images: {
63
- type: Array,
64
- default: () => {
65
- return []
66
- }
67
- }
68
- },
69
- computed: {
70
- ...mapState('account', { currUser: 'user' })
71
- },
72
- created () {
73
- this.uploadedFileList = this.model.type === 'file' ? [...this.files] : [...this.images]
74
- },
75
- methods: {
76
- uploadFiles (info) {
77
- if (this.uploadedFileList.length >= this.model.acceptCount) {
78
- this.$message.error(`当前表单限制仅可上传 ${this.model.acceptCount} 个文件`)
79
- return
80
- }
81
- // 初始化文件信息
82
- const fileInfo = {
83
- uid: info.file.uid,
84
- name: info.file.name,
85
- status: 'uploading',
86
- response: '',
87
- url: '',
88
- }
89
- // 放入上传列表中,以便于显示上传进度
90
- this.uploadedFileList.push(fileInfo)
91
- // 组装上传数据
92
- const headers = {
93
- 'Content-Type': 'multipart/form-data',
94
- }
95
- // TODO 暂时给默认值 基础表单调整好后处理
96
- const formData = new FormData()
97
- formData.append('avatar', info.file)
98
- formData.append('resUploadMode', this.model.resUploadMode ?? 'server')
99
- if (this.model.pathKey) {
100
- formData.append('pathKey', this.model.pathKey ?? 'Default')
101
- }
102
- // formData.append('stockAlias', this.model.stockAlias)
103
- formData.append('formType', this.model.type)
104
- formData.append('resUploadStock', this.model.resUploadStock)
105
- formData.append('filename', info.file.name)
106
- formData.append('filesize', (info.file.size / 1024 / 1024).toFixed(4))
107
- formData.append('f_operator', this.currUser ? this.currUser.username : '')
108
-
109
- // const url = '/webmeteruploadapi/resource'
110
- // if (process.env.NODE_ENV === 'production') {
111
- // url = `/${this.model.stockAlias}/webmeteruploadapi/resource`
112
- // }
113
- post('/webmeterresourceapi/upload', formData, { headers }).then(res => {
114
- // 根据服务端返回的结果判断成功与否,设置文件条目的状态
115
- if (res.success) {
116
- fileInfo.status = 'done'
117
- fileInfo.response = JSON.parse(res.data)
118
- fileInfo.id = JSON.parse(res.data).id
119
- fileInfo.url = JSON.parse(res.data).f_downloadpath
120
- this.$emit('setFiles', this.uploadedFileList.filter(item => item.status === 'done').map(item => item.id))
121
- this.$message.success('上传成功!')
122
- } else {
123
- fileInfo.status = 'error'
124
- fileInfo.response = res.data
125
- this.$message.error('上传失败!')
126
- }
127
- }).catch((e) => {
128
- fileInfo.status = 'error'
129
- fileInfo.response = e
130
- this.$message.error(`请求失败!${e}`)
131
- })
132
- },
133
- // 删除文件
134
- deleteFileItem (file) {
135
- if (file.id) {
136
- post('/rs/entity/t_files', { id: file.id, f_state: '删除' }).then(res => {
137
- }).catch(e => { })
138
- }
139
- // 找到当前文件所在列表的索引
140
- const index = this.uploadedFileList.indexOf(file)
141
- // 从列表中移除该文件
142
- this.uploadedFileList.splice(index, 1)
143
- this.$emit('setFiles', this.uploadedFileList.filter(item => item.status === 'done').map(item => item.id))
144
- return true
145
- }
146
- }
147
- }
148
- </script>
149
- <style lang="less" scoped>
150
-
151
- </style>
1
+ <template>
2
+ <div>
3
+ <a-upload-dragger
4
+ v-if="model.type === 'file'"
5
+ name="file"
6
+ :multiple="true"
7
+ :accept="model.accept.join('')"
8
+ :remove="deleteFileItem"
9
+ :customRequest="uploadFiles"
10
+ :file-list="uploadedFileList">
11
+ <p class="ant-upload-drag-icon">
12
+ <a-icon type="inbox"/>
13
+ </p>
14
+ <p class="ant-upload-text">
15
+ 点击或拖动文件到该区域上传
16
+ </p>
17
+ <p class="ant-upload-hint">
18
+ 支持单个或多个文件
19
+ </p>
20
+ </a-upload-dragger>
21
+ <a-upload
22
+ v-if=" model.type === 'image'"
23
+ list-type="picture-card"
24
+ :accept="model.accept.join('')"
25
+ :customRequest="uploadFiles"
26
+ :remove="deleteFileItem"
27
+ :file-list="uploadedFileList">
28
+ <a-icon type="plus"/>
29
+ <div class="ant-upload-text">
30
+ Upload
31
+ </div>
32
+ </a-upload>
33
+ </div>
34
+ </template>
35
+
36
+ <script>
37
+
38
+ import { post } from '@vue2-client/services/api'
39
+ import { mapState } from 'vuex'
40
+
41
+ export default {
42
+ name: 'uploads',
43
+ data () {
44
+ return {
45
+ uploadedFileList: [],
46
+ }
47
+ },
48
+ props: {
49
+ // 表单属性
50
+ model: {
51
+ type: Object,
52
+ default: () => {
53
+ return {}
54
+ }
55
+ },
56
+ files: {
57
+ type: Array,
58
+ default: () => {
59
+ return []
60
+ }
61
+ },
62
+ images: {
63
+ type: Array,
64
+ default: () => {
65
+ return []
66
+ }
67
+ }
68
+ },
69
+ computed: {
70
+ ...mapState('account', { currUser: 'user' })
71
+ },
72
+ created () {
73
+ this.uploadedFileList = this.model.type === 'file' ? [...this.files] : [...this.images]
74
+ },
75
+ methods: {
76
+ uploadFiles (info) {
77
+ if (this.uploadedFileList.length >= this.model.acceptCount) {
78
+ this.$message.error(`当前表单限制仅可上传 ${this.model.acceptCount} 个文件`)
79
+ return
80
+ }
81
+ // 初始化文件信息
82
+ const fileInfo = {
83
+ uid: info.file.uid,
84
+ name: info.file.name,
85
+ status: 'uploading',
86
+ response: '',
87
+ url: '',
88
+ }
89
+ // 放入上传列表中,以便于显示上传进度
90
+ this.uploadedFileList.push(fileInfo)
91
+ // 组装上传数据
92
+ const headers = {
93
+ 'Content-Type': 'multipart/form-data',
94
+ }
95
+ // TODO 暂时给默认值 基础表单调整好后处理
96
+ const formData = new FormData()
97
+ formData.append('avatar', info.file)
98
+ formData.append('resUploadMode', this.model.resUploadMode ?? 'server')
99
+ if (this.model.pathKey) {
100
+ formData.append('pathKey', this.model.pathKey ?? 'Default')
101
+ }
102
+ // formData.append('stockAlias', this.model.stockAlias)
103
+ formData.append('formType', this.model.type)
104
+ formData.append('useType', this.model.useType ?? 'Default')
105
+ formData.append('resUploadStock', this.model.resUploadStock)
106
+ formData.append('filename', info.file.name)
107
+ formData.append('filesize', (info.file.size / 1024 / 1024).toFixed(4))
108
+ formData.append('f_operator', this.currUser ? this.currUser.username : '')
109
+
110
+ // const url = '/webmeteruploadapi/resource'
111
+ // if (process.env.NODE_ENV === 'production') {
112
+ // url = `/${this.model.stockAlias}/webmeteruploadapi/resource`
113
+ // }
114
+ post('/webmeterresourceapi/upload', formData, { headers }).then(res => {
115
+ // 根据服务端返回的结果判断成功与否,设置文件条目的状态
116
+ if (res.success) {
117
+ fileInfo.status = 'done'
118
+ fileInfo.response = JSON.parse(res.data)
119
+ fileInfo.id = JSON.parse(res.data).id
120
+ fileInfo.url = JSON.parse(res.data).f_downloadpath
121
+ this.$emit('setFiles', this.uploadedFileList.filter(item => item.status === 'done').map(item => item.id))
122
+ this.$message.success('上传成功!')
123
+ } else {
124
+ fileInfo.status = 'error'
125
+ fileInfo.response = res.data
126
+ this.$message.error('上传失败!')
127
+ }
128
+ }).catch((e) => {
129
+ fileInfo.status = 'error'
130
+ fileInfo.response = e
131
+ this.$message.error(`请求失败!${e}`)
132
+ })
133
+ },
134
+ // 删除文件
135
+ deleteFileItem (file) {
136
+ if (file.id) {
137
+ post('/rs/entity/t_files', { id: file.id, f_state: '删除' }).then(res => {
138
+ }).catch(e => { })
139
+ }
140
+ // 找到当前文件所在列表的索引
141
+ const index = this.uploadedFileList.indexOf(file)
142
+ // 从列表中移除该文件
143
+ this.uploadedFileList.splice(index, 1)
144
+ this.$emit('setFiles', this.uploadedFileList.filter(item => item.status === 'done').map(item => item.id))
145
+ return true
146
+ }
147
+ }
148
+ }
149
+ </script>
150
+ <style lang="less" scoped>
151
+
152
+ </style>
@@ -1,3 +1,3 @@
1
- import Upload from './Upload'
2
-
3
- export default Upload
1
+ import Upload from './Upload'
2
+
3
+ export default Upload