index.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401
  1. <template>
  2. <div class="main_container">
  3. <TopBackNav>
  4. <template #topRight>
  5. <div class="header_content">
  6. <span>{{ customerBaseMsg.schoolName }}</span>
  7. <el-tag type="success" effect="light" size="small" :disable-transitions="true" class="status_tag">
  8. {{ customerBaseMsg.customerType }}
  9. </el-tag>
  10. </div>
  11. <div class="desc">
  12. <span>学段:{{ customerBaseMsg.educationStage }}</span>
  13. <span>省份:{{ customerBaseMsg.province }}</span>
  14. <span>地区:{{ customerBaseMsg.district }}</span>
  15. <span>地址:{{ customerBaseMsg.address }}</span>
  16. <span>归属人:{{ customerBaseMsg.owner }}</span>
  17. <span>认领时间:{{ customerBaseMsg.claimTime }}</span>
  18. <span>上次跟进时间:{{ customerBaseMsg.lastFollowUpTime }}</span>
  19. </div>
  20. <div class="action">
  21. <el-button class="button_background" @click="OpenFollowlFormDialog"><img :src="peopleEditIcon" alt=""> 写跟进</el-button>
  22. <el-button class="button_border" @click="OpenConcactPeoplelFormDialog"><img :src="addIcon" alt=""> 新增联系人</el-button>
  23. <el-button class="button_refresh" @click="OpenSchoolFormDialog"><img :src="editIcon" alt="" > 编辑</el-button>
  24. <el-button class="button_refresh" @click="OpenTransferPublicDialog"><img :src="poepleMoveIcon" alt=""> 转至公海</el-button>
  25. <el-button class="button_refresh" @click="OpenTransferFormDialog"><img :src="exchangeIcon" alt="" > 转让</el-button>
  26. <el-button class="button_refresh" @click="OpenOperationRecordDialog"><img :src="logIcon" alt=""> 操作记录</el-button>
  27. </div>
  28. </template>
  29. </TopBackNav>
  30. <div class="page_item bottom_detail end_item">
  31. <TabSearch :defaultTabKey="defaultShowTab"
  32. tabType="line" :tabList="tabList"
  33. @tabChange="HandleTabChange"
  34. />
  35. <div class="page_solid_line" />
  36. <div class="page_jg_20" style="flex-shrink: 0 !important;"></div>
  37. <!-- 联系人详情 -->
  38. <ContactDetail v-if="defaultShowTab === 'contactDetails'"/>
  39. <CustomerStatusOverview v-if="defaultShowTab === 'messageOverview'"/>
  40. </div>
  41. <!-- 转让 弹窗 -->
  42. <FormDialog
  43. v-if="transferFormDialogVisible"
  44. title="转让" :visible="transferFormDialogVisible"
  45. :submit-loading="transferFormDialogSubmitLoading"
  46. :default-form-data="transferDefaultFormData"
  47. :formItemList="formItemList"
  48. @close="CloseTransferFormDialog"
  49. @confirm="HandleTransferFormDialogConfirm">
  50. </FormDialog>
  51. <!-- 操作记录 弹窗 -->
  52. <PreviewDialog
  53. v-if="operationRecordDialogVisible"
  54. class="operation_dialog"
  55. title="操作记录"
  56. :previewVisible="operationRecordDialogVisible"
  57. :customFooter="true"
  58. @close="CloseOperationRecordDialog">
  59. <SearchBlock :searchList="operationRecordSearchList"></SearchBlock>
  60. <FollowCard :card-list="finalOperationLogRenderData">
  61. <template #operation><i></i></template>
  62. </FollowCard>
  63. <Pagination :currentPage="currentPage" :pageSize="pageSize" :totalNum="totalNum"></Pagination>
  64. <template #close>
  65. <el-button @click="CloseOperationRecordDialog" class="button_background" >关闭</el-button>
  66. </template>
  67. <template #confirm><i></i></template>
  68. </PreviewDialog>
  69. <!-- 编辑学校弹窗 -->
  70. <SchoolFormDialog
  71. v-if="schoolVisible"
  72. v-model:visible="schoolVisible"
  73. :defaultFormData="schoolDefaultFormData">
  74. </SchoolFormDialog>
  75. <!-- 新增联系人弹窗 -->
  76. <ConcactPeopleFormDialog
  77. v-if="concactPeopleVisible"
  78. v-model:visible="concactPeopleVisible"
  79. title="新增联系人"
  80. :default-form-data="concactPeopleDefaultFormData">
  81. </ConcactPeopleFormDialog>
  82. <!-- 写跟进弹窗 -->
  83. <FollowFormDialog
  84. v-if="followVisible"
  85. v-model:visible="followVisible"
  86. :defaultFormData="followDefaultFormData">
  87. </FollowFormDialog>
  88. <!-- 转至公海 提示弹窗 -->
  89. <Dialog :visible="transferPublicVisible"
  90. :submitLoading="transferPublicSubmitLoading"
  91. @close="CloseTransferPublicDialog"
  92. @confirm="HandleTransferPublicConfirm">
  93. 请确认是否将【{{customerBaseMsg.schoolName}}】转至公海
  94. </Dialog>
  95. </div>
  96. </template>
  97. <script setup lang="ts">
  98. import { ref, computed } from 'vue';
  99. import TopBackNav from '@/baseComponents/TopBackNav.vue';
  100. import addIcon from '@/assets/icon/add.svg';
  101. import peopleEditIcon from '@/assets/icon/people_edit.png'
  102. import poepleMoveIcon from '@/assets/icon/people_move.png'
  103. import editIcon from '@/assets/icon/edit.svg'
  104. import exchangeIcon from '@/assets/icon/exchange.png'
  105. import logIcon from '@/assets/icon/log.png'
  106. import TabSearch from '@/baseComponents/TabSearch.vue';
  107. import {tabList} from './tabSearch'
  108. import FormDialog from '@/baseComponents/FormDialog.vue';
  109. import {formItemList} from './formDialog'
  110. import ContactDetail from './contactDetail/index.vue'
  111. import CustomerStatusOverview from './customerStatusOverview/index.vue'
  112. import PreviewDialog from '@/baseComponents/PreviewDialog.vue';
  113. import SearchBlock from '@/baseComponents/SearchBlock.vue';
  114. import {operationRecordSearchList} from './searchBlock'
  115. import FollowCard from '@/components/FollowCard.vue';
  116. import Pagination from '@/baseComponents/Pagination.vue';
  117. import SchoolFormDialog from '@/components/SchoolFormDialog/index.vue'
  118. import ConcactPeopleFormDialog from './components/ConcactPeopleFormDialog/index.vue'
  119. import FollowFormDialog from './components/FollowFormDialog/index.vue'
  120. import Dialog from '@/baseComponents/Dialog.vue';
  121. const customerBaseMsg = ref({
  122. schoolName: '北京市第一零九中学',
  123. customerType: '首单客户',
  124. educationStage: '九年一贯',
  125. province: '北京',
  126. district: '东城区',
  127. address: '北京市东城区葱店西街56号',
  128. owner: '张三',
  129. claimTime: '2024-09-20',
  130. lastFollowUpTime: '2025-03-12'
  131. });
  132. // 默认列表的tab切换
  133. const defaultShowTab = ref('messageOverview')
  134. const HandleTabChange = (val)=>{
  135. defaultShowTab.value = val
  136. }
  137. /** 转让弹窗相关内容及操作 */
  138. const transferFormDialogVisible = ref(false)
  139. const transferFormDialogSubmitLoading = ref(false)
  140. const transferDefaultFormData = ref({
  141. schoolName: '北京市第一零九中学',
  142. currentOwner: '张三',
  143. newOwner:'',
  144. })
  145. const OpenTransferFormDialog=()=>{
  146. console.log('打开转让弹窗')
  147. transferFormDialogVisible.value = true
  148. GetOwnerList()
  149. }
  150. const CloseTransferFormDialog=()=>{
  151. transferFormDialogVisible.value = false
  152. }
  153. const HandleTransferFormDialogConfirm = ()=>{
  154. CloseTransferFormDialog()
  155. }
  156. // 获取归属人列表
  157. const GetOwnerList = ()=>{
  158. formItemList.value = formItemList.value.map(item=>{
  159. if(item.key == 'newOwner'){
  160. let list = [
  161. {
  162. label:'李四',
  163. value:'1'
  164. },
  165. {
  166. label:'王五',
  167. value:'2'
  168. },
  169. {
  170. label:'赵六',
  171. value:'3'
  172. },
  173. ]
  174. item.selectList = [...list]
  175. }
  176. return item
  177. })
  178. }
  179. /** 操作记录相关内容及操作 */
  180. const operationRecordDialogVisible = ref(false)
  181. const OpenOperationRecordDialog=()=>{
  182. console.log('打开操作记录弹窗')
  183. operationRecordDialogVisible.value = true
  184. }
  185. const CloseOperationRecordDialog=()=>{
  186. operationRecordDialogVisible.value = false
  187. }
  188. /** 操作记录有关数据 */
  189. const operationLogList = ref([
  190. {
  191. id:1,
  192. operationTime: '26-02-19 19:00',
  193. operatorName: '张安顺',
  194. schoolName: '北京师达学校',
  195. operationType: '编辑学校信息',
  196. operationContent: '学校名称【北京109中学】学段【初中】调整为学校名称【北京一零九中学】学段【九年一贯】。'
  197. },
  198. {
  199. id:2,
  200. operationTime: '26-02-19 19:00',
  201. operatorName: '张安顺',
  202. schoolName: '北京师达学校',
  203. operationType: '删除联系人',
  204. operationContent: '删除 姓名【张三】职务【校长】手机电话【17820681226】办公电话【17820681226】备注【文案文案】。'
  205. },
  206. {
  207. id:3,
  208. operationTime: '26-02-19 19:00',
  209. operatorName: '张安顺',
  210. schoolName: '北京师达学校',
  211. operationType: '新增联系人',
  212. operationContent: '新增 姓名【张三】职务【校长】手机电话【17820681226】办公电话【17820681226】备注【文案文案】。'
  213. },
  214. {
  215. id:4,
  216. operationTime: '26-02-19 19:00',
  217. operatorName: '张安顺',
  218. schoolName: '北京师达学校',
  219. operationType: '编辑联系人',
  220. operationContent: '联系人姓名【张三】职务【校长】手机电话【17820681226】备注【文案文案】调整为 联系人姓名【李四】职务【校长】手机电话【17820681226】备注【文案文案】。'
  221. },
  222. {
  223. id:5,
  224. operationTime: '26-02-19 19:00',
  225. operatorName: '张安顺',
  226. schoolName: '北京师达学校',
  227. operationType: '转至公海',
  228. operationContent: '将客户转至公海。'
  229. }
  230. ]);
  231. const finalOperationLogRenderData = computed(()=>{
  232. return operationLogList.value.map(item=>{
  233. return {
  234. headerTitleList:[
  235. item.operationTime,
  236. item.operatorName,
  237. item.schoolName,
  238. item.operationType
  239. ],
  240. headerTags:[],
  241. middleDesc:[],
  242. bottomDesc:`操作内容:${item.operationContent}`
  243. }
  244. })
  245. })
  246. // 分页参数 有关数据 *
  247. const currentPage = ref(1)
  248. const pageSize = ref(20)
  249. const totalNum = ref(0)
  250. /** 编辑学校 有关数据 及操作 */
  251. const schoolVisible = ref(false)
  252. const schoolDefaultFormData = ref({})
  253. const OpenSchoolFormDialog = ()=>{
  254. schoolVisible.value = true
  255. schoolDefaultFormData.value = {
  256. id: 1,
  257. customerType: '首单客户',
  258. schoolName: '流星花园学校',
  259. schoolStage: 'middle',
  260. province:'beijing',
  261. provinceName: '北京市',
  262. city:'dongcheng',
  263. cityName: '东城区',
  264. detailAddress:'通州北苑',
  265. groupName: '小组',
  266. owner: '张三',
  267. claimTime: '2026-03-11',
  268. lastFollowUpTime: '2026-03-11',
  269. provinceArea:{
  270. province:'beijing',
  271. district:'dongcheng',
  272. }
  273. }
  274. }
  275. /** 新增联系人有关数据 及操作 */
  276. const concactPeopleVisible = ref(false)
  277. const concactPeopleDefaultFormData = ref({})
  278. const OpenConcactPeoplelFormDialog = ()=>{
  279. concactPeopleVisible.value = true
  280. concactPeopleDefaultFormData.value = {}
  281. }
  282. /** 写跟进 弹窗有关数据 及操作 */
  283. const followVisible = ref(false)
  284. const followDefaultFormData = ref({})
  285. const OpenFollowlFormDialog = ()=>{
  286. followVisible.value = true
  287. followDefaultFormData.value = {
  288. school:customerBaseMsg.value.schoolName,
  289. }
  290. console.log('跟进弹窗的内容---',followDefaultFormData.value)
  291. }
  292. /** 转至公海 弹窗有关数据 及操作 */
  293. const transferPublicVisible = ref(false)
  294. const transferPublicSubmitLoading = ref(false)
  295. const CloseTransferPublicDialog = ()=>{
  296. transferPublicVisible.value = false
  297. }
  298. const OpenTransferPublicDialog = ()=>{
  299. transferPublicVisible.value = true
  300. }
  301. const HandleTransferPublicConfirm = ()=>{
  302. CloseTransferPublicDialog()
  303. }
  304. </script>
  305. <style lang="scss" scoped>
  306. .main_container{
  307. gap:16px;
  308. :deep(.top_right){
  309. flex: 1 1;
  310. .header_content{
  311. display: flex;
  312. align-items: center;
  313. gap:10px;
  314. font-weight: 600;
  315. font-size: 20px;
  316. color: #333333;
  317. line-height: 28px;
  318. .status_tag{
  319. height: 25px;
  320. border-radius: 4px ;
  321. padding:0 8px;
  322. font-weight: 400;
  323. font-size: 12px;
  324. color: #2E64FA;
  325. background: rgba(46,100,250,0.1);
  326. }
  327. }
  328. .desc{
  329. display: flex;
  330. gap:5px 16px;
  331. flex-wrap: wrap;
  332. font-size: 12px;
  333. color: #999999;
  334. margin-top: 8px;
  335. margin-bottom: 16px;
  336. }
  337. .action{
  338. display: flex;
  339. gap:16px;
  340. .el-button{
  341. margin:0;
  342. img{
  343. width: 16px;
  344. height: 16px;
  345. margin-right: 4px;
  346. }
  347. }
  348. }
  349. }
  350. .bottom_detail{
  351. overflow: auto;
  352. }
  353. }
  354. .operation_dialog{
  355. .follow_card{
  356. margin-top: 16px;
  357. }
  358. }
  359. </style>