diff --git a/Laravel/app/Http/Controllers/API/Admin/YeWu/PlanModelController.php b/Laravel/app/Http/Controllers/API/Admin/YeWu/PlanModelController.php index 1d6fa7e..a4c4c8b 100644 --- a/Laravel/app/Http/Controllers/API/Admin/YeWu/PlanModelController.php +++ b/Laravel/app/Http/Controllers/API/Admin/YeWu/PlanModelController.php @@ -443,4 +443,65 @@ class PlanModelController extends Controller } } + + //保存模板占位数量 + public function SaveLockedCount(Request $request) + { + $userid = $request->get('userid'); + $roster_id = request('roster_id'); + $locked_counts = request('locked_counts'); + + if (empty($roster_id)) { + return \Yz::echoError1('模板ID不能为空'); + } + + if (empty($locked_counts) || !is_array($locked_counts)) { + return \Yz::echoError1('占位数量不能为空'); + } + + DB::beginTransaction(); + + try { + foreach ($locked_counts as $item) { + $appointment_type_id = $item['appointment_type_id']; + $locked_count = $item['locked_count']; + + // 查询对应的记录(模板表 s_source_roster_count) + $countRecord = DB::table('s_source_roster_count') + ->where([ + 'roster_id' => $roster_id, + 'appointment_type_id' => $appointment_type_id + ]) + ->first(); + + if (!$countRecord) { + DB::rollBack(); + return \Yz::echoError1('未找到对应的渠道数量记录'); + } + + if ($locked_count < 0) { + DB::rollBack(); + return \Yz::echoError1('占位数量不能为负数'); + } + + // 更新占位数量 + DB::table('s_source_roster_count') + ->where([ + 'roster_id' => $roster_id, + 'appointment_type_id' => $appointment_type_id + ]) + ->update([ + 'locked_count' => $locked_count, + 'updated_at' => date('Y-m-d H:i:s') + ]); + } + + DB::commit(); + return \Yz::Return(true, '保存成功', []); + + } catch (\Exception $e) { + DB::rollBack(); + return \Yz::echoError1('保存失败:' . $e->getMessage()); + } + } } diff --git a/Laravel/routes/api.php b/Laravel/routes/api.php index 3523d8c..24a34c6 100644 --- a/Laravel/routes/api.php +++ b/Laravel/routes/api.php @@ -81,6 +81,7 @@ Route::group(['middleware'=>['checktoken','log'],'prefix'=>'v1'],function () { Route::post('admin/GetPlanModelDetailInfo','App\Http\Controllers\API\Admin\YeWu\PlanModelController@GetDetailInfo');//获取计划模板详情 Route::post('admin/PlanModelDel','App\Http\Controllers\API\Admin\YeWu\PlanModelController@Del');//删除计划模板 Route::post('admin/SaveAppointmentRatio','App\Http\Controllers\API\Admin\YeWu\PlanModelController@SaveAppointmentRatio');//保存渠道比例 + Route::post('admin/SavePlanModelLockedCount','App\Http\Controllers\API\Admin\YeWu\PlanModelController@SaveLockedCount');//保存模板占位数量 Route::post('admin/CreatePlanList','App\Http\Controllers\API\Admin\YeWu\PlanListController@Create');//生成计划明细 Route::post('admin/PlanListGetList','App\Http\Controllers\API\Admin\YeWu\PlanListController@GetList');//生成计划明细 Route::post('admin/PlanListGetDetail','App\Http\Controllers\API\Admin\YeWu\PlanListController@GetDetail');//计划详情 diff --git a/YiJi-admin/src/api/api.js b/YiJi-admin/src/api/api.js index 6143a45..bb6107e 100644 --- a/YiJi-admin/src/api/api.js +++ b/YiJi-admin/src/api/api.js @@ -390,4 +390,8 @@ export const adminPlanTongJi = (data = {}) => { //保存占位数量 export const SaveLockedCount = (data = {}) => { return axios({ url: import.meta.env.VITE_APP_API + 'v1/admin/SaveLockedCount', data: data }) +} +//保存模板占位数量 +export const SavePlanModelLockedCount = (data = {}) => { + return axios({ url: import.meta.env.VITE_APP_API + 'v1/admin/SavePlanModelLockedCount', data: data }) } \ No newline at end of file diff --git a/YiJi-admin/src/views/AppointmentMngr/PlanModel.vue b/YiJi-admin/src/views/AppointmentMngr/PlanModel.vue index 50ec53f..d70b568 100644 --- a/YiJi-admin/src/views/AppointmentMngr/PlanModel.vue +++ b/YiJi-admin/src/views/AppointmentMngr/PlanModel.vue @@ -83,6 +83,11 @@ +
+ + + +
+
+ 占:{{getTotalLocked(item2.countsInfo)}} +
@@ -305,6 +313,51 @@ + +
+ + + {{ ZhanWeiInfo.id }} + + + {{ ZhanWeiInfo.resources_name }} + + + {{ ZhanWeiInfo.time_range }} + + +
+ +
+ 暂无渠道数据 +
+
+
+
+
+ +
@@ -326,7 +379,8 @@ PlanModelDel, GetEnableDeviceList, CreatePlanList, - GetServiceDateTime + GetServiceDateTime, + SavePlanModelLockedCount } from '@/api/api.js' import { ElMessage, @@ -357,6 +411,9 @@ let dateRange = ref([]) //生成计划明细时,选择的日期范围 let CreatePlanDialogVisible = ref(false) + //占位功能 + let ZhanWeiDialogVisible = ref(false) + let ZhanWeiInfo = ref(null) const CreatedPlanClick = () => { //点击生成计划明细按钮 if (selectedPlanArr.value.length === 0) { ElMessage.error("请至少勾选1条记录") @@ -983,6 +1040,80 @@ return segments; } + //计算总占位数量 + const getTotalLocked = (countsInfo) => { + if (!countsInfo || !Array.isArray(countsInfo)) return 0 + return countsInfo.reduce((total, item) => { + return total + (Number(item.locked_count) || 0) + }, 0) + } + //占位功能 - 打开占位对话框 + const OpenZhanWeiDialog = (row) => { + ZhanWeiDialogVisible.value = true + loading.value = true + GetPlanModelDetailInfo({ + id: row.id + }).then(res => { + loading.value = false + if (res.status) { + ZhanWeiInfo.value = res.data + // 获取资源的名称 + const resource = enableResourceList.value.find(r => r.id === row.resources_id) + ZhanWeiInfo.value.resources_name = resource ? resource.department_resources_name : '' + // 获取时间段 + const timeRange = row.time_range || '' + ZhanWeiInfo.value.time_range = timeRange + // 初始化 locked_count + if (ZhanWeiInfo.value.qudao_total) { + ZhanWeiInfo.value.qudao_total.forEach(item => { + if (item.locked_count === null) { + item.locked_count = 0 + } + }) + } + } else { + ElMessage.error(res.msg) + } + }) + } + //保存占位设置 + const SaveZhanWeiAction = () => { + let locked_counts = [] + let hasError = false + ZhanWeiInfo.value.qudao_total.forEach((item) => { + if (hasError) return + if (Number(item.locked_count) < 0) { + ElMessage.error(`${item.name} 的占位数量不能为负数`) + hasError = true + return + } + // 验证占位数量不能超过可用数量(总数) + if (Number(item.locked_count) > item.count) { + ElMessage.error(`${item.name} 的占位数量不能超过可用数量,最多${item.count}个`) + hasError = true + return + } + locked_counts.push({ + appointment_type_id: item.appointment_type_id, + locked_count: item.locked_count || 0 + }) + }) + if (hasError) return + loading.value = true + SavePlanModelLockedCount({ + roster_id: ZhanWeiInfo.value.id, + locked_counts: locked_counts + }).then(res => { + loading.value = false + if (res.status) { + ZhanWeiDialogVisible.value = false + ElMessage.success('占位设置保存成功') + GetList() // 重新加载列表 + } else { + ElMessage.error(res.msg) + } + }) + } onMounted(() => { searchInfo.value.date_type = 1 @@ -1139,6 +1270,15 @@ } } + .locked_count_row { + position: absolute; + top: 2px; + right: 4px; + color: #ff9800; + font-size: 12px; + font-weight: bold; + } + .hoverTools { position: absolute; top: 0px;