박정하 박정하 2023-06-12
230612 박정하 시행기관 관리자 페이지 작업중
@8fd90d18aa0c61d790c2d2ff0f33c70db92daa78
client/resources/css/main.css
--- client/resources/css/main.css
+++ client/resources/css/main.css
@@ -1108,7 +1108,7 @@
   width: 50%;
 }
 
-/* 방문관리 */
+/* 방문/전화 관리 */
 .visit-content {
   height: 45%;
 }
client/resources/css/responsive.css
--- client/resources/css/responsive.css
+++ client/resources/css/responsive.css
@@ -456,7 +456,7 @@
   .search-management button {
     width: -webkit-fill-available;
   }
-  /* 건강관리 */
+  /* 생활 복지 관리 */
   .searchselect {
     width: 48%;
   }
@@ -1018,7 +1018,7 @@
 
   /* 방문 조회 */
 
-  /* 방문 관리 상세 페이지 */
+  /* 방문/전화 관리 상세 페이지 */
   .senior-detail tr:nth-of-type(6) td {
     display: flex;
     justify-content: center;
client/views/layout/Header.jsx
--- client/views/layout/Header.jsx
+++ client/views/layout/Header.jsx
@@ -21,6 +21,8 @@
       setTitle('올잇메디');
     } else if (state.loginUser['authority'] == 'ROLE_GOVERNMENT') {
       setTitle(state.loginUser['government_name']);
+    } else if (state.loginUser['authority'] == 'ROLE_AGENCYADMIN') {
+      setTitle(state.loginUser['agency_name']);
     } else if (state.loginUser['authority'] == 'ROLE_AGENCY') {
       setTitle(state.loginUser['agency_name']);
     } else if (state.loginUser['authority'] == 'ROLE_GUARDIAN') {
client/views/layout/Menu.jsx
--- client/views/layout/Menu.jsx
+++ client/views/layout/Menu.jsx
@@ -58,6 +58,7 @@
         <div className="bottom-section flex-center" style={{width: '100%'}}>
             {state.loginUser['authority'] == 'ROLE_ADMIN'
               || state.loginUser['authority'] == 'ROLE_GOVERNMENT'
+              || state.loginUser['authority'] == 'ROLE_AGENCYADMIN'
               || state.loginUser['authority'] == 'ROLE_AGENCY' ? 
               <div className="info-id" >
                 <span onClick={() => {
client/views/pages/230215_backup_AppRoute.jsx
--- client/views/pages/230215_backup_AppRoute.jsx
+++ client/views/pages/230215_backup_AppRoute.jsx
@@ -113,7 +113,7 @@
     ],
   },
   {
-    title: "건강 관리",
+    title: "생활 복지 관리",
     prefix: "/Medicine",
     icon: (
       <Diversity1Icon sx={{ fontSize: 20, color: "#ffffff", marginRight: 1 }} />
@@ -135,14 +135,14 @@
   },
 
   {
-    title: "방문 관리",
+    title: "방문/전화 관리",
     prefix: "/Visit",
     icon: (
       <DoorFrontIcon sx={{ fontSize: 20, color: "#ffffff", marginRight: 1 }} />
     ),
     childrens: [
       {
-        title: "방문 관리",
+        title: "방문/전화 관리",
         path: "/VisitSelect",
       },
     ],
@@ -304,7 +304,7 @@
   //   ),
   // },
   // {
-  //   title: "건강 관리",
+  //   title: "생활 복지 관리",
   //   prefix: "/Medicine",
   //   icon: (
   //     <Diversity1Icon sx={{ fontSize: 20, color: "#ffffff", marginRight: 1 }} />
@@ -326,14 +326,14 @@
   // },
 
   // {
-  //   title: "방문 관리",
+  //   title: "방문/전화 관리",
   //   prefix: "/Visit",
   //   icon: (
   //     <DoorFrontIcon sx={{ fontSize: 20, color: "#ffffff", marginRight: 1 }} />
   //   ),
   //   childrens: [
   //     {
-  //       title: "방문 관리",
+  //       title: "방문/전화 관리",
   //       path: "/VisitSelect",
   //     },
   //   ],
@@ -455,7 +455,7 @@
     path: "/UserSelectOk",    
   },
   {
-    title: "건강 관리",
+    title: "생활 복지 관리",
     prefix: "/Medicine",
     icon: (
       <Diversity1Icon sx={{ fontSize: 20, color: "#ffffff", marginRight: 1 }} />
@@ -477,14 +477,14 @@
   },
 
   {
-    title: "방문 관리",
+    title: "방문/전화 관리",
     prefix: "/Visit",
     icon: (
       <DoorFrontIcon sx={{ fontSize: 20, color: "#ffffff", marginRight: 1 }} />
     ),
     childrens: [
       {
-        title: "방문 관리",
+        title: "방문/전화 관리",
         path: "/VisitSelect",
       },
     ],
client/views/pages/App.jsx
--- client/views/pages/App.jsx
+++ client/views/pages/App.jsx
@@ -11,7 +11,7 @@
 import { setLoginUser, setSeniorList } from "./AppStore.jsx";
 
 //Application의 Route 정보를 관리하는 Component
-import {AdminApp, GovernmentApp, AgencyApp, GuardianApp} from "./AppRoute.jsx";
+import {AdminApp, GovernmentApp, AgencyApp, AgencyAdminApp, GuardianApp} from "./AppRoute.jsx";
 
 //Test Layout
 import Header from "../layout/Header.jsx";
@@ -235,6 +235,9 @@
         } else if (loginResultData['authority'] == 'ROLE_GOVERNMENT') {
           setMenuItems(GovernmentApp.menuItems);
           setAppRoute(<GovernmentApp.AppRoute/>);
+        } else if (loginResultData['authority'] == 'ROLE_AGENCYADMIN') {
+          setMenuItems(AgencyAdminApp.menuItems);
+          setAppRoute(<AgencyAdminApp.AppRoute/>);
         } else if (loginResultData['authority'] == 'ROLE_AGENCY') {
           setMenuItems(AgencyApp.menuItems);
           setAppRoute(<AgencyApp.AppRoute/>);
client/views/pages/AppRoute.jsx
--- client/views/pages/AppRoute.jsx
+++ client/views/pages/AppRoute.jsx
@@ -24,6 +24,7 @@
 import Main_government from "./main/Main_government.jsx";
 import Main_guardian from "./main/Main_guardian.jsx";
 import Main_agency from "./main/Main_agency.jsx";
+import Main_agencyAdmin from "./main/Main_agencyAdmin.jsx";
 import Main from "./main/Main.jsx";
 import SeniorEdit from "./senior_management/SeniorEdit.jsx";
 import SeniorSelectOne from "./senior_management/SeniorSelectOne.jsx";
@@ -57,7 +58,9 @@
 import QuestionSelect from "./callcenter/QuestionSelect.jsx";
 import Join from "./join/Join.jsx";
 import Healthcare from "./healthcare/Healthcare.jsx"
+import TeamHealthcare from "./healthcare/TeamHealthcare.jsx"
 import Medicalcare from "./healthcare/Medicalcare.jsx"
+import TeamMedicalcare from "./healthcare/TeamMedicalcare.jsx"
 
 import UserEdit from "./user_management/UserEdit.jsx";
 import AgentSelectOne from "./user_management/AgentSelectOne.jsx";
@@ -80,7 +83,7 @@
       />
     ),
   },
-/*  {
+  {
     title: "사용자 관리",
     path: "/UserSelect",
     icon: (
@@ -88,7 +91,7 @@
         sx={{ fontSize: 20, marginRight: 1 }}
       />
     ),
-  }, */
+  },
   {
     title: "장비 관리",
     path: "/EquipmentSelect",
@@ -116,11 +119,11 @@
     ),
     childrens: [
       {
-        title: "건강 관리",
+        title: "생활 복지 관리",
         path: "/Healthcare",
       },
       {
-        title: "진료 관리",
+        title: "건강 관리",
         path:"/Medicalcare",
       },
     ],
@@ -140,7 +143,7 @@
       <Route path="/EquipmentSelect" element={<EquipmentSelect />}></Route>
       <Route path="/EquipmentManagementSelectOne" element={<EquipmentManagementSelectOne />}></Route>
       <Route path="/MedicineCareSelectOne" element={<MedicineCareSelectOne />}></Route>
-      <Route path="/TemperatureManagementSelectOne" element={<TemperatureManagementSelectOne />}></Route>      
+      <Route path="/TemperatureManagementSelectOne" element={<TemperatureManagementSelectOne />}></Route>
       <Route path="/VisitSelectOne" element={<VisitSelectOne />}></Route>
       <Route path="/QandAInsert" element={<QandAInsert />}></Route>
       <Route path="/QandAUpdate" element={<QandAUpdate />}></Route>
@@ -155,7 +158,7 @@
       <Route path="/AgentSelectOne" element={<AgentSelectOne />}></Route>
       <Route path="/OrgSelect" element={<OrgSelect />}></Route>
       <Route path="/MedicineStatistics" element={<MedicineStatistics />}></Route>
-      
+
     </Routes>
   );
 }
@@ -203,11 +206,11 @@
     ),
     childrens: [
       {
-        title: "건강 관리",
+        title: "생활 복지 관리",
         path: "/Healthcare",
       },
       {
-        title: "진료 관리",
+        title: "건강 관리",
         path:"/Medicalcare",
       },
     ],
@@ -253,8 +256,8 @@
       <Route path="/Healthcare" element={<Healthcare />}></Route>
       <Route path="/" element={<Main_government />}></Route>
       <Route path="/AgencySelect" element={<AgencySelect />}></Route>
-      <Route path="/UserSelectOk" element={<UserSelectOk />}></Route>      
-      <Route path="/MedicineCareSelectOne" element={<MedicineCareSelectOne />}></Route>      
+      <Route path="/UserSelectOk" element={<UserSelectOk />}></Route>
+      <Route path="/MedicineCareSelectOne" element={<MedicineCareSelectOne />}></Route>
       <Route path="/TemperatureManagementSelectOne" element={<TemperatureManagementSelectOne />}></Route>
       <Route path="/MedicineStatistics" element={<MedicineStatistics />} ></Route>
       <Route path="/VisitInsert" element={<VisitInsert />}></Route>
@@ -275,6 +278,93 @@
       <Route path="/AgentSelectOne" element={<AgentSelectOne />}></Route>
       <Route path="/OrgSelect" element={<OrgSelect />}></Route>
       <Route path="/GovernmentEquipmentSelect" element={<GovernmentEquipmentSelect />}></Route>
+    </Routes>
+  );
+}
+const AgencyAdminAppMenuItems = [
+  {
+    title: "Home",
+    path: "/",
+    icon: <HouseIcon sx={{ fontSize: 20, color: "#333333", marginRight: 1 }} />,
+  },
+  {
+    title: "대상자 관리",
+    path: "/AgencySeniorSelect",
+    icon: (
+      <PersonIcon sx={{ fontSize: 20, color: "#333333", marginRight: 1 }} />
+    ),
+  },
+  {
+    title: "장비 사용 현황",
+    path: "/GovernmentEquipmentSelect",
+    icon: (
+      <SpeakerPhoneIcon sx={{ fontSize: 20, color: "#333333", marginRight: 1 }} />
+    ),
+  },
+  {
+    title: "생활 복지 관리",
+    path: "/TeamHealthcare",
+    icon: (
+      <Diversity1Icon sx={{ fontSize: 20, color: "#333333", marginRight: 1 }} />
+    ),
+  },
+  {
+    title: "건강 관리",
+    path: "/TeamMedicalcare",
+    icon: (
+      <LocalHospitalIcon sx={{ fontSize: 20, color: "#333333", marginRight: 1 }} />
+    ),
+  },
+  {
+    title: "문의하기",
+    path: "/QandASelect",
+    icon: (
+      <ContactSupportIcon
+        sx={{ fontSize: 20, color: "#333333", marginRight: 1 }}
+      />
+    ),
+  },
+];
+function AgencyAdminAppRoute() {
+  return (
+    <Routes>
+
+      <Route path="/TeamMedicalcare" element={<TeamMedicalcare />}></Route>
+      <Route path="/TeamHealthcare" element={<TeamHealthcare />}></Route>
+      <Route path="/Join" element={<Join />}></Route>
+      <Route path="/QuestionSelect" element={<QuestionSelect />}></Route>
+
+      <Route path="/" element={<Main_agencyAdmin />}></Route>
+      <Route path="/AgencySeniorSelect" element={<AgencySeniorSelect />}></Route>
+      <Route path="/SeniorEdit" element={<SeniorEdit />}></Route>
+      <Route path="/SeniorSelectOne" element={<SeniorSelectOne />}></Route>
+      <Route path="/UserEdit" element={<UserEdit />}></Route>
+      <Route path="/AgentSelectOne" element={<AgentSelectOne />}></Route>
+      <Route
+        path="/MedicineCareSelectOne"
+        element={<MedicineCareSelectOne />}
+      ></Route>
+      <Route
+        path="/TemperatureManagementSelectOne"
+        element={<TemperatureManagementSelectOne />}
+      ></Route>
+      <Route path="/VisitInsert" element={<VisitInsert />}></Route>
+      <Route path="/VisitSelectOne" element={<VisitSelectOne />}></Route>
+      <Route
+        path="/EquipmentRentalInsert"
+        element={<EquipmentRentalInsert />}
+      ></Route>
+      <Route
+        path="/GovernmentEquipmentSelect"
+        element={<GovernmentEquipmentSelect />}
+      ></Route>
+      <Route
+        path="/QandASelect"
+        element={<QandASelect />}
+      ></Route>
+      <Route path="/QandAInsert" element={<QandAInsert />}></Route>
+      <Route path="/QandAUpdate" element={<QandAUpdate />}></Route>
+      <Route path="/QandASelectOne" element={<QandASelectOne />}></Route>
     </Routes>
   );
 }
@@ -299,15 +389,15 @@
     ),
   },
   {
-    title: "건강 관리",
-    path:"/Healthcare",
+    title: "생활 복지 관리",
+    path: "/Healthcare",
     icon: (
       <Diversity1Icon sx={{ fontSize: 20, color: "#333333", marginRight: 1 }} />
     ),
   },
   {
-    title: "진료 관리",
-    path:"/Medicalcare",
+    title: "건강 관리",
+    path: "/Medicalcare",
     icon: (
       <LocalHospitalIcon sx={{ fontSize: 20, color: "#333333", marginRight: 1 }} />
     ),
@@ -330,7 +420,7 @@
       <Route path="/Healthcare" element={<Healthcare />}></Route>
       <Route path="/Join" element={<Join />}></Route>
       <Route path="/QuestionSelect" element={<QuestionSelect />}></Route>
-      
+
       <Route path="/" element={<Main_agency />}></Route>
       <Route path="/AgencySeniorSelect" element={<AgencySeniorSelect />}></Route>
       <Route path="/SeniorEdit" element={<SeniorEdit />}></Route>
@@ -340,7 +430,7 @@
       <Route
         path="/MedicineCareSelectOne"
         element={<MedicineCareSelectOne />}
-      ></Route>      
+      ></Route>
       <Route
         path="/TemperatureManagementSelectOne"
         element={<TemperatureManagementSelectOne />}
@@ -401,8 +491,9 @@
 
 const AdminApp = { 'menuItems': AdminAppMenuItems, 'AppRoute': AdminAppRoute };
 const GovernmentApp = { 'menuItems': GovernmentAppMenuItems, 'AppRoute': GovernmentAppRoute };
+const AgencyAdminApp = { 'menuItems': AgencyAdminAppMenuItems, 'AppRoute': AgencyAdminAppRoute };
 const AgencyApp = { 'menuItems': AgencyAppMenuItems, 'AppRoute': AgencyAppRoute };
 const GuardianApp = { 'menuItems': GuardianAppMenuItems, 'AppRoute': GuardianAppRoute };
 
 export default AdminApp;
-export { AdminApp, GovernmentApp, GuardianApp, AgencyApp };
+export { AdminApp, GovernmentApp, GuardianApp, AgencyApp, AgencyAdminApp };
client/views/pages/authority/AuthorityManagement-ryu.jsx
--- client/views/pages/authority/AuthorityManagement-ryu.jsx
+++ client/views/pages/authority/AuthorityManagement-ryu.jsx
@@ -12,8 +12,8 @@
     {
       menu: {
         대상자관리: ["대상자관리"],
-        건강관리: ["복약관리", "댁내온도관리", "복약통계"],
-        방문관리: ["방문관리"],
+        생활복지관리: ["복약관리", "댁내온도관리", "복약통계"],
+        방문전화관리: ["방문/전화 관리"],
         장비관리: ["장비관리"],
         설정: ["내정보 관리", "사용자 관리", "권한 관리"],
       },
client/views/pages/healthcare/Healthcare.jsx
--- client/views/pages/healthcare/Healthcare.jsx
+++ client/views/pages/healthcare/Healthcare.jsx
@@ -276,7 +276,7 @@
       </div>
     )
   }, {
-    title: `방문관리`,
+    title: `방문/전화 관리`,
     content: (
       <div>
         <div className="flex equip-tab">
client/views/pages/healthcare/Healthcare_back_230413.jsx
--- client/views/pages/healthcare/Healthcare_back_230413.jsx
+++ client/views/pages/healthcare/Healthcare_back_230413.jsx
@@ -180,7 +180,7 @@
         },
         {
             id: 3,
-            title: "방문관리",
+            title: "방문/전화 관리",
             description: (
                 <Table
                     className={"senior-table"}
@@ -200,7 +200,7 @@
     return (
         <main>
             <div className="content-wrap">
-            <DetailTitle contentTitle={"대상자의 복약 / 댁내온도 / 방문 관리를 할 수 있습니다."} />
+            <DetailTitle contentTitle={"대상자의 복약 / 댁내온도 / 방문/전화 관리를 할 수 있습니다."} />
                 <div
                     style={{ height: "calc(100% - 61px)" }}
                 >
 
client/views/pages/healthcare/TeamHealthcare.jsx (added)
+++ client/views/pages/healthcare/TeamHealthcare.jsx
@@ -0,0 +1,401 @@
+import React from "react";
+import { useNavigate, useLocation } from "react-router";
+import { useSelector } from "react-redux";
+
+import SubTitle from "../../component/SubTitle.jsx";
+import DetailTitle from "../../component/DetailTitle.jsx";
+import Pagination from "../../component/Pagination.jsx";
+
+import CommonUtil from "../../../resources/js/CommonUtil.js";
+
+
+export default function UserAuthoriySelect() {
+  const navigate = useNavigate();
+  const location = useLocation();
+
+  //전역 변수 저장 객체
+  const state = useSelector((state) => { return state });
+
+  //검색(엔터)
+  const searchingEnter = (key) => {
+    if (key == 'Enter') {
+      searching();
+    } else {
+      return;
+    }
+  }
+  //검색
+  const searching = () => {
+    if (CommonUtil.isEmpty(state.loginUser) == false
+      && state.loginUser['authority'] == 'ROLE_AGENCY' && isMySenior) {
+      senior.search['agent_id'] = state.loginUser['user_id'];
+    } else {
+      senior.search['agent_id'] = null;
+    }
+
+    setSenior({ ...senior });
+
+    seniorSelectList(1);
+  }
+
+  const [seniorNum, setSeniorNum] = React.useState();
+  const [isMySenior, setIsMySenior] = React.useState(true);
+  React.useEffect(() => {
+    searching();
+  }, [isMySenior])
+  //보호사(간호사)의 돌봄 대상자(시니어)
+  const [senior, setSenior] = React.useState({
+    seniorList: [], seniorListCount: 0, search: {
+      'government_id': CommonUtil.isEmpty(state.loginUser) ? null : state.loginUser['government_id'],
+      'agency_id': CommonUtil.isEmpty(state.loginUser) ? null : state.loginUser['agency_id'],
+      'searchType': null,
+      'searchText': null,
+      'currentPage': 1,
+      'perPage': 10,
+    }
+  });
+  //보호사(간호사)의 돌봄 대상자(시니어) 목록 조회
+  const seniorSelectList = (currentPage) => {
+    senior.search.currentPage = CommonUtil.isEmpty(currentPage) ? 1 : currentPage;
+
+    fetch("/user/seniorSelectList.json", {
+      method: "POST",
+      headers: {
+        'Content-Type': 'application/json; charset=UTF-8'
+      },
+      body: JSON.stringify(senior.search),
+    }).then((response) => response.json()).then((data) => {
+      data.search = senior.search;
+      data.seniorList.map((item, idx) => {
+        setSeniorNum(item);
+        seniorMedicationSelectList(item);
+      })
+      console.log("돌봄 대상자(시니어) 목록 조회 : ", data);
+      setSenior(data);
+    }).catch((error) => {
+      console.log('seniorSelectList() /user/seniorSelectList.json error : ', error);
+    });
+  }
+
+  //특정 대상자의 실제 복약 정보
+  const [seniorMedicationList, setSeniorMedicationList] = React.useState([]);
+  const [showMedicationTimeCode, setShowMedicationTimeCode] = React.useState({});
+  //특정 대상자의 실제 복약 정보 목록 조회
+  const seniorMedicationSelectList = (seniorNum) => {
+    fetch("/user/seniorMedicationSelectList.json", {
+      method: "POST",
+      headers: {
+        'Content-Type': 'application/json; charset=UTF-8'
+      },
+      body: JSON.stringify(seniorNum),
+    }).then((response) => response.json()).then((data) => {
+      console.log("seniorMedicationList data : ", data);
+      setSeniorMedicationList(data, seniorNum);
+      seniorMedicationSelectListByDay(data, seniorNum);
+    }).catch((error) => {
+      console.log('seniorMedicationSelectList() /user/seniorMedicationSelectList.json error : ', error);
+    });
+  };
+
+  //특정 대상자의 일별, 복약시간별 복약 목록
+  const [stackChartData, setStackChartData] = React.useState([]);
+  //특정 대상자의 일별, 복약시간별 복약 목록 조회
+  const seniorMedicationSelectListByDay = (seniorMedicationList, seniorNum) => {
+    fetch("/user/seniorMedicationSelectListByDay.json", {
+      method: "POST",
+      headers: {
+        'Content-Type': 'application/json; charset=UTF-8'
+      },
+      body: JSON.stringify(seniorNum),
+    }).then((response) => response.json()).then((data) => {
+      let showMedicationTimeCode = {};
+      for (let i = 0; i < seniorMedicationList.length; i++) {
+        showMedicationTimeCode[seniorMedicationList[i]] = true;
+      }
+      setShowMedicationTimeCode(showMedicationTimeCode);
+      console.log('showMedicationTimeCode : ', showMedicationTimeCode);
+
+      if (CommonUtil.isEmpty(data) == false) {
+        let _stackChartData = [];
+        for (let i = data.length - 1; i >= data.length - 3; i--) {
+          let sum = 0;      // 실제 복약량
+          let counter = 0;  // 복약해야하는 양
+          let chartData = {
+            xName: data[i]['medication_default_date']
+          };
+          for (let j = 0; j < data[i]['medication_time_code_list'].length; j++) {
+            if (CommonUtil.isEmpty(showMedicationTimeCode[data[i]['medication_time_code_list'][j]]) == false) {
+              chartData[data[i]['medication_time_code_list'][j]] = data[i]['medication_time_code_count_list'][j];
+              counter++;
+              if (i > 0) {
+                sum += data[i]['medication_time_code_count_list'][j];
+              }
+            } else {
+              continue;
+            }
+          }
+          // _stackChartData.push(chartData);          
+          _stackChartData.push({ "sum": sum, "total": counter })
+        }
+        seniorNum.seniorMedicationList = _stackChartData;
+      }
+    }).catch((error) => {
+      console.log('seniorMedicationSelectListByDay() /user/seniorMedicationSelectListByDay.json error : ', error);
+    });
+  };
+
+  React.useEffect(() => {
+    searching();
+  }, []);
+
+
+  //현재 탭 Index
+  const [tabIndex, setTabIndex] = React.useState(0);
+  //탭 초기화
+  const tab = [{
+    title: `복약관리`,
+    content: (
+      <div>
+        <div className="flex equip-tab">
+          <SubTitle explanation={"돌봄 대상자 클릭 시, 상세페이지로 이동합니다."} />
+        </div>
+        <table className={"protector-user"}>
+          <thead>
+            <tr>
+              <th>No</th>
+              <th>소속기관명</th>
+              <th>이름</th>
+              <th>생년월일</th>
+              <th>성별</th>
+              <th>연락처</th>
+              <th colSpan={3}>최근복약률</th>
+            </tr>
+          </thead>
+          <tbody>
+            {senior.seniorList.map((item, idx) => {
+              return (
+                <tr key={idx} onClick={() => {
+                  navigate("/MedicineCareSelectOne", {
+                    state: {
+                      'senior_id': item['user_id'],
+                      'agency_id': item['agency_id'],
+                      'government_id': item['government_id']
+                    }
+                  })
+                }}>
+                  <td data-label="No">{senior.seniorListCount - idx - (senior.search.currentPage - 1) * senior.search.perPage}</td>
+                  <td data-label="소속기관명">{item['agency_name']}</td>
+                  <td data-label="이름">{item['user_name']}</td>
+                  <td data-label="생년월일">{item['user_birth']}</td>
+                  <td data-label="성별">{item['user_gender']}</td>
+                  <td data-label="연락처">{item['user_phonenumber']}</td>
+                  {
+                    item['seniorMedicationList'] && item['seniorMedicationList'].length > 0 ?
+                      item['seniorMedicationList'].map((date, dataIdx) => {
+                        return (
+                          <td data-label="최근복약률">
+                            {date['sum']}/{date['total']}
+                          </td>
+                        )
+                      })
+                      : null}
+                </tr>
+              )
+            })}
+            {CommonUtil.isEmpty(senior.seniorList) ?
+              <tr>
+                <td colSpan={7}>조회된 데이터가 없습니다</td>
+              </tr>
+              : null}
+          </tbody>
+        </table>
+        <Pagination
+          currentPage={senior.search.currentPage}
+          perPage={senior.search.perPage}
+          totalCount={senior.seniorListCount}
+          maxRange={5}
+          click={seniorSelectList}
+        />
+      </div >
+    )
+  }, {
+    title: `댁내온도관리`,
+    content: (
+      <div>
+        <div className="flex equip-tab">
+          <SubTitle explanation={"돌봄 대상자 클릭 시, 상세페이지로 이동합니다."} />
+        </div>
+        <table className={"protector-user"}>
+          <thead>
+            <tr>
+              <th>No</th>
+              <th>소속기관명</th>
+              <th>이름</th>
+              <th>생년월일</th>
+              <th>성별</th>
+              <th>연락처</th>
+              <th>최근최저온도</th>
+              <th>최근최고온도</th>
+            </tr>
+          </thead>
+          <tbody>
+            {senior.seniorList.map((item, idx) => {
+              return (
+                <tr key={idx} onClick={() => {
+                  navigate("/TemperatureManagementSelectOne");
+                }}>
+                  <td data-label="No">{senior.seniorListCount - idx - (senior.search.currentPage - 1) * senior.search.perPage}</td>
+                  <td data-label="소속기관명">{item['agency_name']}</td>
+                  <td data-label="이름">{item['user_name']}</td>
+                  <td data-label="생년월일">{item['user_birth']}</td>
+                  <td data-label="성별">{item['user_gender']}</td>
+                  <td data-label="연락처">{item['user_phonenumber']}</td>
+                  <td data-label="최근최저온도">
+                    18℃
+                  </td>
+                  <td data-label="최근최고온도">
+                    26℃
+                  </td>
+                </tr>
+              )
+            })}
+            {CommonUtil.isEmpty(senior.seniorList) ?
+              <tr>
+                <td colSpan={8}>조회된 데이터가 없습니다</td>
+              </tr>
+              : null}
+          </tbody>
+        </table>
+        <Pagination
+          currentPage={senior.search.currentPage}
+          perPage={senior.search.perPage}
+          totalCount={senior.seniorListCount}
+          maxRange={5}
+          click={seniorSelectList}
+        />
+      </div>
+    )
+  }, {
+    title: `방문/전화 관리`,
+    content: (
+      <div>
+        <div className="flex equip-tab">
+          <SubTitle explanation={"돌봄 대상자 클릭 시, 상세페이지로 이동합니다."} />
+        </div>
+        <table className={"protector-user"}>
+          <thead>
+            <tr>
+              <th>No</th>
+              <th>소속기관명</th>
+              <th>이름</th>
+              <th>생년월일</th>
+              <th>성별</th>
+              <th>연락처</th>
+
+              {/* <th>최근방문일</th>
+							<th>방문목적</th> */}
+            </tr>
+          </thead>
+          <tbody>
+            {senior.seniorList.map((item, idx) => {
+              return (
+                <tr key={idx} onClick={() => {
+                  navigate("/VisitSelectOne", {
+                    state: {
+                      'senior_id': item['senior_id'],
+                    }
+                  })
+                }}>
+                  <td data-label="No">{senior.seniorListCount - idx - (senior.search.currentPage - 1) * senior.search.perPage}</td>
+                  <td data-label="소속기관명">{item['agency_name']}</td>
+                  <td data-label="이름">{item['user_name']}</td>
+                  <td data-label="생년월일">{item['user_birth']}</td>
+                  <td data-label="성별">{item['user_gender']}</td>
+                  <td data-label="연락처">{item['user_phonenumber']}</td>
+
+                  {/* <td>2023-04-11</td>
+							<td>정기방문</td> */}
+                </tr>
+              )
+            })}
+            {CommonUtil.isEmpty(senior.seniorList) ?
+              <tr>
+                <td colSpan={6}>조회된 데이터가 없습니다</td>
+              </tr>
+              : null}
+          </tbody>
+        </table>
+        <Pagination
+          currentPage={senior.search.currentPage}
+          perPage={senior.search.perPage}
+          totalCount={senior.seniorListCount}
+          maxRange={5}
+          click={seniorSelectList}
+        />
+      </div>
+    )
+  }];
+
+  return (
+    <main>
+      <div className="search-management flex-start margin-bottom2">
+        <select style={{ maxWidth: '150px' }}
+          onChange={(e) => { senior.search.searchType = e.target.value; setSenior({ ...senior }); }}>
+          <option value="" selected={CommonUtil.isEmpty(senior.search.searchType)}>전체</option>
+          <option value="user_name" selected={senior.search.searchType == 'user_name'}>이름</option>
+          <option value="user_id" selected={senior.search.searchType == 'user_id'}>아이디</option>
+          <option value="user_phonenumber" selected={senior.search.searchType == 'user_phonenumber'}>연락처</option>
+        </select>
+        <input type="text" className="senior-search" value={senior.search.searchText}
+          onChange={(e) => { senior.search.searchText = e.target.value; setSenior({ ...senior }); }}
+          onKeyUp={(e) => searchingEnter(e.key)} />
+        <button className="btn-small gray-btn" onClick={searching}>검색</button>
+      </div>
+
+      <div className="content-wrap">
+        <DetailTitle contentTitle={"대상자의 문진표 / 심전도 / 혈압 관리를 할 수 있습니다."} />
+
+        <div style={{ height: "calc(100% - 61px)" }}>
+          <div className="right" style={{ height: "100%", }}>
+            <div style={{ height: "100%" }}>
+              <div className="tab-container" style={{ marginTop: "5rem" }}>
+                {/* {CommonUtil.isEmpty(state.loginUser) == false && state.loginUser['authority'] == 'ROLE_AGENCY' ?
+                                <div className="flex-end margin-bottom">
+                                    <div className="flex searchselect" style={{width: 'auto'}}>
+
+                                        <input type="radio" id="my_senior" name="senior" checked={isMySenior}
+                                            onChange={(e) => {e.target.checked ? setIsMySenior(true) : null}}/>
+                                        <label for="my_senior" style={{marginRight: '3rem'}}>나의 대상자 보기</label>
+
+                                        <input type="radio" id="all_senior" name="senior" checked={!isMySenior}
+                                            onChange={(e) => {e.target.checked ? setIsMySenior(false) : null}}/>
+                                        <label for="all_senior" style={{marginRight: '0'}}>전체 대상자 보기</label>
+
+                                    </div>
+                                </div>
+                                :null} */}
+                <ul className="tab-menu flex-end">
+                  {tab.map((item, idx) => {
+                    return (
+                      <li onClick={() => setTabIndex(idx)} className={idx == tabIndex ? 'active' : null}>
+                        {item.title}
+                      </li>
+                    )
+                  })}
+                </ul>
+                <div className="content-wrap userlist">
+
+                  <ul className="tab-content">
+                    <li>
+                      {tab[tabIndex].content}
+                    </li>
+                  </ul>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </main>
+  );
+}
 
client/views/pages/healthcare/TeamMedicalcare.jsx (added)
+++ client/views/pages/healthcare/TeamMedicalcare.jsx
@@ -0,0 +1,1705 @@
+import React from "react";
+import { useNavigate, useLocation } from "react-router";
+import { useSelector } from "react-redux";
+
+
+import SubTitle from "../../component/SubTitle.jsx";
+import Modal from "../../component/Modal.jsx";
+import DetailTitle from "../../component/DetailTitle.jsx";
+import Pagination from "../../component/Pagination.jsx";
+import CommonFile from "../../component/file/CommonFile.jsx";
+
+import CommonUtil from "../../../resources/js/CommonUtil.js";
+
+
+export default function UserAuthoriySelect() {
+    const navigate = useNavigate();
+    const location = useLocation();
+
+    //전역 변수 저장 객체
+    const state = useSelector((state) => {return state});
+    const defaultUserId = CommonUtil.isEmpty(state.loginUser) ? null : state.loginUser['user_id'];
+
+    //검색(엔터)
+	const searchingEnter = (key) => {
+		if (key == 'Enter') {
+			searching();
+		} else {
+			return;
+		}
+	}
+    //검색
+	const searching = () => {
+        if (CommonUtil.isEmpty(state.loginUser) == false
+            && state.loginUser['authority'] == 'ROLE_AGENCY' && isMySenior) {
+            senior.search['agent_id'] = state.loginUser['user_id'];
+        } else {
+            senior.search['agent_id'] = null;
+        }
+		
+		setSenior({...senior});
+
+		seniorSelectList(1);
+	}
+
+    const [isMySenior, setIsMySenior] = React.useState(true);
+    React.useEffect(() => {
+        searching();
+    }, [isMySenior])
+    //보호사(간호사)의 돌봄 대상자(시니어)
+	const [senior, setSenior] = React.useState({seniorList: [], seniorListCount: 0, search: {
+        'government_id': CommonUtil.isEmpty(state.loginUser) ? null : state.loginUser['government_id'],
+        'agency_id': CommonUtil.isEmpty(state.loginUser) ? null : state.loginUser['agency_id'],
+		'searchType': null,
+		'searchText': null,
+		'currentPage': 1,
+		'perPage': 10,
+	}});
+	//보호사(간호사)의 돌봄 대상자(시니어) 목록 조회
+	const seniorSelectList = (currentPage) => {
+		senior.search.currentPage = CommonUtil.isEmpty(currentPage) ? 1 : currentPage;
+
+		fetch("/user/seniorSelectList.json", {
+			method: "POST",
+			headers: {
+				'Content-Type': 'application/json; charset=UTF-8'
+			},
+			body: JSON.stringify(senior.search),
+		}).then((response) => response.json()).then((data) => {
+			data.search = senior.search;
+			console.log("돌봄 대상자(시니어) 목록 조회 : ", data);
+			setSenior(data);
+		}).catch((error) => {
+			console.log('seniorSelectList() /user/seniorSelectList.json error : ', error);
+		});
+	}
+
+
+    //현재 선택한 대상자 정보
+    const [targetSenior, setTargetSenior] = React.useState({'senior_id': null});
+
+    //문진표
+    const [modalOpen, setModalOpen] = React.useState(false);
+    const openModal = (senior) => {
+        targetSenior['senior_id'] = senior['senior_id'];
+        setTargetSenior(senior);
+        questionnaireSelectList();
+
+        setModalOpen(true);
+    };
+    const closeModal = () => {
+        setTargetSenior({'senior_id': null});
+        setModalOpen(false);
+    };
+    //내원기록
+    const [modalOpen2, setModalOpen2] = React.useState(false);
+    const openModal2 = (senior) => {
+        targetSenior['senior_id'] = senior['senior_id'];
+        setTargetSenior(senior);
+        hospitalMedicalRecordSelectList();
+
+        setModalOpen2(true);
+    };
+    const closeModal2 = () => {
+        setTargetSenior({'senior_id': null});
+        setModalOpen2(false);
+    };
+    //심전도
+    const [modalOpen3, setModalOpen3] = React.useState(false);
+    const openModal3 = (senior) => {
+        targetSenior['senior_id'] = senior['senior_id'];
+        setTargetSenior(senior);
+        ecgSelectList();
+
+        setModalOpen3(true);
+    };
+    const closeModal3 = () => {
+        setTargetSenior({'senior_id': null});
+        setModalOpen3(false);
+    };
+    //혈압
+    const [modalOpen4, setModalOpen4] = React.useState(false);
+    const openModal4 = (senior) => {
+        targetSenior['senior_id'] = senior['senior_id'];
+        setTargetSenior(senior);
+        bloodPressureSelectList();
+
+        setModalOpen4(true);
+    };
+    const closeModal4 = () => {
+        setTargetSenior({'senior_id': null});
+        setModalOpen4(false);
+    };
+
+    /****************** 문진표 (시작) ******************/
+    const questionnaireInit = {
+        'senior_id': null,
+        'questionnaire_record_idx': null,
+        'weight_change_amount': 0,
+        'past_history': null,
+        'agent_id': defaultUserId,
+        'medical_record_idx': null,
+
+        'smoke_type': false,
+        'no_smoke_period': null,
+        'smoke_period': null,
+        'daily_smoke_amount': null,
+
+        'drink_type': false,
+        'weekly_drink_amount': null,
+        'onetime_alcoholic_kind': null,
+        'onetime_bottle_amount': null,
+        'onetime_cup_amount': null,
+
+        'exercise_type': false,
+        'weekly_exercise_amount': null,
+        'onetime_exercise_hour': null,
+        'onetime_exercise_minute': null,
+        'onetime_exercise_kind': null,
+
+        'medication_pill': '',
+        'medication_pill_etc': '',
+    };
+    //문진표 정보
+    const [questionnaire, setQuestionnaire] = React.useState({...questionnaireInit});
+    const questionnaireRef = React.useRef({...questionnaireInit});
+
+	//문진표 등록
+	const questionnaireInsert = () => {
+        questionnaire['senior_id'] = targetSenior['senior_id'];
+        questionnaire['agent_id'] = defaultUserId;
+        setQuestionnaire({...questionnaire});
+
+		fetch("/hospital/questionnaireInsert.json", {
+			method: "POST",
+			headers: {
+				'Content-Type': 'application/json; charset=UTF-8'
+			},
+			body: JSON.stringify(questionnaire),
+		}).then((response) => response.json()).then((data) => {
+			console.log("문진표 등록 결과(건수) : ", data);
+			if (data > 0) {
+				alert("저장완료");
+				closeModal();
+			} else {
+				alert("저장에 실패하였습니다. 관리자에게 문의바랍니다.");
+			}
+		}).catch((error) => {
+			console.log('questionnaireInsert() /hospital/questionnaireInsert.json error : ', error);
+		});
+    }
+
+    //문진표 수정
+	const questionnaireUpdate = () => {
+        questionnaire['senior_id'] = targetSenior['senior_id'];
+        questionnaire['agent_id'] = defaultUserId;
+        setQuestionnaire({...questionnaire});
+
+		fetch("/hospital/questionnaireUpdate.json", {
+			method: "POST",
+			headers: {
+				'Content-Type': 'application/json; charset=UTF-8'
+			},
+			body: JSON.stringify(questionnaire),
+		}).then((response) => response.json()).then((data) => {
+			console.log("문진표 수정 결과(건수) : ", data);
+			if (data > 0) {
+				alert("저장완료");
+				closeModal();
+			} else {
+				alert("저장에 실패하였습니다. 관리자에게 문의바랍니다.");
+			}
+		}).catch((error) => {
+			console.log('questionnaireUpdate() /hospital/questionnaireUpdate.json error : ', error);
+		});
+    }
+
+    //문진표 목록 조회
+	const questionnaireSelectList = () => {
+		fetch("/hospital/questionnaireSelectList.json", {
+			method: "POST",
+			headers: {
+				'Content-Type': 'application/json; charset=UTF-8'
+			},
+			body: JSON.stringify(targetSenior),
+		}).then((response) => response.json()).then((data) => {
+			console.log("문진표 목록 조회 결과(건수) : ", data);
+            if (CommonUtil.isEmpty(data.questionnaireList) == false) {
+                let item = data.questionnaireList[0];//최신순으로 가지고오기 때문에, 0 인텍스가 젤 최신
+                if (CommonUtil.isEmpty(item['medication_pill'])) {
+                    item['medication_pill'] = '';
+                } else {
+                    const startCheckWord = '기타「';
+                    const endCheckWord = '」';
+                    if (item['medication_pill'].indexOf(startCheckWord) > -1) {
+                        let startIndex = item['medication_pill'].indexOf(startCheckWord);
+                        let lastIndex = item['medication_pill'].lastIndexOf(endCheckWord);
+                        console.log("000000 item['medication_pill_etc'] : ", item['medication_pill_etc'], "item['medication_pill'] : ", item['medication_pill']);
+                        item['medication_pill_etc'] = item['medication_pill'].substring(startIndex + startCheckWord.length, lastIndex);
+                        let medicationPillFront = item['medication_pill'].substring(0, startIndex + startCheckWord.length);
+                        let medicationPillBack = item['medication_pill'].substring(lastIndex);
+                        item['medication_pill'] = medicationPillFront + medicationPillBack;
+                        console.log("333333 item['medication_pill_etc'] : ", item['medication_pill_etc'], "item['medication_pill'] : ", item['medication_pill']);
+                    } else {
+                        item['medication_pill_etc'] = '';
+                    }
+                }
+                
+                setQuestionnaire(item);
+            }
+		}).catch((error) => {
+			console.log('questionnaireSelectList() /hospital/questionnaireSelectList.json error : ', error);
+		});
+    }
+    /****************** 문진표 (종료) ******************/
+
+
+
+    /****************** 병원 진료 기록 (시작) ******************/
+    const hospitalMedicalRecordInit = {
+        'senior_id': null,
+        'medical_record_idx': null,
+        'medical_date': CommonUtil.getDate(),
+        'medical_reason': '',
+        'medical_content': '',
+        'agent_id': defaultUserId
+    };
+    //병원 진료 기록 정보
+    const [hospitalMedicalRecord, setHospitalMedicalRecord] = React.useState({...hospitalMedicalRecordInit});
+    const hospitalMedicalRecordRef = React.useRef({...hospitalMedicalRecordInit});
+
+    //병원 진료 기록 유효성 검사
+    const hospitalMedicalRecordValidation = () => {
+        const target = hospitalMedicalRecord;
+		const targetRef = hospitalMedicalRecordRef;
+
+		if (CommonUtil.isEmpty(target['medical_date']) == true) {
+			targetRef.current['medical_date'].focus();
+			alert("진료 일자를 선택해 주세요.");
+			return false;
+		}
+		if (CommonUtil.isEmpty(target['medical_reason']) == true) {
+			targetRef.current['medical_reason'].focus();
+			alert("진료 사유를 입력해 주세요.");
+			return false;
+		}
+        if (CommonUtil.isEmpty(target['medical_content']) == true) {
+			targetRef.current['medical_content'].focus();
+			alert("진료 내용을 입력해 주세요.");
+			return false;
+		}
+
+        return true;
+    }
+
+
+	//병원 진료 기록 등록
+	const hospitalMedicalRecordInsert = () => {
+        if (hospitalMedicalRecordValidation() == false) {
+            return;
+        }
+
+        hospitalMedicalRecord['senior_id'] = targetSenior['senior_id'];
+        hospitalMedicalRecord['agent_id'] = defaultUserId;
+        setHospitalMedicalRecord({...hospitalMedicalRecord});
+
+		fetch("/hospital/hospitalMedicalRecordInsert.json", {
+			method: "POST",
+			headers: {
+				'Content-Type': 'application/json; charset=UTF-8'
+			},
+			body: JSON.stringify(hospitalMedicalRecord),
+		}).then((response) => response.json()).then((data) => {
+			console.log("병원 진료 기록 등록 결과(건수) : ", data);
+			if (data > 0) {
+                setHospitalMedicalRecordInit();
+                hospitalMedicalRecordSelectList();
+                //closeModal2();
+				alert("등록완료");
+				
+			} else {
+				alert("등록에 실패하였습니다. 관리자에게 문의바랍니다.");
+			}
+		}).catch((error) => {
+			console.log('hospitalMedicalRecordInsert() /hospital/hospitalMedicalRecordInsert.json error : ', error);
+		});
+    }
+
+    //병원 진료 기록 수정
+	const hospitalMedicalRecordUpdate = () => {
+        if (hospitalMedicalRecordValidation() == false) {
+            return;
+        }
+
+        hospitalMedicalRecord['senior_id'] = targetSenior['senior_id'];
+        hospitalMedicalRecord['agent_id'] = defaultUserId;
+        setHospitalMedicalRecord({...hospitalMedicalRecord});
+
+		fetch("/hospital/hospitalMedicalRecordUpdate.json", {
+			method: "POST",
+			headers: {
+				'Content-Type': 'application/json; charset=UTF-8'
+			},
+			body: JSON.stringify(hospitalMedicalRecord),
+		}).then((response) => response.json()).then((data) => {
+			console.log("병원 진료 기록 수정 결과(건수) : ", data);
+			if (data > 0) {
+                setHospitalMedicalRecordInit();
+                hospitalMedicalRecordSelectList();
+                //closeModal2();
+				alert("수정완료");
+			} else {
+				alert("수정에 실패하였습니다. 관리자에게 문의바랍니다.");
+			}
+		}).catch((error) => {
+			console.log('hospitalMedicalRecordUpdate() /hospital/hospitalMedicalRecordUpdate.json error : ', error);
+		});
+    }
+
+    //병원 진료 기록 삭제
+	const hospitalMedicalRecordDelete = () => {
+        if (confirm('진료 기록을 삭제하시겠습니까?') == false) {
+            return;
+        }
+
+		fetch("/hospital/hospitalMedicalRecordDelete.json", {
+			method: "POST",
+			headers: {
+				'Content-Type': 'application/json; charset=UTF-8'
+			},
+			body: JSON.stringify(hospitalMedicalRecord),
+		}).then((response) => response.json()).then((data) => {
+			console.log("병원 진료 기록 삭제 결과(건수) : ", data);
+			if (data > 0) {
+                setHospitalMedicalRecordInit();
+                hospitalMedicalRecordSelectList();
+                //closeModal2();
+				alert("삭제완료");
+			} else {
+				alert("삭제에 실패하였습니다. 관리자에게 문의바랍니다.");
+			}
+		}).catch((error) => {
+			console.log('hospitalMedicalRecordDelete() /hospital/hospitalMedicalRecordDelete.json error : ', error);
+		});
+    }
+
+    //초기화 취소
+    const setHospitalMedicalRecordInit = () => {
+        setHospitalMedicalRecord({...hospitalMedicalRecordInit});
+    }
+
+    //병원 진료 기록 정보
+    const [hospitalMedicalRecordList, setHospitalMedicalRecordList] = React.useState({hospitalMedicalRecordList: [], hospitalMedicalRecordListCount:0, search: {currentPage: 1, perPage: 5}});
+    //병원 진료 기록 목록 조회
+	const hospitalMedicalRecordSelectList = (currentPage) => {
+        hospitalMedicalRecordList.search.currentPage = CommonUtil.isEmpty(currentPage) ? 1 : currentPage;
+        hospitalMedicalRecordList.search['senior_id'] = targetSenior['senior_id'];
+        setHospitalMedicalRecordList({...hospitalMedicalRecordList});
+
+		fetch("/hospital/hospitalMedicalRecordSelectList.json", {
+			method: "POST",
+			headers: {
+				'Content-Type': 'application/json; charset=UTF-8'
+			},
+			body: JSON.stringify(hospitalMedicalRecordList.search),
+		}).then((response) => response.json()).then((data) => {
+			console.log("병원 진료 기록 목록 조회 결과(건수) : ", data);
+            data.search = hospitalMedicalRecordList.search;
+            setHospitalMedicalRecordList(data);
+		}).catch((error) => {
+			console.log('hospitalMedicalRecordSelectList() /hospital/hospitalMedicalRecordSelectList.json error : ', error);
+		});
+    }
+    /****************** 병원 진료 기록 (종료) ******************/
+
+
+
+    /****************** 심전도 (시작) ******************/
+    const ecgInit = {
+        'senior_id': null,
+        'ecg_record_idx': null,
+        'bradycardia_count': 0,
+        'tachycardia_count': 0,
+        'max_heart_rate': 0.0,
+        'min_heart_rate': 0.0,
+        'abnormal_heart_rate': 0.0,
+        'average_heart_rate': 0.0,
+        'max_rr': 0.0,
+        'min_rr': 0.0,
+        'average_rr': 0.0,
+        'ecg_reading_date': CommonUtil.getDate(),
+        'ecg_finding_type': '',
+        'ecg_finding_content': '',
+        'agent_id': defaultUserId,
+        'medical_record_idx': null,
+        'common_group_file_idx': null,
+        commonFileList: [],//심전도 업로드 파일 목록
+
+        isEdit: false,//직접 수정일 때, true (수정 or 등록 상관없음);
+    };
+    //심전도 정보
+    const [ecg, setEcg] = React.useState({...ecgInit});
+    const ecgRef = React.useRef({...ecgInit});
+
+    //심전도 유효성 검사
+    const ecgValidation = () => {
+        const target = ecg;
+		const targetRef = ecgRef;
+
+		if (CommonUtil.isEmpty(target['ecg_reading_date']) == true) {
+			targetRef.current['ecg_reading_date'].focus();
+			alert("판독 소견 측정 일자를 선택해 주세요.");
+			return false;
+		}
+        if (CommonUtil.isEmpty(target['ecg_finding_type']) == true) {
+			targetRef.current['ecg_finding_type'].focus();
+			alert("판독 소견 측정 종류를 입력해 주세요.");
+			return false;
+		}
+        if (CommonUtil.isEmpty(target['ecg_finding_content']) == true) {
+			targetRef.current['ecg_finding_content'].focus();
+			alert("판독 소견 측정 내용을 입력해 주세요.");
+			return false;
+		}
+        //파일 입력
+		if (target.isEdit == false) {
+            if (CommonUtil.isEmpty(target['commonFileList']) == true) {
+                //targetRef.current['commonFileList'].focus();
+                alert("심전도 측정 파일을 올려주세요.");
+                return false;
+            }
+        } else {//직접 입력
+            if (CommonUtil.isEmpty(target['bradycardia_count']) == true) {
+                targetRef.current['bradycardia_count'].focus();
+                alert("서맥 횟수를 입력해 주세요.");
+                return false;
+            }
+            if (CommonUtil.isEmpty(target['tachycardia_count']) == true) {
+                targetRef.current['tachycardia_count'].focus();
+                alert("빈맥 횟수 입력해 주세요.");
+                return false;
+            }
+            if (CommonUtil.isEmpty(target['max_heart_rate']) == true) {
+                targetRef.current['average_heart_rate'].focus();
+                alert("최대 심박수를 입력해 주세요.");
+                return false;
+            }
+            if (CommonUtil.isEmpty(target['min_heart_rate']) == true) {
+                targetRef.current['average_heart_rate'].focus();
+                alert("최소 심박수를 입력해 주세요.");
+                return false;
+            }
+            if (CommonUtil.isEmpty(target['average_heart_rate']) == true) {
+                targetRef.current['average_heart_rate'].focus();
+                alert("평균 심박수를 입력해 주세요.");
+                return false;
+            }
+            if (CommonUtil.isEmpty(target['abnormal_heart_rate']) == true) {
+                targetRef.current['abnormal_heart_rate'].focus();
+                alert("이상 심박수를 입력해 주세요.");
+                return false;
+            }
+            if (CommonUtil.isEmpty(target['max_rr']) == true) {
+                targetRef.current['max_rr'].focus();
+                alert("최대 R-R를 입력해 주세요.");
+                return false;
+            }
+            if (CommonUtil.isEmpty(target['min_rr']) == true) {
+                targetRef.current['min_rr'].focus();
+                alert("최소 R-R를 입력해 주세요.");
+                return false;
+            }
+            if (CommonUtil.isEmpty(target['average_rr']) == true) {
+                targetRef.current['average_rr'].focus();
+                alert("평균 R-R를 입력해 주세요.");
+                return false;
+            }
+        }
+        
+        return true;
+    }
+
+
+	//심전도 등록
+	const ecgInsert = () => {
+        if (ecgValidation() == false) {
+            return;
+        }
+
+        ecg['senior_id'] = targetSenior['senior_id'];
+        ecg['agent_id'] = defaultUserId;
+        setEcg({...ecg});
+
+		fetch("/hospital/ecgInsert.json", {
+			method: "POST",
+			headers: {
+				'Content-Type': 'application/json; charset=UTF-8'
+			},
+			body: JSON.stringify(ecg),
+		}).then((response) => response.json()).then((data) => {
+			console.log("심전도 등록 결과(건수) : ", data);
+			if (data > 0) {
+                setEcgInit();
+                ecgSelectList();
+                //closeModal3();
+				alert("등록완료");
+				
+			} else {
+				alert("등록에 실패하였습니다. 관리자에게 문의바랍니다.");
+			}
+		}).catch((error) => {
+			console.log('ecgInsert() /hospital/ecgInsert.json error : ', error);
+		});
+    }
+
+    //심전도 수정
+	const ecgUpdate = () => {
+        if (ecgValidation() == false) {
+            return;
+        }
+
+        ecg['senior_id'] = targetSenior['senior_id'];
+        ecg['agent_id'] = defaultUserId;
+        setEcg({...ecg});
+
+		fetch("/hospital/ecgUpdate.json", {
+			method: "POST",
+			headers: {
+				'Content-Type': 'application/json; charset=UTF-8'
+			},
+			body: JSON.stringify(ecg),
+		}).then((response) => response.json()).then((data) => {
+			console.log("심전도 수정 결과(건수) : ", data);
+			if (data > 0) {
+                setEcgInit();
+                ecg.commonFileList = [];
+                setEcg({...ecg});
+                ecgSelectList();
+                //closeModal3();
+				alert("수정완료");
+			} else {
+				alert("수정에 실패하였습니다. 관리자에게 문의바랍니다.");
+			}
+		}).catch((error) => {
+			console.log('ecgUpdate() /hospital/ecgUpdate.json error : ', error);
+		});
+    }
+
+    //심전도 삭제
+	const ecgDelete = () => {
+        if (confirm('심전도 판독 소견을 삭제하시겠습니까?') == false) {
+            return;
+        }
+
+		fetch("/hospital/ecgDelete.json", {
+			method: "POST",
+			headers: {
+				'Content-Type': 'application/json; charset=UTF-8'
+			},
+			body: JSON.stringify(ecg),
+		}).then((response) => response.json()).then((data) => {
+			console.log("심전도 삭제 결과(건수) : ", data);
+			if (data > 0) {
+                setEcgInit();
+                ecg.commonFileList = [];
+                setEcg({...ecg});
+                ecgSelectList();
+                //closeModal3();
+				alert("삭제완료");
+			} else {
+				alert("삭제에 실패하였습니다. 관리자에게 문의바랍니다.");
+			}
+		}).catch((error) => {
+			console.log('ecgDelete() /hospital/ecgDelete.json error : ', error);
+		});
+    }
+
+    //초기화 취소
+    const setEcgInit = () => {
+        setEcg({...ecgInit});
+    }
+
+    //심전도 정보
+    const [ecgList, setEcgList] = React.useState({ecgList: [], ecgListCount:0, search: {currentPage: 1, perPage: 5}});
+    //심전도 목록 조회
+	const ecgSelectList = (currentPage) => {
+        ecgList.search.currentPage = CommonUtil.isEmpty(currentPage) ? 1 : currentPage;
+        ecgList.search['senior_id'] = targetSenior['senior_id'];
+        setEcgList({...ecgList});
+
+		fetch("/hospital/ecgSelectList.json", {
+			method: "POST",
+			headers: {
+				'Content-Type': 'application/json; charset=UTF-8'
+			},
+			body: JSON.stringify(ecgList.search),
+		}).then((response) => response.json()).then((data) => {
+			console.log("심전도 목록 조회 결과(건수) : ", data);
+            data.search = ecgList.search;
+            setEcgList(data);
+		}).catch((error) => {
+			console.log('ecgSelectList() /hospital/ecgSelectList.json error : ', error);
+		});
+    }
+    /****************** 심전도 기록 (종료) ******************/
+
+
+
+    /****************** 혈압 (시작) ******************/
+    const bloodPressureInit = {
+        'senior_id': null,
+        'blood_pressure_record_idx': null,
+        'max_blood_pressure': null,
+        'min_blood_pressure': null,
+        'pulse_rate': null,
+        'medical_record_idx': null,
+        'blood_pressure_record_date': CommonUtil.getDate(),
+        'agent_id': defaultUserId
+    };
+    //혈압 정보
+    const [bloodPressure, setBloodPressure] = React.useState({...bloodPressureInit});
+    const bloodPressureRef = React.useRef({...bloodPressureInit});
+
+    //혈압 유효성 검사
+    const bloodPressureValidation = () => {
+        const target = bloodPressure;
+		const targetRef = bloodPressureRef;
+
+		if (CommonUtil.isEmpty(target['blood_pressure_record_date']) == true) {
+			targetRef.current['blood_pressure_record_date'].focus();
+			alert("진료 일자를 선택해 주세요.");
+			return false;
+		}
+		if (CommonUtil.isEmpty(target['max_blood_pressure']) == true) {
+			targetRef.current['max_blood_pressure'].focus();
+			alert("최고 혈압을 입력해 주세요.");
+			return false;
+		}
+        if (CommonUtil.isEmpty(target['min_blood_pressure']) == true) {
+			targetRef.current['min_blood_pressure'].focus();
+			alert("최저 혈압을 입력해 주세요.");
+			return false;
+		}
+        if (CommonUtil.isEmpty(target['pulse_rate']) == true) {
+			targetRef.current['pulse_rate'].focus();
+			alert("맥박수를 입력해 주세요.");
+			return false;
+		}
+
+        return true;
+    }
+
+
+	//혈압 등록
+	const bloodPressureInsert = () => {
+        if (bloodPressureValidation() == false) {
+            return;
+        }
+
+        bloodPressure['senior_id'] = targetSenior['senior_id'];
+        bloodPressure['agent_id'] = defaultUserId;
+        setBloodPressure({...bloodPressure});
+
+		fetch("/hospital/bloodPressureInsert.json", {
+			method: "POST",
+			headers: {
+				'Content-Type': 'application/json; charset=UTF-8'
+			},
+			body: JSON.stringify(bloodPressure),
+		}).then((response) => response.json()).then((data) => {
+			console.log("혈압 등록 결과(건수) : ", data);
+			if (data > 0) {
+                setBloodPressureInit();
+                bloodPressureSelectList();
+                //closeModal2();
+				alert("등록완료");
+				
+			} else {
+				alert("등록에 실패하였습니다. 관리자에게 문의바랍니다.");
+			}
+		}).catch((error) => {
+			console.log('bloodPressureInsert() /hospital/bloodPressureInsert.json error : ', error);
+		});
+    }
+
+    //혈압 수정
+	const bloodPressureUpdate = () => {
+        if (bloodPressureValidation() == false) {
+            return;
+        }
+
+        bloodPressure['senior_id'] = targetSenior['senior_id'];
+        bloodPressure['agent_id'] = defaultUserId;
+        setBloodPressure({...bloodPressure});
+
+		fetch("/hospital/bloodPressureUpdate.json", {
+			method: "POST",
+			headers: {
+				'Content-Type': 'application/json; charset=UTF-8'
+			},
+			body: JSON.stringify(bloodPressure),
+		}).then((response) => response.json()).then((data) => {
+			console.log("혈압 수정 결과(건수) : ", data);
+			if (data > 0) {
+                setBloodPressureInit();
+                bloodPressureSelectList();
+                //closeModal2();
+				alert("수정완료");
+			} else {
+				alert("수정에 실패하였습니다. 관리자에게 문의바랍니다.");
+			}
+		}).catch((error) => {
+			console.log('bloodPressureUpdate() /hospital/bloodPressureUpdate.json error : ', error);
+		});
+    }
+
+    //혈압 삭제
+	const bloodPressureDelete = () => {
+        if (confirm('혈압 측정 정보를 삭제하시겠습니까?') == false) {
+            return;
+        }
+
+		fetch("/hospital/bloodPressureDelete.json", {
+			method: "POST",
+			headers: {
+				'Content-Type': 'application/json; charset=UTF-8'
+			},
+			body: JSON.stringify(bloodPressure),
+		}).then((response) => response.json()).then((data) => {
+			console.log("혈압 삭제 결과(건수) : ", data);
+			if (data > 0) {
+                setBloodPressureInit();
+                bloodPressureSelectList();
+                //closeModal2();
+				alert("삭제완료");
+			} else {
+				alert("삭제에 실패하였습니다. 관리자에게 문의바랍니다.");
+			}
+		}).catch((error) => {
+			console.log('bloodPressureDelete() /hospital/bloodPressureDelete.json error : ', error);
+		});
+    }
+
+    //초기화 취소
+    const setBloodPressureInit = () => {
+        setBloodPressure({...bloodPressureInit});
+    }
+
+    //혈압 정보
+    const [bloodPressureList, setBloodPressureList] = React.useState({bloodPressureList: [], bloodPressureListCount:0, search: {currentPage: 1, perPage: 5}});
+    //혈압 목록 조회
+	const bloodPressureSelectList = (currentPage) => {
+        bloodPressureList.search.currentPage = CommonUtil.isEmpty(currentPage) ? 1 : currentPage;
+        bloodPressureList.search['senior_id'] = targetSenior['senior_id'];
+        setBloodPressureList({...bloodPressureList});
+
+		fetch("/hospital/bloodPressureSelectList.json", {
+			method: "POST",
+			headers: {
+				'Content-Type': 'application/json; charset=UTF-8'
+			},
+			body: JSON.stringify(bloodPressureList.search),
+		}).then((response) => response.json()).then((data) => {
+			console.log("혈압 목록 조회 결과(건수) : ", data);
+            data.search = bloodPressureList.search;
+            setBloodPressureList(data);
+		}).catch((error) => {
+			console.log('bloodPressureSelectList() /hospital/bloodPressureSelectList.json error : ', error);
+		});
+    }
+    /****************** 혈압 (종료) ******************/
+
+    React.useEffect(() => {
+        searching();
+    }, []);
+
+
+    //현재 탭 Index
+	const [tabIndex, setTabIndex] = React.useState(0);
+	//탭 초기화
+	const tab = [{
+		title: `문진표관리`,
+		content: (
+			<div>
+				<div className="flex equip-tab">
+					<SubTitle explanation={"돌봄 대상자의 병원 내원 기록 및 문진표를 관리할 수 있습니다."} />
+				</div>
+				<table className={"protector-user"}>
+					<thead>
+						<tr>
+							<th>No</th>
+                            <th>소속기관명</th>
+							<th>이름</th>
+							<th>생년월일</th>
+							<th>성별</th>
+							<th>연락처</th>
+							<th>문진표관리</th>
+                            <th>내원기록관리</th>
+						</tr>
+					</thead>
+					<tbody>
+						{senior.seniorList.map((item, idx) => { return (
+						<tr key={idx}>
+							<td data-label="No">{senior.seniorListCount - idx - (senior.search.currentPage - 1) * senior.search.perPage}</td>
+							<td data-label="소속기관명">{item['agency_name']}</td>
+							<td data-label="이름">{item['user_name']}</td>
+							<td data-label="생년월일">{item['user_birth']}</td>
+							<td data-label="성별">{item['user_gender']}</td>
+							<td data-label="연락처">{item['user_phonenumber']}</td>
+							<td data-label="문진표관리">
+                                <button className="btn-small gray-btn" onClick={() => openModal(item)}>작성하기</button>
+							</td>
+							<td data-label="내원기록관리">
+								<button className="btn-small gray-btn" onClick={() => openModal2(item)}>작성하기</button>
+							</td>
+						</tr>
+						)})}
+						{CommonUtil.isEmpty(senior.seniorList) ?
+						<tr>
+							<td colSpan={8}>조회된 데이터가 없습니다</td>
+						</tr>  
+						: null}
+					</tbody>
+				</table>
+				<Pagination
+					currentPage={senior.search.currentPage}
+					perPage={senior.search.perPage}
+					totalCount={senior.seniorListCount}
+					maxRange={5}
+					click={seniorSelectList}
+				/>
+			</div>
+		)
+	}, {
+		title: `심전도관리`,
+		content: (
+			<div>
+				<div className="flex equip-tab">
+					<SubTitle explanation={"돌봄 대상자의 심전도 정보를 관리할 수 있습니다."} />
+				</div>
+				<table className={"protector-user"}>
+					<thead>
+						<tr>
+							<th>No</th>
+                            <th>소속기관명</th>
+							<th>이름</th>
+							<th>생년월일</th>
+							<th>성별</th>
+							<th>연락처</th>
+							<th>심전도관리</th>
+						</tr>
+					</thead>
+					<tbody>
+						{senior.seniorList.map((item, idx) => { return (
+						<tr key={idx}>
+							<td data-label="No">{senior.seniorListCount - idx - (senior.search.currentPage - 1) * senior.search.perPage}</td>
+							<td data-label="소속기관명">{item['agency_name']}</td>
+							<td data-label="이름">{item['user_name']}</td>
+							<td data-label="생년월일">{item['user_birth']}</td>
+							<td data-label="성별">{item['user_gender']}</td>
+							<td data-label="연락처">{item['user_phonenumber']}</td>
+							<td data-label="심전도관리">
+                                <button className="btn-small gray-btn" onClick={() => openModal3(item)}>심전도관리</button>
+							</td>
+						</tr>
+						)})}
+						{CommonUtil.isEmpty(senior.seniorList) ?
+						<tr>
+							<td colSpan={7}>조회된 데이터가 없습니다</td>
+						</tr>  
+						: null}
+					</tbody>
+				</table>
+				<Pagination
+					currentPage={senior.search.currentPage}
+					perPage={senior.search.perPage}
+					totalCount={senior.seniorListCount}
+					maxRange={5}
+					click={seniorSelectList}
+				/>
+			</div>
+		)
+	}, {
+		title: `혈압관리`,
+		content: (
+			<div>
+				<div className="flex equip-tab">
+					<SubTitle explanation={"돌봄 대상자의 혈압 정보를 관리할 수 있습니다."} />
+				</div>
+                <table className={"protector-user"}>
+					<thead>
+						<tr>
+							<th>No</th>
+                            <th>소속기관명</th>
+							<th>이름</th>
+							<th>생년월일</th>
+							<th>성별</th>
+							<th>연락처</th>
+							<th>혈압관리</th>
+						</tr>
+					</thead>
+					<tbody>
+						{senior.seniorList.map((item, idx) => { return (
+						<tr key={idx}>
+							<td data-label="No">{senior.seniorListCount - idx - (senior.search.currentPage - 1) * senior.search.perPage}</td>
+							<td data-label="소속기관명">{item['agency_name']}</td>
+							<td data-label="이름">{item['user_name']}</td>
+							<td data-label="생년월일">{item['user_birth']}</td>
+							<td data-label="성별">{item['user_gender']}</td>
+							<td data-label="연락처">{item['user_phonenumber']}</td>
+							<td data-label="혈압관리">
+                                <button className="btn-small gray-btn" onClick={() => openModal4(item)}>혈압관리</button>
+							</td>
+						</tr>
+						)})}
+						{CommonUtil.isEmpty(senior.seniorList) ?
+						<tr>
+							<td colSpan={7}>조회된 데이터가 없습니다</td>
+						</tr>  
+						: null}
+					</tbody>
+				</table>
+				<Pagination
+					currentPage={senior.search.currentPage}
+					perPage={senior.search.perPage}
+					totalCount={senior.seniorListCount}
+					maxRange={5}
+					click={seniorSelectList}
+				/>
+			</div>
+		)
+	}];
+
+    return (
+        <main>
+
+            {/* <Modal_Questionnaire open={modalOpen} close={closeModal} /> */}
+            {/* <Modal_MedicalHistory open={modalOpen2} close={closeModal2} /> */}
+            {/* <Modal_ECG open={modalOpen3} close={closeModal3} /> */}
+            {/* <Modal_Blood open={modalOpen4} close={closeModal4} /> */}
+
+            <div className="search-management flex-start margin-bottom2">
+                <select style={{maxWidth: '150px'}}
+                    onChange={(e) => {senior.search.searchType = e.target.value; setSenior({...senior});}}>
+                    <option value="" selected={CommonUtil.isEmpty(senior.search.searchType)}>전체</option>
+                    <option value="user_name" selected={senior.search.searchType == 'user_name'}>이름</option>
+                    <option value="user_id" selected={senior.search.searchType == 'user_id'}>아이디</option>
+                    <option value="user_phonenumber" selected={senior.search.searchType == 'user_phonenumber'}>연락처</option>
+                </select>
+                <input type="text" className="senior-search" value={senior.search.searchText}
+                    onChange={(e) => {senior.search.searchText = e.target.value; setSenior({...senior});}}
+                    onKeyUp={(e) => searchingEnter(e.key)}/>
+                <button className="btn-small gray-btn" onClick={searching}>검색</button>
+            </div>
+
+            <div className="content-wrap">
+                <DetailTitle contentTitle={"대상자의 문진표 / 심전도 / 혈압 관리를 할 수 있습니다."} />
+
+                <div style={{ height: "calc(100% - 61px)" }}>
+                    <div className="right" style={{ height: "100%", }}>
+                        <div style={{ height: "100%" }}>
+                            <div className="tab-container" style={{ marginTop: "5rem"}}>
+                                {/* {CommonUtil.isEmpty(state.loginUser) == false && state.loginUser['authority'] == 'ROLE_AGENCY' ?
+                                <div className="flex-end margin-bottom">
+                                    <div className="flex searchselect" style={{width: 'auto'}}>
+
+                                        <input type="radio" id="my_senior" name="senior" checked={isMySenior}
+                                            onChange={(e) => {e.target.checked ? setIsMySenior(true) : null}}/>
+                                        <label for="my_senior" style={{marginRight: '3rem'}}>나의 대상자 보기</label>
+
+                                        <input type="radio" id="all_senior" name="senior" checked={!isMySenior}
+                                            onChange={(e) => {e.target.checked ? setIsMySenior(false) : null}}/>
+                                        <label for="all_senior" style={{marginRight: '0'}}>전체 대상자 보기</label>
+
+                                    </div>
+                                </div>
+                                :null} */}
+                                <ul className="tab-menu flex-end">
+                                    {tab.map((item, idx) => { return (
+                                    <li onClick={() => setTabIndex(idx)} className={idx == tabIndex ? 'active' : null}>
+                                        {item.title}
+                                    </li>
+                                    )})}
+                                </ul>
+                                <div className="content-wrap userlist">                                    
+                                    
+                                    <ul className="tab-content">
+                                        <li>
+                                            {tab[tabIndex].content}
+                                        </li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+
+            <Modal open={modalOpen} close={closeModal} header="문진표 작성">
+                <div className="board-wrap">        
+                    <div>
+                        <table className="margin-bottom2  questionnaire-table">
+                            <tr>
+                                <th>흡연을 하십니까?</th>
+                                <td className="flex-start">
+                                    <input type="radio" name="smoke" id="smoke-true"
+                                        checked={questionnaire['smoke_type'] == true}
+                                        onChange={(e) => {
+                                            if (e.target.checked) {
+                                                questionnaire['smoke_type'] = true;
+                                                setQuestionnaire({...questionnaire});
+                                            }}
+                                        }
+                                    />
+                                    <label for="smoke-true">예</label>
+                                    <input type="radio" name="smoke" id="smoke-false"
+                                        checked={questionnaire['smoke_type'] == false}
+                                        onChange={(e) => {
+                                            if (e.target.checked) {
+                                                questionnaire['smoke_type'] = false;
+                                                setQuestionnaire({...questionnaire});
+                                            }}
+                                        }
+                                    />
+                                    <label for="smoke-false">아니요</label>
+                                </td>              
+                            </tr>
+                            <tr>
+                                <th>음주를 하십니까?</th>
+                                <td className="flex-start">
+                                    <input type="radio" name="drink" id="drink-true"
+                                        checked={questionnaire['drink_type'] == true}
+                                        onChange={(e) => {
+                                            if (e.target.checked) {
+                                                questionnaire['drink_type'] = true;
+                                                setQuestionnaire({...questionnaire});
+                                            }}
+                                        }
+                                    />
+                                    <label for="drink-true">예</label>
+                                    <input type="radio" name="drink" id="drink-false"
+                                        checked={questionnaire['drink_type'] == false}
+                                        onChange={(e) => {
+                                            if (e.target.checked) {
+                                                questionnaire['drink_type'] = false;
+                                                setQuestionnaire({...questionnaire});
+                                            }}
+                                        }
+                                    />
+                                    <label for="drink-false">아니요</label>
+                                </td>              
+                            </tr>
+                            <tr>
+                                <th>일주일에 운동을 몇회 하십니까?</th>
+                                <td className="flex-start">
+                                    <input type="radio" name="exercise" id="exercise-false"
+                                        checked={questionnaire['exercise_type'] == false}
+                                        onChange={(e) => {
+                                            if (e.target.checked) {
+                                                questionnaire['exercise_type'] = false;
+                                                setQuestionnaire({...questionnaire});
+                                            }}
+                                        }
+                                    />
+                                    <label for="exercise-false">안함</label>
+
+                                    <input type="radio" name="exercise" id="exercise-1"
+                                        checked={questionnaire['exercise_type'] == true && questionnaire['weekly_exercise_amount'] == 1}
+                                        onChange={(e) => {
+                                            if (e.target.checked) {
+                                                questionnaire['exercise_type'] = true;
+                                                questionnaire['weekly_exercise_amount'] = 1;
+                                                setQuestionnaire({...questionnaire});
+                                            }}
+                                        }
+                                    />
+                                    <label for="exercise-1">1회</label>
+
+                                    <input type="radio" name="exercise" id="exercise-2"
+                                        checked={questionnaire['exercise_type'] == true && questionnaire['weekly_exercise_amount'] == 2}
+                                        onChange={(e) => {
+                                            if (e.target.checked) {
+                                                questionnaire['exercise_type'] = true;
+                                                questionnaire['weekly_exercise_amount'] = 2;
+                                                setQuestionnaire({...questionnaire});
+                                            }}
+                                        }
+                                    />
+                                    <label for="exercise-2">2회</label>
+
+                                    <input type="radio" name="exercise" id="exercise-3"
+                                        checked={questionnaire['exercise_type'] == true && questionnaire['weekly_exercise_amount'] == 3}
+                                        onChange={(e) => {
+                                            if (e.target.checked) {
+                                                questionnaire['exercise_type'] = true;
+                                                questionnaire['weekly_exercise_amount'] = 3;
+                                                setQuestionnaire({...questionnaire});
+                                            }}
+                                        }
+                                    />
+                                    <label for="exercise-3">3회</label>
+
+                                    <input type="radio" name="exercise" id="exercise-4"
+                                        checked={questionnaire['exercise_type'] == true && questionnaire['weekly_exercise_amount'] == 4}
+                                        onChange={(e) => {
+                                            if (e.target.checked) {
+                                                questionnaire['exercise_type'] = true;
+                                                questionnaire['weekly_exercise_amount'] = 4;
+                                                setQuestionnaire({...questionnaire});
+                                            }}
+                                        }
+                                    />
+                                    <label for="exercise-4">4회</label>
+
+                                    <input type="radio" name="exercise" id="exercise-5"
+                                        checked={questionnaire['exercise_type'] == true && questionnaire['weekly_exercise_amount'] == 5}
+                                        onChange={(e) => {
+                                            if (e.target.checked) {
+                                                questionnaire['exercise_type'] = true;
+                                                questionnaire['weekly_exercise_amount'] = 5;
+                                                setQuestionnaire({...questionnaire});
+                                            }}
+                                        }
+                                    />
+                                    <label for="exercise-5">5회</label>
+
+                                    <input type="radio" name="exercise" id="exercise-6"
+                                        checked={questionnaire['exercise_type'] == true && questionnaire['weekly_exercise_amount'] == 6}
+                                        onChange={(e) => {
+                                            if (e.target.checked) {
+                                                questionnaire['exercise_type'] = true;
+                                                questionnaire['weekly_exercise_amount'] = 6;
+                                                setQuestionnaire({...questionnaire});
+                                            }}
+                                        }
+                                    />
+                                    <label for="exercise-6">6회</label>
+
+                                    <input type="radio" name="exercise" id="exercise-7"
+                                        checked={questionnaire['exercise_type'] == true && questionnaire['weekly_exercise_amount'] == 7}
+                                        onChange={(e) => {
+                                            if (e.target.checked) {
+                                                questionnaire['exercise_type'] = true;
+                                                questionnaire['weekly_exercise_amount'] = 7;
+                                                setQuestionnaire({...questionnaire});
+                                            }}
+                                        }
+                                    />
+                                    <label for="exercise-7">매일</label>
+                                </td>
+                            </tr>
+                            <tr>
+                                <th>최근 3개월 동안 갑작스런 체중 변화가 있었습니까?</th>
+                                <td className="flex-start">
+                                    <input type="radio" name="weight" id="weight-up"
+                                        checked={questionnaire['weight_change_amount'] == 1}
+                                        onChange={(e) => {
+                                            if (e.target.checked) {
+                                                questionnaire['weight_change_amount'] = 1;
+                                                setQuestionnaire({...questionnaire});
+                                            }}
+                                        }
+                                    />
+                                    <label for="weight-up">예 - 증가</label>
+
+                                    <input type="radio" name="weight" id="weight-down"
+                                        checked={questionnaire['weight_change_amount'] == -1}
+                                        onChange={(e) => {
+                                            if (e.target.checked) {
+                                                questionnaire['weight_change_amount'] = -1;
+                                                setQuestionnaire({...questionnaire});
+                                            }}
+                                        }
+                                    />
+                                    <label for="weight-down">예 - 감소</label>
+
+                                    <input type="radio" name="weight" id="weight-false"
+                                        checked={questionnaire['weight_change_amount'] == 0}
+                                        onChange={(e) => {
+                                            if (e.target.checked) {
+                                                questionnaire['weight_change_amount'] = 0;
+                                                setQuestionnaire({...questionnaire});
+                                            }}
+                                        }
+                                    />
+                                    <label for="weight-false">아니요</label>
+                                </td>   
+                            </tr>
+                            <tr>
+                                <th>현재 복용중인 약이 있으면 체크를 해주세요.</th>
+                                <td className="flex-start">
+
+                                    <input type="checkbox" name="pills" id="pills-1"
+                                        checked={questionnaire['medication_pill'].indexOf('아스피린(항혈소판제)') > -1}
+                                        onChange={(e) => {
+                                            if (e.target.checked) {
+                                                questionnaire['medication_pill'] += '아스피린(항혈소판제),';
+                                                setQuestionnaire({...questionnaire});
+                                            } else {
+                                                questionnaire['medication_pill'] = questionnaire['medication_pill'].replace('아스피린(항혈소판제),', '');
+                                                setQuestionnaire({...questionnaire});
+                                            }}
+                                        }
+                                    />
+                                    <label for="pills-1">아스피린(항혈소판제)</label>
+
+                                    <input type="checkbox" name="pills" id="pills-2"
+                                        checked={questionnaire['medication_pill'].indexOf('당뇨약') > -1}
+                                        onChange={(e) => {
+                                            if (e.target.checked) {
+                                                questionnaire['medication_pill'] += '당뇨약,';
+                                                setQuestionnaire({...questionnaire});
+                                            } else {
+                                                questionnaire['medication_pill'] = questionnaire['medication_pill'].replace('당뇨약,', '');
+                                                setQuestionnaire({...questionnaire});
+                                            }}
+                                        }
+                                    />
+                                    <label for="pills-2">당뇨약</label>
+
+                                    <input type="checkbox" name="pills" id="pills-3"
+                                        checked={questionnaire['medication_pill'].indexOf('고혈압약') > -1}
+                                        onChange={(e) => {
+                                            if (e.target.checked) {
+                                                questionnaire['medication_pill'] += '고혈압약,';
+                                                setQuestionnaire({...questionnaire});
+                                            } else {
+                                                questionnaire['medication_pill'] = questionnaire['medication_pill'].replace('고혈압약,', '');
+                                                setQuestionnaire({...questionnaire});
+                                            }}
+                                        }
+                                    />
+                                    <label for="pills-3">고혈압약</label>
+
+                                    <input type="checkbox" name="pills" id="pills-etc"
+                                        checked={questionnaire['medication_pill'].indexOf('기타「」,') > -1}
+                                        onChange={(e) => {
+                                            if (e.target.checked) {
+                                                questionnaire['medication_pill'] += '기타「」,';
+                                                setQuestionnaire({...questionnaire});
+                                            } else {
+                                                questionnaire['medication_pill'] = questionnaire['medication_pill'].replace('기타「」,', '');
+                                                questionnaire['medication_pill_etc'] = '';
+                                                setQuestionnaire({...questionnaire});
+                                            }}
+                                        }
+                                    />
+                                    <label for="pills-etc">기타</label>
+                                    <input type="text" style={{width: 'max-content', marginLeft: '1rem'}}
+                                        disabled={questionnaire['medication_pill'].indexOf('기타「」,') == -1}
+                                        value={questionnaire['medication_pill_etc']}
+                                        onChange={(e) => {
+                                            questionnaire['medication_pill_etc'] = e.target.value;
+                                            setQuestionnaire({...questionnaire});
+                                        }}
+                                    />
+
+                                </td>              
+                            </tr>
+                        </table>
+                    </div>
+                    <div className="flex-center">
+                        {CommonUtil.isEmpty(questionnaire['questionnaire_record_idx'])
+                            ? <button className="btn-small red-btn" onClick={questionnaireInsert}>저장</button>
+                            : <button className="btn-small red-btn" onClick={questionnaireUpdate}>저장</button>
+                        }
+                    </div>
+                </div>
+			</Modal>
+
+
+            <Modal open={modalOpen2} close={closeModal2} header="내원기록 관리 및 조회">
+                <div className="board-wrap">
+                    <table className="margin-bottom2 senior-insert ">
+                        <tr>
+                            <th>진료 일자</th>
+                            <td>
+                                <input type="date"
+                                    value={hospitalMedicalRecord['medical_date']}
+                                    onChange={(e) => {
+                                        hospitalMedicalRecord['medical_date'] = e.target.value;
+                                        setHospitalMedicalRecord({...hospitalMedicalRecord});
+                                    }}
+                                    ref={el => hospitalMedicalRecordRef.current['medical_date'] = el}
+                                />
+                            </td>              
+                        </tr>
+                        <tr>
+                            <th>진료 사유</th>
+                            <td className="flex-start ">
+                                <input type="text"
+                                    value={hospitalMedicalRecord['medical_reason']}
+                                    onChange={(e) => {
+                                        hospitalMedicalRecord['medical_reason'] = e.target.value;
+                                        setHospitalMedicalRecord({...hospitalMedicalRecord});
+                                    }}
+                                    ref={el => hospitalMedicalRecordRef.current['medical_reason'] = el}
+                                />
+                            </td>              
+                        </tr>
+                        <tr>
+                            <th>진료 내용</th>
+                            <td colSpan={3}>
+                                <textarea className="medicine" cols="30" rows="2"
+                                    value={hospitalMedicalRecord['medical_content']}
+                                    onChange={(e) => {
+                                        hospitalMedicalRecord['medical_content'] = e.target.value;
+                                        setHospitalMedicalRecord({...hospitalMedicalRecord});
+                                    }}
+                                    ref={el => hospitalMedicalRecordRef.current['medical_content'] = el}
+                                ></textarea>
+                            </td>
+                        </tr>         
+                    </table>
+                    <div className="btn-wrap flex-center margin-bottom5">
+                        {CommonUtil.isEmpty(hospitalMedicalRecord['medical_record_idx'])
+                            ? <button className="btn-small red-btn" onClick={hospitalMedicalRecordInsert}>등록</button>
+                            
+                            : <>
+                                <button className="btn-small gray-btn" onClick={setHospitalMedicalRecordInit}>수정취소</button>
+                                <button className="btn-small red-btn" onClick={hospitalMedicalRecordUpdate}>수정</button>
+                                <button className="btn-small red-btn" onClick={hospitalMedicalRecordDelete}>삭제</button>
+                            </>
+                        }
+                    </div>
+                    <div>
+                        <table className="caregiver-user senior-insert  senior-table">
+                            <thead>
+                                <tr>
+                                    <th>No</th>
+                                    <th>진료 일자</th>
+                                    <th>진료 사유</th>
+                                    <th>진료 내용</th>
+                                    <th>기록 작성자</th>
+                                </tr>
+                            </thead>
+                            <tbody>
+                                {hospitalMedicalRecordList.hospitalMedicalRecordList.map((item, idx) => { return (
+                                <tr key={idx} onClick={() => {setHospitalMedicalRecord(item)}}>
+                                    <td data-label="No">{hospitalMedicalRecordList.hospitalMedicalRecordListCount - idx - (hospitalMedicalRecordList.search.currentPage - 1) * hospitalMedicalRecordList.search.perPage}</td>
+                                    <td data-label="진료 일자">{item['medical_date']}</td>
+                                    <td data-label="진료 내용">{item['medical_reason']}</td>
+                                    <td data-label="진료 사유">{item['medical_content']}</td>
+                                    <td data-label="기록 작성자">{item['insert_user_name']}</td>
+                                </tr>
+                                )})}
+                                {CommonUtil.isEmpty(hospitalMedicalRecordList.hospitalMedicalRecordList) ?
+                                <tr>
+                                    <td colSpan={5}>조회된 데이터가 없습니다</td>
+                                </tr>  
+                                : null}
+                            </tbody>
+                        </table>
+                        <Pagination
+                            currentPage={hospitalMedicalRecordList.search.currentPage}
+                            perPage={hospitalMedicalRecordList.search.perPage}
+                            totalCount={hospitalMedicalRecordList.hospitalMedicalRecordListCount}
+                            maxRange={5}
+                            click={hospitalMedicalRecordSelectList}
+                        />
+                    </div>
+                </div>
+            </Modal>
+
+
+            <Modal open={modalOpen3} close={closeModal3} header="심전도판독소견 관리 및 조회">
+                <div className="board-wrap">
+                    <table className="margin-bottom2 senior-insert ">
+                        <tr>
+                            <th>측정 일자</th>
+                            <td colSpan={5}>
+                                <input type="date" value={ecg['ecg_reading_date']}
+                                    onChange={(e) => {
+                                        ecg['ecg_reading_date'] = e.target.value;
+                                        setEcg({...ecg});
+                                    }}
+                                    ref={el => ecgRef.current['ecg_reading_date'] = el}
+                                />
+                            </td>              
+                        </tr>
+                        <tr>
+                            <th>판독 소견 종류</th>
+                            <td colSpan={5}>
+                                <input type="text" value={ecg['ecg_finding_type']}
+                                    onChange={(e) => {
+                                        ecg['ecg_finding_type'] = e.target.value;
+                                        setEcg({...ecg});
+                                    }}
+                                    ref={el => ecgRef.current['ecg_finding_type'] = el}
+                                />
+                            </td>              
+                        </tr>
+                        <tr>
+                            <th>판독 소견 내용</th>
+                            <td colSpan={5}>
+                                <textarea className="medicine" cols="30" rows="2"
+                                    value={ecg['ecg_finding_content']}
+                                    onChange={(e) => {
+                                        ecg['ecg_finding_content'] = e.target.value;
+                                        setEcg({...ecg});
+                                    }}
+                                    ref={el => ecgRef.current['ecg_finding_content'] = el}
+                                ></textarea>
+                            </td>              
+                        </tr>
+                        {ecg.isEdit == false
+                        ? <tr>
+                            <th>측정 파일</th>
+                            <td colSpan={5}>
+                                <CommonFile commonFileList={ecg['commonFileList']} multiple={false} accept={'.dat, .ecg'}/>
+                            </td>              
+                        </tr>
+                        : <>
+                            <tr>
+                                <th>서맥 횟수</th>
+                                <td>
+                                    <input type="number" value={ecg['bradycardia_count']}
+                                        onChange={(e) => {
+                                            ecg['bradycardia_count'] = e.target.value;
+                                            setEcg({...ecg});
+                                        }}
+                                        ref={el => ecgRef.current['bradycardia_count'] = el}
+                                    />
+                                </td>
+                                <th>빈맥 횟수</th>
+                                <td>
+                                    <input type="number" value={ecg['tachycardia_count']}
+                                        onChange={(e) => {
+                                            ecg['tachycardia_count'] = e.target.value;
+                                            setEcg({...ecg});
+                                        }}
+                                        ref={el => ecgRef.current['tachycardia_count'] = el}
+                                    />
+                                </td>
+                                <th>이상 심박수</th>
+                                <td>
+                                    <input type="number" value={ecg['abnormal_heart_rate']}
+                                        onChange={(e) => {
+                                            ecg['abnormal_heart_rate'] = e.target.value;
+                                            setEcg({...ecg});
+                                        }}
+                                        ref={el => ecgRef.current['abnormal_heart_rate'] = el}
+                                    />
+                                </td>
+                            </tr>
+                            <tr>
+                                <th>최대 심박수</th>
+                                <td>
+                                    <input type="number" value={ecg['max_heart_rate']}
+                                        onChange={(e) => {
+                                            ecg['max_heart_rate'] = e.target.value;
+                                            setEcg({...ecg});
+                                        }}
+                                        ref={el => ecgRef.current['max_heart_rate'] = el}
+                                    />
+                                </td>
+                                <th>최소 심박수</th>
+                                <td>
+                                    <input type="number" value={ecg['min_heart_rate']}
+                                        onChange={(e) => {
+                                            ecg['min_heart_rate'] = e.target.value;
+                                            setEcg({...ecg});
+                                        }}
+                                        ref={el => ecgRef.current['min_heart_rate'] = el}
+                                    />
+                                </td>
+                                <th>평균 심박수</th>
+                                <td>
+                                    <input type="number" value={ecg['average_heart_rate']}
+                                        onChange={(e) => {
+                                            ecg['average_heart_rate'] = e.target.value;
+                                            setEcg({...ecg});
+                                        }}
+                                        ref={el => ecgRef.current['average_heart_rate'] = el}
+                                    />
+                                </td>
+                            </tr>
+                            <tr>
+                                <th>최대 R-R</th>
+                                <td>
+                                    <input type="number" value={ecg['max_rr']}
+                                        onChange={(e) => {
+                                            ecg['max_rr'] = e.target.value;
+                                            setEcg({...ecg});
+                                        }}
+                                        ref={el => ecgRef.current['max_rr'] = el}
+                                    />
+                                </td>
+                                <th>최소 R-R</th>
+                                <td>
+                                    <input type="number" value={ecg['min_rr']}
+                                        onChange={(e) => {
+                                            ecg['min_rr'] = e.target.value;
+                                            setEcg({...ecg});
+                                        }}
+                                        ref={el => ecgRef.current['min_rr'] = el}
+                                    />
+                                </td>
+                                <th>평균 R-R</th>
+                                <td>
+                                    <input type="number" value={ecg['average_rr']}
+                                        onChange={(e) => {
+                                            ecg['average_rr'] = e.target.value;
+                                            setEcg({...ecg});
+                                        }}
+                                        ref={el => ecgRef.current['average_rr'] = el}
+                                    />
+                                </td>
+                            </tr>
+                        </>}
+                    </table>
+                    <div className="btn-wrap flex-center margin-bottom5">
+                        {CommonUtil.isEmpty(ecg['ecg_record_idx'])
+                            ? <button className="btn-small red-btn" onClick={ecgInsert}>등록</button>
+                            : <>
+                                <button className="btn-small gray-btn" onClick={setEcgInit}>수정취소</button>
+                                <button className="btn-small red-btn" onClick={ecgUpdate}>수정</button>
+                                <button className="btn-small red-btn" onClick={ecgDelete}>삭제</button>
+                            </>
+                        }
+                    </div>
+                    <div>
+                        <table className="caregiver-user senior-table">
+                            <thead>
+                                <tr>
+                                    <th>No</th>
+                                    <th>소견 작성 일자</th>
+                                    <th>판독 소견 종류</th>
+                                    <th>소견 작성자</th>
+                                </tr>
+                            </thead>
+                            <tbody>
+                                {ecgList.ecgList.map((item, idx) => { return (
+                                <tr key={idx} onClick={() => {item.isEdit = false; setEcg(item);}}>
+                                    <td data-label="No">{ecgList.ecgListCount - idx - (ecgList.search.currentPage - 1) * ecgList.search.perPage}</td>
+                                    <td data-label="소견 작성 일자">{item['ecg_reading_date']}</td>
+                                    <td data-label="판독 소견 종류">{item['ecg_finding_type']}</td>
+                                    <td data-label="소견 작성자">{item['insert_user_name']}</td>
+                                </tr>
+                                )})}
+                                {CommonUtil.isEmpty(ecgList.ecgList) ?
+                                <tr>
+                                    <td colSpan={4}>조회된 데이터가 없습니다</td>
+                                </tr>  
+                                : null}
+                            </tbody>
+                        </table>
+                        <Pagination
+                            currentPage={ecgList.search.currentPage}
+                            perPage={ecgList.search.perPage}
+                            totalCount={ecgList.ecgListCount}
+                            maxRange={5}
+                            click={ecgSelectList}
+                        />
+                    </div>
+                </div>
+            </Modal>
+
+
+            <Modal open={modalOpen4} close={closeModal4} header="혈압측정결과 관리 및 조회">
+                <div className="board-wrap">
+                    <table className="margin-bottom2 senior-insert ">
+                        <tr>
+                            <th>측정일자</th>
+                            <td>
+                                <input type="date" value={bloodPressure['blood_pressure_record_date']}
+                                    onChange={(e) => {
+                                        bloodPressure['blood_pressure_record_date'] = e.target.value;
+                                        setBloodPressure({...bloodPressure});
+                                    }}
+                                    ref={el => bloodPressureRef.current['blood_pressure_record_date'] = el}
+                                />
+                            </td>              
+                        </tr>
+                        <tr>
+                            <th>최고혈압</th>
+                            <td>
+                                <input type="number" value={bloodPressure['max_blood_pressure']}
+                                    onChange={(e) => {
+                                        bloodPressure['max_blood_pressure'] = e.target.value;
+                                        setBloodPressure({...bloodPressure});
+                                    }}
+                                    ref={el => bloodPressureRef.current['max_blood_pressure'] = el}
+                                />
+                            </td>         
+                        </tr>
+                        <tr>
+                            <th>최저혈압</th>
+                            <td>
+                                <input type="number" value={bloodPressure['min_blood_pressure']}
+                                    onChange={(e) => {
+                                        bloodPressure['min_blood_pressure'] = e.target.value;
+                                        setBloodPressure({...bloodPressure});
+                                    }}
+                                    ref={el => bloodPressureRef.current['min_blood_pressure'] = el}
+                                />
+                            </td>
+                        </tr>
+                        <tr>
+                            <th>맥박수</th>
+                            <td>
+                                <input type="number" value={bloodPressure['pulse_rate']}
+                                    onChange={(e) => {
+                                        bloodPressure['pulse_rate'] = e.target.value;
+                                        setBloodPressure({...bloodPressure});
+                                    }}
+                                    ref={el => bloodPressureRef.current['pulse_rate'] = el}
+                                />
+                            </td>
+                        </tr>      
+                    </table>
+                    <div className="btn-wrap flex-center margin-bottom5">
+                        {CommonUtil.isEmpty(bloodPressure['blood_pressure_record_idx'])
+                            ? <button className="btn-small red-btn" onClick={bloodPressureInsert}>등록</button>
+                            : <>
+                                <button className="btn-small gray-btn" onClick={setBloodPressureInit}>수정취소</button>
+                                <button className="btn-small red-btn" onClick={bloodPressureUpdate}>수정</button>
+                                <button className="btn-small red-btn" onClick={bloodPressureDelete}>삭제</button>
+                            </>
+                        }
+                    </div>
+                    <div>
+                        <table className="caregiver-user senior-insert  senior-table">
+                            <thead>
+                                <tr>
+                                    <th>No</th>
+                                    <th>기록 작성일</th>
+                                    <th>최고 혈압</th>
+                                    <th>최저 혈압</th>
+                                    <th>맥박수</th>
+                                    <th>기록 작성자</th>
+                                </tr>
+                            </thead>
+                            <tbody>
+                                {bloodPressureList.bloodPressureList.map((item, idx) => { return (
+                                <tr key={idx} onClick={() => {setBloodPressure(item);}}>
+                                    <td data-label="No">{bloodPressureList.bloodPressureListCount - idx - (bloodPressureList.search.currentPage - 1) * bloodPressureList.search.perPage}</td>
+                                    <td data-label="기록 작성일">{item['blood_pressure_record_date']}</td>
+                                    <td data-label="최고 혈압">{item['max_blood_pressure']}</td>
+                                    <td data-label="최저 혈압">{item['min_blood_pressure']}</td>
+                                    <td data-label="맥박수">{item['pulse_rate']}</td>
+                                    <td data-label="기록 작성자">{item['insert_user_name']}</td>
+                                </tr>
+                                )})}
+                                {CommonUtil.isEmpty(bloodPressureList.bloodPressureList) ?
+                                <tr>
+                                    <td colSpan={6}>조회된 데이터가 없습니다</td>
+                                </tr>  
+                                : null}
+                            </tbody>
+                        </table>
+                        <Pagination
+                            currentPage={bloodPressureList.search.currentPage}
+                            perPage={bloodPressureList.search.perPage}
+                            totalCount={bloodPressureList.bloodPressureListCount}
+                            maxRange={5}
+                            click={bloodPressureSelectList}
+                        />
+                    </div>
+                </div>
+            </Modal>
+
+        </main>
+    );
+}
client/views/pages/main/Main_agency.jsx
--- client/views/pages/main/Main_agency.jsx
+++ client/views/pages/main/Main_agency.jsx
@@ -82,7 +82,7 @@
           </li>
         </ul>
       </div>
-      <div className="flex-start margin-bottom2"><img src={medicinebox} alt="" /><TitleSmall title={"방문 관리 리스트"}  /></div>
+      <div className="flex-start margin-bottom2"><img src={medicinebox} alt="" /><TitleSmall title={"방문/전화 관리 리스트"}  /></div>
       <div className="main-grid-agency">
         <div className="content-box combine-left-government3 visitlist">  
             <div className="margin-bottom2">
 
client/views/pages/main/Main_agencyAdmin.jsx (added)
+++ client/views/pages/main/Main_agencyAdmin.jsx
@@ -0,0 +1,301 @@
+import React, { useState } from "react";
+import { useSelector } from "react-redux";
+
+
+
+import { MapContainer, TileLayer, LayerGroup, Marker, Circle, CircleMarker, Tooltip, Popup, useMap } from 'react-leaflet';
+import L, { CRS, latLng, bounds } from 'leaflet';
+
+
+import Title from "../../component/Title.jsx";
+/* import Map from "../../component/chart/Map.jsx"; */
+import Chart5 from "../../component/chart/Chart5.jsx";
+import Chart2_govern from "../../component/chart/Chart2_govern.jsx";
+import Donut1_govern from "../../component/chart/Donut1_govern.jsx";
+import RowChart_govern from "../../component/chart/RowChart_govern.jsx";
+import AddCircleIcon from "@mui/icons-material/AddCircle";
+import BatteryCharging20Icon from '@mui/icons-material/BatteryCharging20';
+import DeviceThermostatIcon from '@mui/icons-material/DeviceThermostat';
+import MedicationIcon from '@mui/icons-material/Medication';
+import ElderlyIcon from '@mui/icons-material/Elderly';
+
+
+import "leaflet/dist/leaflet.css";
+
+export default function Main_government() {
+
+    //전역 변수 저장 객체
+    const state = useSelector((state) => { return state });
+
+    const [cityName, setCityName] = useState(state.loginUser['government_name']);
+
+    //대상자(시니어) 목록 조회
+    const [senior, setSenior] = React.useState({ userList: [], userListCount: 0 });
+    const seniorSelectList = () => {
+        fetch("/user/userSelectList.json", {
+            method: "POST",
+            headers: {
+                'Content-Type': 'application/json; charset=UTF-8'
+            },
+            body: JSON.stringify({
+                'government_id': state.loginUser['government_id'],
+                'agency_id': state.loginUser['agency_id'],
+                'authority': 'ROLE_SENIOR',
+            }),
+        }).then((response) => response.json()).then((data) => {
+            console.log("대상자(시니어) 목록 조회 : ", data);
+            setSenior(data);
+        }).catch((error) => {
+            console.log('seniorSelectList() /user/userSelectList.json error : ', error);
+        });
+    }
+
+    //전체 대상자(시니어) 수 조회
+    const [seniorCount, setSeniorCount] = React.useState(0);
+    const seniorCountTotal = () => {
+        fetch("/stats/governmentSeniorCount.json", {
+            method: "POST",
+            headers: {
+                'Content-Type': 'application/json; charset=UTF-8'
+            },
+            body: JSON.stringify({
+                'government_id': state.loginUser['government_id'],
+            }),
+        }).then((response) => response.json()).then((data) => {
+            console.log("전체 대상자(시니어) 수 조회 : ", data);
+            setSeniorCount(data);
+        }).catch((error) => {
+            console.log('governmentSeniorCount() /stats/governmentSeniorCount.json error : ', error);
+        });
+    }
+
+    //온도 위험 대상자(시니어) 수 조회
+    const [temperatureCount, setTemperatureCount] = React.useState(0);
+    const temperatureRiskCount = () => {
+        fetch("/stats/governmentTemperatureRisk.json", {
+            method: "POST",
+            headers: {
+                'Content-Type': 'application/json; charset=UTF-8'
+            },
+            body: JSON.stringify({
+                'government_id': state.loginUser['government_id'],
+            }),
+        }).then((response) => response.json()).then((data) => {
+            console.log("온도 위험 대상자(시니어) 수 조회 : ", data);
+            setTemperatureCount(data);
+        }).catch((error) => {
+            console.log('temperatureRiskCount() /stats/governmentTemperatureRisk.json error : ', error);
+        });
+    }
+
+    //배터리 부족 대상자(시니어) 수 조회
+    const [batteryCount, setbatteryCount] = React.useState(0);
+    const batteryRiskCount = () => {
+        fetch("/stats/governmentBatteryRisk.json", {
+            method: "POST",
+            headers: {
+                'Content-Type': 'application/json; charset=UTF-8'
+            },
+            body: JSON.stringify({
+                'government_id': state.loginUser['government_id'],
+            }),
+        }).then((response) => response.json()).then((data) => {
+            console.log("배터리 부족 대상자(시니어) 수 조회 : ", data);
+            setbatteryCount(data);
+        }).catch((error) => {
+            console.log('batteryRiskCount() /stats/governmentBatteryRisk.json error : ', error);
+        });
+    }
+
+    //월별 방문 횟수 조회
+    const [visit, setVisit] = React.useState([]);
+    const visitByMonthList = () => {
+        fetch("/stats/visitByMonthList.json", {
+            method: "POST",
+            headers: {
+                'Content-Type': 'application/json; charset=UTF-8'
+            },
+            body: JSON.stringify({
+                'government_id': state.loginUser['government_id'],
+            }),
+        }).then((response) => response.json()).then((data) => {
+            console.log("월별 방문 횟수 조회 : ", data);
+            setVisit(data);
+        }).catch((error) => {
+            console.log('visitByMonthList() /stats/visitByMonthList.json error : ', error);
+        });
+    }
+
+    //시행 기관별 약상자 사용 현황
+    const [equipmentUsage, setEquipmentUsage] = React.useState([]);
+    const equipmentByAgency = () => {
+        fetch("/stats/equipmentByAgency.json", {
+            method: "POST",
+            headers: {
+                'Content-Type': 'application/json; charset=UTF-8'
+            },
+            body: JSON.stringify({
+                'government_id': state.loginUser['government_id'],
+            }),
+        }).then((response) => response.json()).then((data) => {
+            console.log("시행기관별 약상자 사용 현황 : ", data);
+            let newEquipmentList = updateList(data['agencyList'], data['equipmentList']);
+            console.log("new equipment list", newEquipmentList);
+            setEquipmentUsage(newEquipmentList);
+        }).catch((error) => {
+            console.log('equipmentByAgency() /stats/equipmentByAgency.json error : ', error);
+        });
+    }
+
+    //시행 기관별 대상자(시니어) 등록 현황
+    const [seniorEnroll, setSeniorEnroll] = React.useState([]);
+    const seniorByAgency = () => {
+        fetch("/stats/seniorByAgency.json", {
+            method: "POST",
+            headers: {
+                'Content-Type': 'application/json; charset=UTF-8'
+            },
+            body: JSON.stringify({
+                'government_id': state.loginUser['government_id'],
+            }),
+        }).then((response) => response.json()).then((data) => {
+            console.log("시행기관별 시니어 등록 현황 : ", data);
+            let newSeniorList = updateList(data['agencyList'], data['seniorList']);
+            console.log("new senior list", newSeniorList);
+            setSeniorEnroll(newSeniorList);
+        }).catch((error) => {
+            console.log('seniorByAgency() /stats/seniorByAgency.json error : ', error);
+        });
+    }
+
+    function updateList(agencyList, countList) {
+
+        const result = [];
+        for (let i = 0; i < agencyList.length; i++) {
+            const agency = agencyList[i];
+            let count = 0;
+            for (let j = 0; j < countList.length; j++) {
+                if (countList[j].agency_id === agency.agency_id) {
+                    count = countList[j].count;
+                    break;
+                }
+            }
+            result.push({ agency_id: agency.agency_id, agency_name: agency.agency_name, count: count });
+        }
+        return result;
+    }
+
+
+
+    const iconHouse = new L.Icon({
+        iconUrl: '/client/resources/files/images/house.png',
+        iconRetinaUrl: '/client/resources/files/images/house.png',
+        iconSize: [20, 20],
+        className: 'leaflet-background-radius-icon'//leaflet-div-icon
+    });
+
+    React.useEffect(() => {
+        seniorSelectList();
+        seniorCountTotal();
+        temperatureRiskCount();
+        batteryRiskCount();
+        visitByMonthList();
+        equipmentByAgency();
+        seniorByAgency();
+    }, []);
+
+
+    return (
+        <main>
+            <div className="main-grid-government">
+                <div className="sub-grid-government">
+                    <ul className="content-box statistics-govern" background="#f7acba">
+                        <li>
+                            <p><ElderlyIcon sx={{ width: "50px", height: "50px", color: "#ffffff", background: "#bf0629", borderRadius: "50px" }} /></p>
+                            <p>{cityName} 전체 대상자</p>
+                            <p>{seniorCount}</p>
+                        </li>
+                    </ul>
+                    <ul className="content-box statistics-govern" background="#8ef3d1">
+                        <li>
+                            <p><MedicationIcon sx={{ width: "50px", height: "50px", color: "#ffffff", background: "#076143", borderRadius: "50px" }} /></p>
+                            <p>{cityName} 미복약 위험 대상자</p>
+                            <p>11</p>
+                        </li>
+                    </ul>
+                    <ul className="content-box statistics-govern" background="#ebe7b9" >
+                        <li>
+                            <p><DeviceThermostatIcon sx={{ width: "50px", height: "50px", color: "#ffffff", background: "#f1de05", borderRadius: "50px" }} /></p>
+                            <p>{cityName} 댁내 온도 위험 대상자</p>
+                            <p>{temperatureCount}</p>
+                        </li>
+                    </ul>
+                    <ul className="content-box statistics-govern" background="#5f9af3">
+                        <li>
+                            <p><BatteryCharging20Icon sx={{ width: "50px", height: "50px", color: "#ffffff", background: "#5f9af3", borderRadius: "50px" }} /></p>
+                            <p>{cityName} 배터리 부족 대상자 </p>
+                            <p>{batteryCount}</p>
+                        </li>
+                    </ul>
+                </div>
+                <div className="content-box combine-left-government combine-bottom-government2 main-main">
+                    <div className="flex">
+                        <Title title={"지역별 케어 대상자 분포 현황"} explanation={"지역 선택 시 해당 지역의 대상자리스트가 보여집니다."} />
+                    </div>
+                    <div style={{ height: 'calc(100% - 60px)' }}>
+                        <MapContainer center={latLng(35.8713802646197, 128.601805491072)} zoom={13} scrollWheelZoom={true} style={{ height: '100%' }}>
+                            <TileLayer
+                                attribution='&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
+                                url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
+                            />
+                            {/* <Marker position={[128.601405491072, 35.8913802646197]}>
+                        <Popup>
+                            A pretty CSS3 popup. <br /> Easily customizable.
+                        </Popup>
+                        </Marker> */}
+
+                            <LayerGroup>
+                                {senior.userList.map((item, idx) => {
+                                    return item['y'] != null && item['x'] != null ? (
+                                        <Marker position={[item['y'], item['x']]} icon={iconHouse}>
+                                            <Popup>
+                                                <div>
+                                                    {item['user_name']}({item['user_birth']} - {item['user_gender']})
+                                                </div>
+                                            </Popup>
+                                        </Marker>
+                                    ): null
+                                })}
+                            </LayerGroup>
+                        </MapContainer>
+                    </div>
+                    {/* <Map setCityName={setCityName} /> */}
+                </div>
+                <div className="content-box combine-all-government combine-bottom-government2">
+                    <div className="flex">
+                        <Title title={`${cityName} 월별 방문 횟수`} explanation={"최근 6개월간 방문 횟수의 변화를 확인할 수 있습니다."} />
+                    </div>
+                    <RowChart_govern data={visit} />
+                </div>
+                <div className="content-box combine-left-government2">
+                    <div className="flex">
+                        <Title title={`${cityName} 복용률 평균`} explanation={"해당 지역의 대상자 복용률이 그래프로 보여집니다."} />
+                    </div>
+                    <Chart2_govern />
+                </div>
+                <div className="content-box combine-right-government2">
+                    <div className="flex">
+                        <Title title={`기관별 대상자 등록 현황`} explanation={"약상자 사용자의 데이터 차트가 보여집니다."} />
+                    </div>
+                    <Chart5 data={seniorEnroll} />
+                </div>
+                <div className="content-box combine-right-government">
+                    <div className="flex">
+                        <Title title={`기관별 약상자 사용 현황`} explanation={""} />
+                    </div>
+                    <Donut1_govern data={equipmentUsage} />
+                </div>
+            </div>
+        </main>
+    );
+}
client/views/pages/setting/AuthorityManagement.jsx
--- client/views/pages/setting/AuthorityManagement.jsx
+++ client/views/pages/setting/AuthorityManagement.jsx
@@ -12,8 +12,8 @@
     {
       menu: {
         대상자관리: ["대상자관리"],
-        건강관리: ["복약관리", "댁내온도관리", "복약통계"],
-        방문관리: ["방문관리"],
+        생활복지관리: ["복약관리", "댁내온도관리", "복약통계"],
+        방문전화관리: ["방문/전화 관리"],
         장비관리: ["장비관리"],
         설정: ["내정보 관리", "사용자 관리", "권한 관리"],
       },
@@ -115,8 +115,8 @@
               <tr>
                 <th rowSpan="2">구분</th>
                 <th rowSpan="2">사용자 관리</th>
-                <th colSpan="3">건강관리</th>
-                <th rowSpan="2">방문관리</th>
+                <th colSpan="3">생활 복지 관리</th>
+                <th rowSpan="2">방문/전화 관리</th>
                 <th rowSpan="2">장비관리</th>
                 <th rowSpan="2">고객지원센터</th>
                 <th rowSpan="2">Q&amp;A</th>
@@ -194,7 +194,7 @@
                 <td>사용자(노인, 보호자 등)를 등록하고 삭제할 수 있다.</td>
               </tr>
               <tr>
-                <td rowSpan="3">건강관리</td>
+                <td rowSpan="3">생활 복지 관리</td>
                 <td>복약관리</td>
                 <td>사용자(노인)의 아침, 점심, 저녁 복약여부를 확인하고 관리할 수 있다.</td>
               </tr>
@@ -207,7 +207,7 @@
                 <td>시행기관에 등록되어 있는 사용자(노인)의 복약 통계 자료를 볼 수 있다.</td>
               </tr>
               <tr>
-                <td>방문 관리</td>
+                <td>방문/전화 관리</td>
                 <td>-</td>
                 <td>시행기관의 복지사가 사용자(노인)을 방문한 내역을 확인하고 관리할 수 있다.</td>
               </tr>  
 
client/views/pages/user_management/AgentAdminSelectOne.jsx (added)
+++ client/views/pages/user_management/AgentAdminSelectOne.jsx
@@ -0,0 +1,267 @@
+import React from "react";
+import { useNavigate, useLocation } from "react-router";
+
+import SubTitle from "../../component/SubTitle.jsx";
+import Modal_Guardian from "../../component/Modal_Guardian.jsx";
+import Modal_SeniorInsert from "../../component/Modal_SeniorInsert.jsx";
+
+
+export default function AgentSelectOne() {
+  const navigate = useNavigate();
+  const location = useLocation();
+
+
+  //대상자(시니어) 등록 모달 오픈 여부
+  const [modalSeniorInsertIsOpen, setModalSeniorInsertIsOpen] = React.useState(false);
+  //대상자(시니어) 등록 모달 오픈
+  const modalSeniorInsertOpen = () => {
+    setModalSeniorInsertIsOpen(true);
+  };
+  //대상자(시니어) 등록 모달 닫기
+  const modalSeniorInsertClose = () => {
+    setModalSeniorInsertIsOpen(false);
+  };
+
+
+  //시니어 정보
+  const [agent, setAgent] = React.useState({
+    'user_id': location.state['agent_id'],
+    'user_name': null,
+    'user_password': null,
+    'user_phonenumber': null,
+    'user_birth': null,
+    'user_gender': null,
+    'user_address': null,
+    'user_email': null,
+    'authority': 'ROLE_AGENCY',
+    'agency_id': null,
+    'government_id': null,
+
+    'agent_id': location.state['agent_id'],
+  });
+  //시니어 상세 조회
+  const agentSelectOne = () => {
+    fetch("/user/userSelectOne.json", {
+      method: "POST",
+      headers: {
+        'Content-Type': 'application/json; charset=UTF-8'
+      },
+      body: JSON.stringify(agent),
+    }).then((response) => response.json()).then((data) => {
+      console.log("agentSelectOne data : ", data);
+      data['agent_id'] = location.state['agent_id'];
+      setAgent(data);
+    }).catch((error) => {
+      console.log('agentSelectOne() /user/userSelectOne.json error : ', error);
+    });
+  };
+
+  //보호사의 대상자 목록
+  const [seniorByAgent, setSeniorByAgent] = React.useState({seniorListByAgent: [], seniorListCountByAgent: 0});
+  //보호사의 선택한 대상자 정보
+  const [senior, setSenior] = React.useState({});
+  //보호사의 대상자 목록 조회
+  const seniorSelectListByAgent = () => {
+    fetch("/user/seniorSelectListByAgent.json", {
+      method: "POST",
+      headers: {
+        'Content-Type': 'application/json; charset=UTF-8'
+      },
+      body: JSON.stringify(agent),
+    }).then((response) => response.json()).then((data) => {
+      console.log("seniorSelectListByAgent data : ", data);
+      setSeniorByAgent(data);
+    }).catch((error) => {
+      console.log('seniorSelectListByAgent() /user/seniorSelectListByAgent.json error : ', error);
+    });
+  };
+
+  //선택한 보호자 정보 관리
+  const guardianByAgentManagement = (item) => {
+    setSenior(item);
+  }
+
+  //가입승인
+  const userUpdate = () => {
+    agent['is_accept'] = true;
+
+    fetch("/user/userUpdate.json", {
+      method: "POST",
+      headers: {
+        'Content-Type': 'application/json; charset=UTF-8'
+      },
+      body: JSON.stringify(agent),
+    }).then((response) => response.json()).then((data) => {
+      console.log("가입승인 결과(건수) : ", data);
+      if (data > 0) {
+        alert("승인완료");
+        agentSelectOne();
+      } else {
+        alert("승인에 실패하였습니다. 관리자에게 문의바랍니다.");
+      }
+    }).catch((error) => {
+      console.log('userUpdate() /user/userUpdate.json error : ', error);
+    });
+  }
+
+
+
+  //보호자의 대상자 제거
+  const agentSeniorDelete = (senior) => {
+    if (confirm('해당 보호대상자의 케어를 종료하시겠습니까?') == false) {
+      return;
+    }
+
+    fetch("/user/agentSeniorDelete.json", {
+      method: "POST",
+      headers: {
+        'Content-Type': 'application/json; charset=UTF-8'
+      },
+      body: JSON.stringify(senior),
+    }).then((response) => response.json()).then((data) => {
+      console.log("보호자의 대상자 제거 결과(건수) : ", data);
+      if (data > 0) {
+        alert("케어종료완료");
+        seniorSelectListByAgent();
+      } else {
+        alert("케어종료에 실패하였습니다. 관리자에게 문의바랍니다.");
+      }
+    }).catch((error) => {
+      console.log('agentSeniorDelete() /user/agentSeniorDelete.json error : ', error);
+    });
+  }
+
+  React.useEffect(() => {
+    agentSelectOne();
+    seniorSelectListByAgent();
+  }, [])
+
+
+  return (
+    <main>
+      <Modal_SeniorInsert
+        open={modalSeniorInsertIsOpen}
+        close={modalSeniorInsertClose}
+        seniorInsertCallback={() => {seniorSelectListByAgent(); modalSeniorInsertClose();}}
+        defaultAgentId={agent['agent_id']}
+        defaultAgencyId={agent['agency_id']}
+        defaultGovernmentId={agent['government_id']}
+      />
+
+      <div className="content-wrap row">
+        <SubTitle explanation={"대상자 상세 프로필"} className="margin-bottom" />
+        <div className="margin-bottom5">
+          <table className="margin-bottom senior-detail">
+            <tbody>
+              <tr>
+                <th>관리기관</th>
+                <td>
+                  <span>{agent['government_name']}</span>
+                </td>             
+              </tr>
+
+              <tr>
+                <th>시행기관</th>
+                <td>
+                  <span>{agent['agency_name']}</span>
+                </td>              
+              </tr>
+
+              <tr>
+                <th>이름(아이디)</th>
+                <td>
+                  <span>{agent['user_name']}({agent['user_id']})</span>
+                </td>           
+              </tr>
+              
+              <tr>
+                <th>연락처</th>
+                <td>
+                  <span>{agent['user_phonenumber']}</span>
+                </td>
+              </tr>
+
+              <tr>
+                <th>이메일</th>
+                <td>
+                  <span>{agent['user_email']}</span>
+                </td>         
+              </tr>
+
+              <tr>
+                <th>가입승인관리</th>
+                <td>
+                  {agent['is_accept'] ? <span>승인완료</span> : 
+                    <button className={"btn-small red-btn"} onClick={userUpdate}>가입승인</button>
+                  }
+                </td>         
+              </tr>
+              
+            </tbody>
+          </table>
+          <div className="btn-wrap flex-center">
+            <button className={"btn-large gray-btn"} onClick={() => {navigate("/UserEdit", {state: {'user_id': agent['user_id']}})}}>수정</button>
+            <button className={"btn-large red-btn"} onClick={() => alert("삭제할 수 없습니다.")}>삭제</button>
+          </div>
+        </div>
+
+        <SubTitle explanation={"보호사의 보호대상자"} className="margin-bottom display-inline-block" />
+        <button className={"btn-small gray-btn display-inline-block float-right"} onClick={() => modalSeniorInsertOpen()}>보호대상자 추가</button>
+        <div className="margin-bottom5">
+          <table className={"agent-user"}>
+            <thead>
+              <tr>
+                <th>No</th>
+                {/* <th>관리기관명</th>
+                <th>소속기관명</th> */}
+                <th>이름</th>
+                <th>연락처</th>
+                <th>생년월일</th>
+                <th>성별</th>
+                <th>상태</th>
+                <th>배정시작일</th>
+                <th>배정종료일</th>
+                <th>상세보기</th>
+              </tr>
+            </thead>
+            <tbody>
+              {seniorByAgent.seniorListByAgent.map((item, idx) => { return (
+                <tr key={idx}>
+                  <td>{idx + 1}</td>
+                  {/* <td>{item['government_name']}</td>
+                  <td>{item['agency_name']}</td> */}
+                  <td>{item['user_name']}</td>
+                  <td>{item['user_phonenumber']}</td>
+                  <td>{item['user_birth']}</td>
+                  <td>{item['user_gender']}</td>
+                  <td>{item['agent_match_state'] ? <span className="green">케어중</span> : <span className="grey">케어완료</span>}</td>
+                  <td>{item['agent_match_start_date']}</td>
+                  <td>
+                    {item['agent_match_state'] ?
+                     <button className={"btn-small red-btn"} onClick={() => {agentSeniorDelete(item)}}>케어종료</button>
+                     : item['agent_match_end_date']
+                    }
+                  </td>
+                  <td>
+                    <button className={"btn-small lightgray-btn"} onClick={() => {navigate("/SeniorSelectOne", {state: {'senior_id': item['user_id']}})}}>상세 페이지 이동</button>
+                  </td>
+                </tr>
+              )})}
+              {seniorByAgent.seniorListByAgent == null || seniorByAgent.seniorListByAgent.length == 0 ?
+                <tr>
+                  <td colSpan={9}>조회된 데이터가 없습니다</td>
+                </tr>
+              : null}
+            </tbody>
+          </table>
+        </div>
+
+        <div className="btn-wrap flex-center">
+          <button className={"btn-large gray-btn"} onClick={() => navigate(-1)}>이전</button>
+        </div>
+
+      </div>
+
+    </main>
+  );
+}
client/views/pages/user_management/UserSelect.jsx
--- client/views/pages/user_management/UserSelect.jsx
+++ client/views/pages/user_management/UserSelect.jsx
@@ -21,7 +21,7 @@
   const defaultGovernmentId = CommonUtil.isEmpty(state.loginUser) ? null : state.loginUser['government_id'];
 
   //활성화 탭 (시스템 업무 역할별)
-  const [tabActiveByRoleType, setTabActiveByRoleType] = React.useState('ROLE_SENIOR');
+  const [tabActiveByRoleType, setTabActiveByRoleType] = React.useState('ROLE_AGENCY');
 
   //보호자 모달 오픈 여부
   const [modalGuardianIsOpen, setModalGuardianIsOpen] = React.useState(false);
@@ -394,7 +394,7 @@
 
                 {/* 탭 제목 */}
                 <ul className="tab-menu flex-end" >
-                  <li onClick={() => setTabActiveByRoleType('ROLE_SENIOR')} className={tabActiveByRoleType == 'ROLE_SENIOR' ? "active" : null}>대상자(어르신) ({senior.userListCount})</li>
+                  {/* <li onClick={() => setTabActiveByRoleType('ROLE_SENIOR')} className={tabActiveByRoleType == 'ROLE_SENIOR' ? "active" : null}>대상자(어르신) ({senior.userListCount})</li> */}
                   <li onClick={() => setTabActiveByRoleType('ROLE_AGENCY')} className={tabActiveByRoleType == 'ROLE_AGENCY' ? "active" : null}>보호사 ({agent.userListCount})</li>
                   {state.loginUser['authority'] == 'ROLE_ADMIN' || state.loginUser['authority'] == 'ROLE_GOVERNMENT'  ?
                     <li onClick={() => setTabActiveByRoleType('ROLE_GOVERNMENT')} className={tabActiveByRoleType == 'ROLE_GOVERNMENT' ? "active" : null}>기관 관리자 ({government.userListCount})</li>
Add a comment
List