DepartmentFields.vue 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. <template>
  2. <view v-for="(department, index) in departments" :key="department.id" class="department-field">
  3. <view class="department-field__header">
  4. <view class="department-field__label">
  5. <text class="department-field__required">*</text>
  6. 拜访科室{{ departments.length > 1 ? index + 1 : '' }}
  7. </view>
  8. <view
  9. class="department-field__action"
  10. @click="index === 0 ? addDepartment() : removeDepartment(index)"
  11. >
  12. {{ index === 0 ? '+' : '−' }}
  13. </view>
  14. </view>
  15. <view class="department-field__input">
  16. <wd-input v-model="department.departmentName" no-border placeholder="请输入拜访科室" />
  17. </view>
  18. <ImgUpload
  19. v-model:value="department.photoUrls"
  20. :task-field-config="photoFieldConfig"
  21. :canvas-id="`visitDepartmentCanvas${department.id}`"
  22. />
  23. </view>
  24. </template>
  25. <script setup lang="ts">
  26. import type { TaskFieldConfigItem } from '@/services/modules/task/taskFrom/type'
  27. import type { DepartmentFormItem } from '../types'
  28. import { createDepartment, parsePhotoUrls } from '../utils'
  29. import ImgUpload from '@/pages-task/task-form/components/ImgUpload.vue'
  30. const departments = defineModel<DepartmentFormItem[]>({ required: true })
  31. const photoFieldConfig = {
  32. taskFiledValue: '科室照片',
  33. isMustfill: '1',
  34. taskFiledMinsize: 1,
  35. taskFiledMaxsize: 1,
  36. } as TaskFieldConfigItem
  37. const addDepartment = () => {
  38. const lastDepartment = departments.value.at(-1)
  39. if (
  40. !lastDepartment?.departmentName.trim() ||
  41. parsePhotoUrls(lastDepartment.photoUrls).length === 0
  42. ) {
  43. uni.showToast({ title: '请先完善当前拜访科室', icon: 'none' })
  44. return
  45. }
  46. departments.value.push(createDepartment())
  47. }
  48. const removeDepartment = (index: number) => {
  49. if (index > 0) departments.value.splice(index, 1)
  50. }
  51. </script>
  52. <style lang="scss" scoped>
  53. .department-field {
  54. padding: 22rpx 30rpx 8rpx;
  55. background: #ffffff;
  56. border-top: 2rpx solid #f1f3f6;
  57. }
  58. .department-field__header {
  59. display: flex;
  60. align-items: center;
  61. justify-content: space-between;
  62. }
  63. .department-field__label {
  64. color: #303a49;
  65. font-size: 26rpx;
  66. line-height: 38rpx;
  67. }
  68. .department-field__required {
  69. margin-right: 6rpx;
  70. color: #e65d5d;
  71. }
  72. .department-field__action {
  73. display: flex;
  74. align-items: center;
  75. justify-content: center;
  76. width: 54rpx;
  77. height: 54rpx;
  78. color: #4a91ea;
  79. font-size: 38rpx;
  80. line-height: 54rpx;
  81. background: #eef6ff;
  82. border-radius: 50%;
  83. }
  84. .department-field__input {
  85. margin-top: 16rpx;
  86. padding: 0 20rpx;
  87. background: #f7f9fc;
  88. border: 2rpx solid #e8edf3;
  89. border-radius: 14rpx;
  90. }
  91. </style>