【招生小程序】 优化# 主账号:个人界面
parent
329ad167a5
commit
187a345608
|
@ -1,15 +1,57 @@
|
||||||
<template>
|
<template>
|
||||||
<view>
|
<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>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
import { usePositions } from '@/hooks/useCommon'
|
||||||
|
import dropdownFooter from '../../dropdown-footer.vue'
|
||||||
|
|
||||||
defineProps({
|
defineProps({
|
||||||
tabs: {
|
modelValue: {
|
||||||
type: Array,
|
type: Number,
|
||||||
default: () => []
|
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>
|
</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>
|
||||||
<view class="flex-1 flex flex-col gap-[12rpx]">
|
<view class="flex-1 flex flex-col gap-[12rpx]">
|
||||||
<text>张三</text>
|
<text>张三</text>
|
||||||
<text class="text-muted">湛江团队-A组 . 电销老师</text>
|
<text class="text-muted">湛江团队-A组 . {{ parsePostionText }}</text>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="flex gap-[12rpx]">
|
<view class="flex gap-[12rpx] flex-wrap" v-if="!containPostIds">
|
||||||
<view
|
<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"
|
v-for="(item, index) in data"
|
||||||
:key="`unique_${index}`"
|
:key="`unique_${index}`"
|
||||||
>
|
>
|
||||||
|
@ -22,12 +22,34 @@
|
||||||
<text class="font-bold text-[40rpx]">{{ item.value }}</text>
|
<text class="font-bold text-[40rpx]">{{ item.value }}</text>
|
||||||
</view>
|
</view>
|
||||||
</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>
|
</view>
|
||||||
</card>
|
</card>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref } from 'vue'
|
import { computed } from 'vue'
|
||||||
import card from '../../card.vue'
|
import card from '../../card.vue'
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
|
@ -36,17 +58,58 @@ const props = defineProps({
|
||||||
default: () => {}
|
default: () => {}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
const emit = defineEmits(['handleCardClick'])
|
const emit = defineEmits(['handleCardClick'])
|
||||||
|
|
||||||
const data = ref([
|
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: 368 },
|
||||||
{ label: '已领取', value: 100 },
|
{ label: '已领取', value: 100 },
|
||||||
{ label: '异常待处理', value: 368 }
|
{ 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 = () => {
|
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>
|
</script>
|
||||||
<style scoped></style>
|
<style scoped></style>
|
||||||
|
|
|
@ -1,46 +1,36 @@
|
||||||
<template>
|
<template>
|
||||||
<view class="flex-1 h-full flex flex-col">
|
<view class="flex-1 h-full flex flex-col">
|
||||||
|
<view class="bg-white">
|
||||||
<u-dropdown ref="uDropdownRef" menu-icon="arrow-down-fill">
|
<u-dropdown ref="uDropdownRef" menu-icon="arrow-down-fill">
|
||||||
<u-dropdown-item title="岗位">
|
<u-dropdown-item title="岗位">
|
||||||
<view class="bg-white">
|
<view class="bg-white">
|
||||||
<view>
|
<position-tabs
|
||||||
<view
|
v-model="postId"
|
||||||
v-for="item in positionList"
|
@reset="handleReset('position')"
|
||||||
:key="item.id"
|
@confirm="handleConfirm('position', value)"
|
||||||
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>
|
|
||||||
<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>
|
|
||||||
</view>
|
|
||||||
</view>
|
</view>
|
||||||
</u-dropdown-item>
|
</u-dropdown-item>
|
||||||
<u-dropdown-item title="组织">
|
<u-dropdown-item title="组织">
|
||||||
<view class="bg-white">
|
<view class="bg-white">
|
||||||
<DropdownPicker :dropdownItem="dropdownMenuList" />
|
<DropdownPicker
|
||||||
<view class="flex justify-between p-[32rpx] gap-[32rpx]">
|
:dropdownItem="dropdownMenuList"
|
||||||
<view class="flex-1">
|
@reset="() => handleReset('organization')"
|
||||||
<u-button class="btn" type="primary" plain text="重置"></u-button>
|
@confirm="value => handleConfirm('organization', value)"
|
||||||
</view>
|
/>
|
||||||
<view class="flex-1">
|
|
||||||
<u-button class="btn" type="primary" text="确定"></u-button>
|
|
||||||
</view>
|
|
||||||
</view>
|
</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-item>
|
||||||
</u-dropdown>
|
</u-dropdown>
|
||||||
|
</view>
|
||||||
<view class="flex-1 mt-3 px-[32rpx] overflow-auto bg-[#FAFAFE]">
|
<view class="flex-1 mt-3 px-[32rpx] overflow-auto bg-[#FAFAFE]">
|
||||||
<z-paging
|
<z-paging
|
||||||
ref="paging"
|
ref="paging"
|
||||||
|
@ -50,50 +40,31 @@
|
||||||
height="100%"
|
height="100%"
|
||||||
>
|
>
|
||||||
<template v-for="(item, index) in dataList" :key="`unique_${index}`">
|
<template v-for="(item, index) in dataList" :key="`unique_${index}`">
|
||||||
<telesale-card
|
<telesale-card :item="item" @handleCardClick="handleCardClick" />
|
||||||
v-if="postId == 5"
|
|
||||||
:item="item"
|
|
||||||
@handleCardClick="handleCardClick"
|
|
||||||
/>
|
|
||||||
<recruitsale-card
|
|
||||||
v-if="postId == 6"
|
|
||||||
:item="item"
|
|
||||||
@handleCardClick="handleCardClick"
|
|
||||||
/>
|
|
||||||
</template>
|
</template>
|
||||||
</z-paging>
|
</z-paging>
|
||||||
</view>
|
</view>
|
||||||
<!-- <DropdownPicker :dropdownItem="dropdownMenuList" /> -->
|
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref } from 'vue'
|
import { ref } from 'vue'
|
||||||
import positionTabs from './components/position-tabs.vue'
|
import positionTabs from './components/position-tabs.vue'
|
||||||
import DaDropdown from '@/components/da-dropdown/index.vue'
|
|
||||||
import DropdownPicker from '../orga-picker.vue'
|
import DropdownPicker from '../orga-picker.vue'
|
||||||
import telesaleCard from './components/telesale-card.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 { useZPaging } from '@/hooks/useZPaging'
|
||||||
import { apiTeleClueList } from '@/api/clue'
|
import { apiTeleClueList } from '@/api/clue'
|
||||||
|
|
||||||
const positionList = [
|
const dropdownMenuList2 = {
|
||||||
{
|
showQuick: true,
|
||||||
label: '电销老师',
|
title: '日期范围',
|
||||||
id: 5,
|
type: 'daterange',
|
||||||
value: 5
|
prop: 'god6'
|
||||||
},
|
// 默认选中 2022-01-01到2022-02-01
|
||||||
{
|
// value: { start: '2022-01-01', end: '2022-02-01' },
|
||||||
label: '招生老师',
|
|
||||||
id: 6,
|
|
||||||
value: 6
|
|
||||||
}
|
|
||||||
]
|
|
||||||
const postId = ref()
|
|
||||||
const handleCellClick = (item: any) => {
|
|
||||||
const { id } = item
|
|
||||||
postId.value = id
|
|
||||||
}
|
}
|
||||||
|
const postId = ref()
|
||||||
const dropdownMenuList = [
|
const dropdownMenuList = [
|
||||||
{
|
{
|
||||||
label: '级联X1',
|
label: '级联X1',
|
||||||
|
@ -142,20 +113,33 @@ const handleCardClick = (type: string, item: any) => {
|
||||||
break
|
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>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss"></style>
|
||||||
.cell {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
&.active {
|
|
||||||
color: $blue-1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
:deep(.btn) {
|
|
||||||
button {
|
|
||||||
@apply h-[72rpx] rounded-[12rpx];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
|
@ -114,3 +114,32 @@ export function useRank({ width }: { width: number }) {
|
||||||
handleChangeTab
|
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