TransferDialog.vue 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. <template>
  2. <el-dialog
  3. title="客户转移"
  4. v-model="dialog.visible"
  5. width="560px"
  6. class="dialog-form-layout"
  7. align-center
  8. destroy-on-close
  9. :close-on-click-modal="false"
  10. >
  11. <el-alert title="转移说明" type="info" :closable="false" show-icon class="transfer-alert">
  12. <div>已选择 {{ selectedIds.length }} 位客户,将统一转移给指定的负责人</div>
  13. </el-alert>
  14. <el-form ref="formRef" :model="form" :rules="rules" label-position="right" label-width="100px" class="crm-dialog-form">
  15. <el-form-item label="新负责人" prop="newOwnerUserId">
  16. <UserSelector v-model="form.newOwnerUserId" placeholder="请选择新负责人" @change="handleOwnerChange" />
  17. </el-form-item>
  18. <el-form-item label="转移类型" prop="transferType">
  19. <el-radio-group v-model="form.transferType">
  20. <el-radio value="1">转移全部(客户+商机+合同)</el-radio>
  21. <el-radio value="2">仅转移客户</el-radio>
  22. </el-radio-group>
  23. <div class="form-label-tip">
  24. {{
  25. form.transferType === '1'
  26. ? '客户下的所有商机、合同、回款等数据将一并转移'
  27. : '仅转移客户基本信息,商机、合同等仍归原负责人'
  28. }}
  29. </div>
  30. </el-form-item>
  31. <el-form-item label="转移原因" prop="remark">
  32. <el-input
  33. v-model="form.remark"
  34. type="textarea"
  35. :rows="4"
  36. placeholder="请输入转移原因"
  37. maxlength="500"
  38. show-word-limit
  39. />
  40. </el-form-item>
  41. </el-form>
  42. <el-alert title="温馨提示" type="warning" :closable="false" show-icon class="transfer-tip-alert">
  43. <ul class="tip-list">
  44. <li>转移后原负责人将失去对客户的编辑权限</li>
  45. <li>新负责人将收到通知</li>
  46. <li>跟进记录和操作日志将保留</li>
  47. <li>转移记录将被保存到操作日志中</li>
  48. </ul>
  49. </el-alert>
  50. <template #footer>
  51. <div class="dialog-footer">
  52. <el-button class="btn-ghost" @click="cancel">
  53. <el-icon><Close /></el-icon>取消
  54. </el-button>
  55. <el-button class="btn-main" type="primary" :loading="submitting" @click="submitForm">
  56. <el-icon><Position /></el-icon>确认转移
  57. </el-button>
  58. </div>
  59. </template>
  60. </el-dialog>
  61. </template>
  62. <script setup lang="ts" name="CustomerTransferForm">
  63. import { Close, Position } from '@element-plus/icons-vue'
  64. import { fetchTransferCustomer } from '@/api/crm/customer'
  65. import type { CustomerTransferParams } from '@/api/crm/customerTypes'
  66. import UserSelector from '@/components/UserSelector/index.vue'
  67. const emit = defineEmits(['success'])
  68. // 选中的客户ID
  69. const selectedIds = ref<number[]>([])
  70. // 表单数据
  71. const form = ref<CustomerTransferParams>({
  72. ids: [],
  73. newOwnerUserId: undefined,
  74. transferType: '1',
  75. remark: '',
  76. })
  77. // 表单校验规则
  78. const rules = ref({
  79. newOwnerUserId: [{ required: true, message: '请选择新负责人', trigger: 'change' }],
  80. transferType: [{ required: true, message: '请选择转移类型', trigger: 'change' }],
  81. remark: [{ required: true, message: '转移原因不能为空', trigger: 'blur' }],
  82. })
  83. // 对话框
  84. const dialog = reactive({
  85. visible: false,
  86. })
  87. // 提交状态
  88. const submitting = ref(false)
  89. const formRef = ref()
  90. /** 打开对话框 */
  91. const open = async (ids: number[]) => {
  92. reset()
  93. selectedIds.value = ids
  94. form.value.ids = ids
  95. dialog.visible = true
  96. }
  97. /** 负责人变更处理 */
  98. const handleOwnerChange = (userId: number) => {
  99. console.log('选择的新负责人ID:', userId)
  100. }
  101. /** 提交表单 */
  102. const submitForm = () => {
  103. formRef.value?.validate(async (valid: boolean) => {
  104. if (valid) {
  105. try {
  106. submitting.value = true
  107. await fetchTransferCustomer(form.value)
  108. ElMessage.success('转移成功')
  109. dialog.visible = false
  110. emit('success')
  111. } catch (error) {
  112. console.error(error)
  113. } finally {
  114. submitting.value = false
  115. }
  116. }
  117. })
  118. }
  119. /** 取消按钮 */
  120. const cancel = () => {
  121. dialog.visible = false
  122. reset()
  123. }
  124. /** 表单重置 */
  125. const reset = () => {
  126. selectedIds.value = []
  127. form.value = {
  128. ids: [],
  129. newOwnerUserId: undefined,
  130. transferType: '1',
  131. remark: '',
  132. }
  133. submitting.value = false
  134. formRef.value?.resetFields()
  135. }
  136. defineExpose({ open })
  137. </script>
  138. <style scoped lang="scss">
  139. .transfer-alert {
  140. margin-bottom: 16px;
  141. }
  142. .transfer-tip-alert {
  143. margin-top: 16px;
  144. }
  145. .tip-list {
  146. padding-left: 20px;
  147. margin: 0;
  148. list-style: disc;
  149. }
  150. </style>