박정하 박정하 2023-06-15
230615 박정하 캘린더 작업 계속 진행중
@f295a208b95e050ef7d713f6f8b10897a97f3346
client/resources/css/common.css
--- client/resources/css/common.css
+++ client/resources/css/common.css
@@ -107,6 +107,11 @@
   grid-row: 4/6;
 }
 
+.combine-right-government3 {
+  grid-column: 4/5;
+  grid-row: 2/span 4;
+}
+
 .combine-top-government {
   grid-row: 1/3;
 }
client/resources/css/main.css
--- client/resources/css/main.css
+++ client/resources/css/main.css
@@ -642,6 +642,22 @@
   background: #e26f49;
 }
 
+.calendar-data {
+  margin-top: 1rem;
+}
+
+.calendar-data >div:first-child {
+  margin-bottom: .5rem;
+}
+
+@media all and (min-width: 479px) {
+  .calendar-data {
+    display: flex;
+    justify-content: space-between;
+    padding: 0 1rem;
+  }
+}
+
 .weather-info
 
 /* 보호자 복약 */
client/views/component/Calendar.jsx
--- client/views/component/Calendar.jsx
+++ client/views/component/Calendar.jsx
@@ -17,152 +17,25 @@
   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 [visitRecordList, setVisitRecordList] = React.useState({});
-  const visitRecordInit = {
-    'senior_id': data['senior']['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 visitRecordSelectList = () => {
-    fetch("/welfare/visitRecordSelectList.json", {
-      method: "POST",
-      headers: {
-        'Content-Type': 'application/json; charset=UTF-8'
-      },
-      body: JSON.stringify(data['senior']),
-    }).then((response) => response.json()).then((data) => {
-      console.log("방문 기록 목록 조회 결과(건수) : ", data);
-      data.search = visitRecordList.search;
-      setVisitRecordList(data['visitRecordList']);
-    }).catch((error) => {
-      console.log('visitRecordSelectList() /user/visitRecordSelectList.json error : ', error);
-    });
-  }
-
-  //방문 기록 유효성 검사
-  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 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 });
-  }
-
-  React.useEffect(() => {
-    visitRecordSelectList();
-  }, []);
-
   const [value, setValue] = useState(new Date());
   //const mark = ["12-04-2023", "21-04-2023", "05-04-2023", "02-04-2023"];
   //const mark = ["2023-04-12", "2023-06-12"];
 
+  const Temperature = (date) => {
+    let todayTemperature = [];
+    data['temperature'].map((item, idx) => {
+      if (item['xName'] === date['date']) {
+        todayTemperature.push(item['temperature']);
+      }
+    })
+    return (
+      <p>{todayTemperature[0]}</p>
+    )
+  }
+
   const mark = [];
-  if (CommonUtil.isEmpty(state.loginUser) == false
-    && state.loginUser['authority'] == 'ROLE_AGENCY' || state.loginUser['authority'] == 'ROLE_AGENCYADMIN') {
-    for (let i = 0; i < visitRecordList.length; i++) {
-      mark.push(visitRecordList[i]['visit_date']);
-    }
-  } else {
-    for (let i = 0; i < data['visitRecordList'].length; i++) {
-      mark.push(data['visitRecordList'][i]['visit_date']);
-    }
+  for (let i = 0; i < data.visitRecordList.length; i++) {
+    mark.push(data.visitRecordList[i]['visit_date']);
   }
 
   return (
@@ -176,27 +49,18 @@
           }
         }}
         onClickDay={(date, event) => {
-          if (mark.find((x) => x === moment(date).format("YYYY-MM-DD"))) {
-            if (CommonUtil.isEmpty(state.loginUser) == false && state.loginUser['authority'] == 'ROLE_AGENCY' || state.loginUser['authority'] == 'ROLE_AGENCYADMIN') {
-              visitRecordList.map((item, idx) => {
-                if (item['visit_date'] === moment(date).format("YYYY-MM-DD")) {
-                  setVisitRecord(item); openModal();
-                }
-              })
+          data.visitRecordList.map((item, idx) => {
+            if (item['visit_date'] === moment(date).format("YYYY-MM-DD")) {
+              data.onClick(moment(date).format("YYYY-MM-DD"), item);
             } else {
-              data['visitRecordList'].map((item, idx) => {
-                if (item['visit_date'] === moment(date).format("YYYY-MM-DD")) {
-                  setVisitRecord(item); openModal();
-                }
-              }
-              )
+              data.onClick(moment(date).format("YYYY-MM-DD"));
             }
-          }
+          })
         }}
         tileContent={({ date, view }) => {
           return (
             <>
-              <div className="flex justify-center items-center absoluteDiv">
+              <div className="calendar-data">
                 <div>
                   <p><small>복약량</small></p>
                   {data['medication'].map((item, idx) => {
@@ -206,98 +70,16 @@
                   })}
                 </div>
                 <div>
-                  <p><small>온도(℃)</small></p>
-                  {data['temperature'].map((item, idx) => {
-                    return (
-                      item['xName'] === moment(date).format("YYYY-MM-DD") && item['time'] == '02:00' ? item['temperature'] + '/' : null
-                    )
-                  })}
-                  {data['temperature'].map((item, idx) => {
-                    return (
-                      item['xName'] === moment(date).format("YYYY-MM-DD") && item['time'] == '10:00' ? item['temperature'] + '/' : null
-                    )
-                  })}
-                  {data['temperature'].map((item, idx) => {
-                    return (
-                      item['xName'] === moment(date).format("YYYY-MM-DD") && item['time'] == '14:00' ? item['temperature'] + '/' : null
-                    )
-                  })}
-                  {data['temperature'].map((item, idx) => {
-                    return (
-                      item['xName'] === moment(date).format("YYYY-MM-DD") && item['time'] == '23:00' ? item['temperature'] : null
-                    )
-                  })}
+                  <div>
+                    <p><small>온도(℃)</small></p>
+                    <Temperature date={moment(date).format("YYYY-MM-DD")} />
+                  </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}
-                    disabled={CommonUtil.isEmpty(state.loginUser) == false && state.loginUser['authority'] == 'ROLE_AGENCY' || state.loginUser['authority'] == 'ROLE_AGENCYADMIN' ?
-                      false : true}
-                  />
-                </td>
-              </tr>
-              <tr>
-                <th>방문목적</th>
-                <td>
-                  <select onChange={(e) => {
-                    visitRecord['visit_reason'] = e.target.value;
-                    setVisitRecord({ ...visitRecord });
-                  }}
-                    ref={el => visitRecordRef.current['visit_reason'] = el}
-                    disabled={CommonUtil.isEmpty(state.loginUser) == false
-                      && state.loginUser['authority'] == 'ROLE_AGENCY' ?
-                      false : true}
-                  >
-                    <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}
-                    disabled={CommonUtil.isEmpty(state.loginUser) == false
-                      && state.loginUser['authority'] == 'ROLE_AGENCY' ?
-                      false : true}
-                  ></textarea>
-                </td>
-              </tr>
-            </tbody>
-          </table>
-          {CommonUtil.isEmpty(state.loginUser) == false
-            && state.loginUser['authority'] == 'ROLE_AGENCY' || state.loginUser['authority'] == 'ROLE_AGENCYADMIN' ? (
-            <div className="flex-center">
-              <button className="btn-small red-btn" onClick={visitRecordUpdate}>수정</button>
-              <button className="btn-small red-btn" onClick={visitRecordDelete}>삭제</button>
-            </div>
-          ) : null}
-        </div>
-      </Modal>
     </>
   );
 }
 
client/views/component/chart/Chart5_agencyadmin.jsx (added)
+++ client/views/component/chart/Chart5_agencyadmin.jsx
@@ -0,0 +1,70 @@
+import React, { Component } from "react";
+import * as am5 from "@amcharts/amcharts5";
+import * as am5percent from "@amcharts/amcharts5/percent";
+import am5themes_Animated from "@amcharts/amcharts5/themes/Animated";
+import CommonUtil from "../../../resources/js/CommonUtil";
+
+
+export default function Chart5({ data }) {
+  const createChart = () => {
+    console.log('createChart data : ', data);
+    let root = am5.Root.new("Chart5");
+
+    // Set themes
+    // https://www.amcharts.com/docs/v5/concepts/themes/
+    root.setThemes([
+      am5themes_Animated.new(root)
+    ]);
+
+
+    // Create chart
+    // https://www.amcharts.com/docs/v5/charts/percent-charts/sliced-chart/
+    let chart = root.container.children.push(am5percent.SlicedChart.new(root, {
+      layout: root.verticalLayout
+    }));
+
+
+    // Create series
+    // https://www.amcharts.com/docs/v5/charts/percent-charts/sliced-chart/#Series
+    let series = chart.series.push(am5percent.PictorialStackedSeries.new(root, {
+      alignLabels: true,
+      orientation: "vertical",
+      valueField: "count",
+      categoryField: "agency_name",
+      svgPath: "M53.5,476c0,14,6.833,21,20.5,21s20.5-7,20.5-21V287h21v189c0,14,6.834,21,20.5,21 c13.667,0,20.5-7,20.5-21V154h10v116c0,7.334,2.5,12.667,7.5,16s10.167,3.333,15.5,0s8-8.667,8-16V145c0-13.334-4.5-23.667-13.5-31 s-21.5-11-37.5-11h-82c-15.333,0-27.833,3.333-37.5,10s-14.5,17-14.5,31v133c0,6,2.667,10.333,8,13s10.5,2.667,15.5,0s7.5-7,7.5-13 V154h10V476 M61.5,42.5c0,11.667,4.167,21.667,12.5,30S92.333,85,104,85s21.667-4.167,30-12.5S146.5,54,146.5,42 c0-11.335-4.167-21.168-12.5-29.5C125.667,4.167,115.667,0,104,0S82.333,4.167,74,12.5S61.5,30.833,61.5,42.5z"
+    }));
+
+    series.labelsContainer.set("width", 100);
+    series.ticks.template.set("location", 0.6);
+
+
+    // Set data
+    // https://www.amcharts.com/docs/v5/charts/percent-charts/sliced-chart/#Setting_data
+    /*series.data.setAll([
+      { value: 10, category: "A복지관" },
+      { value: 9, category: "B복지관" },
+      { value: 6, category: "C복지관" },
+      { value: 5, category: "D복지관" },
+      { value: 4, category: "E복지관" },
+    ]);*/
+    series.data.setAll(data);
+
+
+    // Play initial series animation
+    // https://www.amcharts.com/docs/v5/concepts/animations/#Animation_of_series
+    chart.appear(1000, 100);
+    // end am5.ready()
+  }
+
+  React.useEffect(() => {
+    console.log('React.useEffect data : ', data);
+    if (CommonUtil.isEmpty(data) == false) {
+      createChart();
+    }
+  }, [data])
+
+  return (
+    <div id="Chart5" style={{ width: "100%", height: "80%" }}></div>
+  )
+
+}(파일 끝에 줄바꿈 문자 없음)
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, setSeniorList } from "./AppStore.jsx";
+import { setLoginUser, setSeniorList, setCurrentSeniorIndex } from "./AppStore.jsx";
 
 //Application의 Route 정보를 관리하는 Component
 import {AdminApp, GovernmentApp, AgencyApp, AgencyAdminApp, GuardianApp} from "./AppRoute.jsx";
@@ -211,7 +211,7 @@
     }).then((response) => response.json()).then((data) => {
       console.log("특정 보호자의 대상자(시니어) 목록 조회 : ", data);
       //로그인 사용자 정보 전역 변수에 저장
-      dispatch(setSeniorList(data));
+      dispatch(setSeniorList({value: data}));
     }).catch((error) => {
       console.log('login() /user/seniorSelectListByGuardian.json error : ', error);
     });
@@ -244,7 +244,7 @@
         } else if (loginResultData['authority'] == 'ROLE_GUARDIAN' || loginResultData['authority'] == 'ROLE_SENIOR') {
           setMenuItems(GuardianApp.menuItems);
           setAppRoute(<GuardianApp.AppRoute/>);
-          if (CommonUtil.isEmpty(state.seniorList) == true) {
+          if (loginResultData['authority'] == 'ROLE_GUARDIAN' && CommonUtil.isEmpty(state['seniorList'].value) == true) {
             seniorSelectListByGuardian(loginResultData);
           }
         } else {
@@ -261,6 +261,9 @@
       } else {
         setIsPush(null);
         setToken(null);
+        dispatch(setLoginUser({}));
+        dispatch(setSeniorList({value: []}));
+        dispatch(setCurrentSeniorIndex({value: 0}));
       }
     });
   }, [location]);
client/views/pages/AppRoute.jsx
--- client/views/pages/AppRoute.jsx
+++ client/views/pages/AppRoute.jsx
@@ -471,11 +471,11 @@
     path: "/",
     icon: <HouseIcon sx={{ fontSize: 20, marginRight: 1 }} />,
   },
-  {
-    title: "그래프로 보기",
-    path: "/GuardianStatistics",
-    icon: <EqualizerIcon sx={{ fontSize: 20, marginRight: 1 }} />,
-  },
+  // {
+  //   title: "그래프로 보기",
+  //   path: "/GuardianStatistics",
+  //   icon: <EqualizerIcon sx={{ fontSize: 20, marginRight: 1 }} />,
+  // },
   {
     title: "문의하기",
     path: "/QandASelect",
client/views/pages/AppStore.jsx
--- client/views/pages/AppStore.jsx
+++ client/views/pages/AppStore.jsx
@@ -19,12 +19,11 @@
 //특정 로그인 유저의 대상자(시니어)목록 정보
 const seniorList = createSlice({
     name: 'createSlice',
-    initialState: [],
+    initialState: {value: []},
     reducers: {
         setSeniorList(stats, action) {
-            for (let key in action.payload) {
-                stats[key] = action.payload[key];
-            }
+          //console.log("seniorList createSlice stats.value : ", stats.value, ", action.payload.value : ", action.payload.value);
+          stats.value = action.payload.value;
         }
     }
 })
@@ -35,12 +34,14 @@
 //특정 로그인 유저가 지정한 조회 할 대상자(시니어) Index
 const currentSeniorIndex = createSlice({
     name: 'createSlice',
-    initialState: 0,
+    initialState: {value: 0},
     reducers: {
         setCurrentSeniorIndex(stats, action) {
-            for (let key in action.payload) {
+            /* for (let key in action.payload) {
                 stats[key] = action.payload[key];
-            }
+            } */
+            //console.log("stats : ", stats.value, ", action.payload : ", action.payload.value);
+            stats.value = action.payload.value;
         }
     }
 })
client/views/pages/callcenter/QandAInsert.jsx
--- client/views/pages/callcenter/QandAInsert.jsx
+++ client/views/pages/callcenter/QandAInsert.jsx
@@ -10,23 +10,25 @@
 import CommonUtil from "../../../resources/js/CommonUtil.js";
 
 export default function QandAInsert() {
-    const navigate = useNavigate();
-    const location = useLocation();
+  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 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'].value) == false) {
+      defaultSeniorId = state['seniorList'].value[state.currentSeniorIndex.value]['user_id'];
+    }
+  } else {
+    defaultSeniorId = null;
+  }
+
+  console.log('defaultSeniorId : ', defaultSeniorId);
 
 	// 시스템 코드 - 장비 상태
 	const [equipmentStates, setEquipmentStates] = React.useState({});
client/views/pages/callcenter/QandASelectOne.jsx
--- client/views/pages/callcenter/QandASelectOne.jsx
+++ client/views/pages/callcenter/QandASelectOne.jsx
@@ -21,8 +21,8 @@
 	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 if (state.loginUser['authority'] == 'ROLE_GUARDIAN' && CommonUtil.isEmpty(state['seniorList'].value) == false) {
+			defaultSeniorId = state['seniorList'].value[state.currentSeniorIndex.value]['user_id'];
 		}
 	} else {
 		defaultSeniorId = null;
client/views/pages/callcenter/QandAUpdate.jsx
--- client/views/pages/callcenter/QandAUpdate.jsx
+++ client/views/pages/callcenter/QandAUpdate.jsx
@@ -21,8 +21,8 @@
 	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 if (state.loginUser['authority'] == 'ROLE_GUARDIAN' && CommonUtil.isEmpty(state['seniorList'].value) == false) {
+			defaultSeniorId = state['seniorList'].value[state.currentSeniorIndex.value]['user_id'];
 		}
 	} else {
 		defaultSeniorId = null;
client/views/pages/healthcare/Healthcare.jsx
--- client/views/pages/healthcare/Healthcare.jsx
+++ client/views/pages/healthcare/Healthcare.jsx
@@ -171,9 +171,9 @@
           chartData['time'] = data[i]['temperature_time'];
 
           if (data[i]['temperature_date'].substr(5, 2) >= 11 || data[i]['temperature_date'].substr(5, 2) <= 2) {
-            _stackTemperatureData.unshift(chartData);
-          } else {
             _stackTemperatureData.push(chartData);
+          } else {
+            _stackTemperatureData.unshift(chartData);
           }
         }
 
client/views/pages/healthcare/HealthcareSelectOne.jsx
--- client/views/pages/healthcare/HealthcareSelectOne.jsx
+++ client/views/pages/healthcare/HealthcareSelectOne.jsx
@@ -176,6 +176,18 @@
 
   //방문 기록 정보
   const [visitRecordList, setVisitRecordList] = React.useState({});
+  const visitRecordInit = {
+    'senior_id': location.state['senior_id'],
+    'visit_date': CommonUtil.getDate(),
+    'visit_reason': null,
+    'visit_content': null,
+
+    'agent_id': defaultUserId,
+
+    isInsert: true,
+  };
+  
+  
   //방문 기록 목록 조회
   const visitRecordSelectList = (seniorNum) => {
     fetch("/welfare/visitRecordSelectList.json", {
@@ -195,16 +207,6 @@
 
 
   /****************** 방문 기록 (시작) ******************/
-  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 });
@@ -267,9 +269,73 @@
     });
   }
 
+  //방문 기록 수정
+  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 calerndarClick = (visitRecord) => {
+    console.log("calerndarClick - visitRecord", visitRecord);
+    setVisitRecord(visitRecord);
+    openModal();
   }
 
   React.useEffect(() => {
@@ -287,10 +353,10 @@
         </div>
 
         <div className="btn-wrap flex-end margin-bottom">
-          <button className="btn-small gray-btn" onClick={openModal}>방문등록</button>
+          <button className="btn-small gray-btn" onClick={() => {setVisitRecordInit(); openModal();}}>방문등록</button>
         </div>
 
-        <Calendar data={{ senior: senior, medication: stackChartData, temperature: stackTemperatureData }} />
+        <Calendar data={{ senior: senior, medication: stackChartData, temperature: stackTemperatureData, visitRecordList: visitRecordList, onClick: calerndarClick}} />
 
         <div className="btn-wrap flex-center">
           <button className="btn-large gray-btn" onClick={() => { navigate(-1) }}>이전</button>
@@ -356,6 +422,7 @@
             </div>
           </div>
         </Modal>
+
       </main>
     </>
   );
client/views/pages/login/Login.jsx
--- client/views/pages/login/Login.jsx
+++ client/views/pages/login/Login.jsx
@@ -39,7 +39,11 @@
     }).then((response) => response.json()).then((data) => {
       console.log("로그인 결과 : ", data);
       if (data.isSuccess == true) {
-        navigate('/');
+        if(data.message == "비밀번호를 변경해주세요.") {
+          
+        } else {
+          navigate('/');
+        }
       } else {
         alert(data.message);
       }
client/views/pages/main/Main_agencyAdmin.jsx
--- client/views/pages/main/Main_agencyAdmin.jsx
+++ client/views/pages/main/Main_agencyAdmin.jsx
@@ -10,6 +10,7 @@
 import Title from "../../component/Title.jsx";
 /* import Map from "../../component/chart/Map.jsx"; */
 import Chart5 from "../../component/chart/Chart5.jsx";
+import Chart5_agencyadmin from "../../component/chart/Chart5_agencyadmin.jsx";
 import Chart2_govern from "../../component/chart/Chart2_govern.jsx";
 import Donut1_govern from "../../component/chart/Donut1_govern.jsx";
 import RowChart_govern from "../../component/chart/RowChart_govern.jsx";
@@ -282,17 +283,11 @@
           </div>
           <Chart2_govern />
         </div>
-        <div className="content-box combine-right-government2">
+        <div className="content-box combine-right-government3">
           <div className="flex">
             <Title title={`보호사별 대상자 등록 현황`} explanation={"약상자 사용자의 데이터 차트가 보여집니다."} />
           </div>
-          <Chart5 data={seniorEnroll} />
-        </div>
-        <div className="content-box combine-right-government">
-          <div className="flex">
-            <Title title={`보호사별 약상자 사용 현황`} explanation={""} />
-          </div>
-          <Donut1_govern data={equipmentUsage} />
+          <Chart5_agencyadmin data={seniorEnroll} />
         </div>
       </div>
     </main>
client/views/pages/main/Main_guardian.jsx
--- client/views/pages/main/Main_guardian.jsx
+++ client/views/pages/main/Main_guardian.jsx
@@ -9,6 +9,7 @@
 import DateDay from "../../component/DateDay.jsx";
 import DateMonth from "../../component/DateMonth.jsx";
 import Chart6 from "../../component/chart/Chart6.jsx";
+import Modal from "../../component/Modal.jsx";
 import ClearIcon from '@mui/icons-material/Clear';
 import CheckCircleOutlineIcon from '@mui/icons-material/CheckCircleOutline';
 import ErrorIcon from '@mui/icons-material/Error';
@@ -45,10 +46,18 @@
 
   //전역 변수 저장 객체
   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 searching = () => {
-
     if (CommonUtil.isEmpty(seniorSearch['senior_id']) == false) {
       seniorSelectOne();
       seniorMedicationSelectList();
@@ -63,7 +72,7 @@
   const [senior, setSenior] = React.useState({
     'user_id': null,
     'user_name': null,
-    'senior_id':null,
+    'senior_id': null,
   });
 
   const [seniorSearch, setSeniorSearch] = React.useState({
@@ -74,6 +83,8 @@
 
   //시니어 상세 조회
   const seniorSelectOne = () => {
+    console.log('seniorSelectOne - seniorSearch : ', seniorSearch);
+
     fetch("/user/seniorSelectOne.json", {
       method: "POST",
       headers: {
@@ -87,27 +98,6 @@
       console.log('seniorSelectOne() /user/seniorSelectOne.json error : ', error);
     });
   };
-
-  const handleChangeSelect = (e) => {
-    console.log('handleChangeSelect : ', e.target.value);
-    setSeniorSearch(e.target.value);
-  };
-
-  const SelectBox = () => {
-    if (CommonUtil.isEmpty(state.loginUser) == false
-      && state.loginUser['authority'] == 'ROLE_GUARDIAN' && state['seniorList'].length > 1) {
-      return (
-        <select className="margin-bottom2" onChange={handleChangeSelect}>
-          {state['seniorList'].map((item, idx) => {
-            return (
-              <option key={idx} value={item}>{item['user_name']}</option>
-            )
-          })}
-        </select>
-      )
-    }
-  }
-
 
   //특정 대상자의 실제 복약 정보
   const [seniorMedicationList, setSeniorMedicationList] = React.useState([]);
@@ -194,7 +184,12 @@
           };
           chartData['temperature'] = data[i]['temperature_data'];
           chartData['time'] = data[i]['temperature_time'];
-          _stackTemperatureData.push(chartData);
+
+          if (data[i]['temperature_date'].substr(5, 2) >= 11 || data[i]['temperature_date'].substr(5, 2) <= 2) {
+            _stackTemperatureData.push(chartData);
+          } else {
+            _stackTemperatureData.unshift(chartData);
+          }
         }
         setStackTemperatureData(_stackTemperatureData);
       }
@@ -205,6 +200,18 @@
 
   //방문 기록 정보
   const [visitRecordList, setVisitRecordList] = React.useState({});
+  const visitRecordInit = {
+    'senior_id': senior['senior_id'],
+    'visit_date': CommonUtil.getDate(),
+    'visit_reason': null,
+    'visit_content': null,
+
+    'agent_id': defaultUserId,
+
+    isInsert: true,
+  };
+
+
   //방문 기록 목록 조회
   const visitRecordSelectList = () => {
     fetch("/welfare/visitRecordSelectList.json", {
@@ -215,49 +222,154 @@
       body: JSON.stringify(seniorSearch),
     }).then((response) => response.json()).then((data) => {
       console.log("방문 기록 목록 조회 결과(건수) : ", data);
+      data.search = visitRecordList.search;
       setVisitRecordList(data['visitRecordList']);
     }).catch((error) => {
       console.log('visitRecordSelectList() /user/visitRecordSelectList.json error : ', error);
     });
   }
 
+  //방문 기록 정보
+  const [visitDate, setVisitDate] = React.useState(null);
+  const [visitRecord, setVisitRecord] = React.useState({ ...visitRecordInit });
+  const visitRecordRef = React.useRef({ ...visitRecordInit });
+
   // React.useEffect(() => {
   //   searching();
   // }, []);
 
+  const calerndarClick = (date, visitRecord) => {
+    console.log("calerndarClick - date, visitRecord", date, visitRecord);
+    setVisitDate(date);
+    setVisitRecord(visitRecord);
+    openModal();
+  }
+
   React.useEffect(() => {
+    console.log(`React.useEffect - seniorSearch : `, seniorSearch);
     searching();
   }, [seniorSearch]);
 
   React.useEffect(() => {
-    if (CommonUtil.isEmpty(state['seniorList']) == false) {
-      setSeniorSearch(state['seniorList'][0]);
+    console.log(`React.useEffect - state['seniorList'].value : `, state['seniorList'].value);
+    if (CommonUtil.isEmpty(state['seniorList'].value) == false) {
+      setSeniorSearch(state['seniorList'].value[0]);
     } else {
       return;
     }
-  }, [state['seniorList']])
+  }, [state['seniorList'].value]);
 
   return (
     <>
       <main className="pink">
-        
-      {
-        CommonUtil.isEmpty(state.loginUser) == false
-        && state.loginUser['authority'] == 'ROLE_GUARDIAN' && state['seniorList'].length > 1 ? 
-        <select className="margin-bottom2" onChange={handleChangeSelect}>
-          {state['seniorList'].map((item, idx) => {
-            return (
-              <option key={idx} value={item}>{item['user_name']}</option>
-            )
-          })}
-        </select>
-        : null
-      }
-        
+        {
+          CommonUtil.isEmpty(state.loginUser) == false
+            && state.loginUser['authority'] == 'ROLE_GUARDIAN' && state['seniorList'].value.length > 1 ?
+            <select className="margin-bottom2" onChange={(e) => {
+              console.log('e.target.value : ', e.target.value);
+              const index = Number(e.target.value);
+              console.log('e.target.value index : ', index);
+              setSeniorSearch(state['seniorList'].value[index]);
+              //setSeniorSearch(e.target.value);
+            }}>
+              {state['seniorList'].value.map((item, idx) => {
+                return (
+                  <option key={idx} value={idx}>{item['user_name']}</option>
+                )
+              })}
+            </select>
+            : null
+        }
+
         <div className="flex-start main-guardian"><img src={Senior} alt="" />
           <Title title={`${senior['user_name']} 어르신`} explanation={"방문, 복약, 온도, 배터리 현황을 확인하세요."} />
         </div>
-        <Calendar data={{ senior: senior, medication: stackChartData, temperature: stackTemperatureData, visitRecordList: visitRecordList }} />
+        <Calendar data={{ senior: senior, medication: stackChartData, temperature: stackTemperatureData, visitRecordList: visitRecordList, onClick: calerndarClick }} />
+
+        <Modal open={modalOpen} close={closeModal} header="시니어 정보 관리">
+          <div className="modal-visit board-wrap">
+            <table className="margin-bottom">
+              <tbody>
+                <tr>
+                  <th></th>
+                  <th>02:00</th>
+                  <th>10:00</th>
+                  <th>12:00</th>
+                  <th>23:00</th>
+                </tr>
+                <tr>
+                  <th>복약량</th>
+                  <td>1</td>
+                  <td>1</td>
+                  <td>1</td>
+                  <td>1</td>
+                </tr>
+                <tr>
+                  <th>온도</th>
+                  <td>30</td>
+                  <td>29</td>
+                  <td>28</td>
+                  <td>27</td>
+                </tr>
+                <tr>
+                  <th>배터리</th>
+                  <td colSpan={4}>30%</td>
+                </tr>
+              </tbody>
+            </table>
+            {visitRecord != null ? (
+              <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}
+                        disabled={true}
+                      />
+                    </td>
+                  </tr>
+                  <tr>
+                    <th>방문목적</th>
+                    <td colSpan={3}>
+                      <select onChange={(e) => {
+                        visitRecord['visit_reason'] = e.target.value;
+                        setVisitRecord({ ...visitRecord });
+                      }}
+                        ref={el => visitRecordRef.current['visit_reason'] = el}
+                        disabled={true}
+                      >
+                        <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}
+                        disabled={true}
+                      ></textarea>
+                    </td>
+                  </tr>
+                </tbody>
+              </table>
+            ) : null}
+          </div>
+        </Modal>
       </main>
     </>
   );
Add a comment
List