main
鹿和sa0ChunLuyu 1 week ago
parent eff2db8e06
commit 24a292c61e

@ -191,4 +191,12 @@ public function SaveRules()
$s = new CheckItemService; $s = new CheckItemService;
return $s->SaveRules($item_id, $rules); return $s->SaveRules($item_id, $rules);
} }
public function GetItemRelatedResources()
{
$item_id = request('item_id');
if (!$item_id) return \Yz::echoError1('item_id不能为空');
$s = new CheckItemService;
return $s->GetItemRelatedResources($item_id);
}
} }

@ -301,4 +301,26 @@ public function SaveRules($item_id, $rules)
return \Yz::Return(false, '保存失败:' . $e->getMessage()); return \Yz::Return(false, '保存失败:' . $e->getMessage());
} }
} }
//获取检查项目关联的排班资源列表
public function GetItemRelatedResources($item_id)
{
$resources = DB::table('s_check_item_device')
->join('s_devices', 's_check_item_device.device_id', '=', 's_devices.id')
->join('s_department_resources_device', 's_devices.id', '=', 's_department_resources_device.device_id')
->join('s_department_resources', 's_department_resources_device.rsourece_id', '=', 's_department_resources.id')
->leftJoin('s_department', 's_department_resources.department_id', '=', 's_department.id')
->select(
's_department_resources.id',
's_department_resources.department_resources_name',
's_department.department_name'
)
->where('s_check_item_device.item_id', $item_id)
->where('s_department_resources.is_del', 0)
->where('s_department_resources.department_resources_status', 1)
->distinct()
->get();
return \Yz::Return(true, '查询成功', $resources);
}
} }

@ -960,9 +960,28 @@ public function YuYue($planid, $appointment_type, $mainlistids, $do_type,$is_eme
if ($itemRules->isNotEmpty()) { if ($itemRules->isNotEmpty()) {
$planWeekName = $planInfo->weekname; $planWeekName = $planInfo->weekname;
$planBeginTime = $planInfo->begin_time; $planBeginTime = $planInfo->begin_time;
$rulePass = false; $planResourcesId = $planInfo->resources_id;
// 筛选出适用于当前排班资源的规则
$applicableRules = [];
foreach ($itemRules as $rule) { foreach ($itemRules as $rule) {
$rv = json_decode($rule->rule_value, true); $rv = json_decode($rule->rule_value, true);
$resourcesId = $rv['resources_id'] ?? null;
if (empty($resourcesId)) {
// resources_id 为空,规则跳过
continue;
}
if ($resourcesId != $planResourcesId) {
// 指定了其他排班资源,跳过
continue;
}
$applicableRules[] = $rv;
}
// 无适用规则 → 不受限 → 通过
if (!empty($applicableRules)) {
$rulePass = false;
foreach ($applicableRules as $rv) {
$days = $rv['days'] ?? []; $days = $rv['days'] ?? [];
$startTime = $rv['start_time'] ?? null; $startTime = $rv['start_time'] ?? null;
$endTime = $rv['end_time'] ?? null; $endTime = $rv['end_time'] ?? null;
@ -983,6 +1002,7 @@ public function YuYue($planid, $appointment_type, $mainlistids, $do_type,$is_eme
return \Yz::echoError1($item->item_name . ' 当前时段不在可预约时间范围内'); return \Yz::echoError1($item->item_name . ' 当前时段不在可预约时间范围内');
} }
} }
}
} }
@ -1706,10 +1726,32 @@ private function checkPlanAgainstRules($plan, $allItemRules)
{ {
$planWeekName = $plan->weekname; $planWeekName = $plan->weekname;
$planBeginTime = $plan->begin_time; $planBeginTime = $plan->begin_time;
$planResourcesId = $plan->resources_id;
foreach ($allItemRules as $itemId => $rules) { foreach ($allItemRules as $itemId => $rules) {
$itemPass = false; // 筛选出适用于当前号源排班资源的规则
$applicableRules = [];
foreach ($rules as $rule) { foreach ($rules as $rule) {
$resourcesId = $rule['resources_id'] ?? null;
if (empty($resourcesId)) {
// resources_id 为空,规则跳过,不生效
continue;
}
if ($resourcesId != $planResourcesId) {
// 指定了其他排班资源,跳过
continue;
}
$applicableRules[] = $rule;
}
// 无适用规则 → 该排班资源不受限 → 直接通过
if (empty($applicableRules)) {
continue;
}
// 有适用规则 → 按原逻辑匹配
$itemPass = false;
foreach ($applicableRules as $rule) {
$days = $rule['days'] ?? []; $days = $rule['days'] ?? [];
$startTime = $rule['start_time'] ?? null; $startTime = $rule['start_time'] ?? null;
$endTime = $rule['end_time'] ?? null; $endTime = $rule['end_time'] ?? null;

@ -132,6 +132,7 @@
Route::post('admin/GetHuChiList','App\Http\Controllers\API\Admin\YeWu\CheckItemController@GetHuChiList');//获取某个项目已经设置的互斥列表 Route::post('admin/GetHuChiList','App\Http\Controllers\API\Admin\YeWu\CheckItemController@GetHuChiList');//获取某个项目已经设置的互斥列表
Route::post('admin/GetCheckItemRules','App\Http\Controllers\API\Admin\YeWu\CheckItemController@GetRules');//获取检查项目规则 Route::post('admin/GetCheckItemRules','App\Http\Controllers\API\Admin\YeWu\CheckItemController@GetRules');//获取检查项目规则
Route::post('admin/SaveCheckItemRules','App\Http\Controllers\API\Admin\YeWu\CheckItemController@SaveRules');//保存检查项目规则 Route::post('admin/SaveCheckItemRules','App\Http\Controllers\API\Admin\YeWu\CheckItemController@SaveRules');//保存检查项目规则
Route::post('admin/GetItemRelatedResources','App\Http\Controllers\API\Admin\YeWu\CheckItemController@GetItemRelatedResources');//获取检查项目关联的排班资源
Route::post('admin/InpatientWardGetList','App\Http\Controllers\API\Admin\YeWu\InpatientWardController@GetList');//获取病区列表 Route::post('admin/InpatientWardGetList','App\Http\Controllers\API\Admin\YeWu\InpatientWardController@GetList');//获取病区列表
Route::post('admin/InpatientWardSave','App\Http\Controllers\API\Admin\YeWu\InpatientWardController@Save');//保存病区 Route::post('admin/InpatientWardSave','App\Http\Controllers\API\Admin\YeWu\InpatientWardController@Save');//保存病区
Route::post('admin/InpatientWardDel','App\Http\Controllers\API\Admin\YeWu\InpatientWardController@Del');//删除病区 Route::post('admin/InpatientWardDel','App\Http\Controllers\API\Admin\YeWu\InpatientWardController@Del');//删除病区

@ -406,6 +406,9 @@ export const GetCheckItemRules = (data = {}) => {
export const SaveCheckItemRules = (data = {}) => { export const SaveCheckItemRules = (data = {}) => {
return axios({ url: import.meta.env.VITE_APP_API + 'v1/admin/SaveCheckItemRules', data: data }) return axios({ url: import.meta.env.VITE_APP_API + 'v1/admin/SaveCheckItemRules', data: data })
} }
export const GetItemRelatedResources = (data = {}) => {
return axios({ url: import.meta.env.VITE_APP_API + 'v1/admin/GetItemRelatedResources', data: data })
}
//重置密码 //重置密码
export const resetPwd = (data = {}) => { export const resetPwd = (data = {}) => {
return axios({ url: import.meta.env.VITE_APP_API + 'v1/admin/resetPwd', data: data }) return axios({ url: import.meta.env.VITE_APP_API + 'v1/admin/resetPwd', data: data })

@ -269,6 +269,13 @@
<el-checkbox v-for="d in weekOptions" :key="d" :label="d" :value="d" /> <el-checkbox v-for="d in weekOptions" :key="d" :label="d" :value="d" />
</el-checkbox-group> </el-checkbox-group>
</div> </div>
<div style="display: flex; align-items: center; margin-bottom: 8px;">
<span style="width: 80px; font-weight: 500;">排班资源</span>
<el-select v-model="rule.resources_id" placeholder="不限(规则跳过)" clearable style="width: 300px;">
<el-option v-for="r in relatedResources" :key="r.id" :label="r.department_resources_name + (r.department_name ? '' + r.department_name + '' : '')" :value="r.id" />
</el-select>
<span style="margin-left: 8px; color: #999; font-size: 12px;">为空时规则跳过不生效</span>
</div>
<div style="display: flex; align-items: center;"> <div style="display: flex; align-items: center;">
<span style="width: 80px; font-weight: 500;">允许时段</span> <span style="width: 80px; font-weight: 500;">允许时段</span>
<el-time-select v-model="rule.start_time" :max-time="rule.end_time" <el-time-select v-model="rule.start_time" :max-time="rule.end_time"
@ -312,7 +319,8 @@
UpdateHisItemClass, UpdateHisItemClass,
updateHisCheckItem, updateHisCheckItem,
GetCheckItemRules, GetCheckItemRules,
SaveCheckItemRules SaveCheckItemRules,
GetItemRelatedResources
} from '@/api/api.js' } from '@/api/api.js'
import { import {
ElMessage, ElMessage,
@ -894,19 +902,27 @@
let RuleLoading = ref(false); let RuleLoading = ref(false);
let RuleItemInfo = ref({ id: null, item_name: '' }); let RuleItemInfo = ref({ id: null, item_name: '' });
let RuleList = ref([]); let RuleList = ref([]);
let relatedResources = ref([]);
const weekOptions = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日']; const weekOptions = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日'];
const OpenRuleDialog = (row) => { const OpenRuleDialog = (row) => {
RuleItemInfo.value = { id: row.id, item_name: row.item_name }; RuleItemInfo.value = { id: row.id, item_name: row.item_name };
RuleDialogVisible.value = true; RuleDialogVisible.value = true;
RuleLoading.value = true; RuleLoading.value = true;
//
GetItemRelatedResources({ item_id: row.id }).then(res => {
if (res.status) {
relatedResources.value = res.data;
}
});
GetCheckItemRules({ item_id: row.id }).then(res => { GetCheckItemRules({ item_id: row.id }).then(res => {
RuleLoading.value = false; RuleLoading.value = false;
if (res.status) { if (res.status) {
RuleList.value = (res.data || []).map(r => ({ RuleList.value = (res.data || []).map(r => ({
days: r.rule_value.days || [], days: r.rule_value.days || [],
start_time: r.rule_value.start_time || '', start_time: r.rule_value.start_time || '',
end_time: r.rule_value.end_time || '' end_time: r.rule_value.end_time || '',
resources_id: r.rule_value.resources_id || ''
})); }));
} else { } else {
ElMessage.error(res.msg); ElMessage.error(res.msg);
@ -915,7 +931,7 @@
}; };
const AddRuleRow = () => { const AddRuleRow = () => {
RuleList.value.push({ days: [], start_time: '', end_time: '' }); RuleList.value.push({ days: [], start_time: '', end_time: '', resources_id: '' });
}; };
const RemoveRuleRow = (index) => { const RemoveRuleRow = (index) => {
@ -939,7 +955,8 @@
rule_value: { rule_value: {
days: rule.days, days: rule.days,
start_time: rule.start_time, start_time: rule.start_time,
end_time: rule.end_time end_time: rule.end_time,
resources_id: rule.resources_id || ''
} }
})); }));
RuleLoading.value = true; RuleLoading.value = true;

@ -237,6 +237,13 @@
<el-checkbox v-for="d in weekOptions" :key="d" :label="d" :value="d" /> <el-checkbox v-for="d in weekOptions" :key="d" :label="d" :value="d" />
</el-checkbox-group> </el-checkbox-group>
</div> </div>
<div style="display: flex; align-items: center; margin-bottom: 8px;">
<span style="width: 80px; font-weight: 500;">排班资源</span>
<el-select v-model="rule.resources_id" placeholder="不限(规则跳过)" clearable style="width: 300px;">
<el-option v-for="r in relatedResources" :key="r.id" :label="r.department_resources_name + (r.department_name ? '' + r.department_name + '' : '')" :value="r.id" />
</el-select>
<span style="margin-left: 8px; color: #999; font-size: 12px;">为空时规则跳过不生效</span>
</div>
<div style="display: flex; align-items: center;"> <div style="display: flex; align-items: center;">
<span style="width: 80px; font-weight: 500;">允许时段</span> <span style="width: 80px; font-weight: 500;">允许时段</span>
<el-time-select v-model="rule.start_time" :max-time="rule.end_time" <el-time-select v-model="rule.start_time" :max-time="rule.end_time"
@ -286,7 +293,8 @@
GetCheckItemList, GetCheckItemList,
GetCheckItemRules, GetCheckItemRules,
SaveCheckItemRules, SaveCheckItemRules,
DeptBatchUpdateNotice DeptBatchUpdateNotice,
GetItemRelatedResources
} from '@/api/api.js' } from '@/api/api.js'
import { import {
ElMessage, ElMessage,
@ -783,19 +791,27 @@
let RuleLoading = ref(false); let RuleLoading = ref(false);
let RuleItemInfo = ref({ id: null, item_name: '' }); let RuleItemInfo = ref({ id: null, item_name: '' });
let RuleList = ref([]); let RuleList = ref([]);
let relatedResources = ref([]);
const weekOptions = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日']; const weekOptions = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日'];
const OpenRuleDialog = (row) => { const OpenRuleDialog = (row) => {
RuleItemInfo.value = { id: row.id, item_name: row.item_name }; RuleItemInfo.value = { id: row.id, item_name: row.item_name };
RuleDialogVisible.value = true; RuleDialogVisible.value = true;
RuleLoading.value = true; RuleLoading.value = true;
//
GetItemRelatedResources({ item_id: row.id }).then(res => {
if (res.status) {
relatedResources.value = res.data;
}
});
GetCheckItemRules({ item_id: row.id }).then(res => { GetCheckItemRules({ item_id: row.id }).then(res => {
RuleLoading.value = false; RuleLoading.value = false;
if (res.status) { if (res.status) {
RuleList.value = (res.data || []).map(r => ({ RuleList.value = (res.data || []).map(r => ({
days: r.rule_value.days || [], days: r.rule_value.days || [],
start_time: r.rule_value.start_time || '', start_time: r.rule_value.start_time || '',
end_time: r.rule_value.end_time || '' end_time: r.rule_value.end_time || '',
resources_id: r.rule_value.resources_id || ''
})); }));
} else { } else {
ElMessage.error(res.msg); ElMessage.error(res.msg);
@ -804,7 +820,7 @@
}; };
const AddRuleRow = () => { const AddRuleRow = () => {
RuleList.value.push({ days: [], start_time: '', end_time: '' }); RuleList.value.push({ days: [], start_time: '', end_time: '', resources_id: '' });
}; };
const RemoveRuleRow = (index) => { const RemoveRuleRow = (index) => {
@ -828,7 +844,8 @@
rule_value: { rule_value: {
days: rule.days, days: rule.days,
start_time: rule.start_time, start_time: rule.start_time,
end_time: rule.end_time end_time: rule.end_time,
resources_id: rule.resources_id || ''
} }
})); }));
RuleLoading.value = true; RuleLoading.value = true;

Loading…
Cancel
Save