workExperience.vue 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. <!-- 工作经历 -->
  2. <template>
  3. <view class="ss-m-x-30 ss-m-y-30">
  4. <uni-forms ref="form" :modelValue="formData" :rules="rules" validateTrigger="bind" label-width="90px">
  5. <uni-forms-item label="企业名称" name="enterpriseName" required>
  6. <uni-combox :candidates="enterpriseData" placeholder="企业名称" v-model="formData.enterpriseName" @input="handleSearchEnterprise"></uni-combox>
  7. </uni-forms-item>
  8. <uni-forms-item label="职位名称" name="positionName" required>
  9. <uni-combox :candidates="positionData" placeholder="职位名称" v-model="formData.positionName"></uni-combox>
  10. </uni-forms-item>
  11. <uni-forms-item label="开始时间" name="startTime" required>
  12. <picker mode="date" :value="formData.startTime" fields="month" :end="endDate" @change="e => formData.startTime = e.detail.value">
  13. <view class="uni-input ss-m-t-20">{{ formData.startTime }}</view>
  14. </picker>
  15. </uni-forms-item>
  16. <uni-forms-item label="结束时间" name="endTime" required>
  17. <view class="d-flex">
  18. <picker mode="date" :value="formData.endTime" :disabled="endDisabled" fields="month" :end="endDate" @change="e => formData.endTime = e.detail.value">
  19. <view class="uni-input ss-m-t-20" :style="{'opacity': endDisabled ? '0.5' : '1'}">{{ formData.endTime }}</view>
  20. </picker>
  21. <uni-data-checkbox selectedColor="#00B760" class="ss-m-l-50 ss-m-t-14" multiple v-model="sofar" :localdata="[{ text: '至今', value: 1 }]" @change="handleChangeSofar"></uni-data-checkbox>
  22. </view>
  23. </uni-forms-item>
  24. <uni-forms-item label="工作内容" name="content" required>
  25. <uni-easyinput type="textarea" v-model="formData.content" autoHeight placeholder="请输入内容"></uni-easyinput>
  26. </uni-forms-item>
  27. </uni-forms>
  28. <view class="f-horizon-center">
  29. <button v-if="editId" size="default" class="delete-button commonBtnStyle" @click="handleDelete">删 除</button>
  30. <button size="default" :class="{'save-button': editId, 'commonBtnStyle': editId, 'send-button': !editId}" @click="submit">保 存</button>
  31. </view>
  32. </view>
  33. </template>
  34. <script setup>
  35. import { ref, unref } from 'vue'
  36. import { convertYearMonthToTimestamp, timesTampChange } from '@/utils/date.js'
  37. import { enterpriseSearchByName, saveResumeWorkExp, deleteResumeWorkExp, getResumeWorkExp } from '@/api/resume.js'
  38. import { onLoad } from '@dcloudio/uni-app'
  39. import { cloneDeep } from 'lodash-es'
  40. import { getDict } from '@/hooks/useDictionaries.js'
  41. let formData = ref({
  42. startTime: '2014-01',
  43. endTime: '2018-01'
  44. })
  45. const sofar = ref([])
  46. const endDisabled = ref(false)
  47. const editId = ref(null)
  48. const enterpriseData = ref([])
  49. const positionData = ref([])
  50. const form = ref()
  51. const date = new Date()
  52. const endDate = date.getFullYear() + '-' + (date.getMonth() + 1) // 不可选时间
  53. const searchData = ref({
  54. enterprise: [],
  55. position: []
  56. })
  57. const rules = {
  58. enterpriseName:{
  59. rules: [{required: true, errorMessage: '请输入企业名称' }]
  60. },
  61. positionName:{
  62. rules: [{required: true, errorMessage: '请输入职位名称' }]
  63. },
  64. startTime:{
  65. rules: [{required: true, errorMessage: '请选择开始时间' }]
  66. },
  67. content:{
  68. rules: [{required: true, errorMessage: '请输入工作内容' }]
  69. }
  70. }
  71. const getExp = async (id) => {
  72. const { data } = await getResumeWorkExp()
  73. if (!data || !data.length) {
  74. return
  75. }
  76. const obj = data.find(e => e.id == id)
  77. formData.value = cloneDeep(obj)
  78. formData.value.startTime = timesTampChange(obj.startTime, 'Y-M')
  79. if (!obj.endTime) {
  80. endDisabled.value = true
  81. formData.value.endTime = '2018-01'
  82. sofar.value = [1]
  83. } else formData.value.endTime = timesTampChange(obj.endTime, 'Y-M')
  84. handleSearchEnterprise(obj.enterpriseName)
  85. }
  86. onLoad((options) => {
  87. if (options.id) {
  88. editId.value = options.id
  89. getExp(options.id)
  90. }
  91. })
  92. // 企业搜索
  93. const handleSearchEnterprise = (e) => {
  94. if (!e) return enterpriseData.value = []
  95. enterpriseSearchByName({ name: e }).then(res => {
  96. searchData.value.enterprise = res.data
  97. enterpriseData.value = res.data && res.data?.length ? res.data.map(e => e.value) : []
  98. })
  99. }
  100. let positionTreeChildrenData = []
  101. getDict('positionTreeData', null, 'positionTreeData').then(({ data }) => {
  102. data = data.data?.length && data.data || []
  103. data.forEach(e => {
  104. if (e?.children?.length) positionTreeChildrenData = positionTreeChildrenData.concat(e.children)
  105. })
  106. searchData.value.position = positionTreeChildrenData
  107. positionData.value = positionTreeChildrenData.map(e => e.nameCn)
  108. })
  109. // 至今
  110. const handleChangeSofar = (e) => {
  111. const value = e.detail.value.length ? e.detail.value[0] : ''
  112. endDisabled.value = value ? true : false
  113. }
  114. // 保存
  115. const submit = async () => {
  116. const valid = await unref(form).validate()
  117. if (!valid) return
  118. formData.value.enterpriseId = searchData.value.enterprise.find(e => e.value === formData.value.enterpriseName)?.key
  119. formData.value.positionId = searchData.value.position.find(e => e.nameCn === formData.value.positionName)?.id
  120. const startTime = convertYearMonthToTimestamp(formData.value.startTime)
  121. const endTime = sofar.value.length ? null : convertYearMonthToTimestamp(formData.value.endTime)
  122. if (!endTime && !sofar.value.length) return uni.showToast({ icon: 'none', title: '请选择结束时间' })
  123. if (endTime && startTime > endTime) {
  124. uni.showToast({ icon: 'none', title: '开始时间不能大于结束时间' })
  125. return
  126. }
  127. try {
  128. await saveResumeWorkExp({ ...formData.value, startTime, endTime })
  129. uni.showToast({
  130. icon: 'success',
  131. title: '保存成功'
  132. })
  133. setTimeout(() => {
  134. editId.value = null
  135. uni.navigateBack({
  136. delta: 1
  137. })
  138. }, 1000)
  139. } catch (err) {
  140. uni.showToast({
  141. icon: 'none',
  142. title: err.msg
  143. })
  144. }
  145. }
  146. // 删除
  147. const handleDelete = async () => {
  148. try {
  149. await deleteResumeWorkExp(editId.value)
  150. uni.showToast({
  151. icon: 'success',
  152. title: '删除成功'
  153. })
  154. setTimeout(() => {
  155. editId.value = null
  156. uni.navigateBack({
  157. delta: 1
  158. })
  159. }, 1000)
  160. } catch (err) {
  161. uni.showToast({
  162. icon: 'none',
  163. title: err.msg
  164. })
  165. }
  166. }
  167. </script>
  168. <style lang="scss" scoped>
  169. </style>