feat(营期管控): 添加营期结束功能及营期设置保存逻辑

- 新增getCampPeriodAdmin API接口用于营期管控
- 在非接数据阶段添加结束营期按钮及相关处理逻辑
- 实现营期设置保存功能并与后端API对接
- 添加营期数据初始化逻辑,从API获取当前营期信息
This commit is contained in:
2025-08-20 23:17:33 +08:00
parent 5635bcd4be
commit 18d1c74a2c
2 changed files with 153 additions and 28 deletions

View File

@@ -29,14 +29,16 @@
<span class="stage-label">营期所属阶段</span>
<span class="stage-value">{{ currentStage }}</span>
<!-- 仅在接数据阶段显示调控UI -->
<!-- 仅在"接数据"阶段显示调控UI -->
<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" />
<button @click="saveCampSettings" class="save-button">保存</button>
</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>
</template>
@@ -180,11 +182,13 @@
import {
getOverallCenterPerformance, getTotalGroupCount, getCenterConversionRate, getTotalCallCount, getNewCustomer
, getDepositConversionRate, getCustomerTypeDistribution, getUrgentNeedToAddress, getCenterAdvancedManagerList, getTeamRanking,
getTeamRankingInfo, getConversionRateVsAverage
} from '@/api/secondTop.js'
getTeamRankingInfo, getConversionRateVsAverage,getCampPeriodAdmin } from '@/api/secondTop.js'
import { useRouter } from 'vue-router'
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
const centerData = ref({
@@ -247,23 +251,121 @@ const centerData = ref({
});
};
const saveCampSettings = () => {
const saveCampSettings = async () => {
recalculateStageDates();
console.log('Saving camp settings for', centerData.value.name);
console.log('Updated data:', JSON.parse(JSON.stringify(centerData.value)));
alert('营期设置已保存!');
// 准备API请求参数
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([])
// loading 状态
const isLoading = ref(false)
// 路由实例
const router = useRouter();
// 用户store实例
const userStore = useUserStore();
// 获取通用请求参数的函数
const getRequestParams = () => {
const params = {}
@@ -591,20 +693,23 @@ const conversionRateVsAverage = ref({})
return statusMap[status] || '未知'
}
onMounted(async () => {
recalculateStageDates();
try {
isLoading.value = true
await CenterOverallCenterPerformance()
await CenterTotalGroupCount()
await CenterConversionRate()
await CenterTotalCallCount()
await CenterNewCustomer()
await CenterDepositConversionRate()
await CenterCustomerType()
await CenterUrgentNeedToAddress()
await CenterConversionRateVsAverage()
await CenterSeniorManagerList()
await CenterGroupList('all') // 初始化加载全部高级经理数据
await CenterCampPeriodAdmin()
// CenterCampPeriodAdmin中已经调用了recalculateStageDates这里不需要重复调用
// await CenterOverallCenterPerformance()
// await CenterTotalGroupCount()
// await CenterConversionRate()
// await CenterTotalCallCount()
// await CenterNewCustomer()
// await CenterDepositConversionRate()
// await CenterCustomerType()
// await CenterUrgentNeedToAddress()
// await CenterConversionRateVsAverage()
// await CenterSeniorManagerList()
// await CenterGroupList('all') // 初始化加载全部高级经理数据
} catch (error) {
console.error('数据加载失败:', error)
} finally {
@@ -1237,4 +1342,19 @@ const conversionRateVsAverage = ref({})
padding: 5px 10px;
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>