FollowUpRecordForm.vue 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. <!-- 跟进记录的添加表单弹窗 -->
  2. <template>
  3. <Dialog v-model="dialogVisible" :title="dialogTitle" width="50%">
  4. <el-form
  5. ref="formRef"
  6. v-loading="formLoading"
  7. :model="formData"
  8. :rules="formRules"
  9. label-width="120px"
  10. >
  11. <el-row>
  12. <el-col :span="12">
  13. <el-form-item label="跟进类型" prop="type">
  14. <el-select v-model="formData.type" placeholder="请选择跟进类型">
  15. <el-option
  16. v-for="dict in getIntDictOptions(DICT_TYPE.CRM_FOLLOW_UP_TYPE)"
  17. :key="dict.value"
  18. :label="dict.label"
  19. :value="dict.value"
  20. />
  21. </el-select>
  22. </el-form-item>
  23. </el-col>
  24. <el-col :span="12">
  25. <el-form-item label="下次联系时间" prop="nextTime">
  26. <el-date-picker
  27. v-model="formData.nextTime"
  28. placeholder="选择下次联系时间"
  29. type="date"
  30. value-format="x"
  31. />
  32. </el-form-item>
  33. </el-col>
  34. <!-- TODO @puhui999:不搞富文本哈;然后加个附件、图片两个 form-item 哈 -->
  35. <el-col :span="24">
  36. <el-form-item label="跟进内容" prop="content">
  37. <el-input v-model="formData.content" :rows="3" type="textarea" />
  38. </el-form-item>
  39. </el-col>
  40. <el-col :span="24">
  41. <el-form-item label="图片" prop="content">
  42. <UploadImgs v-model="formData.picUrls" class="min-w-80px" />
  43. </el-form-item>
  44. </el-col>
  45. <el-col :span="24">
  46. <el-form-item label="附件" prop="content">
  47. <UploadFile v-model="formData.fileUrls" class="min-w-80px" />
  48. </el-form-item>
  49. </el-col>
  50. <el-col :span="24">
  51. <el-form-item label="关联联系人" prop="contactIds">
  52. <el-button @click="handleAddContact">
  53. <Icon class="mr-5px" icon="ep:plus" />
  54. 添加联系人
  55. </el-button>
  56. <contact-list v-model:contactIds="formData.contactIds" />
  57. </el-form-item>
  58. </el-col>
  59. <el-col :span="24">
  60. <el-form-item label="关联商机" prop="businessIds">
  61. <el-button @click="handleAddBusiness">
  62. <Icon class="mr-5px" icon="ep:plus" />
  63. 添加商机
  64. </el-button>
  65. <business-list v-model:businessIds="formData.businessIds" />
  66. </el-form-item>
  67. </el-col>
  68. </el-row>
  69. </el-form>
  70. <template #footer>
  71. <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
  72. <el-button @click="dialogVisible = false">取 消</el-button>
  73. </template>
  74. </Dialog>
  75. </template>
  76. <script lang="ts" setup>
  77. import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
  78. import { FollowUpRecordApi, FollowUpRecordVO } from '@/api/crm/followup'
  79. import { BusinessList, ContactList } from './components'
  80. import * as ContactApi from '@/api/crm/contact'
  81. import * as BusinessApi from '@/api/crm/business'
  82. defineOptions({ name: 'FollowUpRecordForm' })
  83. const { t } = useI18n() // 国际化
  84. const message = useMessage() // 消息弹窗
  85. const dialogVisible = ref(false) // 弹窗的是否展示
  86. const dialogTitle = ref('') // 弹窗的标题
  87. const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
  88. const formType = ref('') // 表单的类型:create - 新增;update - 修改
  89. const formData = ref<FollowUpRecordVO>({} as FollowUpRecordVO)
  90. const formRules = reactive({
  91. type: [{ required: true, message: '跟进类型不能为空', trigger: 'change' }],
  92. content: [{ required: true, message: '跟进内容不能为空', trigger: 'blur' }],
  93. nextTime: [{ required: true, message: '下次联系时间不能为空', trigger: 'blur' }]
  94. })
  95. const formRef = ref() // 表单 Ref
  96. const allContactList = ref<ContactApi.ContactVO[]>([]) // 所有联系人列表
  97. const allBusinessList = ref<BusinessApi.BusinessVO[]>([]) // 所有商家列表
  98. /** 打开弹窗 */
  99. const open = async (bizType: number, bizId: number, type: string, id?: number) => {
  100. dialogVisible.value = true
  101. dialogTitle.value = t('action.' + type)
  102. formType.value = type
  103. resetForm()
  104. formData.value.bizType = bizType
  105. formData.value.bizId = bizId
  106. allContactList.value = await ContactApi.getSimpleContactList()
  107. allBusinessList.value = await BusinessApi.getSimpleBusinessList()
  108. // 修改时,设置数据
  109. if (id) {
  110. formLoading.value = true
  111. try {
  112. formData.value = await FollowUpRecordApi.getFollowUpRecord(id)
  113. } finally {
  114. formLoading.value = false
  115. }
  116. }
  117. }
  118. defineExpose({ open }) // 提供 open 方法,用于打开弹窗
  119. /** 提交表单 */
  120. const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
  121. const submitForm = async () => {
  122. // 校验表单
  123. await formRef.value.validate()
  124. // 提交请求
  125. formLoading.value = true
  126. try {
  127. const data = formData.value as unknown as FollowUpRecordVO
  128. if (formType.value === 'create') {
  129. await FollowUpRecordApi.createFollowUpRecord(data)
  130. message.success(t('common.createSuccess'))
  131. } else {
  132. await FollowUpRecordApi.updateFollowUpRecord(data)
  133. message.success(t('common.updateSuccess'))
  134. }
  135. dialogVisible.value = false
  136. // 发送操作成功的事件
  137. emit('success')
  138. } finally {
  139. formLoading.value = false
  140. }
  141. }
  142. const handleAddContact = () => {}
  143. const handleAddBusiness = () => {}
  144. /** 重置表单 */
  145. const resetForm = () => {
  146. formRef.value?.resetFields()
  147. formData.value = {} as FollowUpRecordVO
  148. }
  149. </script>