diff --git a/Laravel/app/Http/Controllers/API/Admin/YeWu/DepartmentController.php b/Laravel/app/Http/Controllers/API/Admin/YeWu/DepartmentController.php index a41124b..ce9036c 100644 --- a/Laravel/app/Http/Controllers/API/Admin/YeWu/DepartmentController.php +++ b/Laravel/app/Http/Controllers/API/Admin/YeWu/DepartmentController.php @@ -6,6 +6,8 @@ use App\Services\Admin\UserService; use Illuminate\Http\Request; use App\Services\Admin\YeWu\DepartmentService; +use App\Http\Controllers\API\His\HisController; +use Illuminate\Support\Facades\DB; class DepartmentController extends Controller { //获取科室列表 @@ -102,4 +104,115 @@ public function GetChildrenDepartments() return $service->GetChildrenDepartments($department_id); } + //从HIS同步科室 + 返回统计 + public function SyncDepartment() + { + // 1. 同步前快照 + $beforeSnapshot = $this->getDeptSnapshot(); + + // 2. 调用 HIS 接口获取科室列表 + $His = new HisController(); + $res = $His::Get('查询科室列表', []); + + if ($res['code'] != 200) { + return \Yz::JsonError('调用His接口失败'); + } + + $hisData = $res['data']; + $receivedCodes = []; + + foreach ($hisData as $item) { + $deptCode = $item['deptCode']; + $deptName = $item['deptName']; + $validState = $item['validState'] ?? '1'; + $deptStatus = ($validState == '1') ? 1 : 0; + + $receivedCodes[] = $deptCode; + + $dpt = DB::table('s_department') + ->where('department_number', $deptCode) + ->first(); + + if (!$dpt) { + DB::table('s_department')->insert([ + 'department_number' => $deptCode, + 'department_name' => $deptName, + 'department_status' => $deptStatus, + 'is_del' => 0, + ]); + } else { + DB::table('s_department') + ->where('department_number', $deptCode) + ->update([ + 'department_name' => $deptName, + 'department_status' => $deptStatus, + 'is_del' => 0, + ]); + } + } + + // 3. 处理移除:HIS未返回的科室标记 is_del=1 + DB::table('s_department') + ->where('is_del', 0) + ->whereNotIn('department_number', $receivedCodes) + ->update(['is_del' => 1]); + + // 4. 同步后快照 + $afterSnapshot = $this->getDeptSnapshot(); + + // 5. 对比统计 + $beforeCodes = array_keys($beforeSnapshot); + $afterCodes = array_keys($afterSnapshot); + $beforeSet = array_flip($beforeCodes); + $afterSet = array_flip($afterCodes); + + $addedCodes = array_diff_key($afterSet, $beforeSet); + $removedCodes = array_diff_key($beforeSet, $afterSet); + $commonCodes = array_intersect_key($beforeSet, $afterSet); + + $updatedCount = 0; + $enabledCount = 0; + $disabledCount = 0; + + foreach ($commonCodes as $code => $v) { + $before = $beforeSnapshot[$code]; + $after = $afterSnapshot[$code]; + + if ($before['name'] !== $after['name']) { + $updatedCount++; + } + if ($before['status'] == 0 && $after['status'] == 1) { + $enabledCount++; + } + if ($before['status'] == 1 && $after['status'] == 0) { + $disabledCount++; + } + } + + return \Yz::Return(true, '同步完成', [ + 'added' => count($addedCodes), + 'removed' => count($removedCodes), + 'updated' => $updatedCount, + 'enabled' => $enabledCount, + 'disabled' => $disabledCount, + ]); + } + + //获取所有 is_del=0 的科室快照 + private function getDeptSnapshot() + { + $items = DB::table('s_department') + ->where('is_del', 0) + ->select('department_number', 'department_name', 'department_status') + ->get(); + + $snapshot = []; + foreach ($items as $item) { + $snapshot[$item->department_number] = [ + 'name' => $item->department_name, + 'status' => $item->department_status, + ]; + } + return $snapshot; + } } diff --git a/Laravel/routes/api.php b/Laravel/routes/api.php index c198763..2c8c194 100644 --- a/Laravel/routes/api.php +++ b/Laravel/routes/api.php @@ -89,6 +89,7 @@ Route::post('admin/GetLeafDepartmentList','App\Http\Controllers\API\Admin\YeWu\DepartmentController@GetLeafList');//获取可作为诊室的叶子节点科室列表 Route::post('admin/SaveDepartmentChildren','App\Http\Controllers\API\Admin\YeWu\DepartmentController@SaveChildren');//保存科室关联诊室关系 Route::post('admin/GetHasScheduleTopDepartments','App\Http\Controllers\API\Admin\YeWu\DepartmentController@GetHasScheduleTopDepartments');//获取有排班资源的科室列表 + Route::post('admin/DeptSyncDepartment','App\Http\Controllers\API\Admin\YeWu\DepartmentController@SyncDepartment');//从HIS同步科室 Route::post('admin/SaveDepartmentResource','App\Http\Controllers\API\Admin\YeWu\DepartmentResourceController@Save');//保存科室资源信息 Route::post('admin/DepartmentResourceGetList','App\Http\Controllers\API\Admin\YeWu\DepartmentResourceController@GetList');//获取科室资源list Route::post('admin/DepartmentResourceGetEnableList','App\Http\Controllers\API\Admin\YeWu\DepartmentResourceController@GetEnableList');//获取可用科室资源 diff --git a/YiJi-admin/src/api/api.js b/YiJi-admin/src/api/api.js index 7e914a6..35e0712 100644 --- a/YiJi-admin/src/api/api.js +++ b/YiJi-admin/src/api/api.js @@ -249,6 +249,10 @@ export const SaveDepartmentChildren = (data = {}) => { export const GetHasScheduleTopDepartments = (data = {}) => { return axios({ url: import.meta.env.VITE_APP_API + 'v1/admin/GetHasScheduleTopDepartments', data: data }) } +//从HIS同步科室 +export const DeptSyncDepartment = (data = {}) => { + return axios({ url: import.meta.env.VITE_APP_API + 'v1/admin/DeptSyncDepartment', data: data }) +} //admin保存科室资源信息 export const SaveDepartmentResource = (data = {}) => { return axios({ url: import.meta.env.VITE_APP_API + 'v1/admin/SaveDepartmentResource', data: data }) diff --git a/YiJi-admin/src/views/YeWu/DepartmentConfig.vue b/YiJi-admin/src/views/YeWu/DepartmentConfig.vue index c846416..f3d231b 100644 --- a/YiJi-admin/src/views/YeWu/DepartmentConfig.vue +++ b/YiJi-admin/src/views/YeWu/DepartmentConfig.vue @@ -14,6 +14,7 @@ 查询 添加科室 + 从HIS同步科室 只显示存在排班的科室 @@ -164,6 +165,57 @@ + + + + + @@ -181,9 +233,13 @@ GetDepartmentChildren, GetLeafDepartmentList, SaveDepartmentChildren, - GetHasScheduleTopDepartments + GetHasScheduleTopDepartments, + DeptSyncDepartment } from '@/api/api.js' import { ElMessage, ElMessageBox } from 'element-plus' + import { + Loading + } from '@element-plus/icons-vue' import DepartmentResourcesSave from '@/components/Yewu/DepartmentResourcesSave.vue' let loginUserinfo = ref(null) if (sessionStorage.getItem("LoginUserInfo")) { @@ -397,6 +453,15 @@ let topScheduleDepts = ref([]) let leafDepartmentList = ref([]); let selectedChildren = ref([]); + //同步科室相关 + let syncDialogVisible = ref(false) + let syncStep = ref(0) + let syncPercent = ref(0) + let syncDone = ref(false) + let syncLoading = ref(false) + let syncLoadingText = ref('') + let syncResult = ref({ added: 0, removed: 0, updated: 0, enabled: 0, disabled: 0 }) + const openLinkDialog = (row) => { currentLinkDepartment.value = row selectedChildren.value = [] @@ -443,6 +508,32 @@ let topScheduleDepts = ref([]) }) } + //打开同步科室弹窗 + const openSyncDialog = async () => { + syncDialogVisible.value = true + syncStep.value = 0 + syncPercent.value = 0 + syncDone.value = false + syncLoading.value = false + syncResult.value = { added: 0, removed: 0, updated: 0, enabled: 0, disabled: 0 } + + syncLoadingText.value = '正在同步科室...' + syncLoading.value = true + const res = await DeptSyncDepartment() + syncLoading.value = false + + if (!res.status) { + ElMessage.error('同步科室失败:' + (res.msg || '未知错误')) + syncDialogVisible.value = false + return + } + + syncResult.value = res.data + syncStep.value = 1 + syncPercent.value = 100 + syncDone.value = true + } + const loadTopScheduleDepts = () => { GetHasScheduleTopDepartments({ department_id: departmentInfo.value.id