feat(营期管控): 添加营期结束功能及营期设置保存逻辑
- 新增getCampPeriodAdmin API接口用于营期管控 - 在非接数据阶段添加结束营期按钮及相关处理逻辑 - 实现营期设置保存功能并与后端API对接 - 添加营期数据初始化逻辑,从API获取当前营期信息
This commit is contained in:
@@ -60,6 +60,11 @@ export const getConversionRateVsAverage = (params) => {
|
|||||||
return https.post('/api/v1/level_four/overview/conversion_rate_vs_average', params)
|
return https.post('/api/v1/level_four/overview/conversion_rate_vs_average', params)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 营期管控 /api/v1/level_four/overview/camp_period_admin
|
||||||
|
export const getCampPeriodAdmin = (params) => {
|
||||||
|
return https.post('/api/v1/level_four/overview/camp_period_admin', params)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -29,14 +29,16 @@
|
|||||||
<span class="stage-label">营期所属阶段:</span>
|
<span class="stage-label">营期所属阶段:</span>
|
||||||
<span class="stage-value">{{ currentStage }}</span>
|
<span class="stage-value">{{ currentStage }}</span>
|
||||||
|
|
||||||
<!-- 仅在“接数据”阶段显示调控UI -->
|
<!-- 仅在"接数据"阶段显示调控UI -->
|
||||||
<div v-if="isDataReceivingStage" class="stage-control">
|
<div v-if="isDataReceivingStage" class="stage-control">
|
||||||
<span class="control-label">调整“接数据”天数:</span>
|
<span class="control-label">调整"接数据"天数:</span>
|
||||||
<input type="number" v-model.number="dataReceivingStage.days" min="1" class="days-input" />
|
<input type="number" v-model.number="dataReceivingStage.days" min="1" class="days-input" />
|
||||||
<button @click="saveCampSettings" class="save-button">保存</button>
|
<button @click="saveCampSettings" class="save-button">保存</button>
|
||||||
</div>
|
</div>
|
||||||
<div v-for="stage in centerData.stages" :key="stage.name" class="stage-dates">
|
|
||||||
<span>{{ stage.name }}: {{ stage.startDate }} to {{ stage.endDate }}</span>
|
<!-- 非接数据阶段显示结束营期按钮 -->
|
||||||
|
<div v-if="!isDataReceivingStage" class="stage-control">
|
||||||
|
<button @click="finishCamp" class="finish-camp-button">结束营期</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -180,11 +182,13 @@
|
|||||||
import {
|
import {
|
||||||
getOverallCenterPerformance, getTotalGroupCount, getCenterConversionRate, getTotalCallCount, getNewCustomer
|
getOverallCenterPerformance, getTotalGroupCount, getCenterConversionRate, getTotalCallCount, getNewCustomer
|
||||||
, getDepositConversionRate, getCustomerTypeDistribution, getUrgentNeedToAddress, getCenterAdvancedManagerList, getTeamRanking,
|
, getDepositConversionRate, getCustomerTypeDistribution, getUrgentNeedToAddress, getCenterAdvancedManagerList, getTeamRanking,
|
||||||
getTeamRankingInfo, getConversionRateVsAverage
|
getTeamRankingInfo, getConversionRateVsAverage,getCampPeriodAdmin } from '@/api/secondTop.js'
|
||||||
} from '@/api/secondTop.js'
|
|
||||||
import { useRouter } from 'vue-router'
|
import { useRouter } from 'vue-router'
|
||||||
import { useUserStore } from '@/stores/user.js'
|
import { useUserStore } from '@/stores/user.js'
|
||||||
|
// 路由实例
|
||||||
|
const router = useRouter();
|
||||||
|
// 用户store实例
|
||||||
|
const userStore = useUserStore();
|
||||||
// 营期调控逻辑
|
// 营期调控逻辑
|
||||||
// This would ideally come from a prop or API call based on the logged-in user
|
// This would ideally come from a prop or API call based on the logged-in user
|
||||||
const centerData = ref({
|
const centerData = ref({
|
||||||
@@ -247,23 +251,121 @@ const centerData = ref({
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const saveCampSettings = () => {
|
const saveCampSettings = async () => {
|
||||||
recalculateStageDates();
|
recalculateStageDates();
|
||||||
console.log('Saving camp settings for', centerData.value.name);
|
|
||||||
console.log('Updated data:', JSON.parse(JSON.stringify(centerData.value)));
|
// 准备API请求参数
|
||||||
alert('营期设置已保存!');
|
const params = {
|
||||||
|
user_name: userStore.userInfo.username,
|
||||||
|
user_level: userStore.userInfo.user_level.toString(),
|
||||||
|
receipt_data_time: dataReceivingStage.value.days.toString()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
const res = await getCampPeriodAdmin(params);
|
||||||
|
if (res.code === 200) {
|
||||||
|
console.log('营期设置保存成功:', res.data);
|
||||||
|
alert('营期设置已保存!');
|
||||||
|
} else {
|
||||||
|
alert('保存失败,请重试');
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('保存营期设置失败:', error);
|
||||||
|
alert('保存失败,请重试');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 结束营期
|
||||||
|
const finishCamp = async () => {
|
||||||
|
try {
|
||||||
|
const params = {
|
||||||
|
user_name: userStore.userInfo.username,
|
||||||
|
user_level: userStore.userInfo.user_level.toString(),
|
||||||
|
is_camp_finish: "true"
|
||||||
|
};
|
||||||
|
|
||||||
|
const res = await getCampPeriodAdmin(params);
|
||||||
|
if (res.code === 200) {
|
||||||
|
console.log('营期结束成功:', res.data);
|
||||||
|
alert('营期已成功结束!');
|
||||||
|
// 可以在这里添加页面跳转或其他后续操作
|
||||||
|
} else {
|
||||||
|
alert('结束营期失败,请重试');
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('结束营期失败:', error);
|
||||||
|
alert('结束营期失败,请重试!');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// console.log('currentStage', userStore.userInfo)
|
||||||
|
|
||||||
|
// 获取,修改当前营期
|
||||||
|
const campPeriodAdmin = ref({})
|
||||||
|
async function CenterCampPeriodAdmin() {
|
||||||
|
const params = {
|
||||||
|
user_name: userStore.userInfo.username
|
||||||
|
,user_level: userStore.userInfo.user_level.toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
const res = await getCampPeriodAdmin(params)
|
||||||
|
if (res.code === 200) {
|
||||||
|
campPeriodAdmin.value = res.data
|
||||||
|
|
||||||
|
// 根据API返回的数据更新centerData
|
||||||
|
if (res.data.camp_period) {
|
||||||
|
const campPeriod = res.data.camp_period
|
||||||
|
|
||||||
|
// 解析接数据阶段的开始日期作为营期开始日期
|
||||||
|
if (campPeriod.receipt_data_time) {
|
||||||
|
const startDate = campPeriod.receipt_data_time.split(' to ')[0].split(' ')[0]
|
||||||
|
centerData.value.startDate = startDate
|
||||||
|
}
|
||||||
|
|
||||||
|
// 计算各阶段天数
|
||||||
|
const calculateDays = (timeRange) => {
|
||||||
|
if (!timeRange) return 1
|
||||||
|
const [start, end] = timeRange.split(' to ')
|
||||||
|
const startDate = new Date(start.split(' ')[0])
|
||||||
|
const endDate = new Date(end.split(' ')[0])
|
||||||
|
return Math.ceil((endDate - startDate) / (1000 * 60 * 60 * 24)) + 1
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新各阶段天数
|
||||||
|
centerData.value.stages.forEach(stage => {
|
||||||
|
switch(stage.name) {
|
||||||
|
case '接数据':
|
||||||
|
stage.days = calculateDays(campPeriod.receipt_data_time)
|
||||||
|
break
|
||||||
|
case '课一':
|
||||||
|
stage.days = calculateDays(campPeriod.class_one)
|
||||||
|
break
|
||||||
|
case '课二':
|
||||||
|
stage.days = calculateDays(campPeriod.class_two)
|
||||||
|
break
|
||||||
|
case '课三':
|
||||||
|
stage.days = calculateDays(campPeriod.class_three)
|
||||||
|
break
|
||||||
|
case '课四':
|
||||||
|
stage.days = calculateDays(campPeriod.class_four)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// 重新计算阶段日期
|
||||||
|
recalculateStageDates()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// 组别数据
|
// 组别数据
|
||||||
const groups = ref([])
|
const groups = ref([])
|
||||||
// loading 状态
|
// loading 状态
|
||||||
const isLoading = ref(false)
|
const isLoading = ref(false)
|
||||||
|
|
||||||
// 路由实例
|
|
||||||
const router = useRouter();
|
|
||||||
// 用户store实例
|
|
||||||
const userStore = useUserStore();
|
|
||||||
|
|
||||||
// 获取通用请求参数的函数
|
// 获取通用请求参数的函数
|
||||||
const getRequestParams = () => {
|
const getRequestParams = () => {
|
||||||
const params = {}
|
const params = {}
|
||||||
@@ -591,20 +693,23 @@ const conversionRateVsAverage = ref({})
|
|||||||
return statusMap[status] || '未知'
|
return statusMap[status] || '未知'
|
||||||
}
|
}
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
recalculateStageDates();
|
|
||||||
try {
|
try {
|
||||||
isLoading.value = true
|
isLoading.value = true
|
||||||
await CenterOverallCenterPerformance()
|
await CenterCampPeriodAdmin()
|
||||||
await CenterTotalGroupCount()
|
// CenterCampPeriodAdmin中已经调用了recalculateStageDates,这里不需要重复调用
|
||||||
await CenterConversionRate()
|
// await CenterOverallCenterPerformance()
|
||||||
await CenterTotalCallCount()
|
// await CenterTotalGroupCount()
|
||||||
await CenterNewCustomer()
|
// await CenterConversionRate()
|
||||||
await CenterDepositConversionRate()
|
// await CenterTotalCallCount()
|
||||||
await CenterCustomerType()
|
// await CenterNewCustomer()
|
||||||
await CenterUrgentNeedToAddress()
|
// await CenterDepositConversionRate()
|
||||||
await CenterConversionRateVsAverage()
|
// await CenterCustomerType()
|
||||||
await CenterSeniorManagerList()
|
// await CenterUrgentNeedToAddress()
|
||||||
await CenterGroupList('all') // 初始化加载全部高级经理数据
|
// await CenterConversionRateVsAverage()
|
||||||
|
// await CenterSeniorManagerList()
|
||||||
|
|
||||||
|
|
||||||
|
// await CenterGroupList('all') // 初始化加载全部高级经理数据
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('数据加载失败:', error)
|
console.error('数据加载失败:', error)
|
||||||
} finally {
|
} finally {
|
||||||
@@ -1237,4 +1342,19 @@ const conversionRateVsAverage = ref({})
|
|||||||
padding: 5px 10px;
|
padding: 5px 10px;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.finish-camp-button {
|
||||||
|
padding: 8px 16px;
|
||||||
|
font-size: 14px;
|
||||||
|
background-color: #dc3545;
|
||||||
|
color: white;
|
||||||
|
border: none;
|
||||||
|
border-radius: 4px;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: background-color 0.2s;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: #c82333;
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
Reference in New Issue
Block a user