feat(营期管控): 添加营期结束功能及营期设置保存逻辑
- 新增getCampPeriodAdmin API接口用于营期管控 - 在非接数据阶段添加结束营期按钮及相关处理逻辑 - 实现营期设置保存功能并与后端API对接 - 添加营期数据初始化逻辑,从API获取当前营期信息
This commit is contained in:
@@ -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>
|
||||
Reference in New Issue
Block a user