vue2-client 1.20.15 → 1.20.17

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.
@@ -0,0 +1,12 @@
1
+ 2026-03-18 10:11:17 - afgit.config - INFO - 开始推送配置
2
+ 2026-03-18 10:11:17 - afgit.config - INFO - 开始推送配置文件(含新增与修改),目录: ./config_files
3
+ 2026-03-18 10:11:17 - afgit.config - DEBUG - 开始认证,URL: http://192.168.50.67:31467/api/af-auth/login, 用户名: 1
4
+ 2026-03-18 10:11:18 - afgit.config - ERROR - 解析认证响应失败: {"code":400,"data":null,"error":true,"msg":"用户不存在/密码错误","success":false}, 用户名: 1, 密码: Class123!@!
5
+ 2026-03-18 10:11:18 - afgit.config - ERROR - 认证失败,推送终止
6
+ 2026-03-18 10:11:18 - afgit.config - ERROR - 推送配置失败
7
+ 2026-03-18 10:11:24 - afgit.config - INFO - 开始拉取最新配置
8
+ 2026-03-18 10:11:24 - afgit.config - INFO - 开始下载配置文件到: ./config_files
9
+ 2026-03-18 10:11:24 - afgit.config - DEBUG - 开始认证,URL: http://192.168.50.67:31467/api/af-auth/login, 用户名: 1
10
+ 2026-03-18 10:11:25 - afgit.config - ERROR - 解析认证响应失败: {"code":400,"data":null,"error":true,"msg":"用户不存在/密码错误","success":false}, 用户名: 1, 密码: Class123!@!
11
+ 2026-03-18 10:11:25 - afgit.config - ERROR - 认证失败,下载终止
12
+ 2026-03-18 10:11:25 - afgit.config - ERROR - 拉取配置失败
@@ -0,0 +1,7 @@
1
+ 2026-02-27 09:24:44 - afgit.config - INFO - 开始拉取最新配置
2
+ 2026-02-27 09:24:44 - afgit.config - INFO - 创建本地目录: ./config_files
3
+ 2026-02-27 09:24:44 - afgit.config - INFO - 开始下载配置文件到: ./config_files
4
+ 2026-02-27 09:24:44 - afgit.config - DEBUG - 开始认证,URL: http://192.168.50.67:31467/api/af-auth/login, 用户名: 1
5
+ 2026-02-27 09:24:44 - afgit.config - ERROR - 解析认证响应失败: {"code":400,"data":null,"error":true,"msg":"用户不存在/密码错误","success":false}, 用户名: 1, 密码: Class123!@!
6
+ 2026-02-27 09:24:44 - afgit.config - ERROR - 认证失败,下载终止
7
+ 2026-02-27 09:24:44 - afgit.config - ERROR - 拉取配置失败
@@ -0,0 +1,6 @@
1
+ 2026-03-18 10:11:18 - afgit.config - ERROR - 解析认证响应失败: {"code":400,"data":null,"error":true,"msg":"用户不存在/密码错误","success":false}, 用户名: 1, 密码: Class123!@!
2
+ 2026-03-18 10:11:18 - afgit.config - ERROR - 认证失败,推送终止
3
+ 2026-03-18 10:11:18 - afgit.config - ERROR - 推送配置失败
4
+ 2026-03-18 10:11:25 - afgit.config - ERROR - 解析认证响应失败: {"code":400,"data":null,"error":true,"msg":"用户不存在/密码错误","success":false}, 用户名: 1, 密码: Class123!@!
5
+ 2026-03-18 10:11:25 - afgit.config - ERROR - 认证失败,下载终止
6
+ 2026-03-18 10:11:25 - afgit.config - ERROR - 拉取配置失败
@@ -0,0 +1,3 @@
1
+ 2026-02-27 09:24:44 - afgit.config - ERROR - 解析认证响应失败: {"code":400,"data":null,"error":true,"msg":"用户不存在/密码错误","success":false}, 用户名: 1, 密码: Class123!@!
2
+ 2026-02-27 09:24:44 - afgit.config - ERROR - 认证失败,下载终止
3
+ 2026-02-27 09:24:44 - afgit.config - ERROR - 拉取配置失败
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vue2-client",
3
- "version": "1.20.15",
3
+ "version": "1.20.17",
4
4
  "private": false,
5
5
  "scripts": {
6
6
  "serve": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve --no-eslint",
@@ -493,7 +493,7 @@ defineExpose({
493
493
  .ant-table:not(.ant-table-empty) {
494
494
  .ant-table-content {
495
495
  .ant-table-body {
496
- height: calc(var(--table-min-height, 300px) - 50px);
496
+ min-height: calc(var(--table-min-height, 300px) - 50px);
497
497
  }
498
498
  }
499
499
  }
@@ -2,54 +2,35 @@
2
2
  <a-card :bordered="false">
3
3
  <x-form-table
4
4
  title="示例表单"
5
- queryParamsName="scanCodeAndNFCRUD"
5
+ :queryParamsName="queryParamsName"
6
6
  :fixedAddForm="fixedAddForm"
7
7
  :externalSelectedRowKeys="selectedKeys"
8
- :defaultPageSize="100"
9
- :pageSizeArray="['100','200']"
10
8
  @action="action"
11
9
  @selectRow="selectRow"
12
10
  @columnClick="columnClick"
13
11
  @ceshi="ceshi"
14
- @startService="startService"
15
- serviceName="af-safecheck"
12
+ @rowDblClick="rowDblClick"
13
+ :defaultPageSize="5"
14
+ serviceName="af-revenue"
16
15
  ref="xFormTable"
17
16
  :reserveSpaceForButtons="true"
18
- >
19
- </x-form-table>
20
- <a-modal
21
- v-model="formModalVisible"
22
- title="工单回访"
23
- :zIndex="1002"
24
- width="50vw"
25
- :destroy-on-close="true"
26
- @cancel="formModalVisible = false"
27
- @ok="ok"
28
- >
29
- <x-add-native-form
30
- ref="xForm"
31
- />
32
- </a-modal>
33
- <button @click="backDealData">提交</button>
17
+ @addFormSubmit="addFormSubmit"
18
+ ></x-form-table>
34
19
  </a-card>
35
20
  </template>
36
21
 
37
22
  <script>
38
23
  import XFormTable from '@vue2-client/base-client/components/common/XFormTable/XFormTable.vue'
39
- import XAddNativeForm from '@vue2-client/base-client/components/common/XAddNativeForm/XAddNativeForm.vue'
40
24
  import { microDispatch } from '@vue2-client/utils/microAppUtils'
41
- import {getConfigByNameAsync, runLogic} from '@vue2-client/services/api/common'
42
-
43
25
  export default {
44
26
  name: 'Demo',
45
27
  components: {
46
- XFormTable,
47
- XAddNativeForm,
28
+ XFormTable
48
29
  },
49
- data () {
30
+ data() {
50
31
  return {
51
32
  // 查询配置文件名
52
- queryParamsName: 'ceshiCRUD',
33
+ queryParamsName: 'ChargeCenterQueryUserCRUD',
53
34
  // 查询配置左侧tree
54
35
  xTreeConfigName: 'addressType',
55
36
  // 新增表单固定值
@@ -62,32 +43,26 @@ export default {
62
43
  selectedKeys: [],
63
44
  selected: {
64
45
  keys: [],
65
- rows: [],
66
- },
67
- formModalVisible: false,
46
+ rows: []
47
+ }
68
48
  }
69
49
  },
50
+
70
51
  methods: {
71
- backDealData () {
72
- this.$refs.xFormTable.$refs.xForm.backDealData().then(data => {
73
- console.log('backDealData', data)
74
- console.log('selected', this.$refs.xFormTable.$refs.xForm?.form)
52
+ handleCustomQuery() {
53
+ this.$refs.xFormTable.queryTable({
54
+ uf_f_alias: 'XianFeng',
55
+ uf_f_card_id: '10500030'
75
56
  })
76
57
  },
58
+ rowDblClick(record) {
59
+ console.log('rowDblClick', record)
60
+ },
77
61
  // input框 行編輯參數傳遞
78
- ceshi (...args) {
62
+ ceshi(...args) {
79
63
  // attr, value, currentRecord, currentIndex, nextRecord, nextIndex
80
- const [attr, value, currentRecord, currentIndex, nextRecord, nextIndex] =
81
- args
82
- console.log(
83
- 'ceshi',
84
- attr,
85
- value,
86
- currentRecord,
87
- currentIndex,
88
- nextRecord,
89
- nextIndex
90
- )
64
+ const [attr, value, currentRecord, currentIndex, nextRecord, nextIndex] = args
65
+ console.log('ceshi', attr, value, currentRecord, currentIndex, nextRecord, nextIndex)
91
66
  // 示例:当按下 Enter 键且有下一行时,跳转到下一行的同一列
92
67
  // 可以在这里执行业务逻辑(例如:保存数据)
93
68
  console.log('当前行:', currentIndex, '下一行:', nextIndex)
@@ -98,61 +73,44 @@ export default {
98
73
  // 跳转到下一行的同一列
99
74
  this.$refs.xFormTable.$refs.xTable.focusInput(nextIndex, attr.model)
100
75
  },
101
- test () {
76
+ test() {
102
77
  this.$refs.xFormTable.setTableData([])
103
78
  },
104
- defaultF () {
79
+ defaultF() {
105
80
  this.$refs.xFormTable.setTableSize('default')
106
81
  },
107
- middleF () {
82
+ middleF() {
108
83
  this.$refs.xFormTable.setTableSize('middle')
109
84
  },
110
- smallF () {
85
+ smallF() {
111
86
  this.$refs.xFormTable.setTableSize('small')
112
87
  },
113
- columnClick (key, value, record) {
88
+ columnClick(key, value, record) {
114
89
  microDispatch({
115
90
  type: 'v3route',
116
91
  path: '/bingliguanli/dianzibingliluru',
117
- props: { selected: arguments[0].his_f_admission_id },
92
+ props: { selected: arguments[0].his_f_admission_id }
118
93
  })
119
94
  },
120
- startService (record, id, actionType) {
121
- getConfigByNameAsync('测试Form', 'af-safecheck').then(config => {
122
- this.formModalVisible = true
123
- this.$nextTick(
124
- () => {
125
- this.formModalVisible = true
126
- this.$refs.xForm.init({
127
- formItems: config.formJson,
128
- title: '工单回访',
129
- businessType: '新增',
130
- ...config,
131
- modifyModelData: { data: { id: 1 } },
132
- })
133
- })
134
- })
135
- // this.detailVisible = true
136
- // console.log('触发了详情操作', record, id, actionType)
137
- },
138
- async ok () {
139
- const res = await this.$refs.xForm.asyncSubmit()
140
- await runLogic('ceshwewei', res.realForm)
95
+ action(record, id, actionType) {
96
+ this.detailVisible = true
97
+ console.log('触发了详情操作', record, id, actionType)
141
98
  },
142
- onClose () {
99
+ onClose() {
143
100
  this.detailVisible = false
144
101
  // 关闭详情之后重新查询表单
145
102
  this.$refs.xFormTable.refreshTable(true)
146
103
  },
147
- selectRow (selectedRowKeys, selectedRows) {
104
+ selectRow(selectedRowKeys, selectedRows) {
148
105
  this.selected = {
149
106
  keys: selectedRowKeys,
150
- rows: selectedRows,
107
+ rows: selectedRows
151
108
  }
152
- console.log('selectedDemo', this.selected)
153
109
  },
154
- },
155
- computed: {},
110
+ addFormSubmit(params, callback){
111
+ callback()
112
+ }
113
+ }
156
114
  }
157
115
  </script>
158
116
 
@@ -1,417 +1,417 @@
1
- <template>
2
- <div id="ApplyBaseInformation">
3
- <a-card :loading="loading" :bordered="false" class="info-card-container">
4
- <div class="info-cards-wrapper">
5
- <!-- 正在进行 -->
6
- <div class="info-card">
7
- <div class="info-icon" :class="details.f_state === 1 ? 'status-completed' : 'status-progress'">
8
- <a-icon type="appstore" theme="filled" />
9
- </div>
10
- <div class="info-content">
11
- <div v-if="showProjectPerson" class="info-title">
12
- {{ details.f_entry_name }}
13
- <a-popover placement="bottom">
14
- <template slot="content">
15
- <div v-if="details.person.f_projectadmin">项目经理:{{ details.person.f_projectadmin }}</div>
16
- <div v-if="details.person.f_shangwuren">客户经理:{{ details.person.f_shangwuren }}</div>
17
- <div v-if="details.person.f_salemanager">销售经理:{{ details.person.f_salemanager }}</div>
18
- <div v-if="details.person.f_egionaladministrator">大区经理:{{ details.person.f_egionaladministrator }}</div>
19
- </template>
20
- <a-icon type="info-circle" class="info-icon-small" />
21
- </a-popover>
22
- </div>
23
- <div v-else class="info-title">{{ details.f_task_name }}</div>
24
- <div class="info-label" :class="details.f_state === 1 ? 'status-completed-text' : 'status-progress-text'">
25
- {{ `工单状态:${details.f_state === 1 ? '完工' : '正在进行'}` }}
26
- </div>
27
- </div>
28
- </div>
29
-
30
- <!-- 流程信息 -->
31
- <div v-show="details.f_state !== 1" class="info-card">
32
- <div class="info-icon workflow-icon">
33
- <a-icon type="profile" theme="filled" />
34
- </div>
35
- <div class="info-content">
36
- <div class="info-title">{{ details.f_workflow_define_name }}</div>
37
- <div class="info-label">{{ `当前流程节点:${details.f_sub_state}` }}</div>
38
- </div>
39
- </div>
40
-
41
- <!-- 创建日期 -->
42
- <div class="info-card">
43
- <div class="info-icon date-icon">
44
- <a-icon type="carry-out" theme="filled" />
45
- </div>
46
- <div class="info-content">
47
- <div class="info-title">{{ format(details.f_workflow_date, 'yyyy-MM-dd') }}</div>
48
- <div class="info-label">创建日期</div>
49
- </div>
50
- </div>
51
-
52
- <!-- 截止时间 -->
53
- <div class="info-card" title="若要修改完成时间,请通知部门领导进行修改!">
54
- <div class="info-icon time-icon">
55
- <a-icon type="clock-circle" theme="filled" />
56
- <a-dropdown>
57
- <a-icon type="down" class="dropdown-icon" />
58
- <a-menu slot="overlay">
59
- <a-menu-item @click="showChangeRecord">修改记录</a-menu-item>
60
- </a-menu>
61
- </a-dropdown>
62
- </div>
63
- <div class="info-content">
64
- <div class="info-title">
65
- {{ format(details.f_complete_time, 'yyyy-MM-dd') }}
66
- <!-- 修改任务时间 -->
67
- <a-popover v-if="isCreatedBy" v-model="openCompleteTime" title="修改任务时间" trigger="click">
68
- <template slot="content">
69
- <a-form-item label="任务整体完成时间" :label-col="{ span: 10 }" :wrapper-col="{ span: 14 }">
70
- <a-date-picker
71
- v-model="completeTime"
72
- :disabled-date="disabledDate"
73
- :show-today="false"
74
- :allow-clear="false"
75
- value-format="YYYY-MM-DD HH:mm:ss"
76
- >
77
- </a-date-picker>
78
- </a-form-item>
79
- <a-form-item label="当前环节截止时间" :label-col="{ span: 10 }" :wrapper-col="{ span: 14 }">
80
- <a-date-picker
81
- v-model="overdueTime"
82
- :disabled-date="disabledDate"
83
- :show-today="false"
84
- value-format="YYYY-MM-DD 17:00:00"
85
- >
86
- </a-date-picker>
87
- </a-form-item>
88
- <a-form-item label="修改原因" :label-col="{ span: 10 }" :wrapper-col="{ span: 14 }">
89
- <a-textarea
90
- v-model="note"
91
- :auto-size="{ minRows: 3, maxRows: 5 }"
92
- placeholder="修改原因"
93
- />
94
- </a-form-item>
95
- <div style="text-align: right">
96
- <a-button type="primary" size="small" @click="saveCompleteTime">确定</a-button>
97
- </div>
98
- </template>
99
- <a-icon type="edit" theme="filled" class="edit-icon" />
100
- </a-popover>
101
- </div>
102
- <div class="info-label">截止时间</div>
103
- </div>
104
- </div>
105
-
106
- <!-- 第五个 -->
107
- <div v-show="details.f_workflow_parentid" @click="ordRecord" class="info-card">
108
- <div class="info-icon parent-icon">
109
- <a-icon type="profile" theme="filled" />
110
- </div>
111
- <div class="info-content">
112
- <div class="info-title">{{ details.f_workflow_parentid }}</div>
113
- <div class="info-label">父级工单编号</div>
114
- </div>
115
- </div>
116
- </div>
117
- </a-card>
118
-
119
- <!-- 完成时间修改记录 -->
120
- <a-modal v-model="changeRecordVisible" title="完成时间修改记录" :footer="null" :z-index="1001" :width="1500">
121
- <a-table row-key="id" :columns="changeRecordColumns" :data-source="changeRecordDataSource" :loading="changeRecordLoading"></a-table>
122
- </a-modal>
123
-
124
- <!-- 父级工单 -->
125
- <a-modal v-model="masterWorkOrderVisible" title="主工单" :footer="null" :z-index="1001" :width="1500">
126
- <work-order-parent-details :workflow-id="details.f_workflow_parentid"></work-order-parent-details>
127
- </a-modal>
128
- </div>
129
- </template>
130
-
131
- <script>
132
- import { mapState } from 'vuex'
133
- import { formatDate } from '@vue2-client/utils/util'
134
- import { postByServiceName } from '@vue2-client/services/api/restTools'
135
- import moment from 'moment'
136
- import { workFlowViewApi } from '@vue2-client/services/api/workFlow'
137
- import WorkOrderParentDetails from '@vue2-client/pages/WorkflowDetail/WorkflowPageDetail/WorkOrderParentDetails'
138
-
139
- export default {
140
- name: 'WorkflowBaseInformation',
141
- components: { WorkOrderParentDetails },
142
- computed: {
143
- ...mapState('account', { currUser: 'user' }),
144
- ...mapState('setting', ['isMobile']),
145
- showProjectPerson: function () {
146
- if (!this.details.person) {
147
- return false
148
- }
149
- return Object.keys(this.details.person).length !== 0
150
- }
151
- },
152
- mounted () {
153
- this.init()
154
- },
155
- data () {
156
- return {
157
- // 控制加载
158
- loading: true,
159
- // 是否显示日期编辑
160
- openCompleteTime: false,
161
- // 完成时间
162
- completeTime: undefined,
163
- // 当前环节截止时间
164
- overdueTime: undefined,
165
- // 修改原因
166
- note: '',
167
- // 当前用户是否为创建人
168
- isCreatedBy: false,
169
- // 是否显示完成时间修改记录
170
- changeRecordVisible: false,
171
- // 是否显示完成时间修改记录
172
- masterWorkOrderVisible: false,
173
- // 完成时间修改记录表格列
174
- changeRecordColumns: [
175
- { dataIndex: 'f_workflow_id', title: '任务id' },
176
- { dataIndex: 'f_complete_oldtime', title: '原整体完成时间' },
177
- { dataIndex: 'f_set_time', title: '修改后完成时间', customRender (text) { return formatDate(text, 'yyyy-MM-dd') } },
178
- { dataIndex: 'f_name', title: '节点名称' },
179
- { dataIndex: 'f_handler', title: '节点处理人' },
180
- { dataIndex: 'f_deadline_old', title: '原节点截止时间' },
181
- { dataIndex: 'f_deadline', title: '节点修改后时间' },
182
- { dataIndex: 'f_operator', title: '修改人' },
183
- { dataIndex: 'f_operation_time', title: '操作时间' },
184
- { dataIndex: 'f_note', title: '修改原因' }
185
- ],
186
- // 完成时间修改记录
187
- changeRecordDataSource: [],
188
- // 完成时间修改记录加载状态
189
- changeRecordLoading: false
190
- }
191
- },
192
- props: {
193
- visible: {
194
- type: Boolean,
195
- required: true
196
- },
197
- details: {
198
- type: Object,
199
- required: true
200
- }
201
- },
202
- methods: {
203
- init () {
204
- this.loading = this.details.f_entry_name === undefined
205
- // this.isCreatedBy = this.currUser.roles.includes('14524271')
206
- this.completeTime = undefined
207
- this.overdueTime = undefined
208
- },
209
- // 日期格式化
210
- format (date, format) {
211
- return formatDate(date, format)
212
- },
213
- disabledDate (date) {
214
- return date.isBefore(moment(), 'day')
215
- },
216
- saveCompleteTime () {
217
- if (!this.completeTime) {
218
- this.$message.info('整体完成时间不能为空')
219
- return
220
- }
221
- if (this.note == '') {
222
- this.$message.info('修改原因不能为空!')
223
- return
224
- }
225
- if (moment(this.completeTime).isBefore(this.overdueTime, 'day')) {
226
- this.$message.info('当前环节截止时间不能晚于整体完成时间')
227
- return
228
- }
229
- postByServiceName(workFlowViewApi.updateWorkFlowCompleteTime, {
230
- workflowId: this.details.id,
231
- completeTime: this.completeTime,
232
- overdueTime: this.overdueTime,
233
- name: this.currUser.name,
234
- note: this.note
235
- }).then(() => {
236
- this.$message.success('修改成功')
237
- this.details.f_complete_time = this.completeTime
238
- this.openCompleteTime = false
239
- })
240
- },
241
- showChangeRecord () {
242
- this.changeRecordLoading = true
243
- this.changeRecordVisible = true
244
- postByServiceName(workFlowViewApi.getWorkFlowCompleteTimeChange, {
245
- workflowId: this.details.id
246
- }).then(res => {
247
- this.changeRecordDataSource = res
248
- this.changeRecordLoading = false
249
- })
250
- },
251
- ordRecord () {
252
- this.masterWorkOrderVisible = true
253
- }
254
- },
255
- watch: {
256
- visible (newVal) {
257
- if (newVal) {
258
- this.init()
259
- }
260
- }
261
- }
262
- }
263
- </script>
264
-
265
- <style lang="less">
266
- #ApplyBaseInformation {
267
- .info-card-container {
268
- background: transparent;
269
-
270
- .ant-card-body {
271
- padding: 0;
272
- }
273
- }
274
-
275
- .info-cards-wrapper {
276
- display: flex;
277
- flex-wrap: wrap;
278
- gap: 16px;
279
-
280
- .info-card {
281
- flex: 1;
282
- min-width: 180px;
283
- background-color: #fff;
284
- border-radius: 8px;
285
- padding: 16px;
286
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
287
- display: flex;
288
- align-items: center;
289
- transition: all 0.2s ease;
290
- cursor: default;
291
- border: 1px solid #eaedf2;
292
-
293
- &:hover {
294
- box-shadow: 0 3px 6px rgba(0, 0, 0, 0.08);
295
- }
296
-
297
- .info-icon {
298
- display: flex;
299
- align-items: center;
300
- justify-content: center;
301
- width: 46px;
302
- height: 46px;
303
- border-radius: 8px;
304
- font-size: 22px;
305
- margin-right: 14px;
306
- color: #fff;
307
- flex-shrink: 0;
308
- position: relative;
309
-
310
- &.status-completed {
311
- background-color: #ebad59;
312
- }
313
-
314
- &.status-progress {
315
- background-color: #5B6B8F;
316
- }
317
-
318
- &.date-icon {
319
- background-color: #4CAF50;
320
- }
321
-
322
- &.workflow-icon {
323
- background-color: #FF9800;
324
- }
325
-
326
- &.time-icon {
327
- background-color: #F44336;
328
- }
329
-
330
- &.parent-icon {
331
- background-color: #2196F3;
332
- }
333
-
334
- .dropdown-icon {
335
- position: absolute;
336
- right: -8px;
337
- bottom: -8px;
338
- color: #8392a5;
339
- font-size: 14px;
340
- background: #fff;
341
- border-radius: 50%;
342
- width: 20px;
343
- height: 20px;
344
- display: flex;
345
- align-items: center;
346
- justify-content: center;
347
- border: 1px solid #eaedf2;
348
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
349
- cursor: pointer;
350
-
351
- &:hover {
352
- color: #5B6B8F;
353
- }
354
- }
355
- }
356
-
357
- .info-content {
358
- flex: 1;
359
- min-width: 0;
360
-
361
- .info-title {
362
- font-size: 20px;
363
- font-weight: 600;
364
- color: #2c3e50;
365
- margin-bottom: 6px;
366
- white-space: nowrap;
367
- overflow: hidden;
368
- text-overflow: ellipsis;
369
- display: flex;
370
- align-items: center;
371
- line-height: 1.3;
372
-
373
- .info-icon-small {
374
- margin-left: 6px;
375
- color: #8392a5;
376
- font-size: 16px;
377
- cursor: pointer;
378
-
379
- &:hover {
380
- color: #5B6B8F;
381
- }
382
- }
383
-
384
- .edit-icon {
385
- margin-left: 6px;
386
- color: #8392a5;
387
- font-size: 16px;
388
- cursor: pointer;
389
-
390
- &:hover {
391
- color: #5B6B8F;
392
- }
393
- }
394
- }
395
-
396
- .info-label {
397
- font-size: 14px;
398
- color: #8392a5;
399
- line-height: 1.4;
400
-
401
- &.status-completed-text {
402
- color: #ebad59;
403
- font-size: 14px;
404
- line-height: 1.4;
405
- }
406
-
407
- &.status-progress-text {
408
- color: #8392a5;
409
- font-size: 14px;
410
- line-height: 1.4;
411
- }
412
- }
413
- }
414
- }
415
- }
416
- }
417
- </style>
1
+ <template>
2
+ <div id="ApplyBaseInformation">
3
+ <a-card :loading="loading" :bordered="false" class="info-card-container">
4
+ <div class="info-cards-wrapper">
5
+ <!-- 正在进行 -->
6
+ <div class="info-card">
7
+ <div class="info-icon" :class="details.f_state === 1 ? 'status-completed' : 'status-progress'">
8
+ <a-icon type="appstore" theme="filled" />
9
+ </div>
10
+ <div class="info-content">
11
+ <div v-if="showProjectPerson" class="info-title">
12
+ {{ details.f_entry_name }}
13
+ <a-popover placement="bottom">
14
+ <template slot="content">
15
+ <div v-if="details.person.f_projectadmin">项目经理:{{ details.person.f_projectadmin }}</div>
16
+ <div v-if="details.person.f_shangwuren">客户经理:{{ details.person.f_shangwuren }}</div>
17
+ <div v-if="details.person.f_salemanager">销售经理:{{ details.person.f_salemanager }}</div>
18
+ <div v-if="details.person.f_egionaladministrator">大区经理:{{ details.person.f_egionaladministrator }}</div>
19
+ </template>
20
+ <a-icon type="info-circle" class="info-icon-small" />
21
+ </a-popover>
22
+ </div>
23
+ <div v-else class="info-title">{{ details.f_task_name }}</div>
24
+ <div class="info-label" :class="details.f_state === 1 ? 'status-completed-text' : 'status-progress-text'">
25
+ {{ `工单状态:${details.f_state === 1 ? '完工' : '正在进行'}` }}
26
+ </div>
27
+ </div>
28
+ </div>
29
+
30
+ <!-- 流程信息 -->
31
+ <div v-show="details.f_state !== 1" class="info-card">
32
+ <div class="info-icon workflow-icon">
33
+ <a-icon type="profile" theme="filled" />
34
+ </div>
35
+ <div class="info-content">
36
+ <div class="info-title">{{ details.f_workflow_define_name }}</div>
37
+ <div class="info-label">{{ `当前流程节点:${details.f_sub_state}` }}</div>
38
+ </div>
39
+ </div>
40
+
41
+ <!-- 创建日期 -->
42
+ <div class="info-card">
43
+ <div class="info-icon date-icon">
44
+ <a-icon type="carry-out" theme="filled" />
45
+ </div>
46
+ <div class="info-content">
47
+ <div class="info-title">{{ format(details.f_workflow_date, 'yyyy-MM-dd') }}</div>
48
+ <div class="info-label">创建日期</div>
49
+ </div>
50
+ </div>
51
+
52
+ <!-- 截止时间 -->
53
+ <div class="info-card" title="若要修改完成时间,请通知部门领导进行修改!">
54
+ <div class="info-icon time-icon">
55
+ <a-icon type="clock-circle" theme="filled" />
56
+ <a-dropdown>
57
+ <a-icon type="down" class="dropdown-icon" />
58
+ <a-menu slot="overlay">
59
+ <a-menu-item @click="showChangeRecord">修改记录</a-menu-item>
60
+ </a-menu>
61
+ </a-dropdown>
62
+ </div>
63
+ <div class="info-content">
64
+ <div class="info-title">
65
+ {{ format(details.f_complete_time, 'yyyy-MM-dd') }}
66
+ <!-- 修改任务时间 -->
67
+ <a-popover v-if="isCreatedBy" v-model="openCompleteTime" title="修改任务时间" trigger="click">
68
+ <template slot="content">
69
+ <a-form-item label="任务整体完成时间" :label-col="{ span: 10 }" :wrapper-col="{ span: 14 }">
70
+ <a-date-picker
71
+ v-model="completeTime"
72
+ :disabled-date="disabledDate"
73
+ :show-today="false"
74
+ :allow-clear="false"
75
+ value-format="YYYY-MM-DD HH:mm:ss"
76
+ >
77
+ </a-date-picker>
78
+ </a-form-item>
79
+ <a-form-item label="当前环节截止时间" :label-col="{ span: 10 }" :wrapper-col="{ span: 14 }">
80
+ <a-date-picker
81
+ v-model="overdueTime"
82
+ :disabled-date="disabledDate"
83
+ :show-today="false"
84
+ value-format="YYYY-MM-DD 17:00:00"
85
+ >
86
+ </a-date-picker>
87
+ </a-form-item>
88
+ <a-form-item label="修改原因" :label-col="{ span: 10 }" :wrapper-col="{ span: 14 }">
89
+ <a-textarea
90
+ v-model="note"
91
+ :auto-size="{ minRows: 3, maxRows: 5 }"
92
+ placeholder="修改原因"
93
+ />
94
+ </a-form-item>
95
+ <div style="text-align: right">
96
+ <a-button type="primary" size="small" @click="saveCompleteTime">确定</a-button>
97
+ </div>
98
+ </template>
99
+ <a-icon type="edit" theme="filled" class="edit-icon" />
100
+ </a-popover>
101
+ </div>
102
+ <div class="info-label">截止时间</div>
103
+ </div>
104
+ </div>
105
+
106
+ <!-- 第五个 -->
107
+ <div v-show="details.f_workflow_parentid" @click="ordRecord" class="info-card">
108
+ <div class="info-icon parent-icon">
109
+ <a-icon type="profile" theme="filled" />
110
+ </div>
111
+ <div class="info-content">
112
+ <div class="info-title">{{ details.f_workflow_parentid }}</div>
113
+ <div class="info-label">父级工单编号</div>
114
+ </div>
115
+ </div>
116
+ </div>
117
+ </a-card>
118
+
119
+ <!-- 完成时间修改记录 -->
120
+ <a-modal v-model="changeRecordVisible" title="完成时间修改记录" :footer="null" :z-index="1001" :width="1500">
121
+ <a-table row-key="id" :columns="changeRecordColumns" :data-source="changeRecordDataSource" :loading="changeRecordLoading"></a-table>
122
+ </a-modal>
123
+
124
+ <!-- 父级工单 -->
125
+ <a-modal v-model="masterWorkOrderVisible" title="主工单" :footer="null" :z-index="1001" :width="1500">
126
+ <work-order-parent-details :workflow-id="details.f_workflow_parentid"></work-order-parent-details>
127
+ </a-modal>
128
+ </div>
129
+ </template>
130
+
131
+ <script>
132
+ import { mapState } from 'vuex'
133
+ import { formatDate } from '@vue2-client/utils/util'
134
+ import { postByServiceName } from '@vue2-client/services/api/restTools'
135
+ import moment from 'moment'
136
+ import { workFlowViewApi } from '@vue2-client/services/api/workFlow'
137
+ import WorkOrderParentDetails from '@vue2-client/pages/WorkflowDetail/WorkflowPageDetail/WorkOrderParentDetails'
138
+
139
+ export default {
140
+ name: 'WorkflowBaseInformation',
141
+ components: { WorkOrderParentDetails },
142
+ computed: {
143
+ ...mapState('account', { currUser: 'user' }),
144
+ ...mapState('setting', ['isMobile']),
145
+ showProjectPerson: function () {
146
+ if (!this.details.person) {
147
+ return false
148
+ }
149
+ return Object.keys(this.details.person).length !== 0
150
+ }
151
+ },
152
+ mounted () {
153
+ this.init()
154
+ },
155
+ data () {
156
+ return {
157
+ // 控制加载
158
+ loading: true,
159
+ // 是否显示日期编辑
160
+ openCompleteTime: false,
161
+ // 完成时间
162
+ completeTime: undefined,
163
+ // 当前环节截止时间
164
+ overdueTime: undefined,
165
+ // 修改原因
166
+ note: '',
167
+ // 当前用户是否为创建人
168
+ isCreatedBy: false,
169
+ // 是否显示完成时间修改记录
170
+ changeRecordVisible: false,
171
+ // 是否显示完成时间修改记录
172
+ masterWorkOrderVisible: false,
173
+ // 完成时间修改记录表格列
174
+ changeRecordColumns: [
175
+ { dataIndex: 'f_workflow_id', title: '任务id' },
176
+ { dataIndex: 'f_complete_oldtime', title: '原整体完成时间' },
177
+ { dataIndex: 'f_set_time', title: '修改后完成时间', customRender (text) { return formatDate(text, 'yyyy-MM-dd') } },
178
+ { dataIndex: 'f_name', title: '节点名称' },
179
+ { dataIndex: 'f_handler', title: '节点处理人' },
180
+ { dataIndex: 'f_deadline_old', title: '原节点截止时间' },
181
+ { dataIndex: 'f_deadline', title: '节点修改后时间' },
182
+ { dataIndex: 'f_operator', title: '修改人' },
183
+ { dataIndex: 'f_operation_time', title: '操作时间' },
184
+ { dataIndex: 'f_note', title: '修改原因' }
185
+ ],
186
+ // 完成时间修改记录
187
+ changeRecordDataSource: [],
188
+ // 完成时间修改记录加载状态
189
+ changeRecordLoading: false
190
+ }
191
+ },
192
+ props: {
193
+ visible: {
194
+ type: Boolean,
195
+ required: true
196
+ },
197
+ details: {
198
+ type: Object,
199
+ required: true
200
+ }
201
+ },
202
+ methods: {
203
+ init () {
204
+ this.loading = this.details.f_entry_name === undefined
205
+ // this.isCreatedBy = this.currUser.roles.includes('14524271')
206
+ this.completeTime = undefined
207
+ this.overdueTime = undefined
208
+ },
209
+ // 日期格式化
210
+ format (date, format) {
211
+ return formatDate(date, format)
212
+ },
213
+ disabledDate (date) {
214
+ return date.isBefore(moment(), 'day')
215
+ },
216
+ saveCompleteTime () {
217
+ if (!this.completeTime) {
218
+ this.$message.info('整体完成时间不能为空')
219
+ return
220
+ }
221
+ if (this.note == '') {
222
+ this.$message.info('修改原因不能为空!')
223
+ return
224
+ }
225
+ if (moment(this.completeTime).isBefore(this.overdueTime, 'day')) {
226
+ this.$message.info('当前环节截止时间不能晚于整体完成时间')
227
+ return
228
+ }
229
+ postByServiceName(workFlowViewApi.updateWorkFlowCompleteTime, {
230
+ workflowId: this.details.id,
231
+ completeTime: this.completeTime,
232
+ overdueTime: this.overdueTime,
233
+ name: this.currUser.name,
234
+ note: this.note
235
+ }).then(() => {
236
+ this.$message.success('修改成功')
237
+ this.details.f_complete_time = this.completeTime
238
+ this.openCompleteTime = false
239
+ })
240
+ },
241
+ showChangeRecord () {
242
+ this.changeRecordLoading = true
243
+ this.changeRecordVisible = true
244
+ postByServiceName(workFlowViewApi.getWorkFlowCompleteTimeChange, {
245
+ workflowId: this.details.id
246
+ }).then(res => {
247
+ this.changeRecordDataSource = res
248
+ this.changeRecordLoading = false
249
+ })
250
+ },
251
+ ordRecord () {
252
+ this.masterWorkOrderVisible = true
253
+ }
254
+ },
255
+ watch: {
256
+ visible (newVal) {
257
+ if (newVal) {
258
+ this.init()
259
+ }
260
+ }
261
+ }
262
+ }
263
+ </script>
264
+
265
+ <style lang="less">
266
+ #ApplyBaseInformation {
267
+ .info-card-container {
268
+ background: transparent;
269
+
270
+ .ant-card-body {
271
+ padding: 0;
272
+ }
273
+ }
274
+
275
+ .info-cards-wrapper {
276
+ display: flex;
277
+ flex-wrap: wrap;
278
+ gap: 16px;
279
+
280
+ .info-card {
281
+ flex: 1;
282
+ min-width: 180px;
283
+ background-color: #fff;
284
+ border-radius: 8px;
285
+ padding: 16px;
286
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
287
+ display: flex;
288
+ align-items: center;
289
+ transition: all 0.2s ease;
290
+ cursor: default;
291
+ border: 1px solid #eaedf2;
292
+
293
+ &:hover {
294
+ box-shadow: 0 3px 6px rgba(0, 0, 0, 0.08);
295
+ }
296
+
297
+ .info-icon {
298
+ display: flex;
299
+ align-items: center;
300
+ justify-content: center;
301
+ width: 46px;
302
+ height: 46px;
303
+ border-radius: 8px;
304
+ font-size: 22px;
305
+ margin-right: 14px;
306
+ color: #fff;
307
+ flex-shrink: 0;
308
+ position: relative;
309
+
310
+ &.status-completed {
311
+ background-color: #ebad59;
312
+ }
313
+
314
+ &.status-progress {
315
+ background-color: #5B6B8F;
316
+ }
317
+
318
+ &.date-icon {
319
+ background-color: #4CAF50;
320
+ }
321
+
322
+ &.workflow-icon {
323
+ background-color: #FF9800;
324
+ }
325
+
326
+ &.time-icon {
327
+ background-color: #F44336;
328
+ }
329
+
330
+ &.parent-icon {
331
+ background-color: #2196F3;
332
+ }
333
+
334
+ .dropdown-icon {
335
+ position: absolute;
336
+ right: -8px;
337
+ bottom: -8px;
338
+ color: #8392a5;
339
+ font-size: 14px;
340
+ background: #fff;
341
+ border-radius: 50%;
342
+ width: 20px;
343
+ height: 20px;
344
+ display: flex;
345
+ align-items: center;
346
+ justify-content: center;
347
+ border: 1px solid #eaedf2;
348
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
349
+ cursor: pointer;
350
+
351
+ &:hover {
352
+ color: #5B6B8F;
353
+ }
354
+ }
355
+ }
356
+
357
+ .info-content {
358
+ flex: 1;
359
+ min-width: 0;
360
+
361
+ .info-title {
362
+ font-size: 20px;
363
+ font-weight: 600;
364
+ color: #2c3e50;
365
+ margin-bottom: 6px;
366
+ white-space: nowrap;
367
+ overflow: hidden;
368
+ text-overflow: ellipsis;
369
+ display: flex;
370
+ align-items: center;
371
+ line-height: 1.3;
372
+
373
+ .info-icon-small {
374
+ margin-left: 6px;
375
+ color: #8392a5;
376
+ font-size: 16px;
377
+ cursor: pointer;
378
+
379
+ &:hover {
380
+ color: #5B6B8F;
381
+ }
382
+ }
383
+
384
+ .edit-icon {
385
+ margin-left: 6px;
386
+ color: #8392a5;
387
+ font-size: 16px;
388
+ cursor: pointer;
389
+
390
+ &:hover {
391
+ color: #5B6B8F;
392
+ }
393
+ }
394
+ }
395
+
396
+ .info-label {
397
+ font-size: 14px;
398
+ color: #8392a5;
399
+ line-height: 1.4;
400
+
401
+ &.status-completed-text {
402
+ color: #ebad59;
403
+ font-size: 14px;
404
+ line-height: 1.4;
405
+ }
406
+
407
+ &.status-progress-text {
408
+ color: #8392a5;
409
+ font-size: 14px;
410
+ line-height: 1.4;
411
+ }
412
+ }
413
+ }
414
+ }
415
+ }
416
+ }
417
+ </style>
@@ -1,127 +0,0 @@
1
- <template>
2
- <a-card :bordered="false">
3
- <a-tabs default-active-key="1" @change="changeTab">
4
- <a-tab-pane key="1" tab="待办">
5
- <x-form-table
6
- title="站点工单(待办)"
7
- ref="xFormTable"
8
- queryParamsName="teleProcessCRUD"
9
- :fixed-query-form="{
10
- wo_f_department_id: currUser.depids,
11
- }"
12
- serviceName="af-telephone"
13
- @toDeal="toDetail"
14
- @updateInfo="updateInfo"
15
- @transfer="transfer"
16
- @toFinish="toFinish"
17
- >
18
- </x-form-table>
19
- </a-tab-pane>
20
- <a-tab-pane key="2" tab="已办">
21
- <x-form-table
22
- title="站点工单(已办)"
23
- ref="xFormTableDone"
24
- queryParamsName="teleProcessDoneCRUD"
25
- :fixed-query-form="{
26
- wo_f_department_id: currUser.depids,
27
- }"
28
- serviceName="af-telephone"
29
- @action="toView"
30
- @reminder="toReminder"
31
- >
32
- </x-form-table>
33
- </a-tab-pane>
34
- </a-tabs>
35
- <WorkflowDetail
36
- ref="workFlow"
37
- @preClick="preClick"
38
- @success="success"
39
- @nextClick="nextClick"
40
- @x-form-item-emit-func="handleFormItemEvent"
41
- >
42
- </WorkflowDetail>
43
- </a-card>
44
- </template>
45
-
46
- <script>
47
- import WorkflowDetail from '@vue2-client/pages/WorkflowDetail/WorkflowDetail.vue'
48
- import XFormTable from '@vue2-client/base-client/components/common/XFormTable/XFormTable'
49
- import { mapState } from 'vuex'
50
- import XAddNativeForm from '@vue2-client/base-client/components/common/XAddNativeForm/XAddNativeForm.vue'
51
-
52
- export default {
53
- name: 'Telephone',
54
- components: {
55
- XFormTable,
56
- WorkflowDetail,
57
- XAddNativeForm
58
- },
59
- // 透传给子组件的方法(目前XFormTable接了)
60
- provide () {
61
- return {
62
- generalFunction: {}
63
- }
64
- },
65
- data () {
66
- return {
67
- // 当前工单id
68
- currentWorkOrderId: '',
69
- // 提交加载动画
70
- confirmLoading: false,
71
- chargeVisible: false,
72
- // 环节人员信息
73
- chargePerson: {},
74
- chargePersonOptions: [],
75
- transferData: {
76
- optionsValue: '',
77
- remark: ''
78
- },
79
- record: {},
80
- define: {},
81
- // 是否展示催单结案弹窗
82
- showReminder: false,
83
- // 弹窗类型 催单/ 结案
84
- modelType: ''
85
- }
86
- },
87
- computed: {
88
- ...mapState('account', { currUser: 'user' }),
89
- },
90
- methods: {
91
- changeTab (key) {
92
- console.log('切换tab', key)
93
- if (key === '1') {
94
- this.$refs.xFormTable.refreshTable(true)
95
- } else if (key === '2') {
96
- this.$refs.xFormTableDone.refreshTable(true)
97
- }
98
- },
99
- success () {
100
- console.log('完工')
101
- },
102
- toDetail (record) {
103
- // 修改第一步的工单
104
- if (record.ws_f_step_id === 1 && record.w_f_state === 0) {
105
- console.log('进入工单详情')
106
- if (record.w_f_workflow_define_name === '报修单处理流程') {
107
- this.$refs.dealOrUpdate.dealOrUpdate(record, '处理工单')
108
- } else if (record.w_f_workflow_define_name === '投诉单处理流程') {
109
- this.$refs.dealComplaint.dealComplaintOrder(record)
110
- } else if (record.w_f_workflow_define_name === '咨询单处理流程') {
111
- this.$refs.dealConsultation.dealConsultationOrder(record)
112
- } else {
113
- this.$message.warn('未知流程类型')
114
- }
115
- } else {
116
- // 记录流程节点名称
117
- this.currentWorkOrderId = record.wo_id
118
- // 进入流程详情
119
- this.$refs.workFlow.init({
120
- workflowId: record.wo_f_workflow_id,
121
- stepId: record.ws_f_step_id
122
- })
123
- }
124
- },
125
- }
126
- }
127
- </script>