trainingExperience.vue 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. <!-- -->
  2. <template>
  3. <CtForm ref="CtFormRef" :items="items" style="width: 100%;"></CtForm>
  4. </template>
  5. <script setup>
  6. defineOptions({ name: 'resumeAnalysis-trainingExperience'})
  7. import { ref, watch, nextTick } from 'vue'
  8. import Snackbar from '@/plugins/snackbar'
  9. const props = defineProps({
  10. id: {
  11. type: String,
  12. default: ''
  13. },
  14. text: {
  15. type: String,
  16. default: ''
  17. },
  18. data: {
  19. type: Object,
  20. default: () => {}
  21. }
  22. })
  23. const startTimeChange = (v) => {
  24. const item1 = items.value.options.find(e => e.key === 'startTime')
  25. const item2 = items.value.options.find(e => e.key === 'endTime')
  26. if (item1?.value && item2?.value && item1.value > item2.value) {
  27. Snackbar.warning('开始时间不能大于结束时间!')
  28. nextTick(() => {
  29. item1.value = item2.value
  30. })
  31. }
  32. }
  33. const endTimeChange = (v) => {
  34. const item1 = items.value.options.find(e => e.key === 'startTime')
  35. const item2 = items.value.options.find(e => e.key === 'endTime')
  36. if (item1?.value && item2?.value && item1.value > item2.value) {
  37. Snackbar.warning('结束时间不能小于开始时间')
  38. nextTick(() => {
  39. item2.value = item1.value
  40. })
  41. }
  42. }
  43. const CtFormRef = ref()
  44. const items = ref({
  45. options: [
  46. {
  47. type: 'text',
  48. key: 'orgName',
  49. value: '',
  50. col: 6,
  51. label: '培训中心 *',
  52. flexStyle: 'mr-3',
  53. rules: [v => !!v || '请输入培训中心']
  54. },
  55. {
  56. type: 'text',
  57. key: 'course',
  58. value: '',
  59. col: 6,
  60. label: '培训课程 *',
  61. rules: [v => !!v || '请输入培训课程']
  62. },
  63. {
  64. type: 'datePicker',
  65. key: 'startTime',
  66. mode: 'month',
  67. value: new Date(2020, 0).getTime(), // 月份是从 0 开始的
  68. labelWidth: 80,
  69. label: '开始时间 *',
  70. disabledFutureDates: true,
  71. col: 6,
  72. flexStyle: 'mr-3',
  73. rules: [v => !!v || '请选择培训开始时间'],
  74. change: startTimeChange
  75. },
  76. {
  77. type: 'datePicker',
  78. key: 'endTime',
  79. mode: 'month',
  80. value: new Date(2022, 0).getTime(), // 月份是从 0 开始的
  81. labelWidth: 80,
  82. label: '结束时间 *',
  83. disabledFutureDates: true,
  84. col: 6,
  85. rules: [v => !!v || '请选择培训结束时间'],
  86. change: endTimeChange
  87. },
  88. {
  89. type: 'textarea',
  90. key: 'content',
  91. value: '',
  92. label: '培训描述',
  93. rows: 5,
  94. flexStyle: 'mt-5',
  95. resize: true,
  96. counter: 2000,
  97. rules: [
  98. value => {
  99. if (value?.length <= 2000) return true
  100. return '请输入2-2000个字符'
  101. }
  102. ]
  103. }
  104. ]
  105. })
  106. watch(
  107. () => props.data,
  108. (newVal) => {
  109. if (newVal && Object.keys(newVal)) {
  110. items.value.options.forEach(e => {
  111. if (newVal[e.key]) e.value = newVal[e.key]
  112. })
  113. }
  114. },
  115. { immediate: true }
  116. )
  117. const submit = async () => {
  118. const { valid } = await CtFormRef.value.formRef.validate()
  119. if (!valid) return { id: props.id, data: null}
  120. const obj = {}
  121. items.value.options.forEach(e => obj[e.key] = e.value)
  122. if (obj.startTime > obj.endTime) {
  123. return { id: props.id, data: null, SnackText: `${props.text} 开始时间不能大于结束时间!`}
  124. }
  125. return { id: props.id, data: obj}
  126. }
  127. defineExpose({
  128. id: props.id,
  129. submit
  130. })
  131. </script>
  132. <style lang="scss" scoped>
  133. </style>