From d06d3f7c789a6ea90b0f3b7fce071665268b4bdf Mon Sep 17 00:00:00 2001
From: kaeery <3491123437@qq.com>
Date: Fri, 7 Mar 2025 17:55:31 +0800
Subject: [PATCH] =?UTF-8?q?=E3=80=90=E6=8B=9B=E7=94=9F=E5=B0=8F=E7=A8=8B?=
=?UTF-8?q?=E5=BA=8F=E3=80=91=20=E6=96=B0=E5=A2=9E#=20=E4=B8=BB=E8=B4=A6?=
=?UTF-8?q?=E5=8F=B7-=E4=B8=AA=E4=BA=BA=EF=BC=9A=E7=94=B5=E9=94=80?=
=?UTF-8?q?=E4=BB=A5=E5=8F=8A=E6=8B=9B=E7=94=9F=E7=9A=84=E7=BA=BF=E7=B4=A2?=
=?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=92=8C=E7=BA=BF=E7=B4=A2=E8=AF=A6=E6=83=85?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/api/admin.ts | 11 +-
.../pages/clue-list/components/clue-card.vue | 30 +++--
src/bundle/pages/clue-list/index.vue | 89 +++++++++-----
src/bundle/pages/login/login.vue | 2 +-
src/components/widgets/admin/filter-value.vue | 36 +++++-
src/components/widgets/admin/orga-picker.vue | 2 +-
.../personally/components/dropdown-picker.vue | 15 ++-
.../personally/components/telesale-card.vue | 111 +++++++++++++-----
.../widgets/admin/personally/index.vue | 103 ++++++++++------
.../team/components/converted-overview.vue | 2 +-
src/components/widgets/admin/team/index.vue | 10 +-
.../widgets/profile-info/profile-info.vue | 1 +
12 files changed, 284 insertions(+), 128 deletions(-)
diff --git a/src/api/admin.ts b/src/api/admin.ts
index da65ad9..55eda00 100644
--- a/src/api/admin.ts
+++ b/src/api/admin.ts
@@ -18,7 +18,7 @@ export function apiOrganizationAllList() {
}
// 岗位列表
export function postLists(params?: any) {
- return request.get({ url: '/system/post/list', data: params })
+ return request.get({ url: '/system/post/list', data: params }, { ignoreCancel: true })
}
// 数据简报
@@ -45,3 +45,12 @@ export function rankListApi(params?: any) {
export function rankMoreListApi(params?: any) {
return request.get({ url: '/control/topAll', data: params })
}
+
+// 具体某个成员的数据
+export function personalListApi(params?: any) {
+ return request.get({ url: '/personageControl/personageControlList', data: params })
+}
+// 具体某个成员的详情
+export function personalDetailApi(params?: any) {
+ return request.get({ url: '/personageControl/detail', data: params })
+}
diff --git a/src/bundle/pages/clue-list/components/clue-card.vue b/src/bundle/pages/clue-list/components/clue-card.vue
index 922d7d1..0e2192b 100644
--- a/src/bundle/pages/clue-list/components/clue-card.vue
+++ b/src/bundle/pages/clue-list/components/clue-card.vue
@@ -11,18 +11,25 @@
+
+ 未领取
+
基本情况
- {{ ellipsisDesc(item) }}
+ {{ item.basicInformation }}
+
+ 电销老师
+ {{ item.telemarketingTeacherName }}
+
跟进时间
- {{ item.createTime }}
+ {{ item.followUpTime }}
招生老师
@@ -30,21 +37,21 @@
领取时间
- {{ item.createTime }}
+ {{ item.getTime }}
-
+
状态
{{ parseStateText }}
-
+
备注
{{ item.remark }}
-
+
成交时间
- {{ item.updateTime }}
+ {{ item.accomplishTime }}
@@ -70,6 +77,9 @@ export interface IClue {
recruitTeacherId: number
telemarketingTeacherId: number
updateTime: string
+ followUpTime: string //跟进时间
+ accomplishTime: string //成交时间
+ getTime: string //领取时间
}
const props = defineProps({
item: {
@@ -77,12 +87,6 @@ const props = defineProps({
default: () => ({})
}
})
-const ellipsisDesc = computed(
- () => (item: IClue) =>
- item.basicInformation?.length >= 14
- ? item.basicInformation?.slice(0, 14) + '...'
- : item.basicInformation
-)
const stateMap: Record = {
[stateEnum.ADD_RELATION]: '账号已添加',
[stateEnum.NO_EXIST]: '账号不存在',
diff --git a/src/bundle/pages/clue-list/index.vue b/src/bundle/pages/clue-list/index.vue
index e1c737d..c951646 100644
--- a/src/bundle/pages/clue-list/index.vue
+++ b/src/bundle/pages/clue-list/index.vue
@@ -47,64 +47,91 @@ import { ref, shallowRef } from 'vue'
import clueCard from './components/clue-card.vue'
import datePopup from './components/date-popup.vue'
import { useZPaging } from '@/hooks/useZPaging'
-import { apiTeleClueList } from '@/api/clue'
import { computed } from 'vue'
import { debounce } from 'lodash-es'
import { nextTick } from 'vue'
import { formatDate, formateDate, getCurDate } from '@/utils/util'
+import { personalDetailApi } from '@/api/admin'
+import { converStatusEnum } from '@/enums'
const queryParams = ref({
- likeWork: ''
+ likeWork: '',
+ userId: '',
+ teachedType: null,
+ status: null,
+ startTime: '',
+ endTime: ''
})
+
const dataList = ref([])
-const { paging, queryList, refresh, changeApi, setParams } = useZPaging(
- queryParams.value,
- apiTeleClueList
-)
const activeTab = ref(0)
const tabOptions: Record = {
telesale: [
{ name: '全部', value: 0 },
- { name: '未领取', value: 1 },
- { name: '已领取', value: 2 },
- { name: '异常待处理', value: 3 }
+ { name: '未领取', value: converStatusEnum.UN_RECEIVED },
+ { name: '已领取', value: converStatusEnum.CONVERTED_PROCESS },
+ { name: '异常待处理', value: converStatusEnum.EXCEPTION }
],
recruitsale: [
- { name: '转化中', value: 0 },
- { name: '已添加', value: 1 },
- { name: '异常待处理', value: 2 },
- { name: '已成交', value: 3 },
- { name: '已战败', value: 4 }
+ { name: '转化中', value: converStatusEnum.CONVERTED_PROCESS },
+ { name: '已添加', value: converStatusEnum.ADD_RELATION },
+ { name: '异常待处理', value: converStatusEnum.EXCEPTION },
+ { name: '已成交', value: converStatusEnum.CONVERTED },
+ { name: '已战败', value: converStatusEnum.FAILED }
]
}
const tabs = computed(() => tabOptions[type.value])
const isScrollable = computed(() => tabs.value?.length >= 5)
const handleChangeTab = item => {
activeTab.value = item.value
+ queryParams.value.status = activeTab.value
+ queryList()
}
const searchChange = debounce(() => {
- refresh(queryParams.value)
+ queryList()
}, 300)
const type = ref('')
-const dateTagFlag = ref('')
+const paging = ref()
+
+const queryList = async (pageNo = 1, pageSize = 10) => {
+ try {
+ uni.showLoading({
+ title: '加载中...'
+ })
+ const params = {
+ ...queryParams.value,
+ pageNo,
+ pageSize
+ }
+ const result = await personalDetailApi(params)
+ paging.value.complete(result.lists)
+ } catch (e) {
+ paging.value.complete(false)
+ }
+ uni.hideLoading()
+}
+
+// const dateTagFlag = ref('')
onLoad(async options => {
setFormData(options)
- dateTagFlag.value = options?.dateTag ?? ''
- await nextTick()
- datePopupRef.value?.setDefaultValue({ ...form.value, dateTag: dateTagFlag.value })
+ // dateTagFlag.value = options?.dateTag ?? ''
+ // await nextTick()
+ // datePopupRef.value?.setDefaultValue({ ...form.value, dateTag: dateTagFlag.value })
+ // datePopupRef.value?.setDefaultValue({ ...form.value })
// if (option.id) {
- // uni.setNavigationBarTitle({
- // title: '张三'
- // })
- type.value = options.type ?? ''
+ uni.setNavigationBarTitle({
+ title:
+ options.postIds == 5 ? '电销老师:' + options.username : '招生老师:' + options.username
+ })
+ type.value = options.postIds == 5 ? 'telesale' : 'recruitsale'
// }
})
const form = ref()
// 设置表单数据
const setFormData = options => {
- form.value = Object.keys(options).reduce((acc, key) => {
- if (key == 'id' || key == 'dateTag' || key == 'type') {
+ queryParams.value = Object.keys(options).reduce((acc, key) => {
+ if (key == 'username') {
return acc
}
acc[key] = decodeURIComponent(options[key])
@@ -118,16 +145,16 @@ const handleShowPopup = () => {
}
const handleConfirmDate = (date: { [key: string]: string }) => {
const { start, end } = date
- form.value.createTimeStart = formateDate(start, 'start', 'YYYY-MM-DD')
- form.value.createTimeEnd = formateDate(end, 'end', 'YYYY-MM-DD')
+ queryParams.value.startTime = formateDate(start, 'start')
+ queryParams.value.endTime = formateDate(end, 'end')
datePopupRef.value?.handleToggle(true)
+ queryList()
}
const handleResetDate = () => {
- form.value.createTimeStart = getCurDate('start', 'YYYY-MM-DD')
- form.value.createTimeEnd = getCurDate('end', 'YYYY-MM-DD')
- console.log(form.value)
-
+ queryParams.value.startTime = getCurDate('start')
+ queryParams.value.endTime = getCurDate('end')
datePopupRef.value?.handleToggle(true)
+ queryList()
}
diff --git a/src/bundle/pages/login/login.vue b/src/bundle/pages/login/login.vue
index 30c5acc..2a15f19 100644
--- a/src/bundle/pages/login/login.vue
+++ b/src/bundle/pages/login/login.vue
@@ -239,7 +239,7 @@ async function loginHandle(data: any) {
cache.set(ROLEINDEX, 2)
setNextRoute()
} else {
- if (userInfo.roles?.length > 1) {
+ if (userInfo.roles?.length >= 1) {
uni.redirectTo({
url: '/bundle/pages/select-role/index'
})
diff --git a/src/components/widgets/admin/filter-value.vue b/src/components/widgets/admin/filter-value.vue
index 973fdec..a9dceea 100644
--- a/src/components/widgets/admin/filter-value.vue
+++ b/src/components/widgets/admin/filter-value.vue
@@ -11,11 +11,21 @@
{{ form.createTimeStart }} - {{ form.createTimeEnd }}
+
+ {{ parseLabel(key) }}:
+ {{ form.startTime }} - {{ form.endTime }}
+
{{ parseLabel(key) }}:
{{ findTargetNode(value) }}
+
+ {{ findTargetMember(value) }}
+
+
+ {{ findTargetPosition(value) }}
+
{{ value }}
@@ -27,6 +37,7 @@ import { PropType } from 'vue'
import { IForm } from './team/index.vue'
import { computed } from 'vue'
import { AdminTabEnum } from '@/enums'
+import { usePositions } from '@/hooks/useCommon'
const formMap: Record = {
[AdminTabEnum.TEAM]: {
@@ -36,7 +47,7 @@ const formMap: Record = {
[AdminTabEnum.PERSONALLY]: {
postId: '岗位',
userId: '用户',
- createTimeRange: '日期'
+ timeRange: '日期'
}
}
const props = defineProps({
@@ -51,10 +62,18 @@ const props = defineProps({
organizationList: {
type: Array as PropType,
default: () => []
+ },
+ positionList: {
+ type: Array as PropType,
+ default: () => []
+ },
+ memberList: {
+ type: Array as PropType,
+ default: () => []
}
})
const filteredForm = computed(() => {
- const { createTimeStart, createTimeEnd, ...rest } = props.form
+ const { createTimeStart, createTimeEnd, startTime = '', endTime = '', ...rest } = props.form
const activeTabMap = formMap[props.activeTab]
const filtered = Object.keys(rest).reduce((acc, key) => {
if (activeTabMap[key]) {
@@ -66,6 +85,10 @@ const filteredForm = computed(() => {
if (createTimeStart && createTimeEnd) {
filtered['createTimeRange'] = 'createTimeRange'
}
+ if (startTime && endTime) {
+ filtered['timeRange'] = 'timeRange'
+ }
+ console.log(filtered)
return filtered
})
@@ -98,5 +121,14 @@ const findTargetNode = computed(() => (id: number) => {
}
return nodeInfo?.name || ''
})
+const findTargetPosition = computed(() => (id: number) => {
+ if (!id) return
+ return props.positionList.find(item => item.id == id).label ?? ''
+})
+const findTargetMember = computed(() => (id: number) => {
+ if (!id) return
+ const nodeInfo = findNodeById(props.memberList, id)
+ if (nodeInfo && nodeInfo.id) return nodeInfo.username
+})
diff --git a/src/components/widgets/admin/orga-picker.vue b/src/components/widgets/admin/orga-picker.vue
index 8a315a5..c224252 100644
--- a/src/components/widgets/admin/orga-picker.vue
+++ b/src/components/widgets/admin/orga-picker.vue
@@ -198,7 +198,7 @@ export default defineComponent({
&-item {
display: flex;
- align-items: center;
+ // align-items: center;
justify-content: space-between;
padding: 24rpx;
// font-size: 24rpx;
diff --git a/src/components/widgets/admin/personally/components/dropdown-picker.vue b/src/components/widgets/admin/personally/components/dropdown-picker.vue
index e1da958..ad2d02c 100644
--- a/src/components/widgets/admin/personally/components/dropdown-picker.vue
+++ b/src/components/widgets/admin/personally/components/dropdown-picker.vue
@@ -48,7 +48,7 @@ const props = defineProps({
default: () => ({})
}
})
-const emit = defineEmits(['update:modelValue', 'refreshPage', 'confirm', 'reset'])
+const emit = defineEmits(['update:modelValue', 'refreshPage', 'confirm', 'reset', 'getData'])
const localValue = computed({
get() {
@@ -81,8 +81,8 @@ const handleConfirm = (type: string, item, dateTag?: string) => {
case 'date':
localValue.value = {
...localValue.value,
- createTimeStart: formateDate(item.start, 'start'),
- createTimeEnd: formateDate(item.end, 'end')
+ startTime: formateDate(item.start, 'start'),
+ endTime: formateDate(item.end, 'end')
}
break
case 'position':
@@ -94,7 +94,6 @@ const handleConfirm = (type: string, item, dateTag?: string) => {
default:
break
}
- emit('refreshPage')
emit('confirm', dateTag)
closeDropDown()
}
@@ -110,21 +109,20 @@ const handleReset = (type: string) => {
case 'date':
localValue.value = {
...localValue.value,
- createTimeStart: getCurDate('start'),
- createTimeEnd: getCurDate('end')
+ startTime: getCurDate('start'),
+ endTime: getCurDate('end')
}
break
case 'position':
localValue.value = {
...localValue.value,
- postId: 0
+ postId: ''
}
break
default:
break
}
- emit('refreshPage')
emit('reset')
closeDropDown()
}
@@ -137,6 +135,7 @@ const fetchAllOrganizationList = async () => {
try {
const result = await apiOrganizationAllList()
dropdownMenuOrgList.value = renameFields(result)
+ emit('getData', dropdownMenuOrgList.value)
} catch (error) {}
}
const renameFields = (data: any[]): any[] => {
diff --git a/src/components/widgets/admin/personally/components/telesale-card.vue b/src/components/widgets/admin/personally/components/telesale-card.vue
index b50c3e5..2d88df3 100644
--- a/src/components/widgets/admin/personally/components/telesale-card.vue
+++ b/src/components/widgets/admin/personally/components/telesale-card.vue
@@ -5,11 +5,13 @@
- 张三
+ {{ item.username }}
- 张三
- 湛江团队-A组 . {{ parsePostionText }}
+ {{ item.username }}
+
+ {{ item.organizationName }} . {{ parsePostionText }}
+
@@ -25,7 +27,7 @@
@@ -53,25 +55,37 @@
diff --git a/src/components/widgets/admin/personally/index.vue b/src/components/widgets/admin/personally/index.vue
index 1acaafa..3c6d39f 100644
--- a/src/components/widgets/admin/personally/index.vue
+++ b/src/components/widgets/admin/personally/index.vue
@@ -1,77 +1,108 @@
-
+
+
-
-
-
-
-
+ >
+
+
+
+
diff --git a/src/components/widgets/admin/team/components/converted-overview.vue b/src/components/widgets/admin/team/components/converted-overview.vue
index 7d8e2d7..188b03e 100644
--- a/src/components/widgets/admin/team/components/converted-overview.vue
+++ b/src/components/widgets/admin/team/components/converted-overview.vue
@@ -1,5 +1,5 @@
-
+
diff --git a/src/components/widgets/admin/team/index.vue b/src/components/widgets/admin/team/index.vue
index c1badf6..1065aa0 100644
--- a/src/components/widgets/admin/team/index.vue
+++ b/src/components/widgets/admin/team/index.vue
@@ -26,11 +26,13 @@ import { getCurDate } from '@/utils/util'
import { AdminTabEnum } from '@/enums'
export interface IForm {
- organizationId: number | null
- createTimeStart: string
- createTimeEnd: string
+ organizationId?: number | null
+ createTimeStart?: string
+ createTimeEnd?: string
+ startTime?: string
+ endTime?: string
userId: string
- postId?: number
+ postId?: number | string
}
defineProps({
diff --git a/src/components/widgets/profile-info/profile-info.vue b/src/components/widgets/profile-info/profile-info.vue
index 29e6704..d777fef 100644
--- a/src/components/widgets/profile-info/profile-info.vue
+++ b/src/components/widgets/profile-info/profile-info.vue
@@ -161,6 +161,7 @@ const judgeShow = () => {
onMounted(() => {
judgeShow()
+ userStore.getUser()
})