최정우 최정우 2023-04-13
230413 최정우 QnA(+장비문의) 완료
@ffb7be79c474fd8bc0f937be24a6694ce5502582
client/resources/css/common.css
--- client/resources/css/common.css
+++ client/resources/css/common.css
@@ -391,23 +391,29 @@
 .margin-bottom {
   margin-bottom: 1rem;
 }
-
 .margin-bottom2 {
   margin-bottom: 2rem;
 }
-.margin-top {
-  margin-top: 2rem;
-}
-
 .margin-bottom5 {
   margin-bottom: 5rem;
 }
-
 .margin-bottom10 {
   margin-bottom: 10rem;
 }
-.margin-left{
-  margin-left: 1rem;
+.margin-top {
+  margin-top: 1rem;
+}
+.margin-top2 {
+  margin-top: 2rem;
+}
+.margin-top5 {
+  margin-top: 5rem;
+}
+.margin-top10 {
+  margin-top: 10rem;
+}
+.margin-left2{
+  margin-left: 2rem;
 }
 
 
client/views/component/Modal_SeniorInsert.jsx
--- client/views/component/Modal_SeniorInsert.jsx
+++ client/views/component/Modal_SeniorInsert.jsx
@@ -327,7 +327,7 @@
                           />
                         <label for="user_gender_f">여</label>
                       </div>
-                    </div >
+                    </div>
                   </td>
                 </tr>
                 <tr>
client/views/pages/App.jsx
--- client/views/pages/App.jsx
+++ client/views/pages/App.jsx
@@ -8,7 +8,7 @@
 import { useLocation, /* useNavigate */ } from "react-router";
 
 //Application의 전역 상태값(변수) 저장소(Store) 관리 Component
-import { setLoginUser } from "./AppStore.jsx";
+import { setLoginUser, setSeniorList } from "./AppStore.jsx";
 
 //Application의 Route 정보를 관리하는 Component
 import {AdminApp, GovernmentApp, AgencyApp, GuardianApp} from "./AppRoute.jsx";
@@ -18,6 +18,7 @@
 import Menu from "../layout/Menu.jsx";
 import Login from "./login/Login.jsx";
 import Weather from "./main/Weather.jsx";
+import CommonUtil from "../../resources/js/CommonUtil.js";
 
 function App() {
   const location = useLocation();
@@ -53,6 +54,25 @@
     });
   };
 
+  //특정 보호자의 대상자(시니어) 목록 조회
+  const seniorSelectListByGuardian = (loginUser) => {
+    fetch("/user/seniorSelectListByGuardian.json", {
+      method: "POST",
+      headers: {
+        'Content-Type': 'application/json; charset=UTF-8'
+      },
+      body: JSON.stringify({
+        'guardian_id': loginUser['user_id']
+      }),
+    }).then((response) => response.json()).then((data) => {
+      console.log("특정 보호자의 대상자(시니어) 목록 조회 : ", data);
+      //로그인 사용자 정보 전역 변수에 저장
+      dispatch(setSeniorList(data));
+    }).catch((error) => {
+      console.log('login() /user/seniorSelectListByGuardian.json error : ', error);
+    });
+  };
+
   //URL 변경 시, 발생 이벤트(hook)
   React.useEffect(() => {
     loginUserSelectOne((loginResultData) => {
@@ -74,9 +94,12 @@
         } else if (loginResultData['authority'] == 'ROLE_AGENCY') {
           setMenuItems(AgencyApp.menuItems);
           setAppRoute(<AgencyApp.AppRoute/>);
-        } else if (loginResultData['authority'] == 'ROLE_GUARDIAN') {
+        } else if (loginResultData['authority'] == 'ROLE_GUARDIAN' || loginResultData['authority'] == 'ROLE_SENIOR') {
           setMenuItems(GuardianApp.menuItems);
           setAppRoute(<GuardianApp.AppRoute/>);
+          if (CommonUtil.isEmpty(state.seniorList) == true) {
+            seniorSelectListByGuardian(loginResultData);
+          }
         } else {
           alert('권한 관련 에러 - 관리자에게 문의바랍니다.');
           console.log('권한 관련 에러 - 관리자에게 문의바랍니다 : ', loginResultData);
client/views/pages/AppRoute.jsx
--- client/views/pages/AppRoute.jsx
+++ client/views/pages/AppRoute.jsx
@@ -39,11 +39,14 @@
 import UserSelect from "./user_management/UserSelect.jsx";
 import AgencySeniorSelect from "./user_management/AgencySeniorSelect.jsx";
 import QandASelect from "./callcenter/QandASelect.jsx";
-import QandAConfirm from "./callcenter/QandAConfirm.jsx";
+import QandASelectOne from "./callcenter/QandASelectOne.jsx";
+import QandAInsert from "./callcenter/QandAInsert.jsx";
+import QandAUpdate from "./callcenter/QandAUpdate.jsx";
+
 import EquipmentManagementInsert from "./equipment/EquipmentManagementInsert.jsx";
 import EquipmentManagementSelectAdd from "./equipment/EquipmentManagementSelectAdd.jsx";
 import RiskSet from "./setting/RiskSet.jsx";
-import QandAInsert from "./callcenter/QandAInsert.jsx";
+
 import QuestionConfirm from "./callcenter/QuestionConfirm.jsx";
 import UserSelectOk from "./user_management/UserSelectOk.jsx";
 import AuthorityManagement from "./setting/AuthorityManagement.jsx";
@@ -139,10 +142,11 @@
       <Route path="/TemperatureManagementSelectOne" element={<TemperatureManagementSelectOne />}></Route>      
       <Route path="/VisitSelectOne" element={<VisitSelectOne />}></Route>
       <Route path="/QandAInsert" element={<QandAInsert />}></Route>
+      <Route path="/QandAUpdate" element={<QandAUpdate />}></Route>
       <Route path="/QandASelect" element={<QandASelect />}></Route>
       <Route path="/EquipmentManagementSelectAdd" element={<EquipmentManagementSelectAdd />}></Route>
       <Route path="/UserSelect" element={<UserSelect />}></Route>
-      <Route path="/QandAConfirm" element={<QandAConfirm />}></Route>
+      <Route path="/QandASelectOne" element={<QandASelectOne />}></Route>
       <Route path="/Join" element={<Join />}></Route>
       <Route path="/SeniorEdit" element={<SeniorEdit />}></Route>
       <Route path="/SeniorSelectOne" element={<SeniorSelectOne />}></Route>
@@ -225,18 +229,19 @@
   }, */
   {
     title: "위험 기준 관리",
+    path: "/RiskSet",
     icon: (
       <SettingsIcon sx={{ fontSize: 20, marginRight: 1 }} />
-    ),
-    path: "/RiskSet"
+    )
   },
   {
-    title: "문의 현황 관리",
+    title: "문의 현황 조회",
+    path: "/QandASelect",
     icon: (
       <ContactSupportIcon
         sx={{ fontSize: 20, marginRight: 1 }}
       />
-    ),
+    )
   }
 ];
 function GovernmentAppRoute() {
@@ -257,8 +262,9 @@
       <Route path="/RiskSet" element={<RiskSet />}></Route>
       {/* <Route path="/AuthorityManagement" element={<AuthorityManagement />}></Route> */}
       <Route path="/QandASelect" element={<QandASelect />}></Route>
-      <Route path="/QandAConfirm" element={<QandAConfirm />}></Route>
+      <Route path="/QandASelectOne" element={<QandASelectOne />}></Route>
       <Route path="/QandAInsert" element={<QandAInsert />}></Route>
+      <Route path="/QandAUpdate" element={<QandAUpdate />}></Route>
       <Route path="/ProtectorSelect" element={<ProtectorSelect />}></Route>
       <Route path="/AgencyInsert" element={<AgencyInsert />}></Route>
       <Route path="/Join" element={<Join />}></Route>
@@ -306,7 +312,7 @@
     ),
   },
   {
-    title: "Q&A",
+    title: "문의하기",
     path: "/QandASelect",
     icon: (
       <ContactSupportIcon
@@ -352,14 +358,9 @@
         path="/QandASelect"
         element={<QandASelect />}
       ></Route>
-      <Route
-        path="/QandAInsert"
-        element={<QandAInsert />}
-      ></Route>
-      <Route
-        path="/QandAConfirm"
-        element={<QandAConfirm />}
-      ></Route>
+      <Route path="/QandAInsert" element={<QandAInsert />}></Route>
+      <Route path="/QandAUpdate" element={<QandAUpdate />}></Route>
+      <Route path="/QandASelectOne" element={<QandASelectOne />}></Route>
     </Routes>
   );
 }
@@ -375,7 +376,7 @@
     icon: <EqualizerIcon sx={{ fontSize: 20, marginRight: 1 }} />,
   },
   {
-    title: "Q&A",
+    title: "문의하기",
     path: "/QandASelect",
     icon: (
       <ContactSupportIcon
@@ -389,8 +390,10 @@
     <Routes>
       <Route path="/GuardianStatistics" element={<GuardianStatistics />}></Route>
       <Route path="/Main" element={<Main_guardian />}></Route>
+      <Route path="/QandAInsert" element={<QandAInsert />}></Route>
       <Route path="/QandASelect" element={<QandASelect />}></Route>
-      
+      <Route path="/QandASelectOne" element={<QandASelectOne />}></Route>
+      <Route path="/QandAUpdate" element={<QandAUpdate />}></Route>
     </Routes>
   );
 }
client/views/pages/AppStore.jsx
--- client/views/pages/AppStore.jsx
+++ client/views/pages/AppStore.jsx
@@ -15,10 +15,44 @@
 //로그인 정보 변경
 const { setLoginUser } = loginUser.actions;
 
+
+//특정 로그인 유저의 대상자(시니어)목록 정보
+const seniorList = createSlice({
+    name: 'createSlice',
+    initialState: [],
+    reducers: {
+        setSeniorList(stats, action) {
+            for (let key in action.payload) {
+                stats[key] = action.payload[key];
+            }
+        }
+    }
+})
+//특정 로그인 유저의 대상자(시니어)목록 정보 변경
+const { setSeniorList } = seniorList.actions;
+
+
+//특정 로그인 유저가 지정한 조회 할 대상자(시니어) Index
+const currentSeniorIndex = createSlice({
+    name: 'createSlice',
+    initialState: 0,
+    reducers: {
+        setCurrentSeniorIndex(stats, action) {
+            for (let key in action.payload) {
+                stats[key] = action.payload[key];
+            }
+        }
+    }
+})
+//특정 로그인 유저가 지정한 조회 할 대상자(시니어) Index 변경
+const { setCurrentSeniorIndex } = currentSeniorIndex.actions;
+
 export default configureStore({
     reducer: {
         loginUser: loginUser.reducer,
+        seniorList: seniorList.reducer,
+        currentSeniorIndex: currentSeniorIndex.reducer,
     }
 })
 
-export { setLoginUser };
(No newline at end of file)
+export { setLoginUser, setSeniorList, setCurrentSeniorIndex };
(No newline at end of file)
client/views/pages/callcenter/QandAInsert.jsx
--- client/views/pages/callcenter/QandAInsert.jsx
+++ client/views/pages/callcenter/QandAInsert.jsx
@@ -1,115 +1,455 @@
 import React from "react";
-import Button from "../../component/Button.jsx";
+import { useNavigate, useLocation } from "react-router";
+import { useSelector } from "react-redux";
+
+import Modal from "../../component/Modal.jsx";
 import ContentTitle from "../../component/ContentTitle.jsx";
 import SubTitle from "../../component/SubTitle.jsx";
-import { useNavigate } from "react-router";
+import Pagination from "../../component/Pagination.jsx";
+
+import CommonUtil from "../../../resources/js/CommonUtil.js";
 
 export default function QandAInsert() {
-  const navigate = useNavigate();
+    const navigate = useNavigate();
+    const location = useLocation();
+
+    //전역 변수 저장 객체
+    const state = useSelector((state) => {return state});
+    const defaultGovernmentId = CommonUtil.isEmpty(state.loginUser) ? null : state.loginUser['government_id'];
+	const defaultAgencyId = CommonUtil.isEmpty(state.loginUser) ? null : state.loginUser['agency_id'];
+	let defaultSeniorId = null;
+	if (CommonUtil.isEmpty(state.loginUser) == false) {
+		if (state.loginUser['authority'] == 'ROLE_SENIOR') {
+			defaultSeniorId = state.loginUser['user_id'];
+		} else if (state.loginUser['authority'] == 'ROLE_GUARDIAN' && CommonUtil.isEmpty(state.seniorList) == false) {
+			defaultSeniorId = state.seniorList[state.currentSeniorIndex]['user_id'];
+		}
+	} else {
+		defaultSeniorId = null;
+	}
+
+	// 시스템 코드 - 장비 상태
+	const [equipmentStates, setEquipmentStates] = React.useState({});
+	// 시스템 코드 - 장비 상태 조회
+	const equipmentStatesSelect = () => {
+		console.log('equipmentStatesSelect Function Run');
+
+		//fetch post
+		fetch("/common/systemCode/equipmentStatesSelect.json", {
+			method: "POST",
+			headers: {
+				'Content-Type': 'application/json; charset=UTF-8'
+			},
+			body: JSON.stringify({})
+		}).then((response) => response.json()).then((data) => {
+			console.log('equipmentStatesSelect response : ', data);
+			setEquipmentStates(data);
+		}).catch((error) => {
+			console.log('equipmentStatesSelect error : ', error);
+		});
+	}
+	
+
+	//입고 및 미대여 장비 검색 정보
+	const [equipmentSearch, setEquipmentSearch] = React.useState({
+		'government_id': defaultGovernmentId,
+		'agency_id': defaultAgencyId,
+		'senior_id': defaultSeniorId,
+		'currentPage': 1,
+		'perPage': 10,
+		'searchType': null,
+		'searchText': null,
+
+		'equipment_state': null,
+	});
+	//장비 정보 변경
+	const equipmentSearchChange = (targetKey, value) => {
+		equipmentSearch[targetKey] = value;
+		setEquipmentSearch({...equipmentSearch});
+	}
+	//장비 검색
+	const equipmentSearching = () => {
+		equipmentSelectList(1);
+	}
+	const equipmentSearchingEnter = (key) => {
+		if (key == 'Enter') {
+			equipmentSearching();
+		} else {
+			return;
+		}
+	}
+	//입고 및 미대여 목록
+	const [equipment, setEquipment] = React.useState({equipmentList: [], equipmentListCount: 0});
+	//입고 및 미대여 목록 조회
+	const equipmentSelectList = (currentPage) => {
+		equipmentSearch.currentPage = CommonUtil.isEmpty(currentPage) ? 1 : currentPage;
+		setEquipmentSearch({...equipmentSearch});
+
+		fetch("/equipment/equipmentSelectList.json", {
+			method: "POST",
+			headers: {
+				'Content-Type': 'application/json; charset=UTF-8'
+			},
+			body: JSON.stringify(equipmentSearch)
+		}).then((response) => response.json()).then((data) => {
+			console.log('equipmentSelectList response : ', data);
+			setEquipment(data);
+			if (CommonUtil.isEmpty(data.equipmentList) == false && equipmentInquiry['equipment_serial_number'] == '') {
+				equipmentInquirySelect(data.equipmentList[0]);
+			}
+		}).catch((error) => {
+			console.log('equipmentSelectList error : ', error);
+		});
+	}
+
+	//장비 모달 여부
+	const [modalEquipmentIsOpen, setModalEquipmentIsOpen] = React.useState(false);
+	//장비 오픈
+	const modalEquipmentOpen = () => {
+		setModalEquipmentIsOpen(true);
+	};
+	//장비 닫기
+	const modalEquipmentClose = () => {
+		setModalEquipmentIsOpen(false);
+	};
+
+	const equipmentInit = {
+		'equipment_serial_number': null,
+		'equipment_name': null,
+		'agency_name': null,
+		'rental_detail_insert_user_name': null,
+		'rental_detail_insert_user_id': null,
+		'user_name': null,
+		'user_id': null,
+		'user_address': null,
+		'equipment_state': null,
+	}
+	//등록할 문의 정보
+	const [equipmentInquiry, setEquipmentInquiry] = React.useState({
+        'inquiry_idx': 0,
+        'inquiry_type': null,
+        'inquiry_title': null,
+        'inquiry_content': null,
+        'inquiry_state': null,
+        'inquiry_insert_user_id': null,
+        'inquiry_insert_datetime': null,
+        'inquiry_answer_content': null,
+        'inquiry_answer_user_id': null,
+        'inquiry_update_datetime': null,
+
+		'equipment_serial_number': null,
+		//문의할 장비 정보
+		equipment: {...equipmentInit}
+    });
+	const equipmentInquiryRef = React.useRef({...equipmentInquiry});
+
+	//문의할 장비 선택
+	const equipmentInquirySelect = (equipment) => {
+		equipmentInquiry.equipment = equipment;
+		equipmentInquiry['equipment_serial_number'] = equipment['equipment_serial_number'];
+		setEquipmentInquiry({...equipmentInquiry});
+	}
+
+	//문의할 장비 선택 취소
+	const equipmentInquirySelectCancel = () => {
+		equipmentInquiry['equipment_serial_number'] = '';
+		equipmentInquiry.equipment = {...equipmentInit};
+		
+		setEquipmentInquiry({...equipmentInquiry});
+	}
+
+	//등록할 문의 구분이 '장비문의'로 바꼈을 때만 작동
+	React.useEffect(() => {
+		if (equipmentInquiry['equipment_serial_number'] == '') {
+			equipmentInquiry['inquiry_type'] = '기타';
+			setEquipmentInquiry({...equipmentInquiry});
+		} else if (equipmentInquiry['equipment_serial_number'] == null) {
+			equipmentInquiry.equipment = {...equipmentInit};
+			equipmentInquiry['inquiry_type'] = null;
+			setEquipmentInquiry({...equipmentInquiry});
+		}
+	}, [equipmentInquiry['equipment_serial_number']]);
+
+	//등록할 문의 구분이 '장비문의 구분'이 바꼈을 때만 작동
+	React.useEffect(() => {
+		if (equipmentInquiry['equipment_serial_number'] == ''
+			&& (equipmentInquiry['inquiry_type'] == '교환'
+				|| equipmentInquiry['inquiry_type'] == '수리')) {
+			equipmentSelectList(1);
+		} else if (CommonUtil.isEmpty(equipmentInquiry['equipment_serial_number']) == false
+					&& equipmentInquiry['inquiry_type'] == '추가') {
+			equipmentInquirySelectCancel();
+		}
+	}, [equipmentInquiry['inquiry_type']]);
+
+
+	//문의 등록 유효성 검사
+	const equipmentInquiryValidation = () => {
+		const target = equipmentInquiry;
+		const targetRef = equipmentInquiryRef;
+		if (CommonUtil.isEmpty(target['inquiry_title']) == true) {
+			targetRef.current['inquiry_title'].focus();
+			alert("문의제목을 입력해 주세요.");
+			return false;
+		}
+		if (CommonUtil.isEmpty(target['inquiry_content']) == true) {
+			targetRef.current['inquiry_content'].focus();
+			alert("내용을 입력해 주세요.");
+			return false;
+		}
+		if ((equipmentInquiry['inquiry_type'] == '교환' || equipmentInquiry['inquiry_type'] == '수리')
+			&& CommonUtil.isEmpty(target['equipment_serial_number'])) {
+			alert(`장비 ${equipmentInquiry['inquiry_type']}은(는) 장비 정보를 필수로 선택하셔야 됩니다.`);
+			return false;
+		}
+
+		return true;
+	}
+
+	//문의 등록
+	const equipmentInquiryInsert = () => {
+		if (equipmentInquiryValidation() == false) {
+			return;
+		}
+
+		if (equipmentInquiry['equipment_serial_number'] == '') {
+			equipmentInquiry['equipment_serial_number'] = null;
+		}
+
+		fetch("/equipment/equipmentInquiryInsert.json", {
+			method: "POST",
+			headers: {
+				'Content-Type': 'application/json; charset=UTF-8'
+			},
+			body: JSON.stringify(equipmentInquiry),
+		}).then((response) => response.json()).then((data) => {
+			console.log("문의 등록 결과(건수) : ", data);
+			if (data > 0) {
+				alert("등록완료");
+				navigate('/QandASelect');
+			} else {
+				alert("등록에 실패하였습니다. 관리자에게 문의바랍니다.");
+			}
+		}).catch((error) => {
+			console.log('equipmentInquiryInsert() /equipment/equipmentInquiryInsert.json error : ', error);
+		});
+	}
+
+
+
+	React.useEffect(() => {
+		equipmentStatesSelect();
+	}, [])
+
   return (
     <main>
-      <div className="content-wrap row">
-        <ContentTitle contentTitle={"문의글 작성"} />
-        <SubTitle explanation={"작성자 정보"} />
-        <table className="margin-bottom2 qna-insert senior-detail">
-          <tr>
-            <th>작성자</th>
-            <td>
-              <input type="text" placeholder="자동입력부분" />
-            </td>
-          </tr>
+		
+		<Modal open={modalEquipmentIsOpen} close={modalEquipmentClose} header="문의대상 장비 선택">
+			<div className="board-wrap">
+				<div>
+					
+					<div className="search-management flex-end margin-bottom2 margin-top gap">						
+						<select style={{maxWidth: '150px'}}
+							onChange={(e) => equipmentSearchChange('equipment_state', e.target.value)}>
+							<option value="">상태</option>
+							{Object.keys(equipmentStates).map((key, idx) => { return ( 
+								<option key={key} value={key}>
+									{equipmentStates[key]}
+								</option>
+							)})}
+						</select>
+						<select style={{maxWidth: '150px'}}
+							onChange={(e) => equipmentSearchChange('searchType', e.target.value)}>
+							<option value="">전체</option>
+							<option value="equipment_name">모델명</option>
+							<option value="equipment_serial_number">시리얼넘버</option>
+						</select>
+						<input type="text"
+							value={equipmentSearch.searchText}
+							onChange={(e) => equipmentSearchChange('searchText', e.target.value)}
+							onKeyUp={(e) => equipmentSearchingEnter(e.key)}
+						/>
+						<button className={"btn-small gray-btn"} style={{maxWidth: '150px'}} onClick={equipmentSearching}>검색</button>
+					</div>
 
-          <tr>
-            <th>소속 기관</th>
-            <td colSpan={3}>
-              <input type="text" placeholder="자동입력부분" />
-            </td>
-          </tr>
-          <tr>
-            <th>연락처</th>
-            <td colSpan={3}>
-              <input type="text" placeholder="자동입력부분" />
-            </td>
-          </tr>
-          <tr>
-            <th>구분</th>
-            <td colSpan={3} className="flex">
-              <select name="year" id="year">
-                {/* <option value="">반납</option> */}
-                <option value="">교환</option>
-                <option value="">수리</option>
-                {/* <option value="">추가</option> */}
-                <option value="">기타</option>
-              </select>
-            </td>
-          </tr>
-          <tr>
-              <th>내용</th>
-              <td colSpan={3}>
-                <textarea className="medicine" cols="30" rows="2"></textarea>
-              </td>
-            </tr>
-        </table>
-        <SubTitle explanation={"대상자 정보"} />
-        <table className="margin-bottom2 qna-insert senior-detail">
-          <tr>
-            <th>대상자 선택</th>
-            <td colSpan={3} className="flex width">
-              <select>
-                <option value="">대상자1</option>
-                <option value="">대상자2</option>
-              </select>
-            </td>
-          </tr>
-          <tr>
-            <th>대상자 이름</th>
-            <td>
-              <input type="text" placeholder="자동입력부분" />
-            </td>
-            <th>대상자 등록번호</th>
-            <td>
-              <input type="text" placeholder="자동입력부분" />
-            </td>
-          </tr>
-          <tr>
-            <th>대상자 연락처</th>
-            <td>
-              <input type="text" placeholder="자동입력부분" />
-            </td>
-            <th>대상자 주소</th>
-            <td>
-              <input type="text" placeholder="자동입력부분" />
-            </td>
-          </tr>
-          <tr>
-            <th>장비명</th>
-            <td>
-              <input type="text" placeholder="자동입력부분" />
-            </td>
-            <th>장비시리얼넘버</th>
-            <td>
-              <input type="text" placeholder="자동입력부분" />
-            </td>
-          </tr>
-        </table>
-       
-        <div className="btn-wrap flex-center">
-          <Button
-            className={"btn-large gray-btn"}
-            btnName={"이전"}
-            onClick={() => {
-              navigate("/QandASelect");
-            }}
-          />
-          <Button
-            className={"btn-large red-btn"}
-            btnName={"등록"}
-            onClick={() => {
-              navigate("/QandASelect");
-            }}
-          />
-        </div>
-      </div>
-    </main>
+					<table class="caregiver-user protector-user">
+						<thead>
+							<tr>
+								<th>No</th>
+								<th>장비사용대상자</th>
+								<th>모델명</th>
+								<th>시리얼넘버</th>
+								<th>장비상태</th>
+								<th>기관</th>
+								<th>선택</th>
+							</tr>
+						</thead>
+						<tbody>
+							{equipment.equipmentList.map((item, idx) => { return (
+							<tr>
+								<td data-label="No">{equipment.equipmentListCount - idx - (equipmentSearch.currentPage - 1) * equipmentSearch.perPage}</td>
+								<td data-label="장비사용대상자">
+									{item['user_id'] == null ? '미대여' : item['user_name']}
+								</td>
+								<td data-label="모델명">{item['equipment_name']}</td>
+								<td data-label="시리얼넘버">{item['equipment_serial_number']}</td>
+								<td data-label="장비상태">{equipmentStates[item['equipment_state']]}</td>
+								<td>
+									{item['agency_id'] == null ? item['government_name'] : item['agency_name']}
+								</td>
+								<td data-label="대여시행자">
+									{equipmentInquiry.equipment['equipment_serial_number'] != item['equipment_serial_number']
+										? <button className={"btn-small gray-btn"} style={{maxWidth: '150px'}}
+										onClick={() => {equipmentInquirySelect(item); modalEquipmentClose();}}>선택</button>
+										: <button className={"btn-small red-btn"} style={{maxWidth: '150px'}}
+										onClick={() => {equipmentInquirySelectCancel(); modalEquipmentClose();}}>취소</button>
+									}
+								</td>
+							</tr>
+							)})}
+							{CommonUtil.isEmpty(equipment.equipmentList) ?
+							<tr>
+								<td colSpan={7}>조회된 데이터가 없습니다</td>
+							</tr>
+							: null}
+						</tbody>
+					</table>
+					<Pagination
+						currentPage={equipmentSearch.currentPage}
+						perPage={equipmentSearch.perPage}
+						totalCount={equipment.equipmentListCount}
+						maxRange={5}
+						click={equipmentSelectList}
+					/>
+				</div>
+			</div>
+		</Modal>
+
+		<div className="content-wrap row">
+			<ContentTitle contentTitle={"문의글 작성"} className={"margin-bottom2"} />
+			<SubTitle explanation={"문의 정보"} className={"margin-bottom2"}/>
+			<table className="margin-bottom2 qna-insert senior-detail">
+				<tr>
+					<th><span style={{color : "red"}}>*</span>구분</th>
+					<td colSpan={3}>
+						<div className="gender flex-start gap5">
+							<div className="flex-start">
+								<input type="radio" id="normal_question" name="question_type" value="일반문의" style={{width: '25px'}}
+									checked={equipmentInquiry['equipment_serial_number'] == null}
+									onChange={(e) => {equipmentInquiry['equipment_serial_number'] = null; setEquipmentInquiry({...equipmentInquiry});}}/>
+								<label for="normal_question">일반문의</label>
+							</div>
+							<div className="flex-start">
+								<input type="radio" id="equipment_question" name="question_type" value="장비문의" style={{width: '25px'}}
+									checked={equipmentInquiry['equipment_serial_number'] != null}
+									onChange={(e) => {equipmentInquiry['equipment_serial_number'] = ''; setEquipmentInquiry({...equipmentInquiry});}}/>
+								<label for="equipment_question" >장비문의</label>
+							</div>
+						</div>
+					</td>
+				</tr>
+				{equipmentInquiry['equipment_serial_number'] != null ?
+				<tr>
+					<th><span style={{color : "red"}}>*</span>장비문의 구분</th>
+					<td colSpan={3}>
+						<select onChange={(e) => {equipmentInquiry['inquiry_type'] = e.target.value; setEquipmentInquiry({...equipmentInquiry});}}>
+							<option selected={equipmentInquiry['inquiry_type'] == '수리'}>수리</option>
+							<option selected={equipmentInquiry['inquiry_type'] == '교환'}>교환</option>
+							<option selected={equipmentInquiry['inquiry_type'] == '추가'}>추가</option>
+							<option selected={equipmentInquiry['inquiry_type'] == '기타'}>기타</option>
+						</select>
+					</td>
+				</tr>
+				: null}
+				<tr>
+					<th><span style={{color : "red"}}>*</span>문의제목</th>
+					<td colSpan={3}>
+						<input type="text" placeholder="문의글의 제목을 입력해주세요."
+							onChange={(e) => {equipmentInquiry['inquiry_title'] = e.target.value; setEquipmentInquiry({...equipmentInquiry});}}
+							ref={el => equipmentInquiryRef.current['inquiry_title'] = el}
+						/>
+					</td>
+				</tr>
+				<tr>
+					<th><span style={{color : "red"}}>*</span>내용</th>
+					<td colSpan={3}>
+						<textarea className="medicine" cols="30" rows="2"
+							onChange={(e) => {equipmentInquiry['inquiry_content'] = e.target.value; setEquipmentInquiry({...equipmentInquiry});}}
+							ref={el => equipmentInquiryRef.current['inquiry_content'] = el}
+						></textarea>
+					</td>
+				</tr>
+			</table>
+			
+			{equipmentInquiry['equipment_serial_number'] != null
+			?<>
+				<SubTitle explanation={equipmentInquiry['inquiry_type'] == '교환' || equipmentInquiry['inquiry_type'] == '수리'
+					? <span>장비 정보 <span style={{color : "red"}}>(필수)</span></span>
+					: <span>장비 정보 (선택)</span>
+				} className={"display-inline-block margin-bottom2"}/>
+				<button className={"btn-small gray-btn"} style={{maxWidth: '150px'}} onClick={() => {equipmentSelectList(1); modalEquipmentOpen();}}>검색</button>
+				{CommonUtil.isEmpty(equipmentInquiry.equipment['equipment_serial_number']) == false ?
+				<>
+					<button className={"btn-small red-btn"} style={{maxWidth: '150px'}} onClick={equipmentInquirySelectCancel}>취소</button>
+					<table className="margin-bottom2 qna-insert senior-detail">
+						<tr>
+							<th>장비 시리얼넘버</th>
+							<td colSpan={3}>
+								{equipmentInquiry.equipment['equipment_serial_number']} 
+							</td>
+						</tr>
+						<tr>
+							<th>모델명</th>
+							<td>
+								{equipmentInquiry.equipment['equipment_name']}
+							</td>
+							<th>장비상태</th>
+							<td>
+								{equipmentStates[equipmentInquiry.equipment['equipment_state']]}
+							</td>
+						</tr>
+						<tr>
+							<th>소속기관</th>
+							<td>
+								{equipmentInquiry.equipment['agency_id'] == null ? equipmentInquiry.equipment['government_name'] : equipmentInquiry.equipment['agency_name']}
+							</td>
+							<th>대여시행자</th>
+							<td>
+								{CommonUtil.isEmpty(equipmentInquiry.equipment['equipment_serial_number']) == false
+								&& CommonUtil.isEmpty(equipmentInquiry.equipment['rental_detail_insert_user_id']) == false
+									? <>
+										{equipmentInquiry.equipment['rental_detail_insert_user_name']}
+										({equipmentInquiry.equipment['rental_detail_insert_user_id']})
+									</>
+								: '미대여'}
+							</td>
+						</tr>
+						<tr>
+							<th>장비사용대상자</th>
+							<td>
+								{equipmentInquiry.equipment['user_id'] == null ? '미대여' : equipmentInquiry.equipment['user_name']}
+							</td>
+							<th>대상자 ID</th>
+							<td>
+								{equipmentInquiry.equipment['user_id'] == null ? '미대여' : equipmentInquiry.equipment['user_id']}
+							</td>
+						</tr>
+						<tr>
+							<th>대상자 주소</th>
+							<td colSpan={3}>
+								{equipmentInquiry.equipment['user_id'] == null ? '미대여' : equipmentInquiry.equipment['user_address']}
+							</td>
+						</tr>
+					</table>
+				</>: null}
+			</>: null}
+		
+			<div className="btn-wrap flex-center margin-top5">
+				<button className="btn-large gray-btn" onClick={() => navigate(-1)}>취소</button>
+				<button className="btn-large red-btn" onClick={() => equipmentInquiryInsert()}>등록</button>
+			</div>
+
+		</div>
+	</main>
   );
 }
client/views/pages/callcenter/QandASelect.jsx
--- client/views/pages/callcenter/QandASelect.jsx
+++ client/views/pages/callcenter/QandASelect.jsx
@@ -1,101 +1,203 @@
 import React from "react";
-import Button from "../../component/Button.jsx";
-import Table from "../../component/Table.jsx";
-import Modal from "../../component/Modal.jsx";
+import { useNavigate, useLocation } from "react-router";
+import { useSelector } from "react-redux";
 import DetailTitle from "../../component/DetailTitle.jsx";
-import { useNavigate } from "react-router";
-import ContentTitle from "../../component/ContentTitle.jsx";
-import RestoreFromTrashIcon from '@mui/icons-material/RestoreFromTrash';
-import HomeRepairServiceIcon from '@mui/icons-material/HomeRepairService';
+import Pagination from "../../component/Pagination.jsx";
 
+import CommonUtil from "../../../resources/js/CommonUtil.js";
 
 export default function QandASelect() {
-  const navigate = useNavigate();
-  //게시판
-  const thead = [
-    "No",
-    "장비명",
-    "시리얼 넘버",
-    "작성자",
-    "기관명",//시행기관에서는 빼면됨
-    "요청일자",
-    "구분",
-    "처리여부",
-    "내용상세보기",
-    "삭제"
-  ];
-  const key = [
-    "No",
-    "equipment_name",
-    "serialNumber",
-    "writer",
-    "name",
-    "date",
-    "category",
-    "finish",
-    "show",
-    "delete"
-  ];
-  const content = [
-    {
-      No: (
-        <p><span><HomeRepairServiceIcon sx={{fontSize:20 }} />{thead[0]}</span> 1</p>
-      ),
-      equipment_name: 
-      (
-        <p><span>{thead[1]}</span> 스마트약상자</p>
-      ),
-      serialNumber: (
-        <p><span>{thead[2]}</span> ABCD-1</p>
-      ),
-      writer: (
-        <p><span>{thead[3]}</span> 홍길동</p>
-      ),
-      name: (
-        <p><span>{thead[4]}</span> A복지관</p>
-      ),
-      date: (
-        <p><span>{thead[5]}</span> 2023-01-27</p>
-      ),
-      category: (
-        <p><span>{thead[6]}</span> 교환</p>
-      ),
-      finish:(
-        <p><span>{thead[7]}</span> 처리중</p>
-      ),
-      show:  (
-        <Button
-          className={"btn-small lightgray-btn"}
-          btnName={"상세보기"}
-          onClick={() => {
-            navigate("/QandAConfirm");
-          }}
-        />
-      ),
-      delete: (
-        <RestoreFromTrashIcon sx={{ width: "30px", height: "30px", }} />
-      ),
-    },
+    const navigate = useNavigate();
+    const location = useLocation();
 
-  ];
-  return (
-    <main>
-      <div className="content-wrap">
-      <DetailTitle contentTitle={"장비 문의 요청"} />
-        <div className="board-wrap" style={{ marginTop: "3rem" }} >
-          <div className="btn-wrap flex-end margin-bottom">
-            
-            <Button
-              className={"btn-small gray-btn"}
-              btnName={"등록"}
-              onClick={() => {
-                navigate("/QandAInsert");
-              }}
-            />            
-          </div>
-          <Table className="equipment-detail senior-table" head={thead} contents={content} contentKey={key} />
-        </div>
-      </div>
-    </main>
-  );
+    //전역 변수 저장 객체
+    const state = useSelector((state) => {return state});
+    const defaultGovernmentId = CommonUtil.isEmpty(state.loginUser) ? null : state.loginUser['government_id'];
+	const defaultAgencyId = CommonUtil.isEmpty(state.loginUser) ? null : state.loginUser['agency_id'];
+    const defaultUserId = CommonUtil.isEmpty(state.loginUser) == false
+                        && (state.loginUser['authority'] == 'ROLE_SENIOR'
+                            || state.loginUser['authority'] == 'ROLE_GUARDIAN')
+                        ? state.loginUser['user_id'] : null;
+
+
+	//기관 계층 구조 목록
+	const [orgListOfHierarchy, setOrgListOfHierarchy] = React.useState([]);
+	//기관(관리, 시행) 계층 구조 목록 조회
+	const orgSelectListOfHierarchy = () => {
+        const param = {
+            'government_id': defaultGovernmentId,
+            'agency_id': defaultAgencyId
+        }
+        if (CommonUtil.isEmpty(state.loginUser) == false
+            && state.loginUser['authority'] == 'ROLE_ADMIN') {
+            param['government_id'] = null;
+            param['agency_id'] = null;
+        }
+
+		fetch("/org/orgSelectListOfHierarchy.json", {
+			method: "POST",
+			headers: {
+			    'Content-Type': 'application/json; charset=UTF-8'
+			},
+			body: JSON.stringify(param),
+		}).then((response) => response.json()).then((data) => {
+			console.log("기관(관리, 시행) 계층 구조 목록 조회 : ", data);
+			setOrgListOfHierarchy(data);
+		}).catch((error) => {
+			console.log('orgSelectListOfHierarchy() /org/orgSelectListOfHierarchy.json error : ', error);
+		});
+	};
+
+    const [search, setSearch] = React.useState({
+        'government_id': defaultGovernmentId,
+        'agency_id': defaultAgencyId,
+        'user_id': defaultUserId,
+
+        'equipment_serial_number': null,
+        'inquiry_answer_user_id': null,
+
+        'searchType': null,
+        'searchText': null,
+        'currentPage': 0,
+        'perPage': 10,
+    });
+    const searchingEnter = (key) => {
+		if (key == 'Enter') {
+			searching();
+		} else {
+			return;
+		}
+	}
+	const searching = () => {
+		equipmentInquirySelectList(1);
+	}
+
+    //문의 목록
+    const [equipmentInquiry, setEquipmentInquiry] = React.useState({
+        equipmentInquiryList: [],
+        equipmentInquiryListCount: 0, 
+    });
+	//문의 목록 조회
+	const equipmentInquirySelectList = (currentPage) => {
+        search.currentPage = CommonUtil.isEmpty(currentPage) ? 1 : currentPage;
+		fetch("/equipment/equipmentInquirySelectList.json", {
+			method: "POST",
+			headers: {
+			    'Content-Type': 'application/json; charset=UTF-8'
+			},
+			body: JSON.stringify(search),
+		}).then((response) => response.json()).then((data) => {
+			console.log("문의 목록 조회 : ", data);
+			setEquipmentInquiry(data);
+		}).catch((error) => {
+			console.log('equipmentInquirySelectList() /equipment/equipmentInquirySelectList.json error : ', error);
+		});
+	};
+
+
+    //문의 상세조회 페이지 이동
+    const equipmentInquirySelectOnePage = (item) => {
+        navigate("/QandASelectOne", {state: {
+            'inquiry_idx': item['inquiry_idx'],
+        }});
+    }
+
+
+    React.useEffect(() => {
+        orgSelectListOfHierarchy();
+        searching();
+    }, []);
+    
+    return (
+        <main>
+            <div className="search-management flex-end margin-bottom2 margin-top gap">						
+				<select style={{maxWidth: '150px'}} value={search['equipment_serial_number']}
+					onChange={(e) => {search['equipment_serial_number'] = e.target.value; setSearch({...search});}}>
+					<option value="">문의구분</option>
+                    <option value="IS_NULL">일반문의</option>
+                    <option value="IS_NOT_NULL">장비문의</option>
+				</select>
+                <select style={{maxWidth: '150px'}} value={search['inquiry_answer_user_id']}
+					onChange={(e) => {search['inquiry_answer_user_id'] = e.target.value; setSearch({...search});}}>
+					<option value="">상태</option>
+                    <option value="IS_NULL">답변대기중</option>
+                    <option value="IS_NOT_NULL">답변완료</option>
+				</select>
+				<select style={{maxWidth: '150px'}} value={search['searchType']}
+					onChange={(e) => {search['searchType'] = e.target.value; setSearch({...search});}}>
+					<option value="">전체</option>
+					<option value="user_name">문의자 이름</option>
+					<option value="user_id">문의자 ID</option>
+                    <option value="user_phonenumber">문의자 연락처</option>
+                    <option value="inquiry_title">제목</option>
+                    <option value="inquiry_content">문의내용</option>
+                    <option value="inquiry_answer_content">답변내용</option>
+                    <option value="equipment_serial_number">시리얼 넘버</option>
+				</select>
+				<input type="text"
+					value={search['searchText']}
+					onChange={(e) => {search['searchText'] = e.target.value; setSearch({...search});}}
+					onKeyUp={(e) => searchingEnter(e.key)}
+				/>
+				<button className="btn-small gray-btn" style={{maxWidth: '150px'}} onClick={searching}>검색</button>
+			</div>
+
+            <div className="content-wrap">
+                <DetailTitle contentTitle={"Q&A"} />
+                <div className="board-wrap" style={{ marginTop: "3rem" }} >
+                    {CommonUtil.isEmpty(state.loginUser) == false && state.loginUser['authority'] != 'ROLE_ADMIN' ?
+                        <div className="btn-wrap flex-end margin-bottom">
+                            <button className="btn-small gray-btn" onClick={() => {navigate("/QandAInsert");}}>문의하기</button>
+                        </div>
+                    : null}
+                    <table class="equipment-detail senior-table">
+                        <thead>
+                            <tr>
+                                <th>No</th>
+                                <th>관리기관</th>
+                                <th>시행기관</th>
+                                <th>제목</th>
+                                <th>작성자</th>
+                                <th>작성일시</th>
+                                <th>문의구분</th>
+                                <th>처리여부</th>
+                            </tr>
+                        </thead>
+                        <tbody>
+                            {equipmentInquiry.equipmentInquiryList.map((item, idx) => { return (
+                            <tr key={idx} onClick={() => equipmentInquirySelectOnePage(item)}>
+                                <td data-label="No">{equipmentInquiry.equipmentInquiryListCount - idx - (search.currentPage - 1) * search.perPage}</td>
+                                <td data-label="관리기관">{item['insert_user_government_name']}</td>
+                                <td data-label="시행기관">{item['insert_user_agency_name']}</td>
+                                <td data-label="제목">{item['inquiry_title']}</td>
+                                <td data-label="작성자">{item['insert_user_name']}</td>
+                                <td data-label="작성일시">{item['inquiry_insert_datetime']}</td>
+                                <td data-label="문의구분">
+                                    {CommonUtil.isEmpty(item['inquiry_type']) == false ? `장비(${item['inquiry_type']})` : '일반문의'}
+                                </td>
+                                <td data-label="처리여부">
+                                    {CommonUtil.isEmpty(item['inquiry_answer_user_id']) == false ? '답변완료' : '답변대기중'}
+                                </td>
+                            </tr>
+                            )})}
+                            {CommonUtil.isEmpty(equipmentInquiry.equipmentInquiryList) ?
+                            <tr>
+                                <td colSpan={8}>조회된 데이터가 없습니다</td>
+                            </tr>
+                            : null}
+                        </tbody>
+                    </table>
+                    <Pagination
+                        currentPage={search.currentPage}
+                        perPage={search.perPage}
+                        totalCount={equipmentInquiry.equipmentInquiryListCount}
+                        maxRange={5}
+                        click={equipmentInquirySelectList}
+                    />
+                    
+                </div>
+            </div>
+        </main>
+    );
 }
+
 
client/views/pages/callcenter/QandASelectOne.jsx (added)
+++ client/views/pages/callcenter/QandASelectOne.jsx
@@ -0,0 +1,360 @@
+import React from "react";
+import { useNavigate, useLocation } from "react-router";
+import { useSelector } from "react-redux";
+
+import Modal from "../../component/Modal.jsx";
+import ContentTitle from "../../component/ContentTitle.jsx";
+import SubTitle from "../../component/SubTitle.jsx";
+import Pagination from "../../component/Pagination.jsx";
+
+import CommonUtil from "../../../resources/js/CommonUtil.js";
+
+export default function QandASelectOne() {
+    const navigate = useNavigate();
+    const location = useLocation();
+
+    //전역 변수 저장 객체
+    const state = useSelector((state) => {return state});
+    const defaultGovernmentId = CommonUtil.isEmpty(state.loginUser) ? null : state.loginUser['government_id'];
+	const defaultAgencyId = CommonUtil.isEmpty(state.loginUser) ? null : state.loginUser['agency_id'];
+	let defaultSeniorId = null;
+	if (CommonUtil.isEmpty(state.loginUser) == false) {
+		if (state.loginUser['authority'] == 'ROLE_SENIOR') {
+			defaultSeniorId = state.loginUser['user_id'];
+		} else if (state.loginUser['authority'] == 'ROLE_GUARDIAN' && CommonUtil.isEmpty(state.seniorList) == false) {
+			defaultSeniorId = state.seniorList[state.currentSeniorIndex]['user_id'];
+		}
+	} else {
+		defaultSeniorId = null;
+	}
+
+	//권한 타입 종류
+	const [authorities, setAuthorities] = React.useState([]);
+	//권한 타입 종류 목록 조회
+	const authoritiesSelect = () => {
+	  fetch("/common/systemCode/authoritiesSelect.json", {
+		method: "POST",
+		headers: {
+		  'Content-Type': 'application/json; charset=UTF-8'
+		},
+		body: JSON.stringify({}),
+	  }).then((response) => response.json()).then((data) => {
+		console.log("권한 타입 종류 목록 조회 : ", data);
+		setAuthorities(data);
+	  }).catch((error) => {
+		console.log('authoritiesSelect() /common/systemCode/authoritiesSelect.json error : ', error);
+	  });
+	};
+
+	// 시스템 코드 - 장비 상태
+	const [equipmentStates, setEquipmentStates] = React.useState({});
+	// 시스템 코드 - 장비 상태 조회
+	const equipmentStatesSelect = () => {
+		console.log('equipmentStatesSelect Function Run');
+
+		//fetch post
+		fetch("/common/systemCode/equipmentStatesSelect.json", {
+			method: "POST",
+			headers: {
+				'Content-Type': 'application/json; charset=UTF-8'
+			},
+			body: JSON.stringify({})
+		}).then((response) => response.json()).then((data) => {
+			console.log('equipmentStatesSelect response : ', data);
+			setEquipmentStates(data);
+		}).catch((error) => {
+			console.log('equipmentStatesSelect error : ', error);
+		});
+	}
+
+
+	const equipmentInit = {
+		'equipment_serial_number': null,
+		'equipment_name': null,
+		'agency_name': null,
+		'rental_detail_insert_user_name': null,
+		'rental_detail_insert_user_id': null,
+		'user_name': null,
+		'user_id': null,
+		'user_address': null,
+		'equipment_state': null,
+	}
+	//문의 정보
+	const [equipmentInquiry, setEquipmentInquiry] = React.useState({
+        'inquiry_idx': location.state['inquiry_idx'],
+        'inquiry_type': null,
+        'inquiry_title': null,
+        'inquiry_content': null,
+        'inquiry_state': null,
+        'inquiry_insert_user_id': null,
+        'inquiry_insert_datetime': null,
+        'inquiry_answer_content': null,
+        'inquiry_answer_user_id': null,
+        'inquiry_update_datetime': null,
+
+		'equipment_serial_number': null,
+		//문의할 장비 정보
+		equipment: {...equipmentInit}
+    });
+	const equipmentInquiryRef = React.useRef({...equipmentInquiry})
+
+	//문의 상세 조회
+	const equipmentInquirySelectOne = () => {
+		fetch("/equipment/equipmentInquirySelectOne.json", {
+			method: "POST",
+			headers: {
+				'Content-Type': 'application/json; charset=UTF-8'
+			},
+			body: JSON.stringify(equipmentInquiry),
+		}).then((response) => response.json()).then((data) => {
+			console.log("문의 상세 조회 결과 : ", data);
+			setEquipmentInquiry(data);
+		}).catch((error) => {
+			console.log('equipmentInquirySelectOne() /equipment/equipmentInquirySelectOne.json error : ', error);
+		});
+	}
+
+
+	//문의 수정 페이지 이동
+    const equipmentInquiryUpdatePage = () => {
+        navigate("/QandAUpdate", {state: {
+            'inquiry_idx': location.state['inquiry_idx'],
+        }})
+    }
+
+
+
+
+	//문의 답변 등록
+	const equipmentInquiryAnswerUpdate = () => {
+		if (CommonUtil.isEmpty(equipmentInquiry['inquiry_answer_content'])) {
+			equipmentInquiryRef.current['inquiry_answer_content'].focus();
+			alert("답변을 입력해주세요.");
+
+			equipmentInquiry['inquiry_answer_content'] = "[접수완료] 문제를 조속히 처리하여 불편을 해결해드릴 수 있도록 하겠습니다. ";
+			setEquipmentInquiry({...equipmentInquiry});
+
+			return;
+		}
+
+		if (confirm("해당 문의글의 답변을 등록하시겠습니까?") == false) {
+			return;
+		}
+
+		fetch("/equipment/equipmentInquiryAnswerUpdate.json", {
+			method: "POST",
+			headers: {
+				'Content-Type': 'application/json; charset=UTF-8'
+			},
+			body: JSON.stringify(equipmentInquiry),
+		}).then((response) => response.json()).then((data) => {
+			console.log("문의 답변 등록 결과(건수) : ", data);
+			if (data > 0) {
+				alert("답변 등록완료");
+				navigate('/QandASelect');
+			} else {
+				alert("답변 등록에 실패하였습니다. 관리자에게 문의바랍니다.");
+			}
+		}).catch((error) => {
+			console.log('equipmentInquiryAnswerUpdate() /equipment/equipmentInquiryAnswerUpdate.json error : ', error);
+		});
+	}
+
+	//문의 삭제
+	const equipmentInquiryDelete = () => {
+		if (confirm('해당 문의글을 삭제하시겠습니까?') == false) {
+			return;
+		}
+
+		fetch("/equipment/equipmentInquiryDelete.json", {
+			method: "POST",
+			headers: {
+				'Content-Type': 'application/json; charset=UTF-8'
+			},
+			body: JSON.stringify(equipmentInquiry),
+		}).then((response) => response.json()).then((data) => {
+			console.log("문의 삭제 결과(건수) : ", data);
+			if (data > 0) {
+				alert("삭제완료");
+				navigate('/QandASelect');
+			} else {
+				alert("삭제에 실패하였습니다. 관리자에게 문의바랍니다.");
+			}
+		}).catch((error) => {
+			console.log('equipmentInquiryDelete() /equipment/equipmentInquiryDelete.json error : ', error);
+		});
+	}
+
+
+	//장비 관리 페이지 이동
+	const equipmentSelectPage = () => {
+		navigate('/EquipmentSelect', {state: {
+			searchType: 'equipment_serial_number',
+			searchText: equipmentInquiry.equipment['equipment_serial_number'],
+			tabIndex: 1,
+
+			'government_id': equipmentInquiry['insert_user_government_id']
+		}});
+	}
+
+	React.useEffect(() => {
+		authoritiesSelect();
+		equipmentStatesSelect();
+		equipmentInquirySelectOne();
+	}, [])
+
+  return (
+    <main>
+		
+		<div className="content-wrap row">
+			<ContentTitle contentTitle={"문의글 작성"} className={"margin-bottom2"} />
+			<SubTitle explanation={"문의 정보"} className={"margin-bottom2"}/>
+			<table className="margin-bottom2 qna-insert senior-detail">
+				<tr>
+					<th>구분</th>
+					<td colSpan={3}>
+						{CommonUtil.isEmpty(equipmentInquiry['equipment_serial_number']) ? '일반문의' : '장비문의'}
+					</td>
+				</tr>
+				{equipmentInquiry['equipment_serial_number'] != null ?
+				<tr>
+					<th>장비문의 구분</th>
+					<td colSpan={3}>
+						{equipmentInquiry['inquiry_type']}
+					</td>
+				</tr>
+				: null}
+				<tr>
+					<th>문의제목</th>
+					<td colSpan={3}>
+						{equipmentInquiry['inquiry_title']}
+					</td>
+				</tr>
+				<tr>
+					<th>내용</th>
+					<td colSpan={3}>
+						{equipmentInquiry['inquiry_content']}
+					</td>
+				</tr>
+				{CommonUtil.isEmpty(state.loginUser) == false
+				 && equipmentInquiry['insert_user_id'] != state.loginUser['user_id']
+				? <>
+					<tr>
+						<th>작성자</th>
+						<td>{equipmentInquiry['insert_user_name']}({equipmentInquiry['insert_user_id']})</td>
+						<th>구분</th>
+						<td>{authorities[equipmentInquiry['insert_user_authority']]}</td>
+					</tr>
+					<tr>
+						<th>관리기관</th>
+						<td>{equipmentInquiry['insert_user_government_name']}</td>
+						<th>시행기관</th>
+						<td>{equipmentInquiry['insert_user_agency_name']}</td>
+					</tr>
+					<tr>
+						<th>연락처</th>
+						<td colSpan={3}>{equipmentInquiry['insert_user_phonenumber']}</td>
+					</tr>
+				</>: null}
+			</table>
+			
+			{equipmentInquiry['equipment_serial_number'] != null
+			?<>
+				<SubTitle explanation={'장비 정보'} className={"display-inline-block margin-bottom2"}/>
+				{CommonUtil.isEmpty(equipmentInquiry.equipment['equipment_serial_number']) == false ?
+				<>
+					<table className="margin-bottom2 qna-insert senior-detail">
+						<tr>
+							<th>장비 시리얼넘버</th>
+							<td colSpan={3}>
+								{equipmentInquiry.equipment['equipment_serial_number']} 
+								{CommonUtil.isEmpty(state.loginUser) == false && state.loginUser['authority'] == 'ROLE_ADMIN'
+								 ? <button className="btn-small gray-btn margin-left2" onClick={() => equipmentSelectPage()}>관리페이지이동</button>
+								: null}
+							</td>
+						</tr>
+						<tr>
+							<th>모델명</th>
+							<td>
+								{equipmentInquiry.equipment['equipment_name']}
+							</td>
+							<th>장비상태</th>
+							<td>
+								{equipmentStates[equipmentInquiry.equipment['equipment_state']]}
+							</td>
+						</tr>
+						<tr>
+							<th>소속기관</th>
+							<td>
+								{equipmentInquiry.equipment['agency_id'] == null ? equipmentInquiry.equipment['government_name'] : equipmentInquiry.equipment['agency_name']}
+							</td>
+							<th>대여시행자</th>
+							<td>
+								{CommonUtil.isEmpty(equipmentInquiry.equipment['equipment_serial_number']) == false
+								&& CommonUtil.isEmpty(equipmentInquiry.equipment['rental_detail_insert_user_id']) == false
+									? <>
+										{equipmentInquiry.equipment['rental_detail_insert_user_name']}
+										({equipmentInquiry.equipment['rental_detail_insert_user_id']})
+									</>
+								: '미대여'}
+							</td>
+						</tr>
+						<tr>
+							<th>장비사용대상자</th>
+							<td>
+								{equipmentInquiry.equipment['user_id'] == null ? '미대여' : equipmentInquiry.equipment['user_name']}
+							</td>
+							<th>대상자 ID</th>
+							<td>
+								{equipmentInquiry.equipment['user_id'] == null ? '미대여' : equipmentInquiry.equipment['user_id']}
+							</td>
+						</tr>
+						<tr>
+							<th>대상자 주소</th>
+							<td colSpan={3}>
+								{equipmentInquiry.equipment['user_id'] == null ? '미대여' : equipmentInquiry.equipment['user_address']}
+							</td>
+						</tr>
+					</table>
+				</>: null}
+			</>: null}
+
+			{CommonUtil.isEmpty(state.loginUser) == false
+			 && state.loginUser['authority'] == 'ROLE_ADMIN'
+			? <>
+				<SubTitle explanation={'문의 답변'} className={"display-inline-block margin-bottom2"}/>
+				<table className="margin-bottom2 qna-insert senior-detail">
+					<tr>
+						<th>답변</th>
+						<td colSpan={3}>
+							<textarea className="medicine" cols="30" rows="2"
+								value={equipmentInquiry['inquiry_answer_content']}
+								onChange={(e) => {equipmentInquiry['inquiry_answer_content'] = e.target.value; setEquipmentInquiry({...equipmentInquiry});}}
+								ref={el => equipmentInquiryRef.current['inquiry_answer_content'] = el}
+							></textarea>
+						</td>
+					</tr>
+				</table>
+			</>
+			: null}
+		
+			<div className="btn-wrap flex-center margin-top5">
+				<button className="btn-large gray-btn" onClick={() => navigate(-1)}>이전</button>
+
+				{CommonUtil.isEmpty(state.loginUser) == false
+				 && equipmentInquiry['insert_user_id'] == state.loginUser['user_id']
+				 ? <button className="btn-large red-btn" onClick={() => equipmentInquiryUpdatePage()}>수정</button>
+				 : null}
+				 {CommonUtil.isEmpty(state.loginUser) == false
+				  && state.loginUser['authority'] == 'ROLE_ADMIN'
+				 ? <>
+				 	<button className="btn-large red-btn" onClick={() => equipmentInquiryAnswerUpdate()}>답변등록</button>
+					<button className="btn-large red-btn" onClick={() => equipmentInquiryDelete()}>삭제</button>
+				 </>
+				 : null}
+			</div>
+
+		</div>
+	</main>
+  );
+}
 
client/views/pages/callcenter/QandAUpdate.jsx (added)
+++ client/views/pages/callcenter/QandAUpdate.jsx
@@ -0,0 +1,500 @@
+import React from "react";
+import { useNavigate, useLocation } from "react-router";
+import { useSelector } from "react-redux";
+
+import Modal from "../../component/Modal.jsx";
+import ContentTitle from "../../component/ContentTitle.jsx";
+import SubTitle from "../../component/SubTitle.jsx";
+import Pagination from "../../component/Pagination.jsx";
+
+import CommonUtil from "../../../resources/js/CommonUtil.js";
+
+export default function QandAInsert() {
+    const navigate = useNavigate();
+    const location = useLocation();
+
+    //전역 변수 저장 객체
+    const state = useSelector((state) => {return state});
+    const defaultGovernmentId = CommonUtil.isEmpty(state.loginUser) ? null : state.loginUser['government_id'];
+	const defaultAgencyId = CommonUtil.isEmpty(state.loginUser) ? null : state.loginUser['agency_id'];
+	let defaultSeniorId = null;
+	if (CommonUtil.isEmpty(state.loginUser) == false) {
+		if (state.loginUser['authority'] == 'ROLE_SENIOR') {
+			defaultSeniorId = state.loginUser['user_id'];
+		} else if (state.loginUser['authority'] == 'ROLE_GUARDIAN' && CommonUtil.isEmpty(state.seniorList) == false) {
+			defaultSeniorId = state.seniorList[state.currentSeniorIndex]['user_id'];
+		}
+	} else {
+		defaultSeniorId = null;
+	}
+
+	// 시스템 코드 - 장비 상태
+	const [equipmentStates, setEquipmentStates] = React.useState({});
+	// 시스템 코드 - 장비 상태 조회
+	const equipmentStatesSelect = () => {
+		console.log('equipmentStatesSelect Function Run');
+
+		//fetch post
+		fetch("/common/systemCode/equipmentStatesSelect.json", {
+			method: "POST",
+			headers: {
+				'Content-Type': 'application/json; charset=UTF-8'
+			},
+			body: JSON.stringify({})
+		}).then((response) => response.json()).then((data) => {
+			console.log('equipmentStatesSelect response : ', data);
+			setEquipmentStates(data);
+		}).catch((error) => {
+			console.log('equipmentStatesSelect error : ', error);
+		});
+	}
+	
+
+	//입고 및 미대여 장비 검색 정보
+	const [equipmentSearch, setEquipmentSearch] = React.useState({
+		'government_id': defaultGovernmentId,
+		'agency_id': defaultAgencyId,
+		'senior_id': defaultSeniorId,
+		'currentPage': 1,
+		'perPage': 10,
+		'searchType': null,
+		'searchText': null,
+
+		'equipment_state': null,
+	});
+	//장비 정보 변경
+	const equipmentSearchChange = (targetKey, value) => {
+		equipmentSearch[targetKey] = value;
+		setEquipmentSearch({...equipmentSearch});
+	}
+	//장비 검색
+	const equipmentSearching = () => {
+		equipmentSelectList(1);
+	}
+	const equipmentSearchingEnter = (key) => {
+		if (key == 'Enter') {
+			equipmentSearching();
+		} else {
+			return;
+		}
+	}
+	//입고 및 미대여 목록
+	const [equipment, setEquipment] = React.useState({equipmentList: [], equipmentListCount: 0});
+	//입고 및 미대여 목록 조회
+	const equipmentSelectList = (currentPage) => {
+		equipmentSearch.currentPage = CommonUtil.isEmpty(currentPage) ? 1 : currentPage;
+		setEquipmentSearch({...equipmentSearch});
+
+		fetch("/equipment/equipmentSelectList.json", {
+			method: "POST",
+			headers: {
+				'Content-Type': 'application/json; charset=UTF-8'
+			},
+			body: JSON.stringify(equipmentSearch)
+		}).then((response) => response.json()).then((data) => {
+			console.log('equipmentSelectList response : ', data);
+			setEquipment(data);
+			if (CommonUtil.isEmpty(data.equipmentList) == false && equipmentInquiry['equipment_serial_number'] == '') {
+				equipmentInquirySelect(data.equipmentList[0]);
+			}
+		}).catch((error) => {
+			console.log('equipmentSelectList error : ', error);
+		});
+	}
+
+	//장비 모달 여부
+	const [modalEquipmentIsOpen, setModalEquipmentIsOpen] = React.useState(false);
+	//장비 오픈
+	const modalEquipmentOpen = () => {
+		setModalEquipmentIsOpen(true);
+	};
+	//장비 닫기
+	const modalEquipmentClose = () => {
+		setModalEquipmentIsOpen(false);
+	};
+
+	const equipmentInit = {
+		'equipment_serial_number': null,
+		'equipment_name': null,
+		'agency_name': null,
+		'rental_detail_insert_user_name': null,
+		'rental_detail_insert_user_id': null,
+		'user_name': null,
+		'user_id': null,
+		'user_address': null,
+		'equipment_state': null,
+	}
+	//등록할 문의 정보
+	const [equipmentInquiry, setEquipmentInquiry] = React.useState({
+        'inquiry_idx': location.state['inquiry_idx'],
+        'inquiry_type': null,
+        'inquiry_title': null,
+        'inquiry_content': null,
+        'inquiry_state': null,
+        'inquiry_insert_user_id': null,
+        'inquiry_insert_datetime': null,
+        'inquiry_answer_content': null,
+        'inquiry_answer_user_id': null,
+        'inquiry_update_datetime': null,
+
+		'equipment_serial_number': null,
+		//문의할 장비 정보
+		equipment: {...equipmentInit}
+    });
+	const equipmentInquiryRef = React.useRef({...equipmentInquiry});
+
+	//문의 상세 조회
+	const equipmentInquirySelectOne = () => {
+		fetch("/equipment/equipmentInquirySelectOne.json", {
+			method: "POST",
+			headers: {
+				'Content-Type': 'application/json; charset=UTF-8'
+			},
+			body: JSON.stringify(equipmentInquiry),
+		}).then((response) => response.json()).then((data) => {
+			console.log("문의 상세 조회 결과 : ", data);
+			setEquipmentInquiry(data);
+		}).catch((error) => {
+			console.log('equipmentInquirySelectOne() /equipment/equipmentInquirySelectOne.json error : ', error);
+		});
+	}
+
+	//문의할 장비 선택
+	const equipmentInquirySelect = (equipment) => {
+		equipmentInquiry.equipment = equipment;
+		equipmentInquiry['equipment_serial_number'] = equipment['equipment_serial_number'];
+		setEquipmentInquiry({...equipmentInquiry});
+	}
+
+	//문의할 장비 선택 취소
+	const equipmentInquirySelectCancel = () => {
+		equipmentInquiry['equipment_serial_number'] = '';
+		equipmentInquiry.equipment = {...equipmentInit};
+		
+		setEquipmentInquiry({...equipmentInquiry});
+	}
+
+	//등록할 문의 구분이 '장비문의'로 바꼈을 때만 작동
+	React.useEffect(() => {
+		if (equipmentInquiry['equipment_serial_number'] == '') {
+			equipmentInquiry['inquiry_type'] = '기타';
+			setEquipmentInquiry({...equipmentInquiry});
+		} else if (equipmentInquiry['equipment_serial_number'] == null) {
+			equipmentInquiry.equipment = {...equipmentInit};
+			equipmentInquiry['inquiry_type'] = null;
+			setEquipmentInquiry({...equipmentInquiry});
+		}
+	}, [equipmentInquiry['equipment_serial_number']]);
+
+	//등록할 문의 구분이 '장비문의 구분'이 바꼈을 때만 작동
+	React.useEffect(() => {
+		if (equipmentInquiry['equipment_serial_number'] == ''
+			&& (equipmentInquiry['inquiry_type'] == '교환'
+				|| equipmentInquiry['inquiry_type'] == '수리')) {
+			equipmentSelectList(1);
+		} else if (CommonUtil.isEmpty(equipmentInquiry['equipment_serial_number']) == false
+					&& equipmentInquiry['inquiry_type'] == '추가') {
+			equipmentInquirySelectCancel();
+		}
+	}, [equipmentInquiry['inquiry_type']]);
+
+
+	//문의 등록 유효성 검사
+	const equipmentInquiryValidation = () => {
+		const target = equipmentInquiry;
+		const targetRef = equipmentInquiryRef;
+		if (CommonUtil.isEmpty(target['inquiry_title']) == true) {
+			targetRef.current['inquiry_title'].focus();
+			alert("문의제목을 입력해 주세요.");
+			return false;
+		}
+		if (CommonUtil.isEmpty(target['inquiry_content']) == true) {
+			targetRef.current['inquiry_content'].focus();
+			alert("내용을 입력해 주세요.");
+			return false;
+		}
+		if ((equipmentInquiry['inquiry_type'] == '교환' || equipmentInquiry['inquiry_type'] == '수리')
+			&& CommonUtil.isEmpty(target['equipment_serial_number'])) {
+			alert(`장비 ${equipmentInquiry['inquiry_type']}은(는) 장비 정보를 필수로 선택하셔야 됩니다.`);
+			return false;
+		}
+
+		return true;
+	}
+
+	//문의 수정
+	const equipmentInquiryUpdate = () => {
+		if (equipmentInquiryValidation() == false) {
+			return;
+		}
+
+		if (equipmentInquiry['equipment_serial_number'] == '') {
+			equipmentInquiry['equipment_serial_number'] = null;
+		}
+
+		fetch("/equipment/equipmentInquiryUpdate.json", {
+			method: "POST",
+			headers: {
+				'Content-Type': 'application/json; charset=UTF-8'
+			},
+			body: JSON.stringify(equipmentInquiry),
+		}).then((response) => response.json()).then((data) => {
+			console.log("문의 수정 결과(건수) : ", data);
+			if (data > 0) {
+				alert("수정완료");
+				navigate('/QandASelect');
+			} else {
+				alert("수정에 실패하였습니다. 관리자에게 문의바랍니다.");
+			}
+		}).catch((error) => {
+			console.log('equipmentInquiryUpdate() /equipment/equipmentInquiryUpdate.json error : ', error);
+		});
+	}
+
+	//문의 삭제
+	const equipmentInquiryDelete = () => {
+		if (confirm('해당 문의글을 삭제하시겠습니까?') == false) {
+			return;
+		}
+
+		fetch("/equipment/equipmentInquiryDelete.json", {
+			method: "POST",
+			headers: {
+				'Content-Type': 'application/json; charset=UTF-8'
+			},
+			body: JSON.stringify(equipmentInquiry),
+		}).then((response) => response.json()).then((data) => {
+			console.log("문의 삭제 결과(건수) : ", data);
+			if (data > 0) {
+				alert("삭제완료");
+				navigate('/QandASelect');
+			} else {
+				alert("삭제에 실패하였습니다. 관리자에게 문의바랍니다.");
+			}
+		}).catch((error) => {
+			console.log('equipmentInquiryDelete() /equipment/equipmentInquiryDelete.json error : ', error);
+		});
+	}
+
+
+
+	React.useEffect(() => {
+		equipmentStatesSelect();
+		equipmentInquirySelectOne();
+	}, [])
+
+  return (
+    <main>
+		
+		<Modal open={modalEquipmentIsOpen} close={modalEquipmentClose} header="문의대상 장비 선택">
+			<div className="board-wrap">
+				<div>
+					
+					<div className="search-management flex-end margin-bottom2 margin-top gap">						
+						<select style={{maxWidth: '150px'}}
+							onChange={(e) => equipmentSearchChange('equipment_state', e.target.value)}>
+							<option value="">상태</option>
+							{Object.keys(equipmentStates).map((key, idx) => { return ( 
+								<option key={key} value={key}>
+									{equipmentStates[key]}
+								</option>
+							)})}
+						</select>
+						<select style={{maxWidth: '150px'}}
+							onChange={(e) => equipmentSearchChange('searchType', e.target.value)}>
+							<option value="">전체</option>
+							<option value="equipment_name">모델명</option>
+							<option value="equipment_serial_number">시리얼넘버</option>
+						</select>
+						<input type="text"
+							value={equipmentSearch.searchText}
+							onChange={(e) => equipmentSearchChange('searchText', e.target.value)}
+							onKeyUp={(e) => equipmentSearchingEnter(e.key)}
+						/>
+						<button className={"btn-small gray-btn"} style={{maxWidth: '150px'}} onClick={equipmentSearching}>검색</button>
+					</div>
+
+					<table class="caregiver-user protector-user">
+						<thead>
+							<tr>
+								<th>No</th>
+								<th>장비사용대상자</th>
+								<th>모델명</th>
+								<th>시리얼넘버</th>
+								<th>장비상태</th>
+								<th>기관</th>
+								<th>선택</th>
+							</tr>
+						</thead>
+						<tbody>
+							{equipment.equipmentList.map((item, idx) => { return (
+							<tr>
+								<td data-label="No">{equipment.equipmentListCount - idx - (equipmentSearch.currentPage - 1) * equipmentSearch.perPage}</td>
+								<td data-label="장비사용대상자">
+									{item['user_id'] == null ? '미대여' : item['user_name']}
+								</td>
+								<td data-label="모델명">{item['equipment_name']}</td>
+								<td data-label="시리얼넘버">{item['equipment_serial_number']}</td>
+								<td data-label="장비상태">{equipmentStates[item['equipment_state']]}</td>
+								<td>
+									{item['agency_id'] == null ? item['government_name'] : item['agency_name']}
+								</td>
+								<td data-label="대여시행자">
+									{equipmentInquiry.equipment['equipment_serial_number'] != item['equipment_serial_number']
+										? <button className={"btn-small gray-btn"} style={{maxWidth: '150px'}}
+										onClick={() => {equipmentInquirySelect(item); modalEquipmentClose();}}>선택</button>
+										: <button className={"btn-small red-btn"} style={{maxWidth: '150px'}}
+										onClick={() => {equipmentInquirySelectCancel(); modalEquipmentClose();}}>취소</button>
+									}
+								</td>
+							</tr>
+							)})}
+							{CommonUtil.isEmpty(equipment.equipmentList) ?
+							<tr>
+								<td colSpan={7}>조회된 데이터가 없습니다</td>
+							</tr>
+							: null}
+						</tbody>
+					</table>
+					<Pagination
+						currentPage={equipmentSearch.currentPage}
+						perPage={equipmentSearch.perPage}
+						totalCount={equipment.equipmentListCount}
+						maxRange={5}
+						click={equipmentSelectList}
+					/>
+				</div>
+			</div>
+		</Modal>
+
+		<div className="content-wrap row">
+			<ContentTitle contentTitle={"문의글 작성"} className={"margin-bottom2"} />
+			<SubTitle explanation={"문의 정보"} className={"margin-bottom2"}/>
+			<table className="margin-bottom2 qna-insert senior-detail">
+				<tr>
+					<th><span style={{color : "red"}}>*</span>구분</th>
+					<td colSpan={3}>
+						<div className="gender flex-start gap5">
+							<div className="flex-start">
+								<input type="radio" id="normal_question" name="question_type" value="일반문의" style={{width: '25px'}}
+									checked={equipmentInquiry['equipment_serial_number'] == null}
+									onChange={(e) => {equipmentInquiry['equipment_serial_number'] = null; setEquipmentInquiry({...equipmentInquiry});}}/>
+								<label for="normal_question">일반문의</label>
+							</div>
+							<div className="flex-start">
+								<input type="radio" id="equipment_question" name="question_type" value="장비문의" style={{width: '25px'}}
+									checked={equipmentInquiry['equipment_serial_number'] != null}
+									onChange={(e) => {equipmentInquiry['equipment_serial_number'] = ''; setEquipmentInquiry({...equipmentInquiry});}}/>
+								<label for="equipment_question" >장비문의</label>
+							</div>
+						</div>
+					</td>
+				</tr>
+				{equipmentInquiry['equipment_serial_number'] != null ?
+				<tr>
+					<th><span style={{color : "red"}}>*</span>장비문의 구분</th>
+					<td colSpan={3}>
+						<select onChange={(e) => {equipmentInquiry['inquiry_type'] = e.target.value; setEquipmentInquiry({...equipmentInquiry});}}>
+							<option selected={equipmentInquiry['inquiry_type'] == '수리'}>수리</option>
+							<option selected={equipmentInquiry['inquiry_type'] == '교환'}>교환</option>
+							<option selected={equipmentInquiry['inquiry_type'] == '추가'}>추가</option>
+							<option selected={equipmentInquiry['inquiry_type'] == '기타'}>기타</option>
+						</select>
+					</td>
+				</tr>
+				: null}
+				<tr>
+					<th><span style={{color : "red"}}>*</span>문의제목</th>
+					<td colSpan={3}>
+						<input type="text" placeholder="문의글의 제목을 입력해주세요."
+							value={equipmentInquiry['inquiry_title']}
+							onChange={(e) => {equipmentInquiry['inquiry_title'] = e.target.value; setEquipmentInquiry({...equipmentInquiry});}}
+							ref={el => equipmentInquiryRef.current['inquiry_title'] = el}
+						/>
+					</td>
+				</tr>
+				<tr>
+					<th><span style={{color : "red"}}>*</span>내용</th>
+					<td colSpan={3}>
+						<textarea className="medicine" cols="30" rows="2"
+							value={equipmentInquiry['inquiry_content']}
+							onChange={(e) => {equipmentInquiry['inquiry_content'] = e.target.value; setEquipmentInquiry({...equipmentInquiry});}}
+							ref={el => equipmentInquiryRef.current['inquiry_content'] = el}
+						></textarea>
+					</td>
+				</tr>
+			</table>
+			
+			{equipmentInquiry['equipment_serial_number'] != null
+			?<>
+				<SubTitle explanation={equipmentInquiry['inquiry_type'] == '교환' || equipmentInquiry['inquiry_type'] == '수리'
+					? <span>장비 정보 <span style={{color : "red"}}>(필수)</span></span>
+					: <span>장비 정보 (선택)</span>
+				} className={"display-inline-block margin-bottom2"}/>
+				<button className={"btn-small gray-btn"} style={{maxWidth: '150px'}} onClick={() => {equipmentSelectList(1); modalEquipmentOpen();}}>검색</button>
+				{CommonUtil.isEmpty(equipmentInquiry.equipment['equipment_serial_number']) == false ?
+				<>
+					<button className={"btn-small red-btn"} style={{maxWidth: '150px'}} onClick={equipmentInquirySelectCancel}>취소</button>
+					<table className="margin-bottom2 qna-insert senior-detail">
+						<tr>
+							<th>장비 시리얼넘버</th>
+							<td colSpan={3}>
+								{equipmentInquiry.equipment['equipment_serial_number']} 
+							</td>
+						</tr>
+						<tr>
+							<th>모델명</th>
+							<td>
+								{equipmentInquiry.equipment['equipment_name']}
+							</td>
+							<th>장비상태</th>
+							<td>
+								{equipmentStates[equipmentInquiry.equipment['equipment_state']]}
+							</td>
+						</tr>
+						<tr>
+							<th>소속기관</th>
+							<td>
+								{equipmentInquiry.equipment['agency_id'] == null ? equipmentInquiry.equipment['government_name'] : equipmentInquiry.equipment['agency_name']}
+							</td>
+							<th>대여시행자</th>
+							<td>
+								{CommonUtil.isEmpty(equipmentInquiry.equipment['equipment_serial_number']) == false
+								&& CommonUtil.isEmpty(equipmentInquiry.equipment['rental_detail_insert_user_id']) == false
+									? <>
+										{equipmentInquiry.equipment['rental_detail_insert_user_name']}
+										({equipmentInquiry.equipment['rental_detail_insert_user_id']})
+									</>
+								: '미대여'}
+							</td>
+						</tr>
+						<tr>
+							<th>장비사용대상자</th>
+							<td>
+								{equipmentInquiry.equipment['user_id'] == null ? '미대여' : equipmentInquiry.equipment['user_name']}
+							</td>
+							<th>대상자 ID</th>
+							<td>
+								{equipmentInquiry.equipment['user_id'] == null ? '미대여' : equipmentInquiry.equipment['user_id']}
+							</td>
+						</tr>
+						<tr>
+							<th>대상자 주소</th>
+							<td colSpan={3}>
+								{equipmentInquiry.equipment['user_id'] == null ? '미대여' : equipmentInquiry.equipment['user_address']}
+							</td>
+						</tr>
+					</table>
+				</>: null}
+			</>: null}
+		
+			<div className="btn-wrap flex-center margin-top5">
+				<button className="btn-large gray-btn" onClick={() => navigate(-1)}>취소</button>
+				<button className="btn-large red-btn" onClick={() => equipmentInquiryUpdate()}>수정</button>
+				<button className="btn-large red-btn" onClick={() => equipmentInquiryDelete()}>삭제</button>
+			</div>
+
+		</div>
+	</main>
+  );
+}
client/views/pages/equipment/EquipmentSelect.jsx
--- client/views/pages/equipment/EquipmentSelect.jsx
+++ client/views/pages/equipment/EquipmentSelect.jsx
@@ -1,5 +1,5 @@
 import React from "react";
-import { useNavigate } from "react-router";
+import { useNavigate, useLocation } from "react-router";
 import { useSelector } from "react-redux";
 import { useStateWithCallbackLazy } from 'use-state-with-callback';
 import SubTitle from "../../component/SubTitle.jsx";
@@ -14,11 +14,14 @@
 export default function EquipmentSelect() {
 	
 	const navigate = useNavigate();
+	const location = useLocation();
 
 	//전역 변수 저장 객체
 	const state = useSelector((state) => {return state});
-	const defaultGovernmentId = CommonUtil.isEmpty(state.loginUser) ? null : state.loginUser['government_id'];
+	const defaultGovernmentId = CommonUtil.isEmpty(location.state) || CommonUtil.isEmpty(location.state['government_id']) ? null : location.state['government_id'];
 
+	console.log('location.state : ', location.state);
+	console.log('defaultGovernmentId : ', defaultGovernmentId);
 
 	//기관 계층 구조 목록
 	const [orgListOfHierarchy, setOrgListOfHierarchy] = React.useState([]);
@@ -29,7 +32,7 @@
 			headers: {
 			'Content-Type': 'application/json; charset=UTF-8'
 			},
-			body: JSON.stringify({'government_id': defaultGovernmentId}),
+			body: JSON.stringify({}),
 		}).then((response) => response.json()).then((data) => {
 			console.log("기관(관리, 시행) 계층 구조 목록 조회 : ", data);
 			setOrgListOfHierarchy(data);
@@ -39,8 +42,8 @@
 	};
 	//검색 변수 (초기화값)
 	const [org, setOrg] = React.useState({
-		'government_id': state.loginUser['government_id'],
-		'agency_id': state.loginUser['agency_id'],
+		'government_id': defaultGovernmentId,
+		'agency_id': null,
 	});
 	//올잇메디 선택
 	const adminChange = () => {
@@ -402,8 +405,8 @@
 	const [equipmentSearch, setEquipmentSearch] = React.useState({
 		'equipment_state': null,
 
-		'searchType': null,
-		'searchText': null,
+		'searchType': CommonUtil.isEmpty(location.state) || CommonUtil.isEmpty(location.state['searchType']) ? null : location.state['searchType'],
+		'searchText': CommonUtil.isEmpty(location.state) || CommonUtil.isEmpty(location.state['searchText']) ? null : location.state['searchText']
 	});
 	//장비 정보 변경
 	const equipmentSearchChange = (targetKey, value) => {
@@ -487,8 +490,18 @@
 		});
 	}
 
+	
+	//Mounted
+	React.useEffect(() => {
+		orgSelectListOfHierarchy();
+		equipmentStatesSelect();
+		equipmentSearching();
+	}, []);
+
+
 	//현재 탭 Index
-	const [tabIndex, setTabIndex] = React.useState(0);
+	const defaultTabIndex = CommonUtil.isEmpty(location.state) || CommonUtil.isEmpty(location.state['tabIndex']) ? 0 : location.state['tabIndex'];
+	const [tabIndex, setTabIndex] = React.useState(defaultTabIndex);
 	//탭 초기화
 	const tab = [{
 		title: `재고 장비 (${stockEquipment.equipmentListCount})`,
@@ -678,16 +691,6 @@
 			</div>
 		)
 	}];
-
-
-	//Mounted
-	React.useEffect(() => {
-		orgSelectListOfHierarchy();
-		equipmentStatesSelect();
-		equipmentSearching();
-	}, []);
-
-
 	
 	
 	return (
@@ -838,8 +841,8 @@
 				<select style={{maxWidth: '150px'}}
 					onChange={(e) => equipmentSearchChange('searchType', e.target.value)}>
 					<option value="">전체</option>
-					<option value="equipment_name">모델명</option>
-					<option value="equipment_serial_number">시리얼넘버</option>
+					<option value="equipment_name" selected={equipmentSearch['searchType'] == 'equipment_name'}>모델명</option>
+					<option value="equipment_serial_number" selected={equipmentSearch['searchType'] == 'equipment_serial_number'}>시리얼넘버</option>
 				</select>
 				<input type="text"
 					value={equipmentSearch.searchText}
client/views/pages/equipment/GovernmentEquipmentSelect.jsx
--- client/views/pages/equipment/GovernmentEquipmentSelect.jsx
+++ client/views/pages/equipment/GovernmentEquipmentSelect.jsx
@@ -199,7 +199,7 @@
 			<table class="caregiver-user protector-user">
 				<thead>
 					<tr>
-						<th>No </th>
+						<th>No</th>
 						<th>모델명</th>
 						<th>시리얼넘버</th>
 						<th>입고일자</th>
client/views/pages/main/Main_guardian.jsx
--- client/views/pages/main/Main_guardian.jsx
+++ client/views/pages/main/Main_guardian.jsx
@@ -1,4 +1,7 @@
 import React from "react";
+import { useNavigate, useLocation } from "react-router";
+import { useSelector } from "react-redux";
+
 import Title from "../../component/Title.jsx";
 import Table from "../../component/Table.jsx";
 import Calendar from "../../component/Calendar.jsx";
@@ -35,6 +38,13 @@
 import percent_m_100 from '../../../resources/files/images/percent_m_100.png';
 
 export default function Main_guardian() {
+    const navigate = useNavigate();
+    const location = useLocation();
+
+    //전역 변수 저장 객체
+    const state = useSelector((state) => {return state});
+    //console.log('state.seniorList[state.currentSeniorIndex] : ', state.seniorList[state.currentSeniorIndex]);
+
   const tableHead1 = ["", "", "", "", "", ""];
   const Key1 = ["morning", "morning2", "lunch", "lunch2", "dinner", "dinner2"];
   const content1 = [
Add a comment
List