From a1d7e81859f554f3a53680cc35f0f49bf1f77098 Mon Sep 17 00:00:00 2001
From: wwf <1971391498@qq.com>
Date: 星期四, 14 五月 2026 14:37:02 +0800
Subject: [PATCH] 导入项目

---
 src/views/crm/customer/detail/index.vue |  230 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 230 insertions(+), 0 deletions(-)

diff --git a/src/views/crm/customer/detail/index.vue b/src/views/crm/customer/detail/index.vue
new file mode 100644
index 0000000..aff3676
--- /dev/null
+++ b/src/views/crm/customer/detail/index.vue
@@ -0,0 +1,230 @@
+<template>
+  <CustomerDetailsHeader :customer="customer" :loading="loading">
+    <el-button
+      v-if="permissionListRef?.validateWrite"
+      v-hasPermi="['crm:customer:update']"
+      type="primary"
+      @click="openForm"
+    >
+      缂栬緫
+    </el-button>
+    <el-button v-if="permissionListRef?.validateOwnerUser" type="primary" @click="transfer">
+      杞Щ
+    </el-button>
+    <el-button v-if="permissionListRef?.validateWrite" @click="handleUpdateDealStatus">
+      鏇存敼鎴愪氦鐘舵��
+    </el-button>
+    <el-button
+      v-if="customer.lockStatus && permissionListRef?.validateOwnerUser"
+      @click="handleUnlock"
+    >
+      瑙i攣
+    </el-button>
+    <el-button
+      v-if="!customer.lockStatus && permissionListRef?.validateOwnerUser"
+      @click="handleLock"
+    >
+      閿佸畾
+    </el-button>
+    <el-button v-if="!customer.ownerUserId" type="primary" @click="handleReceive"> 棰嗗彇</el-button>
+    <el-button v-if="!customer.ownerUserId" type="primary" @click="handleDistributeForm">
+      鍒嗛厤
+    </el-button>
+    <el-button
+      v-if="customer.ownerUserId && permissionListRef?.validateOwnerUser"
+      @click="handlePutPool"
+    >
+      鏀惧叆鍏捣
+    </el-button>
+  </CustomerDetailsHeader>
+  <el-col>
+    <el-tabs>
+      <el-tab-pane label="璺熻繘璁板綍">
+        <FollowUpList :biz-id="customerId" :biz-type="BizTypeEnum.CRM_CUSTOMER" />
+      </el-tab-pane>
+      <el-tab-pane label="鍩烘湰淇℃伅">
+        <CustomerDetailsInfo :customer="customer" />
+      </el-tab-pane>
+      <el-tab-pane label="鑱旂郴浜�" lazy>
+        <ContactList
+          :biz-id="customer.id!"
+          :customer-id="customer.id!"
+          :biz-type="BizTypeEnum.CRM_CUSTOMER"
+        />
+      </el-tab-pane>
+      <el-tab-pane label="鍥㈤槦鎴愬憳">
+        <PermissionList
+          ref="permissionListRef"
+          :biz-id="customer.id!"
+          :biz-type="BizTypeEnum.CRM_CUSTOMER"
+          :show-action="!permissionListRef?.isPool || false"
+          @quit-team="close"
+        />
+      </el-tab-pane>
+      <el-tab-pane label="鍟嗘満" lazy>
+        <BusinessList
+          :biz-id="customer.id!"
+          :customer-id="customer.id!"
+          :biz-type="BizTypeEnum.CRM_CUSTOMER"
+        />
+      </el-tab-pane>
+      <el-tab-pane label="鍚堝悓" lazy>
+        <ContractList :biz-id="customer.id!" :biz-type="BizTypeEnum.CRM_CUSTOMER" />
+      </el-tab-pane>
+      <el-tab-pane label="鍥炴" lazy>
+        <ReceivablePlanList :customer-id="customer.id!" @create-receivable="createReceivable" />
+        <ReceivableList ref="receivableListRef" :customer-id="customer.id!" />
+      </el-tab-pane>
+      <el-tab-pane label="鎿嶄綔鏃ュ織">
+        <OperateLogV2 :log-list="logList" />
+      </el-tab-pane>
+    </el-tabs>
+  </el-col>
+
+  <!-- 琛ㄥ崟寮圭獥锛氭坊鍔�/淇敼 -->
+  <CustomerForm ref="formRef" @success="getCustomer" />
+  <CustomerDistributeForm ref="distributeForm" @success="getCustomer" />
+  <CrmTransferForm ref="transferFormRef" :biz-type="BizTypeEnum.CRM_CUSTOMER" @success="close" />
+</template>
+<script lang="ts" setup>
+import { useTagsViewStore } from '@/store/modules/tagsView'
+import * as CustomerApi from '@/api/crm/customer'
+import CustomerForm from '@/views/crm/customer/CustomerForm.vue'
+import CustomerDetailsInfo from './CustomerDetailsInfo.vue' // 瀹㈡埛鏄庣粏 - 璇︾粏淇℃伅
+import CustomerDetailsHeader from './CustomerDetailsHeader.vue' // 瀹㈡埛鏄庣粏 - 澶撮儴
+import ContactList from '@/views/crm/contact/components/ContactList.vue' // 鑱旂郴浜哄垪琛�
+import ContractList from '@/views/crm/contract/components/ContractList.vue' // 鍚堝悓鍒楄〃
+import BusinessList from '@/views/crm/business/components/BusinessList.vue' // 鍟嗘満鍒楄〃
+import ReceivableList from '@/views/crm/receivable/components/ReceivableList.vue' // 鍥炴鍒楄〃
+import ReceivablePlanList from '@/views/crm/receivable/plan/components/ReceivablePlanList.vue' // 鍥炴璁″垝鍒楄〃
+import PermissionList from '@/views/crm/permission/components/PermissionList.vue' // 鍥㈤槦鎴愬憳鍒楄〃锛堟潈闄愶級
+import CrmTransferForm from '@/views/crm/permission/components/TransferForm.vue'
+import FollowUpList from '@/views/crm/followup/index.vue'
+import { BizTypeEnum } from '@/api/crm/permission'
+import type { OperateLogVO } from '@/api/system/operatelog'
+import { getOperateLogPage } from '@/api/crm/operateLog'
+import CustomerDistributeForm from '@/views/crm/customer/pool/CustomerDistributeForm.vue'
+
+defineOptions({ name: 'CrmCustomerDetail' })
+
+const customerId = ref(0) // 瀹㈡埛缂栧彿
+const loading = ref(true) // 鍔犺浇涓�
+const message = useMessage() // 娑堟伅寮圭獥
+const { delView } = useTagsViewStore() // 瑙嗗浘鎿嶄綔
+const { push, currentRoute } = useRouter() // 璺敱
+
+const permissionListRef = ref<InstanceType<typeof PermissionList>>() // 鍥㈤槦鎴愬憳鍒楄〃 Ref
+
+/** 鑾峰彇璇︽儏 */
+const customer = ref<CustomerApi.CustomerVO>({} as CustomerApi.CustomerVO) // 瀹㈡埛璇︽儏
+const getCustomer = async () => {
+  loading.value = true
+  try {
+    customer.value = await CustomerApi.getCustomer(customerId.value)
+    await getOperateLog()
+  } finally {
+    loading.value = false
+  }
+}
+
+/** 缂栬緫瀹㈡埛 */
+const formRef = ref<InstanceType<typeof CustomerForm>>() // 瀹㈡埛琛ㄥ崟 Ref
+const openForm = () => {
+  formRef.value?.open('update', customerId.value)
+}
+
+/** 鏇存柊鎴愪氦鐘舵�佹搷浣� */
+const handleUpdateDealStatus = async () => {
+  const dealStatus = !customer.value.dealStatus
+  try {
+    // 鏇存柊鐘舵�佺殑浜屾纭
+    await message.confirm(`纭畾鏇存柊鎴愪氦鐘舵�佷负銆�${dealStatus ? '宸叉垚浜�' : '鏈垚浜�'}銆戝悧锛焋)
+    // 鍙戣捣鏇存柊
+    await CustomerApi.updateCustomerDealStatus(customerId.value, dealStatus)
+    message.success(`鏇存柊鎴愪氦鐘舵�佹垚鍔焋)
+    // 鍒锋柊鏁版嵁
+    await getCustomer()
+  } catch {}
+}
+
+/** 瀹㈡埛杞Щ */
+const transferFormRef = ref<InstanceType<typeof CrmTransferForm>>() // 瀹㈡埛杞Щ琛ㄥ崟 ref
+const transfer = () => {
+  transferFormRef.value?.open(customerId.value)
+}
+
+/** 閿佸畾瀹㈡埛 */
+const handleLock = async () => {
+  await message.confirm(`纭畾閿佸畾瀹㈡埛銆�${customer.value.name}銆� 鍚楋紵`)
+  await CustomerApi.lockCustomer(unref(customerId.value), true)
+  message.success(`閿佸畾瀹㈡埛銆�${customer.value.name}銆戞垚鍔焋)
+  await getCustomer()
+}
+
+/** 瑙i攣瀹㈡埛 */
+const handleUnlock = async () => {
+  await message.confirm(`纭畾瑙i攣瀹㈡埛銆�${customer.value.name}銆� 鍚楋紵`)
+  await CustomerApi.lockCustomer(unref(customerId.value), false)
+  message.success(`瑙i攣瀹㈡埛銆�${customer.value.name}銆戞垚鍔焋)
+  await getCustomer()
+}
+
+/** 棰嗗彇瀹㈡埛 */
+const handleReceive = async () => {
+  await message.confirm(`纭畾棰嗗彇瀹㈡埛銆�${customer.value.name}銆� 鍚楋紵`)
+  await CustomerApi.receiveCustomer([unref(customerId.value)])
+  message.success(`棰嗗彇瀹㈡埛銆�${customer.value.name}銆戞垚鍔焋)
+  await getCustomer()
+}
+
+/** 鍒嗛厤瀹㈡埛 */
+const distributeForm = ref<InstanceType<typeof CustomerDistributeForm>>() // 鍒嗛厤瀹㈡埛琛ㄥ崟 Ref
+const handleDistributeForm = async () => {
+  distributeForm.value?.open(customerId.value)
+}
+
+/** 瀹㈡埛鏀惧叆鍏捣 */
+const handlePutPool = async () => {
+  await message.confirm(`纭畾灏嗗鎴枫��${customer.value.name}銆戞斁鍏ュ叕娴峰悧锛焋)
+  await CustomerApi.putCustomerPool(unref(customerId.value))
+  message.success(`瀹㈡埛銆�${customer.value.name}銆戞斁鍏ュ叕娴锋垚鍔焋)
+  // 鍔犺浇
+  close()
+}
+
+/** 鑾峰彇鎿嶄綔鏃ュ織 */
+const logList = ref<OperateLogVO[]>([]) // 鎿嶄綔鏃ュ織鍒楄〃
+const getOperateLog = async () => {
+  if (!customerId.value) {
+    return
+  }
+  const data = await getOperateLogPage({
+    bizType: BizTypeEnum.CRM_CUSTOMER,
+    bizId: customerId.value
+  })
+  logList.value = data.list
+}
+
+/** 浠庡洖娆捐鍒掑垱寤哄洖娆� */
+const receivableListRef = ref<InstanceType<typeof ReceivableList>>() // 鍥炴鍒楄〃 Ref
+const createReceivable = (planData: any) => {
+  receivableListRef.value?.createReceivable(planData)
+}
+
+const close = () => {
+  delView(unref(currentRoute))
+  push({ name: 'CrmCustomer' })
+}
+
+/** 鍒濆鍖� */
+const { params } = useRoute()
+onMounted(() => {
+  if (!params.id) {
+    message.warning('鍙傛暟閿欒锛屽鎴蜂笉鑳戒负绌猴紒')
+    close()
+    return
+  }
+  customerId.value = params.id as unknown as number
+  getCustomer()
+})
+</script>

--
Gitblit v1.8.0