최정우 최정우 2023-04-16
230416 방문관리 완성
@ceca426f9723e476e8b003d6218fc2b76b32789a
client/views/component/Tabletitle.jsx
--- client/views/component/Tabletitle.jsx
+++ client/views/component/Tabletitle.jsx
@@ -19,9 +19,5 @@
   background-size: 13% 15%;
   background-repeat: no-repeat;
   background-position: center bottom;
-  &::before {
-    content: "김복남";
-    font-size: 1.8rem;
-  }  
   
 `
(No newline at end of file)
client/views/pages/healthcare/Healthcare.jsx
--- client/views/pages/healthcare/Healthcare.jsx
+++ client/views/pages/healthcare/Healthcare.jsx
@@ -201,14 +201,17 @@
 							<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");
+                            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>
@@ -216,13 +219,14 @@
 							<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>
+
+                            {/* <td>2023-04-11</td>
+							<td>정기방문</td> */}
 						</tr>
 						)})}
 						{CommonUtil.isEmpty(senior.seniorList) ?
 						<tr>
-							<td colSpan={8}>조회된 데이터가 없습니다</td>
+							<td colSpan={6}>조회된 데이터가 없습니다</td>
 						</tr>  
 						: null}
 					</tbody>
client/views/pages/visit/visit/VisitSelectOne.jsx
--- client/views/pages/visit/visit/VisitSelectOne.jsx
+++ client/views/pages/visit/visit/VisitSelectOne.jsx
@@ -1,131 +1,348 @@
 import React from "react";
-import { useNavigate } from "react-router";
-import DetailSearch from "../../../component/DetailSearch.jsx";
-import Table from "../../../component/Table.jsx";
+import { useNavigate, useLocation } from "react-router";
+import { useSelector } from "react-redux";
 import ContentTitle from "../../../component/ContentTitle.jsx";
 import SubTitle from "../../../component/SubTitle.jsx";
 import TableTitle from "../../../component/Tabletitle.jsx";
 import Chart2 from "../../../component/chart/Chart2.jsx";
-import Button from "../../../component/Button.jsx";
 import Modal from "../../../component/Modal.jsx";
 import person from "../../../../resources/files/icon/person.png";
+import Pagination from "../../../component/Pagination.jsx";
 
-export default function MedicineCareSelect() {
-  const navigate = useNavigate();
-  const [modalOpen, setModalOpen] = React.useState(false);
-  const openModal = () => {
-    setModalOpen(true);
-  };
-  const closeModal = () => {
-    setModalOpen(false);
-  };
-  //게시판
-  const thead = ["No","방문일", "방문목적", "상세사유", ];
-  const key = ["No", "birth", "phone", "address", ];
-  const content = [
-    {
-      No: (
-        <p><span><img src={person} alt="" />{thead[0]}</span> 1</p>
-      ),
-      birth: (
-        <p><span>{thead[1]}</span> 2020.03.04</p>
-      ),
-      phone: (
-        <p><span>{thead[2]}</span> 정기방문</p>
-      ),
-      address: (
-        <p><span>{thead[3]}</span> 정기방문일</p>
-      ),
-    },
-  ];
+import CommonUtil from "../../../../resources/js/CommonUtil.js";
 
-  return (
-    <main>
-      <Modal open={modalOpen} close={closeModal} header="방문 등록">
-        <div className="board-wrap">
-        <table className="flex70 margin-bottom questionnaire-table">
-            <tbody>
-              <tr>
-                <th>대상자</th>
-                <td colSpan={3}>
-                  <input type="text" name="" id="" disabled />
-                </td>
-              </tr>              
-              <tr>
-                <th>방문날짜</th>
-                <td colSpan={3}>
-                  <input type="text" placeholder="자동입력" />
-                </td>
-              </tr>
-              <tr>
-                <th>방문목적</th>
-                <td className="flex-start">
-                  <div className="flex-start width100">
-                    <input type="checkbox" className="width20"/>
-                    <label className="width50" >
-                      정기방문
-                    </label>
-                  </div>
-                  <div className="flex-start width100">
-                    <input type="checkbox"  className="width20"/>
-                    <label className="width50" >
-                      어르신케어
-                    </label>
-                  </div>
-                  <div className="flex-start width100">
-                    <input type="checkbox"  className="width20"/>
-                    <label className="width50" >
-                      장비점검
-                    </label>
-                  </div>
-                </td>
-              </tr>
-              <tr>
-                <th>방문 상세 사유</th>
-                <td colSpan={3}>
-                  <textarea style={{height:"225px"}} name="" id="" cols="30" rows="10"></textarea>
-                </td>
-              </tr>
-            </tbody>
-          </table>
-          <div className="flex-center"><Button className={"btn-small gray-btn"} btnName={"저장"} /></div >
-        </div>
-      </Modal>
-      <div className="content-wrap">
-        <ContentTitle contentTitle={"방문 상세 페이지"}/>
-        <div className="detail-graph">
-          <TableTitle tableTitle={" 님의 방문 내역"}/>
-          <Chart2 />
-        </div>
-        <div className="board-wrap">
-        <div className="btn-wrap flex-end margin-bottom">
-            <Button
-              className={"btn-small gray-btn"}
-              btnName={"등록"}
-              onClick={openModal}
-            />
-          </div>
-        <Table
-            className={"medicine-table  senior-table"}
-              head={thead}
-              contents={content}
-              contentKey={key}
-              onClick={() => {
-                navigate("/MedicineCareSelectOne");
-              }}
-            />
-          <div className="btn-wrap flex-center">
-            <Button
-              className={"btn-large gray-btn"}
-              btnName={"이전"}
-              onClick={() => {
-                navigate("/Healthcare");
-              }}
-            />
-          </div>
-        </div>
-      </div>
-      
-    </main>
-  );
+export default function VisitSelectOne() {
+    const navigate = useNavigate();
+    const location = useLocation();
+
+    //전역 변수 저장 객체
+    const state = useSelector((state) => {return state});
+    const defaultUserId = CommonUtil.isEmpty(state.loginUser) ? null : state.loginUser['user_id'];
+
+    const [modalOpen, setModalOpen] = React.useState(false);
+    const openModal = () => {
+        setModalOpen(true);
+    };
+    const closeModal = () => {
+        setModalOpen(false);
+    };
+
+    //시니어 정보
+    const [senior, setSenior] = React.useState({
+        'user_id': location.state['senior_id'],
+        'user_name': null,
+        'user_password': null,
+        'user_phonenumber': null,
+        'user_birth': null,
+        'user_gender': null,
+        'user_address': null,
+        'user_email': null,
+        'authority': 'ROLE_SENIOR',
+        'agency_id': null,
+        'government_id': null,
+
+        'senior_id': location.state['senior_id'],
+        'care_grade': null,
+        'medication_pill': null,
+        'underlie_disease': null,
+        'senior_note': null,
+
+        'seniorMedicationList': []
+    });
+    //시니어 상세 조회
+    const seniorSelectOne = () => {
+        fetch("/user/seniorSelectOne.json", {
+            method: "POST",
+            headers: {
+                'Content-Type': 'application/json; charset=UTF-8'
+            },
+            body: JSON.stringify(senior),
+        }).then((response) => response.json()).then((data) => {
+            console.log("seniorSelectOne data : ", data);
+            setSenior(data);
+        }).catch((error) => {
+            console.log('seniorSelectOne() /user/seniorSelectOne.json error : ', error);
+        });
+    };
+
+    /****************** 방문 기록 (시작) ******************/
+    const visitRecordInit = {
+        'senior_id': location.state['senior_id'],
+        'visit_date': CommonUtil.getDate(),
+        'visit_reason': null,
+        'visit_content': null,
+        
+        'agent_id': defaultUserId,
+
+        isInsert: true,
+    };
+    //방문 기록 정보
+    const [visitRecord, setVisitRecord] = React.useState({...visitRecordInit});
+    const visitRecordRef = React.useRef({...visitRecordInit});
+
+    //방문 기록 유효성 검사
+    const visitRecordValidation = () => {
+        const target = visitRecord;
+		const targetRef = visitRecordRef;
+
+		if (CommonUtil.isEmpty(target['visit_date']) == true) {
+			targetRef.current['visit_date'].focus();
+			alert("방문 일자를 선택해 주세요.");
+			return false;
+		}
+		if (CommonUtil.isEmpty(target['visit_reason']) == true) {
+			targetRef.current['visit_reason'].focus();
+			alert("방문 목적을 선택해 주세요.");
+			return false;
+		}
+        if (CommonUtil.isEmpty(target['visit_content']) == true) {
+			targetRef.current['visit_content'].focus();
+			alert("방문 상세 사유를 입력해 주세요.");
+			return false;
+		}
+
+        return true;
+    }
+
+
+	//방문 기록 등록
+	const visitRecordInsert = () => {
+        if (visitRecordValidation() == false) {
+            return;
+        }
+
+        visitRecord['senior_id'] = location.state['senior_id'];
+        visitRecord['agent_id'] = defaultUserId;
+        setVisitRecord({...visitRecord});
+
+		fetch("/welfare/visitRecordInsert.json", {
+			method: "POST",
+			headers: {
+				'Content-Type': 'application/json; charset=UTF-8'
+			},
+			body: JSON.stringify(visitRecord),
+		}).then((response) => response.json()).then((data) => {
+			console.log("방문 기록 등록 결과(건수) : ", data);
+			if (data > 0) {
+                setVisitRecordInit();
+                visitRecordSelectList();
+                closeModal();
+				alert("등록완료");
+				
+			} else {
+				alert("등록에 실패하였습니다. 관리자에게 문의바랍니다.");
+			}
+		}).catch((error) => {
+			console.log('visitRecordInsert() /welfare/visitRecordInsert.json error : ', error);
+		});
+    }
+
+    //방문 기록 수정
+	const visitRecordUpdate = () => {
+        if (visitRecordValidation() == false) {
+            return;
+        }
+
+        visitRecord['senior_id'] = location.state['senior_id'];
+        visitRecord['agent_id'] = defaultUserId;
+        setVisitRecord({...visitRecord});
+
+		fetch("/welfare/visitRecordUpdate.json", {
+			method: "POST",
+			headers: {
+				'Content-Type': 'application/json; charset=UTF-8'
+			},
+			body: JSON.stringify(visitRecord),
+		}).then((response) => response.json()).then((data) => {
+			console.log("방문 기록 수정 결과(건수) : ", data);
+			if (data > 0) {
+                setVisitRecordInit();
+                visitRecordSelectList();
+                closeModal();
+				alert("수정완료");
+			} else {
+				alert("수정에 실패하였습니다. 관리자에게 문의바랍니다.");
+			}
+		}).catch((error) => {
+			console.log('visitRecordUpdate() /welfare/visitRecordUpdate.json error : ', error);
+		});
+    }
+
+    //방문 기록 삭제
+	const visitRecordDelete = () => {
+        if (confirm('방문 기록 정보를 삭제하시겠습니까?') == false) {
+            return;
+        }
+
+		fetch("/welfare/visitRecordDelete.json", {
+			method: "POST",
+			headers: {
+				'Content-Type': 'application/json; charset=UTF-8'
+			},
+			body: JSON.stringify(visitRecord),
+		}).then((response) => response.json()).then((data) => {
+			console.log("방문 기록 삭제 결과(건수) : ", data);
+			if (data > 0) {
+                setVisitRecordInit();
+                visitRecordSelectList();
+                closeModal();
+				alert("삭제완료");
+			} else {
+				alert("삭제에 실패하였습니다. 관리자에게 문의바랍니다.");
+			}
+		}).catch((error) => {
+			console.log('visitRecordDelete() /welfare/visitRecordDelete.json error : ', error);
+		});
+    }
+
+    //초기화 취소
+    const setVisitRecordInit = () => {
+        setVisitRecord({...visitRecordInit});
+    }
+
+    //방문 기록 정보
+    const [visitRecordList, setVisitRecordList] = React.useState({visitRecordList: [], visitRecordListCount:0, search: {currentPage: 1, perPage: 5}});
+    //방문 기록 목록 조회
+	const visitRecordSelectList = (currentPage) => {
+        visitRecordList.search.currentPage = CommonUtil.isEmpty(currentPage) ? 1 : currentPage;
+        visitRecordList.search['senior_id'] = location.state['senior_id'];
+        setVisitRecordList({...visitRecordList});
+
+		fetch("/welfare/visitRecordSelectList.json", {
+			method: "POST",
+			headers: {
+				'Content-Type': 'application/json; charset=UTF-8'
+			},
+			body: JSON.stringify(visitRecordList.search),
+		}).then((response) => response.json()).then((data) => {
+			console.log("방문 기록 목록 조회 결과(건수) : ", data);
+            data.search = visitRecordList.search;
+            setVisitRecordList(data);
+		}).catch((error) => {
+			console.log('visitRecordSelectList() /welfare/visitRecordSelectList.json error : ', error);
+		});
+    }
+
+    React.useEffect(() => {
+        seniorSelectOne();
+        visitRecordSelectList(1);
+    }, [])
+
+    return (
+        <main>
+        
+            <div className="content-wrap">
+                <ContentTitle contentTitle={"방문 상세 페이지"}/>
+                <div className="detail-graph">
+                    <TableTitle tableTitle={`${senior['user_name']} 님의 방문 내역`}/>
+                    <Chart2 />
+                </div>
+                <div className="board-wrap">
+                    <div className="btn-wrap flex-end margin-bottom">
+                        <button className="btn-small gray-btn" onClick={openModal}>등록</button>
+                    </div>
+
+                    <table className="medicine-table senior-table">
+                        <thead>
+                            <tr>
+                                <th>No</th>
+                                <th>방문일</th>
+                                <th>방문목적</th>
+                            </tr>
+                        </thead>
+                        <tbody>
+                            {visitRecordList.visitRecordList.map((item, idx) => { return (
+                            <tr key={idx} onClick={() => {setVisitRecord(item); openModal();}}>
+                                <td data-label="No">{visitRecordList.visitRecordList - idx - (visitRecordList.search.currentPage - 1) * visitRecordList.search.perPage}</td>
+                                <td data-label="방문일">{item['visit_date']}</td>
+                                <td data-label="방문목적">{item['visit_reason']}</td>
+                            </tr>
+                            )})}
+                            {CommonUtil.isEmpty(visitRecordList.visitRecordList) ?
+                            <tr>
+                                <td colSpan={3}>조회된 데이터가 없습니다</td>
+                            </tr>  
+                            : null}
+                        </tbody>
+                    </table>
+                    <Pagination
+                        currentPage={visitRecordList.search.currentPage}
+                        perPage={visitRecordList.search.perPage}
+                        totalCount={visitRecordList.visitRecordListCount}
+                        maxRange={10}
+                        click={visitRecordSelectList}
+                    />
+                    <div className="btn-wrap flex-center">
+                        <button className="btn-large gray-btn" onClick={() => {navigate(-1)}}>이전</button>
+                    </div>
+                </div>
+            </div>
+        
+
+
+
+            <Modal open={modalOpen} close={closeModal} header="방문 정보 관리">
+                <div className="board-wrap">
+                    <table className="flex70 margin-bottom">{/* questionnaire-table */}
+                        <tbody>            
+                            <tr>
+                                <th>방문날짜</th>
+                                <td colSpan={3}>
+                                    <input type="date" value={visitRecord['visit_date']}
+                                        onChange={(e) => {
+                                            visitRecord['visit_date'] = e.target.value;
+                                            setVisitRecord({...visitRecord});
+                                        }}
+                                        ref={el => visitRecordRef.current['visit_date'] = el}
+                                    />
+                                </td>
+                            </tr>
+                            <tr>
+                                <th>방문목적</th>
+                                <td>
+                                    <select onChange={(e) => {
+                                            visitRecord['visit_reason'] = e.target.value;
+                                            setVisitRecord({...visitRecord});
+                                        }}
+                                        ref={el => visitRecordRef.current['visit_reason'] = el}
+                                    >
+                                        <option value="" selected={CommonUtil.isEmpty(visitRecord['visit_reason'])}>방문목적선택</option>
+                                        <option value="정기방문" selected={visitRecord['visit_reason'] == "정기방문"}>정기방문</option>
+                                        <option value="어르신케어" selected={visitRecord['visit_reason'] == "어르신케어"}>어르신케어</option>
+                                        <option value="장비점검" selected={visitRecord['visit_reason'] == "장비점검"}>장비점검</option>
+                                        <option value="정기방문" selected={visitRecord['visit_reason'] == "기타"}>기타</option>
+                                    </select>
+                                </td>
+                            </tr>
+                            <tr>
+                                <th>방문 상세 사유</th>
+                                <td colSpan={3}>
+                                    <textarea className="medicine" style={{height:"225px"}} name="" id="" cols="30" rows="10"
+                                        value={visitRecord['visit_content']}
+                                        onChange={(e) => {
+                                            visitRecord['visit_content'] = e.target.value;
+                                            setVisitRecord({...visitRecord});
+                                        }}
+                                        ref={el => visitRecordRef.current['visit_content'] = el}
+                                    ></textarea>
+                                </td>
+                            </tr>
+                        </tbody>
+                    </table>
+                    <div className="flex-center">
+                        {CommonUtil.isEmpty(visitRecord.isInsert) == false && visitRecord.isInsert
+                            ? <button className="btn-small red-btn" onClick={visitRecordInsert}>등록</button>
+                            : <>
+                                <button className="btn-small red-btn" onClick={visitRecordUpdate}>수정</button>
+                                <button className="btn-small red-btn" onClick={visitRecordDelete}>삭제</button>
+                            </>
+                        }
+                    </div>
+                </div>
+            </Modal>
+
+
+
+        </main>
+    );
 }
Add a comment
List