imeik-bizui 1.3.0 → 1.3.2

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.
@@ -211,4 +211,4 @@ export function getEmployeeIsForSale(data) {
211
211
  method: 'get',
212
212
  params: data
213
213
  })
214
- }
214
+ }
@@ -12,3 +12,16 @@ export function queryTagList(params) {
12
12
  params
13
13
  })
14
14
  }
15
+
16
+ /**
17
+ * 获取专家
18
+ * @param {*} data
19
+ * @returns
20
+ */
21
+ export function getExpertsPageQuery(data) {
22
+ return request({
23
+ url: '/tagcenter-admin/tagApi/realTimePageQuery',
24
+ method: 'post',
25
+ data
26
+ })
27
+ }
@@ -202,7 +202,7 @@ export default {
202
202
  // 处理配置的属性
203
203
  handlingConfigurationPrope() {
204
204
  const index = this.getFormItemIndex('projectCode')
205
- if (!this.formConfig.props.applyType && this.attrs.applyTypeOptions.default) {
205
+ if (!this.formConfig.props.applyType && this.attrs.applyTypeOptions?.default) {
206
206
  this.formConfig.props.applyType = this.attrs.applyTypeOptions.default
207
207
  }
208
208
  // 是否显示项目编号
@@ -22,7 +22,7 @@
22
22
  @change="onChange"
23
23
  @visible-change="visibleChange"
24
24
  >
25
- <el-option v-for="item in options" :key="item[prop.value]" :label="item.name || item.employeeNo" :value="item[prop.value]">
25
+ <el-option v-for="item in options" :key="item.employeeNo" :label="item.name || item.employeeNo" :value="item.employeeNo">
26
26
  <!--可以传入自定义的展示模板-->
27
27
  <slot name="item" :item="item">
28
28
  <div class="flex items-center gap-2">
@@ -48,14 +48,6 @@ import { getLabelByValue } from '../../utils/index'
48
48
  export default {
49
49
  name: 'EmployeeSelect',
50
50
  props: {
51
- prop: {
52
- type: Object,
53
- default() {
54
- return {
55
- value: 'employeeNo'
56
- }
57
- }
58
- },
59
51
  value: {
60
52
  type: [Number, String, Array],
61
53
  default: undefined
@@ -216,6 +208,6 @@ export default {
216
208
  <style lang="scss" scoped>
217
209
  .cell-title {
218
210
  font-size: 14px;
219
- color: #000000D9;
211
+ color: #595959;
220
212
  }
221
213
  </style>
@@ -30,6 +30,11 @@ export default {
30
30
  CustomerSelect,
31
31
  CustomShow
32
32
  },
33
+ inject: {
34
+ formProps: {
35
+ default: () => {}
36
+ }
37
+ },
33
38
  props: {
34
39
  value: {
35
40
  type: Object,
@@ -53,7 +58,7 @@ export default {
53
58
  },
54
59
  computed: {
55
60
  showText() {
56
- return this.showSelect && !this.isDeptForSale
61
+ return this.showSelect && !this.isDeptForSale && this.formProps.formBaseNo !== 'B05'
57
62
  },
58
63
  isView() {
59
64
  return this.attrs.isView
@@ -223,6 +223,7 @@ export default {
223
223
  onUpdate() {
224
224
  const myValue = this.timeFormat(this.myValue)
225
225
  this.$emit('input', myValue)
226
+ this.$emit('change', myValue)
226
227
  }
227
228
  }
228
229
  }
@@ -1,48 +1,75 @@
1
1
  <template>
2
2
  <div class="page-view">
3
3
  <ImTable :table="tableConfig">
4
- <template slot="expertName" slot-scope="{ row }">
5
- <el-select v-if="!isView" v-model="row.expertName" filterable placeholder="请选择" @change="(val) => changeExpertName(val, row)">
6
- <el-option v-for="item in exportsList" :key="item.value" :label="item.label" :value="item.value"> </el-option>
7
- </el-select>
8
- <div v-else>{{ row.expertName }}</div>
4
+ <!-- 专家 -->
5
+ <template slot="doctorName" slot-scope="{ row }">
6
+ <ImSelect v-if="!isView" v-model="row.doctorNumber" :class="{ 'is-error': row.valid === false && !row.doctorNumber }" :attrs="doctorAttrs" @input="changedoctorName(row)"></ImSelect>
7
+ <div v-else>{{ row.doctorName }}</div>
9
8
  </template>
9
+ <!-- 职业机构 -->
10
10
  <template slot="organizations" slot-scope="{ row }">
11
11
  <div class="expertOther">
12
- <p>第一执业:北京苏明成医疗美容有限公司</p>
13
- <p>其他执业:北京苏明成医疗美容有限公司</p>
12
+ <p v-if="row.doctorOrg">第一执业:{{ row.doctorOrg }}</p>
13
+ <!-- <p>其他执业:北京苏明成医疗美容有限公司</p> -->
14
14
  </div>
15
15
  </template>
16
+ <!-- 其他信息 -->
16
17
  <template slot="otherInfo" slot-scope="{ row }">
17
18
  <div class="expertOther">
18
- <p>专家编号:00981</p>
19
- <p>手机号:{{ formatPhone('13121889953') }}</p>
20
- <p>类型:啊合适的</p>
21
- <p>职业:院长</p>
22
- <p>支持:主任</p>
19
+ <p v-if="row.doctorNumber">专家编号:{{ row.doctorNumber }}</p>
20
+ <p v-if="row.doctorPhone">手机号:{{ formatPhone(row.doctorPhone) }}</p>
21
+ <p v-if="row.doctorType">类型:{{ row.doctorType }}</p>
22
+ <p v-if="row.doctorPosition">职业:{{ row.doctorPosition }}</p>
23
+ <p v-if="row.doctorPost">职称:{{ row.doctorPost }}</p>
23
24
  </div>
24
25
  </template>
25
- <template slot="roleLevel" slot-scope="{ row }">
26
- <el-select v-model="row.roleLevel" clearable filterable placeholder="请选择" style="width: 100%;">
27
- <el-option v-for="item in exportsList" :key="item.value" :label="item.label" :value="item.value"> </el-option>
28
- </el-select>
26
+ <!-- 角色等级 -->
27
+ <template slot="doctorLevel" slot-scope="{ row }">
28
+ <ImSelect v-model="row.doctorLevel" :class="{ 'is-error': row.valid === false && !row.doctorNumber }" :attrs="{ options: row.roleList }"></ImSelect>
29
29
  </template>
30
+ <!-- 服务场景 -->
30
31
  <template slot="scenario" slot-scope="{ row }">
31
- <el-select v-model="row.scenario" placeholder="请选择" style="width: 100%;">
32
- <el-option v-for="item in exportsList" :key="item.value" :label="item.label" :value="item.value"> </el-option>
33
- </el-select>
32
+ <ImSelect
33
+ v-model="row.doctorServiceSceneCode"
34
+ :class="{ 'is-error': row.valid === false && !row.doctorNumber }"
35
+ :attrs="{ options: row.scenarioList }"
36
+ @input="(val) => changeScenario(val, row)"
37
+ ></ImSelect>
34
38
  <p v-if="false" class="tips-text">收到发斯蒂芬撒旦法戊二醛沃尔沃二位二位</p>
35
39
  </template>
40
+ <!-- 授课名称 -->
36
41
  <template slot="className" slot-scope="{ row }">
37
- <el-input v-model="row.className" placeholder="请输入" maxlength="100"></el-input>
42
+ <div v-if="!isView">
43
+ <el-input v-if="checkHasCourse(row)" v-model="row.courseName" placeholder="请输入" maxlength="100"></el-input>
44
+ <div v-else>-</div>
45
+ </div>
46
+ <div v-else>{{ row.courseName }}</div>
38
47
  </template>
48
+ <!-- 费用金额 -->
39
49
  <template slot="price" slot-scope="{ row }">
40
- <el-input-number v-model="row.price" style="width: 100%;" controls-position="right" :min="0" placeholder="请输入" @change="handlePriceChange"></el-input-number>
50
+ <p v-if="checkStandardAmountsIsBeyond(row)" class="standardAmount">费用标准:{{ row.standardAmount }}</p>
51
+ <el-input-number
52
+ v-model="row.costAmount"
53
+ style="width: 100%"
54
+ :class="{ isBeyound: checkStandardAmountsIsBeyond(row), 'is-error': row.valid === false && !row.doctorNumber }"
55
+ controls-position="right"
56
+ :min="0"
57
+ :placeholder="row.standardAmount ? `费用标准:${row.standardAmount}` : '请输入'"
58
+ ></el-input-number>
41
59
  </template>
60
+ <!-- 备注 -->
42
61
  <template slot="remarks" slot-scope="{ row }">
43
- <el-input v-if="!isView" v-model="row.remarks" :class="{ 'is-error': !row.remarks && row.price > 30 }" type="textarea" :rows="5" show-word-limit maxlength="100" placeholder="请输入"></el-input>
62
+ <el-input
63
+ v-if="!isView"
64
+ v-model="row.remarks"
65
+ :class="{ 'is-error': checkStandardAmountsIsBeyond(row) && !row.remarks }"
66
+ type="textarea"
67
+ :rows="5"
68
+ show-word-limit
69
+ maxlength="100"
70
+ placeholder="请输入"
71
+ ></el-input>
44
72
  <p v-else>{{ row.remarks }}</p>
45
- <p v-show="!row.remarks && row.valid === false" class="error-message">请输入</p>
46
73
  </template>
47
74
  <template slot="operation" slot-scope="{ $index }">
48
75
  <el-button type="text" @click="addExpert($index)">新增</el-button>
@@ -53,13 +80,14 @@
53
80
  </template>
54
81
 
55
82
  <script>
83
+ import { getExpertsPageQuery } from '../../api/tagcenter'
56
84
  export default {
57
85
  name: 'FieldExpertSelect',
58
86
  props: {
59
87
  value: {
60
88
  type: Array,
61
89
  default() {
62
- return []
90
+ return undefined
63
91
  }
64
92
  },
65
93
  attrs: {
@@ -77,9 +105,9 @@ export default {
77
105
  tableItems: [
78
106
  {
79
107
  label: '专家名称',
80
- prop: 'expertName',
108
+ prop: 'doctorName',
81
109
  type: 'slot',
82
- slot: 'expertName',
110
+ slot: 'doctorName',
83
111
  attrs: {
84
112
  'min-width': '120'
85
113
  }
@@ -90,7 +118,7 @@ export default {
90
118
  type: 'slot',
91
119
  slot: 'organizations',
92
120
  attrs: {
93
- 'min-width': '180'
121
+ 'min-width': '200'
94
122
  }
95
123
  },
96
124
  {
@@ -99,14 +127,14 @@ export default {
99
127
  type: 'slot',
100
128
  slot: 'otherInfo',
101
129
  attrs: {
102
- 'min-width': '110'
130
+ 'min-width': '150'
103
131
  }
104
132
  },
105
133
  {
106
134
  label: '角色/等级',
107
- prop: 'roleLevel',
135
+ prop: 'doctorLevel',
108
136
  type: 'slot',
109
- slot: 'roleLevel',
137
+ slot: 'doctorLevel',
110
138
  attrs: {
111
139
  'min-width': '120'
112
140
  }
@@ -144,7 +172,7 @@ export default {
144
172
  type: 'slot',
145
173
  slot: 'remarks',
146
174
  attrs: {
147
- 'min-width': '120'
175
+ 'min-width': '140'
148
176
  }
149
177
  },
150
178
  {
@@ -154,10 +182,16 @@ export default {
154
182
  slot: 'operation',
155
183
  attrs: {
156
184
  fixed: 'right',
157
- width: '80'
185
+ width: '120'
158
186
  }
159
187
  }
160
188
  ]
189
+ },
190
+ doctorAttrs: {
191
+ options: [],
192
+ filterable: true,
193
+ remote: true,
194
+ 'remote-method': this.getExpertsList
161
195
  }
162
196
  }
163
197
  },
@@ -166,21 +200,177 @@ export default {
166
200
  return this.attrs.isView
167
201
  }
168
202
  },
169
- mounted() {},
203
+ watch: {
204
+ value: {
205
+ handler(val) {
206
+ if (val) {
207
+ this.tableConfig.data = val
208
+ }
209
+ },
210
+ deep: true,
211
+ immediate: true
212
+ }
213
+ },
214
+ mounted() {
215
+ this.handleBusEvent()
216
+ if (!this.isView) {
217
+ this.refreshData()
218
+ }
219
+ },
170
220
  methods: {
221
+ handleBusEvent() {
222
+ if (this.$bizui.bus) {
223
+ // 监听点击表单提交的回调
224
+ this.$bizui.bus.$on('applySubmit', (val) => {
225
+ this.handleValidate()
226
+ })
227
+ }
228
+ },
229
+ handleValidate() {
230
+ let showMessage = true
231
+ this.tableConfig.data.forEach((item) => {
232
+ let res = true
233
+ if (!item.doctorNumber) {
234
+ res && showMessage && this.$message.warning('请检查专家名称')
235
+ res = false
236
+ } else if (!item.doctorLevel) {
237
+ res && showMessage && this.$message.warning('请检查角色/等级')
238
+ res = false
239
+ } else if (!item.doctorServiceSceneCode) {
240
+ res && showMessage && this.$message.warning('请检查服务场景')
241
+ res = false
242
+ } else if (!item.costAmount) {
243
+ res && showMessage && this.$message.warning('请检查费用金额')
244
+ res = false
245
+ } else if (this.checkStandardAmountsIsBeyond(item) && !item.remarks) {
246
+ res && showMessage && this.$message.warning('请填写备注')
247
+ res = false
248
+ }
249
+ item.valid = res
250
+ showMessage = res
251
+ })
252
+ this.onUpdate()
253
+ },
254
+ // 在编辑的时候刷新数据
255
+ refreshData() {
256
+ this.tableConfig.data?.forEach((item) => {
257
+ this.getExpertsList(item.doctorName, item)
258
+ this.getSceneList(item)
259
+ })
260
+ },
261
+ // 获取专家列表
262
+ getExpertsList(val, data) {
263
+ const params = {
264
+ tagConditionList: [
265
+ {
266
+ op: 'LIKE',
267
+ tagCode: 'realName',
268
+ type: 'LEAF_NODE',
269
+ value: val
270
+ }
271
+ ],
272
+ tagModel: 'USER',
273
+ page: 1,
274
+ limit: 10
275
+ }
276
+ getExpertsPageQuery(params).then((res) => {
277
+ if (res.code === 200) {
278
+ this.doctorAttrs.options = this.formatExpertsList(res.data.list)
279
+ data && this.changedoctorName(data)
280
+ } else {
281
+ this.$message.error(res.message)
282
+ }
283
+ })
284
+ },
285
+ // 设置默认值
286
+ setDefaultRoleInfo(data) {
287
+ // 检查当前选择的专家角色是否在角色列表中
288
+ if (data.doctorNumber && !this.isView) {
289
+ const hasCurrentRole = data.roleList.find((item) => item.doctorNumber === data.doctorLevel)
290
+ if (hasCurrentRole) {
291
+ data.doctorLevel = hasCurrentRole.value
292
+ return
293
+ } else {
294
+ data.doctorLevel = ''
295
+ data.doctorServiceSceneName = ''
296
+ }
297
+ }
298
+ // 如果当前选择的专家角色只有一个,则直接写入角色级别
299
+ if (data.roleList.length === 1) {
300
+ data.doctorLevel = data.roleList[0].value
301
+ } else {
302
+ data.doctorLevel = ''
303
+ }
304
+ },
305
+ getSceneList(data) {
306
+ // getSceneList().then(res => {
307
+ // this.sceneList = res.data
308
+ // })
309
+ data.scenarioList = [
310
+ {
311
+ label: '授课、实操教学指导',
312
+ value: '1910592467690790915',
313
+ standardAmount: '1000'
314
+ },
315
+ {
316
+ label: '研讨',
317
+ value: '1910592467694985218',
318
+ standardAmount: '2000'
319
+ },
320
+ {
321
+ label: '授课',
322
+ value: '1910592467682402307',
323
+ standardAmount: '3000'
324
+ }
325
+ ]
326
+ },
171
327
  // 修改专家回调
172
- changeExpertName(val, row) {
328
+ changedoctorName(row) {
329
+ // 写入专家信息
330
+ const doctorInfo = this.doctorAttrs.options.find((item) => item.value === row.doctorNumber)
331
+ delete doctorInfo.doctorNumber
332
+ for (const key in doctorInfo) {
333
+ this.$set(row, key, doctorInfo[key])
334
+ }
335
+ row.roleList = [{ label: '专家', value: '1000987' }]
336
+ this.getSceneList(row)
337
+ this.setDefaultRoleInfo(row)
338
+ },
339
+ // 修改场景回调
340
+ changeScenario(val, row) {
341
+ const sceneInfo = row.scenarioList.find((item) => item.value === val)
342
+ if (sceneInfo) {
343
+ this.$set(row, 'standardAmount', sceneInfo.standardAmount)
344
+ this.$set(row, 'doctorServiceSceneName', sceneInfo.label)
345
+ }
346
+ this.checkStandardAmountsIsBeyond(row)
173
347
  },
174
- // 修改价格回调
175
- handlePriceChange() {},
176
348
  // 添加专家行
177
349
  addExpert() {
178
350
  this.tableConfig.data.push({})
179
351
  },
180
352
  // 删除专家行
181
353
  deleteExpert(index) {
354
+ if (this.tableConfig.data.length <= 1) {
355
+ this.$message.error('至少保留一条专家信息')
356
+ return
357
+ }
182
358
  this.tableConfig.data.splice(index, 1)
183
359
  },
360
+ onUpdate() {
361
+ const data = JSON.parse(JSON.stringify(this.tableConfig.data))
362
+ data.forEach((item) => {
363
+ if (item.roleList) {
364
+ delete item.roleList
365
+ }
366
+ if (item.scenarioList) {
367
+ delete item.scenarioList
368
+ }
369
+ })
370
+ console.log(data)
371
+ this.$emit('input', data)
372
+ this.$emit('change', data)
373
+ },
184
374
  // 加密电话
185
375
  formatPhone(val) {
186
376
  if (val) {
@@ -188,6 +378,33 @@ export default {
188
378
  } else {
189
379
  return ''
190
380
  }
381
+ },
382
+ // 格式化专家列表
383
+ formatExpertsList(list = []) {
384
+ return list.map((item) => {
385
+ return {
386
+ doctorNumber: item.userNumber,
387
+ doctorName: item.realName,
388
+ doctorPhone: item.phone,
389
+ doctorOrg: item.oneHospital,
390
+ doctorPosition: item.doctorPosition,
391
+ doctorPost: item.realJobTitleName,
392
+ doctorType: item.doctorType,
393
+ label: item.realName,
394
+ value: item.userNumber
395
+ }
396
+ })
397
+ },
398
+ // 检查专家价格是否超出
399
+ checkStandardAmountsIsBeyond(data) {
400
+ return Number(data.costAmount) > Number(data.standardAmount)
401
+ },
402
+ // 检查场景有没有授课
403
+ checkHasCourse(data) {
404
+ if (!data.doctorServiceSceneName) {
405
+ return
406
+ }
407
+ return data.doctorServiceSceneName.includes('授课')
191
408
  }
192
409
  }
193
410
  }
@@ -201,7 +418,7 @@ export default {
201
418
  margin-top: 4px;
202
419
  }
203
420
  .expertOther {
204
- font-size: 12px;
421
+ font-size: 13px;
205
422
  color: #595959;
206
423
  line-height: 20px;
207
424
  }
@@ -228,4 +445,14 @@ export default {
228
445
  padding-left: 8px !important;
229
446
  padding-right: 8px !important;
230
447
  }
448
+ .isBeyound {
449
+ /deep/ .el-input__inner {
450
+ color: #f4334a;
451
+ }
452
+ }
453
+ .standardAmount {
454
+ font-size: 13px;
455
+ color: green;
456
+ margin-bottom: 4px;
457
+ }
231
458
  </style>