【招生小程序】 优化# 主账号:个人界面
parent
329ad167a5
commit
187a345608
|
@ -1,15 +1,57 @@
|
|||
<template>
|
||||
<view>
|
||||
<text></text>
|
||||
<view
|
||||
v-for="item in positionList"
|
||||
:key="item.id"
|
||||
class="cell p-[24rpx] border-b border-solid border-[#f1f1f1]"
|
||||
:class="{ active: postId == item.id }"
|
||||
@click="handleCellClick(item)"
|
||||
>
|
||||
<text>{{ item.label }}</text>
|
||||
<template v-if="postId == item.id">
|
||||
<TIcon name="icon-check" color="#0E66FB" />
|
||||
</template>
|
||||
</view>
|
||||
<dropdownFooter @reset="handleReset" @confirm="handleConfirm" />
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { usePositions } from '@/hooks/useCommon'
|
||||
import dropdownFooter from '../../dropdown-footer.vue'
|
||||
|
||||
defineProps({
|
||||
tabs: {
|
||||
type: Array,
|
||||
default: () => []
|
||||
modelValue: {
|
||||
type: Number,
|
||||
default: 0
|
||||
}
|
||||
})
|
||||
const emit = defineEmits(['update:modelValue', 'reset', 'confirm'])
|
||||
|
||||
const { positionList, postId, fetchPositions } = usePositions()
|
||||
fetchPositions()
|
||||
|
||||
const handleCellClick = (item: any) => {
|
||||
const { id } = item
|
||||
postId.value = id
|
||||
emit('update:modelValue', id)
|
||||
}
|
||||
const handleReset = () => {
|
||||
postId.value = 0
|
||||
emit('update:modelValue', 0)
|
||||
emit('reset')
|
||||
}
|
||||
const handleConfirm = () => {
|
||||
emit('confirm', postId.value)
|
||||
}
|
||||
</script>
|
||||
<style scoped></style>
|
||||
<style scoped lang="scss">
|
||||
.cell {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
&.active {
|
||||
color: $blue-1;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
|
@ -9,12 +9,12 @@
|
|||
</view>
|
||||
<view class="flex-1 flex flex-col gap-[12rpx]">
|
||||
<text>张三</text>
|
||||
<text class="text-muted">湛江团队-A组 . 电销老师</text>
|
||||
<text class="text-muted">湛江团队-A组 . {{ parsePostionText }}</text>
|
||||
</view>
|
||||
</view>
|
||||
<view class="flex gap-[12rpx]">
|
||||
<view class="flex gap-[12rpx] flex-wrap" v-if="!containPostIds">
|
||||
<view
|
||||
class="flex-1 flex justify-center items-center flex-col gap-[12rpx]"
|
||||
class="w-[30%] flex justify-center items-center flex-col gap-[12rpx]"
|
||||
v-for="(item, index) in data"
|
||||
:key="`unique_${index}`"
|
||||
>
|
||||
|
@ -22,12 +22,34 @@
|
|||
<text class="font-bold text-[40rpx]">{{ item.value }}</text>
|
||||
</view>
|
||||
</view>
|
||||
<view v-else class="flex gap-[12rpx] flex-wrap">
|
||||
<view
|
||||
class="w-full flex flex-col gap-[24rpx] mb-[24rpx]"
|
||||
v-for="(value, key) in cardMap"
|
||||
:key="key"
|
||||
>
|
||||
<view class="flex justify-between items-center px-[24rpx]">
|
||||
<text>{{ parseText(key) }}数据</text>
|
||||
<text class="text-primary" @click="handleMore(key)">查看</text>
|
||||
</view>
|
||||
<view class="flex gap-[12rpx] flex-wrap bg-[#f1f1f1] mx-[24rpx] py-[24rpx]">
|
||||
<view
|
||||
class="w-[30%] flex justify-center items-center flex-col gap-[12rpx]"
|
||||
v-for="(item, indey) in value"
|
||||
:key="`unique_${indey}`"
|
||||
>
|
||||
<text class="text-muted">{{ item.label }}</text>
|
||||
<text class="font-bold text-[40rpx]">{{ item.value }}</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</card>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref } from 'vue'
|
||||
import { computed } from 'vue'
|
||||
import card from '../../card.vue'
|
||||
|
||||
const props = defineProps({
|
||||
|
@ -36,17 +58,58 @@ const props = defineProps({
|
|||
default: () => {}
|
||||
}
|
||||
})
|
||||
|
||||
const emit = defineEmits(['handleCardClick'])
|
||||
|
||||
const data = ref([
|
||||
{ label: '未领取', value: 368 },
|
||||
{ label: '已领取', value: 100 },
|
||||
{ label: '异常待处理', value: 368 }
|
||||
])
|
||||
const parsePostionText = computed(() => {
|
||||
const { postId } = props.item
|
||||
const ids = postId.split(',')
|
||||
const positionsList = [
|
||||
{ name: '电销老师', id: 5 },
|
||||
{ name: '招生老师', id: 6 }
|
||||
]
|
||||
const findItems = positionsList.filter(item => ids.includes(String(item.id)))
|
||||
return findItems.map(item => item.name).join('/')
|
||||
})
|
||||
|
||||
const cardMap: Record<number, Array<{ label: string; value: number }>> = {
|
||||
5: [
|
||||
{ label: '新增跟进', value: 368 },
|
||||
{ label: '未领取', value: 368 },
|
||||
{ label: '已领取', value: 100 },
|
||||
{ label: '异常待处理', value: 368 }
|
||||
],
|
||||
6: [
|
||||
{ label: '转化中', value: 368 },
|
||||
{ label: '已添加', value: 100 },
|
||||
{ label: '异常待处理', value: 368 },
|
||||
{ label: '成交客户', value: 368 },
|
||||
{ label: '战败客户', value: 368 }
|
||||
]
|
||||
}
|
||||
const parseText = computed(() => (key: number) => key == 5 ? '电销' : '招生')
|
||||
const data = computed(() => {
|
||||
const { postId } = props.item
|
||||
return cardMap[postId]
|
||||
})
|
||||
const parsePostIds = computed(() => {
|
||||
const { postId } = props.item
|
||||
return postId.split(',').map(Number)
|
||||
})
|
||||
const containPostIds = computed(() => {
|
||||
return parsePostIds.value.includes(5) && parsePostIds.value.includes(6)
|
||||
})
|
||||
|
||||
const handleCardClick = () => {
|
||||
emit('handleCardClick', 'telesale', props.item)
|
||||
if (containPostIds.value) return
|
||||
const type =
|
||||
parsePostIds.value.length == 1 && parsePostIds.value.includes(5)
|
||||
? 'telesale'
|
||||
: 'recruitsale'
|
||||
emit('handleCardClick', type, props.item)
|
||||
}
|
||||
const handleMore = (key: number) => {
|
||||
const type = key == 5 ? 'telesale' : 'recruitsale'
|
||||
emit('handleCardClick', type, props.item)
|
||||
}
|
||||
</script>
|
||||
<style scoped></style>
|
||||
|
|
|
@ -1,46 +1,36 @@
|
|||
<template>
|
||||
<view class="flex-1 h-full flex flex-col">
|
||||
<u-dropdown ref="uDropdownRef" menu-icon="arrow-down-fill">
|
||||
<u-dropdown-item title="岗位">
|
||||
<view class="bg-white">
|
||||
<view>
|
||||
<view
|
||||
v-for="item in positionList"
|
||||
:key="item.id"
|
||||
class="cell p-[24rpx] border-b border-solid border-[#f1f1f1]"
|
||||
:class="{ active: postId == item.id }"
|
||||
@click="handleCellClick(item)"
|
||||
>
|
||||
<text>{{ item.label }}</text>
|
||||
<template v-if="postId == item.id">
|
||||
<TIcon name="icon-check" color="#0E66FB" />
|
||||
</template>
|
||||
</view>
|
||||
<view class="bg-white">
|
||||
<u-dropdown ref="uDropdownRef" menu-icon="arrow-down-fill">
|
||||
<u-dropdown-item title="岗位">
|
||||
<view class="bg-white">
|
||||
<position-tabs
|
||||
v-model="postId"
|
||||
@reset="handleReset('position')"
|
||||
@confirm="handleConfirm('position', value)"
|
||||
/>
|
||||
</view>
|
||||
<view class="flex justify-between p-[32rpx] gap-[32rpx]">
|
||||
<view class="flex-1">
|
||||
<u-button class="btn" type="primary" plain text="重置"></u-button>
|
||||
</view>
|
||||
<view class="flex-1">
|
||||
<u-button class="btn" type="primary" text="确定"></u-button>
|
||||
</view>
|
||||
</u-dropdown-item>
|
||||
<u-dropdown-item title="组织">
|
||||
<view class="bg-white">
|
||||
<DropdownPicker
|
||||
:dropdownItem="dropdownMenuList"
|
||||
@reset="() => handleReset('organization')"
|
||||
@confirm="value => handleConfirm('organization', value)"
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
</u-dropdown-item>
|
||||
<u-dropdown-item title="组织">
|
||||
<view class="bg-white">
|
||||
<DropdownPicker :dropdownItem="dropdownMenuList" />
|
||||
<view class="flex justify-between p-[32rpx] gap-[32rpx]">
|
||||
<view class="flex-1">
|
||||
<u-button class="btn" type="primary" plain text="重置"></u-button>
|
||||
</view>
|
||||
<view class="flex-1">
|
||||
<u-button class="btn" type="primary" text="确定"></u-button>
|
||||
</view>
|
||||
</u-dropdown-item>
|
||||
<u-dropdown-item title="日期">
|
||||
<view class="bg-white p-[20rpx]">
|
||||
<dateDropdownPicker
|
||||
:dropdownItem="dropdownMenuList2"
|
||||
@reset="() => handleReset('date')"
|
||||
@confirm="value => handleConfirm('date', value)"
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
</u-dropdown-item>
|
||||
</u-dropdown>
|
||||
</u-dropdown-item>
|
||||
</u-dropdown>
|
||||
</view>
|
||||
<view class="flex-1 mt-3 px-[32rpx] overflow-auto bg-[#FAFAFE]">
|
||||
<z-paging
|
||||
ref="paging"
|
||||
|
@ -50,50 +40,31 @@
|
|||
height="100%"
|
||||
>
|
||||
<template v-for="(item, index) in dataList" :key="`unique_${index}`">
|
||||
<telesale-card
|
||||
v-if="postId == 5"
|
||||
:item="item"
|
||||
@handleCardClick="handleCardClick"
|
||||
/>
|
||||
<recruitsale-card
|
||||
v-if="postId == 6"
|
||||
:item="item"
|
||||
@handleCardClick="handleCardClick"
|
||||
/>
|
||||
<telesale-card :item="item" @handleCardClick="handleCardClick" />
|
||||
</template>
|
||||
</z-paging>
|
||||
</view>
|
||||
<!-- <DropdownPicker :dropdownItem="dropdownMenuList" /> -->
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref } from 'vue'
|
||||
import positionTabs from './components/position-tabs.vue'
|
||||
import DaDropdown from '@/components/da-dropdown/index.vue'
|
||||
import DropdownPicker from '../orga-picker.vue'
|
||||
import telesaleCard from './components/telesale-card.vue'
|
||||
import recruitsaleCard from './components/recruitsale-card.vue'
|
||||
import dateDropdownPicker from '@/components/date-dropdown/daterange.vue'
|
||||
import { useZPaging } from '@/hooks/useZPaging'
|
||||
import { apiTeleClueList } from '@/api/clue'
|
||||
|
||||
const positionList = [
|
||||
{
|
||||
label: '电销老师',
|
||||
id: 5,
|
||||
value: 5
|
||||
},
|
||||
{
|
||||
label: '招生老师',
|
||||
id: 6,
|
||||
value: 6
|
||||
}
|
||||
]
|
||||
const postId = ref()
|
||||
const handleCellClick = (item: any) => {
|
||||
const { id } = item
|
||||
postId.value = id
|
||||
const dropdownMenuList2 = {
|
||||
showQuick: true,
|
||||
title: '日期范围',
|
||||
type: 'daterange',
|
||||
prop: 'god6'
|
||||
// 默认选中 2022-01-01到2022-02-01
|
||||
// value: { start: '2022-01-01', end: '2022-02-01' },
|
||||
}
|
||||
const postId = ref()
|
||||
const dropdownMenuList = [
|
||||
{
|
||||
label: '级联X1',
|
||||
|
@ -142,20 +113,33 @@ const handleCardClick = (type: string, item: any) => {
|
|||
break
|
||||
}
|
||||
}
|
||||
const handleConfirm = (type: string, item) => {
|
||||
switch (type) {
|
||||
case 'organization':
|
||||
console.log(item)
|
||||
break
|
||||
case 'date':
|
||||
console.log(item)
|
||||
|
||||
break
|
||||
case 'position':
|
||||
break
|
||||
default:
|
||||
break
|
||||
}
|
||||
}
|
||||
const handleReset = (type: string) => {
|
||||
switch (type) {
|
||||
case 'organization':
|
||||
break
|
||||
case 'date':
|
||||
break
|
||||
case 'position':
|
||||
break
|
||||
default:
|
||||
break
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.cell {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
&.active {
|
||||
color: $blue-1;
|
||||
}
|
||||
}
|
||||
:deep(.btn) {
|
||||
button {
|
||||
@apply h-[72rpx] rounded-[12rpx];
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<style scoped lang="scss"></style>
|
||||
|
|
|
@ -114,3 +114,32 @@ export function useRank({ width }: { width: number }) {
|
|||
handleChangeTab
|
||||
}
|
||||
}
|
||||
|
||||
// 岗位
|
||||
export function usePositions() {
|
||||
const positionList = ref()
|
||||
const postId = ref()
|
||||
const fetchPositions = () => {
|
||||
try {
|
||||
positionList.value = [
|
||||
{
|
||||
label: '电销老师',
|
||||
id: 5,
|
||||
value: 5
|
||||
},
|
||||
{
|
||||
label: '招生老师',
|
||||
id: 6,
|
||||
value: 6
|
||||
}
|
||||
]
|
||||
if (positionList.value.length > 0) postId.value = positionList.value
|
||||
} catch (error) {}
|
||||
}
|
||||
|
||||
return {
|
||||
positionList,
|
||||
postId,
|
||||
fetchPositions
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue